import { readable, type Readable } from 'svelte/store'; import type { BlahChatServerConnection } from './blah/connection/chatServer'; import type { BlahRichText } from './richText'; import { messageFromBlah, type Chat, type Message } from './types'; export function useChat( server: BlahChatServerConnection, chatId: string ): { info: Readable<Chat>; messages: Readable<Message[]>; sendMessage: (brt: BlahRichText) => Promise<void>; } { const info = readable<Chat>( { server: server.endpoint, id: chatId, name: '', type: 'group' }, (set) => { server.fetchRoomInfo(chatId).then((room) => { set({ server: server.endpoint, id: chatId, name: room.title, type: 'group' }); }); } ); const messages = readable<Message[]>([], (set, update) => { server .fetchRoomHistory(chatId) .then((history) => update((messages) => [ ...history.map(messageFromBlah).toSorted((a, b) => a.date.getTime() - b.date.getTime()), ...messages ]) ); const { unsubscribe } = server.subscribeRoom(chatId, (message) => { update((messages) => [...messages, messageFromBlah(message)]); }); return unsubscribe; }); const sendMessage = async (brt: BlahRichText) => { await server.sendMessage(chatId, brt); }; return { info, messages, sendMessage }; }