From 941ec46bcbedd7187c5bdde193f3936053929d56 Mon Sep 17 00:00:00 2001 From: Nicolas Mowen Date: Tue, 2 Apr 2024 07:07:00 -0600 Subject: [PATCH] Add ability to rename exports --- web/src/components/card/ExportCard.tsx | 183 +++++++++++++++++-------- web/src/pages/Export.tsx | 15 +- 2 files changed, 140 insertions(+), 58 deletions(-) diff --git a/web/src/components/card/ExportCard.tsx b/web/src/components/card/ExportCard.tsx index 8d5d2eef7..4574d87cc 100644 --- a/web/src/components/card/ExportCard.tsx +++ b/web/src/components/card/ExportCard.tsx @@ -1,21 +1,24 @@ import { baseUrl } from "@/api/baseUrl"; import ActivityIndicator from "../indicators/activity-indicator"; -import { LuTrash } from "react-icons/lu"; +import { LuPencil, LuTrash } from "react-icons/lu"; import { Button } from "../ui/button"; import { useMemo, useRef, useState } from "react"; import { isDesktop } from "react-device-detect"; import { FaPlay } from "react-icons/fa"; import Chip from "../indicators/Chip"; import { Skeleton } from "../ui/skeleton"; +import { Dialog, DialogContent, DialogFooter, DialogTitle } from "../ui/dialog"; +import { Input } from "../ui/input"; type ExportProps = { file: { name: string; }; + onRename: (original: string, update: string) => void; onDelete: (file: string) => void; }; -export default function ExportCard({ file, onDelete }: ExportProps) { +export default function ExportCard({ file, onRename, onDelete }: ExportProps) { const videoRef = useRef(null); const [hovered, setHovered] = useState(false); const [playing, setPlaying] = useState(false); @@ -25,63 +28,129 @@ export default function ExportCard({ file, onDelete }: ExportProps) { [file.name], ); + // editing name + + const [editName, setEditName] = useState<{ + original: string; + update: string; + }>(); + return ( -
setHovered(true) : undefined - } - onMouseLeave={ - isDesktop && !inProgress ? () => setHovered(false) : undefined - } - onClick={isDesktop || inProgress ? undefined : () => setHovered(!hovered)} - > - {!playing && hovered && ( - <> -
- onDelete(file.name)} + <> + { + if (!open) { + setEditName(undefined); + } + }} + > + + Rename Export + {editName && ( + <> + + setEditName({ + original: editName.original ?? "", + update: e.target.value, + }) + } + /> + + + + + )} + + + +
setHovered(true) : undefined + } + onMouseLeave={ + isDesktop && !inProgress ? () => setHovered(false) : undefined + } + onClick={ + isDesktop || inProgress ? undefined : () => setHovered(!hovered) + } + > + {!playing && hovered && ( + <> +
+
+ setEditName({ original: file.name, update: "" })} + > + + + onDelete(file.name)} + > + + +
+ + + )} + {inProgress ? ( + + ) : ( +
+ ); } diff --git a/web/src/pages/Export.tsx b/web/src/pages/Export.tsx index ff6f5765f..a5f775419 100644 --- a/web/src/pages/Export.tsx +++ b/web/src/pages/Export.tsx @@ -26,6 +26,18 @@ function Export() { const [deleteClip, setDeleteClip] = useState(); + const onHandleRename = useCallback( + (original: string, update: string) => { + axios.patch(`export/${original}/${update}`).then((response) => { + if (response.status == 200) { + setDeleteClip(undefined); + mutate(); + } + }); + }, + [mutate], + ); + const onHandleDelete = useCallback(() => { if (!deleteClip) { return; @@ -61,13 +73,14 @@ function Export() { -
+
{exports && (
{Object.values(exports).map((item) => ( setDeleteClip(file)} /> ))}