@verdaccio/ui-components 5.0.0-next-9.19 → 5.0.0-next-9.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (312) hide show
  1. package/build/api/use-data-mutation.js +1 -4
  2. package/build/api/use-data-mutation.js.map +1 -1
  3. package/build/api/use-data-mutation.mjs +1 -4
  4. package/build/api/use-data-mutation.mjs.map +1 -1
  5. package/build/api/use-data.d.ts +1 -0
  6. package/build/api/use-data.js +3 -2
  7. package/build/api/use-data.js.map +1 -1
  8. package/build/api/use-data.mjs +3 -3
  9. package/build/api/use-data.mjs.map +1 -1
  10. package/build/components/ActionBar/ActionBar.js +4 -2
  11. package/build/components/ActionBar/ActionBar.js.map +1 -1
  12. package/build/components/ActionBar/ActionBar.mjs +4 -2
  13. package/build/components/ActionBar/ActionBar.mjs.map +1 -1
  14. package/build/components/ActionBar/ActionBarAction.js +1 -1
  15. package/build/components/ActionBar/ActionBarAction.mjs +1 -1
  16. package/build/components/AppRoute/AppRoute.js +13 -0
  17. package/build/components/AppRoute/AppRoute.js.map +1 -1
  18. package/build/components/AppRoute/AppRoute.mjs +13 -0
  19. package/build/components/AppRoute/AppRoute.mjs.map +1 -1
  20. package/build/components/Author/Author.js +1 -1
  21. package/build/components/Author/Author.mjs +1 -1
  22. package/build/components/CopyClipboard/CopyToClipBoard.js +5 -0
  23. package/build/components/CopyClipboard/CopyToClipBoard.js.map +1 -1
  24. package/build/components/CopyClipboard/CopyToClipBoard.mjs +5 -0
  25. package/build/components/CopyClipboard/CopyToClipBoard.mjs.map +1 -1
  26. package/build/components/CopyClipboard/utils.js +14 -1
  27. package/build/components/CopyClipboard/utils.js.map +1 -1
  28. package/build/components/CopyClipboard/utils.mjs +14 -1
  29. package/build/components/CopyClipboard/utils.mjs.map +1 -1
  30. package/build/components/Dependencies/Dependencies.js +2 -1
  31. package/build/components/Dependencies/Dependencies.js.map +1 -1
  32. package/build/components/Dependencies/Dependencies.mjs +2 -1
  33. package/build/components/Dependencies/Dependencies.mjs.map +1 -1
  34. package/build/components/Dependencies/DependencyBlock.js +1 -1
  35. package/build/components/Dependencies/DependencyBlock.mjs +1 -1
  36. package/build/components/Developers/Title.js +1 -1
  37. package/build/components/Developers/Title.mjs +1 -1
  38. package/build/components/Developers/get-unique-developer-values.js +2 -1
  39. package/build/components/Developers/get-unique-developer-values.js.map +1 -1
  40. package/build/components/Developers/get-unique-developer-values.mjs +2 -1
  41. package/build/components/Developers/get-unique-developer-values.mjs.map +1 -1
  42. package/build/components/Distribution/Dist.js +3 -3
  43. package/build/components/Distribution/Dist.js.map +1 -1
  44. package/build/components/Distribution/Dist.mjs +3 -3
  45. package/build/components/Distribution/Dist.mjs.map +1 -1
  46. package/build/components/Engines/Engines.js +1 -1
  47. package/build/components/Engines/Engines.mjs +1 -1
  48. package/build/components/Forbidden/Forbidden.js +1 -1
  49. package/build/components/Forbidden/Forbidden.mjs +1 -1
  50. package/build/components/FundButton/FundButton.js +4 -3
  51. package/build/components/FundButton/FundButton.js.map +1 -1
  52. package/build/components/FundButton/FundButton.mjs +4 -3
  53. package/build/components/FundButton/FundButton.mjs.map +1 -1
  54. package/build/components/GenericError/GenericError.d.ts +3 -0
  55. package/build/components/GenericError/GenericError.js +60 -0
  56. package/build/components/GenericError/GenericError.js.map +1 -0
  57. package/build/components/GenericError/GenericError.mjs +54 -0
  58. package/build/components/GenericError/GenericError.mjs.map +1 -0
  59. package/build/components/GenericError/index.d.ts +1 -0
  60. package/build/components/GenericError/index.js +2 -0
  61. package/build/components/GenericError/index.mjs +2 -0
  62. package/build/components/Help/Help.js +1 -1
  63. package/build/components/Help/Help.mjs +1 -1
  64. package/build/components/Install/Install.js +1 -1
  65. package/build/components/Install/Install.mjs +1 -1
  66. package/build/components/Install/InstallListItem.js +2 -2
  67. package/build/components/Install/InstallListItem.js.map +1 -1
  68. package/build/components/Install/InstallListItem.mjs +2 -2
  69. package/build/components/Install/InstallListItem.mjs.map +1 -1
  70. package/build/components/Keywords/KeywordListItems.js +1 -1
  71. package/build/components/Keywords/KeywordListItems.js.map +1 -1
  72. package/build/components/Keywords/KeywordListItems.mjs +1 -1
  73. package/build/components/Keywords/KeywordListItems.mjs.map +1 -1
  74. package/build/components/Keywords/Keywords.js +2 -2
  75. package/build/components/Keywords/Keywords.js.map +1 -1
  76. package/build/components/Keywords/Keywords.mjs +2 -2
  77. package/build/components/Keywords/Keywords.mjs.map +1 -1
  78. package/build/components/LoginDialog/LoginDialogCloseButton.js +1 -1
  79. package/build/components/LoginDialog/LoginDialogCloseButton.mjs +1 -1
  80. package/build/components/LoginDialog/LoginDialogForm.js +2 -1
  81. package/build/components/LoginDialog/LoginDialogForm.js.map +1 -1
  82. package/build/components/LoginDialog/LoginDialogForm.mjs +2 -1
  83. package/build/components/LoginDialog/LoginDialogForm.mjs.map +1 -1
  84. package/build/components/LoginForm/Login.d.ts +1 -0
  85. package/build/components/LoginForm/Login.js +6 -4
  86. package/build/components/LoginForm/Login.js.map +1 -1
  87. package/build/components/LoginForm/Login.mjs +9 -7
  88. package/build/components/LoginForm/Login.mjs.map +1 -1
  89. package/build/components/LoginForm/PasswordField.js +4 -6
  90. package/build/components/LoginForm/PasswordField.js.map +1 -1
  91. package/build/components/LoginForm/PasswordField.mjs +4 -6
  92. package/build/components/LoginForm/PasswordField.mjs.map +1 -1
  93. package/build/components/LoginForm/UsernameField.js +4 -6
  94. package/build/components/LoginForm/UsernameField.js.map +1 -1
  95. package/build/components/LoginForm/UsernameField.mjs +4 -6
  96. package/build/components/LoginForm/UsernameField.mjs.map +1 -1
  97. package/build/components/LoginForm/styles.js +1 -1
  98. package/build/components/LoginForm/styles.mjs +1 -1
  99. package/build/components/LoginForm/useLoginForm.js +13 -3
  100. package/build/components/LoginForm/useLoginForm.js.map +1 -1
  101. package/build/components/LoginForm/useLoginForm.mjs +14 -4
  102. package/build/components/LoginForm/useLoginForm.mjs.map +1 -1
  103. package/build/components/NoItems/NoItems.js +2 -2
  104. package/build/components/NoItems/NoItems.mjs +1 -1
  105. package/build/components/NotFound/NotFound.js +1 -1
  106. package/build/components/NotFound/NotFound.mjs +1 -1
  107. package/build/components/Package/Package.d.ts +1 -1
  108. package/build/components/Package/Package.js +28 -29
  109. package/build/components/Package/Package.js.map +1 -1
  110. package/build/components/Package/Package.mjs +29 -30
  111. package/build/components/Package/Package.mjs.map +1 -1
  112. package/build/components/Person/Person.js +1 -1
  113. package/build/components/Person/Person.js.map +1 -1
  114. package/build/components/Person/Person.mjs +1 -1
  115. package/build/components/Person/Person.mjs.map +1 -1
  116. package/build/components/RawViewer/RawViewer.js +1 -1
  117. package/build/components/RawViewer/RawViewer.mjs +1 -1
  118. package/build/components/RegistryInfoDialog/RegistryInfoDialog.js +1 -1
  119. package/build/components/RegistryInfoDialog/RegistryInfoDialog.mjs +1 -1
  120. package/build/components/Repository/Repository.js +5 -8
  121. package/build/components/Repository/Repository.js.map +1 -1
  122. package/build/components/Repository/Repository.mjs +5 -8
  123. package/build/components/Repository/Repository.mjs.map +1 -1
  124. package/build/components/Search/AutoComplete/AutoComplete.d.ts +1 -0
  125. package/build/components/Search/AutoComplete/AutoComplete.js +4 -4
  126. package/build/components/Search/AutoComplete/AutoComplete.js.map +1 -1
  127. package/build/components/Search/AutoComplete/AutoComplete.mjs +4 -4
  128. package/build/components/Search/AutoComplete/AutoComplete.mjs.map +1 -1
  129. package/build/components/Search/Search.js +12 -4
  130. package/build/components/Search/Search.js.map +1 -1
  131. package/build/components/Search/Search.mjs +13 -5
  132. package/build/components/Search/Search.mjs.map +1 -1
  133. package/build/components/Search/SearchItem.js +1 -1
  134. package/build/components/Search/SearchItem.mjs +1 -1
  135. package/build/components/SettingsMenu/SettingsMenu.js +1 -1
  136. package/build/components/SettingsMenu/SettingsMenu.mjs +1 -1
  137. package/build/components/SideBarTitle/SideBarTitle.js +2 -2
  138. package/build/components/SideBarTitle/SideBarTitle.js.map +1 -1
  139. package/build/components/SideBarTitle/SideBarTitle.mjs +2 -2
  140. package/build/components/SideBarTitle/SideBarTitle.mjs.map +1 -1
  141. package/build/components/UpLinks/UpLinks.js +1 -1
  142. package/build/components/UpLinks/UpLinks.mjs +1 -1
  143. package/build/components/Versions/HistoryList.js +2 -2
  144. package/build/components/Versions/HistoryList.js.map +1 -1
  145. package/build/components/Versions/HistoryList.mjs +2 -2
  146. package/build/components/Versions/HistoryList.mjs.map +1 -1
  147. package/build/components/Versions/Versions.js +22 -21
  148. package/build/components/Versions/Versions.js.map +1 -1
  149. package/build/components/Versions/Versions.mjs +22 -21
  150. package/build/components/Versions/Versions.mjs.map +1 -1
  151. package/build/index.d.ts +1 -0
  152. package/build/index.js +4 -0
  153. package/build/index.mjs +4 -2
  154. package/build/pages/Stage/StageDetail.d.ts +2 -0
  155. package/build/pages/Stage/StageDetail.js +8 -0
  156. package/build/pages/Stage/StageDetail.js.map +1 -0
  157. package/build/pages/Stage/StageDetail.mjs +8 -0
  158. package/build/pages/Stage/StageDetail.mjs.map +1 -0
  159. package/build/pages/Stage/StageList.d.ts +2 -0
  160. package/build/pages/Stage/StageList.js +8 -0
  161. package/build/pages/Stage/StageList.js.map +1 -0
  162. package/build/pages/Stage/StageList.mjs +8 -0
  163. package/build/pages/Stage/StageList.mjs.map +1 -0
  164. package/build/pages/Stage/index.d.ts +2 -0
  165. package/build/pages/Version/Version.js +4 -1
  166. package/build/pages/Version/Version.js.map +1 -1
  167. package/build/pages/Version/Version.mjs +4 -1
  168. package/build/pages/Version/Version.mjs.map +1 -1
  169. package/build/providers/AuthProvider/AuthProvider.js +9 -7
  170. package/build/providers/AuthProvider/AuthProvider.js.map +1 -1
  171. package/build/providers/AuthProvider/AuthProvider.mjs +10 -8
  172. package/build/providers/AuthProvider/AuthProvider.mjs.map +1 -1
  173. package/build/providers/AuthProvider/utils.d.ts +12 -0
  174. package/build/providers/AuthProvider/utils.js +22 -0
  175. package/build/providers/AuthProvider/utils.js.map +1 -1
  176. package/build/providers/AuthProvider/utils.mjs +21 -2
  177. package/build/providers/AuthProvider/utils.mjs.map +1 -1
  178. package/build/providers/DownloadProvider/DownloadProvider.d.ts +1 -0
  179. package/build/providers/DownloadProvider/DownloadProvider.js +27 -4
  180. package/build/providers/DownloadProvider/DownloadProvider.js.map +1 -1
  181. package/build/providers/DownloadProvider/DownloadProvider.mjs +27 -6
  182. package/build/providers/DownloadProvider/DownloadProvider.mjs.map +1 -1
  183. package/build/providers/ManifestsProvider/ManifestsProvider.js +1 -1
  184. package/build/providers/ManifestsProvider/ManifestsProvider.js.map +1 -1
  185. package/build/providers/ManifestsProvider/ManifestsProvider.mjs +1 -1
  186. package/build/providers/ManifestsProvider/ManifestsProvider.mjs.map +1 -1
  187. package/build/providers/SearchProvider/SearchProvider.d.ts +1 -0
  188. package/build/providers/SearchProvider/SearchProvider.js +8 -6
  189. package/build/providers/SearchProvider/SearchProvider.js.map +1 -1
  190. package/build/providers/SearchProvider/SearchProvider.mjs +8 -6
  191. package/build/providers/SearchProvider/SearchProvider.mjs.map +1 -1
  192. package/build/providers/TranslatorProvider/TranslatorProvider.js +5 -3
  193. package/build/providers/TranslatorProvider/TranslatorProvider.js.map +1 -1
  194. package/build/providers/TranslatorProvider/TranslatorProvider.mjs +5 -3
  195. package/build/providers/TranslatorProvider/TranslatorProvider.mjs.map +1 -1
  196. package/build/providers/VersionProvider/VersionProvider.js +3 -3
  197. package/build/providers/VersionProvider/VersionProvider.js.map +1 -1
  198. package/build/providers/VersionProvider/VersionProvider.mjs +3 -3
  199. package/build/providers/VersionProvider/VersionProvider.mjs.map +1 -1
  200. package/build/sections/Detail/Tabs.js +1 -1
  201. package/build/sections/Detail/Tabs.mjs +1 -1
  202. package/build/sections/Footer/Footer.js +1 -1
  203. package/build/sections/Footer/Footer.mjs +1 -1
  204. package/build/sections/Header/Header.d.ts +0 -1
  205. package/build/sections/Header/Header.js +16 -14
  206. package/build/sections/Header/Header.js.map +1 -1
  207. package/build/sections/Header/Header.mjs +17 -15
  208. package/build/sections/Header/Header.mjs.map +1 -1
  209. package/build/sections/Header/HeaderGreetings.js +1 -1
  210. package/build/sections/Header/HeaderGreetings.mjs +1 -1
  211. package/build/sections/Header/HeaderMenu.js +26 -7
  212. package/build/sections/Header/HeaderMenu.js.map +1 -1
  213. package/build/sections/Header/HeaderMenu.mjs +26 -7
  214. package/build/sections/Header/HeaderMenu.mjs.map +1 -1
  215. package/build/sections/Header/HeaderRight.js +1 -1
  216. package/build/sections/Header/HeaderRight.mjs +1 -1
  217. package/build/sections/Header/HeaderSettingsDialog.js +1 -1
  218. package/build/sections/Header/HeaderSettingsDialog.mjs +1 -1
  219. package/build/sections/Header/LanguageSwitch.js +1 -1
  220. package/build/sections/Header/LanguageSwitch.mjs +1 -1
  221. package/build/sections/Header/RegistryInfoContent/RegistryInfoContent.js +1 -1
  222. package/build/sections/Header/RegistryInfoContent/RegistryInfoContent.mjs +1 -1
  223. package/build/sections/Home/Home.js +4 -3
  224. package/build/sections/Home/Home.js.map +1 -1
  225. package/build/sections/Home/Home.mjs +5 -4
  226. package/build/sections/Home/Home.mjs.map +1 -1
  227. package/build/sections/Security/AddUser.js +33 -18
  228. package/build/sections/Security/AddUser.js.map +1 -1
  229. package/build/sections/Security/AddUser.mjs +37 -22
  230. package/build/sections/Security/AddUser.mjs.map +1 -1
  231. package/build/sections/Security/ChangePassword.js +17 -15
  232. package/build/sections/Security/ChangePassword.js.map +1 -1
  233. package/build/sections/Security/ChangePassword.mjs +19 -17
  234. package/build/sections/Security/ChangePassword.mjs.map +1 -1
  235. package/build/sections/Security/Login.js +51 -35
  236. package/build/sections/Security/Login.js.map +1 -1
  237. package/build/sections/Security/Login.mjs +54 -38
  238. package/build/sections/Security/Login.mjs.map +1 -1
  239. package/build/sections/Security/Success.js +28 -24
  240. package/build/sections/Security/Success.js.map +1 -1
  241. package/build/sections/Security/Success.mjs +29 -25
  242. package/build/sections/Security/Success.mjs.map +1 -1
  243. package/build/sections/Stage/StageActions.d.ts +15 -0
  244. package/build/sections/Stage/StageActions.js +101 -0
  245. package/build/sections/Stage/StageActions.js.map +1 -0
  246. package/build/sections/Stage/StageActions.mjs +99 -0
  247. package/build/sections/Stage/StageActions.mjs.map +1 -0
  248. package/build/sections/Stage/StageDetail.d.ts +3 -0
  249. package/build/sections/Stage/StageDetail.js +110 -0
  250. package/build/sections/Stage/StageDetail.js.map +1 -0
  251. package/build/sections/Stage/StageDetail.mjs +108 -0
  252. package/build/sections/Stage/StageDetail.mjs.map +1 -0
  253. package/build/sections/Stage/StageList.d.ts +3 -0
  254. package/build/sections/Stage/StageList.js +153 -0
  255. package/build/sections/Stage/StageList.js.map +1 -0
  256. package/build/sections/Stage/StageList.mjs +151 -0
  257. package/build/sections/Stage/StageList.mjs.map +1 -0
  258. package/build/sections/Stage/index.d.ts +6 -0
  259. package/build/sections/Stage/index.js +13 -0
  260. package/build/sections/Stage/index.mjs +6 -0
  261. package/build/sections/Stage/types.d.ts +22 -0
  262. package/build/sections/Stage/useRequireSession.d.ts +14 -0
  263. package/build/sections/Stage/useRequireSession.js +33 -0
  264. package/build/sections/Stage/useRequireSession.js.map +1 -0
  265. package/build/sections/Stage/useRequireSession.mjs +33 -0
  266. package/build/sections/Stage/useRequireSession.mjs.map +1 -0
  267. package/build/sections/Stage/useStage.d.ts +34 -0
  268. package/build/sections/Stage/useStage.js +71 -0
  269. package/build/sections/Stage/useStage.js.map +1 -0
  270. package/build/sections/Stage/useStage.mjs +65 -0
  271. package/build/sections/Stage/useStage.mjs.map +1 -0
  272. package/build/store/api.js +7 -4
  273. package/build/store/api.js.map +1 -1
  274. package/build/store/api.mjs +7 -4
  275. package/build/store/api.mjs.map +1 -1
  276. package/build/types/packageMeta.d.ts +3 -2
  277. package/build/utils/cli-utils.js +2 -2
  278. package/build/utils/cli-utils.js.map +1 -1
  279. package/build/utils/cli-utils.mjs +2 -2
  280. package/build/utils/cli-utils.mjs.map +1 -1
  281. package/build/utils/index.js +1 -0
  282. package/build/utils/index.mjs +2 -2
  283. package/build/utils/routes.d.ts +5 -1
  284. package/build/utils/routes.js +4 -0
  285. package/build/utils/routes.js.map +1 -1
  286. package/build/utils/routes.mjs +4 -0
  287. package/build/utils/routes.mjs.map +1 -1
  288. package/build/utils/schemas.d.ts +1 -0
  289. package/build/utils/schemas.js +4 -4
  290. package/build/utils/schemas.js.map +1 -1
  291. package/build/utils/schemas.mjs +4 -4
  292. package/build/utils/schemas.mjs.map +1 -1
  293. package/build/utils/session-id.d.ts +8 -0
  294. package/build/utils/session-id.js +26 -0
  295. package/build/utils/session-id.js.map +1 -0
  296. package/build/utils/session-id.mjs +26 -0
  297. package/build/utils/session-id.mjs.map +1 -0
  298. package/build/utils/token.d.ts +1 -0
  299. package/build/utils/token.js +12 -8
  300. package/build/utils/token.js.map +1 -1
  301. package/build/utils/token.mjs +12 -9
  302. package/build/utils/token.mjs.map +1 -1
  303. package/build/utils/url.js +1 -1
  304. package/build/utils/url.js.map +1 -1
  305. package/build/utils/url.mjs +1 -1
  306. package/build/utils/url.mjs.map +1 -1
  307. package/build/utils/utils.d.ts +10 -0
  308. package/build/utils/utils.js +26 -0
  309. package/build/utils/utils.js.map +1 -1
  310. package/build/utils/utils.mjs +25 -1
  311. package/build/utils/utils.mjs.map +1 -1
  312. package/package.json +6 -6
