forked from sync-for-science/discovery-mobile-ui
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathStateProvider.js
More file actions
59 lines (50 loc) · 1.45 KB
/
StateProvider.js
File metadata and controls
59 lines (50 loc) · 1.45 KB
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
import React, { useEffect } from 'react';
import { node } from 'prop-types';
import { useRecoilValue } from 'recoil';
import { Provider } from 'react-redux';
import { PersistGate } from 'redux-persist/integration/react';
import LoadingIndicator from './src/components/LoadingIndicator';
import createStore from './src/redux';
import { authenticationState } from './src/recoil';
import { actionTypes } from './src/redux/action-types';
let store;
let persistor;
export default function StateProvider({ children }) {
const authentication = useRecoilValue(authenticationState);
useEffect(() => {
const { patient: patientId } = authentication.authResult.additionalParameters;
const persistenceItems = createStore(patientId);
store = persistenceItems.store;
persistor = persistenceItems.persistor;
store.dispatch({
type: actionTypes.SET_AUTH,
payload: authentication,
});
return () => {
persistor.flush().then(() => {
persistor.pause();
store.dispatch({
type: actionTypes.CLEAR_PATIENT_DATA,
});
store = null;
persistor = null;
});
};
}, [authentication]);
if (!store) {
return <LoadingIndicator />;
}
return (
<Provider store={store}>
<PersistGate
loading={<LoadingIndicator />}
persistor={persistor}
>
{ children }
</PersistGate>
</Provider>
);
}
StateProvider.propTypes = {
children: node.isRequired,
};