eletrotupi / tcc / frontend/stores/moodEntry.ts master
1.5 KB Raw
import { create } from 'zustand';

export interface ActiveMoodComponent {
  id: string;         // matches MoodComponentDefinition.id
  intensity: number; // 1–3
}

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

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

  // Actions
  setSelectedMood: (mood: string) => void;
  setComponents: (components: ActiveMoodComponent[]) => void;
  addComponent: (id: string) => void;
  removeComponent: (id: string) => void;
  setComponentIntensity: (id: string, intensity: number) => void;
  reset: () => void;
}

export const useMoodEntryStore = create<MoodEntryState>((set) => ({
  selectedMood: null,
  components: [],

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

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

  addComponent: (id) =>
    set((state) => {
      if (state.components.find((c) => c.id === id)) return state;
      return { components: [...state.components, { id, intensity: 1 }] };
    }),

  removeComponent: (id) =>
    set((state) => ({
      components: state.components.filter((c) => c.id !== id),
    })),

  setComponentIntensity: (id, intensity) =>
    set((state) => ({
      components: state.components.map((c) =>
        c.id === id ? { ...c, intensity } : c
      ),
    })),

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