@@ -18,8 +18,8 @@ var VersionProvider = ({ children }) => {
18
18
  const readmeData = useData(basePath, APIRoute.README, packageName, packageVersion);
19
19
  const sidebarData = useData(basePath, APIRoute.SIDEBAR, packageName, packageVersion);
20
20
  const isLoading = readmeData.isLoading || sidebarData.isLoading;
21
- const error = readmeData.error || sidebarData.error;
22
- const errorCode = readmeData.error?.code ?? sidebarData.error?.code;
21
+ const error = sidebarData.error;
22
+ const errorCode = sidebarData.error?.code;
23
23
  const value = useMemo(() => ({
24
24
  packageMeta: sidebarData.data,
25
25
  readMe: readmeData.data,
@@ -29,7 +29,7 @@ var VersionProvider = ({ children }) => {
29
29
  isForbidden: errorCode === 403,
30
30
  isUnAuthorized: errorCode === 401,
31
31
  hasNotBeenFound: errorCode === 404,
32
- isError: errorCode !== void 0,
32
+ isError: error !== void 0,
33
33
  error
34
34
  }), [
35
35
  sidebarData.data,
@@ -1 +1 @@
1
- {"version":3,"file":"VersionProvider.mjs","names":[],"sources":["../../../src/providers/VersionProvider/VersionProvider.tsx"],"sourcesContent":["import React, { createContext, useContext, useMemo } from 'react';\nimport { useParams } from 'react-router';\n\nimport { useData } from '../../api/use-data';\nimport { getConfiguration } from '../../configuration';\nimport { APIRoute } from '../../store/routes';\nimport { stripTrailingSlash } from '../../store/utils';\nimport type { PackageMetaInterface } from '../../types/packageMeta';\n\nfunction getRouterPackageName(packageName: string, scope?: string): string {\n return scope ? `${scope}/${packageName}` : packageName;\n}\n\nexport interface ApiError extends Error {\n code?: number;\n}\n\nexport interface DetailContextProps {\n error: ApiError | undefined;\n hasNotBeenFound: boolean;\n isForbidden: boolean;\n isUnAuthorized: boolean;\n isError: boolean;\n isLoading: boolean;\n packageMeta?: PackageMetaInterface;\n packageName: string;\n packageVersion?: string;\n readMe?: string;\n}\n\nexport const DetailContext = createContext<DetailContextProps | undefined>(undefined);\n\nconst VersionProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => {\n const {\n scope,\n package: pkgName,\n version: packageVersion,\n } = useParams<Record<'scope' | 'package' | 'version', string | undefined>>();\n\n const configuration = getConfiguration();\n const basePath = stripTrailingSlash(configuration.base);\n const packageName = getRouterPackageName(pkgName ?? '', scope);\n\n const readmeData = useData<string>(basePath, APIRoute.README, packageName, packageVersion);\n\n const sidebarData = useData<PackageMetaInterface>(\n basePath,\n APIRoute.SIDEBAR,\n packageName,\n packageVersion\n );\n const isLoading = readmeData.isLoading || sidebarData.isLoading;\n const error: ApiError | undefined = readmeData.error || sidebarData.error;\n const errorCode = (readmeData.error as ApiError)?.code ?? (sidebarData.error as ApiError)?.code;\n\n const value = useMemo<DetailContextProps>(\n () => ({\n packageMeta: sidebarData.data,\n readMe: readmeData.data,\n packageName,\n packageVersion,\n isLoading,\n isForbidden: errorCode === 403,\n isUnAuthorized: errorCode === 401,\n hasNotBeenFound: errorCode === 404,\n isError: errorCode !== undefined,\n error,\n }),\n [sidebarData.data, readmeData.data, packageName, packageVersion, isLoading, errorCode, error]\n );\n\n return <DetailContext.Provider value={value}>{children}</DetailContext.Provider>;\n};\n\nexport default VersionProvider;\n\nexport const useVersion = (): DetailContextProps => {\n const context = useContext(DetailContext);\n if (context === undefined) {\n throw new Error('useVersion must be used within a VersionProvider');\n }\n return context;\n};\n"],"mappings":";;;;;;;;AASA,SAAS,qBAAqB,aAAqB,OAAwB;CACzE,OAAO,QAAQ,GAAG,MAAM,GAAG,gBAAgB;AAC7C;AAmBA,IAAa,gBAAgB,cAA8C,KAAA,CAAS;AAEpF,IAAM,mBAA4D,EAAE,eAAe;CACjF,MAAM,EACJ,OACA,SAAS,SACT,SAAS,mBACP,UAAuE;CAE3E,MAAM,gBAAgB,iBAAiB;CACvC,MAAM,WAAW,mBAAmB,cAAc,IAAI;CACtD,MAAM,cAAc,qBAAqB,WAAW,IAAI,KAAK;CAE7D,MAAM,aAAa,QAAgB,UAAU,SAAS,QAAQ,aAAa,cAAc;CAEzF,MAAM,cAAc,QAClB,UACA,SAAS,SACT,aACA,cACF;CACA,MAAM,YAAY,WAAW,aAAa,YAAY;CACtD,MAAM,QAA8B,WAAW,SAAS,YAAY;CACpE,MAAM,YAAa,WAAW,OAAoB,QAAS,YAAY,OAAoB;CAE3F,MAAM,QAAQ,eACL;EACL,aAAa,YAAY;EACzB,QAAQ,WAAW;EACnB;EACA;EACA;EACA,aAAa,cAAc;EAC3B,gBAAgB,cAAc;EAC9B,iBAAiB,cAAc;EAC/B,SAAS,cAAc,KAAA;EACvB;CACF,IACA;EAAC,YAAY;EAAM,WAAW;EAAM;EAAa;EAAgB;EAAW;EAAW;CAAK,CAC9F;CAEA,OAAO,oBAAC,cAAc,UAAf;EAA+B;EAAQ;CAAiC,CAAA;AACjF;AAIA,IAAa,mBAAuC;CAClD,MAAM,UAAU,WAAW,aAAa;CACxC,IAAI,YAAY,KAAA,GACd,MAAM,IAAI,MAAM,kDAAkD;CAEpE,OAAO;AACT"}
1
+ {"version":3,"file":"VersionProvider.mjs","names":[],"sources":["../../../src/providers/VersionProvider/VersionProvider.tsx"],"sourcesContent":["import React, { createContext, useContext, useMemo } from 'react';\nimport { useParams } from 'react-router';\n\nimport { useData } from '../../api/use-data';\nimport { getConfiguration } from '../../configuration';\nimport { APIRoute } from '../../store/routes';\nimport { stripTrailingSlash } from '../../store/utils';\nimport type { PackageMetaInterface } from '../../types/packageMeta';\n\nfunction getRouterPackageName(packageName: string, scope?: string): string {\n return scope ? `${scope}/${packageName}` : packageName;\n}\n\nexport interface ApiError extends Error {\n code?: number;\n}\n\nexport interface DetailContextProps {\n error: ApiError | undefined;\n hasNotBeenFound: boolean;\n isForbidden: boolean;\n isUnAuthorized: boolean;\n isError: boolean;\n isLoading: boolean;\n packageMeta?: PackageMetaInterface;\n packageName: string;\n packageVersion?: string;\n readMe?: string;\n}\n\nexport const DetailContext = createContext<DetailContextProps | undefined>(undefined);\n\nconst VersionProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => {\n const {\n scope,\n package: pkgName,\n version: packageVersion,\n } = useParams<Record<'scope' | 'package' | 'version', string | undefined>>();\n\n const configuration = getConfiguration();\n const basePath = stripTrailingSlash(configuration.base);\n const packageName = getRouterPackageName(pkgName ?? '', scope);\n\n const readmeData = useData<string>(basePath, APIRoute.README, packageName, packageVersion);\n\n const sidebarData = useData<PackageMetaInterface>(\n basePath,\n APIRoute.SIDEBAR,\n packageName,\n packageVersion\n );\n const isLoading = readmeData.isLoading || sidebarData.isLoading;\n // only the sidebar data drives the whole page; a readme-only failure must\n // not blank a page that can render from sidebar data\n const error: ApiError | undefined = sidebarData.error;\n const errorCode = (sidebarData.error as ApiError)?.code;\n\n const value = useMemo<DetailContextProps>(\n () => ({\n packageMeta: sidebarData.data,\n readMe: readmeData.data,\n packageName,\n packageVersion,\n isLoading,\n isForbidden: errorCode === 403,\n isUnAuthorized: errorCode === 401,\n hasNotBeenFound: errorCode === 404,\n // network failures reject without a `.code`, they are still errors\n isError: error !== undefined,\n error,\n }),\n [sidebarData.data, readmeData.data, packageName, packageVersion, isLoading, errorCode, error]\n );\n\n return <DetailContext.Provider value={value}>{children}</DetailContext.Provider>;\n};\n\nexport default VersionProvider;\n\nexport const useVersion = (): DetailContextProps => {\n const context = useContext(DetailContext);\n if (context === undefined) {\n throw new Error('useVersion must be used within a VersionProvider');\n }\n return context;\n};\n"],"mappings":";;;;;;;;AASA,SAAS,qBAAqB,aAAqB,OAAwB;CACzE,OAAO,QAAQ,GAAG,MAAM,GAAG,gBAAgB;AAC7C;AAmBA,IAAa,gBAAgB,cAA8C,KAAA,CAAS;AAEpF,IAAM,mBAA4D,EAAE,eAAe;CACjF,MAAM,EACJ,OACA,SAAS,SACT,SAAS,mBACP,UAAuE;CAE3E,MAAM,gBAAgB,iBAAiB;CACvC,MAAM,WAAW,mBAAmB,cAAc,IAAI;CACtD,MAAM,cAAc,qBAAqB,WAAW,IAAI,KAAK;CAE7D,MAAM,aAAa,QAAgB,UAAU,SAAS,QAAQ,aAAa,cAAc;CAEzF,MAAM,cAAc,QAClB,UACA,SAAS,SACT,aACA,cACF;CACA,MAAM,YAAY,WAAW,aAAa,YAAY;CAGtD,MAAM,QAA8B,YAAY;CAChD,MAAM,YAAa,YAAY,OAAoB;CAEnD,MAAM,QAAQ,eACL;EACL,aAAa,YAAY;EACzB,QAAQ,WAAW;EACnB;EACA;EACA;EACA,aAAa,cAAc;EAC3B,gBAAgB,cAAc;EAC9B,iBAAiB,cAAc;EAE/B,SAAS,UAAU,KAAA;EACnB;CACF,IACA;EAAC,YAAY;EAAM,WAAW;EAAM;EAAa;EAAgB;EAAW;EAAW;CAAK,CAC9F;CAEA,OAAO,oBAAC,cAAc,UAAf;EAA+B;EAAQ;CAAiC,CAAA;AACjF;AAIA,IAAa,mBAAuC;CAClD,MAAM,UAAU,WAAW,aAAa;CACxC,IAAI,YAAY,KAAA,GACd,MAAM,IAAI,MAAM,kDAAkD;CAEpE,OAAO;AACT"}
@@ -3,8 +3,8 @@ let _emotion_styled = require("@emotion/styled");
3
3
  _emotion_styled = require_runtime.__toESM(_emotion_styled);
4
4
  let react = require("react");
5
5
  react = require_runtime.__toESM(react);
6
- let react_jsx_runtime = require("react/jsx-runtime");
7
6
  let react_i18next = require("react-i18next");
7
+ let react_jsx_runtime = require("react/jsx-runtime");
8
8
  let _mui_material_Tab = require("@mui/material/Tab");
9
9
  _mui_material_Tab = require_runtime.__toESM(_mui_material_Tab);
10
10
  let _mui_material_Tabs = require("@mui/material/Tabs");
@@ -1,7 +1,7 @@
1
1
  import styled from "@emotion/styled";
2
2
  import "react";
3
- import { jsx, jsxs } from "react/jsx-runtime";
4
3
  import { useTranslation } from "react-i18next";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
5
  import Tab from "@mui/material/Tab";
6
6
  import Tabs from "@mui/material/Tabs";
7
7
  import useMediaQuery from "@mui/material/useMediaQuery";
@@ -9,8 +9,8 @@ let _emotion_styled = require("@emotion/styled");
9
9
  _emotion_styled = require_runtime.__toESM(_emotion_styled);
10
10
  let react = require("react");
11
11
  react = require_runtime.__toESM(react);
12
- let react_jsx_runtime = require("react/jsx-runtime");
13
12
  let react_i18next = require("react-i18next");
13
+ let react_jsx_runtime = require("react/jsx-runtime");
14
14
  let country_flag_icons_react_3x2 = require("country-flag-icons/react/3x2");
15
15
  country_flag_icons_react_3x2 = require_runtime.__toESM(country_flag_icons_react_3x2);
16
16
  //#region src/sections/Footer/Footer.tsx
@@ -6,8 +6,8 @@ import { Inner, Left, Love, Right, Wrapper } from "./styles.mjs";
6
6
  import "../../index.mjs";
7
7
  import styled from "@emotion/styled";
8
8
  import "react";
9
- import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
10
9
  import { Trans, useTranslation } from "react-i18next";
10
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
11
11
  import * as FlagsIcon from "country-flag-icons/react/3x2";
12
12
  //#region src/sections/Footer/Footer.tsx
13
13
  function goToVerdaccioWebsite() {
@@ -2,7 +2,6 @@ import React from 'react';
2
2
  type Props = {
3
3
  HeaderInfoDialog?: React.FC<any>;
4
4
  isPlainHeader?: boolean;
5
- tokenCheckIntervalMs?: number;
6
5
  };
7
6
  declare const Header: React.FC<Props>;
8
7
  export default Header;
@@ -11,12 +11,12 @@ const require_HeaderSettingsDialog = require("./HeaderSettingsDialog.js");
11
11
  require("../../index.js");
12
12
  let react = require("react");
13
13
  react = require_runtime.__toESM(react);
14
- let react_jsx_runtime = require("react/jsx-runtime");
15
14
  let react_i18next = require("react-i18next");
15
+ let react_jsx_runtime = require("react/jsx-runtime");
16
16
  let _mui_material_Button = require("@mui/material/Button");
17
17
  _mui_material_Button = require_runtime.__toESM(_mui_material_Button);
18
18
  //#region src/sections/Header/Header.tsx
19
- var Header = ({ HeaderInfoDialog, isPlainHeader, tokenCheckIntervalMs = 36e5 }) => {
19
+ var Header = ({ HeaderInfoDialog, isPlainHeader }) => {
20
20
  const { t } = (0, react_i18next.useTranslation)();
21
21
  const [isInfoDialogOpen, setOpenInfoDialog] = (0, react.useState)(false);
22
22
  const [isSettingsDialogOpen, setSettingsDialogOpen] = (0, react.useState)(false);
@@ -24,23 +24,25 @@ var Header = ({ HeaderInfoDialog, isPlainHeader, tokenCheckIntervalMs = 36e5 })
24
24
  const [showLoginModal, setShowLoginModal] = (0, react.useState)(false);
25
25
  const { configOptions } = require_AppConfigurationProvider.useConfig();
26
26
  const { userState, logOutUser } = require_AuthProvider.useAuth();
27
- const tokenRef = (0, react.useRef)(userState?.token);
28
27
  const logOutUserRef = (0, react.useRef)(logOutUser);
29
- (0, react.useEffect)(() => {
30
- tokenRef.current = userState?.token;
31
- }, [userState?.token]);
32
28
  (0, react.useEffect)(() => {
33
29
  logOutUserRef.current = logOutUser;
34
30
  }, [logOutUser]);
35
31
  (0, react.useEffect)(() => {
36
- function checkToken() {
37
- const token = tokenRef.current;
38
- if (token && require_token.isTokenExpire(token)) logOutUserRef.current?.();
39
- }
40
- checkToken();
41
- const interval = setInterval(checkToken, tokenCheckIntervalMs);
42
- return () => clearInterval(interval);
43
- }, [tokenCheckIntervalMs]);
32
+ const token = userState?.token;
33
+ if (!token) return;
34
+ let timer;
35
+ const arm = () => {
36
+ const remaining = require_token.tokenExpireInMs(token);
37
+ if (remaining === null || remaining <= 0) {
38
+ logOutUserRef.current?.();
39
+ return;
40
+ }
41
+ timer = setTimeout(arm, Math.min(remaining, 2 ** 31 - 1));
42
+ };
43
+ arm();
44
+ return () => clearTimeout(timer);
45
+ }, [userState?.token]);
44
46
  const handleLogout = () => {
45
47
  logOutUser?.();
46
48
  setShowLoginModal(false);
@@ -1 +1 @@
1
- {"version":3,"file":"Header.js","names":[],"sources":["../../../src/sections/Header/Header.tsx"],"sourcesContent":["import Button from '@mui/material/Button';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { LoginDialog, Search, useAuth, useConfig } from '../../';\nimport { isTokenExpire } from '../../utils/token';\nimport HeaderLeft from './HeaderLeft';\nimport HeaderRight from './HeaderRight';\nimport HeaderSettingsDialog from './HeaderSettingsDialog';\nimport { InnerMobileNavBar, InnerNavBar, MobileNavBar, NavBar } from './styles';\n\ntype Props = {\n HeaderInfoDialog?: React.FC<any>;\n isPlainHeader?: boolean;\n tokenCheckIntervalMs?: number;\n};\n\n// Session timeout default is 1 hour\nconst Header: React.FC<Props> = ({\n HeaderInfoDialog,\n isPlainHeader,\n tokenCheckIntervalMs = 60 * 60 * 1000,\n}) => {\n const { t } = useTranslation();\n const [isInfoDialogOpen, setOpenInfoDialog] = useState<boolean>(false);\n const [isSettingsDialogOpen, setSettingsDialogOpen] = useState<boolean>(false);\n const [showMobileNavBar, setShowMobileNavBar] = useState<boolean>(false);\n const [showLoginModal, setShowLoginModal] = useState<boolean>(false);\n const { configOptions } = useConfig();\n const { userState, logOutUser } = useAuth();\n\n // Use refs to always have the latest token/logout in the interval callback\n const tokenRef = useRef(userState?.token);\n const logOutUserRef = useRef(logOutUser);\n useEffect(() => {\n tokenRef.current = userState?.token;\n }, [userState?.token]);\n useEffect(() => {\n logOutUserRef.current = logOutUser;\n }, [logOutUser]);\n\n useEffect(() => {\n function checkToken() {\n const token = tokenRef.current;\n if (token && isTokenExpire(token)) {\n logOutUserRef.current?.();\n }\n }\n checkToken();\n const interval = setInterval(checkToken, tokenCheckIntervalMs);\n return () => clearInterval(interval);\n }, [tokenCheckIntervalMs]);\n\n const handleLogout = () => {\n logOutUser?.();\n setShowLoginModal(false);\n };\n if (isPlainHeader) {\n return (\n <NavBar data-testid=\"header\" position=\"static\">\n <InnerNavBar data-testid=\"inner-nav-bar\">\n <HeaderLeft showSearch={false} />\n <HeaderRight\n hasLogin={false}\n onLogout={() => {}}\n onOpenRegistryInfoDialog={() => {}}\n onOpenSettingsDialog={() => {}}\n onToggleLogin={() => {}}\n onToggleMobileNav={() => {}}\n showInfo={false}\n showSearch={false}\n showSettings={false}\n showThemeSwitch={false}\n username={''}\n />\n </InnerNavBar>\n </NavBar>\n );\n }\n\n return (\n <>\n <NavBar data-testid=\"header\" position=\"static\">\n <InnerNavBar data-testid=\"inner-nav-bar\">\n <HeaderLeft showSearch={configOptions.showSearch} />\n <HeaderRight\n hasLogin={configOptions?.login}\n onLogout={handleLogout}\n onOpenRegistryInfoDialog={() => setOpenInfoDialog(true)}\n onOpenSettingsDialog={() => setSettingsDialogOpen(true)}\n onToggleLogin={() => setShowLoginModal(!showLoginModal)}\n onToggleMobileNav={() => setShowMobileNavBar(!showMobileNavBar)}\n showInfo={configOptions.showInfo}\n showSearch={configOptions.showSearch}\n showSettings={configOptions.showSettings}\n showThemeSwitch={configOptions.showThemeSwitch}\n username={userState?.username}\n />\n </InnerNavBar>\n <HeaderSettingsDialog\n isOpen={isSettingsDialogOpen}\n onCloseDialog={() => setSettingsDialogOpen(false)}\n />\n {HeaderInfoDialog ? (\n <HeaderInfoDialog\n dialogTitle={t('dialog.registry-info.title')}\n isOpen={isInfoDialogOpen}\n onCloseDialog={() => setOpenInfoDialog(false)}\n />\n ) : null}\n </NavBar>\n {showMobileNavBar && (\n <MobileNavBar data-testid=\"mobile-nav-bar\">\n <InnerMobileNavBar>\n <Search />\n </InnerMobileNavBar>\n <Button color=\"inherit\" onClick={() => setShowMobileNavBar(false)}>\n {t('button.cancel')}\n </Button>\n </MobileNavBar>\n )}\n {!userState?.username && (\n <LoginDialog onClose={() => setShowLoginModal(false)} open={showLoginModal} />\n )}\n </>\n );\n};\n\nexport default Header;\n"],"mappings":"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"}
1
+ {"version":3,"file":"Header.js","names":[],"sources":["../../../src/sections/Header/Header.tsx"],"sourcesContent":["import Button from '@mui/material/Button';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { LoginDialog, Search, useAuth, useConfig } from '../../';\nimport { tokenExpireInMs } from '../../utils/token';\nimport HeaderLeft from './HeaderLeft';\nimport HeaderRight from './HeaderRight';\nimport HeaderSettingsDialog from './HeaderSettingsDialog';\nimport { InnerMobileNavBar, InnerNavBar, MobileNavBar, NavBar } from './styles';\n\ntype Props = {\n HeaderInfoDialog?: React.FC<any>;\n isPlainHeader?: boolean;\n};\n\nconst Header: React.FC<Props> = ({ HeaderInfoDialog, isPlainHeader }) => {\n const { t } = useTranslation();\n const [isInfoDialogOpen, setOpenInfoDialog] = useState<boolean>(false);\n const [isSettingsDialogOpen, setSettingsDialogOpen] = useState<boolean>(false);\n const [showMobileNavBar, setShowMobileNavBar] = useState<boolean>(false);\n const [showLoginModal, setShowLoginModal] = useState<boolean>(false);\n const { configOptions } = useConfig();\n const { userState, logOutUser } = useAuth();\n\n // Use a ref to always have the latest logout in the timer callback\n const logOutUserRef = useRef(logOutUser);\n useEffect(() => {\n logOutUserRef.current = logOutUser;\n }, [logOutUser]);\n\n // log out exactly when the token expires; polling reloaded the page at an\n // arbitrary moment up to a minute later, mid-interaction\n useEffect(() => {\n const token = userState?.token;\n if (!token) {\n return;\n }\n let timer: ReturnType<typeof setTimeout> | undefined;\n const arm = () => {\n const remaining = tokenExpireInMs(token);\n if (remaining === null || remaining <= 0) {\n logOutUserRef.current?.();\n return;\n }\n // setTimeout overflows above 2^31-1 ms; re-arm for far-away expiries\n timer = setTimeout(arm, Math.min(remaining, 2 ** 31 - 1));\n };\n arm();\n return () => clearTimeout(timer);\n }, [userState?.token]);\n\n const handleLogout = () => {\n logOutUser?.();\n setShowLoginModal(false);\n };\n if (isPlainHeader) {\n return (\n <NavBar data-testid=\"header\" position=\"static\">\n <InnerNavBar data-testid=\"inner-nav-bar\">\n <HeaderLeft showSearch={false} />\n <HeaderRight\n hasLogin={false}\n onLogout={() => {}}\n onOpenRegistryInfoDialog={() => {}}\n onOpenSettingsDialog={() => {}}\n onToggleLogin={() => {}}\n onToggleMobileNav={() => {}}\n showInfo={false}\n showSearch={false}\n showSettings={false}\n showThemeSwitch={false}\n username={''}\n />\n </InnerNavBar>\n </NavBar>\n );\n }\n\n return (\n <>\n <NavBar data-testid=\"header\" position=\"static\">\n <InnerNavBar data-testid=\"inner-nav-bar\">\n <HeaderLeft showSearch={configOptions.showSearch} />\n <HeaderRight\n hasLogin={configOptions?.login}\n onLogout={handleLogout}\n onOpenRegistryInfoDialog={() => setOpenInfoDialog(true)}\n onOpenSettingsDialog={() => setSettingsDialogOpen(true)}\n onToggleLogin={() => setShowLoginModal(!showLoginModal)}\n onToggleMobileNav={() => setShowMobileNavBar(!showMobileNavBar)}\n showInfo={configOptions.showInfo}\n showSearch={configOptions.showSearch}\n showSettings={configOptions.showSettings}\n showThemeSwitch={configOptions.showThemeSwitch}\n username={userState?.username}\n />\n </InnerNavBar>\n <HeaderSettingsDialog\n isOpen={isSettingsDialogOpen}\n onCloseDialog={() => setSettingsDialogOpen(false)}\n />\n {HeaderInfoDialog ? (\n <HeaderInfoDialog\n dialogTitle={t('dialog.registry-info.title')}\n isOpen={isInfoDialogOpen}\n onCloseDialog={() => setOpenInfoDialog(false)}\n />\n ) : null}\n </NavBar>\n {showMobileNavBar && (\n <MobileNavBar data-testid=\"mobile-nav-bar\">\n <InnerMobileNavBar>\n <Search />\n </InnerMobileNavBar>\n <Button color=\"inherit\" onClick={() => setShowMobileNavBar(false)}>\n {t('button.cancel')}\n </Button>\n </MobileNavBar>\n )}\n {!userState?.username && (\n <LoginDialog onClose={() => setShowLoginModal(false)} open={showLoginModal} />\n )}\n </>\n );\n};\n\nexport default Header;\n"],"mappings":";;;;;;;;;;;;;;;;;;AAgBA,IAAM,UAA2B,EAAE,kBAAkB,oBAAoB;CACvE,MAAM,EAAE,OAAA,GAAM,cAAA,eAAA,CAAe;CAC7B,MAAM,CAAC,kBAAkB,sBAAA,GAAqB,MAAA,SAAA,CAAkB,KAAK;CACrE,MAAM,CAAC,sBAAsB,0BAAA,GAAyB,MAAA,SAAA,CAAkB,KAAK;CAC7E,MAAM,CAAC,kBAAkB,wBAAA,GAAuB,MAAA,SAAA,CAAkB,KAAK;CACvE,MAAM,CAAC,gBAAgB,sBAAA,GAAqB,MAAA,SAAA,CAAkB,KAAK;CACnE,MAAM,EAAE,kBAAkB,iCAAA,UAAU;CACpC,MAAM,EAAE,WAAW,eAAe,qBAAA,QAAQ;CAG1C,MAAM,iBAAA,GAAgB,MAAA,OAAA,CAAO,UAAU;CACvC,CAAA,GAAA,MAAA,UAAA,OAAgB;EACd,cAAc,UAAU;CAC1B,GAAG,CAAC,UAAU,CAAC;CAIf,CAAA,GAAA,MAAA,UAAA,OAAgB;EACd,MAAM,QAAQ,WAAW;EACzB,IAAI,CAAC,OACH;EAEF,IAAI;EACJ,MAAM,YAAY;GAChB,MAAM,YAAY,cAAA,gBAAgB,KAAK;GACvC,IAAI,cAAc,QAAQ,aAAa,GAAG;IACxC,cAAc,UAAU;IACxB;GACF;GAEA,QAAQ,WAAW,KAAK,KAAK,IAAI,WAAW,KAAK,KAAK,CAAC,CAAC;EAC1D;EACA,IAAI;EACJ,aAAa,aAAa,KAAK;CACjC,GAAG,CAAC,WAAW,KAAK,CAAC;CAErB,MAAM,qBAAqB;EACzB,aAAa;EACb,kBAAkB,KAAK;CACzB;CACA,IAAI,eACF,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,eAAA,QAAD;EAAQ,eAAY;EAAS,UAAS;EACpC,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,eAAA,aAAD;GAAa,eAAY;GAAzB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,mBAAA,SAAD,EAAY,YAAY,MAAQ,CAAA,GAChC,iBAAA,GAAA,kBAAA,IAAA,CAAC,oBAAA,SAAD;IACE,UAAU;IACV,gBAAgB,CAAC;IACjB,gCAAgC,CAAC;IACjC,4BAA4B,CAAC;IAC7B,qBAAqB,CAAC;IACtB,yBAAyB,CAAC;IAC1B,UAAU;IACV,YAAY;IACZ,cAAc;IACd,iBAAiB;IACjB,UAAU;GACX,CAAA,CACU;;CACP,CAAA;CAIZ,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA;EACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,eAAA,QAAD;GAAQ,eAAY;GAAS,UAAS;GAAtC,UAAA;IACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,eAAA,aAAD;KAAa,eAAY;KAAzB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,mBAAA,SAAD,EAAY,YAAY,cAAc,WAAa,CAAA,GACnD,iBAAA,GAAA,kBAAA,IAAA,CAAC,oBAAA,SAAD;MACE,UAAU,eAAe;MACzB,UAAU;MACV,gCAAgC,kBAAkB,IAAI;MACtD,4BAA4B,sBAAsB,IAAI;MACtD,qBAAqB,kBAAkB,CAAC,cAAc;MACtD,yBAAyB,oBAAoB,CAAC,gBAAgB;MAC9D,UAAU,cAAc;MACxB,YAAY,cAAc;MAC1B,cAAc,cAAc;MAC5B,iBAAiB,cAAc;MAC/B,UAAU,WAAW;KACtB,CAAA,CACU;;IACb,iBAAA,GAAA,kBAAA,IAAA,CAAC,6BAAA,SAAD;KACE,QAAQ;KACR,qBAAqB,sBAAsB,KAAK;IACjD,CAAA;IACA,mBACC,iBAAA,GAAA,kBAAA,IAAA,CAAC,kBAAD;KACE,aAAa,EAAE,4BAA4B;KAC3C,QAAQ;KACR,qBAAqB,kBAAkB,KAAK;IAC7C,CAAA,IACC;GACE;;EACP,oBACC,iBAAA,GAAA,kBAAA,KAAA,CAAC,eAAA,cAAD;GAAc,eAAY;GAA1B,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,eAAA,mBAAD,EAAA,UACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,eAAA,SAAD,CAAS,CAAA,EACQ,CAAA,GACnB,iBAAA,GAAA,kBAAA,IAAA,CAAC,qBAAA,SAAD;IAAQ,OAAM;IAAU,eAAe,oBAAoB,KAAK;IAC7D,UAAA,EAAE,eAAe;GACZ,CAAA,CACI;;EAEf,CAAC,WAAW,YACX,iBAAA,GAAA,kBAAA,IAAA,CAAC,oBAAA,SAAD;GAAa,eAAe,kBAAkB,KAAK;GAAG,MAAM;EAAiB,CAAA;CAE/E,EAAA,CAAA;AAEN"}
@@ -1,4 +1,4 @@
1
- import { isTokenExpire } from "../../utils/token.mjs";
1
+ import { tokenExpireInMs } from "../../utils/token.mjs";
2
2
  import { useConfig } from "../../providers/AppConfigurationProvider/AppConfigurationProvider.mjs";
3
3
  import { useAuth } from "../../providers/AuthProvider/AuthProvider.mjs";
4
4
  import LoginDialog from "../../components/LoginDialog/LoginDialog.mjs";
@@ -9,11 +9,11 @@ import HeaderRight from "./HeaderRight.mjs";
9
9
  import HeaderSettingsDialog from "./HeaderSettingsDialog.mjs";
10
10
  import "../../index.mjs";
11
11
  import { useEffect, useRef, useState } from "react";
12
- import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
13
12
  import { useTranslation } from "react-i18next";
13
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
14
14
  import Button from "@mui/material/Button";
15
15
  //#region src/sections/Header/Header.tsx
16
- var Header = ({ HeaderInfoDialog, isPlainHeader, tokenCheckIntervalMs = 36e5 }) => {
16
+ var Header = ({ HeaderInfoDialog, isPlainHeader }) => {
17
17
  const { t } = useTranslation();
18
18
  const [isInfoDialogOpen, setOpenInfoDialog] = useState(false);
19
19
  const [isSettingsDialogOpen, setSettingsDialogOpen] = useState(false);
@@ -21,23 +21,25 @@ var Header = ({ HeaderInfoDialog, isPlainHeader, tokenCheckIntervalMs = 36e5 })
21
21
  const [showLoginModal, setShowLoginModal] = useState(false);
22
22
  const { configOptions } = useConfig();
23
23
  const { userState, logOutUser } = useAuth();
24
- const tokenRef = useRef(userState?.token);
25
24
  const logOutUserRef = useRef(logOutUser);
26
- useEffect(() => {
27
- tokenRef.current = userState?.token;
28
- }, [userState?.token]);
29
25
  useEffect(() => {
30
26
  logOutUserRef.current = logOutUser;
31
27
  }, [logOutUser]);
32
28
  useEffect(() => {
33
- function checkToken() {
34
- const token = tokenRef.current;
35
- if (token && isTokenExpire(token)) logOutUserRef.current?.();
36
- }
37
- checkToken();
38
- const interval = setInterval(checkToken, tokenCheckIntervalMs);
39
- return () => clearInterval(interval);
40
- }, [tokenCheckIntervalMs]);
29
+ const token = userState?.token;
30
+ if (!token) return;
31
+ let timer;
32
+ const arm = () => {
33
+ const remaining = tokenExpireInMs(token);
34
+ if (remaining === null || remaining <= 0) {
35
+ logOutUserRef.current?.();
36
+ return;
37
+ }
38
+ timer = setTimeout(arm, Math.min(remaining, 2 ** 31 - 1));
39
+ };
40
+ arm();
41
+ return () => clearTimeout(timer);
42
+ }, [userState?.token]);
41
43
  const handleLogout = () => {
42
44
  logOutUser?.();
43
45
  setShowLoginModal(false);
@@ -1 +1 @@
1
- {"version":3,"file":"Header.mjs","names":[],"sources":["../../../src/sections/Header/Header.tsx"],"sourcesContent":["import Button from '@mui/material/Button';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { LoginDialog, Search, useAuth, useConfig } from '../../';\nimport { isTokenExpire } from '../../utils/token';\nimport HeaderLeft from './HeaderLeft';\nimport HeaderRight from './HeaderRight';\nimport HeaderSettingsDialog from './HeaderSettingsDialog';\nimport { InnerMobileNavBar, InnerNavBar, MobileNavBar, NavBar } from './styles';\n\ntype Props = {\n HeaderInfoDialog?: React.FC<any>;\n isPlainHeader?: boolean;\n tokenCheckIntervalMs?: number;\n};\n\n// Session timeout default is 1 hour\nconst Header: React.FC<Props> = ({\n HeaderInfoDialog,\n isPlainHeader,\n tokenCheckIntervalMs = 60 * 60 * 1000,\n}) => {\n const { t } = useTranslation();\n const [isInfoDialogOpen, setOpenInfoDialog] = useState<boolean>(false);\n const [isSettingsDialogOpen, setSettingsDialogOpen] = useState<boolean>(false);\n const [showMobileNavBar, setShowMobileNavBar] = useState<boolean>(false);\n const [showLoginModal, setShowLoginModal] = useState<boolean>(false);\n const { configOptions } = useConfig();\n const { userState, logOutUser } = useAuth();\n\n // Use refs to always have the latest token/logout in the interval callback\n const tokenRef = useRef(userState?.token);\n const logOutUserRef = useRef(logOutUser);\n useEffect(() => {\n tokenRef.current = userState?.token;\n }, [userState?.token]);\n useEffect(() => {\n logOutUserRef.current = logOutUser;\n }, [logOutUser]);\n\n useEffect(() => {\n function checkToken() {\n const token = tokenRef.current;\n if (token && isTokenExpire(token)) {\n logOutUserRef.current?.();\n }\n }\n checkToken();\n const interval = setInterval(checkToken, tokenCheckIntervalMs);\n return () => clearInterval(interval);\n }, [tokenCheckIntervalMs]);\n\n const handleLogout = () => {\n logOutUser?.();\n setShowLoginModal(false);\n };\n if (isPlainHeader) {\n return (\n <NavBar data-testid=\"header\" position=\"static\">\n <InnerNavBar data-testid=\"inner-nav-bar\">\n <HeaderLeft showSearch={false} />\n <HeaderRight\n hasLogin={false}\n onLogout={() => {}}\n onOpenRegistryInfoDialog={() => {}}\n onOpenSettingsDialog={() => {}}\n onToggleLogin={() => {}}\n onToggleMobileNav={() => {}}\n showInfo={false}\n showSearch={false}\n showSettings={false}\n showThemeSwitch={false}\n username={''}\n />\n </InnerNavBar>\n </NavBar>\n );\n }\n\n return (\n <>\n <NavBar data-testid=\"header\" position=\"static\">\n <InnerNavBar data-testid=\"inner-nav-bar\">\n <HeaderLeft showSearch={configOptions.showSearch} />\n <HeaderRight\n hasLogin={configOptions?.login}\n onLogout={handleLogout}\n onOpenRegistryInfoDialog={() => setOpenInfoDialog(true)}\n onOpenSettingsDialog={() => setSettingsDialogOpen(true)}\n onToggleLogin={() => setShowLoginModal(!showLoginModal)}\n onToggleMobileNav={() => setShowMobileNavBar(!showMobileNavBar)}\n showInfo={configOptions.showInfo}\n showSearch={configOptions.showSearch}\n showSettings={configOptions.showSettings}\n showThemeSwitch={configOptions.showThemeSwitch}\n username={userState?.username}\n />\n </InnerNavBar>\n <HeaderSettingsDialog\n isOpen={isSettingsDialogOpen}\n onCloseDialog={() => setSettingsDialogOpen(false)}\n />\n {HeaderInfoDialog ? (\n <HeaderInfoDialog\n dialogTitle={t('dialog.registry-info.title')}\n isOpen={isInfoDialogOpen}\n onCloseDialog={() => setOpenInfoDialog(false)}\n />\n ) : null}\n </NavBar>\n {showMobileNavBar && (\n <MobileNavBar data-testid=\"mobile-nav-bar\">\n <InnerMobileNavBar>\n <Search />\n </InnerMobileNavBar>\n <Button color=\"inherit\" onClick={() => setShowMobileNavBar(false)}>\n {t('button.cancel')}\n </Button>\n </MobileNavBar>\n )}\n {!userState?.username && (\n <LoginDialog onClose={() => setShowLoginModal(false)} open={showLoginModal} />\n )}\n </>\n );\n};\n\nexport default Header;\n"],"mappings":";;;;;;;;;;;;;;;AAkBA,IAAM,UAA2B,EAC/B,kBACA,eACA,uBAAuB,WACnB;CACJ,MAAM,EAAE,MAAM,eAAe;CAC7B,MAAM,CAAC,kBAAkB,qBAAqB,SAAkB,KAAK;CACrE,MAAM,CAAC,sBAAsB,yBAAyB,SAAkB,KAAK;CAC7E,MAAM,CAAC,kBAAkB,uBAAuB,SAAkB,KAAK;CACvE,MAAM,CAAC,gBAAgB,qBAAqB,SAAkB,KAAK;CACnE,MAAM,EAAE,kBAAkB,UAAU;CACpC,MAAM,EAAE,WAAW,eAAe,QAAQ;CAG1C,MAAM,WAAW,OAAO,WAAW,KAAK;CACxC,MAAM,gBAAgB,OAAO,UAAU;CACvC,gBAAgB;EACd,SAAS,UAAU,WAAW;CAChC,GAAG,CAAC,WAAW,KAAK,CAAC;CACrB,gBAAgB;EACd,cAAc,UAAU;CAC1B,GAAG,CAAC,UAAU,CAAC;CAEf,gBAAgB;EACd,SAAS,aAAa;GACpB,MAAM,QAAQ,SAAS;GACvB,IAAI,SAAS,cAAc,KAAK,GAC9B,cAAc,UAAU;EAE5B;EACA,WAAW;EACX,MAAM,WAAW,YAAY,YAAY,oBAAoB;EAC7D,aAAa,cAAc,QAAQ;CACrC,GAAG,CAAC,oBAAoB,CAAC;CAEzB,MAAM,qBAAqB;EACzB,aAAa;EACb,kBAAkB,KAAK;CACzB;CACA,IAAI,eACF,OACE,oBAAC,QAAD;EAAQ,eAAY;EAAS,UAAS;EACpC,UAAA,qBAAC,aAAD;GAAa,eAAY;GAAzB,UAAA,CACE,oBAAC,YAAD,EAAY,YAAY,MAAQ,CAAA,GAChC,oBAAC,aAAD;IACE,UAAU;IACV,gBAAgB,CAAC;IACjB,gCAAgC,CAAC;IACjC,4BAA4B,CAAC;IAC7B,qBAAqB,CAAC;IACtB,yBAAyB,CAAC;IAC1B,UAAU;IACV,YAAY;IACZ,cAAc;IACd,iBAAiB;IACjB,UAAU;GACX,CAAA,CACU;;CACP,CAAA;CAIZ,OACE,qBAAA,YAAA,EAAA,UAAA;EACE,qBAAC,QAAD;GAAQ,eAAY;GAAS,UAAS;GAAtC,UAAA;IACE,qBAAC,aAAD;KAAa,eAAY;KAAzB,UAAA,CACE,oBAAC,YAAD,EAAY,YAAY,cAAc,WAAa,CAAA,GACnD,oBAAC,aAAD;MACE,UAAU,eAAe;MACzB,UAAU;MACV,gCAAgC,kBAAkB,IAAI;MACtD,4BAA4B,sBAAsB,IAAI;MACtD,qBAAqB,kBAAkB,CAAC,cAAc;MACtD,yBAAyB,oBAAoB,CAAC,gBAAgB;MAC9D,UAAU,cAAc;MACxB,YAAY,cAAc;MAC1B,cAAc,cAAc;MAC5B,iBAAiB,cAAc;MAC/B,UAAU,WAAW;KACtB,CAAA,CACU;;IACb,oBAAC,sBAAD;KACE,QAAQ;KACR,qBAAqB,sBAAsB,KAAK;IACjD,CAAA;IACA,mBACC,oBAAC,kBAAD;KACE,aAAa,EAAE,4BAA4B;KAC3C,QAAQ;KACR,qBAAqB,kBAAkB,KAAK;IAC7C,CAAA,IACC;GACE;;EACP,oBACC,qBAAC,cAAD;GAAc,eAAY;GAA1B,UAAA,CACE,oBAAC,mBAAD,EAAA,UACE,oBAAC,QAAD,CAAS,CAAA,EACQ,CAAA,GACnB,oBAAC,QAAD;IAAQ,OAAM;IAAU,eAAe,oBAAoB,KAAK;IAC7D,UAAA,EAAE,eAAe;GACZ,CAAA,CACI;;EAEf,CAAC,WAAW,YACX,oBAAC,aAAD;GAAa,eAAe,kBAAkB,KAAK;GAAG,MAAM;EAAiB,CAAA;CAE/E,EAAA,CAAA;AAEN"}
1
+ {"version":3,"file":"Header.mjs","names":[],"sources":["../../../src/sections/Header/Header.tsx"],"sourcesContent":["import Button from '@mui/material/Button';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { LoginDialog, Search, useAuth, useConfig } from '../../';\nimport { tokenExpireInMs } from '../../utils/token';\nimport HeaderLeft from './HeaderLeft';\nimport HeaderRight from './HeaderRight';\nimport HeaderSettingsDialog from './HeaderSettingsDialog';\nimport { InnerMobileNavBar, InnerNavBar, MobileNavBar, NavBar } from './styles';\n\ntype Props = {\n HeaderInfoDialog?: React.FC<any>;\n isPlainHeader?: boolean;\n};\n\nconst Header: React.FC<Props> = ({ HeaderInfoDialog, isPlainHeader }) => {\n const { t } = useTranslation();\n const [isInfoDialogOpen, setOpenInfoDialog] = useState<boolean>(false);\n const [isSettingsDialogOpen, setSettingsDialogOpen] = useState<boolean>(false);\n const [showMobileNavBar, setShowMobileNavBar] = useState<boolean>(false);\n const [showLoginModal, setShowLoginModal] = useState<boolean>(false);\n const { configOptions } = useConfig();\n const { userState, logOutUser } = useAuth();\n\n // Use a ref to always have the latest logout in the timer callback\n const logOutUserRef = useRef(logOutUser);\n useEffect(() => {\n logOutUserRef.current = logOutUser;\n }, [logOutUser]);\n\n // log out exactly when the token expires; polling reloaded the page at an\n // arbitrary moment up to a minute later, mid-interaction\n useEffect(() => {\n const token = userState?.token;\n if (!token) {\n return;\n }\n let timer: ReturnType<typeof setTimeout> | undefined;\n const arm = () => {\n const remaining = tokenExpireInMs(token);\n if (remaining === null || remaining <= 0) {\n logOutUserRef.current?.();\n return;\n }\n // setTimeout overflows above 2^31-1 ms; re-arm for far-away expiries\n timer = setTimeout(arm, Math.min(remaining, 2 ** 31 - 1));\n };\n arm();\n return () => clearTimeout(timer);\n }, [userState?.token]);\n\n const handleLogout = () => {\n logOutUser?.();\n setShowLoginModal(false);\n };\n if (isPlainHeader) {\n return (\n <NavBar data-testid=\"header\" position=\"static\">\n <InnerNavBar data-testid=\"inner-nav-bar\">\n <HeaderLeft showSearch={false} />\n <HeaderRight\n hasLogin={false}\n onLogout={() => {}}\n onOpenRegistryInfoDialog={() => {}}\n onOpenSettingsDialog={() => {}}\n onToggleLogin={() => {}}\n onToggleMobileNav={() => {}}\n showInfo={false}\n showSearch={false}\n showSettings={false}\n showThemeSwitch={false}\n username={''}\n />\n </InnerNavBar>\n </NavBar>\n );\n }\n\n return (\n <>\n <NavBar data-testid=\"header\" position=\"static\">\n <InnerNavBar data-testid=\"inner-nav-bar\">\n <HeaderLeft showSearch={configOptions.showSearch} />\n <HeaderRight\n hasLogin={configOptions?.login}\n onLogout={handleLogout}\n onOpenRegistryInfoDialog={() => setOpenInfoDialog(true)}\n onOpenSettingsDialog={() => setSettingsDialogOpen(true)}\n onToggleLogin={() => setShowLoginModal(!showLoginModal)}\n onToggleMobileNav={() => setShowMobileNavBar(!showMobileNavBar)}\n showInfo={configOptions.showInfo}\n showSearch={configOptions.showSearch}\n showSettings={configOptions.showSettings}\n showThemeSwitch={configOptions.showThemeSwitch}\n username={userState?.username}\n />\n </InnerNavBar>\n <HeaderSettingsDialog\n isOpen={isSettingsDialogOpen}\n onCloseDialog={() => setSettingsDialogOpen(false)}\n />\n {HeaderInfoDialog ? (\n <HeaderInfoDialog\n dialogTitle={t('dialog.registry-info.title')}\n isOpen={isInfoDialogOpen}\n onCloseDialog={() => setOpenInfoDialog(false)}\n />\n ) : null}\n </NavBar>\n {showMobileNavBar && (\n <MobileNavBar data-testid=\"mobile-nav-bar\">\n <InnerMobileNavBar>\n <Search />\n </InnerMobileNavBar>\n <Button color=\"inherit\" onClick={() => setShowMobileNavBar(false)}>\n {t('button.cancel')}\n </Button>\n </MobileNavBar>\n )}\n {!userState?.username && (\n <LoginDialog onClose={() => setShowLoginModal(false)} open={showLoginModal} />\n )}\n </>\n );\n};\n\nexport default Header;\n"],"mappings":";;;;;;;;;;;;;;;AAgBA,IAAM,UAA2B,EAAE,kBAAkB,oBAAoB;CACvE,MAAM,EAAE,MAAM,eAAe;CAC7B,MAAM,CAAC,kBAAkB,qBAAqB,SAAkB,KAAK;CACrE,MAAM,CAAC,sBAAsB,yBAAyB,SAAkB,KAAK;CAC7E,MAAM,CAAC,kBAAkB,uBAAuB,SAAkB,KAAK;CACvE,MAAM,CAAC,gBAAgB,qBAAqB,SAAkB,KAAK;CACnE,MAAM,EAAE,kBAAkB,UAAU;CACpC,MAAM,EAAE,WAAW,eAAe,QAAQ;CAG1C,MAAM,gBAAgB,OAAO,UAAU;CACvC,gBAAgB;EACd,cAAc,UAAU;CAC1B,GAAG,CAAC,UAAU,CAAC;CAIf,gBAAgB;EACd,MAAM,QAAQ,WAAW;EACzB,IAAI,CAAC,OACH;EAEF,IAAI;EACJ,MAAM,YAAY;GAChB,MAAM,YAAY,gBAAgB,KAAK;GACvC,IAAI,cAAc,QAAQ,aAAa,GAAG;IACxC,cAAc,UAAU;IACxB;GACF;GAEA,QAAQ,WAAW,KAAK,KAAK,IAAI,WAAW,KAAK,KAAK,CAAC,CAAC;EAC1D;EACA,IAAI;EACJ,aAAa,aAAa,KAAK;CACjC,GAAG,CAAC,WAAW,KAAK,CAAC;CAErB,MAAM,qBAAqB;EACzB,aAAa;EACb,kBAAkB,KAAK;CACzB;CACA,IAAI,eACF,OACE,oBAAC,QAAD;EAAQ,eAAY;EAAS,UAAS;EACpC,UAAA,qBAAC,aAAD;GAAa,eAAY;GAAzB,UAAA,CACE,oBAAC,YAAD,EAAY,YAAY,MAAQ,CAAA,GAChC,oBAAC,aAAD;IACE,UAAU;IACV,gBAAgB,CAAC;IACjB,gCAAgC,CAAC;IACjC,4BAA4B,CAAC;IAC7B,qBAAqB,CAAC;IACtB,yBAAyB,CAAC;IAC1B,UAAU;IACV,YAAY;IACZ,cAAc;IACd,iBAAiB;IACjB,UAAU;GACX,CAAA,CACU;;CACP,CAAA;CAIZ,OACE,qBAAA,YAAA,EAAA,UAAA;EACE,qBAAC,QAAD;GAAQ,eAAY;GAAS,UAAS;GAAtC,UAAA;IACE,qBAAC,aAAD;KAAa,eAAY;KAAzB,UAAA,CACE,oBAAC,YAAD,EAAY,YAAY,cAAc,WAAa,CAAA,GACnD,oBAAC,aAAD;MACE,UAAU,eAAe;MACzB,UAAU;MACV,gCAAgC,kBAAkB,IAAI;MACtD,4BAA4B,sBAAsB,IAAI;MACtD,qBAAqB,kBAAkB,CAAC,cAAc;MACtD,yBAAyB,oBAAoB,CAAC,gBAAgB;MAC9D,UAAU,cAAc;MACxB,YAAY,cAAc;MAC1B,cAAc,cAAc;MAC5B,iBAAiB,cAAc;MAC/B,UAAU,WAAW;KACtB,CAAA,CACU;;IACb,oBAAC,sBAAD;KACE,QAAQ;KACR,qBAAqB,sBAAsB,KAAK;IACjD,CAAA;IACA,mBACC,oBAAC,kBAAD;KACE,aAAa,EAAE,4BAA4B;KAC3C,QAAQ;KACR,qBAAqB,kBAAkB,KAAK;IAC7C,CAAA,IACC;GACE;;EACP,oBACC,qBAAC,cAAD;GAAc,eAAY;GAA1B,UAAA,CACE,oBAAC,mBAAD,EAAA,UACE,oBAAC,QAAD,CAAS,CAAA,EACQ,CAAA,GACnB,oBAAC,QAAD;IAAQ,OAAM;IAAU,eAAe,oBAAoB,KAAK;IAC7D,UAAA,EAAE,eAAe;GACZ,CAAA,CACI;;EAEf,CAAC,WAAW,YACX,oBAAC,aAAD;GAAa,eAAe,kBAAkB,KAAK;GAAG,MAAM;EAAiB,CAAA;CAE/E,EAAA,CAAA;AAEN"}
@@ -4,8 +4,8 @@ const require_styles = require("./styles.js");
4
4
  require("../../index.js");
5
5
  let react = require("react");
6
6
  react = require_runtime.__toESM(react);
7
- let react_jsx_runtime = require("react/jsx-runtime");
8
7
  let react_i18next = require("react-i18next");
8
+ let react_jsx_runtime = require("react/jsx-runtime");
9
9
  //#region src/sections/Header/HeaderGreetings.tsx
10
10
  var HeaderGreetings = ({ username }) => {
11
11
  const { t } = (0, react_i18next.useTranslation)();
@@ -2,8 +2,8 @@ import Label from "../../components/Label/Label.mjs";
2
2
  import { Greetings } from "./styles.mjs";
3
3
  import "../../index.mjs";
4
4
  import "react";
5
- import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
6
5
  import { useTranslation } from "react-i18next";
6
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
7
7
  //#region src/sections/Header/HeaderGreetings.tsx
8
8
  var HeaderGreetings = ({ username }) => {
9
9
  const { t } = useTranslation();
@@ -1,4 +1,7 @@
1
1
  const require_runtime = require("../../_virtual/_rolldown/runtime.js");
2
+ const require_routes = require("../../utils/routes.js");
3
+ require("../../utils/index.js");
4
+ const require_AppConfigurationProvider = require("../../providers/AppConfigurationProvider/AppConfigurationProvider.js");
2
5
  const require_MenuItem = require("../../components/MenuItem/MenuItem.js");
3
6
  const require_HeaderGreetings = require("./HeaderGreetings.js");
4
7
  require("../../index.js");
@@ -6,8 +9,9 @@ let _mui_material_IconButton = require("@mui/material/IconButton");
6
9
  _mui_material_IconButton = require_runtime.__toESM(_mui_material_IconButton);
7
10
  let react = require("react");
8
11
  react = require_runtime.__toESM(react);
9
- let react_jsx_runtime = require("react/jsx-runtime");
10
12
  let react_i18next = require("react-i18next");
13
+ let react_jsx_runtime = require("react/jsx-runtime");
14
+ let react_router = require("react-router");
11
15
  let _mui_material_Menu = require("@mui/material/Menu");
12
16
  _mui_material_Menu = require_runtime.__toESM(_mui_material_Menu);
13
17
  let _mui_icons_material_AccountCircle = require("@mui/icons-material/AccountCircle");
@@ -16,6 +20,9 @@ _mui_icons_material_AccountCircle = require_runtime.__toESM(_mui_icons_material_
16
20
  var TypedMenu = _mui_material_Menu.default;
17
21
  var HeaderMenu = ({ onLogout, username, isMenuOpen = false, anchorEl, onLoggedInMenu, onLoggedInMenuClose }) => {
18
22
  const { t } = (0, react_i18next.useTranslation)();
23
+ const navigate = (0, react_router.useNavigate)();
24
+ const { configOptions } = require_AppConfigurationProvider.useConfig();
25
+ const stageEnabled = configOptions?.flags?.stage;
19
26
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_IconButton.default, {
20
27
  color: "inherit",
21
28
  "data-testid": "logInDialogIcon",
@@ -35,12 +42,24 @@ var HeaderMenu = ({ onLogout, username, isMenuOpen = false, anchorEl, onLoggedIn
35
42
  vertical: "top",
36
43
  horizontal: "right"
37
44
  },
38
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_MenuItem.default, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_HeaderGreetings.default, { username }) }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_MenuItem.default, {
39
- "data-testid": "logOutDialogIcon",
40
- id: "logOutDialogIcon",
41
- onClick: onLogout,
42
- children: t("button.logout")
43
- })]
45
+ children: [
46
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_MenuItem.default, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_HeaderGreetings.default, { username }) }),
47
+ stageEnabled && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_MenuItem.default, {
48
+ "data-testid": "stagedPackagesMenuItem",
49
+ id: "stagedPackagesMenuItem",
50
+ onClick: () => {
51
+ onLoggedInMenuClose();
52
+ navigate(require_routes.Route.STAGE);
53
+ },
54
+ children: t("stage.menu")
55
+ }),
56
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_MenuItem.default, {
57
+ "data-testid": "logOutDialogIcon",
58
+ id: "logOutDialogIcon",
59
+ onClick: onLogout,
60
+ children: t("button.logout")
61
+ })
62
+ ]
44
63
  })] });
