mirror of
https://github.com/storytold/artcraft.git
synced 2026-11-06 02:00:46 +00:00
Move history stack state to zustand
This commit is contained in:
1 parent
801886d7a8
commit
91d35f5343
3 files changed
+34
-22
No files matched your search
@@ -23,21 +23,18 @@ export interface ImageBundle {
|
||||
interface HistoryStackProps {
|
||||
onClear: () => void;
|
||||
onImageSelect?: (image: BaseSelectorImage) => void;
|
||||
startingBundles: ImageBundle[];
|
||||
imageBundles: ImageBundle[];
|
||||
onNewImageBundle?: (newBundle: ImageBundle) => void;
|
||||
selectedImageToken?: string;
|
||||
}
|
||||
|
||||
export const HistoryStack = ({
|
||||
onClear,
|
||||
onImageSelect = () => {},
|
||||
startingBundles = [],
|
||||
onImageSelect = () => { },
|
||||
imageBundles,
|
||||
onNewImageBundle = () => { },
|
||||
selectedImageToken
|
||||
}: HistoryStackProps) => {
|
||||
const [imageBundles, setImageBundles] =
|
||||
useState<ImageBundle[]>(startingBundles);
|
||||
const [selectedImageToken, setSelectedImageToken] = useState<string | null>(
|
||||
startingBundles.length > 0 && startingBundles[0].images.length > 0
|
||||
? startingBundles[0].images[0].mediaToken
|
||||
: null,
|
||||
);
|
||||
useImageEditCompleteEvent(async (event) => {
|
||||
const newBundle: ImageBundle = {
|
||||
images: event.edited_images.map(
|
||||
@@ -49,12 +46,7 @@ export const HistoryStack = ({
|
||||
),
|
||||
};
|
||||
|
||||
setImageBundles([...imageBundles, newBundle]);
|
||||
const newlySelected = newBundle.images[0];
|
||||
if (newlySelected) {
|
||||
setSelectedImageToken(newlySelected.mediaToken);
|
||||
onImageSelect(newlySelected);
|
||||
}
|
||||
onNewImageBundle(newBundle);
|
||||
});
|
||||
|
||||
// This is used to force image reloads in different sessions
|
||||
@@ -62,8 +54,6 @@ export const HistoryStack = ({
|
||||
const sessionRandBuster = useRef(Math.random());
|
||||
|
||||
const handleClear = () => {
|
||||
setImageBundles(startingBundles);
|
||||
setSelectedImageToken(null);
|
||||
onClear();
|
||||
};
|
||||
|
||||
@@ -78,7 +68,7 @@ export const HistoryStack = ({
|
||||
className={twMerge(
|
||||
"relative aspect-square h-full w-full border-2 bg-transparent p-0 hover:bg-transparent hover:opacity-80",
|
||||
selectedImageToken === image.mediaToken &&
|
||||
"border-primary hover:opacity-100",
|
||||
"border-primary hover:opacity-100",
|
||||
)}
|
||||
onClick={() => {
|
||||
setSelectedImageToken(image.mediaToken);
|
||||
|
||||
@@ -27,7 +27,7 @@ const PAGE_ID: ModelPage = ModelPage.ImageEditor;
|
||||
const PageEdit = () => {
|
||||
//useStateSceneLoader();
|
||||
|
||||
const selectedImageModel : ImageModel | undefined = getSelectedImageModel(PAGE_ID);
|
||||
const selectedImageModel: ImageModel | undefined = getSelectedImageModel(PAGE_ID);
|
||||
|
||||
// State for canvas dimensions
|
||||
const canvasWidth = useRef<number>(1024);
|
||||
@@ -46,6 +46,8 @@ const PageEdit = () => {
|
||||
|
||||
// Use the Zustand store
|
||||
const store = useEditStore();
|
||||
const addHistoryImageBundle = useEditStore((state) => state.addHistoryImageBundle);
|
||||
const historyImageBundles = useEditStore((state) => state.historyImageBundles)
|
||||
|
||||
// Pass store actions directly as callbacks
|
||||
useDeleteHotkeys({ onDelete: store.deleteSelectedItems });
|
||||
@@ -273,6 +275,7 @@ const PageEdit = () => {
|
||||
>
|
||||
<BaseImageSelector
|
||||
onImageSelect={(image: BaseSelectorImage) => {
|
||||
addHistoryImageBundle({ images: [image] });
|
||||
store.setBaseImageInfo(image);
|
||||
}}
|
||||
showLoading={
|
||||
@@ -305,11 +308,13 @@ const PageEdit = () => {
|
||||
onClear={() => {
|
||||
store.RESET();
|
||||
}}
|
||||
startingBundles={[{ images: [store.baseImageInfo] } as ImageBundle]}
|
||||
imageBundles={historyImageBundles}
|
||||
onImageSelect={(baseImage) => {
|
||||
store.clearLineNodes();
|
||||
store.setBaseImageInfo(baseImage);
|
||||
}}
|
||||
onNewImageBundle={addHistoryImageBundle}
|
||||
selectedImageToken={store.baseImageInfo?.mediaToken}
|
||||
/>
|
||||
</div>
|
||||
<div
|
||||
|
||||
@@ -3,6 +3,7 @@ import { LineNode, generateId } from "~/pages/PageDraw/stores/SceneState";
|
||||
import { Node } from "~/pages/PageDraw/Node";
|
||||
import { BaseSelectorImage } from "../BaseImageSelector";
|
||||
import { FetchProxy } from "libs/tauri-utils/src/lib/FetchProxy";
|
||||
import { ImageBundle } from "../HistoryStack";
|
||||
|
||||
export type ActiveEditTool = "select" | "edit" | "expand";
|
||||
export type EditOperation = "add" | "minus";
|
||||
@@ -126,6 +127,11 @@ interface EditState {
|
||||
// pushHistory: () => void;
|
||||
// clearHistory: () => void;
|
||||
RESET: () => void;
|
||||
|
||||
// For the history stack
|
||||
historyImageBundles: ImageBundle[];
|
||||
clearHistoryImages: () => void;
|
||||
addHistoryImageBundle: (bundle: ImageBundle) => void;
|
||||
}
|
||||
|
||||
// Add a flag to prevent saving state during restoration
|
||||
@@ -172,6 +178,9 @@ export const useEditStore = create<EditState>((set, get, store) => ({
|
||||
baseImageInfo: null,
|
||||
baseImageBitmap: null,
|
||||
|
||||
// History stack state
|
||||
historyImageBundles: [],
|
||||
|
||||
// Actions
|
||||
addNode: (node: Node) => {
|
||||
set((state) => {
|
||||
@@ -1009,5 +1018,13 @@ export const useEditStore = create<EditState>((set, get, store) => ({
|
||||
|
||||
RESET: () => {
|
||||
set(store.getInitialState());
|
||||
}
|
||||
},
|
||||
|
||||
clearHistoryImages: () => {
|
||||
set({ historyImageBundles: [] });
|
||||
},
|
||||
|
||||
addHistoryImageBundle(bundle) {
|
||||
set((state) => ({ historyImageBundles: [...state.historyImageBundles, bundle] }));
|
||||
},
|
||||
}));
|
||||
Reference in new issue
Block a user