mirror of
https://github.com/Blah-IM/Weblah.git
synced 2025-05-01 00:31:08 +00:00
45 lines
1.3 KiB
TypeScript
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 };
|
|
}
|