summaryrefslogtreecommitdiff
path: root/src/lib/maps/stores/useMaps.js
blob: b02c2ae38028dd36a23b13b1acfd921ff1fa3af7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import { create } from "zustand";

const DEFAULT_CENTER = { lat: -6.2, lng: 106.816666 };

export const useMaps = create((set, get) => ({
  // ==== STATE ====
  selectedPosition: null,
  addressMaps: '',
  detailAddress: {},
  pinedMaps: false,

  // posisi sementara (create/edit)
  tempPositionCreate: null,
  tempPositionEdit: null,

  // ==== SETTERS ====
  setSelectedPosition: (position) => set({ selectedPosition: position }),
  setAddressMaps: (addressMaps) => set({ addressMaps }),
  setDetailAddress: (detailAddress) => set({ detailAddress }),
  setPinedMaps: (pinedMaps) => set({ pinedMaps }),

  setTempPositionCreate: (position) => set({ tempPositionCreate: position }),
  setTempPositionEdit: (position) => set({ tempPositionEdit: position }),

  resetTempPositionCreate: () => set({ tempPositionCreate: null }),
  resetTempPositionEdit: () => set({ tempPositionEdit: null }),

  getDefaultCenter: () => DEFAULT_CENTER,

  isPinned: () => {
    const p = get().selectedPosition;
    if (!p) return false;

    // parse string -> number
    const lat = parseFloat(p.lat);
    const lng = parseFloat(p.lng);

    // cek kalau bukan angka valid
    if (isNaN(lat) || isNaN(lng)) return false;

    // cek apakah sama dengan default
    const isDefault =
      Math.abs(lat - DEFAULT_CENTER.lat) < 1e-6 &&
      Math.abs(lng - DEFAULT_CENTER.lng) < 1e-6;

    return !isDefault;
  },

  resetPin: () => set({
    selectedPosition: null,
    addressMaps: '',
    detailAddress: {},
    pinedMaps: false,
    tempPositionCreate: null,
    tempPositionEdit: null,
  }),
}));