fix: address CodeRabbit review feedback

- AnnotationTextTab: use ?? instead of || so empty text can be cleared
- ExtensionManager: add catch block for marketplace install failures
- useEditorExport: wrap retry save in try/catch for unhandled rejections
- editorExportWorkflow: move playback restore to finally block
This commit is contained in:
webadderall
2026-04-20 21:23:58 +10:00
parent a9a019482d
commit 5dd5dbccf0
4 changed files with 41 additions and 27 deletions
@@ -59,7 +59,7 @@ export function AnnotationTextTab({
{t("annotations.textContent")}
</label>
<textarea
value={annotation.textContent || annotation.content}
value={annotation.textContent ?? annotation.content ?? ""}
onChange={(event) => onContentChange(event.target.value)}
placeholder={t("annotations.textPlaceholder")}
rows={5}
@@ -143,6 +143,10 @@ export default function ExtensionManager() {
description: result.error,
});
}
} catch (error) {
toast.error(t("toast.marketplaceInstallFailed", undefined, { name: extension.name }), {
description: error instanceof Error ? error.message : undefined,
});
} finally {
setInstallingIds((previous) => {
const next = new Set(previous);
@@ -98,10 +98,12 @@ export async function runEditorExport({
setExportProgress,
);
let keepExportDialogOpen = false;
let wasPlaying = false;
let restoreTime: number | null = null;
try {
const wasPlaying = config.isPlaying;
const restoreTime = video.currentTime;
wasPlaying = config.isPlaying;
restoreTime = video.currentTime;
if (wasPlaying) {
videoPlaybackRef.current?.pause();
}
@@ -442,11 +444,6 @@ export async function runEditorExport({
}
}
if (wasPlaying) {
videoPlaybackRef.current?.play();
} else {
video.currentTime = restoreTime;
}
} catch (error) {
console.error("Export error:", error);
const errorMessage = error instanceof Error ? error.message : "Unknown error";
@@ -468,6 +465,13 @@ export async function runEditorExport({
setExportError(errorMessage);
toast.error(`Export failed: ${summarizeErrorMessage(errorMessage)}`);
} finally {
if (restoreTime !== null) {
if (wasPlaying) {
videoPlaybackRef.current?.play();
} else {
video.currentTime = restoreTime;
}
}
extensionHost.emitEvent({ type: "export:complete" });
setIsExporting(false);
exporterRef.current = null;
@@ -210,26 +210,32 @@ export function useEditorExport({
const handleRetrySaveExport = useCallback(async () => {
const pendingSave = pendingExportSaveRef.current;
if (!pendingSave) return;
const saveResult = await window.electronAPI.saveExportedVideo(
pendingSave.arrayBuffer,
pendingSave.fileName,
);
if (saveResult.canceled) {
setExportError("Save dialog canceled. Click Save Again to save without re-rendering.");
toast.info("Save canceled. You can try again.");
return;
try {
const saveResult = await window.electronAPI.saveExportedVideo(
pendingSave.arrayBuffer,
pendingSave.fileName,
);
if (saveResult.canceled) {
setExportError("Save dialog canceled. Click Save Again to save without re-rendering.");
toast.info("Save canceled. You can try again.");
return;
}
if (saveResult.success && saveResult.path) {
clearPendingExportSave();
setExportError(null);
setExportedFilePath(saveResult.path);
showExportSuccessToast(saveResult.path);
setShowExportDropdown(true);
return;
}
const errorMessage = saveResult.message || "Failed to save video";
setExportError(errorMessage);
toast.error(errorMessage);
} catch (error) {
const errorMessage = error instanceof Error ? error.message : "Failed to save video";
setExportError(errorMessage);
toast.error(errorMessage);
}
if (saveResult.success && saveResult.path) {
clearPendingExportSave();
setExportError(null);
setExportedFilePath(saveResult.path);
showExportSuccessToast(saveResult.path);
setShowExportDropdown(true);
return;
}
const errorMessage = saveResult.message || "Failed to save video";
setExportError(errorMessage);
toast.error(errorMessage);
}, [clearPendingExportSave, showExportSuccessToast]);
// Export status derived values