"use client"; import Link from "next/link"; import { configureAbly, useChannel } from "@ably-labs/react-hooks"; import { useEffect, useState } from "react"; import { IoEnterOutline, IoTrashBinOutline } from "react-icons/io5"; import { env } from "@/env.mjs"; import LoadingIndicator from "./LoadingIndicator"; import { useUser } from "@clerk/nextjs"; import { createRoom, deleteRoom, getRooms } from "@/server/actions/room"; export const dynamic = "force-dynamic"; export const revalidate = 0; export const fetchCache = "force-no-store"; const RoomList = () => { const { user } = useUser(); configureAbly({ key: env.NEXT_PUBLIC_ABLY_PUBLIC_KEY, clientId: user?.id, recover: (_, cb) => { cb(true); }, }); useChannel( `${env.NEXT_PUBLIC_APP_ENV}-${user?.id}`, () => void getRoomsHandler() ); const [roomName, setRoomName] = useState(""); const [roomsFromDb, setRoomsFromDb] = useState< | { id: string; createdAt: Date; roomName: string; }[] | { id: string; created_at: Date | null; userId: string; roomName: string | null; storyName: string | null; visible: boolean; scale: string; }[] | undefined | null >(undefined); const createRoomHandler = async () => { await createRoom(roomName); setRoomName(""); (document.querySelector("#roomNameInput") as HTMLInputElement).value = ""; (document.querySelector("#new-room-modal") as HTMLInputElement).checked = false; }; const getRoomsHandler = async () => { const dbRooms = await getRooms(); setRoomsFromDb(dbRooms); }; const deleteRoomHandler = async (roomId: string) => { await deleteRoom(roomId); }; useEffect(() => { void getRoomsHandler(); }, []); return (
{/* Modal for Adding Rooms */}

Create a new room!

{ setRoomName(event.target.value); }} />
{roomName.length > 0 && ( )}
{roomsFromDb && roomsFromDb.length > 0 && (
{/* head */} {roomsFromDb?.map((room) => { return ( ); })}
Room Name Actions
{room.roomName}
)} {roomsFromDb === undefined && }
); }; export default RoomList;