1
0
mirror of https://github.com/checktheroads/hyperglass synced 2024-05-11 05:55:08 +00:00
Files
checktheroads-hyperglass/hyperglass/ui/context/HyperglassProvider.tsx

63 lines
1.8 KiB
TypeScript
Raw Normal View History

import { createContext, useContext, useMemo } from 'react';
import {
useToken,
ChakraProvider,
useColorModeValue,
useBreakpointValue,
useTheme as useChakraTheme,
} from '@chakra-ui/react';
import { QueryClient, QueryClientProvider } from 'react-query';
import { makeTheme, defaultTheme } from '~/util';
import type { IConfig, Theme } from '~/types';
import type { THyperglassProvider } from './types';
const HyperglassContext = createContext<IConfig>(Object());
const queryClient = new QueryClient();
export const HyperglassProvider = (props: THyperglassProvider) => {
const { config, children } = props;
const value = useMemo(() => config, []);
const userTheme = value && makeTheme(value.web.theme);
const theme = value ? userTheme : defaultTheme;
return (
<ChakraProvider theme={theme}>
<HyperglassContext.Provider value={value}>
<QueryClientProvider client={queryClient}>{children}</QueryClientProvider>
</HyperglassContext.Provider>
</ChakraProvider>
);
};
2020-12-31 23:09:54 -07:00
/**
* Get the current configuration.
*/
export const useConfig = (): IConfig => useContext(HyperglassContext);
2020-12-31 23:09:54 -07:00
/**
* Get the current theme object.
*/
export const useTheme = (): Theme.Full => useChakraTheme();
2020-12-31 23:09:54 -07:00
/**
* Determine if device is mobile or desktop based on Chakra UI theme breakpoints.
*/
export const useMobile = (): boolean =>
2020-12-31 23:09:54 -07:00
useBreakpointValue<boolean>({ base: true, md: true, lg: false, xl: false }) ?? true;
2020-12-31 23:09:54 -07:00
/**
* Convenience function to combine Chakra UI's useToken & useColorModeValue.
*/
export const useColorToken = <L extends string, D extends string>(
token: keyof Theme.Full,
light: L,
dark: D,
): L | D => useColorModeValue(useToken(token, light), useToken(token, dark));
export {
useColorMode,
useBreakpointValue,
useColorModeValue as useColorValue,
} from '@chakra-ui/react';