Files
SteelXR/src/stores/useModelStore.ts
T
gpt-engineer-app[bot] 96e316aa8e Changes
2026-02-27 00:55:33 +00:00

101 lines
2.9 KiB
TypeScript

import { create } from 'zustand';
interface ModelInfo {
fileName: string;
fileSize: number;
url: string;
}
interface FineTuning {
posX: number;
posY: number;
posZ: number;
rotY: number;
}
type AnchorMode = 'tracking' | 'manual' | 'fine-tuning';
type InspectionResult = 'pending' | 'approved' | 'rejected';
type RenderMode = 'solid' | 'wireframe';
export interface ChecklistItem {
id: string;
label: string;
status: 'pending' | 'approved' | 'rejected';
note: string;
}
const defaultChecklist: ChecklistItem[] = [
{ id: 'dimensions', label: 'Dimensões Gerais', status: 'pending', note: '' },
{ id: 'plates', label: 'Posição das Placas', status: 'pending', note: '' },
{ id: 'holes', label: 'Diâmetro dos Furos', status: 'pending', note: '' },
{ id: 'weld', label: 'Especificação da Solda', status: 'pending', note: '' },
];
interface ModelStore {
model: ModelInfo | null;
setModel: (model: ModelInfo | null) => void;
fineTuning: FineTuning;
setFineTuning: (ft: Partial<FineTuning>) => void;
resetFineTuning: () => void;
anchorMode: AnchorMode;
setAnchorMode: (mode: AnchorMode) => void;
inspectionResult: InspectionResult;
setInspectionResult: (result: InspectionResult) => void;
xrSupported: boolean | null;
setXrSupported: (supported: boolean | null) => void;
opacity: number;
setOpacity: (opacity: number) => void;
renderMode: RenderMode;
setRenderMode: (mode: RenderMode) => void;
checklist: ChecklistItem[];
setChecklistItemStatus: (id: string, status: 'approved' | 'rejected') => void;
setChecklistItemNote: (id: string, note: string) => void;
resetChecklist: () => void;
}
const defaultFineTuning: FineTuning = { posX: 0, posY: 0, posZ: 0, rotY: 0 };
export const useModelStore = create<ModelStore>((set) => ({
model: null,
setModel: (model) => set({ model }),
fineTuning: { ...defaultFineTuning },
setFineTuning: (ft) => set((state) => ({ fineTuning: { ...state.fineTuning, ...ft } })),
resetFineTuning: () => set({ fineTuning: { ...defaultFineTuning } }),
anchorMode: 'manual',
setAnchorMode: (anchorMode) => set({ anchorMode }),
inspectionResult: 'pending',
setInspectionResult: (inspectionResult) => set({ inspectionResult }),
xrSupported: null,
setXrSupported: (xrSupported) => set({ xrSupported }),
opacity: 1,
setOpacity: (opacity) => set({ opacity }),
renderMode: 'solid',
setRenderMode: (renderMode) => set({ renderMode }),
checklist: defaultChecklist.map(i => ({ ...i })),
setChecklistItemStatus: (id, status) => set((state) => ({
checklist: state.checklist.map(item =>
item.id === id ? { ...item, status } : item
),
})),
setChecklistItemNote: (id, note) => set((state) => ({
checklist: state.checklist.map(item =>
item.id === id ? { ...item, note } : item
),
})),
resetChecklist: () => set({ checklist: defaultChecklist.map(i => ({ ...i })) }),
}));