From 2c2e2e2ad96d8725fd6fa111fa28e7d2009211a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E3=81=95=E3=81=84=E7=8C=AB?= Date: Wed, 6 Mar 2024 23:10:53 +0800 Subject: [PATCH] playground: add a rename button (#669) Signed-off-by: Ookiineko --- .../Workspace/FileSystemManager.tsx | 59 ++++++++++++++++--- .../components/Playground/Workspace/index.tsx | 30 ++++++++++ 2 files changed, 81 insertions(+), 8 deletions(-) diff --git a/apps/website/src/components/Playground/Workspace/FileSystemManager.tsx b/apps/website/src/components/Playground/Workspace/FileSystemManager.tsx index 499fbcb..bebd5ea 100644 --- a/apps/website/src/components/Playground/Workspace/FileSystemManager.tsx +++ b/apps/website/src/components/Playground/Workspace/FileSystemManager.tsx @@ -25,12 +25,18 @@ import { Node } from "./types"; interface FileSystemManagerProps { path: string; nodes: Node[]; + oldName: string; + newName: string; + renameOpen: boolean; + onNewNameChange: () => (event: ChangeEvent) => Promise; + onCloseRenameModal: () => () => Promise; onFileUpload: ( isText: boolean ) => (event: ChangeEvent) => Promise; onDirClick: (name: string) => () => Promise; onFileClick: (name: string) => (option: string) => Promise; onDirCreate: (name: string) => () => Promise; + onRename: (old_name: string, new_name: string) => () => Promise; onRefresh: () => Promise; onLoadSamples: () => Promise; } @@ -46,6 +52,7 @@ const modalStyle = { }; export const options = [ + { text: "Rename", key: "rename" }, { text: "Download", key: "download" }, { text: "Download as Text File", key: "download-text" }, { text: "Delete", key: "delete" }, @@ -54,17 +61,23 @@ export const options = [ export default function FileSystemManager({ path = "/", nodes = [], + oldName = "", + newName = "", + renameOpen = false, + onNewNameChange = () => () => Promise.resolve(), + onCloseRenameModal = () => () => Promise.resolve(), onFileUpload = () => () => Promise.resolve(), onFileClick = () => () => Promise.resolve(), onDirClick = () => () => Promise.resolve(), onDirCreate = () => () => Promise.resolve(), + onRename = () => () => Promise.resolve(), onRefresh = () => Promise.resolve(), onLoadSamples = () => Promise.resolve(), }: FileSystemManagerProps) { - const [open, setOpen] = useState(false); + const [newFolderOpen, setNewFolderOpen] = useState(false); const [dirName, setDirName] = useState(""); - const handleModalOpen = () => setOpen(true); - const handleModalClose = () => setOpen(false); + const handleNewFolderModalOpen = () => setNewFolderOpen(true); + const handleNewFolderModalClose = () => setNewFolderOpen(false); return ( <> @@ -113,7 +126,7 @@ export default function FileSystemManager({ { setDirName(""); - handleModalOpen(); + handleNewFolderModalOpen(); }} aria-label="create-a-new-folder" size="small" @@ -165,8 +178,8 @@ export default function FileSystemManager({ @@ -183,12 +196,12 @@ export default function FileSystemManager({ onChange={(event) => setDirName(event.target.value)} /> - + + + + + + ); } diff --git a/apps/website/src/components/Playground/Workspace/index.tsx b/apps/website/src/components/Playground/Workspace/index.tsx index f1e795d..f54d5ca 100644 --- a/apps/website/src/components/Playground/Workspace/index.tsx +++ b/apps/website/src/components/Playground/Workspace/index.tsx @@ -23,6 +23,9 @@ interface WorkspaceProps { export default function Workspace({ ffmpeg: _ffmpeg }: WorkspaceProps) { const [path, setPath] = useState("/"); const [nodes, setNodes] = useState([]); + const [oldName, setOldName] = useState(""); + const [newName, setNewName] = useState(""); + const [renameOpen, setRenameOpen] = useState(false); const [args, setArgs] = useState(defaultArgs); const [progress, setProgress] = useState(0); const [time, setTime] = useState(0); @@ -38,6 +41,14 @@ export default function Workspace({ ffmpeg: _ffmpeg }: WorkspaceProps) { } }; + const onNewNameChange = () => async (event: ChangeEvent) => { + setNewName(event.target.value); + }; + + const onCloseRenameModal = () => async () => { + setRenameOpen(false); + }; + const onFileUpload = (isText: boolean) => async ({ target: { files } }: ChangeEvent) => { @@ -53,6 +64,11 @@ export default function Workspace({ ffmpeg: _ffmpeg }: WorkspaceProps) { const onFileClick = (name: string) => async (option: string) => { const fullPath = `${path}/${name}`; switch (option) { + case "rename": + setOldName(name); + setNewName(""); + setRenameOpen(true); + break; case "download": downloadFile( name, @@ -93,6 +109,14 @@ export default function Workspace({ ffmpeg: _ffmpeg }: WorkspaceProps) { refreshDir(path); }; + const onRename = (old_name: string, new_name: string) => async () => { + if (old_name !== "" && new_name !== "") { + await ffmpeg.rename(`${path}/${old_name}`, `${path}/${new_name}`); + } + setRenameOpen(false); + refreshDir(path); + }; + const onLoadSamples = async () => { for (const name of Object.keys(SAMPLE_FILES)) { await ffmpeg.writeFile(name, await fetchFile(SAMPLE_FILES[name])); @@ -130,10 +154,16 @@ export default function Workspace({ ffmpeg: _ffmpeg }: WorkspaceProps) { refreshDir(path)} />