import { Autocomplete, Button, Input, List, ListItem, Option, Select, Typography } from "@mui/joy"; import React, { useRef, useState } from "react"; import { toast } from "react-hot-toast"; import { Resource } from "@/types/proto/api/v2/resource_service"; import { useTranslate } from "@/utils/i18n"; import { useResourceStore } from "../store/module"; import { generateDialog } from "./Dialog"; import Icon from "./Icon"; const fileTypeAutocompleteOptions = ["image/*", "text/*", "audio/*", "video/*", "application/*"]; interface Props extends DialogProps { onCancel?: () => void; onConfirm?: (resourceList: Resource[]) => void; } type SelectedMode = "local-file" | "external-link"; interface State { selectedMode: SelectedMode; uploadingFlag: boolean; } const CreateResourceDialog: React.FC = (props: Props) => { const t = useTranslate(); const { destroy, onCancel, onConfirm } = props; const resourceStore = useResourceStore(); const [state, setState] = useState({ selectedMode: "local-file", uploadingFlag: false, }); const [resourceCreate, setResourceCreate] = useState({ filename: "", externalLink: "", type: "", }); const [fileList, setFileList] = useState([]); const fileInputRef = useRef(null); const handleReorderFileList = (fileName: string, direction: "up" | "down") => { const fileIndex = fileList.findIndex((file) => file.name === fileName); if (fileIndex === -1) { return; } const newFileList = [...fileList]; if (direction === "up") { if (fileIndex === 0) { return; } const temp = newFileList[fileIndex - 1]; newFileList[fileIndex - 1] = newFileList[fileIndex]; newFileList[fileIndex] = temp; } else if (direction === "down") { if (fileIndex === fileList.length - 1) { return; } const temp = newFileList[fileIndex + 1]; newFileList[fileIndex + 1] = newFileList[fileIndex]; newFileList[fileIndex] = temp; } setFileList(newFileList); }; const handleCloseDialog = () => { if (onCancel) { onCancel(); } destroy(); }; const handleSelectedModeChanged = (mode: "local-file" | "external-link") => { setState((state) => { return { ...state, selectedMode: mode, }; }); }; const handleExternalLinkChanged = (event: React.ChangeEvent) => { const externalLink = event.target.value; setResourceCreate((state) => { return { ...state, externalLink, }; }); }; const handleFileNameChanged = (event: React.ChangeEvent) => { const filename = event.target.value; setResourceCreate((state) => { return { ...state, filename, }; }); }; const handleFileTypeChanged = (fileType: string) => { setResourceCreate((state) => { return { ...state, type: fileType, }; }); }; const handleFileInputChange = async () => { if (!fileInputRef.current || !fileInputRef.current.files) { return; } const files: File[] = []; for (const file of fileInputRef.current.files) { files.push(file); } setFileList(files); }; const allowConfirmAction = () => { if (state.selectedMode === "local-file") { if (!fileInputRef.current || !fileInputRef.current.files || fileInputRef.current.files.length === 0) { return false; } } else if (state.selectedMode === "external-link") { if (resourceCreate.filename === "" || resourceCreate.externalLink === "" || resourceCreate.type === "") { return false; } } return true; }; const handleConfirmBtnClick = async () => { if (state.uploadingFlag) { return; } setState((state) => { return { ...state, uploadingFlag: true, }; }); const createdResourceList: Resource[] = []; try { if (state.selectedMode === "local-file") { if (!fileInputRef.current || !fileInputRef.current.files) { return; } const filesOnInput = Array.from(fileInputRef.current.files); for (const file of fileList) { const fileOnInput = filesOnInput.find((fileOnInput) => fileOnInput.name === file.name); if (!fileOnInput) { continue; } const resource = await resourceStore.createResourceWithBlob(file); createdResourceList.push(resource); } } else { const resource = await resourceStore.createResource(resourceCreate); createdResourceList.push(resource); } } catch (error: any) { console.error(error); toast.error(typeof error === "string" ? error : error.response.data.message); } if (onConfirm) { onConfirm(createdResourceList); } destroy(); }; return ( <>

{t("resource.create-dialog.title")}

{t("resource.create-dialog.upload-method")} {state.selectedMode === "local-file" && ( <>
{fileList.map((file, index) => ( {file.name}
))}
)} {state.selectedMode === "external-link" && ( <> {t("resource.create-dialog.external-link.link")} {t("resource.create-dialog.external-link.file-name")} {t("resource.create-dialog.external-link.type")} handleFileTypeChanged(value || "")} /> )}
); }; function showCreateResourceDialog(props: Omit) { generateDialog( { dialogName: "create-resource-dialog", }, CreateResourceDialog, props ); } export default showCreateResourceDialog;