1 | var __rest = (this && this.__rest) || function (s, e) {
|
2 | var t = {};
|
3 | for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
4 | t[p] = s[p];
|
5 | if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
6 | for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
7 | if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
8 | t[p[i]] = s[p[i]];
|
9 | }
|
10 | return t;
|
11 | };
|
12 | import React, { useEffect, useMemo } from 'react';
|
13 | import { useMutation, useQuery } from 'react-apollo';
|
14 | import useAuth from '../../components/AuthContext/useAuth';
|
15 | import { useThunkReducer } from '../useThunkReducer';
|
16 | import { loginAction, refreshAction } from './action-creators';
|
17 | import { normalizeServerList } from './list-transforms';
|
18 | import { init, reducer } from './product-list-reducer';
|
19 | export const ProductListContext = React.createContext(undefined);
|
20 |
|
21 | export const ProductListProvider = function ProductListProvider(_a) {
|
22 | var { queries, initialState = {} } = _a, rest = __rest(_a, ["queries", "initialState"]);
|
23 | const { loggedIn } = useAuth();
|
24 | const requestIdRef = React.useRef(null);
|
25 | const { data: serverList } = useQuery(queries.query, {
|
26 | variables: { id: null },
|
27 | skip: !loggedIn
|
28 | });
|
29 | const defaultInitialState = Object.assign({ loggedIn,
|
30 | requestIdRef, list: normalizeServerList(serverList) }, initialState);
|
31 | const [state, dispatch] = useThunkReducer(reducer, defaultInitialState, initialState => init(initialState));
|
32 | const usingLocalList = !state.loggedIn;
|
33 | usePersistLocalList({ list: state.list });
|
34 | useLocalStorageListener({ refresh });
|
35 | const [loginMutation] = useMutation(queries.login);
|
36 | function refresh() {
|
37 | dispatch(refreshAction());
|
38 | }
|
39 | useEffect(() => {
|
40 | if (loggedIn === state.loggedIn)
|
41 | return;
|
42 | loggedIn
|
43 | ? dispatch(loginAction({ loginMutation }))
|
44 | : dispatch({ type: 'LOGOUT' });
|
45 | }, [dispatch, loggedIn, loginMutation, state.loggedIn]);
|
46 | const value = useMemo(() => ({
|
47 | state,
|
48 | dispatch,
|
49 | queries,
|
50 | usingLocalList
|
51 | }), [dispatch, queries, state, usingLocalList]);
|
52 |
|
53 | return React.createElement(ProductListContext.Provider, Object.assign({ value: value }, rest));
|
54 | };
|
55 |
|
56 |
|
57 |
|
58 | function usePersistLocalList({ list }) {
|
59 | useEffect(() => {
|
60 | localStorage.setItem('productList', JSON.stringify(list));
|
61 | }, [list]);
|
62 | }
|
63 | function useLocalStorageListener({ refresh }) {
|
64 | useEffect(() => {
|
65 | const listener = (e) => {
|
66 | if (e.storageArea === localStorage && e.key === 'productList') {
|
67 | refresh();
|
68 | }
|
69 | };
|
70 | window.addEventListener('storage', listener);
|
71 | return () => {
|
72 | window.removeEventListener('storage', listener);
|
73 | };
|
74 | }, []);
|
75 | }
|
76 |
|
\ | No newline at end of file |