45
64
  };
46
65
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"HeaderMenu.js","names":[],"sources":["../../../src/sections/Header/HeaderMenu.tsx"],"sourcesContent":["import AccountCircle from '@mui/icons-material/AccountCircle';\nimport IconButton from '@mui/material/IconButton';\nimport Menu from '@mui/material/Menu';\nimport type { MouseEvent } from 'react';\nimport React from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { MenuItem } from '../../';\nimport HeaderGreetings from './HeaderGreetings';\n\n// Workaround: MUI v7 MenuProps type resolution breaks inherited PopoverProps.\nconst TypedMenu = Menu as React.FC<any>;\n\ninterface Props {\n username: string;\n isMenuOpen: boolean;\n anchorEl?: Element | null | undefined;\n onLogout: () => void;\n onLoggedInMenu: (event: MouseEvent<HTMLButtonElement>) => void;\n onLoggedInMenuClose: () => void;\n}\n\nconst HeaderMenu: React.FC<Props> = ({\n onLogout,\n username,\n isMenuOpen = false,\n anchorEl,\n onLoggedInMenu,\n onLoggedInMenuClose,\n}) => {\n const { t } = useTranslation();\n return (\n <>\n <IconButton\n color=\"inherit\"\n data-testid=\"logInDialogIcon\"\n id=\"header--button-account\"\n onClick={onLoggedInMenu}\n size=\"large\"\n >\n <AccountCircle />\n </IconButton>\n <TypedMenu\n anchorEl={anchorEl}\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'right',\n }}\n onClose={onLoggedInMenuClose}\n open={isMenuOpen}\n transformOrigin={{\n vertical: 'top',\n horizontal: 'right',\n }}\n >\n <MenuItem>\n <HeaderGreetings username={username} />\n </MenuItem>\n <MenuItem data-testid=\"logOutDialogIcon\" id=\"logOutDialogIcon\" onClick={onLogout}>\n {t('button.logout')}\n </MenuItem>\n </TypedMenu>\n </>\n );\n};\n\nexport default HeaderMenu;\n"],"mappings":";;;;;;;;;;;;;;;AAWA,IAAM,YAAY,mBAAA;AAWlB,IAAM,cAA+B,EACnC,UACA,UACA,aAAa,OACb,UACA,gBACA,0BACI;CACJ,MAAM,EAAE,OAAA,GAAM,cAAA,eAAA,CAAe;CAC7B,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,yBAAA,SAAD;EACE,OAAM;EACN,eAAY;EACZ,IAAG;EACH,SAAS;EACT,MAAK;EAEL,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,kCAAA,SAAD,CAAgB,CAAA;CACN,CAAA,GACZ,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;EACY;EACV,cAAc;GACZ,UAAU;GACV,YAAY;EACd;EACA,SAAS;EACT,MAAM;EACN,iBAAiB;GACf,UAAU;GACV,YAAY;EACd;EAXF,UAAA,CAaE,iBAAA,GAAA,kBAAA,IAAA,CAAC,iBAAA,SAAD,EAAA,UACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,wBAAA,SAAD,EAA2B,SAAW,CAAA,EAC9B,CAAA,GACV,iBAAA,GAAA,kBAAA,IAAA,CAAC,iBAAA,SAAD;GAAU,eAAY;GAAmB,IAAG;GAAmB,SAAS;GACrE,UAAA,EAAE,eAAe;EACV,CAAA,CACD;CACX,CAAA,CAAA,EAAA,CAAA;AAEN"}
1
+ {"version":3,"file":"HeaderMenu.js","names":[],"sources":["../../../src/sections/Header/HeaderMenu.tsx"],"sourcesContent":["import AccountCircle from '@mui/icons-material/AccountCircle';\nimport IconButton from '@mui/material/IconButton';\nimport Menu from '@mui/material/Menu';\nimport type { MouseEvent } from 'react';\nimport React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useNavigate } from 'react-router';\n\nimport { MenuItem } from '../../';\nimport { useConfig } from '../../providers/AppConfigurationProvider/AppConfigurationProvider';\nimport { Route } from '../../utils';\nimport HeaderGreetings from './HeaderGreetings';\n\n// Workaround: MUI v7 MenuProps type resolution breaks inherited PopoverProps.\nconst TypedMenu = Menu as React.FC<any>;\n\ninterface Props {\n username: string;\n isMenuOpen: boolean;\n anchorEl?: Element | null | undefined;\n onLogout: () => void;\n onLoggedInMenu: (event: MouseEvent<HTMLButtonElement>) => void;\n onLoggedInMenuClose: () => void;\n}\n\nconst HeaderMenu: React.FC<Props> = ({\n onLogout,\n username,\n isMenuOpen = false,\n anchorEl,\n onLoggedInMenu,\n onLoggedInMenuClose,\n}) => {\n const { t } = useTranslation();\n const navigate = useNavigate();\n const { configOptions } = useConfig();\n const stageEnabled = configOptions?.flags?.stage;\n return (\n <>\n <IconButton\n color=\"inherit\"\n data-testid=\"logInDialogIcon\"\n id=\"header--button-account\"\n onClick={onLoggedInMenu}\n size=\"large\"\n >\n <AccountCircle />\n </IconButton>\n <TypedMenu\n anchorEl={anchorEl}\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'right',\n }}\n onClose={onLoggedInMenuClose}\n open={isMenuOpen}\n transformOrigin={{\n vertical: 'top',\n horizontal: 'right',\n }}\n >\n <MenuItem>\n <HeaderGreetings username={username} />\n </MenuItem>\n {stageEnabled && (\n <MenuItem\n data-testid=\"stagedPackagesMenuItem\"\n id=\"stagedPackagesMenuItem\"\n onClick={() => {\n onLoggedInMenuClose();\n navigate(Route.STAGE);\n }}\n >\n {t('stage.menu')}\n </MenuItem>\n )}\n <MenuItem data-testid=\"logOutDialogIcon\" id=\"logOutDialogIcon\" onClick={onLogout}>\n {t('button.logout')}\n </MenuItem>\n </TypedMenu>\n </>\n );\n};\n\nexport default HeaderMenu;\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAcA,IAAM,YAAY,mBAAA;AAWlB,IAAM,cAA+B,EACnC,UACA,UACA,aAAa,OACb,UACA,gBACA,0BACI;CACJ,MAAM,EAAE,OAAA,GAAM,cAAA,eAAA,CAAe;CAC7B,MAAM,YAAA,GAAW,aAAA,YAAA,CAAY;CAC7B,MAAM,EAAE,kBAAkB,iCAAA,UAAU;CACpC,MAAM,eAAe,eAAe,OAAO;CAC3C,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,yBAAA,SAAD;EACE,OAAM;EACN,eAAY;EACZ,IAAG;EACH,SAAS;EACT,MAAK;EAEL,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,kCAAA,SAAD,CAAgB,CAAA;CACN,CAAA,GACZ,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;EACY;EACV,cAAc;GACZ,UAAU;GACV,YAAY;EACd;EACA,SAAS;EACT,MAAM;EACN,iBAAiB;GACf,UAAU;GACV,YAAY;EACd;EAXF,UAAA;GAaE,iBAAA,GAAA,kBAAA,IAAA,CAAC,iBAAA,SAAD,EAAA,UACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,wBAAA,SAAD,EAA2B,SAAW,CAAA,EAC9B,CAAA;GACT,gBACC,iBAAA,GAAA,kBAAA,IAAA,CAAC,iBAAA,SAAD;IACE,eAAY;IACZ,IAAG;IACH,eAAe;KACb,oBAAoB;KACpB,SAAS,eAAA,MAAM,KAAK;IACtB;IAEC,UAAA,EAAE,YAAY;GACP,CAAA;GAEZ,iBAAA,GAAA,kBAAA,IAAA,CAAC,iBAAA,SAAD;IAAU,eAAY;IAAmB,IAAG;IAAmB,SAAS;IACrE,UAAA,EAAE,eAAe;GACV,CAAA;EACD;CACX,CAAA,CAAA,EAAA,CAAA;AAEN"}
@@ -1,16 +1,23 @@
1
+ import { Route as Route$1 } from "../../utils/routes.mjs";
2
+ import "../../utils/index.mjs";
3
+ import { useConfig } from "../../providers/AppConfigurationProvider/AppConfigurationProvider.mjs";
1
4
  import MenuItem from "../../components/MenuItem/MenuItem.mjs";
2
5
  import HeaderGreetings from "./HeaderGreetings.mjs";
3
6
  import "../../index.mjs";
4
7
  import IconButton from "@mui/material/IconButton";
5
8
  import "react";
6
- import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
7
9
  import { useTranslation } from "react-i18next";
10
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
11
+ import { useNavigate } from "react-router";
8
12
  import Menu from "@mui/material/Menu";
9
13
  import AccountCircle from "@mui/icons-material/AccountCircle";
10
14
  //#region src/sections/Header/HeaderMenu.tsx
11
15
  var TypedMenu = Menu;
12
16
  var HeaderMenu = ({ onLogout, username, isMenuOpen = false, anchorEl, onLoggedInMenu, onLoggedInMenuClose }) => {
13
17
  const { t } = useTranslation();
18
+ const navigate = useNavigate();
19
+ const { configOptions } = useConfig();
20
+ const stageEnabled = configOptions?.flags?.stage;
14
21
  return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(IconButton, {
15
22
  color: "inherit",
16
23
  "data-testid": "logInDialogIcon",
@@ -30,12 +37,24 @@ var HeaderMenu = ({ onLogout, username, isMenuOpen = false, anchorEl, onLoggedIn
30
37
  vertical: "top",
31
38
  horizontal: "right"
32
39
  },
33
- children: [/* @__PURE__ */ jsx(MenuItem, { children: /* @__PURE__ */ jsx(HeaderGreetings, { username }) }), /* @__PURE__ */ jsx(MenuItem, {
34
- "data-testid": "logOutDialogIcon",
35
- id: "logOutDialogIcon",
36
- onClick: onLogout,
37
- children: t("button.logout")
38
- })]
40
+ children: [
41
+ /* @__PURE__ */ jsx(MenuItem, { children: /* @__PURE__ */ jsx(HeaderGreetings, { username }) }),
42
+ stageEnabled && /* @__PURE__ */ jsx(MenuItem, {
43
+ "data-testid": "stagedPackagesMenuItem",
44
+ id: "stagedPackagesMenuItem",
45
+ onClick: () => {
46
+ onLoggedInMenuClose();
47
+ navigate(Route$1.STAGE);
48
+ },
49
+ children: t("stage.menu")
50
+ }),
51
+ /* @__PURE__ */ jsx(MenuItem, {
52
+ "data-testid": "logOutDialogIcon",
53
+ id: "logOutDialogIcon",
54
+ onClick: onLogout,
55
+ children: t("button.logout")
56
+ })
57
+ ]
39
58
  })] });
