From a05b8d45a04693b48d7db0ad5a158e8f8fda689e Mon Sep 17 00:00:00 2001 From: Fuwn Date: Wed, 4 Feb 2026 01:05:42 -0800 Subject: feat(web): Enhance memory dashboard with projects and search --- packages/web/src/app/dashboard/components/index.ts | 5 + .../src/app/dashboard/components/memory-card.tsx | 66 ++++ .../app/dashboard/components/memory-edit-modal.tsx | 109 +++++++ .../src/app/dashboard/components/project-badge.tsx | 21 ++ .../app/dashboard/components/project-filter.tsx | 35 +++ .../src/app/dashboard/components/search-bar.tsx | 24 ++ .../web/src/app/dashboard/dashboard-content.tsx | 334 ++++++++++++++++----- packages/web/src/env.js | 2 + packages/web/src/hooks/use-debounce.ts | 19 ++ packages/web/src/server/api/root.ts | 2 + packages/web/src/server/api/routers/memory.ts | 142 ++++++++- packages/web/src/server/api/routers/project.ts | 79 +++++ 12 files changed, 763 insertions(+), 75 deletions(-) create mode 100644 packages/web/src/app/dashboard/components/index.ts create mode 100644 packages/web/src/app/dashboard/components/memory-card.tsx create mode 100644 packages/web/src/app/dashboard/components/memory-edit-modal.tsx create mode 100644 packages/web/src/app/dashboard/components/project-badge.tsx create mode 100644 packages/web/src/app/dashboard/components/project-filter.tsx create mode 100644 packages/web/src/app/dashboard/components/search-bar.tsx create mode 100644 packages/web/src/hooks/use-debounce.ts create mode 100644 packages/web/src/server/api/routers/project.ts (limited to 'packages') diff --git a/packages/web/src/app/dashboard/components/index.ts b/packages/web/src/app/dashboard/components/index.ts new file mode 100644 index 0000000..e0ec52d --- /dev/null +++ b/packages/web/src/app/dashboard/components/index.ts @@ -0,0 +1,5 @@ +export { MemoryCard } from "./memory-card"; +export { MemoryEditModal } from "./memory-edit-modal"; +export { ProjectBadge } from "./project-badge"; +export { ProjectFilter } from "./project-filter"; +export { SearchBar } from "./search-bar"; diff --git a/packages/web/src/app/dashboard/components/memory-card.tsx b/packages/web/src/app/dashboard/components/memory-card.tsx new file mode 100644 index 0000000..2b4aca1 --- /dev/null +++ b/packages/web/src/app/dashboard/components/memory-card.tsx @@ -0,0 +1,66 @@ +"use client"; + +import type { Memory, Project } from "@imemio/sdk"; +import { ProjectBadge } from "./project-badge"; + +type MemoryWithProject = Memory & { + project: Project | null; +}; + +type MemoryCardProps = { + memory: MemoryWithProject; + onEdit: () => void; + onDelete: () => void; + isDeleting?: boolean; +}; + +export function MemoryCard({ + memory, + onEdit, + onDelete, + isDeleting, +}: MemoryCardProps) { + return ( +
+
+
+

{memory.content}

+
+
+ +
+
+ {memory.project && ( + + )} + + + {new Date(memory.createdAt).toLocaleString()} + +
+ +
+ + + +
+
+
+ ); +} diff --git a/packages/web/src/app/dashboard/components/memory-edit-modal.tsx b/packages/web/src/app/dashboard/components/memory-edit-modal.tsx new file mode 100644 index 0000000..30f6161 --- /dev/null +++ b/packages/web/src/app/dashboard/components/memory-edit-modal.tsx @@ -0,0 +1,109 @@ +"use client"; + +import type { Memory, Project } from "@imemio/sdk"; +import { useEffect, useState } from "react"; + +type MemoryWithProject = Memory & { + project: Project | null; +}; + +type MemoryEditModalProps = { + memory: MemoryWithProject; + projects: Project[]; + onSave: (data: { content: string; projectId: string }) => void; + onClose: () => void; + isSaving?: boolean; +}; + +export function MemoryEditModal({ + memory, + projects, + onSave, + onClose, + isSaving, +}: MemoryEditModalProps) { + const [content, setContent] = useState(memory.content); + const [projectId, setProjectId] = useState(memory.projectId); + + useEffect(() => { + setContent(memory.content); + setProjectId(memory.projectId); + }, [memory]); + + const handleSubmit = (formSubmitEvent: React.FormEvent) => { + formSubmitEvent.preventDefault(); + + if (content.trim()) { + onSave({ content, projectId }); + } + }; + + return ( +
+
+
+

+ > edit memory +

+ + +
+ +
+
+ +