Messenger/packages/web/src/features/rooms/model.ts
Заид Омар Медхат | Zaid Omar Medhat e7f37be62c simple chat init
2026-07-10 15:32:34 +05:00

50 lines
1.5 KiB
TypeScript

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<Room>;
reload: () => Promise<void>;
}
export const useRooms = (userId: string): UseRooms => {
const { subscribe } = useRealtime();
const [rooms, setRooms] = useState<Room[]>([]);
const [loading, setLoading] = useState(true);
const [error, setError] = useState<string | null>(null);
const reload = useCallback(async (): Promise<void> => {
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<Room> => {
const room = await apiCreateRoom(apiConfig, { name });
setRooms((prev) => [room, ...prev]);
return room;
}, []);
return { rooms, loading, error, createRoom, reload };
};