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};