{"version":3,"file":"useThemeCache.cjs","names":["_react","require","_theme","ThemeCacheContext","exports","createContext","useThemeCache","odysseyTokens","shadowRootElement","existingCache","useContext","localCache","useMemo","Map","getOrCreateTheme","useCallback","mode","get","cached","theme","createOdysseyMuiTheme","contrastMode","set","themeCache"],"sources":["../../src/useThemeCache.ts"],"sourcesContent":["/*!\n * Copyright (c) 2024-present, Okta, Inc. and/or its affiliates. All rights reserved.\n * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the \"License.\")\n *\n * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *\n * See the License for the specific language governing permissions and limitations under the License.\n */\n\nimport { Theme } from \"@mui/material/styles\";\nimport { createContext, useCallback, useContext, useMemo } from \"react\";\n\nimport { createOdysseyMuiTheme, DesignTokens } from \"./theme/theme.js\";\nimport { ContrastMode } from \"./useContrastMode.js\";\n\nexport type ThemeCache = {\n  get: (contrastMode: ContrastMode) => Theme;\n  odysseyTokens: DesignTokens;\n  shadowRootElement: HTMLElement | undefined;\n};\n\nexport const ThemeCacheContext = createContext<ThemeCache | null>(null);\n\nexport const useThemeCache = ({\n  odysseyTokens,\n  shadowRootElement,\n}: {\n  odysseyTokens: DesignTokens;\n  shadowRootElement: HTMLElement | undefined;\n}) => {\n  const existingCache = useContext(ThemeCacheContext);\n\n  const localCache = useMemo(\n    () => new Map<ContrastMode, Theme>(),\n    // Reset the cache when tokens or shadow root change so stale Themes can't be returned for a different DesignTokens/shadowRootElement pair.\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    [odysseyTokens, shadowRootElement],\n  );\n\n  const getOrCreateTheme = useCallback(\n    (mode: ContrastMode) => {\n      if (\n        existingCache &&\n        existingCache.odysseyTokens === odysseyTokens &&\n        existingCache.shadowRootElement === shadowRootElement\n      ) {\n        return existingCache.get(mode);\n      }\n      const cached = localCache.get(mode);\n      if (cached) return cached;\n      const theme = createOdysseyMuiTheme({\n        contrastMode: mode,\n        odysseyTokens,\n        shadowRootElement,\n      });\n      localCache.set(mode, theme);\n      return theme;\n    },\n    [existingCache, localCache, odysseyTokens, shadowRootElement],\n  );\n\n  const themeCache = useMemo<ThemeCache>(\n    () => ({ get: getOrCreateTheme, odysseyTokens, shadowRootElement }),\n    [getOrCreateTheme, odysseyTokens, shadowRootElement],\n  );\n\n  return { getOrCreateTheme, themeCache };\n};\n"],"mappings":";;;;;;AAaA,IAAAA,MAAA,GAAAC,OAAA;AAEA,IAAAC,MAAA,GAAAD,OAAA;AAfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAcO,MAAME,iBAAiB,GAAAC,OAAA,CAAAD,iBAAA,GAAG,IAAAE,oBAAa,EAAoB,IAAI,CAAC;AAEhE,MAAMC,aAAa,GAAGA,CAAC;EAC5BC,aAAa;EACbC;AAIF,CAAC,KAAK;EACJ,MAAMC,aAAa,GAAG,IAAAC,iBAAU,EAACP,iBAAiB,CAAC;EAEnD,MAAMQ,UAAU,GAAG,IAAAC,cAAO,EACxB,MAAM,IAAIC,GAAG,CAAsB,CAAC,EAGpC,CAACN,aAAa,EAAEC,iBAAiB,CACnC,CAAC;EAED,MAAMM,gBAAgB,GAAG,IAAAC,kBAAW,EACjCC,IAAkB,IAAK;IACtB,IACEP,aAAa,IACbA,aAAa,CAACF,aAAa,KAAKA,aAAa,IAC7CE,aAAa,CAACD,iBAAiB,KAAKA,iBAAiB,EACrD;MACA,OAAOC,aAAa,CAACQ,GAAG,CAACD,IAAI,CAAC;IAChC;IACA,MAAME,MAAM,GAAGP,UAAU,CAACM,GAAG,CAACD,IAAI,CAAC;IACnC,IAAIE,MAAM,EAAE,OAAOA,MAAM;IACzB,MAAMC,KAAK,GAAG,IAAAC,4BAAqB,EAAC;MAClCC,YAAY,EAAEL,IAAI;MAClBT,aAAa;MACbC;IACF,CAAC,CAAC;IACFG,UAAU,CAACW,GAAG,CAACN,IAAI,EAAEG,KAAK,CAAC;IAC3B,OAAOA,KAAK;EACd,CAAC,EACD,CAACV,aAAa,EAAEE,UAAU,EAAEJ,aAAa,EAAEC,iBAAiB,CAC9D,CAAC;EAED,MAAMe,UAAU,GAAG,IAAAX,cAAO,EACxB,OAAO;IAAEK,GAAG,EAAEH,gBAAgB;IAAEP,aAAa;IAAEC;EAAkB,CAAC,CAAC,EACnE,CAACM,gBAAgB,EAAEP,aAAa,EAAEC,iBAAiB,CACrD,CAAC;EAED,OAAO;IAAEM,gBAAgB;IAAES;EAAW,CAAC;AACzC,CAAC;AAACnB,OAAA,CAAAE,aAAA,GAAAA,aAAA","ignoreList":[]}