frontend/hooks/useAddToEvents.ts (view raw)
1import {useCallback} from 'react';
2import {useUpdateMeMutation} from '../generated/graphql';
3import useAuthStore from '../stores/useAuthStore';
4import create from 'zustand';
5import {persist} from 'zustand/middleware';
6
7type Store = {
8 eventsToBeAdded: string[];
9 addEvent: (eventId: string) => void;
10 clear: () => void;
11};
12
13const store = create<Store>(
14 persist(
15 (set, get) => ({
16 eventsToBeAdded: [],
17 addEvent: eventId =>
18 set({eventsToBeAdded: [...get().eventsToBeAdded, eventId]}),
19 clear: () => set({eventsToBeAdded: []}),
20 }),
21 {
22 name: 'add-events',
23 }
24 )
25);
26
27const useAddToEvents = () => {
28 const [updateProfile] = useUpdateMeMutation();
29 const isAuth = useAuthStore(s => !!s.token);
30 const eventsToBeAdded = store(s => s.eventsToBeAdded);
31 const addEvent = store(s => s.addEvent);
32 const clearStore = store(s => s.clear);
33
34 const saveStoredEvents = useCallback(() => {
35 if (eventsToBeAdded.length > 0) {
36 updateProfile({
37 variables: {
38 userUpdate: {
39 events: eventsToBeAdded,
40 },
41 },
42 });
43 clearStore();
44 }
45 }, [eventsToBeAdded]);
46
47 const addToEvent = (eventId: string) => {
48 if (isAuth) {
49 updateProfile({
50 variables: {
51 userUpdate: {
52 events: [eventId],
53 },
54 },
55 });
56 } else addEvent(eventId);
57 };
58
59 return {saveStoredEvents, addToEvent};
60};
61
62export default useAddToEvents;