all repos — caroster @ 71f58f6653388edb7455a935a96e099959eb5edd

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

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;