import { useCallback, useEffect, useState } from 'react'; import type { Room } from '@altricade/core'; import { userChannel } from '@altricade/core'; import { listRooms, createRoom as apiCreateRoom } from '@altricade/core/api'; import { apiConfig } from '../../shared/api'; import { useRealtime } from '../realtime'; export interface UseRooms { rooms: Room[]; loading: boolean; error: string | null; createRoom: (name: string) => Promise; reload: () => Promise; } export const useRooms = (userId: string): UseRooms => { const { subscribe } = useRealtime(); const [rooms, setRooms] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const reload = useCallback(async (): Promise => { try { setRooms(await listRooms(apiConfig)); } catch { setError('Failed to load rooms'); } finally { setLoading(false); } }, []); useEffect(() => { void reload(); }, [reload]); // A room.membership event on the personal channel means we were added/removed. useEffect(() => { return subscribe(userChannel(userId), () => { void reload(); }); }, [subscribe, userId, reload]); const createRoom = useCallback(async (name: string): Promise => { const room = await apiCreateRoom(apiConfig, { name }); setRooms((prev) => [room, ...prev]); return room; }, []); return { rooms, loading, error, createRoom, reload }; };