Weblah/src/lib/chat.ts

45 lines
1.3 KiB
TypeScript

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 };
}