-
Notifications
You must be signed in to change notification settings - Fork 17
/
spoke-context.tsx
61 lines (50 loc) · 1.62 KB
/
spoke-context.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import type { OrganizationSettingsInfoFragment } from "@spoke/spoke-codegen";
import { useGetOrganizationSettingsQuery } from "@spoke/spoke-codegen";
import React, { useContext, useMemo, useState } from "react";
export interface InstanceSettings {
BASE_URL: string;
AUTH0_DOMAIN?: string;
AUTH0_CLIENT_ID?: string;
RENDERED_CLASS_NAMES?: string[];
}
export interface SpokeContextType {
settings?: InstanceSettings;
orgSettings?: OrganizationSettingsInfoFragment;
setOrganizationId: (organizationId?: string) => void;
}
export const SpokeContext = React.createContext<SpokeContextType>({
setOrganizationId: () => {}
});
export const SpokeContextProvider: React.FC = (props) => {
const [organizationId, setOrganizationId] = useState<string | undefined>(
undefined
);
const { data } = useGetOrganizationSettingsQuery({
variables: { organizationId: organizationId! },
skip: organizationId === undefined,
errorPolicy: "ignore"
});
const value = useMemo(
() => ({
orgSettings: data?.organization?.settings,
setOrganizationId
}),
[data?.organization?.settings, setOrganizationId]
);
return (
<SpokeContext.Provider value={value}>
{props.children}
</SpokeContext.Provider>
);
};
export const useSpokeContext = () => useContext(SpokeContext);
export const withSpokeContext = <P,>(
Component: React.ComponentType<P & SpokeContextType>
) => {
const ComponentWithSpokeContext: React.FC<P> = (props) => {
const context = useSpokeContext();
return <Component {...props} {...context} />;
};
return ComponentWithSpokeContext;
};
export default SpokeContext;