{"version":3,"file":"components/Layout/index.mjs","sources":["../../../src/components/Layout/index.tsx"],"sourcesContent":["import {\n  PropsWithChildren,\n  useContext,\n  useEffect,\n  useLayoutEffect,\n  useState,\n} from 'react';\nimport { FloatButton, Layout as L } from 'antd';\nimport { Language, MAIN_BG, Size } from '../../constants';\nimport { Header } from './header';\nimport {\n  useLocale,\n  useI18n,\n  getFirstVisitFromStorage,\n  setFirstVisitToStorage,\n  getLanguage,\n  useUrlQuery,\n  getEnableRoutesFromUrlQuery,\n  useThemeToken,\n  useTheme,\n} from '../../utils';\nimport { Progress } from './progress';\nimport { ConfigContext } from '../../config';\nimport { SDK } from '@rsdoctor/types';\nimport { ServerAPIProvider } from '../Manifest';\nimport { ProjectInfoContext } from './project-info-context';\nimport styles from './index.module.scss';\n\nexport interface LayoutProps {\n  children: React.JSX.Element;\n}\n\nconst TitleUpdater: React.FC<{\n  name?: string;\n}> = ({ name }) => {\n  useEffect(() => {\n    if (name) {\n      document.title = `Rsdoctor - ${name}`;\n    } else {\n      document.title = 'Rsdoctor';\n    }\n  }, [name]);\n\n  return null;\n};\n\nexport const Layout = (\n  props: PropsWithChildren<LayoutProps>,\n): React.JSX.Element => {\n  const { isLight } = useTheme();\n  const themeToken = useThemeToken();\n  const locale = useLocale();\n  const { i18n } = useI18n();\n  const { children } = props;\n  const query = useUrlQuery();\n  const [enableRoutes, setEnableRoutes] = useState<string[] | undefined>(\n    () => getEnableRoutesFromUrlQuery() || undefined,\n  );\n\n  useEffect(() => {\n    let currentLocale = locale;\n    // Check if the user is visiting the site for the first time\n    const visited = getFirstVisitFromStorage();\n    if (!visited) {\n      setFirstVisitToStorage('1');\n      const targetLang = window.navigator.language.split('-')[0];\n      const userLang = getLanguage(targetLang);\n\n      if (Object.values(Language).includes(userLang)) {\n        currentLocale = userLang;\n      }\n    }\n\n    if (i18n.language !== currentLocale) {\n      i18n.changeLanguage(currentLocale);\n    }\n  }, [locale]);\n\n  // Listen for enableRoutes changes in URL query parameters\n  useEffect(() => {\n    const newEnableRoutes = getEnableRoutesFromUrlQuery();\n    setEnableRoutes(newEnableRoutes || undefined);\n  }, [query]);\n\n  const ctx = useContext(ConfigContext);\n  const showHeader = !ctx.embedded;\n\n  useLayoutEffect(() => {\n    const $root = document.documentElement;\n    const globalCssVars = {\n      '--spacing-base': Size.BasePadding + 'px',\n      '--layout-nav-height': showHeader ? Size.NavBarHeight + 'px' : '0px',\n      '--color-bg-main': isLight ? MAIN_BG : themeToken.colorBgLayout,\n      '--color-bg-box': themeToken.colorBgContainer,\n      '--color-bg-box-elevated': isLight\n        ? themeToken.colorBgLayout\n        : themeToken.colorBgElevated,\n      '--color-bg-box-subtle': isLight\n        ? themeToken.colorBgContainer\n        : '#0d1218',\n      '--color-border': themeToken.colorBorder,\n      '--color-border-secondary': themeToken.colorBorderSecondary,\n      '--color-divider': themeToken.colorBorder,\n      '--color-scrollbar': isLight\n        ? 'rgba(0, 0, 0, 0.5)'\n        : 'rgba(255,255,255, 0.5)',\n      '--text-color': themeToken.colorText,\n      '--text-color-secondary': themeToken.colorTextSecondary,\n      '--text-color-muted': themeToken.colorTextTertiary,\n      '--color-accent-subtle': isLight ? '#e6f4ff' : 'rgba(47, 129, 247, 0.12)',\n      '--color-data-bundled': '#5b8ff9',\n      '--color-data-source': '#43c6d9',\n      '--color-data-gzip': '#f2b84b',\n      '--color-data-initial': '#43c6d9',\n      '--border-radius': themeToken.borderRadius + 'px',\n      '--border-radius-lg': themeToken.borderRadiusLG + 'px',\n    };\n    for (const [name, value] of Object.entries(globalCssVars)) {\n      $root.style.setProperty(name, value);\n    }\n  }, [showHeader, themeToken, isLight]);\n\n  return (\n    <ServerAPIProvider\n      api={SDK.ServerAPI.API.GetProjectInfo}\n      showSkeleton={false}\n    >\n      {(project) => (\n        <ProjectInfoContext.Provider value={{ project }}>\n          <L>\n            <TitleUpdater name={project?.name} />\n            {showHeader && <Header enableRoutes={enableRoutes} />}\n            <Progress />\n            <L.Content className={styles.content}>\n              {children}\n              <FloatButton.BackTop />\n            </L.Content>\n          </L>\n        </ProjectInfoContext.Provider>\n      )}\n    </ServerAPIProvider>\n  );\n};\n"],"names":["TitleUpdater","name","useEffect","document","Layout","props","isLight","useTheme","themeToken","useThemeToken","locale","useLocale","i18n","useI18n","children","query","useUrlQuery","enableRoutes","setEnableRoutes","useState","getEnableRoutesFromUrlQuery","undefined","currentLocale","visited","getFirstVisitFromStorage","setFirstVisitToStorage","targetLang","window","userLang","getLanguage","Object","Language","newEnableRoutes","ctx","useContext","ConfigContext","showHeader","useLayoutEffect","$root","globalCssVars","Size","MAIN_BG","value","ServerAPIProvider","SDK","project","ProjectInfoContext","L","Header","Progress","styles","FloatButton"],"mappings":";;;;;;;;;;;;AAgCA,MAAMA,eAED,CAAC,EAAEC,IAAI,EAAE;IACZC,UAAU;QACR,IAAID,MACFE,SAAS,KAAK,GAAG,CAAC,WAAW,EAAEF,MAAM;aAErCE,SAAS,KAAK,GAAG;IAErB,GAAG;QAACF;KAAK;IAET,OAAO;AACT;AAEO,MAAMG,gBAAS,CACpBC;IAEA,MAAM,EAAEC,OAAO,EAAE,GAAGC;IACpB,MAAMC,aAAaC;IACnB,MAAMC,SAASC;IACf,MAAM,EAAEC,IAAI,EAAE,GAAGC;IACjB,MAAM,EAAEC,QAAQ,EAAE,GAAGT;IACrB,MAAMU,QAAQC;IACd,MAAM,CAACC,cAAcC,gBAAgB,GAAGC,SACtC,IAAMC,iCAAiCC;IAGzCnB,UAAU;QACR,IAAIoB,gBAAgBZ;QAEpB,MAAMa,UAAUC;QAChB,IAAI,CAACD,SAAS;YACZE,uBAAuB;YACvB,MAAMC,aAAaC,OAAO,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;YAC1D,MAAMC,WAAWC,YAAYH;YAE7B,IAAII,OAAO,MAAM,CAACC,UAAU,QAAQ,CAACH,WACnCN,gBAAgBM;QAEpB;QAEA,IAAIhB,KAAK,QAAQ,KAAKU,eACpBV,KAAK,cAAc,CAACU;IAExB,GAAG;QAACZ;KAAO;IAGXR,UAAU;QACR,MAAM8B,kBAAkBZ;QACxBF,gBAAgBc,mBAAmBX;IACrC,GAAG;QAACN;KAAM;IAEV,MAAMkB,MAAMC,WAAWC;IACvB,MAAMC,aAAa,CAACH,IAAI,QAAQ;IAEhCI,gBAAgB;QACd,MAAMC,QAAQnC,SAAS,eAAe;QACtC,MAAMoC,gBAAgB;YACpB,kBAAkBC,KAAK,WAAW,GAAG;YACrC,uBAAuBJ,aAAaI,KAAK,YAAY,GAAG,OAAO;YAC/D,mBAAmBlC,UAAUmC,UAAUjC,WAAW,aAAa;YAC/D,kBAAkBA,WAAW,gBAAgB;YAC7C,2BAA2BF,UACvBE,WAAW,aAAa,GACxBA,WAAW,eAAe;YAC9B,yBAAyBF,UACrBE,WAAW,gBAAgB,GAC3B;YACJ,kBAAkBA,WAAW,WAAW;YACxC,4BAA4BA,WAAW,oBAAoB;YAC3D,mBAAmBA,WAAW,WAAW;YACzC,qBAAqBF,UACjB,uBACA;YACJ,gBAAgBE,WAAW,SAAS;YACpC,0BAA0BA,WAAW,kBAAkB;YACvD,sBAAsBA,WAAW,iBAAiB;YAClD,yBAAyBF,UAAU,YAAY;YAC/C,wBAAwB;YACxB,uBAAuB;YACvB,qBAAqB;YACrB,wBAAwB;YACxB,mBAAmBE,WAAW,YAAY,GAAG;YAC7C,sBAAsBA,WAAW,cAAc,GAAG;QACpD;QACA,KAAK,MAAM,CAACP,MAAMyC,MAAM,IAAIZ,OAAO,OAAO,CAACS,eACzCD,MAAM,KAAK,CAAC,WAAW,CAACrC,MAAMyC;IAElC,GAAG;QAACN;QAAY5B;QAAYF;KAAQ;IAEpC,OAAO,WAAP,GACE,IAACqC,mBAAiBA;QAChB,KAAKC,IAAI,SAAS,CAAC,GAAG,CAAC,cAAc;QACrC,cAAc;kBAEb,CAACC,UAAAA,WAAAA,GACA,IAACC,mBAAmB,QAAQ;gBAAC,OAAO;oBAAED;gBAAQ;0BAC5C,mBAACE,QAACA;;sCACA,IAAC/C,cAAYA;4BAAC,MAAM6C,SAAS;;wBAC5BT,cAAc,WAAdA,GAAc,IAACY,QAAMA;4BAAC,cAAc/B;;sCACrC,IAACgC,UAAQA,CAAAA;sCACT,KAACF,OAAAA,OAAS;4BAAC,WAAWG,aAAAA,OAAc;;gCACjCpC;8CACD,IAACqC,YAAY,OAAO;;;;;;;AAOlC"}