40
59
  };
41
60
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"HeaderMenu.mjs","names":[],"sources":["../../../src/sections/Header/HeaderMenu.tsx"],"sourcesContent":["import AccountCircle from '@mui/icons-material/AccountCircle';\nimport IconButton from '@mui/material/IconButton';\nimport Menu from '@mui/material/Menu';\nimport type { MouseEvent } from 'react';\nimport React from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { MenuItem } from '../../';\nimport HeaderGreetings from './HeaderGreetings';\n\n// Workaround: MUI v7 MenuProps type resolution breaks inherited PopoverProps.\nconst TypedMenu = Menu as React.FC<any>;\n\ninterface Props {\n username: string;\n isMenuOpen: boolean;\n anchorEl?: Element | null | undefined;\n onLogout: () => void;\n onLoggedInMenu: (event: MouseEvent<HTMLButtonElement>) => void;\n onLoggedInMenuClose: () => void;\n}\n\nconst HeaderMenu: React.FC<Props> = ({\n onLogout,\n username,\n isMenuOpen = false,\n anchorEl,\n onLoggedInMenu,\n onLoggedInMenuClose,\n}) => {\n const { t } = useTranslation();\n return (\n <>\n <IconButton\n color=\"inherit\"\n data-testid=\"logInDialogIcon\"\n id=\"header--button-account\"\n onClick={onLoggedInMenu}\n size=\"large\"\n >\n <AccountCircle />\n </IconButton>\n <TypedMenu\n anchorEl={anchorEl}\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'right',\n }}\n onClose={onLoggedInMenuClose}\n open={isMenuOpen}\n transformOrigin={{\n vertical: 'top',\n horizontal: 'right',\n }}\n >\n <MenuItem>\n <HeaderGreetings username={username} />\n </MenuItem>\n <MenuItem data-testid=\"logOutDialogIcon\" id=\"logOutDialogIcon\" onClick={onLogout}>\n {t('button.logout')}\n </MenuItem>\n </TypedMenu>\n </>\n );\n};\n\nexport default HeaderMenu;\n"],"mappings":";;;;;;;;;;AAWA,IAAM,YAAY;AAWlB,IAAM,cAA+B,EACnC,UACA,UACA,aAAa,OACb,UACA,gBACA,0BACI;CACJ,MAAM,EAAE,MAAM,eAAe;CAC7B,OACE,qBAAA,YAAA,EAAA,UAAA,CACE,oBAAC,YAAD;EACE,OAAM;EACN,eAAY;EACZ,IAAG;EACH,SAAS;EACT,MAAK;EAEL,UAAA,oBAAC,eAAD,CAAgB,CAAA;CACN,CAAA,GACZ,qBAAC,WAAD;EACY;EACV,cAAc;GACZ,UAAU;GACV,YAAY;EACd;EACA,SAAS;EACT,MAAM;EACN,iBAAiB;GACf,UAAU;GACV,YAAY;EACd;EAXF,UAAA,CAaE,oBAAC,UAAD,EAAA,UACE,oBAAC,iBAAD,EAA2B,SAAW,CAAA,EAC9B,CAAA,GACV,oBAAC,UAAD;GAAU,eAAY;GAAmB,IAAG;GAAmB,SAAS;GACrE,UAAA,EAAE,eAAe;EACV,CAAA,CACD;CACX,CAAA,CAAA,EAAA,CAAA;AAEN"}
1
+ {"version":3,"file":"HeaderMenu.mjs","names":[],"sources":["../../../src/sections/Header/HeaderMenu.tsx"],"sourcesContent":["import AccountCircle from '@mui/icons-material/AccountCircle';\nimport IconButton from '@mui/material/IconButton';\nimport Menu from '@mui/material/Menu';\nimport type { MouseEvent } from 'react';\nimport React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useNavigate } from 'react-router';\n\nimport { MenuItem } from '../../';\nimport { useConfig } from '../../providers/AppConfigurationProvider/AppConfigurationProvider';\nimport { Route } from '../../utils';\nimport HeaderGreetings from './HeaderGreetings';\n\n// Workaround: MUI v7 MenuProps type resolution breaks inherited PopoverProps.\nconst TypedMenu = Menu as React.FC<any>;\n\ninterface Props {\n username: string;\n isMenuOpen: boolean;\n anchorEl?: Element | null | undefined;\n onLogout: () => void;\n onLoggedInMenu: (event: MouseEvent<HTMLButtonElement>) => void;\n onLoggedInMenuClose: () => void;\n}\n\nconst HeaderMenu: React.FC<Props> = ({\n onLogout,\n username,\n isMenuOpen = false,\n anchorEl,\n onLoggedInMenu,\n onLoggedInMenuClose,\n}) => {\n const { t } = useTranslation();\n const navigate = useNavigate();\n const { configOptions } = useConfig();\n const stageEnabled = configOptions?.flags?.stage;\n return (\n <>\n <IconButton\n color=\"inherit\"\n data-testid=\"logInDialogIcon\"\n id=\"header--button-account\"\n onClick={onLoggedInMenu}\n size=\"large\"\n >\n <AccountCircle />\n </IconButton>\n <TypedMenu\n anchorEl={anchorEl}\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'right',\n }}\n onClose={onLoggedInMenuClose}\n open={isMenuOpen}\n transformOrigin={{\n vertical: 'top',\n horizontal: 'right',\n }}\n >\n <MenuItem>\n <HeaderGreetings username={username} />\n </MenuItem>\n {stageEnabled && (\n <MenuItem\n data-testid=\"stagedPackagesMenuItem\"\n id=\"stagedPackagesMenuItem\"\n onClick={() => {\n onLoggedInMenuClose();\n navigate(Route.STAGE);\n }}\n >\n {t('stage.menu')}\n </MenuItem>\n )}\n <MenuItem data-testid=\"logOutDialogIcon\" id=\"logOutDialogIcon\" onClick={onLogout}>\n {t('button.logout')}\n </MenuItem>\n </TypedMenu>\n </>\n );\n};\n\nexport default HeaderMenu;\n"],"mappings":";;;;;;;;;;;;;;AAcA,IAAM,YAAY;AAWlB,IAAM,cAA+B,EACnC,UACA,UACA,aAAa,OACb,UACA,gBACA,0BACI;CACJ,MAAM,EAAE,MAAM,eAAe;CAC7B,MAAM,WAAW,YAAY;CAC7B,MAAM,EAAE,kBAAkB,UAAU;CACpC,MAAM,eAAe,eAAe,OAAO;CAC3C,OACE,qBAAA,YAAA,EAAA,UAAA,CACE,oBAAC,YAAD;EACE,OAAM;EACN,eAAY;EACZ,IAAG;EACH,SAAS;EACT,MAAK;EAEL,UAAA,oBAAC,eAAD,CAAgB,CAAA;CACN,CAAA,GACZ,qBAAC,WAAD;EACY;EACV,cAAc;GACZ,UAAU;GACV,YAAY;EACd;EACA,SAAS;EACT,MAAM;EACN,iBAAiB;GACf,UAAU;GACV,YAAY;EACd;EAXF,UAAA;GAaE,oBAAC,UAAD,EAAA,UACE,oBAAC,iBAAD,EAA2B,SAAW,CAAA,EAC9B,CAAA;GACT,gBACC,oBAAC,UAAD;IACE,eAAY;IACZ,IAAG;IACH,eAAe;KACb,oBAAoB;KACpB,SAAS,QAAM,KAAK;IACtB;IAEC,UAAA,EAAE,YAAY;GACP,CAAA;GAEZ,oBAAC,UAAD;IAAU,eAAY;IAAmB,IAAG;IAAmB,SAAS;IACrE,UAAA,EAAE,eAAe;GACV,CAAA;EACD;CACX,CAAA,CAAA,EAAA,CAAA;AAEN"}
@@ -5,8 +5,8 @@ const require_ThemeProvider = require("../../Theme/ThemeProvider.js");
5
5
  require("../../index.js");
