import { Mission, Prisma } from "@repo/db"; import { MissionOptionalDefaults } from "@repo/db/zod"; import { create } from "zustand"; interface MissionStore { missions: MissionOptionalDefaults[]; setMissions: (missions: MissionOptionalDefaults[]) => void; getMissions: () => Promise; createMission: (mission: MissionOptionalDefaults) => Promise; setMission: (mission: MissionOptionalDefaults) => void; } export const useMissionsStore = create((set) => ({ missions: [], setMissions: (missions) => set({ missions }), createMission: async (mission) => { const res = await fetch("/api/mission", { method: "PUT", headers: { "Content-Type": "application/json", }, body: JSON.stringify(mission), }); if (!res.ok) return undefined; const data = await res.json(); set((state) => ({ missions: [...state.missions, data] })); return data; }, getMissions: async () => { const res = await fetch("/api/mission", { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ OR: [ { state: "draft", }, { state: "running", }, ], } as Prisma.MissionWhereInput), }); if (!res.ok) return undefined; const data = await res.json(); set({ missions: data }); return undefined; }, setMission: (mission) => set((state) => { const existingMissionIndex = state.missions.findIndex( (m) => m.id === mission.id, ); if (existingMissionIndex !== -1) { const updatedMissions = [...state.missions]; updatedMissions[existingMissionIndex] = mission; return { missions: updatedMissions }; } else { return { missions: [...state.missions, mission] }; } }), })); useMissionsStore .getState() .getMissions() .then(() => { console.log("Missions loaded"); });