diff --git a/src/components/VersionCombobox.tsx b/src/components/VersionCombobox.tsx index f20bf17..7b15a4b 100644 --- a/src/components/VersionCombobox.tsx +++ b/src/components/VersionCombobox.tsx @@ -1,4 +1,4 @@ -import { useEffect, useState } from "react"; +import { useContext, useEffect, useState } from "react"; import { CheckIcon, ChevronsUpDownIcon } from "lucide-react"; import { Button } from "@/components/ui/button"; @@ -7,6 +7,7 @@ import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover import { cn } from "@/lib/utils"; import { numberToVersion, versionToNumber } from "@/utils/version"; +import { HistoryContext } from "@/context/History"; const versions = [ "1.21.4", @@ -31,14 +32,29 @@ const versions = [ interface Props { version: number; setVersion: React.Dispatch>; + // If both variables above are from the context + isContext?: boolean; } -function VersionCombobox({ version, setVersion }: Props) { +function VersionCombobox({ version, setVersion, isContext }: Props) { + const { addHistory } = useContext(HistoryContext); + const [comboboxOpen, setComboboxOpen] = useState(false); const [comboboxValue, setComboboxValue] = useState(numberToVersion(version)); useEffect(() => { - setVersion(versionToNumber(comboboxValue)); + setVersion((prev) => { + if (isContext) { + const oldVersion = prev; + addHistory( + "Set Version", + () => setVersion(versionToNumber(comboboxValue)), + () => setVersion(oldVersion) + ); + } + + return versionToNumber(comboboxValue); + }); }, [comboboxValue]); return ( diff --git a/src/components/canvas/Canvas.tsx b/src/components/canvas/Canvas.tsx index 5ee5878..f9ec202 100644 --- a/src/components/canvas/Canvas.tsx +++ b/src/components/canvas/Canvas.tsx @@ -287,7 +287,16 @@ function Canvas() { } } - setSelectionCoords(newSelection); + setSelectionCoords((prev) => { + const prevSelection = [...prev]; + addHistory( + "Select All", + () => setSelectionCoords(newSelection), + () => setSelectionCoords(prevSelection) + ); + + return newSelection; + }); break; } case "z": diff --git a/src/components/dialogs/OpenImage.tsx b/src/components/dialogs/OpenImage.tsx index 0eae14f..1f85633 100644 --- a/src/components/dialogs/OpenImage.tsx +++ b/src/components/dialogs/OpenImage.tsx @@ -4,6 +4,7 @@ import { useDropzone } from "react-dropzone"; import { CircleAlertIcon, LinkIcon, UploadIcon } from "lucide-react"; import { CanvasContext } from "@/context/Canvas"; +import { HistoryContext } from "@/context/History"; import { LoadingContext } from "@/context/Loading"; import { Button } from "@/components/ui/button"; @@ -20,11 +21,13 @@ import { Toggle } from "@/components/ui/toggle"; import { useBlockData } from "@/hooks/useBlockData"; import BlockSelector from "./open-image/BlockSelector"; -import VersionCombobox from "../VersionCombobox"; +import VersionCombobox from "@/components/VersionCombobox"; + import { findBlockFromRgb } from "@/utils/findBlockFromRgb"; function OpenImage({ close }: DialogProps) { - const { version, setBlocks, setVersion, centerCanvas } = useContext(CanvasContext); + const { blocks, version, setBlocks, setVersion, centerCanvas } = useContext(CanvasContext); + const { addHistory } = useContext(HistoryContext); const { setLoading } = useContext(LoadingContext); const { acceptedFiles, getRootProps, getInputProps } = useDropzone({ @@ -98,6 +101,8 @@ function OpenImage({ close }: DialogProps) { const onSubmit = async () => { if (image) { + const oldBlocks = [...blocks]; + setIsFinished(false); setLoading(true); // Wait for loading indicator to appear @@ -131,6 +136,11 @@ function OpenImage({ close }: DialogProps) { } setBlocks(newBlocks); + addHistory( + "Open Image", + () => setBlocks(newBlocks), + () => setBlocks(oldBlocks) + ); } setLoading(false); @@ -318,7 +328,7 @@ function OpenImage({ close }: DialogProps) { - +