Files
gunbuilder-next-tailwind/src/store/useBuildStore.ts

53 lines
1.3 KiB
TypeScript
Raw Normal View History

2025-06-29 15:58:03 -04:00
import { create, StateCreator } from 'zustand';
import { persist } from 'zustand/middleware';
export interface BuildPart {
id: string;
name: string;
image_url: string;
brand: {
id: string;
name: string;
logo?: string;
};
category: {
id: string;
name: string;
};
offers: Array<{
price: number;
url: string;
vendor: {
name: string;
logo?: string;
};
inStock?: boolean;
shipping?: string;
}>;
}
export interface BuildState {
selectedParts: Record<string, BuildPart | null>; // key: checklist component id
selectPartForComponent: (componentId: string, part: BuildPart) => void;
removePartForComponent: (componentId: string) => void;
clearBuild: () => void;
}
const buildStoreCreator: StateCreator<BuildState> = (set) => ({
selectedParts: {},
selectPartForComponent: (componentId, part) => set((state) => ({
selectedParts: { ...state.selectedParts, [componentId]: part },
})),
removePartForComponent: (componentId) => set((state) => {
const updated = { ...state.selectedParts };
delete updated[componentId];
return { selectedParts: updated };
}),
clearBuild: () => set({ selectedParts: {} }),
});
export const useBuildStore = create<BuildState>()(
persist(buildStoreCreator, {
name: 'current-build-storage',
})
);