42 lines
1.1 KiB
TypeScript
42 lines
1.1 KiB
TypeScript
import { getDiscoverItem } from "#lib/api/endpoints.js";
|
|
import type { DiscoverItem } from "#lib/api/types.js";
|
|
import { accounts } from "#lib/stores/accounts.svelte.js";
|
|
|
|
function createDiscover() {
|
|
let items = $state<Record<number, DiscoverItem>>({});
|
|
let account: number | null = null;
|
|
const pending = new Set<number>();
|
|
|
|
function syncAccount() {
|
|
if (accounts.selectedId !== account) {
|
|
account = accounts.selectedId;
|
|
items = {};
|
|
pending.clear();
|
|
}
|
|
}
|
|
|
|
return {
|
|
async ensure(chatId: number) {
|
|
syncAccount();
|
|
if (account === null || items[chatId] || pending.has(chatId)) {
|
|
return;
|
|
}
|
|
pending.add(chatId);
|
|
try {
|
|
const item = await getDiscoverItem(chatId);
|
|
items = { ...items, [chatId]: item };
|
|
} finally {
|
|
pending.delete(chatId);
|
|
}
|
|
},
|
|
get(chatId: number): DiscoverItem | undefined {
|
|
return items[chatId];
|
|
},
|
|
set(item: DiscoverItem) {
|
|
items = { ...items, [item.chat_id]: item };
|
|
},
|
|
};
|
|
}
|
|
|
|
export const discover = createDiscover();
|