mirror of
https://github.com/utopia-os/utopia-ui.git
synced 2025-12-13 07:46:10 +00:00
- 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`
53 lines
1.3 KiB
TypeScript
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
|
|
}
|