From 335e35c96ac3b682f5c98dc9dac2ce9e9312c517 Mon Sep 17 00:00:00 2001 From: ashim-hq Date: Mon, 20 Apr 2026 21:36:14 +0800 Subject: [PATCH] fix: reset processed state and tool-specific stores on tool navigation --- apps/web/src/pages/tool-page.tsx | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/apps/web/src/pages/tool-page.tsx b/apps/web/src/pages/tool-page.tsx index 25d47e99..46658560 100644 --- a/apps/web/src/pages/tool-page.tsx +++ b/apps/web/src/pages/tool-page.tsx @@ -27,8 +27,14 @@ import { useMobile } from "@/hooks/use-mobile"; import { formatFileSize } from "@/lib/download"; import { ICON_MAP } from "@/lib/icon-map"; import { getToolRegistryEntry } from "@/lib/tool-registry"; +import { useBase64Store } from "@/stores/base64-store"; +import { useCollageStore } from "@/stores/collage-store"; +import { useDuplicateStore } from "@/stores/duplicate-store"; import { useFeaturesStore } from "@/stores/features-store"; import { useFileStore } from "@/stores/file-store"; +import { usePdfToImageStore } from "@/stores/pdf-to-image-store"; +import { useQrStore } from "@/stores/qr-store"; +import { useSplitStore } from "@/stores/split-store"; /** Formats that browsers can render in tags. */ const BROWSER_PREVIEWABLE_EXTS = new Set([ @@ -202,11 +208,30 @@ export function ToolPage() { // Center of the painted mask as a 0-100 percentage — used to init the slider at the right spot const [eraserSliderInitPos, setEraserSliderInitPos] = useState(null); - // Reset crop state when the image changes + // biome-ignore lint/correctness/useExhaustiveDependencies: toolId triggers intentional reset on tool navigation useEffect(() => { + useFileStore.getState().undoProcessing(); + + useBase64Store.getState().reset(); + useCollageStore.getState().reset(); + useDuplicateStore.getState().reset(); + usePdfToImageStore.getState().reset(); + useQrStore.getState().reset(); + useSplitStore.getState().reset(); + + setPreviewTransform(null); + setPreviewFilter(""); + setImageWrapperStyle(null); + setBgPreview(null); setCropCrop({ unit: "%", x: 0, y: 0, width: 100, height: 100 }); + setCropAspect(undefined); + setCropShowGrid(true); setCropImgDimensions(null); - }, []); + setEraserHasStrokes(false); + setEraserBrushSize(30); + setEraserSliderInitPos(null); + setMobileSettingsOpen(true); + }, [toolId]); const handleFiles = useCallback( (newFiles: File[]) => {