6
6
  let react = require("react");
7
7
  react = require_runtime.__toESM(react);
8
- let react_jsx_runtime = require("react/jsx-runtime");
9
8
  let react_i18next = require("react-i18next");
9
+ let react_jsx_runtime = require("react/jsx-runtime");
10
10
  let _mui_material_Button = require("@mui/material/Button");
11
11
  _mui_material_Button = require_runtime.__toESM(_mui_material_Button);
12
12
  let _mui_material_Toolbar = require("@mui/material/Toolbar");
@@ -3,8 +3,8 @@ import HeaderToolTip from "./HeaderToolTip.mjs";
3
3
  import { useCustomTheme } from "../../Theme/ThemeProvider.mjs";
4
4
  import "../../index.mjs";
5
5
  import { useEffect, useState } from "react";
6
- import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
7
6
  import { useTranslation } from "react-i18next";
7
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
8
8
  import Button from "@mui/material/Button";
9
9
  import Toolbar from "@mui/material/Toolbar";
10
10
  //#region src/sections/Header/HeaderRight.tsx
@@ -9,10 +9,10 @@ let _emotion_styled = require("@emotion/styled");
9
9
  _emotion_styled = require_runtime.__toESM(_emotion_styled);
10
10
  let react = require("react");
11
11
  react = require_runtime.__toESM(react);
