"use client"; import { useAuth } from "@/src/app/providers/auth-provider"; import { useDocumentData, useDocumentSave, useDocumentActions, useDocumentTemplates, useDocumentUtils, useDocumentHeadings, useSidebarSearch } from "@/features/document-edit/model"; import { Button } from "@/shared/ui/button"; import { Spinner } from "@/shared/ui/spinner"; import { RichTextEditor } from "@/widgets/editor/editor/core/rich-text-editor"; import { DocumentSidebar } from "@/widgets/editor/sidebar/document-sidebar"; import { ArrowLeft, Save, Clock, User, Eye, BookOpen, FileText, Calendar } from "lucide-react"; import { useState } from "react"; import { useRouter, useParams } from "next/navigation"; import { DocumentDetailSkeleton } from "@/shared/ui/skeleton"; const DocumentPage = () => { const { user } = useAuth(); const router = useRouter(); const params = useParams(); const documentId = params.id as string; // 1. 문서 데이터 관리 const { document, isLoading, title, setTitle, content, setContent, availableDocuments, updateDocument, } = useDocumentData({ documentId }); // 2. 저장 기능 const { saveDocument, isSaving, isAutoSaving, lastSaved, } = useDocumentSave({ documentId, title, content, onSaveSuccess: updateDocument, }); // 3. 문서 액션 const { deleteDocument, shareDocument, unshareDocument, isDeleting, } = useDocumentActions({ documentId, onPublishChange: (isPublished) => { if (document) { updateDocument({ ...document, isPublished }); } }, }); // 4. 템플릿 기능 const { createTemplate, applyTemplate, } = useDocumentTemplates({ onApply: (templateContent, templateTitle) => { setContent(templateContent); if (templateTitle && !title.trim()) { setTitle(templateTitle); } }, }); // 5. 유틸리티 const { getWordCount, formatDate } = useDocumentUtils(); const [showWordCount, setShowWordCount] = useState(false); if (isLoading) { return ; } if (!document) { return (

Document not found

The document you're looking for doesn't exist or you don't have access to it.

); } return (
{/* Modern header */}
{/* Breadcrumb */}
{user?.name ? `${user.name}'s` : "My"} Workspace / {document.folder && ( <> {document.folder.name} / )} {title || "Untitled"}
{/* Status and actions */}
{/* Auto-save status */}
{isAutoSaving ? ( <> Saving... ) : lastSaved ? ( <> Saved {formatDate(lastSaved)} ) : null}
{/* Word count - Hidden on very small screens */} {/* Actions */}
{/* Mobile save button */}
{/* Main content area - Responsive layout */}
{/* Document editor - Full width on mobile/tablet, left side on desktop */}
{/* Document header */}
{/* Document icon and title */}
{document.icon ? ( {document.icon} ) : ( )}
setTitle(e.target.value)} className="w-full text-2xl sm:text-3xl lg:text-4xl font-bold text-gray-900 dark:text-white bg-transparent border-none outline-none placeholder-gray-400 dark:placeholder-gray-500" placeholder="Untitled" />
{user?.name || "Anonymous"}
Created {new Date(document.createdAt).toLocaleDateString()}
{document.isPublished && ( )}
{/* Editor */}
{/* Right panel - Document sidebar - Hidden on mobile/tablet, shown on desktop */}
); }; export default DocumentPage;