"use client"; import React, { useState, useEffect, useRef } from 'react'; import { Image, FileText, Link, List, Plus } from 'lucide-react'; interface Note { id: string; title: string; content: string; lastModified: string; type: string; mime: string; etag: string; } interface EditorProps { note?: Note | null; onSave?: (note: Note) => void; currentFolder?: string; onRefresh?: () => void; } export const Editor: React.FC = ({ note, onSave, currentFolder = 'Notes', onRefresh }) => { const [title, setTitle] = useState(note?.title || ''); const [content, setContent] = useState(note?.content || ''); const [isSaving, setIsSaving] = useState(false); const [isLoading, setIsLoading] = useState(false); const saveTimeout = useRef(); useEffect(() => { const fetchNoteContent = async () => { if (note?.id) { setIsLoading(true); try { const response = await fetch(`/api/nextcloud/files/content?id=${note.id}`); if (!response.ok) { throw new Error('Failed to fetch note content'); } const data = await response.json(); setContent(data.content); } catch (error) { console.error('Error fetching note content:', error); } finally { setIsLoading(false); } } }; if (note) { setTitle(note.title); if (note.id) { fetchNoteContent(); } else { setContent(''); } } else { setTitle(''); setContent(''); } }, [note]); const handleTitleChange = (e: React.ChangeEvent) => { setTitle(e.target.value); debouncedSave(); }; const handleContentChange = (e: React.ChangeEvent) => { setContent(e.target.value); debouncedSave(); }; const debouncedSave = () => { if (saveTimeout.current) { clearTimeout(saveTimeout.current); } saveTimeout.current = setTimeout(() => { handleSave(); }, 1000); // Save after 1 second of inactivity }; const handleSave = async () => { if (!title || !content) return; setIsSaving(true); try { const endpoint = note?.id ? '/api/nextcloud/files' : '/api/nextcloud/files'; const method = note?.id ? 'PUT' : 'POST'; const response = await fetch(endpoint, { method, headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ id: note?.id, title, content, folder: currentFolder }), }); if (!response.ok) { throw new Error('Failed to save note'); } const savedNote = await response.json(); onSave?.({ ...savedNote, content }); onRefresh?.(); } catch (error) { console.error('Error saving note:', error); } finally { setIsSaving(false); } }; if (!note) { return (

Sélectionnez une note

Choisissez une note existante ou créez-en une nouvelle

); } return (
{/* Title Bar */}
{/* Editor Area */}
{isLoading ? (
) : (