all repos — caroster @ a9f557d6910e8d107ec5e96777feaf9790b7cc1e

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

app/src/contexts/Event.js (view raw)

 1import React, {
 2  createContext,
 3  useContext,
 4  useEffect,
 5  useMemo,
 6  useState,
 7} from 'react';
 8import {useStrapi} from 'strapi-react-context';
 9
10const EventContext = createContext();
11export default EventContext;
12export const useEvent = () => useContext(EventContext);
13
14export const EventProvider = ({match, children}) => {
15  const strapi = useStrapi();
16  const {eventId} = match.params;
17  const [isEditing, setIsEditing] = useState(false);
18  const [editingEvent, setEditingEvent] = useState({});
19
20  // Fetch event data if not already done
21  useEffect(() => {
22    if (!strapi.stores.events?.find(({id}) => eventId === id))
23      (async () => {
24        const fetchedEvent = await strapi.services.events.findOne(eventId);
25        setEditingEvent({
26          name: fetchedEvent.name,
27          date: fetchedEvent.date,
28          address: fetchedEvent.address,
29        });
30      })();
31  }, [eventId, strapi.stores.events, strapi.services.events]);
32
33  // Fetch event cars on load
34  useEffect(() => {
35    strapi.services.cars.find({event: eventId});
36  }, [eventId]); // eslint-disable-line react-hooks/exhaustive-deps
37
38  // Retrieve event data
39  const event = useMemo(
40    () => strapi.stores.events?.find(e => e.id === eventId),
41    [eventId, strapi.stores.events]
42  );
43
44  const updateEvent = async () => {
45    const result = await strapi.services.events.update(event.id, editingEvent);
46    setEditingEvent({});
47    return result;
48  };
49
50  return (
51    <EventContext.Provider
52      value={{
53        event,
54        isEditing,
55        setIsEditing,
56        editingEvent,
57        setEditingEvent,
58        updateEvent,
59      }}
60    >
61      {children}
62    </EventContext.Provider>
63  );
64};