/*!
 * Copyright (c) 2022-present, Okta, Inc. and/or its affiliates. All rights reserved.
 * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the "License.")
 *
 * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *
 * See the License for the specific language governing permissions and limitations under the License.
 */

import { createContext, memo, useContext, useMemo } from "react";
import { generateContrastColors } from "../createContrastColors.js";
import { useOdysseyDesignTokens } from "../OdysseyDesignTokensContext.js";
import { createMessageBus } from "../tools/createMessageBus.js";
import { jsx as _jsx } from "react/jsx-runtime";
export const defaultCloseSideNavMessageBus = createMessageBus();
export const defaultSubscribeToCloseRightSideMenu = () => () => {};
const UiShellContext = createContext(undefined);
export const useUiShellContext = () => {
  return useContext(UiShellContext);
};
const UiShellProvider = ({
  appBackgroundColor,
  appBackgroundContrastMode = "lowContrast",
  children,
  closeSideNavMenu,
  sideNavBackgroundColor,
  sideNavBackgroundContrastColor,
  subscribeToCloseRightSideMenu,
  subscribeToCloseSideNavMenu,
  topNavBackgroundColor
}) => {
  const odysseyDesignTokens = useOdysseyDesignTokens();
  const defaultedSideNavBackgroundColor = sideNavBackgroundColor || odysseyDesignTokens.HueNeutralWhite;
  const sideNavContrastColors = defaultedSideNavBackgroundColor !== odysseyDesignTokens.HueNeutralWhite ? generateContrastColors({
    backgroundColor: sideNavBackgroundColor || defaultedSideNavBackgroundColor,
    backgroundContrastColor: sideNavBackgroundContrastColor,
    odysseyDesignTokens
  }) : undefined;
  const isAppBackgroundHightContrast = appBackgroundContrastMode === "highContrast";
  const defaultTopAndAppBackgroundColor = isAppBackgroundHightContrast ? odysseyDesignTokens.HueNeutralWhite : odysseyDesignTokens.HueNeutral50;
  const topNavColor = topNavBackgroundColor || defaultTopAndAppBackgroundColor;
  const appContentBackgroundColor = appBackgroundColor || defaultTopAndAppBackgroundColor;
  const memoizedContextValue = useMemo(() => ({
    appBackgroundColor: appContentBackgroundColor,
    closeSideNavMenu: closeSideNavMenu ?? defaultCloseSideNavMessageBus.publish,
    sideNavBackgroundColor: sideNavBackgroundColor || odysseyDesignTokens.HueNeutralWhite,
    sideNavContrastColors,
    subscribeToCloseSideNavMenu: subscribeToCloseSideNavMenu ?? defaultCloseSideNavMessageBus.subscribe,
    subscribeToCloseRightSideMenu: subscribeToCloseRightSideMenu ?? defaultSubscribeToCloseRightSideMenu,
    topNavBackgroundColor: topNavColor
  }), [appContentBackgroundColor, odysseyDesignTokens.HueNeutralWhite, closeSideNavMenu, sideNavBackgroundColor, sideNavContrastColors, subscribeToCloseRightSideMenu, subscribeToCloseSideNavMenu, topNavColor]);
  return _jsx(UiShellContext.Provider, {
    value: memoizedContextValue,
    children: children
  });
};
const MemoizedUiShellProvider = memo(UiShellProvider);
export { MemoizedUiShellProvider as UiShellProvider };
//# sourceMappingURL=UiShellProvider.js.map