all repos — caroster @ 5a283984fb3e693cc263e12974b8629d0a8a25ac

[Octree] Group carpool to your event https://caroster.io

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;