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