import { DialogContent, FormControlLabel, IconButton, Link, ListItemText, Switch, Table, TableBody, TableContainer, TableHead, TableRow, useTheme, } from "@mui/material"; import FormControl from "@mui/material/FormControl"; import Grid from "@mui/material/Grid2"; import { useSnackbar } from "notistack"; import React, { lazy, Suspense, useCallback, useEffect, useMemo, useState } from "react"; import { Trans, useTranslation } from "react-i18next"; import { Viewer, ViewerType } from "../../../../../api/explorer.ts"; import { builtInViewers } from "../../../../../redux/thunks/viewer.ts"; import { isTrueVal } from "../../../../../session/utils.ts"; import CircularProgress from "../../../../Common/CircularProgress.tsx"; import SizeInput from "../../../../Common/SizeInput.tsx"; import { DefaultCloseAction } from "../../../../Common/Snackbar/snackbar.tsx"; import { DenseFilledTextField, DenseSelect, NoWrapTableCell, SecondaryButton, StyledTableContainerPaper, } from "../../../../Common/StyledComponents.tsx"; import DraggableDialog from "../../../../Dialogs/DraggableDialog.tsx"; import { SquareMenuItem } from "../../../../FileManager/ContextMenu/ContextMenu.tsx"; import { ViewerIDWithDefaultIcons } from "../../../../FileManager/Dialogs/OpenWith.tsx"; import Add from "../../../../Icons/Add.tsx"; import Dismiss from "../../../../Icons/Dismiss.tsx"; import SettingForm from "../../../../Pages/Setting/SettingForm.tsx"; import MagicVarDialog, { MagicVar } from "../../../Common/MagicVarDialog.tsx"; import { NoMarginHelperText } from "../../Settings.tsx"; const MonacoEditor = lazy(() => import("../../../../Viewers/CodeViewer/MonacoEditor.tsx")); export interface FileViewerEditDialogProps { viewer: Viewer; onChange: (viewer: Viewer) => void; open: boolean; onClose: () => void; } const magicVars: MagicVar[] = [ { name: "{$src}", value: "settings.srcEncodedVar", example: "https%3A%2F%2Fcloudreve.org%2Fapi%2Fv4%2Ffile%2Fcontent%2FzOie%2F0%2Ftext.txt%3Fsign%3Dxxx", }, { name: "{$src_raw}", value: "settings.srcVar", example: "https://cloudreve.org/api/v4/file/content/zOie/0/text.txt?sign=xxx", }, { name: "{$src_raw_base64}", value: "settings.srcBase64Var", example: "aHR0cHM6Ly9jbG91ZHJldmUub3JnL2FwaS92NC9maWxlL2NvbnRlbnQvek9pZS8wL3RleHQudHh0P3NpZ249eHh4", }, { name: "{$name}", value: "settings.nameEncodedVar", example: "sampleFile%5B1%5D.txt", }, { name: "{$version}", value: "settings.versionEntityVar", example: "zOie", }, { name: "{$id}", value: "settings.fileIdVar", example: "jm8AF8", }, { name: "{$user_id}", value: "settings.userIdVar", example: "lpua", }, { name: "{$user_display_name}", value: "settings.userDisplayNameVar", example: "Aaron%20Liu", }, ]; const FileViewerEditDialog = ({ viewer, onChange, open, onClose }: FileViewerEditDialogProps) => { const { t } = useTranslation("dashboard"); const theme = useTheme(); const { enqueueSnackbar } = useSnackbar(); const [viewerShadowed, setViewerShadowed] = useState(undefined); const formRef = React.useRef(null); const [magicVarOpen, setMagicVarOpen] = useState(false); const [wopiCached, setWopiCached] = useState(""); const withDefaultIcon = useMemo(() => { return ViewerIDWithDefaultIcons.includes(viewer.id); }, [viewer.id]); useEffect(() => { setViewerShadowed({ ...viewer }); setWopiCached(""); }, [viewer, setWopiCached, setViewerShadowed]); const onSubmit = useCallback(() => { if (formRef.current && !formRef.current.checkValidity()) { formRef.current.reportValidity(); return; } let changed = viewerShadowed; if (!viewerShadowed || !changed) { return; } if (wopiCached != "") { try { const parsed = JSON.parse(wopiCached); changed = { ...viewerShadowed, wopi_actions: parsed }; setViewerShadowed({ ...changed }); } catch (e) { enqueueSnackbar({ message: t("settings.invalidWopiActionMapping"), variant: "warning", action: DefaultCloseAction, }); return; } } onChange(changed); onClose(); }, [viewerShadowed, wopiCached, formRef]); const openMagicVar = useCallback((e: React.MouseEvent) => { setMagicVarOpen(true); e.stopPropagation(); e.preventDefault(); }, []); if (!viewerShadowed) { return null; } return ( setMagicVarOpen(false)} />
{ setViewerShadowed((v) => ({ ...(v as Viewer), icon: e.target.value, })); }} /> {withDefaultIcon && {t("settings.builtInIconUrlDes")}} { setViewerShadowed((v) => ({ ...(v as Viewer), display_name: e.target.value, })); }} /> {t("settings.displayNameDes")} setViewerShadowed((v) => ({ ...(v as Viewer), exts: e.target.value.split(",").map((ext) => ext.trim()), })) } /> {viewer.type == ViewerType.custom && ( setViewerShadowed((v) => ({ ...(v as Viewer), url: e.target.value, })) } /> ]} /> )} setViewerShadowed((v) => ({ ...(v as Viewer), max_size: e ? e : undefined, })) } /> {t("settings.maxSizeDes")} {viewer.type == ViewerType.custom && ( setViewerShadowed((v) => ({ ...(v as Viewer), props: { ...(v?.props ?? {}), openInNew: e.target.checked.toString(), }, })) } /> } label={t("settings.openInNew")} /> {t("settings.openInNewDes")} )} {viewer.id == builtInViewers.drawio && ( setViewerShadowed((v) => ({ ...(v as Viewer), props: { ...(v?.props ?? {}), host: e.target.value, }, })) } /> {t("settings.drawioHostDes")} )} {viewer.type == ViewerType.wopi && ( }> setWopiCached(e as string)} /> )} {viewerShadowed?.templates && viewerShadowed.templates.length > 0 && ( {t("settings.ext")} {t("settings.displayName")} {viewerShadowed.templates?.map((t, i) => ( { const newExt = e.target.value as string; setViewerShadowed((v) => ({ ...(v as Viewer), templates: (v?.templates ?? []).map((template, index) => index == i ? { ...template, ext: newExt } : template, ), })); }} > {viewerShadowed.exts.map((ext) => ( {ext} ))} { setViewerShadowed((v) => ({ ...(v as Viewer), templates: (v?.templates ?? []).map((template, index) => index == i ? { ...template, display_name: e.target.value, } : template, ), })); }} /> setViewerShadowed((v) => ({ ...(v as Viewer), templates: (v?.templates ?? []).filter((_, index) => index != i), })) } > ))}
)} } onClick={() => setViewerShadowed((v) => ({ ...(v as Viewer), templates: [...(v?.templates ?? []), { ext: viewerShadowed.exts?.[0] ?? "", display_name: "" }], })) } > {t("settings.addNewFileAction")} {t("settings.newFileActionDes")}
); }; export default FileViewerEditDialog;