import { NoteCard } from "$components/NoteCard"; import { NotesGraph } from "$components/notes/NotesGraph"; import { Button } from "$components/ui/Button"; import { EmptyState } from "$components/ui/EmptyState"; import { api } from "$lib/api"; import type { Note } from "$lib/model"; import { authStore } from "$lib/store"; import { syncStore } from "$lib/sync-store"; import { A, useLocation } from "@solidjs/router"; import type { Component } from "solid-js"; import { createEffect, createMemo, createResource, createSignal, For, Show } from "solid-js"; const fetchNotes = async (): Promise => { const user = authStore.user(); const remoteNotes: Note[] = []; const localNotes: Note[] = []; try { const res = await api.getNotes(); if (res.ok) { remoteNotes.push(...(await res.json())); } } catch { console.log("Offline - continuing with local only"); } if (user) { const locals = await syncStore.getLocalNotes(user.did); for (const local of locals) { if (local.syncStatus === "local_only" || local.syncStatus === "pending_push" || local.syncStatus === "conflict") { localNotes.push( { id: local.id, owner_did: local.ownerDid, title: local.title, body: local.body, tags: local.tags, visibility: local.visibility, updated_at: local.updatedAt, links: local.links ?? [], } as Note, ); } } } return [...localNotes, ...remoteNotes]; }; type ViewMode = "grid" | "list" | "graph"; const Notes: Component = () => { const location = useLocation(); const [notes, { refetch }] = createResource(fetchNotes); const [viewMode, setViewMode] = createSignal("grid"); const [searchQuery, setSearchQuery] = createSignal(""); createEffect(() => { if (location.pathname === "/notes") { refetch(); } }); const filteredNotes = createMemo(() => { const allNotes = notes() || []; const query = searchQuery().toLowerCase().trim(); if (!query) return allNotes; return allNotes.filter((note) => note.title.toLowerCase().includes(query) || note.body.toLowerCase().includes(query) || note.tags.some((tag) => tag.toLowerCase().includes(query)) ); }); return (

Notes

Your personal knowledge base

setSearchQuery(e.currentTarget.value)} class="w-full bg-slate-100 dark:bg-slate-800 border border-slate-200 dark:border-slate-700 rounded-lg px-4 py-2 pl-10 text-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent" />
}> 0} fallback={ } /> }> setSearchQuery("")} class="text-sm font-medium text-blue-600 hover:text-blue-500 dark:text-blue-400"> Clear search } /> }> {(note) => }
}> ); }; export default Notes;