12
+ let react_i18next = require("react-i18next");
12
13
  let react_jsx_runtime = require("react/jsx-runtime");
13
14
  let _mui_material_Box = require("@mui/material/Box");
14
15
  _mui_material_Box = require_runtime.__toESM(_mui_material_Box);
15
- let react_i18next = require("react-i18next");
16
16
  let _mui_material_Tab = require("@mui/material/Tab");
17
17
  _mui_material_Tab = require_runtime.__toESM(_mui_material_Tab);
18
18
  let _mui_material_Tabs = require("@mui/material/Tabs");
@@ -6,9 +6,9 @@ import RegistryInfoContent from "./RegistryInfoContent/RegistryInfoContent.mjs";
6
6
  import "./RegistryInfoContent/index.mjs";
7
7
  import styled from "@emotion/styled";
8
8
  import React from "react";
9
+ import { useTranslation } from "react-i18next";
9
10
  import { jsx, jsxs } from "react/jsx-runtime";
10
11
  import Box from "@mui/material/Box";
11
- import { useTranslation } from "react-i18next";
12
12
  import Tab from "@mui/material/Tab";
13
13
  import Tabs from "@mui/material/Tabs";
14
14
  import ReactMarkdown from "react-markdown";
@@ -5,10 +5,10 @@ let _emotion_styled = require("@emotion/styled");
5
5
  _emotion_styled = require_runtime.__toESM(_emotion_styled);
