"use client"; import { Credenza, CredenzaBody, CredenzaClose, CredenzaContent, CredenzaDescription, CredenzaFooter, CredenzaHeader, CredenzaTitle } from "@app/components/Credenza"; import { OptionSelect, type OptionSelectOption } from "@app/components/OptionSelect"; import { Button } from "@app/components/ui/button"; import { CheckboxWithLabel } from "@app/components/ui/checkbox"; import { Textarea } from "@app/components/ui/textarea"; import { applyTextImport, parsePreviewLines, parseTextFileItems, type TextImportFileType, type TextImportMode } from "@app/lib/roleFormTextImport"; import { useTranslations } from "next-intl"; import { useEffect, useMemo, useState } from "react"; type TextFileImportDialogProps = { open: boolean; onOpenChange: (open: boolean) => void; fileName: string; fileType: TextImportFileType; rawContent: string; currentValue: string; fieldLabel: string; parser: (value: string | undefined) => string[]; onConfirm: (value: string) => void; }; export function TextFileImportDialog({ open, onOpenChange, fileName, fileType, rawContent, currentValue, fieldLabel, parser, onConfirm }: TextFileImportDialogProps) { const t = useTranslations(); const [editablePreview, setEditablePreview] = useState(""); const [skipHeader, setSkipHeader] = useState(false); const [mode, setMode] = useState("override"); const parsedFromFile = useMemo( () => parseTextFileItems({ content: rawContent, fileType, skipHeader, parser }), [rawContent, fileType, skipHeader, parser] ); useEffect(() => { setEditablePreview(parsedFromFile.join("\n")); }, [parsedFromFile]); const importedItems = useMemo( () => parsePreviewLines(editablePreview), [editablePreview] ); const existingCount = useMemo( () => parser(currentValue).length, [currentValue, parser] ); const totalCount = mode === "append" ? existingCount + importedItems.length : importedItems.length; const modeOptions: OptionSelectOption[] = [ { value: "override", label: t("roleTextImportOverride") }, { value: "append", label: t("roleTextImportAppend") } ]; function handleConfirm() { onConfirm( applyTextImport({ currentValue, imported: importedItems, mode, parser }) ); onOpenChange(false); } return ( {t("roleTextImportTitle")} {t("roleTextImportDescription", { fileName, fieldLabel })} {fileType === "csv" && ( { if (checked !== "indeterminate") { setSkipHeader(checked); } }} label={t("roleTextImportSkipHeader")} /> )}

{t("roleTextImportPreview")}