diff --git a/server/routes/room.py b/server/routes/room.py index 83e75ad..1ccb8a8 100644 --- a/server/routes/room.py +++ b/server/routes/room.py @@ -51,6 +51,11 @@ class RoomId(BaseModel, TrpcMixin): id: uuid.UUID +class RoomPublishRequest(BaseModel): + id: uuid.UUID + publish: bool + + @router.get("/room.readMany") @requires("authenticated", status_code=401) async def read_many( @@ -310,7 +315,7 @@ async def room_update( async def publish( request: fastapi.Request, user: Annotated[User, Depends(authenticated_user)], - room: RoomId, + room: RoomPublishRequest, session: Annotated[AsyncSession, Depends(db_session)], ) -> TrpcResponse[RoomQuery]: async with session.begin(): @@ -318,7 +323,7 @@ async def publish( update(WaitingRoom) .where(WaitingRoom.id == str(room.id)) .where(WaitingRoom.owner_id == user.id) - .values(published=True) + .values(published=room.publish) .returning(WaitingRoom) ) result = (await session.execute(statement)).scalar_one() diff --git a/website/components/WaitingRoomDashboardCard.tsx b/website/components/WaitingRoomDashboardCard.tsx index 0874bde..2067a65 100644 --- a/website/components/WaitingRoomDashboardCard.tsx +++ b/website/components/WaitingRoomDashboardCard.tsx @@ -2,6 +2,7 @@ import Countdown from "./Countdown"; import moment, { type Moment } from "moment"; import { Link } from "../renderer/Link"; import { useQuery } from "@tanstack/react-query"; +import { trpc } from "../utils/trpc"; type WaitingRoomDashboardCardProps = { room: { @@ -9,6 +10,7 @@ type WaitingRoomDashboardCardProps = { title: string; opensAt: Moment; closesAt: Moment; + published: boolean; }; }; export default function WaitingRoomDashboardCard({ @@ -21,7 +23,7 @@ export default function WaitingRoomDashboardCard({ : "closed"; const headline = room.title || `Waiting Room ${room.id}`; - + const utils = trpc.useUtils(); const roomLiveQuery = useQuery<{ urlReady: boolean; }>({ @@ -42,6 +44,18 @@ export default function WaitingRoomDashboardCard({ }, }); + const publishApi = trpc.room.publish.useMutation({ + mutationKey: ["room.publish", room.id], + networkMode: "online", + retry: false, + onSuccess: async () => { + await Promise.all([ + utils.room.readUnique.invalidate({ id: room.id }), + utils.room.readMany.invalidate(), + ]); + }, + }); + return (
@@ -55,14 +69,26 @@ export default function WaitingRoomDashboardCard({ {roomLiveQuery.data.urlReady ? ( - + <> + + + - + ) : (
diff --git a/website/fakeServer/router.ts b/website/fakeServer/router.ts index 65bafb4..3f81f42 100644 --- a/website/fakeServer/router.ts +++ b/website/fakeServer/router.ts @@ -15,6 +15,7 @@ import { RoomReadUniqueOutput, RoomStatsOutput, RoomParticipantsOutput, + roomPublishInputSchema, } from "../types/roomsProcedures"; export const appRouter = router({ @@ -46,7 +47,7 @@ export const appRouter = router({ return {} as RoomUpdateOutput; }), publish: protectedProcedure - .input(roomQueryInputSchema) + .input(roomPublishInputSchema) .mutation(async (): Promise => { return {} as RoomUpdateOutput; }), diff --git a/website/types/roomsProcedures.ts b/website/types/roomsProcedures.ts index 3ef8b51..894327a 100644 --- a/website/types/roomsProcedures.ts +++ b/website/types/roomsProcedures.ts @@ -53,6 +53,12 @@ export const roomParticipantsOutputSchema = z.object({ export const roomQueryInputSchema = z.object({ id: z.string().uuid(), }); + +export const roomPublishInputSchema = z.object({ + id: z.string().uuid(), + publish: z.boolean(), +}); + export const roomReadUniqueOutputSchema = roomQueryOutputSchema; export type RoomReadUniqueInput = z.infer; @@ -84,3 +90,5 @@ export type RoomStatsOutput = z.infer; export type RoomParticipantsOutput = z.infer< typeof roomParticipantsOutputSchema >; + +export type RoomPublishInput = z.infer;