aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/client/atoms/noteTypes.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/client/atoms/noteTypes.ts')
-rw-r--r--src/client/atoms/noteTypes.ts49
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();
},
}));