import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { useDeleteDoc, useGalleryDoc, useGalleryDocSimilar, useRehashDoc, useRescanDoc } from "../hook/useGalleryDoc.ts"; import TagBadge from "@/components/gallery/TagBadge"; import StyledLink from "@/components/gallery/StyledLink"; import { Link, useLocation } from "wouter"; import { classifyTags } from "../lib/classifyTags.tsx"; import { DescTagItem, DescItem } from "../components/gallery/DescItem.tsx"; import { Button } from "@/components/ui/button.tsx"; import { GalleryCard } from "@/components/gallery/GalleryCard.tsx"; import { useEffect } from "react"; import { useLogin } from "@/state/user.ts"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "@/components/ui/dropdown-menu.tsx"; import { EllipsisVerticalIcon, FileIcon } from "lucide-react"; import { RefreshCw, ScanSearch, Trash2, Paintbrush , Users, BookOpen, User, Clock, FileCheck, FileText, Layers, Tag, Loader2, AlertCircle, FileQuestion } from "lucide-react"; export interface ContentInfoPageProps { params: { id: string; }; } function Wrapper({ children }: { children: React.ReactNode }) { const [pathname] = useLocation(); useEffect(() => { document.scrollingElement?.scrollTo({ top: 0, }); }, [pathname]); return
{children}
; } export function ContentInfoPage({ params }: ContentInfoPageProps) { const { data, error, isLoading } = useGalleryDoc(params.id); const rehashDoc = useRehashDoc(); const rescanDoc = useRescanDoc(); const deleteDoc = useDeleteDoc(); const user = useLogin(); const username = user?.username; const isAdmin = username === "admin"; if (isLoading) { return
콘텐츠 정보 로드 중...
} if (error) { return
오류가 발생했습니다
{String(error)}
} if (!data) { return
콘텐츠를 찾을 수 없습니다
} const tags = data?.tags ?? []; const classifiedTags = classifyTags(tags); const contentLocation = `/doc/${params.id}/reader`; return (
{data.title}
{data.title} {classifiedTags.type[0] ?? "N/A"} {isAdmin &&
{ await rehashDoc(params.id); }} className="flex items-center gap-2 cursor-pointer" > Rehash { if (!window.confirm("Are you sure?")) { return; } await rescanDoc(params.id); }} className="flex items-center gap-2 cursor-pointer" > Rescan { if (!window.confirm("Are you sure?")) { return; } await deleteDoc(params.id); }} className="flex items-center gap-2 cursor-pointer text-destructive hover:text-destructive" > Delete
}
} /> } /> } /> } /> } className="md:col-span-2">
{new Date(data.created_at).toLocaleString()} / {new Date(data.modified_at).toLocaleString()}
}> {data.content_hash} }> {data.pagenum} 페이지 }> {`${data.basepath}/${data.filename}`}
Tags
    {classifiedTags.rest.map((tag) => )}
); } function ExplorerFindLink({ path }: { path: string }) { // remove F:\ from the path if (path.startsWith("/data/sss/f/")) { path = path.slice("/data/sss/f/".length); } return ( ); } function SimilarContentCard({ id, }: { id: string; }) { const { data, error, isLoading } = useGalleryDocSimilar(id); if (isLoading) { return
유사 콘텐츠 불러오는 중...
} if (error) { return
오류: {String(error)}
} if (!data || data.length === 0) { return
유사한 콘텐츠가 없습니다.
} return (

유사한 콘텐츠

{data.length}개 항목
{data.map((doc) => ( ))}
) } export default ContentInfoPage;