skolplattformen-backup/libs/hooks/src/provider.tsx

67 lines
1.4 KiB
TypeScript
Raw Normal View History

2021-02-06 20:22:34 +00:00
/* eslint-disable react/prop-types */
/* eslint-disable import/prefer-default-export */
2021-10-05 15:44:14 +00:00
import { Api } from '@skolplattformen/api-skolplattformen'
import React, { FC, PropsWithChildren, useEffect, useState } from 'react'
import { Provider } from 'react-redux'
import { ApiContext } from './context'
import store from './store'
2021-10-05 15:44:14 +00:00
import { AsyncStorage, IApiContext, Reporter } from './types'
2021-10-05 15:44:14 +00:00
type TApiProvider = FC<
PropsWithChildren<{
api: Api
storage: AsyncStorage
reporter?: Reporter
}>
>
const noopReporter: Reporter = {
2021-10-06 20:47:50 +00:00
log: () => {
// noop
},
error: () => {
// noop
},
}
export const ApiProvider: TApiProvider = ({
2021-10-05 15:44:14 +00:00
children,
api,
storage,
reporter = noopReporter,
}) => {
const [isLoggedIn, setIsLoggedIn] = useState(api.isLoggedIn)
const [isFake, setIsFake] = useState(api.isFake)
const value: IApiContext = {
api,
storage,
isLoggedIn,
isFake,
reporter,
}
useEffect(() => {
const handler = () => {
setIsLoggedIn(api.isLoggedIn)
setIsFake(api.isFake)
2021-02-08 19:13:50 +00:00
if (!api.isLoggedIn) {
store.dispatch({ type: 'CLEAR', entity: 'ALL' })
}
}
api.on('login', handler)
api.on('logout', handler)
return () => {
api.off('login', handler)
api.off('logout', handler)
}
}, [api.isLoggedIn, api.isFake])
return (
<ApiContext.Provider value={value}>
2021-10-05 15:44:14 +00:00
<Provider store={store}>{children}</Provider>
</ApiContext.Provider>
)
}