import { useEffect, useRef, useState } from "react"; import "../../main.css"; import { AnimatePresence, motion } from "framer-motion"; import { useAuthStore } from "@/stores/authStore"; import { useNoteStore } from "@/stores/notesStore"; import { useUIStore } from "@/stores/uiStore"; import { Login } from "../Login"; import { TiptapEditor } from "../TipTap"; import { Sidebar } from "./components/sidebar/SideBar"; import { StatusIndicator } from "./components/StatusIndicator"; import { Tag, tagsApi } from "@/api/tags"; import { useTagStore } from "@/stores/tagStore"; function Home() { const [newFolder] = useState(false); const [lastSavedNote, setLastSavedNote] = useState<{ id: number; title: string; content: string; } | null>(null); const { loadFolderTree, updateNote, setContent, selectedNote, setTitle } = useNoteStore(); const { encryptionKey } = useAuthStore(); const { showModal, setUpdating } = useUIStore(); const newFolderRef = useRef(null); useEffect(() => { if (!encryptionKey) return; loadFolderTree(); }, []); useEffect(() => { if (newFolder && newFolderRef.current) { newFolderRef.current.focus(); } }, [newFolder]); useEffect(() => { if (!selectedNote) return; if (!encryptionKey) return; // Don't try to save without encryption key // Check if content or title actually changed (not just selecting a different note) const hasChanges = lastSavedNote && lastSavedNote.id === selectedNote.id && (lastSavedNote.title !== selectedNote.title || lastSavedNote.content !== selectedNote.content); // If it's a new note selection, just update lastSavedNote without saving if (!lastSavedNote || lastSavedNote.id !== selectedNote.id) { setLastSavedNote({ id: selectedNote.id, title: selectedNote.title, content: selectedNote.content, }); return; } if (!hasChanges) return; const timer = setTimeout(async () => { setUpdating(true); await handleUpdate(); setLastSavedNote({ id: selectedNote.id, title: selectedNote.title, content: selectedNote.content, }); }, 2000); return () => clearTimeout(timer); }, [selectedNote, encryptionKey]); const handleUpdate = async () => { if (!selectedNote) return; if (!encryptionKey) { setUpdating(false); return; } try { await updateNote(selectedNote.id); console.log(selectedNote.id); } catch (error) { console.error("Failed to update note:", error); } finally { setTimeout(() => { setUpdating(false); }, 1000); } }; const { getTagTree, tagTree } = useTagStore(); const getTags = () => { getTagTree(); }; return (
{/* Sidebar */} {showModal && } {/*
setTagName(e.target.value)} /> {tags.map((tag) => ( ))}
*/} {/* Main editor area */}
{/**/} setTitle(e.target.value)} className="w-full px-4 py-3 text-3xl font-semibold bg-transparentfocus:outline-none focus:border-ctp-mauve transition-colors placeholder:text-ctp-overlay0 text-ctp-text" />
{selectedNote?.tags && selectedNote.tags.map((tag) => ( ))}
); } export default Home; const Modal = () => { const { setShowModal } = useUIStore(); return ( setShowModal(false)} className="absolute h-screen w-screen flex items-center justify-center bg-ctp-crust/60 z-50" >
e.stopPropagation()} className="w-2/3 h-2/3 bg-ctp-base rounded-xl border-ctp-surface2 border p-5" > {/**/}
); }; export const TagSelector = () => { const { tagTree } = useTagStore(); const [value, setValue] = useState(""); return (
{/* setValue(e.target.value)} />*/} {tagTree && tagTree.map((tag) => )}
); }; export const TagTree = ({ tag, depth = 0 }: { tag: Tag; depth?: number }) => { const [collapse, setCollapse] = useState(false); return (
setCollapse(!collapse)}>{tag.name}
{collapse && ( {/* The line container */}
{/* Child tags */} {tag.children.map((child) => ( ))}
)}
); };