eletrotupi / tcc/ frontend/stores/careActionLink.tse11faebd227a1ab47246f3cf6d02d42cc42a6c8c
1.8 KB | 63 lines Raw
1
import { create } from 'zustand';
2

3
const TTL_MS = 30 * 60 * 1000;
4

5
interface State {
6
  pendingId: number | null;
7
  expiresAt: number | null;
8
  triggerLinked: boolean;
9
  moodLinked: boolean;
10
  setPending: (id: number) => void;
11
  linkTrigger: () => number | null;
12
  linkMood: () => number | null;
13
  clear: () => void;
14
}
15

16
const isExpired = (expiresAt: number | null) =>
17
  !expiresAt || Date.now() > expiresAt;
18

19
export const useCareActionLinkStore = create<State>((set, get) => ({
20
  pendingId: null,
21
  expiresAt: null,
22
  triggerLinked: false,
23
  moodLinked: false,
24

25
  setPending: (id) =>
26
    set({ pendingId: id, expiresAt: Date.now() + TTL_MS, triggerLinked: false, moodLinked: false }),
27

28
  linkTrigger: () => {
29
    const { pendingId, expiresAt, triggerLinked, moodLinked } = get();
30
    if (!pendingId || isExpired(expiresAt)) {
31
      set({ pendingId: null, expiresAt: null, triggerLinked: false, moodLinked: false });
32
      return null;
33
    }
34
    if (triggerLinked) return null;
35

36
    const newMoodLinked = moodLinked;
37
    if (newMoodLinked) {
38
      set({ pendingId: null, expiresAt: null, triggerLinked: false, moodLinked: false });
39
    } else {
40
      set({ triggerLinked: true });
41
    }
42
    return pendingId;
43
  },
44

45
  linkMood: () => {
46
    const { pendingId, expiresAt, triggerLinked, moodLinked } = get();
47
    if (!pendingId || isExpired(expiresAt)) {
48
      set({ pendingId: null, expiresAt: null, triggerLinked: false, moodLinked: false });
49
      return null;
50
    }
51
    if (moodLinked) return null;
52

53
    const newTriggerLinked = triggerLinked;
54
    if (newTriggerLinked) {
55
      set({ pendingId: null, expiresAt: null, triggerLinked: false, moodLinked: false });
56
    } else {
57
      set({ moodLinked: true });
58
    }
59
    return pendingId;
60
  },
61

62
  clear: () => set({ pendingId: null, expiresAt: null, triggerLinked: false, moodLinked: false }),
63
}));