"use client"; 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"; import { toast } from "sonner"; // 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; } interface NextcloudStatus { isConnected: boolean; folders: string[]; error?: string; } export default function CarnetPage() { const { data: session, status } = useSession(); const [isLoading, setIsLoading] = useState(true); const [nextcloudStatus, setNextcloudStatus] = useState({ isConnected: false, folders: [] }); 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)"); // Check Nextcloud connection and get folders useEffect(() => { async function checkNextcloudConnection() { try { const response = await fetch('/api/nextcloud/status'); const data = await response.json(); if (!response.ok) { throw new Error(data.error || 'Failed to connect to Nextcloud'); } setNextcloudStatus({ isConnected: true, folders: data.folders || [] }); } catch (error) { console.error('Nextcloud connection error:', error); setNextcloudStatus({ isConnected: false, folders: [], error: error instanceof Error ? error.message : 'Failed to connect to Nextcloud' }); toast.error("Impossible de se connecter à Nextcloud. Veuillez vérifier votre connexion."); } } if (session?.user) { checkNextcloudConnection(); } }, [session]); useEffect(() => { if (status === "unauthenticated") { redirect("/signin"); } if (status !== "loading") { setIsLoading(false); } }, [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 (
); } if (!nextcloudStatus.isConnected) { return (

Connexion à Nextcloud impossible

{nextcloudStatus.error || "Veuillez vérifier votre connexion et réessayer."}

); } return (
{/* Navigation Panel */} {showNav && ( <>
{/* Navigation Resizer */} setIsDraggingNav(true)} onDragEnd={() => setIsDraggingNav(false)} onDrag={handleNavResize} /> )} {/* Notes Panel */} {showNotes && ( <>
{/* Notes Resizer */} setIsDraggingNotes(true)} onDragEnd={() => setIsDraggingNotes(false)} onDrag={handleNotesResize} /> )} {/* Editor Panel */}
{/* Mobile Navigation Toggle */} {isMobile && (
)}
); }