diff options
Diffstat (limited to 'src/client/atoms/noteTypes.ts')
| -rw-r--r-- | src/client/atoms/noteTypes.ts | 49 |
1 files changed, 43 insertions, 6 deletions
diff --git a/src/client/atoms/noteTypes.ts b/src/client/atoms/noteTypes.ts index fb99b14..1fde8f5 100644 --- a/src/client/atoms/noteTypes.ts +++ b/src/client/atoms/noteTypes.ts @@ -1,5 +1,7 @@ import { atomWithSuspenseQuery } from "jotai-tanstack-query"; -import { apiClient } from "../api/client"; +import type { LocalNoteType } from "../db"; +import { localNoteTypeRepository } from "../db/repositories"; +import { ensureBootstrap } from "./sync"; export interface NoteType { id: string; @@ -11,15 +13,50 @@ export interface NoteType { updatedAt: string; } +async function loadCurrentUserId(): Promise<string | null> { + const stored = localStorage.getItem("kioku_user"); + if (!stored) return null; + try { + const user = JSON.parse(stored) as { id?: string } | null; + return user?.id ?? null; + } catch { + return null; + } +} + +function localNoteTypeToView(noteType: LocalNoteType): NoteType { + return { + id: noteType.id, + name: noteType.name, + frontTemplate: noteType.frontTemplate, + backTemplate: noteType.backTemplate, + isReversible: noteType.isReversible, + createdAt: noteType.createdAt.toISOString(), + updatedAt: noteType.updatedAt.toISOString(), + }; +} + +async function loadNoteTypes(): Promise<NoteType[]> { + const userId = await loadCurrentUserId(); + if (!userId) return []; + const noteTypes = await localNoteTypeRepository.findByUserId(userId); + noteTypes.sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime()); + return noteTypes.map(localNoteTypeToView); +} + // ===================== -// NoteTypes List - Suspense-compatible +// NoteTypes List - Suspense-compatible, IndexedDB-first // ===================== export const noteTypesAtom = atomWithSuspenseQuery(() => ({ queryKey: ["noteTypes"], - queryFn: async () => { - const res = await apiClient.rpc.api["note-types"].$get(); - const data = await apiClient.handleResponse<{ noteTypes: NoteType[] }>(res); - return data.noteTypes; + queryFn: async (): Promise<NoteType[]> => { + const noteTypes = await loadNoteTypes(); + if (noteTypes.length > 0) { + ensureBootstrap(); + return noteTypes; + } + await ensureBootstrap(); + return loadNoteTypes(); }, })); |
