eletrotupi / tcc/ commit / c5118b5

frontend: flesh a mood store

Pedro Lucas Porcellis porcellis@eletrotupi.com · 5 months ago c5118b5e1f0eb4951a6c9ecfef5b2684d274c101 Browse files
Parents b15446b
Changed files
1
Additions
+52
Deletions
0
/dev/null → frontend/stores/moodEntry.ts
1 +
import { create } from 'zustand';
2 +

3 +
export interface ActiveMoodComponent {
4 +
  i: string;         // matches MoodComponentDefinition.id
5 +
  intensity: number; // 1–10
6 +
}
7 +

8 +
interface MoodEntryState {
9 +
  // The mood selected in the main screen (e.g. 'good')
10 +
  selectedMood: string | null;
11 +

12 +
  // The active components the user has added + their intensities
13 +
  components: ActiveMoodComponent[];
14 +

15 +
  // Actions
16 +
  setSelectedMood: (mood: string) => void;
17 +
  setComponents: (components: ActiveMoodComponent[]) => void;
18 +
  addComponent: (id: string) => void;
19 +
  removeComponent: (id: string) => void;
20 +
  setComponentIntensity: (id: string, intensity: number) => void;
21 +
  reset: () => void;
22 +
}
23 +

24 +
export const useMoodEntryStore = create<MoodEntryState>((set) => ({
25 +
  selectedMood: null,
26 +
  components: [],
27 +

28 +
  setSelectedMood: (mood) => set({ selectedMood: mood }),
29 +

30 +
  // Used by the modal to write back the full list at once
31 +
  setComponents: (components) => set({ components }),
32 +

33 +
  addComponent: (id) =>
34 +
    set((state) => {
35 +
      if (state.components.find((c) => c.id === id)) return state;
36 +
      return { components: [...state.components, { id, intensity: 5 }] };
37 +
    }),
38 +

39 +
  removeComponent: (id) =>
40 +
    set((state) => ({
41 +
      components: state.components.filter((c) => c.id !== id),
42 +
    })),
43 +

44 +
  setComponentIntensity: (id, intensity) =>
45 +
    set((state) => ({
46 +
      components: state.components.map((c) =>
47 +
        c.id === id ? { ...c, intensity } : c
48 +
      ),
49 +
    })),
50 +

51 +
  reset: () => set({ selectedMood: null, components: [] }),
52 +
}));