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}
{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
}
if (!data || data.length === 0) {
return
유사한 콘텐츠가 없습니다.
}
return (
유사한 콘텐츠
{data.length}개 항목
{data.map((doc) => (
))}
)
}
export default ContentInfoPage;