UNPKG

@atlaskit/app-provider

Version:

A top level provider for the Design System.

59 lines (58 loc) 1.9 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.useTheme = useTheme; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _react = require("react"); var _getGlobalTheme = require("@atlaskit/tokens/get-global-theme"); var _themeMutationObserver = require("@atlaskit/tokens/theme-mutation-observer"); var _theme = require("../context/theme"); /** * __useTheme()__ * * Returns the current theme settings for the nearest `ThemeProvider` in the * React tree. * * The returned object contains the named theme IDs for each slot: `light`, * `dark`, `spacing`, and `typography`. Use `useSetTheme` to change these * values at runtime. * * This hook can be used both inside and outside `AppProvider`. When used * inside a nested `ThemeProvider`, it reflects the theme of that sub-tree. * * @returns The current theme settings object. * * @example * ```tsx * function ThemeDisplay() { * const theme = useTheme(); * * return ( * <p> * Light theme: {theme.light}, Dark theme: {theme.dark} * </p> * ); * } * ``` */ function useTheme() { var theme = (0, _react.useContext)(_theme.ThemeContext); var _useState = (0, _react.useState)(theme || (0, _getGlobalTheme.getGlobalTheme)()), _useState2 = (0, _slicedToArray2.default)(_useState, 2), resolvedTheme = _useState2[0], setResolvedTheme = _useState2[1]; (0, _react.useEffect)(function () { // We are using theme from context so no need to reference the DOM if (theme) { return; } var observer = new _themeMutationObserver.ThemeMutationObserver(setResolvedTheme); observer.observe(); return function () { return observer.disconnect(); }; }, [theme]); return theme ? theme : resolvedTheme; }