From 2e74a0d0a06541fda3aabab4639c541a401cda4f Mon Sep 17 00:00:00 2001 From: Saimon8420 Date: Wed, 12 Feb 2025 18:57:58 +0600 Subject: [PATCH] all code added --- src/Home.jsx | 28 +++++++++++++++------------ src/components/Canvas/Canvas.jsx | 14 +++++++++++--- src/components/Panel/ProjectPanel.jsx | 20 +++++++++++++++---- src/hooks/useProject.jsx | 20 +++++++------------ 4 files changed, 50 insertions(+), 32 deletions(-) diff --git a/src/Home.jsx b/src/Home.jsx index ea3be5c..0738d1b 100644 --- a/src/Home.jsx +++ b/src/Home.jsx @@ -66,24 +66,28 @@ export const Home = () => { navigate("/"); toast({ variant: "destructive", title: projectData?.status, description: "No project found" }); } - if (projectData && projectData?.status === 200 && !projectLoading && projectData?.data?.object && canvas && (selectedPanel === "project" || selectedPanel === "") && id) { - const isEmpty = (obj) => Object.values(obj).length === 0; - if (!isEmpty(projectData?.data?.object)) { - canvas.loadFromJSON(projectData?.data?.object); - canvas.renderAll(); - } - } - }, [navigate, isLoading, data, projectData, projectLoading, canvas, selectedPanel, id, toast]); - - useEffect(() => { if (!projectData && canvas) { canvas.clear(); canvas.renderAll(); canvas.setBackgroundColor("#ffffff", canvas.renderAll.bind(canvas)); - setActiveObject(null); } - }, [projectData, canvas, setActiveObject]) + if (projectData && projectData?.status === 200 && !projectLoading && canvas && (selectedPanel === "project" || selectedPanel === "") && id) { + if (canvas?._objects?.length === 0) { + const isEmpty = (obj) => Object.values(obj).length === 0; + if (!isEmpty(projectData?.data?.object)) { + canvas.loadFromJSON(projectData?.data?.object, () => { + // Ensure background image fills the canvas + if (canvas.backgroundImage) { + canvas.backgroundImage.scaleToWidth(canvas.width); + canvas.backgroundImage.scaleToHeight(canvas.height); + } + canvas.renderAll(); + }); + } + } + } + }, [navigate, isLoading, data, projectData, id, toast, canvas, selectedPanel, projectLoading, setActiveObject]); return (
diff --git a/src/components/Canvas/Canvas.jsx b/src/components/Canvas/Canvas.jsx index 5f24135..a800f6d 100644 --- a/src/components/Canvas/Canvas.jsx +++ b/src/components/Canvas/Canvas.jsx @@ -9,7 +9,7 @@ import { Slider } from "@/components/ui/slider"; export default function Canvas() { const { setLeftPanelOpen, setRightPanelOpen, setOpenSetting, setOpenObjectPanel, rightPanelOpen } = useContext(OpenContext); - const { canvasRef, canvas, setCanvas, fabricCanvasRef, canvasRatio, setCanvasHeight, setCanvasWidth, setScreenWidth, selectedPanel } = useContext(CanvasContext); + const { canvasRef, canvas, setCanvas, fabricCanvasRef, canvasRatio, setCanvasHeight, setCanvasWidth, setScreenWidth, selectedPanel, setSelectedPanel } = useContext(CanvasContext); const { setActiveObject } = useContext(ActiveObjectContext); const [zoomLevel, setZoomLevel] = useState(100); @@ -248,12 +248,20 @@ export default function Canvas() { ${zoomLevel < 100 ? "overflow-hidden" : ""}`} > { + setSelectedPanel("canvas"); + }} + onClick={() => { + if (selectedPanel === "canvas") { + setSelectedPanel(""); + } + }} >
{ - const { setSelectedPanel } = useContext(CanvasContext); + const { canvas, setSelectedPanel } = useContext(CanvasContext); const params = useParams(); const { id } = params; + const { toast } = useToast(); + const navigate = useNavigate(); const queryClient = useQueryClient(); // Initialize query client @@ -26,9 +29,18 @@ export const ProjectPanel = () => { const { projectDelete, deletePending } = useProject(); const handleNavigate = (id) => { - // Invalidate a single query key - queryClient.invalidateQueries({ queryKey: ["project", id] }); - navigate(`/${id}`); + if (canvas?._objects?.length > 0) { + toast({ + variant: "destructive", + title: "Unsaved Changes", + description: "Please save your changes before navigating to another project.", + }) + } + else { + // Invalidate a single query key + queryClient.invalidateQueries({ queryKey: ["project", id] }); + navigate(`/${id}`); + } } // Filter projects where preview_url is not empty or null diff --git a/src/hooks/useProject.jsx b/src/hooks/useProject.jsx index 1f8b56f..a019bde 100644 --- a/src/hooks/useProject.jsx +++ b/src/hooks/useProject.jsx @@ -47,25 +47,19 @@ const useProject = () => { }, onSuccess: (data) => { if (data?.status === 200) { - - if (selectedPanel === "canvas") { + if (selectedPanel === "canvas" && canvas) { toast({ title: data?.status, description: data?.message, }) - queryClient.invalidateQueries({ queryKey: ["project", id] }); - queryClient.invalidateQueries({ queryKey: ["projects"] }); - if (canvas) { - canvas.clear(); - canvas.renderAll(); - canvas.setBackgroundColor("#ffffff", canvas.renderAll.bind(canvas)); - setActiveObject(null); + canvas.clear(); + canvas.renderAll(); + canvas.setBackgroundColor("#ffffff", canvas.renderAll.bind(canvas)); + setActiveObject(null); + setTimeout(() => { navigate("/"); setSelectedPanel(""); - } - setActiveObject(null); - navigate("/"); - setSelectedPanel(""); + }, 500); // Ensure clearing happens before navigation } queryClient.invalidateQueries({ queryKey: ["project", id] }); queryClient.invalidateQueries({ queryKey: ["projects"] });