frontend/hooks/useAddToEvents.ts (view raw)
1import {useCallback} from 'react';
2import {ProfileDocument, useUpdateMeMutation} from '../generated/graphql';
3import create from 'zustand';
4import {persist} from 'zustand/middleware';
5import {useSession} from 'next-auth/react';
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 session = useSession();
30 const isAuth = session.status === 'authenticated';
31 const eventsToBeAdded = store(s => s.eventsToBeAdded);
32 const addEvent = store(s => s.addEvent);
33 const clearStore = store(s => s.clear);
34
35 const saveStoredEvents = useCallback(() => {
36 if (eventsToBeAdded.length > 0) {
37 updateProfile({
38 variables: {
39 userUpdate: {
40 events: eventsToBeAdded,
41 },
42 },
43 refetchQueries: [ProfileDocument],
44 });
45 clearStore();
46 }
47 }, [eventsToBeAdded]);
48
49 const addToEvent = (eventId: string) => {
50 if (isAuth) {
51 updateProfile({
52 variables: {
53 userUpdate: {
54 events: [eventId],
55 },
56 },
57 refetchQueries: [ProfileDocument],
58 });
59 } else addEvent(eventId);
60 };
61
62 return {eventsToBeAdded, saveStoredEvents, addToEvent};
63};
64
65export default useAddToEvents;