UNPKG

3.14 kBJavaScriptView Raw
1var __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};
12import React, { useEffect, useMemo } from 'react';
13import { useMutation, useQuery } from 'react-apollo';
14import useAuth from '../../components/AuthContext/useAuth';
15import { useThunkReducer } from '../useThunkReducer';
16import { loginAction, refreshAction } from './action-creators';
17import { normalizeServerList } from './list-transforms';
18import { init, reducer } from './product-list-reducer';
19export const ProductListContext = React.createContext(undefined);
20// TODO: Provider could take id in order to scope all CRUD to that list id
21export 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 // We spread props here so during testing we can override value
53 return React.createElement(ProductListContext.Provider, Object.assign({ value: value }, rest));
54};
55/**
56 * Persist local list to localStorage on every change
57 */
58function usePersistLocalList({ list }) {
59 useEffect(() => {
60 localStorage.setItem('productList', JSON.stringify(list));
61 }, [list]);
62}
63function 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//# sourceMappingURL=ProductListContext.js.map
\No newline at end of file