6
6
  let react = require("react");
7
7
  react = require_runtime.__toESM(react);
8
+ let react_i18next = require("react-i18next");
8
9
  let react_jsx_runtime = require("react/jsx-runtime");
9
10
  let i18next = require("i18next");
10
11
  i18next = require_runtime.__toESM(i18next);
11
- let react_i18next = require("react-i18next");
12
12
  let _mui_material_Typography = require("@mui/material/Typography");
13
13
  _mui_material_Typography = require_runtime.__toESM(_mui_material_Typography);
14
14
  let _mui_material_Card = require("@mui/material/Card");
@@ -2,9 +2,9 @@ import { useLanguage } from "../../providers/TranslatorProvider/TranslatorProvid
2
2
  import "../../index.mjs";
3
3
  import styled from "@emotion/styled";
4
4
  import { useCallback, useState } from "react";
5
+ import { useTranslation } from "react-i18next";
5
6
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
6
7
  import i18next from "i18next";
7
- import { useTranslation } from "react-i18next";
8
8
  import Typography from "@mui/material/Typography";
9
9
  import Card from "@mui/material/Card";
10
10
  import CardContent from "@mui/material/CardContent";
@@ -8,10 +8,10 @@ let _emotion_styled = require("@emotion/styled");
8
8
  _emotion_styled = require_runtime.__toESM(_emotion_styled);
