Files
SalonRo/src/stores/LocationStore.ts
2025-12-24 11:20:50 +03:30

101 lines
2.9 KiB
TypeScript

import { create } from "zustand";
export type LatLng = { lat: number; lng: number };
export type Mode = "origin" | "destination" | "routing";
export type LocationPoint = {
id: string;
locationType: "origin" | "destination";
coordinate: LatLng | null;
uniqueId: string;
};
type LocationState = {
userLocation: LatLng | null;
origin: LatLng | null;
destination: LatLng | null;
locationPoints: LocationPoint[];
currentStep: Mode;
setUserLocation: (val: LatLng) => void;
setLocation: (mode: Mode, val: LatLng | null) => void;
setLocationPoints: (val: LocationPoint[]) => void;
setStep: (step: Mode) => void;
reset: () => void;
};
const buildLocationPoints = (origin: LatLng | null, destination: LatLng | null): LocationPoint[] => {
const points: LocationPoint[] = [];
points.push({
id: "origin",
locationType: "origin",
coordinate: origin,
uniqueId: "0",
});
points.push({
id: "destination",
locationType: "destination",
coordinate: destination,
uniqueId: "1",
});
return points;
};
export const useLocationStore = create<LocationState>((set, get) => ({
userLocation: null,
origin: null,
destination: null,
locationPoints: [
{
id: "origin",
locationType: "origin",
coordinate: null,
uniqueId: "0",
},
{
id: "destination",
locationType: "destination",
coordinate: null,
uniqueId: "1",
},
],
currentStep: "destination",
setUserLocation: (val) => set({ userLocation: val }),
setLocation: (mode, val) =>
set((state) => {
const updated = { ...state, [mode]: val };
return {
...updated,
locationPoints: buildLocationPoints(updated.origin, updated.destination),
};
}),
setLocationPoints: (val) => {
// Create new points in reordered order, but reassign types/ids based on positions
const newPoints: LocationPoint[] = val.map((point, index, arr) => ({
uniqueId: point.uniqueId, // Preserve persistent ID
id: index === 0 ? "origin" : "destination",
locationType: index === 0 ? "origin" : "destination",
coordinate: point.coordinate,
}));
const origin = newPoints[0]?.coordinate ?? null;
const destination = newPoints.at(-1)?.coordinate ?? null;
set({
locationPoints: newPoints,
origin,
destination,
});
},
setStep: (step) => set({ currentStep: step }),
reset: () =>
set({
origin: null,
destination: null,
currentStep: "destination",
}),
}));