From 56c3f5a0baf05d2346b5c2addbf69992a43fbdf0 Mon Sep 17 00:00:00 2001 From: alma Date: Sun, 20 Apr 2025 11:18:55 +0200 Subject: [PATCH] carnet --- app/carnet/page.tsx | 149 ++++++++++++++++++++++++++-- components/carnet/editor.tsx | 83 ++++++++++++++++ components/carnet/navigation.tsx | 47 +++++++++ components/carnet/notes-view.tsx | 69 +++++++++++++ components/carnet/panel-resizer.tsx | 33 ++++++ hooks/use-media-query.ts | 25 +++++ 6 files changed, 399 insertions(+), 7 deletions(-) create mode 100644 components/carnet/editor.tsx create mode 100644 components/carnet/navigation.tsx create mode 100644 components/carnet/notes-view.tsx create mode 100644 components/carnet/panel-resizer.tsx create mode 100644 hooks/use-media-query.ts diff --git a/app/carnet/page.tsx b/app/carnet/page.tsx index 3c6b25a7..54c1e88a 100644 --- a/app/carnet/page.tsx +++ b/app/carnet/page.tsx @@ -3,10 +3,45 @@ import { useEffect, useState } from "react"; import { useSession } from "next-auth/react"; import { redirect } from "next/navigation"; +import { Navigation } from "@/components/carnet/navigation"; +import { NotesView } from "@/components/carnet/notes-view"; +import { Editor } from "@/components/carnet/editor"; +import { PanelResizer } from "@/components/carnet/panel-resizer"; +import { useMediaQuery } from "@/hooks/use-media-query"; + +// Layout modes +export enum PaneLayout { + TagSelection = "tag-selection", + ItemSelection = "item-selection", + TableView = "table-view", + Editing = "editing" +} + +interface Note { + id: string; + title: string; + content: string; + lastEdited: Date; +} export default function CarnetPage() { const { data: session, status } = useSession(); const [isLoading, setIsLoading] = useState(true); + const [layoutMode, setLayoutMode] = useState(PaneLayout.ItemSelection); + const [selectedNote, setSelectedNote] = useState(null); + const [isMobile, setIsMobile] = useState(false); + const [showNav, setShowNav] = useState(true); + const [showNotes, setShowNotes] = useState(true); + + // Panel widths state + const [navWidth, setNavWidth] = useState(220); + const [notesWidth, setNotesWidth] = useState(400); + const [isDraggingNav, setIsDraggingNav] = useState(false); + const [isDraggingNotes, setIsDraggingNotes] = useState(false); + + // Check screen size + const isSmallScreen = useMediaQuery("(max-width: 768px)"); + const isMediumScreen = useMediaQuery("(max-width: 1024px)"); useEffect(() => { if (status === "unauthenticated") { @@ -17,6 +52,51 @@ export default function CarnetPage() { } }, [status]); + useEffect(() => { + if (isSmallScreen) { + setIsMobile(true); + setShowNav(false); + setShowNotes(false); + } else if (isMediumScreen) { + setIsMobile(false); + setShowNav(true); + setShowNotes(false); + } else { + setIsMobile(false); + setShowNav(true); + setShowNotes(true); + } + }, [isSmallScreen, isMediumScreen]); + + // Handle panel resizing + const handleNavResize = (e: MouseEvent) => { + if (!isDraggingNav) return; + const newWidth = e.clientX; + if (newWidth >= 48 && newWidth <= 400) { + setNavWidth(newWidth); + } + }; + + const handleNotesResize = (e: MouseEvent) => { + if (!isDraggingNotes) return; + const newWidth = e.clientX - navWidth - 2; // 2px for the resizer + if (newWidth >= 200) { + setNotesWidth(newWidth); + } + }; + + const handleNoteSelect = (note: Note) => { + setSelectedNote(note); + if (isMobile) { + setShowNotes(false); + } + }; + + const handleNoteSave = (note: Note) => { + // TODO: Implement note saving logic + console.log('Saving note:', note); + }; + if (isLoading) { return (
@@ -26,14 +106,69 @@ export default function CarnetPage() { } return ( -
-
-