9
9
  let react = require("react");
10
10
  react = require_runtime.__toESM(react);
11
+ let react_i18next = require("react-i18next");
11
12
  let react_jsx_runtime = require("react/jsx-runtime");
12
13
  let _mui_material_Box = require("@mui/material/Box");
13
14
  _mui_material_Box = require_runtime.__toESM(_mui_material_Box);
14
- let react_i18next = require("react-i18next");
15
15
  let _mui_material_Link = require("@mui/material/Link");
16
16
  _mui_material_Link = require_runtime.__toESM(_mui_material_Link);
17
17
  let _mui_material_Typography = require("@mui/material/Typography");
@@ -5,9 +5,9 @@ import { Description, TextContent } from "./styles.mjs";
5
5
  import "../../../index.mjs";
6
6
  import styled from "@emotion/styled";
7
7
  import "react";
8
+ import { useTranslation } from "react-i18next";
8
9
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
9
10
  import Box from "@mui/material/Box";
10
- import { useTranslation } from "react-i18next";
11
11
  import Link from "@mui/material/Link";
12
12
  import Typography from "@mui/material/Typography";
13
13
  import ReactMarkdown from "react-markdown";
@@ -1,5 +1,6 @@
1
1
  const require_runtime = require("../../_virtual/_rolldown/runtime.js");
2
2
  const require_ManifestsProvider = require("../../providers/ManifestsProvider/ManifestsProvider.js");
3
+ const require_GenericError = require("../../components/GenericError/GenericError.js");
3
4
  const require_Loading = require("../../components/Loading/Loading.js");
4
5
  const require_PackageList = require("../../components/PackageList/PackageList.js");
5
6
  require("../../index.js");
@@ -9,11 +10,11 @@ let react_jsx_runtime = require("react/jsx-runtime");
9
10
  //#region src/sections/Home/Home.tsx
10
11
  var Home = () => {
11
12
  const manifests = require_ManifestsProvider.useManifests();
12
- if (manifests.isError) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { children: "Error loading manifests" });
13
- return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
13
+ if (manifests.isError) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_GenericError.default, {});
14
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
14
15
  className: "container content",
15
16
  "data-testid": "home-page-container",
16
- children: [manifests.isLoading ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Loading.default, {}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_PackageList.default, { packages: manifests.manifests }), manifests.isError && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { children: "Error loading manifests" })]
17
+ children: manifests.isLoading ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Loading.default, {}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_PackageList.default, { packages: manifests.manifests })
17
18
  });
18
19
  };
19
20
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"Home.js","names":[],"sources":["../../../src/sections/Home/Home.tsx"],"sourcesContent":["import React from 'react';\n\nimport { Loading, PackageList, useManifests } from '../..';\nimport type { ManifestWeb } from '../../providers/ManifestsProvider/ManifestsProvider';\n\nconst Home: React.FC = () => {\n const manifests = useManifests();\n\n if (manifests.isError) {\n return <div>Error loading manifests</div>;\n }\n\n return (\n <div className=\"container content\" data-testid=\"home-page-container\">\n {manifests.isLoading ? (\n <Loading />\n ) : (\n <PackageList packages={manifests.manifests as ManifestWeb[]} />\n )}\n {manifests.isError && <div>{'Error loading manifests'}</div>}\n </div>\n );\n};\n\nexport default Home;\n"],"mappings":";;;;;;;;;AAKA,IAAM,aAAuB;CAC3B,MAAM,YAAY,0BAAA,aAAa;CAE/B,IAAI,UAAU,SACZ,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD,EAAA,UAAK,0BAA4B,CAAA;CAG1C,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;EAAK,WAAU;EAAoB,eAAY;EAA/C,UAAA,CACG,UAAU,YACT,iBAAA,GAAA,kBAAA,IAAA,CAAC,gBAAA,SAAD,CAAU,CAAA,IAEV,iBAAA,GAAA,kBAAA,IAAA,CAAC,oBAAA,SAAD,EAAa,UAAU,UAAU,UAA6B,CAAA,GAE/D,UAAU,WAAW,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD,EAAA,UAAM,0BAA+B,CAAA,CACxD;;AAET"}
1
+ {"version":3,"file":"Home.js","names":[],"sources":["../../../src/sections/Home/Home.tsx"],"sourcesContent":["import React from 'react';\n\nimport { GenericError, Loading, PackageList, useManifests } from '../..';\nimport type { ManifestWeb } from '../../providers/ManifestsProvider/ManifestsProvider';\n\nconst Home: React.FC = () => {\n const manifests = useManifests();\n\n if (manifests.isError) {\n return <GenericError />;\n }\n\n return (\n <div className=\"container content\" data-testid=\"home-page-container\">\n {manifests.isLoading ? (\n <Loading />\n ) : (\n <PackageList packages={manifests.manifests as ManifestWeb[]} />\n )}\n </div>\n );\n};\n\nexport default Home;\n"],"mappings":";;;;;;;;;;AAKA,IAAM,aAAuB;CAC3B,MAAM,YAAY,0BAAA,aAAa;CAE/B,IAAI,UAAU,SACZ,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,qBAAA,SAAD,CAAe,CAAA;CAGxB,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;EAAK,WAAU;EAAoB,eAAY;EAC5C,UAAA,UAAU,YACT,iBAAA,GAAA,kBAAA,IAAA,CAAC,gBAAA,SAAD,CAAU,CAAA,IAEV,iBAAA,GAAA,kBAAA,IAAA,CAAC,oBAAA,SAAD,EAAa,UAAU,UAAU,UAA6B,CAAA;CAE7D,CAAA;AAET"}