Ulf Gebhardt 3872a052b6
separated types, eslint rule for importing types
- Separated types and moved them into the proper ./types folder defined
in the tsconfig.json.
- Defined a new folder alias `#types`.
- New eslint rule to enforce `import type` when a type is imported.
- Removed Geometry Class and used manual Point types from `geojson`
2024-11-24 04:11:32 +01:00

53 lines
1.3 KiB
TypeScript

/* eslint-disable react/prop-types */
/* eslint-disable @typescript-eslint/no-empty-function */
import { useCallback, useState, createContext, useContext } from 'react'
import type { AssetsApi } from '#types/AssetsApi'
interface AppState {
assetsApi: AssetsApi
userType: string
}
type UseAppManagerResult = ReturnType<typeof useAppManager>
const initialAppState: AppState = {
assetsApi: {} as AssetsApi,
userType: '',
}
const AppContext = createContext<UseAppManagerResult>({
state: initialAppState,
setAppState: () => {},
})
function useAppManager(): {
state: AppState
setAppState: (newState: Partial<AppState>) => void
} {
const [state, setState] = useState<AppState>(initialAppState)
const setAppState = useCallback((newState: Partial<AppState>) => {
setState((prevState) => ({
...prevState,
...newState,
}))
}, [])
return { state, setAppState }
}
export const AppStateProvider: React.FunctionComponent<{
children?: React.ReactNode
}> = ({ children }) => <AppContext.Provider value={useAppManager()}>{children}</AppContext.Provider>
export const useAppState = (): AppState => {
const { state } = useContext(AppContext)
return state
}
export const useSetAppState = (): UseAppManagerResult['setAppState'] => {
const { setAppState } = useContext(AppContext)
return setAppState
}