2025-04-23 12:43:32 +00:00
|
|
|
import { create } from 'zustand';
|
|
|
|
import { immer } from 'zustand/middleware/immer';
|
|
|
|
|
|
|
|
type MaterialsStore = {
|
|
|
|
materials: MaterialsSchema;
|
|
|
|
|
2025-05-03 13:06:30 +00:00
|
|
|
addMaterial: (material: MaterialSchema) => MaterialSchema | undefined;
|
|
|
|
removeMaterial: (materialId: string) => MaterialSchema | undefined;
|
2025-05-05 14:38:05 +00:00
|
|
|
clearMaterials: () => void;
|
2025-05-03 13:06:30 +00:00
|
|
|
updateMaterial: (materialId: string, updates: Partial<MaterialSchema>) => MaterialSchema | undefined;
|
2025-04-23 12:43:32 +00:00
|
|
|
|
2025-05-03 13:06:30 +00:00
|
|
|
setCurrentLocation: (
|
|
|
|
materialId: string,
|
|
|
|
location: {
|
|
|
|
modelUuid: string;
|
|
|
|
pointUuid: string;
|
|
|
|
actionUuid: string;
|
|
|
|
}
|
|
|
|
) => MaterialSchema | undefined;
|
|
|
|
|
|
|
|
setNextLocation: (
|
|
|
|
materialId: string,
|
|
|
|
location?: {
|
|
|
|
modelUuid: string;
|
|
|
|
pointUuid: string;
|
|
|
|
} | null
|
|
|
|
) => MaterialSchema | undefined;
|
|
|
|
|
2025-05-06 06:00:58 +00:00
|
|
|
setMaterial: (materialId: string, materialType: string) => MaterialSchema | undefined;
|
2025-05-03 13:06:30 +00:00
|
|
|
setStartTime: (materialId: string, startTime: string) => MaterialSchema | undefined;
|
|
|
|
setEndTime: (materialId: string, endTime: string) => MaterialSchema | undefined;
|
|
|
|
setCost: (materialId: string, cost: number) => MaterialSchema | undefined;
|
|
|
|
setWeight: (materialId: string, weight: number) => MaterialSchema | undefined;
|
|
|
|
setIsActive: (materialId: string, isActive: boolean) => MaterialSchema | undefined;
|
|
|
|
setIsVisible: (materialId: string, isVisible: boolean) => MaterialSchema | undefined;
|
2025-05-06 13:42:58 +00:00
|
|
|
setIsPaused: (materialId: string, isPlaying: boolean) => MaterialSchema | undefined;
|
2025-05-03 13:06:30 +00:00
|
|
|
setIsRendered: (materialId: string, isRendered: boolean) => MaterialSchema | undefined;
|
2025-04-23 12:43:32 +00:00
|
|
|
|
|
|
|
getMaterialById: (materialId: string) => MaterialSchema | undefined;
|
2025-05-06 07:05:51 +00:00
|
|
|
getMaterialsByCurrentModelUuid: (currentModelUuid: string) => MaterialSchema[] | undefined;
|
2025-05-06 06:00:58 +00:00
|
|
|
getMaterialByCurrentPointUuid: (currentPointUuid: string) => MaterialSchema | undefined;
|
2025-05-03 13:06:30 +00:00
|
|
|
getMaterialsByPoint: (pointUuid: string) => MaterialSchema[];
|
|
|
|
getMaterialsByModel: (modelUuid: string) => MaterialSchema[];
|
2025-04-23 12:43:32 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
export const useMaterialStore = create<MaterialsStore>()(
|
|
|
|
immer((set, get) => ({
|
|
|
|
materials: [],
|
|
|
|
|
|
|
|
addMaterial: (material) => {
|
2025-05-03 13:06:30 +00:00
|
|
|
let updatedMaterial: MaterialSchema | undefined;
|
2025-04-23 12:43:32 +00:00
|
|
|
set((state) => {
|
|
|
|
state.materials.push(material);
|
|
|
|
});
|
2025-05-03 13:06:30 +00:00
|
|
|
return updatedMaterial;
|
2025-04-23 12:43:32 +00:00
|
|
|
},
|
|
|
|
|
|
|
|
removeMaterial: (materialId) => {
|
2025-05-03 13:06:30 +00:00
|
|
|
let updatedMaterial: MaterialSchema | undefined;
|
2025-04-23 12:43:32 +00:00
|
|
|
set((state) => {
|
2025-05-03 13:06:30 +00:00
|
|
|
const material = state.materials.find(m => m.materialId === materialId);
|
|
|
|
if (material) {
|
|
|
|
state.materials.filter(m => m.materialId !== material.materialId);
|
|
|
|
updatedMaterial = JSON.parse(JSON.stringify(material));
|
|
|
|
}
|
2025-04-23 12:43:32 +00:00
|
|
|
});
|
2025-05-03 13:06:30 +00:00
|
|
|
return updatedMaterial;
|
2025-04-23 12:43:32 +00:00
|
|
|
},
|
|
|
|
|
2025-05-05 14:38:05 +00:00
|
|
|
clearMaterials: () => {
|
|
|
|
set((state) => {
|
|
|
|
state.materials = [];
|
|
|
|
});
|
|
|
|
},
|
|
|
|
|
2025-04-23 12:43:32 +00:00
|
|
|
updateMaterial: (materialId, updates) => {
|
2025-05-03 13:06:30 +00:00
|
|
|
let updatedMaterial: MaterialSchema | undefined;
|
2025-04-23 12:43:32 +00:00
|
|
|
set((state) => {
|
|
|
|
const material = state.materials.find(m => m.materialId === materialId);
|
|
|
|
if (material) {
|
|
|
|
Object.assign(material, updates);
|
2025-05-03 13:06:30 +00:00
|
|
|
updatedMaterial = JSON.parse(JSON.stringify(material));
|
|
|
|
}
|
|
|
|
});
|
|
|
|
return updatedMaterial;
|
|
|
|
},
|
|
|
|
|
|
|
|
setCurrentLocation: (materialId, location) => {
|
|
|
|
let updatedMaterial: MaterialSchema | undefined;
|
|
|
|
set((state) => {
|
|
|
|
const material = state.materials.find(m => m.materialId === materialId);
|
|
|
|
if (material) {
|
|
|
|
material.current = location;
|
|
|
|
updatedMaterial = JSON.parse(JSON.stringify(material));
|
2025-04-23 12:43:32 +00:00
|
|
|
}
|
|
|
|
});
|
2025-05-03 13:06:30 +00:00
|
|
|
return updatedMaterial;
|
|
|
|
},
|
|
|
|
|
|
|
|
setNextLocation: (materialId, location) => {
|
|
|
|
let updatedMaterial: MaterialSchema | undefined;
|
|
|
|
set((state) => {
|
|
|
|
const material = state.materials.find(m => m.materialId === materialId);
|
|
|
|
if (material) {
|
|
|
|
material.next = location || undefined;
|
|
|
|
updatedMaterial = JSON.parse(JSON.stringify(material));
|
|
|
|
}
|
|
|
|
});
|
|
|
|
return updatedMaterial;
|
2025-04-23 12:43:32 +00:00
|
|
|
},
|
|
|
|
|
2025-05-06 06:00:58 +00:00
|
|
|
setMaterial: (materialId, materialType) => {
|
|
|
|
let updatedMaterial: MaterialSchema | undefined;
|
|
|
|
set((state) => {
|
|
|
|
const material = state.materials.find(m => m.materialId === materialId);
|
|
|
|
if (material) {
|
|
|
|
material.materialType = materialType;
|
|
|
|
updatedMaterial = JSON.parse(JSON.stringify(material));
|
|
|
|
};
|
|
|
|
});
|
|
|
|
return updatedMaterial;
|
|
|
|
},
|
|
|
|
|
2025-04-23 12:43:32 +00:00
|
|
|
setStartTime: (materialId, startTime) => {
|
2025-05-03 13:06:30 +00:00
|
|
|
let updatedMaterial: MaterialSchema | undefined;
|
2025-04-23 12:43:32 +00:00
|
|
|
set((state) => {
|
|
|
|
const material = state.materials.find(m => m.materialId === materialId);
|
2025-05-03 13:06:30 +00:00
|
|
|
if (material) {
|
|
|
|
material.startTime = startTime
|
|
|
|
updatedMaterial = JSON.parse(JSON.stringify(material));
|
|
|
|
};
|
2025-04-23 12:43:32 +00:00
|
|
|
});
|
2025-05-03 13:06:30 +00:00
|
|
|
return updatedMaterial;
|
2025-04-23 12:43:32 +00:00
|
|
|
},
|
|
|
|
|
|
|
|
setEndTime: (materialId, endTime) => {
|
2025-05-03 13:06:30 +00:00
|
|
|
let updatedMaterial: MaterialSchema | undefined;
|
2025-04-23 12:43:32 +00:00
|
|
|
set((state) => {
|
|
|
|
const material = state.materials.find(m => m.materialId === materialId);
|
2025-05-03 13:06:30 +00:00
|
|
|
if (material) {
|
|
|
|
material.endTime = endTime;
|
|
|
|
updatedMaterial = JSON.parse(JSON.stringify(material));
|
|
|
|
};
|
2025-04-23 12:43:32 +00:00
|
|
|
});
|
2025-05-03 13:06:30 +00:00
|
|
|
return updatedMaterial;
|
2025-04-23 12:43:32 +00:00
|
|
|
},
|
|
|
|
|
|
|
|
setCost: (materialId, cost) => {
|
2025-05-03 13:06:30 +00:00
|
|
|
let updatedMaterial: MaterialSchema | undefined;
|
2025-04-23 12:43:32 +00:00
|
|
|
set((state) => {
|
|
|
|
const material = state.materials.find(m => m.materialId === materialId);
|
2025-05-03 13:06:30 +00:00
|
|
|
if (material) {
|
|
|
|
material.cost = cost;
|
|
|
|
updatedMaterial = JSON.parse(JSON.stringify(material));
|
|
|
|
};
|
2025-04-23 12:43:32 +00:00
|
|
|
});
|
2025-05-03 13:06:30 +00:00
|
|
|
return updatedMaterial;
|
2025-04-23 12:43:32 +00:00
|
|
|
},
|
|
|
|
|
|
|
|
setWeight: (materialId, weight) => {
|
2025-05-03 13:06:30 +00:00
|
|
|
let updatedMaterial: MaterialSchema | undefined;
|
2025-04-23 12:43:32 +00:00
|
|
|
set((state) => {
|
|
|
|
const material = state.materials.find(m => m.materialId === materialId);
|
2025-05-03 13:06:30 +00:00
|
|
|
if (material) {
|
|
|
|
material.weight = weight;
|
|
|
|
updatedMaterial = JSON.parse(JSON.stringify(material));
|
|
|
|
};
|
2025-04-23 12:43:32 +00:00
|
|
|
});
|
2025-05-03 13:06:30 +00:00
|
|
|
return updatedMaterial;
|
|
|
|
},
|
|
|
|
|
|
|
|
setIsActive: (materialId, isActive) => {
|
|
|
|
let updatedMaterial: MaterialSchema | undefined;
|
|
|
|
set((state) => {
|
|
|
|
const material = state.materials.find(m => m.materialId === materialId);
|
|
|
|
if (material) {
|
|
|
|
material.isActive = isActive;
|
|
|
|
updatedMaterial = JSON.parse(JSON.stringify(material));
|
|
|
|
};
|
|
|
|
});
|
|
|
|
return updatedMaterial;
|
|
|
|
},
|
|
|
|
|
|
|
|
setIsVisible: (materialId, isVisible) => {
|
|
|
|
let updatedMaterial: MaterialSchema | undefined;
|
|
|
|
set((state) => {
|
|
|
|
const material = state.materials.find(m => m.materialId === materialId);
|
|
|
|
if (material) {
|
|
|
|
material.isVisible = isVisible;
|
|
|
|
updatedMaterial = JSON.parse(JSON.stringify(material));
|
|
|
|
};
|
|
|
|
});
|
|
|
|
return updatedMaterial;
|
|
|
|
},
|
|
|
|
|
2025-05-06 13:42:58 +00:00
|
|
|
setIsPaused: (materialId, isPaused) => {
|
|
|
|
let updatedMaterial: MaterialSchema | undefined;
|
|
|
|
set((state) => {
|
|
|
|
const material = state.materials.find(m => m.materialId === materialId);
|
|
|
|
if (material) {
|
|
|
|
material.isPaused = isPaused;
|
|
|
|
updatedMaterial = JSON.parse(JSON.stringify(material));
|
|
|
|
};
|
|
|
|
});
|
|
|
|
return updatedMaterial;
|
|
|
|
},
|
|
|
|
|
2025-05-03 13:06:30 +00:00
|
|
|
setIsRendered: (materialId, isRendered) => {
|
|
|
|
let updatedMaterial: MaterialSchema | undefined;
|
|
|
|
set((state) => {
|
|
|
|
const material = state.materials.find(m => m.materialId === materialId);
|
|
|
|
if (material) {
|
|
|
|
material.isRendered = isRendered;
|
|
|
|
updatedMaterial = JSON.parse(JSON.stringify(material));
|
|
|
|
};
|
|
|
|
});
|
|
|
|
return updatedMaterial;
|
2025-04-23 12:43:32 +00:00
|
|
|
},
|
|
|
|
|
|
|
|
getMaterialById: (materialId) => {
|
|
|
|
return get().materials.find(m => m.materialId === materialId);
|
|
|
|
},
|
2025-05-06 07:05:51 +00:00
|
|
|
|
|
|
|
getMaterialsByCurrentModelUuid: (currentModelUuid) => {
|
|
|
|
return get().materials.filter(m => m.current?.modelUuid === currentModelUuid);
|
2025-05-05 14:38:05 +00:00
|
|
|
},
|
2025-05-06 07:05:51 +00:00
|
|
|
|
2025-05-06 06:00:58 +00:00
|
|
|
getMaterialByCurrentPointUuid: (currentPointlUuid) => {
|
|
|
|
return get().materials.find(m => m.current?.pointUuid === currentPointlUuid);
|
|
|
|
},
|
2025-05-03 13:06:30 +00:00
|
|
|
|
|
|
|
getMaterialsByPoint: (pointUuid) => {
|
|
|
|
return get().materials.filter(m =>
|
|
|
|
m.current?.pointUuid === pointUuid ||
|
|
|
|
m.next?.pointUuid === pointUuid
|
|
|
|
);
|
|
|
|
},
|
|
|
|
|
|
|
|
getMaterialsByModel: (modelUuid) => {
|
|
|
|
return get().materials.filter(m =>
|
|
|
|
m.current?.modelUuid === modelUuid ||
|
|
|
|
m.next?.modelUuid === modelUuid
|
|
|
|
);
|
|
|
|
},
|
2025-04-23 12:43:32 +00:00
|
|
|
}))
|
2025-05-03 13:06:30 +00:00
|
|
|
);
|