From 0a7dc295f8db67daa3fc4b2f34c2009a69c86194 Mon Sep 17 00:00:00 2001 From: Maze Winther Date: Tue, 27 Jan 2026 16:58:38 +0100 Subject: [PATCH] finish export cancel feature --- .../web/src/components/editor/export-button.tsx | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/apps/web/src/components/editor/export-button.tsx b/apps/web/src/components/editor/export-button.tsx index 96fbda6f..141bebc5 100644 --- a/apps/web/src/components/editor/export-button.tsx +++ b/apps/web/src/components/editor/export-button.tsx @@ -1,6 +1,6 @@ "use client"; -import { useState } from "react"; +import { useState, useRef } from "react"; import { TransitionTopIcon } from "@hugeicons/core-free-icons"; import { HugeiconsIcon } from "@hugeicons/react"; import { Popover, PopoverContent, PopoverTrigger } from "../ui/popover"; @@ -86,10 +86,12 @@ function ExportPopover({ const [isExporting, setIsExporting] = useState(false); const [progress, setProgress] = useState(0); const [exportResult, setExportResult] = useState(null); + const cancelRequestedRef = useRef(false); const handleExport = async () => { if (!activeProject) return; + cancelRequestedRef.current = false; setIsExporting(true); setProgress(0); setExportResult(null); @@ -101,13 +103,18 @@ function ExportPopover({ fps: activeProject.settings.fps, includeAudio, onProgress: ({ progress }) => setProgress(progress), - onCancel: () => false, // TODO: add cancel functionality + onCancel: () => cancelRequestedRef.current, }, }); setIsExporting(false); setExportResult(result); + if (result.cancelled) { + setProgress(0); + return; + } + if (result.success && result.buffer) { const mimeType = getExportMimeType({ format }); const extension = getExportFileExtension({ format }); @@ -136,6 +143,10 @@ function ExportPopover({ } }; + const handleCancel = () => { + cancelRequestedRef.current = true; + }; + return ( {exportResult && !exportResult.success ? ( @@ -262,7 +273,7 @@ function ExportPopover({