PluginProbe
HubSpot All-In-One Marketing – Forms, Popups, Live Chat / 11.1.13
HubSpot All-In-One Marketing – Forms, Popups, Live Chat v11.1.13
11.3.75 11.3.73 11.3.71 11.3.70 11.3.69 11.3.64 11.3.65 11.3.62 11.3.61 11.3.56 11.3.58 11.0.31 11.0.52 11.0.54 11.0.56 11.0.58 11.0.7 11.1.10 11.1.11 11.1.13 11.1.14 11.1.15 11.1.2 11.1.20 11.1.21 All 73 releases
leadin / scripts / shared / Meeting / MeetingsContext.tsx

MeetingsContext.tsx in HubSpot All-In-One Marketing – Forms, Popups, Live Chat 11.1.13, at scripts/shared/Meeting/MeetingsContext.tsx

107 lines 2.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 import React, { useEffect, useState, useCallback } from 'react';
2 import useCurrentUserFetch from './hooks/useCurrentUserFetch';
3 import useMeetingsFetch from './hooks/useMeetingsFetch';
4 import LoadState from '../enums/loadState';
5
6 interface IMeetingsContextWrapperState {
7 loading: boolean;
8 error: any;
9 meetings: any[];
10 currentUser: any;
11 meetingUsers: any;
12 selectedMeeting: string;
13 }
14
15 interface IMeetingsContext extends IMeetingsContextWrapperState {
16 reload: Function;
17 }
18
19 interface IMeetingsContextWrapperProps {
20 url: string;
21 }
22
23 export const MeetingsContext = React.createContext<IMeetingsContext>({
24 loading: true,
25 error: null,
26 meetings: [],
27 currentUser: null,
28 meetingUsers: {},
29 selectedMeeting: '',
30 reload: () => {},
31 });
32
33 export default function MeetingsContextWrapper({
34 url,
35 children,
36 }: React.PropsWithChildren<IMeetingsContextWrapperProps>) {
37 const [state, setState] = useState<IMeetingsContextWrapperState>({
38 loading: true,
39 error: null,
40 meetings: [],
41 currentUser: null,
42 meetingUsers: {},
43 selectedMeeting: url,
44 });
45
46 const {
47 meetings,
48 meetingUsers,
49 loadMeetingsState,
50 error: errorMeeting,
51 reload: reloadMeetings,
52 } = useMeetingsFetch();
53
54 const {
55 user: currentUser,
56 loadUserState,
57 error: errorUser,
58 reload: reloadUser,
59 } = useCurrentUserFetch();
60
61 const reload = useCallback(() => {
62 reloadUser();
63 reloadMeetings();
64 }, [reloadUser, reloadMeetings]);
65
66 useEffect(() => {
67 if (
68 !state.loading &&
69 !state.error &&
70 state.currentUser &&
71 state.meetings.length === 0
72 ) {
73 reloadMeetings();
74 }
75 }, [state, reloadMeetings]);
76
77 useEffect(() => {
78 setState(previous => ({
79 ...previous,
80 loading:
81 loadUserState === LoadState.Loading ||
82 loadMeetingsState === LoadState.Loading,
83 currentUser,
84 meetings,
85 meetingUsers: meetingUsers.reduce((p, c) => ({ ...p, [c.id]: c }), {}),
86 error: errorMeeting || errorUser,
87 selectedMeeting: url,
88 }));
89 }, [
90 loadUserState,
91 loadMeetingsState,
92 currentUser,
93 meetings,
94 meetingUsers,
95 errorMeeting,
96 errorUser,
97 url,
98 setState,
99 ]);
100
101 return (
102 <MeetingsContext.Provider value={{ ...state, reload }}>
103 {children}
104 </MeetingsContext.Provider>
105 );
106 }
107