From 46fd536cc6308891dbf7d97c87c4d0cfce53875c Mon Sep 17 00:00:00 2001 From: Bobby Date: Sat, 9 Nov 2024 21:40:58 +0530 Subject: [PATCH] feat/undo action for deleting a solve --- .../menu-solve-options/menu-solve-options.tsx | 27 ++++++++++++++- src/lib/updateSolve.ts | 34 ++++++++++++------- 2 files changed, 47 insertions(+), 14 deletions(-) diff --git a/src/components/menu-solve-options/menu-solve-options.tsx b/src/components/menu-solve-options/menu-solve-options.tsx index 69bcb40c..b61f64af 100644 --- a/src/components/menu-solve-options/menu-solve-options.tsx +++ b/src/components/menu-solve-options/menu-solve-options.tsx @@ -35,6 +35,27 @@ export default function MenuSolveOptions({ const dialog = useDialogSolve(); if (!selectedCube) return null; + const handleUndoSolve = async (solve : Solve | null) => { + debugger + if (solve && selectedCube) { + await updateSolve({ + solveId: solve.id, + selectedCube: selectedCube, + type: "UNDO", + deletedSolve:solve, + }); + + toast("", { + description: "Restored last deleted Solve", + duration: 1000, + }); + + const lastCube = await getCubeById(selectedCube.id); + if (lastCube) { + setSelectedCube({ ...lastCube }); + } + } + }; const handleDeleteSolve = async () => { if (solve && selectedCube) { @@ -68,7 +89,11 @@ export default function MenuSolveOptions({ toast("", { description: "Deleted solve", - duration: 1000, + duration: 2000, + action: { + label: 'Undo', + onClick: () => handleUndoSolve(solve) + }, }); onDeleteSolve(); diff --git a/src/lib/updateSolve.ts b/src/lib/updateSolve.ts index cb5cfbc7..0b1d2883 100644 --- a/src/lib/updateSolve.ts +++ b/src/lib/updateSolve.ts @@ -1,6 +1,7 @@ import { saveCube } from "@/db/dbOperations"; import { Cube } from "@/interfaces/Cube"; import { Solve } from "@/interfaces/Solve"; +import { useState } from "react"; /** * Updates the specified solve in the cubes' solves arrays. @@ -14,27 +15,34 @@ export default async function updateSolve({ solveId, type, comment, + deletedSolve, }: { selectedCube: Cube; solveId: string; - type: "+2" | "DNF" | "COMMENT" | "BOOKMARK" | "DELETE"; + type: "+2" | "DNF" | "COMMENT" | "BOOKMARK" | "DELETE" | "UNDO"; comment?: string; + deletedSolve?:Solve; }): Promise { const updateSolveArray = (solveArray: Solve[]) => { const solveIndex = solveArray.findIndex((solve) => solve.id === solveId); - if (solveIndex !== -1) { - const solveToUpdate = solveArray[solveIndex]; - - if (type === "+2") { - solveToUpdate.plus2 = !solveToUpdate.plus2; - solveToUpdate.time += solveToUpdate.plus2 ? 2000 : -2000; - } else if (type === "COMMENT") { - solveToUpdate.comment = comment ?? ""; - } else if (type === "BOOKMARK") { - solveToUpdate.bookmark = !solveToUpdate.bookmark; - } else if (type === "DELETE") { - solveArray.splice(solveIndex, 1); // Remove the solve from the array + if (solveIndex !== -1 || (type === "UNDO" && deletedSolve)) { + const solveToUpdate = type === "UNDO" ? deletedSolve : solveArray[solveIndex]; + + if(solveToUpdate){ + if (type === "+2") { + solveToUpdate.plus2 = !solveToUpdate.plus2; + solveToUpdate.time += solveToUpdate.plus2 ? 2000 : -2000; + } else if (type === "COMMENT") { + solveToUpdate.comment = comment ?? ""; + } else if (type === "BOOKMARK") { + solveToUpdate.bookmark = !solveToUpdate.bookmark; + } else if (type === "DELETE") { + deletedSolve = solveToUpdate; + solveArray.splice(solveIndex, 1); // Remove the solve from the array + }else if(type === "UNDO" && deletedSolve) { + solveArray.push(deletedSolve); + } } } };