Files
beavergram/frontend/src/lib/stores/discover.svelte.ts
T

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();