@atlaskit/app-provider
Version:
A top level provider for the Design System.
58 lines (57 loc) • 1.78 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.useSetColorMode = useSetColorMode;
var _react = require("react");
var _setColorModeContext = require("../context/set-color-mode-context");
/**
* __useSetColorMode()__
*
* Returns a function that updates the color mode for the nearest `ThemeProvider`
* in the React tree.
*
* Call the returned setter with `'light'`, `'dark'`, or `'auto'` to change the
* active color mode. When set to `'auto'`, the color mode follows the system
* color scheme preference and `useColorMode()` returns the resolved value.
*
* This hook must be called from within a `ThemeProvider` (or `AppProvider`).
* It throws if no `ThemeProvider` is found in the tree.
*
* @returns A setter function that accepts a `ThemeColorModes` value.
*
* @example
* ```tsx
* function ColorModeToggle() {
* const colorMode = useColorMode();
* const setColorMode = useSetColorMode();
*
* return (
* <button onClick={() => setColorMode(colorMode === 'light' ? 'dark' : 'light')}>
* Toggle color mode
* </button>
* );
* }
* ```
*
* @example
* ```tsx
* // Invert the color mode relative to a parent ThemeProvider
* function InvertedPanel({ parentColorMode }: { parentColorMode: ThemeColorModes }) {
* const setColorMode = useSetColorMode();
*
* useEffect(() => {
* setColorMode(parentColorMode === 'light' ? 'dark' : 'light');
* }, [parentColorMode, setColorMode]);
*
* return <Box backgroundColor="elevation.surface">...</Box>;
* }
* ```
*/
function useSetColorMode() {
var value = (0, _react.useContext)(_setColorModeContext.SetColorModeContext);
if (!value) {
throw new Error('useSetColorMode must be used within ThemeProvider.');
}
return value;
}