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 strapi.services.events.findOne(eventId);
24 }, [eventId, strapi.stores.events, strapi.services.events]);
25
26 // Fetch event cars on load
27 useEffect(() => {
28 strapi.services.cars.find({ event: eventId });
29 }, [eventId]); // eslint-disable-line react-hooks/exhaustive-deps
30
31 // Retrieve event data
32 const event = useMemo(
33 () => strapi.stores.events?.find((e) => e.id === eventId),
34 [eventId, strapi.stores.events]
35 );
36
37 const updateEvent = async () => {
38 const result = await strapi.services.events.update(event.id, editingEvent);
39 setEditingEvent({});
40 return result;
41 };
42
43 return (
44 <EventContext.Provider
45 value={{
46 event,
47 isEditing,
48 setIsEditing,
49 editingEvent,
50 setEditingEvent,
51 updateEvent,
52 }}
53 >
54 {children}
55 </EventContext.Provider>
56 );
57};