"use client";
import { useEffect, useState } from "react";
import { ProjectDialog } from "@/components/project-dialog";
import { SafeRichHTML } from "@/components/safe-rich-html";
import { Badge } from "@/components/ui/badge";
import { Button } from "@/components/ui/button";
import {
fetchKnowledgeDocument,
fetchKnowledgeFAQ,
type KnowledgeDocument,
type KnowledgeFAQ,
} from "@/lib/api/admin";
import { markdownToHtml } from "@/components/content-editor/convert";
import { KnowledgeDocumentContentType } from "@/lib/generated/enums";
import { useI18n } from "@/i18n/provider";
import { formatDateTime } from "@/lib/utils";
type KnowledgeContentDetailDialogProps = {
open: boolean;
type: "document" | "faq";
itemId: number | null;
onOpenChange: (open: boolean) => void;
};
type DetailFieldProps = {
label: string;
value: string;
};
function DetailField({ label, value }: DetailFieldProps) {
return (
);
}
function getDirectoryLabel(item: KnowledgeDocument | KnowledgeFAQ, rootLabel: string) {
return item.directoryPath || item.directoryName || (item.directoryId === 0 ? rootLabel : "-");
}
function renderDocumentContent(item: KnowledgeDocument) {
if (item.contentType === KnowledgeDocumentContentType.Markdown) {
return markdownToHtml(item.content || "");
}
return item.content || "";
}
export function KnowledgeContentDetailDialog({
open,
type,
itemId,
onOpenChange,
}: KnowledgeContentDetailDialogProps) {
const t = useI18n();
const [loading, setLoading] = useState(false);
const [documentDetail, setDocumentDetail] = useState(null);
const [faqDetail, setFAQDetail] = useState(null);
useEffect(() => {
if (!open || !itemId) {
return;
}
const id = itemId;
let cancelled = false;
async function loadDetail() {
setLoading(true);
try {
if (type === "document") {
const data = await fetchKnowledgeDocument(id);
if (!cancelled) {
setDocumentDetail(data);
setFAQDetail(null);
}
return;
}
const data = await fetchKnowledgeFAQ(id);
if (!cancelled) {
setFAQDetail(data);
setDocumentDetail(null);
}
} finally {
if (!cancelled) {
setLoading(false);
}
}
}
void loadDetail();
return () => {
cancelled = true;
};
}, [itemId, open, type]);
const item = type === "document" ? documentDetail : faqDetail;
const title =
type === "document"
? documentDetail?.title || t("knowledge.viewDocumentTitle")
: faqDetail?.question || t("knowledge.viewFAQTitle");
return (
onOpenChange(false)}>
{t("common.close")}
}
>
{loading || !item ? (
{t("knowledge.loading")}
) : (
{t("knowledge.status")}
{item.statusName || item.status}
{t("knowledge.indexStatus")}
{item.indexStatusName || item.indexStatus}
{item.indexError ? (
{item.indexError}
) : null}
{type === "document" && documentDetail ? (
{t("knowledge.content")}
{documentDetail.contentType || "-"}
) : null}
{type === "faq" && faqDetail ? (
{t("knowledge.standardQuestion")}
{faqDetail.question}
{t("knowledge.answer")}
{faqDetail.answer || "-"}
{faqDetail.similarQuestions.length > 0 ? (
{t("knowledge.similarQuestions")}
{faqDetail.similarQuestions.map((question) => (
{question}
))}
) : null}
{faqDetail.remark ? (
{t("knowledge.remark")}
{faqDetail.remark}
) : null}
) : null}
)}
);
}