Skip to content

Commit 60d4705

Browse files
authored
Merge pull request #8 from qoretechnologies/bugfix/wait-for-storage-flag
New init function, wait for storage flag
2 parents 7f90697 + 9b29b23 commit 60d4705

File tree

8 files changed

+45
-49
lines changed

8 files changed

+45
-49
lines changed

.storybook/preview.tsx

+11-7
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { ReqoreContent, ReqoreLayoutContent, ReqoreUIProvider } from '@qoretechnologies/reqore';
2-
import { ReqraftProvider } from '../src';
2+
import { initializeReqraft } from '../src';
33

44
export const parameters = {
55
actions: { argTypesRegex: '^on[A-Z].*' },
@@ -39,7 +39,13 @@ export const argTypes = {
3939
};
4040

4141
export const decorators = [
42-
(Story, context) => (
42+
(Story, context) => {
43+
const Reqraft = initializeReqraft({
44+
instance: 'https://hq.qoretechnologies.com:8092/',
45+
instanceToken: process.env.REACT_APP_QORUS_TOKEN,
46+
});
47+
48+
return (
4349
<ReqoreUIProvider
4450
options={{
4551
animations: {
@@ -49,17 +55,15 @@ export const decorators = [
4955
...context.args?.reqoreOptions,
5056
}}
5157
>
52-
<ReqraftProvider
58+
<Reqraft
5359
appName='storybook'
54-
instanceToken={process.env.REACT_APP_QORUS_TOKEN}
55-
instance='https://hq.qoretechnologies.com:8092/'
5660
>
5761
<ReqoreLayoutContent style={{ height: '100%' }}>
5862
<ReqoreContent style={{ padding: '20px', display: 'flex', flexFlow: 'column' }}>
5963
<Story />
6064
</ReqoreContent>
6165
</ReqoreLayoutContent>
62-
</ReqraftProvider>
66+
</Reqraft>
6367
</ReqoreUIProvider>
64-
),
68+
)},
6569
];

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@qoretechnologies/reqraft",
3-
"version": "0.2.3",
3+
"version": "0.2.4",
44
"description": "ReQraft is a collection of React components and hooks that are used across Qore Technologies' products made using the ReQore component library from Qore.",
55
"main": "dist/index.js",
66
"types": "dist/index.d.ts",

src/contexts/ReqraftContext.tsx

-7
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,9 @@
11
import { createContext } from 'use-context-selector';
2-
import { IReqraftFetchConfig } from '../utils/fetch';
32

43
export interface IReqraftContext {
54
appName: string;
6-
instance?: string;
7-
instanceToken: string;
8-
instanceUnauthorizedRedirect?: IReqraftFetchConfig['unauthorizedRedirect'];
95
}
106

117
export const ReqraftContext = createContext<IReqraftContext>({
128
appName: '',
13-
instance: '',
14-
instanceToken: '',
15-
instanceUnauthorizedRedirect: undefined,
169
});

src/index.tsx

+3-2
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,11 @@ export {
33
IReqraftMenuProps,
44
ReqraftMenu,
55
TReqraftMenu,
6-
TReqraftMenuItem,
6+
TReqraftMenuItem
77
} from './components/menu/Menu';
88

99
export { FormStringField, IStringFormFieldProps } from './components/form/fields/string/String';
1010
export { IReqraftUseFetch, useFetch } from './hooks/useFetch/useFetch';
11-
export { ReqraftProvider, ReqraftQueryClient } from './providers/ReqraftProvider';
11+
export { ReqraftProvider, ReqraftQueryClient, initializeReqraft } from './providers/ReqraftProvider';
1212
export { query } from './utils/fetch';
13+

src/providers/FetchProvider.tsx

+1-23
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,13 @@
11
import { useQueryClient } from '@tanstack/react-query';
2-
import { useState } from 'react';
3-
import { useEffectOnce } from 'react-use';
42
import { FetchContext, TReqraftContextQueryConfig } from '../contexts/FetchContext';
5-
import { useReqraftProperty } from '../hooks/useReqraftProperty';
6-
import { query, setupFetch } from '../utils/fetch';
3+
import { query } from '../utils/fetch';
74

85
export interface IReqraftFetchProviderProps {
96
children: React.ReactNode;
107
}
118

129
export const ReqraftFetchProvider = ({ children }: IReqraftFetchProviderProps) => {
1310
const queryClient = useQueryClient();
14-
const instance = useReqraftProperty('instance');
15-
const instanceToken = useReqraftProperty('instanceToken');
16-
const instanceUnauthorizedRedirect = useReqraftProperty('instanceUnauthorizedRedirect');
17-
18-
const [ready, setReady] = useState(false);
19-
20-
useEffectOnce(() => {
21-
setupFetch({
22-
instance,
23-
instanceToken,
24-
unauthorizedRedirect: instanceUnauthorizedRedirect,
25-
});
26-
27-
setReady(true);
28-
});
29-
30-
if (!ready) {
31-
return null;
32-
}
3311

3412
async function get<T>(config: TReqraftContextQueryConfig) {
3513
return query<T>({ queryClient, ...config, method: 'GET' });

src/providers/ReqraftProvider.tsx

+24-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
22
import { ReactNode } from 'react';
33
import { IReqraftContext, ReqraftContext } from '../contexts/ReqraftContext';
4+
import { IReqraftFetchConfig, setupFetch } from '../utils/fetch';
45
import { ReqraftFetchProvider } from './FetchProvider';
56
import { ReqraftStorageProvider } from './StorageProvider';
67

@@ -9,23 +10,41 @@ export const ReqraftQueryClient = new QueryClient();
910
export interface IReqraftProviderProps extends IReqraftContext {
1011
children: ReactNode;
1112
reactQueryClient?: QueryClient;
13+
/*
14+
* If true, the component will wait for the storage to be loaded before rendering the children.
15+
*/
16+
waitForStorage?: boolean;
1217
}
1318

19+
export interface IReqraftOptions {
20+
instance?: string;
21+
instanceToken: string;
22+
instanceUnauthorizedRedirect?: IReqraftFetchConfig['unauthorizedRedirect'];
23+
}
24+
25+
export const initializeReqraft = (options: IReqraftOptions ) => {
26+
setupFetch({
27+
instance: options.instance,
28+
instanceToken: options.instanceToken,
29+
unauthorizedRedirect: options.instanceUnauthorizedRedirect,
30+
});
31+
32+
return ReqraftProvider;
33+
};
34+
1435
export const ReqraftProvider = ({
1536
appName,
1637
children,
17-
instance,
18-
instanceToken,
19-
instanceUnauthorizedRedirect,
2038
reactQueryClient,
39+
waitForStorage = true,
2140
}: IReqraftProviderProps) => {
2241
return (
2342
<ReqraftContext.Provider
24-
value={{ appName, instanceToken, instance, instanceUnauthorizedRedirect }}
43+
value={{ appName }}
2544
>
2645
<QueryClientProvider client={reactQueryClient || ReqraftQueryClient}>
2746
<ReqraftFetchProvider>
28-
<ReqraftStorageProvider>{children}</ReqraftStorageProvider>
47+
<ReqraftStorageProvider waitForStorage={waitForStorage}>{children}</ReqraftStorageProvider>
2948
</ReqraftFetchProvider>
3049
</QueryClientProvider>
3150
</ReqraftContext.Provider>

src/providers/StorageProvider.tsx

+4-3
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,13 @@ import { ReqraftStorageContext, TReqraftStorage } from '../contexts/StorageConte
55
import { useFetch } from '../hooks/useFetch/useFetch';
66
import { useReqraftProperty } from '../hooks/useReqraftProperty';
77
import { TReqraftStorageValue } from '../hooks/useStorage/useStorage';
8+
import { IReqraftProviderProps } from './ReqraftProvider';
89

9-
export interface IReqraftStorageProviderProps {
10+
export interface IReqraftStorageProviderProps extends Pick<IReqraftProviderProps, 'waitForStorage'> {
1011
children: ReactNode;
1112
}
1213

13-
export const ReqraftStorageProvider = ({ children }: IReqraftStorageProviderProps) => {
14+
export const ReqraftStorageProvider = ({ children, waitForStorage }: IReqraftStorageProviderProps) => {
1415
const appName = useReqraftProperty('appName');
1516

1617
const { data, loading } = useFetch({
@@ -66,7 +67,7 @@ export const ReqraftStorageProvider = ({ children }: IReqraftStorageProviderProp
6667
load({ body: { storage_path: _path } });
6768
};
6869

69-
if (loading || !storage) {
70+
if ((loading || !storage) && waitForStorage) {
7071
return null;
7172
}
7273

src/utils/fetch.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ export interface IReqraftFetchResponse<T> {
1414
error?: any;
1515
}
1616

17-
const fetchConfig: IReqraftFetchConfig = {
17+
export const fetchConfig: IReqraftFetchConfig = {
1818
instance: window.location.origin + '/',
1919
instanceToken: '',
2020
unauthorizedRedirect: (pathname: string) => `/?next=${pathname}`,

0 commit comments

Comments
 (0)