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

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 (310) hide show
  1. package/build/Theme/ResetStyles.js.map +1 -1
  2. package/build/Theme/ResetStyles.mjs.map +1 -1
  3. package/build/Theme/StyleBaseline.js.map +1 -1
  4. package/build/Theme/StyleBaseline.mjs.map +1 -1
  5. package/build/Theme/ThemeProvider.js.map +1 -1
  6. package/build/Theme/ThemeProvider.mjs.map +1 -1
  7. package/build/Theme/colors.js.map +1 -1
  8. package/build/Theme/modes.js.map +1 -1
  9. package/build/Theme/theme.js.map +1 -1
  10. package/build/api/use-data-mutation.d.ts +1 -1
  11. package/build/api/use-data-mutation.js.map +1 -1
  12. package/build/api/use-data-mutation.mjs.map +1 -1
  13. package/build/api/use-data.d.ts +1 -1
  14. package/build/api/use-data.js.map +1 -1
  15. package/build/api/use-data.mjs.map +1 -1
  16. package/build/components/ActionBar/ActionBar.js.map +1 -1
  17. package/build/components/ActionBar/ActionBar.mjs.map +1 -1
  18. package/build/components/ActionBar/ActionBarAction.js.map +1 -1
  19. package/build/components/ActionBar/index.mjs +1 -2
  20. package/build/components/AppRoute/AppRoute.js.map +1 -1
  21. package/build/components/AppRoute/AppRoute.mjs.map +1 -1
  22. package/build/components/Author/Author.js.map +1 -1
  23. package/build/components/Author/index.mjs +1 -2
  24. package/build/components/Author/styles.js.map +1 -1
  25. package/build/components/CopyClipboard/CopyToClipBoard.js.map +1 -1
  26. package/build/components/Dependencies/Dependencies.js.map +1 -1
  27. package/build/components/Dependencies/DependencyBlock.js.map +1 -1
  28. package/build/components/Dependencies/DependencyBlock.mjs.map +1 -1
  29. package/build/components/Dependencies/index.mjs +1 -2
  30. package/build/components/Deprecated/Deprecated.js.map +1 -1
  31. package/build/components/Deprecated/index.mjs +1 -2
  32. package/build/components/Developers/Developers.js.map +1 -1
  33. package/build/components/Developers/Developers.mjs.map +1 -1
  34. package/build/components/Developers/Title.js.map +1 -1
  35. package/build/components/Distribution/Dist.js.map +1 -1
  36. package/build/components/Distribution/Dist.mjs.map +1 -1
  37. package/build/components/Distribution/index.mjs +1 -2
  38. package/build/components/Distribution/styles.js.map +1 -1
  39. package/build/components/Engines/Engines.js.map +1 -1
  40. package/build/components/Engines/index.mjs +1 -2
  41. package/build/components/Engines/styles.js.map +1 -1
  42. package/build/components/ErrorBoundary/ErrorBoundary.js.map +1 -1
  43. package/build/components/ErrorBoundary/index.mjs +1 -2
  44. package/build/components/Forbidden/Forbidden.js.map +1 -1
  45. package/build/components/Forbidden/index.mjs +1 -2
  46. package/build/components/FundButton/FundButton.js.map +1 -1
  47. package/build/components/FundButton/FundButton.mjs.map +1 -1
  48. package/build/components/FundButton/index.mjs +1 -2
  49. package/build/components/GenericError/GenericError.js.map +1 -1
  50. package/build/components/GenericError/index.mjs +1 -2
  51. package/build/components/HeaderInfoDialog/HeaderInfoDialog.js.map +1 -1
  52. package/build/components/HeaderInfoDialog/index.mjs +1 -2
  53. package/build/components/Heading/Heading.js.map +1 -1
  54. package/build/components/Heading/Heading.mjs.map +1 -1
  55. package/build/components/Heading/index.mjs +1 -2
  56. package/build/components/Help/Help.js.map +1 -1
  57. package/build/components/Help/Help.mjs.map +1 -1
  58. package/build/components/Help/index.mjs +1 -2
  59. package/build/components/Help/styles.js.map +1 -1
  60. package/build/components/Icons/DevsIcons/CommonJS2.js.map +1 -1
  61. package/build/components/Icons/DevsIcons/CommonJS2.mjs.map +1 -1
  62. package/build/components/Icons/DevsIcons/ES6Module2.js.map +1 -1
  63. package/build/components/Icons/DevsIcons/ES6Module2.mjs.map +1 -1
  64. package/build/components/Icons/DevsIcons/Git2.js.map +1 -1
  65. package/build/components/Icons/DevsIcons/Git2.mjs.map +1 -1
  66. package/build/components/Icons/DevsIcons/NodeJS2.js.map +1 -1
  67. package/build/components/Icons/DevsIcons/NodeJS2.mjs.map +1 -1
  68. package/build/components/Icons/DevsIcons/TypeScript2.js.map +1 -1
  69. package/build/components/Icons/DevsIcons/TypeScript2.mjs.map +1 -1
  70. package/build/components/Icons/Earth.js.map +1 -1
  71. package/build/components/Icons/FileBinary.js.map +1 -1
  72. package/build/components/Icons/Law.js.map +1 -1
  73. package/build/components/Icons/License.d.ts +2 -4
  74. package/build/components/Icons/License.js.map +1 -1
  75. package/build/components/Icons/License.mjs.map +1 -1
  76. package/build/components/Icons/Managers/Npm2.js.map +1 -1
  77. package/build/components/Icons/Managers/Npm2.mjs.map +1 -1
  78. package/build/components/Icons/Managers/Pnpm2.js.map +1 -1
  79. package/build/components/Icons/Managers/Pnpm2.mjs.map +1 -1
  80. package/build/components/Icons/Managers/Yarn2.js.map +1 -1
  81. package/build/components/Icons/Managers/Yarn2.mjs.map +1 -1
  82. package/build/components/Icons/SvgIcon.js.map +1 -1
  83. package/build/components/Icons/Time.js.map +1 -1
  84. package/build/components/Icons/Version.js.map +1 -1
  85. package/build/components/Install/Install.js.map +1 -1
  86. package/build/components/Install/Install.mjs.map +1 -1
  87. package/build/components/Install/InstallListItem.js.map +1 -1
  88. package/build/components/Install/index.mjs +1 -2
  89. package/build/components/Keywords/KeywordListItems.js.map +1 -1
  90. package/build/components/Keywords/Keywords.js.map +1 -1
  91. package/build/components/Keywords/index.mjs +1 -2
  92. package/build/components/Label/Label.js.map +1 -1
  93. package/build/components/Label/index.mjs +1 -2
  94. package/build/components/Link/Link.js.map +1 -1
  95. package/build/components/Link/Link.mjs.map +1 -1
  96. package/build/components/Link/index.mjs +1 -2
  97. package/build/components/LinkExternal/LinkExternal.js.map +1 -1
  98. package/build/components/LinkExternal/index.mjs +1 -2
  99. package/build/components/Loading/Loading.js.map +1 -1
  100. package/build/components/Loading/Spinner/Spinner.js.map +1 -1
  101. package/build/components/Loading/Spinner/index.mjs +1 -2
  102. package/build/components/Loading/index.mjs +1 -2
  103. package/build/components/Loading/styles.js.map +1 -1
  104. package/build/components/LoginDialog/LoginDialog.d.ts +1 -0
  105. package/build/components/LoginDialog/LoginDialog.js +11 -2
  106. package/build/components/LoginDialog/LoginDialog.js.map +1 -1
  107. package/build/components/LoginDialog/LoginDialog.mjs +10 -2
  108. package/build/components/LoginDialog/LoginDialog.mjs.map +1 -1
  109. package/build/components/LoginDialog/LoginDialogCloseButton.js.map +1 -1
  110. package/build/components/LoginDialog/LoginDialogForm.js.map +1 -1
  111. package/build/components/LoginDialog/LoginDialogFormError.js.map +1 -1
  112. package/build/components/LoginDialog/index.mjs +1 -2
  113. package/build/components/LoginForm/Login.js +0 -23
  114. package/build/components/LoginForm/Login.js.map +1 -1
  115. package/build/components/LoginForm/Login.mjs +0 -21
  116. package/build/components/LoginForm/Login.mjs.map +1 -1
  117. package/build/components/LoginForm/PasswordField.js.map +1 -1
  118. package/build/components/LoginForm/UsernameField.js.map +1 -1
  119. package/build/components/LoginForm/styles.js.map +1 -1
  120. package/build/components/LoginForm/useLoginForm.js.map +1 -1
  121. package/build/components/Logo/Logo.js.map +1 -1
  122. package/build/components/Logo/Logo.mjs.map +1 -1
  123. package/build/components/Logo/index.mjs +1 -2
  124. package/build/components/MenuItem/MenuItem.js.map +1 -1
  125. package/build/components/MenuItem/MenuItem.mjs.map +1 -1
  126. package/build/components/MenuItem/index.mjs +1 -2
  127. package/build/components/NoItems/NoItems.js.map +1 -1
  128. package/build/components/NoItems/index.mjs +1 -2
  129. package/build/components/NotFound/NotFound.js.map +1 -1
  130. package/build/components/NotFound/index.mjs +1 -2
  131. package/build/components/Package/Package.js.map +1 -1
  132. package/build/components/Package/Package.mjs.map +1 -1
  133. package/build/components/Package/index.mjs +1 -2
  134. package/build/components/Package/styles.js.map +1 -1
  135. package/build/components/Package/styles.mjs.map +1 -1
  136. package/build/components/PackageList/PackageList.js.map +1 -1
  137. package/build/components/PackageList/PackageList.mjs.map +1 -1
  138. package/build/components/PackageList/index.mjs +1 -2
  139. package/build/components/Person/Person.js.map +1 -1
  140. package/build/components/Person/Person.mjs.map +1 -1
  141. package/build/components/Person/PersonTooltip.js.map +1 -1
  142. package/build/components/Person/PersonTooltip.mjs.map +1 -1
  143. package/build/components/Person/index.mjs +1 -2
  144. package/build/components/Person/utils.mjs.map +1 -1
  145. package/build/components/RawViewer/RawViewer.js.map +1 -1
  146. package/build/components/RawViewer/index.mjs +1 -2
  147. package/build/components/Readme/Readme.js.map +1 -1
  148. package/build/components/Readme/index.mjs +1 -2
  149. package/build/components/Readme/utils.js.map +1 -1
  150. package/build/components/RegistryInfoDialog/RegistryInfoDialog.js.map +1 -1
  151. package/build/components/RegistryInfoDialog/index.mjs +1 -2
  152. package/build/components/RegistryInfoDialog/styles.js.map +1 -1
  153. package/build/components/Repository/Repository.js.map +1 -1
  154. package/build/components/Repository/Repository.mjs.map +1 -1
  155. package/build/components/Repository/index.mjs +1 -2
  156. package/build/components/Search/AutoComplete/AutoComplete.js.map +1 -1
  157. package/build/components/Search/AutoComplete/index.mjs +1 -2
  158. package/build/components/Search/AutoComplete/styles.js.map +1 -1
  159. package/build/components/Search/Search.js.map +1 -1
  160. package/build/components/Search/Search.mjs.map +1 -1
  161. package/build/components/Search/SearchItem.js.map +1 -1
  162. package/build/components/Search/index.mjs +1 -2
  163. package/build/components/Search/styles.js.map +1 -1
  164. package/build/components/SettingsMenu/SettingsMenu.js.map +1 -1
  165. package/build/components/SettingsMenu/SettingsMenu.mjs.map +1 -1
  166. package/build/components/SettingsMenu/index.mjs +1 -2
  167. package/build/components/SideBarTitle/SideBarTitle.js.map +1 -1
  168. package/build/components/SideBarTitle/SideBarTitle.mjs.map +1 -1
  169. package/build/components/SideBarTitle/index.mjs +1 -2
  170. package/build/components/UpLinks/UpLinks.js.map +1 -1
  171. package/build/components/UpLinks/UpLinks.mjs.map +1 -1
  172. package/build/components/UpLinks/UplinkLink.js.map +1 -1
  173. package/build/components/UpLinks/UplinkLink.mjs.map +1 -1
  174. package/build/components/UpLinks/index.mjs +1 -2
  175. package/build/components/UpLinks/styles.js.map +1 -1
  176. package/build/components/UpLinks/styles.mjs.map +1 -1
  177. package/build/components/Versions/HistoryList.js.map +1 -1
  178. package/build/components/Versions/HistoryList.mjs.map +1 -1
  179. package/build/components/Versions/TagList.js.map +1 -1
  180. package/build/components/Versions/Versions.js.map +1 -1
  181. package/build/components/Versions/Versions.mjs.map +1 -1
  182. package/build/components/Versions/index.mjs +1 -2
  183. package/build/components/Versions/styles.js.map +1 -1
  184. package/build/components/Versions/styles.mjs.map +1 -1
  185. package/build/hooks/useLocalStorage.js.map +1 -1
  186. package/build/layouts/Security/Dialog.js.map +1 -1
  187. package/build/layouts/Version/Version.js.map +1 -1
  188. package/build/layouts/Version/Version.mjs.map +1 -1
  189. package/build/layouts/Version/index.mjs +1 -2
  190. package/build/pages/Front/Home.js.map +1 -1
  191. package/build/pages/Front/index.mjs +1 -2
  192. package/build/pages/Security/AddUser.js.map +1 -1
  193. package/build/pages/Security/ChangePassword.js.map +1 -1
  194. package/build/pages/Security/Login.js.map +1 -1
  195. package/build/pages/Security/Success.js.map +1 -1
  196. package/build/pages/Stage/StageDetail.js.map +1 -1
  197. package/build/pages/Stage/StageList.js.map +1 -1
  198. package/build/pages/Version/Version.js.map +1 -1
  199. package/build/pages/Version/index.mjs +1 -2
  200. package/build/providers/AppConfigurationProvider/AppConfigurationProvider.js.map +1 -1
  201. package/build/providers/AppConfigurationProvider/index.mjs +1 -2
  202. package/build/providers/AuthProvider/AuthProvider.js +1 -1
  203. package/build/providers/AuthProvider/AuthProvider.js.map +1 -1
  204. package/build/providers/AuthProvider/AuthProvider.mjs +1 -1
  205. package/build/providers/AuthProvider/AuthProvider.mjs.map +1 -1
  206. package/build/providers/AuthProvider/index.mjs +1 -2
  207. package/build/providers/AuthProvider/utils.js.map +1 -1
  208. package/build/providers/DownloadProvider/DownloadProvider.js.map +1 -1
  209. package/build/providers/DownloadProvider/index.mjs +1 -2
  210. package/build/providers/ManifestsProvider/ManifestsProvider.js +1 -1
  211. package/build/providers/ManifestsProvider/ManifestsProvider.js.map +1 -1
  212. package/build/providers/ManifestsProvider/ManifestsProvider.mjs +1 -1
  213. package/build/providers/ManifestsProvider/ManifestsProvider.mjs.map +1 -1
  214. package/build/providers/ManifestsProvider/index.mjs +1 -2
  215. package/build/providers/PersistenceSettingProvider/PersistenceSettingProvider.js.map +1 -1
  216. package/build/providers/PersistenceSettingProvider/index.mjs +1 -2
  217. package/build/providers/SearchProvider/SearchProvider.js +1 -1
  218. package/build/providers/SearchProvider/SearchProvider.js.map +1 -1
  219. package/build/providers/SearchProvider/SearchProvider.mjs +1 -1
  220. package/build/providers/SearchProvider/SearchProvider.mjs.map +1 -1
  221. package/build/providers/SearchProvider/index.mjs +1 -2
  222. package/build/providers/TranslatorProvider/TranslatorProvider.js.map +1 -1
  223. package/build/providers/TranslatorProvider/index.mjs +1 -2
  224. package/build/providers/VersionProvider/VersionProvider.js +1 -1
  225. package/build/providers/VersionProvider/VersionProvider.js.map +1 -1
  226. package/build/providers/VersionProvider/VersionProvider.mjs +1 -1
  227. package/build/providers/VersionProvider/VersionProvider.mjs.map +1 -1
  228. package/build/providers/VersionProvider/index.mjs +1 -2
  229. package/build/sections/Detail/ContainerContent.js.map +1 -1
  230. package/build/sections/Detail/ContainerContent.mjs.map +1 -1
  231. package/build/sections/Detail/Detail.js.map +1 -1
  232. package/build/sections/Detail/Detail.mjs.map +1 -1
  233. package/build/sections/Detail/ReadmeSection.js.map +1 -1
  234. package/build/sections/Detail/Tabs.js.map +1 -1
  235. package/build/sections/Detail/Tabs.mjs.map +1 -1
  236. package/build/sections/Detail/index.mjs +1 -2
  237. package/build/sections/Footer/Footer.js.map +1 -1
  238. package/build/sections/Footer/Footer.mjs.map +1 -1
  239. package/build/sections/Footer/index.mjs +1 -2
  240. package/build/sections/Footer/styles.js.map +1 -1
  241. package/build/sections/Header/Header.js.map +1 -1
  242. package/build/sections/Header/Header.mjs.map +1 -1
  243. package/build/sections/Header/HeaderGreetings.js.map +1 -1
  244. package/build/sections/Header/HeaderGreetings.mjs.map +1 -1
  245. package/build/sections/Header/HeaderLeft.js.map +1 -1
  246. package/build/sections/Header/HeaderLeft.mjs.map +1 -1
  247. package/build/sections/Header/HeaderMenu.js +10 -0
  248. package/build/sections/Header/HeaderMenu.js.map +1 -1
  249. package/build/sections/Header/HeaderMenu.mjs +10 -0
  250. package/build/sections/Header/HeaderMenu.mjs.map +1 -1
  251. package/build/sections/Header/HeaderRight.js.map +1 -1
  252. package/build/sections/Header/HeaderRight.mjs.map +1 -1
  253. package/build/sections/Header/HeaderSettingsDialog.js.map +1 -1
  254. package/build/sections/Header/HeaderToolTip.js.map +1 -1
  255. package/build/sections/Header/HeaderToolTipIcon.js.map +1 -1
  256. package/build/sections/Header/HeaderToolTipIcon.mjs.map +1 -1
  257. package/build/sections/Header/LanguageSwitch.js.map +1 -1
  258. package/build/sections/Header/LanguageSwitch.mjs.map +1 -1
  259. package/build/sections/Header/RegistryInfoContent/RegistryInfoContent.js.map +1 -1
  260. package/build/sections/Header/RegistryInfoContent/RegistryInfoContent.mjs.map +1 -1
  261. package/build/sections/Header/RegistryInfoContent/index.mjs +1 -2
  262. package/build/sections/Header/RegistryInfoContent/styles.js.map +1 -1
  263. package/build/sections/Header/index.mjs +1 -2
  264. package/build/sections/Header/styles.js.map +1 -1
  265. package/build/sections/Home/Home.js.map +1 -1
  266. package/build/sections/Home/index.mjs +1 -2
  267. package/build/sections/Security/AddUser.js.map +1 -1
  268. package/build/sections/Security/AddUser.mjs.map +1 -1
  269. package/build/sections/Security/ChangePassword.js +41 -16
  270. package/build/sections/Security/ChangePassword.js.map +1 -1
  271. package/build/sections/Security/ChangePassword.mjs +41 -16
  272. package/build/sections/Security/ChangePassword.mjs.map +1 -1
  273. package/build/sections/Security/Login.js.map +1 -1
  274. package/build/sections/Security/Login.mjs.map +1 -1
  275. package/build/sections/Security/Success.js.map +1 -1
  276. package/build/sections/Security/styles.js.map +1 -1
  277. package/build/sections/Security/utils.js.map +1 -1
  278. package/build/sections/SideBar/Sidebar.js.map +1 -1
  279. package/build/sections/SideBar/Sidebar.mjs.map +1 -1
  280. package/build/sections/SideBar/index.mjs +1 -2
  281. package/build/sections/Stage/StageActions.js.map +1 -1
  282. package/build/sections/Stage/StageActions.mjs.map +1 -1
  283. package/build/sections/Stage/StageDetail.js.map +1 -1
  284. package/build/sections/Stage/StageDetail.mjs.map +1 -1
  285. package/build/sections/Stage/StageList.js.map +1 -1
  286. package/build/sections/Stage/StageList.mjs.map +1 -1
  287. package/build/sections/Stage/useRequireSession.js.map +1 -1
  288. package/build/sections/Stage/useRequireSession.mjs.map +1 -1
  289. package/build/sections/Stage/useStage.js.map +1 -1
  290. package/build/sections/Stage/useStage.mjs.map +1 -1
  291. package/build/store/api.js.map +1 -1
  292. package/build/store/api.mjs.map +1 -1
  293. package/build/store/index.mjs +1 -2
  294. package/build/store/storage.js.map +1 -1
  295. package/build/utils/loadable.js.map +1 -1
  296. package/build/utils/schemas.d.ts +0 -2
  297. package/build/utils/schemas.js +0 -1
  298. package/build/utils/schemas.js.map +1 -1
  299. package/build/utils/schemas.mjs +0 -1
  300. package/build/utils/schemas.mjs.map +1 -1
  301. package/build/utils/token.js.map +1 -1
  302. package/build/utils/url.js.map +1 -1
  303. package/build/utils/url.mjs.map +1 -1
  304. package/build/utils/utils.js.map +1 -1
  305. package/package.json +21 -21
  306. package/build/store/routes.d.ts +0 -12
  307. package/build/store/routes.js +0 -18
  308. package/build/store/routes.js.map +0 -1
  309. package/build/store/routes.mjs +0 -18
  310. package/build/store/routes.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"RegistryInfoContent.mjs","names":[],"sources":["../../../../src/sections/Header/RegistryInfoContent/RegistryInfoContent.tsx"],"sourcesContent":["import styled from '@emotion/styled';\nimport ExpandMoreIcon from '@mui/icons-material/ExpandMore';\nimport Accordion from '@mui/material/Accordion';\nimport AccordionDetails from '@mui/material/AccordionDetails';\nimport AccordionSummary from '@mui/material/AccordionSummary';\nimport Box from '@mui/material/Box';\nimport Link from '@mui/material/Link';\nimport Typography from '@mui/material/Typography';\nimport type { FC } from 'react';\nimport React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport ReactMarkdown from 'react-markdown';\n\nimport {\n CopyClipboard,\n getCLIChangePassword,\n getCLISBerryYamlRegistry,\n getCLISetConfigRegistry,\n getCLISetRegistry,\n useConfig,\n} from '../../../';\nimport { Description, TextContent } from './styles';\n\nexport const NODE_MANAGER = {\n npm: 'npm',\n yarn: 'yarn',\n pnpm: 'pnpm',\n};\n\nconst renderNpmTab = (scope: string | undefined, registryUrl: string): React.JSX.Element => {\n return (\n <Box display=\"flex\" flexDirection=\"column\">\n <CopyClipboard\n dataTestId=\"copy\"\n text={getCLISetConfigRegistry(`${NODE_MANAGER.npm} set`, scope, registryUrl)}\n />\n <CopyClipboard\n dataTestId=\"copy\"\n text={getCLISetRegistry(`${NODE_MANAGER.npm} adduser`, registryUrl)}\n />\n <CopyClipboard dataTestId=\"copy\" text={getCLIChangePassword(NODE_MANAGER.npm, registryUrl)} />\n </Box>\n );\n};\n\nconst renderPnpmTab = (scope: string | undefined, registryUrl: string): React.JSX.Element => {\n return (\n <Box display=\"flex\" flexDirection=\"column\">\n <CopyClipboard\n dataTestId=\"copy\"\n text={getCLISetConfigRegistry(`${NODE_MANAGER.pnpm} set`, scope, registryUrl)}\n />\n <CopyClipboard\n dataTestId=\"copy\"\n text={getCLISetRegistry(`${NODE_MANAGER.pnpm} adduser`, registryUrl)}\n />\n <CopyClipboard\n dataTestId=\"copy\"\n text={getCLIChangePassword(NODE_MANAGER.pnpm, registryUrl)}\n />\n </Box>\n );\n};\n\nconst renderYarnTab = (scope: string | undefined, registryUrl: string): React.JSX.Element => {\n return (\n <Box display=\"flex\" flexDirection=\"column\">\n <CopyClipboard\n dataTestId=\"copy\"\n text={getCLISetConfigRegistry(`${NODE_MANAGER.yarn} config set`, scope, registryUrl)}\n />\n </Box>\n );\n};\n\nconst renderYarnBerryTab = (scope: string | undefined, registryUrl: string): React.JSX.Element => {\n return (\n <Box display=\"flex\" flexDirection=\"column\">\n <CopyClipboard dataTestId=\"copy\" text={getCLISBerryYamlRegistry(scope, registryUrl)} />\n </Box>\n );\n};\n\nexport const AccordionContainer = styled('div')({\n padding: 0,\n paddingLeft: 0,\n paddingRight: 0,\n});\n\nexport const CommandContainer = styled('div')({\n padding: 5,\n});\n\nexport const LinkContainer = styled('div')({\n margin: 10,\n marginLeft: 0,\n});\n\nexport type Props = {\n registryUrl: string;\n scope: string | undefined;\n};\n\nconst RegistryInfoContent: FC<Props> = ({ scope, registryUrl }) => {\n const { t } = useTranslation();\n const { configOptions } = useConfig();\n\n const hasNpm = configOptions?.pkgManagers?.includes('npm');\n const hasYarn = configOptions?.pkgManagers?.includes('yarn');\n const hasPnpm = configOptions?.pkgManagers?.includes('pnpm');\n // TODO: we can improve this logic, expanding only one accordion based on which package manager is enabled\n // feel free to contribute here\n return (\n <>\n <TextContent>{t('packageManagers.description')}</TextContent>\n <AccordionContainer>\n <Accordion disabled={!hasNpm}>\n <AccordionSummary\n aria-controls=\"panel1a-content\"\n expandIcon={<ExpandMoreIcon />}\n id=\"panel1a-header\"\n >\n <Typography sx={{ fontSize: '1rem', fontWeight: 'bold' }}>{'npm'}</Typography>\n </AccordionSummary>\n <AccordionDetails>\n <CommandContainer data-testid={'tab-content'}>\n {renderNpmTab(scope, registryUrl)}\n </CommandContainer>\n </AccordionDetails>\n </Accordion>\n <Accordion disabled={!hasYarn}>\n <AccordionSummary\n aria-controls=\"panel2a-content\"\n expandIcon={<ExpandMoreIcon />}\n id=\"panel2a-header\"\n >\n <Typography sx={{ fontSize: '1rem', fontWeight: 'bold' }}>{'yarn'}</Typography>\n </AccordionSummary>\n <AccordionDetails>\n <Description>\n <ReactMarkdown>{t('packageManagers.yarnclassicDetails')}</ReactMarkdown>\n </Description>\n <CommandContainer data-testid={'tab-content'}>\n {renderYarnTab(scope, registryUrl)}\n </CommandContainer>\n <Description>\n <ReactMarkdown>{t('packageManagers.yarnBerryDetails')}</ReactMarkdown>\n </Description>\n <CommandContainer data-testid={'tab-content'}>\n {renderYarnBerryTab(scope, registryUrl)}\n </CommandContainer>\n </AccordionDetails>\n </Accordion>\n\n <Accordion disabled={!hasPnpm}>\n <AccordionSummary\n aria-controls=\"panel3a-content\"\n expandIcon={<ExpandMoreIcon />}\n id=\"panel3a-header\"\n >\n <Typography sx={{ fontSize: '1rem', fontWeight: 'bold' }}>{'pnpm'}</Typography>\n </AccordionSummary>\n <AccordionDetails>\n <CommandContainer data-testid={'tab-content'}>\n {renderPnpmTab(scope, registryUrl)}\n </CommandContainer>\n </AccordionDetails>\n </Accordion>\n\n <LinkContainer>\n <Link href=\"https://verdaccio.org/docs/cli-registry\" target=\"_blank\">\n <Typography>{t('header.registry-info-link')}</Typography>\n </Link>\n </LinkContainer>\n </AccordionContainer>\n </>\n );\n};\n\nexport default RegistryInfoContent;\n"],"mappings":"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"}
1
+ {"version":3,"file":"RegistryInfoContent.mjs","names":["CopyClipboard","_Fragment"],"sources":["../../../../src/sections/Header/RegistryInfoContent/RegistryInfoContent.tsx"],"sourcesContent":["import styled from '@emotion/styled';\nimport ExpandMoreIcon from '@mui/icons-material/ExpandMore';\nimport Accordion from '@mui/material/Accordion';\nimport AccordionDetails from '@mui/material/AccordionDetails';\nimport AccordionSummary from '@mui/material/AccordionSummary';\nimport Box from '@mui/material/Box';\nimport Link from '@mui/material/Link';\nimport Typography from '@mui/material/Typography';\nimport type { FC } from 'react';\nimport React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport ReactMarkdown from 'react-markdown';\n\nimport {\n CopyClipboard,\n getCLIChangePassword,\n getCLISBerryYamlRegistry,\n getCLISetConfigRegistry,\n getCLISetRegistry,\n useConfig,\n} from '../../../';\nimport { Description, TextContent } from './styles';\n\nexport const NODE_MANAGER = {\n npm: 'npm',\n yarn: 'yarn',\n pnpm: 'pnpm',\n};\n\nconst renderNpmTab = (scope: string | undefined, registryUrl: string): React.JSX.Element => {\n return (\n <Box display=\"flex\" flexDirection=\"column\">\n <CopyClipboard\n dataTestId=\"copy\"\n text={getCLISetConfigRegistry(`${NODE_MANAGER.npm} set`, scope, registryUrl)}\n />\n <CopyClipboard\n dataTestId=\"copy\"\n text={getCLISetRegistry(`${NODE_MANAGER.npm} adduser`, registryUrl)}\n />\n <CopyClipboard dataTestId=\"copy\" text={getCLIChangePassword(NODE_MANAGER.npm, registryUrl)} />\n </Box>\n );\n};\n\nconst renderPnpmTab = (scope: string | undefined, registryUrl: string): React.JSX.Element => {\n return (\n <Box display=\"flex\" flexDirection=\"column\">\n <CopyClipboard\n dataTestId=\"copy\"\n text={getCLISetConfigRegistry(`${NODE_MANAGER.pnpm} set`, scope, registryUrl)}\n />\n <CopyClipboard\n dataTestId=\"copy\"\n text={getCLISetRegistry(`${NODE_MANAGER.pnpm} adduser`, registryUrl)}\n />\n <CopyClipboard\n dataTestId=\"copy\"\n text={getCLIChangePassword(NODE_MANAGER.pnpm, registryUrl)}\n />\n </Box>\n );\n};\n\nconst renderYarnTab = (scope: string | undefined, registryUrl: string): React.JSX.Element => {\n return (\n <Box display=\"flex\" flexDirection=\"column\">\n <CopyClipboard\n dataTestId=\"copy\"\n text={getCLISetConfigRegistry(`${NODE_MANAGER.yarn} config set`, scope, registryUrl)}\n />\n </Box>\n );\n};\n\nconst renderYarnBerryTab = (scope: string | undefined, registryUrl: string): React.JSX.Element => {\n return (\n <Box display=\"flex\" flexDirection=\"column\">\n <CopyClipboard dataTestId=\"copy\" text={getCLISBerryYamlRegistry(scope, registryUrl)} />\n </Box>\n );\n};\n\nexport const AccordionContainer = styled('div')({\n padding: 0,\n paddingLeft: 0,\n paddingRight: 0,\n});\n\nexport const CommandContainer = styled('div')({\n padding: 5,\n});\n\nexport const LinkContainer = styled('div')({\n margin: 10,\n marginLeft: 0,\n});\n\nexport type Props = {\n registryUrl: string;\n scope: string | undefined;\n};\n\nconst RegistryInfoContent: FC<Props> = ({ scope, registryUrl }) => {\n const { t } = useTranslation();\n const { configOptions } = useConfig();\n\n const hasNpm = configOptions?.pkgManagers?.includes('npm');\n const hasYarn = configOptions?.pkgManagers?.includes('yarn');\n const hasPnpm = configOptions?.pkgManagers?.includes('pnpm');\n // TODO: we can improve this logic, expanding only one accordion based on which package manager is enabled\n // feel free to contribute here\n return (\n <>\n <TextContent>{t('packageManagers.description')}</TextContent>\n <AccordionContainer>\n <Accordion disabled={!hasNpm}>\n <AccordionSummary\n aria-controls=\"panel1a-content\"\n expandIcon={<ExpandMoreIcon />}\n id=\"panel1a-header\"\n >\n <Typography sx={{ fontSize: '1rem', fontWeight: 'bold' }}>{'npm'}</Typography>\n </AccordionSummary>\n <AccordionDetails>\n <CommandContainer data-testid={'tab-content'}>\n {renderNpmTab(scope, registryUrl)}\n </CommandContainer>\n </AccordionDetails>\n </Accordion>\n <Accordion disabled={!hasYarn}>\n <AccordionSummary\n aria-controls=\"panel2a-content\"\n expandIcon={<ExpandMoreIcon />}\n id=\"panel2a-header\"\n >\n <Typography sx={{ fontSize: '1rem', fontWeight: 'bold' }}>{'yarn'}</Typography>\n </AccordionSummary>\n <AccordionDetails>\n <Description>\n <ReactMarkdown>{t('packageManagers.yarnclassicDetails')}</ReactMarkdown>\n </Description>\n <CommandContainer data-testid={'tab-content'}>\n {renderYarnTab(scope, registryUrl)}\n </CommandContainer>\n <Description>\n <ReactMarkdown>{t('packageManagers.yarnBerryDetails')}</ReactMarkdown>\n </Description>\n <CommandContainer data-testid={'tab-content'}>\n {renderYarnBerryTab(scope, registryUrl)}\n </CommandContainer>\n </AccordionDetails>\n </Accordion>\n\n <Accordion disabled={!hasPnpm}>\n <AccordionSummary\n aria-controls=\"panel3a-content\"\n expandIcon={<ExpandMoreIcon />}\n id=\"panel3a-header\"\n >\n <Typography sx={{ fontSize: '1rem', fontWeight: 'bold' }}>{'pnpm'}</Typography>\n </AccordionSummary>\n <AccordionDetails>\n <CommandContainer data-testid={'tab-content'}>\n {renderPnpmTab(scope, registryUrl)}\n </CommandContainer>\n </AccordionDetails>\n </Accordion>\n\n <LinkContainer>\n <Link href=\"https://verdaccio.org/docs/cli-registry\" target=\"_blank\">\n <Typography>{t('header.registry-info-link')}</Typography>\n </Link>\n </LinkContainer>\n </AccordionContainer>\n </>\n );\n};\n\nexport default RegistryInfoContent;\n"],"mappings":"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"}
@@ -1,2 +1 @@
1
- import RegistryInfoContent from "./RegistryInfoContent.mjs";
2
- export { RegistryInfoContent as default };
1
+ export { default } from "./RegistryInfoContent.mjs";
@@ -1 +1 @@
1
- {"version":3,"file":"styles.js","names":[],"sources":["../../../../src/sections/Header/RegistryInfoContent/styles.ts"],"sourcesContent":["import styled from '@emotion/styled';\n\nimport type { Theme } from '../../../';\n\nexport const TextContent = styled('div')<{ theme?: Theme }>(({ theme }) => ({\n paddingBottom: '10px',\n backgroundColor: theme.palette.background.default,\n}));\n\nexport const Description = styled('div')<{ theme?: Theme }>(() => ({\n fontSize: '1rem',\n fontStyle: 'italic',\n}));\n"],"mappings":";;;;AAIA,IAAa,eAAA,GAAc,gBAAA,QAAA,CAAO,KAAK,CAAC,EAAqB,EAAE,aAAa;CAC1E,eAAe;CACf,iBAAiB,MAAM,QAAQ,WAAW;AAC5C,EAAE;AAEF,IAAa,eAAA,GAAc,gBAAA,QAAA,CAAO,KAAK,CAAC,QAA2B;CACjE,UAAU;CACV,WAAW;AACb,EAAE"}
1
+ {"version":3,"file":"styles.js","names":["styled"],"sources":["../../../../src/sections/Header/RegistryInfoContent/styles.ts"],"sourcesContent":["import styled from '@emotion/styled';\n\nimport type { Theme } from '../../../';\n\nexport const TextContent = styled('div')<{ theme?: Theme }>(({ theme }) => ({\n paddingBottom: '10px',\n backgroundColor: theme.palette.background.default,\n}));\n\nexport const Description = styled('div')<{ theme?: Theme }>(() => ({\n fontSize: '1rem',\n fontStyle: 'italic',\n}));\n"],"mappings":";;;;AAIA,IAAa,eAAA,GAAcA,gBAAAA,QAAAA,CAAO,KAAK,CAAC,EAAqB,EAAE,aAAa;CAC1E,eAAe;CACf,iBAAiB,MAAM,QAAQ,WAAW;AAC5C,EAAE;AAEF,IAAa,eAAA,GAAcA,gBAAAA,QAAAA,CAAO,KAAK,CAAC,QAA2B;CACjE,UAAU;CACV,WAAW;AACb,EAAE"}
@@ -1,2 +1 @@
1
- import Header from "./Header.mjs";
2
- export { Header as default };
1
+ export { default } from "./Header.mjs";
@@ -1 +1 @@
1
- {"version":3,"file":"styles.js","names":[],"sources":["../../../src/sections/Header/styles.ts"],"sourcesContent":["import { css } from '@emotion/react';\nimport styled from '@emotion/styled';\nimport AppBar from '@mui/material/AppBar';\nimport IconButton from '@mui/material/IconButton';\nimport Toolbar from '@mui/material/Toolbar';\nimport { common } from '@mui/material/colors';\n\nimport type { Theme } from '../../Theme';\n\nexport const InnerNavBar = styled(Toolbar)({\n justifyContent: 'space-between',\n alignItems: 'center',\n padding: 0,\n});\n\nexport const Greetings = styled('span')({\n margin: '0 5px 0 0',\n});\n\nexport const MobileNavBar = styled('div')<{ theme?: Theme }>((props) => ({\n alignItems: 'center',\n display: 'flex',\n borderBottom: `1px solid ${props.theme.palette.greyLight}`,\n padding: '8px',\n position: 'relative',\n}));\n\nexport const InnerMobileNavBar = styled('div')<{ theme?: Theme }>((props) => ({\n borderRadius: '4px',\n backgroundColor: props.theme.palette.greyLight,\n color: common.white,\n width: '100%',\n padding: '0 5px',\n margin: '0 10px 0 0',\n}));\n\nexport const IconSearchButton = styled(IconButton)({});\nexport const InfoButton = styled(IconButton)({});\nexport const SwitchThemeButton = styled(IconButton)({});\nexport const SettingsButtom = styled(IconButton)({});\n\nexport const SearchWrapper = styled('div')({\n display: 'none',\n width: '100%',\n marginLeft: 20,\n});\n\nexport const NavBar = styled(AppBar)<{ theme?: Theme }>(({ theme }) => ({\n backgroundColor:\n theme.palette.mode === 'light' ? theme.palette.primary.main : theme.palette.cyanBlue,\n color: common.white,\n minHeight: 60,\n display: 'flex',\n justifyContent: 'center',\n [`@media (max-width: ${theme.breakPoints.xsmall}px)`]: css`\n [data-testid='header--tooltip-info'] {\n display: none;\n }\n [data-testid='header--button--dark'],\n [data-testid='header--button--light'] {\n display: none;\n }\n [data-testid='header--tooltip-settings'] {\n display: none;\n }\n `,\n [`@media (min-width: ${theme.breakPoints.medium}px)`]: css`\n [data-testid='search-container'] {\n display: flex;\n }\n [data-testid='header--tooltip-search'] {\n display: none;\n }\n [data-testid='mobile-nav-bar'] {\n display: none;\n }\n `,\n [`@media (min-width: ${theme.breakPoints.large}px)`]: css`\n [data-testid='inner-nav-bar'] {\n padding: 0 16px;\n }\n `,\n [`@media (min-width: ${theme.breakPoints.xlarge}px)`]: css`\n [data-testid='inner-nav-bar'] {\n max-width: 1240px;\n width: 100%;\n margin: 0 auto;\n }\n `,\n}));\n"],"mappings":";;;;;;;;;;;;AASA,IAAa,eAAA,GAAc,gBAAA,QAAA,CAAO,sBAAA,OAAO,CAAC,CAAC;CACzC,gBAAgB;CAChB,YAAY;CACZ,SAAS;AACX,CAAC;AAED,IAAa,aAAA,GAAY,gBAAA,QAAA,CAAO,MAAM,CAAC,CAAC,EACtC,QAAQ,YACV,CAAC;AAED,IAAa,gBAAA,GAAe,gBAAA,QAAA,CAAO,KAAK,CAAC,EAAqB,WAAW;CACvE,YAAY;CACZ,SAAS;CACT,cAAc,aAAa,MAAM,MAAM,QAAQ;CAC/C,SAAS;CACT,UAAU;AACZ,EAAE;AAEF,IAAa,qBAAA,GAAoB,gBAAA,QAAA,CAAO,KAAK,CAAC,EAAqB,WAAW;CAC5E,cAAc;CACd,iBAAiB,MAAM,MAAM,QAAQ;CACrC,OAAO,qBAAA,OAAO;CACd,OAAO;CACP,SAAS;CACT,QAAQ;AACV,EAAE;AAEF,IAAa,oBAAA,GAAmB,gBAAA,QAAA,CAAO,yBAAA,OAAU,CAAC,CAAC,CAAC,CAAC;AACrD,IAAa,cAAA,GAAa,gBAAA,QAAA,CAAO,yBAAA,OAAU,CAAC,CAAC,CAAC,CAAC;AAC/C,IAAa,qBAAA,GAAoB,gBAAA,QAAA,CAAO,yBAAA,OAAU,CAAC,CAAC,CAAC,CAAC;AACtD,IAAa,kBAAA,GAAiB,gBAAA,QAAA,CAAO,yBAAA,OAAU,CAAC,CAAC,CAAC,CAAC;AAEnD,IAAa,iBAAA,GAAgB,gBAAA,QAAA,CAAO,KAAK,CAAC,CAAC;CACzC,SAAS;CACT,OAAO;CACP,YAAY;AACd,CAAC;AAED,IAAa,UAAA,GAAS,gBAAA,QAAA,CAAO,qBAAA,OAAM,CAAC,EAAqB,EAAE,aAAa;CACtE,iBACE,MAAM,QAAQ,SAAS,UAAU,MAAM,QAAQ,QAAQ,OAAO,MAAM,QAAQ;CAC9E,OAAO,qBAAA,OAAO;CACd,WAAW;CACX,SAAS;CACT,gBAAgB;EACf,sBAAsB,MAAM,YAAY,OAAO,OAAO,eAAA,GAAG;;;;;;;;;;;;EAYzD,sBAAsB,MAAM,YAAY,OAAO,OAAO,eAAA,GAAG;;;;;;;;;;;EAWzD,sBAAsB,MAAM,YAAY,MAAM,OAAO,eAAA,GAAG;;;;;EAKxD,sBAAsB,MAAM,YAAY,OAAO,OAAO,eAAA,GAAG;;;;;;;AAO5D,EAAE"}
1
+ {"version":3,"file":"styles.js","names":["styled","Toolbar","common","IconButton","AppBar"],"sources":["../../../src/sections/Header/styles.ts"],"sourcesContent":["import { css } from '@emotion/react';\nimport styled from '@emotion/styled';\nimport AppBar from '@mui/material/AppBar';\nimport IconButton from '@mui/material/IconButton';\nimport Toolbar from '@mui/material/Toolbar';\nimport { common } from '@mui/material/colors';\n\nimport type { Theme } from '../../Theme';\n\nexport const InnerNavBar = styled(Toolbar)({\n justifyContent: 'space-between',\n alignItems: 'center',\n padding: 0,\n});\n\nexport const Greetings = styled('span')({\n margin: '0 5px 0 0',\n});\n\nexport const MobileNavBar = styled('div')<{ theme?: Theme }>((props) => ({\n alignItems: 'center',\n display: 'flex',\n borderBottom: `1px solid ${props.theme.palette.greyLight}`,\n padding: '8px',\n position: 'relative',\n}));\n\nexport const InnerMobileNavBar = styled('div')<{ theme?: Theme }>((props) => ({\n borderRadius: '4px',\n backgroundColor: props.theme.palette.greyLight,\n color: common.white,\n width: '100%',\n padding: '0 5px',\n margin: '0 10px 0 0',\n}));\n\nexport const IconSearchButton = styled(IconButton)({});\nexport const InfoButton = styled(IconButton)({});\nexport const SwitchThemeButton = styled(IconButton)({});\nexport const SettingsButtom = styled(IconButton)({});\n\nexport const SearchWrapper = styled('div')({\n display: 'none',\n width: '100%',\n marginLeft: 20,\n});\n\nexport const NavBar = styled(AppBar)<{ theme?: Theme }>(({ theme }) => ({\n backgroundColor:\n theme.palette.mode === 'light' ? theme.palette.primary.main : theme.palette.cyanBlue,\n color: common.white,\n minHeight: 60,\n display: 'flex',\n justifyContent: 'center',\n [`@media (max-width: ${theme.breakPoints.xsmall}px)`]: css`\n [data-testid='header--tooltip-info'] {\n display: none;\n }\n [data-testid='header--button--dark'],\n [data-testid='header--button--light'] {\n display: none;\n }\n [data-testid='header--tooltip-settings'] {\n display: none;\n }\n `,\n [`@media (min-width: ${theme.breakPoints.medium}px)`]: css`\n [data-testid='search-container'] {\n display: flex;\n }\n [data-testid='header--tooltip-search'] {\n display: none;\n }\n [data-testid='mobile-nav-bar'] {\n display: none;\n }\n `,\n [`@media (min-width: ${theme.breakPoints.large}px)`]: css`\n [data-testid='inner-nav-bar'] {\n padding: 0 16px;\n }\n `,\n [`@media (min-width: ${theme.breakPoints.xlarge}px)`]: css`\n [data-testid='inner-nav-bar'] {\n max-width: 1240px;\n width: 100%;\n margin: 0 auto;\n }\n `,\n}));\n"],"mappings":";;;;;;;;;;;;AASA,IAAa,eAAA,GAAcA,gBAAAA,QAAAA,CAAOC,sBAAAA,OAAO,CAAC,CAAC;CACzC,gBAAgB;CAChB,YAAY;CACZ,SAAS;AACX,CAAC;AAED,IAAa,aAAA,GAAYD,gBAAAA,QAAAA,CAAO,MAAM,CAAC,CAAC,EACtC,QAAQ,YACV,CAAC;AAED,IAAa,gBAAA,GAAeA,gBAAAA,QAAAA,CAAO,KAAK,CAAC,EAAqB,WAAW;CACvE,YAAY;CACZ,SAAS;CACT,cAAc,aAAa,MAAM,MAAM,QAAQ;CAC/C,SAAS;CACT,UAAU;AACZ,EAAE;AAEF,IAAa,qBAAA,GAAoBA,gBAAAA,QAAAA,CAAO,KAAK,CAAC,EAAqB,WAAW;CAC5E,cAAc;CACd,iBAAiB,MAAM,MAAM,QAAQ;CACrC,OAAOE,qBAAAA,OAAO;CACd,OAAO;CACP,SAAS;CACT,QAAQ;AACV,EAAE;AAEF,IAAa,oBAAA,GAAmBF,gBAAAA,QAAAA,CAAOG,yBAAAA,OAAU,CAAC,CAAC,CAAC,CAAC;AACrD,IAAa,cAAA,GAAaH,gBAAAA,QAAAA,CAAOG,yBAAAA,OAAU,CAAC,CAAC,CAAC,CAAC;AAC/C,IAAa,qBAAA,GAAoBH,gBAAAA,QAAAA,CAAOG,yBAAAA,OAAU,CAAC,CAAC,CAAC,CAAC;AACtD,IAAa,kBAAA,GAAiBH,gBAAAA,QAAAA,CAAOG,yBAAAA,OAAU,CAAC,CAAC,CAAC,CAAC;AAEnD,IAAa,iBAAA,GAAgBH,gBAAAA,QAAAA,CAAO,KAAK,CAAC,CAAC;CACzC,SAAS;CACT,OAAO;CACP,YAAY;AACd,CAAC;AAED,IAAa,UAAA,GAASA,gBAAAA,QAAAA,CAAOI,qBAAAA,OAAM,CAAC,EAAqB,EAAE,aAAa;CACtE,iBACE,MAAM,QAAQ,SAAS,UAAU,MAAM,QAAQ,QAAQ,OAAO,MAAM,QAAQ;CAC9E,OAAOF,qBAAAA,OAAO;CACd,WAAW;CACX,SAAS;CACT,gBAAgB;EACf,sBAAsB,MAAM,YAAY,OAAO,OAAO,eAAA,GAAG;;;;;;;;;;;;EAYzD,sBAAsB,MAAM,YAAY,OAAO,OAAO,eAAA,GAAG;;;;;;;;;;;EAWzD,sBAAsB,MAAM,YAAY,MAAM,OAAO,eAAA,GAAG;;;;;EAKxD,sBAAsB,MAAM,YAAY,OAAO,OAAO,eAAA,GAAG;;;;;;;AAO5D,EAAE"}
@@ -1 +1 @@
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"}
1
+ {"version":3,"file":"Home.js","names":["useManifests","GenericError","Loading","PackageList"],"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,YAAYA,0BAAAA,aAAa;CAE/B,IAAI,UAAU,SACZ,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAACC,qBAAAA,SAAD,CAAe,CAAA;CAGxB,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;EAAK,WAAU;EAAoB,eAAY;EAC5C,UAAA,UAAU,YACT,iBAAA,GAAA,kBAAA,IAAA,CAACC,gBAAAA,SAAD,CAAU,CAAA,IAEV,iBAAA,GAAA,kBAAA,IAAA,CAACC,oBAAAA,SAAD,EAAa,UAAU,UAAU,UAA6B,CAAA;CAE7D,CAAA;AAET"}
@@ -1,2 +1 @@
1
- import Home from "./Home.mjs";
2
- export { Home as default };
1
+ export { default } from "./Home.mjs";
@@ -1 +1 @@
1
- {"version":3,"file":"AddUser.js","names":[],"sources":["../../../src/sections/Security/AddUser.tsx"],"sourcesContent":["import { yupResolver } from '@hookform/resolvers/yup';\nimport { Button, Link, Typography } from '@mui/material';\nimport React, { useCallback, useEffect, useRef } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { Link as RouterLink, useLocation, useNavigate } from 'react-router';\n\nimport { useDataMutation } from '../../api/use-data-mutation';\nimport LoginDialogFormError from '../../components/LoginDialog/LoginDialogFormError';\nimport PasswordField from '../../components/LoginForm/PasswordField';\nimport UsernameField from '../../components/LoginForm/UsernameField';\nimport { getConfiguration } from '../../configuration';\nimport SecurityLayout from '../../layouts/Security/Dialog';\nimport { useAuth } from '../../providers/AuthProvider/AuthProvider';\nimport { authErrorMessage } from '../../providers/AuthProvider/utils';\nimport { saveAuth } from '../../store/storage';\nimport { stripTrailingSlash } from '../../store/utils';\nimport { Route } from '../../utils';\nimport { APIRoute } from '../../utils/routes';\nimport { generateSessionId } from '../../utils/session-id';\nimport type { AddUserFormValues } from '../../utils/schemas';\nimport { addUserSchema } from '../../utils/schemas';\nimport { MessageType } from './Success';\nimport { SecurityContainer, SecurityForm, SecurityTextField } from './styles';\nimport { getSecurityUrlParams } from './utils';\n\ntype AddUserBody = {\n name: string;\n password: string;\n email?: string;\n // the signup endpoint rejects requests without a 36-char session id\n sessionId: string;\n};\n\nconst AddUser: React.FC = () => {\n const { t } = useTranslation();\n const location = useLocation();\n const navigate = useNavigate();\n const { setUserState } = useAuth();\n const configuration = getConfiguration();\n const basePath = stripTrailingSlash(configuration.base);\n const { next, user } = getSecurityUrlParams(location);\n const loginLink = Route.LOGIN + (next ? `?next=${encodeURIComponent(next)}` : '');\n const createUserEnabled = configuration?.flags?.createUser;\n const form = useForm<AddUserFormValues>({\n mode: 'onChange',\n defaultValues: {\n username: typeof user === 'string' ? user : '',\n password: '',\n email: '',\n },\n resolver: yupResolver(addUserSchema),\n });\n\n const {\n setError,\n handleSubmit,\n register,\n formState: { isValid, isSubmitting, errors },\n } = form;\n\n const { trigger } = useDataMutation<{ token?: string; username?: string }>(\n basePath,\n APIRoute.SIGNUP,\n 'PUT'\n );\n\n const handleAddUser = useCallback(\n async (body: AddUserBody) => {\n return await trigger(body);\n },\n [trigger]\n );\n\n // `disabled={isSubmitting}` only applies after a re-render; clicks landing in\n // the same React batch would still fire duplicate requests\n const inFlight = useRef(false);\n\n const onSubmit = useCallback(\n async (data: AddUserFormValues) => {\n if (inFlight.current) {\n return;\n }\n inFlight.current = true;\n try {\n const result = await handleAddUser({\n name: data.username,\n password: data.password,\n email: data.email,\n sessionId: generateSessionId(),\n });\n if (!result || !result.username || !result.token) {\n // a 2xx with an unexpected body must not pass as a successful signup\n throw new Error('signup response is missing the token');\n }\n saveAuth(result.username, result.token);\n // AuthProvider reads storage only once, so the header needs the state update\n setUserState?.({ username: result.username, token: result.token });\n navigate(`${Route.SUCCESS}?messageType=${MessageType.AddUser}`);\n } catch (err) {\n setError('root', {\n type: 'server',\n message: authErrorMessage(err, t('security.error.unable-to-add-user')),\n });\n } finally {\n inFlight.current = false;\n }\n },\n [handleAddUser, setError, setUserState, navigate, t]\n );\n\n useEffect(() => {\n if (!createUserEnabled) {\n navigate('/');\n }\n }, [createUserEnabled, navigate]);\n\n return createUserEnabled ? (\n <SecurityLayout>\n <SecurityContainer>\n <SecurityForm onSubmit={handleSubmit(onSubmit)}>\n <Typography align=\"center\" component=\"h1\" gutterBottom={true} variant=\"h4\">\n {t('security.addUser.title')}\n </Typography>\n <UsernameField errors={errors} register={register} />\n <PasswordField errors={errors} register={register} />\n\n <SecurityTextField\n error={!!errors.email}\n // without this the submit button silently stays disabled on an\n // invalid email, with no visible reason\n helperText={errors.email?.message ? t(errors.email.message) : undefined}\n label={t('security.addUser.email')}\n type=\"email\"\n {...register('email')}\n />\n\n <Typography color=\"text.secondary\" paragraph={true} sx={{ fontSize: 12 }} variant=\"body2\">\n {t('security.addUser.emailDescription')}\n </Typography>\n {errors.root && <LoginDialogFormError error={errors.root} />}\n <Button\n color=\"primary\"\n disabled={!isValid || isSubmitting}\n fullWidth={true}\n sx={{ mt: 2 }}\n type=\"submit\"\n variant=\"contained\"\n >\n {t('security.addUser.submit')}\n </Button>\n <Typography align=\"center\" sx={{ mt: 2, fontSize: 12 }} variant=\"body2\">\n {t('security.addUser.alreadyUserQuestion')}\n <Link component={RouterLink} sx={{ ml: 1 }} to={loginLink}>\n {t('security.addUser.login')}\n </Link>\n </Typography>\n </SecurityForm>\n </SecurityContainer>\n </SecurityLayout>\n ) : null;\n};\n\nexport default AddUser;\n"],"mappings":"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"}
1
+ {"version":3,"file":"AddUser.js","names":["useTranslation","useLocation","useNavigate","useAuth","getConfiguration","stripTrailingSlash","getSecurityUrlParams","Route","useForm","yupResolver","addUserSchema","useDataMutation","APIRoute","useCallback","useRef","generateSessionId","MessageType","authErrorMessage","SecurityLayout","SecurityContainer","SecurityForm","Typography","UsernameField","PasswordField","SecurityTextField","LoginDialogFormError","Button","Link","RouterLink"],"sources":["../../../src/sections/Security/AddUser.tsx"],"sourcesContent":["import { yupResolver } from '@hookform/resolvers/yup';\nimport { Button, Link, Typography } from '@mui/material';\nimport React, { useCallback, useEffect, useRef } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { Link as RouterLink, useLocation, useNavigate } from 'react-router';\n\nimport { useDataMutation } from '../../api/use-data-mutation';\nimport LoginDialogFormError from '../../components/LoginDialog/LoginDialogFormError';\nimport PasswordField from '../../components/LoginForm/PasswordField';\nimport UsernameField from '../../components/LoginForm/UsernameField';\nimport { getConfiguration } from '../../configuration';\nimport SecurityLayout from '../../layouts/Security/Dialog';\nimport { useAuth } from '../../providers/AuthProvider/AuthProvider';\nimport { authErrorMessage } from '../../providers/AuthProvider/utils';\nimport { saveAuth } from '../../store/storage';\nimport { stripTrailingSlash } from '../../store/utils';\nimport { Route } from '../../utils';\nimport { APIRoute } from '../../utils/routes';\nimport { generateSessionId } from '../../utils/session-id';\nimport type { AddUserFormValues } from '../../utils/schemas';\nimport { addUserSchema } from '../../utils/schemas';\nimport { MessageType } from './Success';\nimport { SecurityContainer, SecurityForm, SecurityTextField } from './styles';\nimport { getSecurityUrlParams } from './utils';\n\ntype AddUserBody = {\n name: string;\n password: string;\n email?: string;\n // the signup endpoint rejects requests without a 36-char session id\n sessionId: string;\n};\n\nconst AddUser: React.FC = () => {\n const { t } = useTranslation();\n const location = useLocation();\n const navigate = useNavigate();\n const { setUserState } = useAuth();\n const configuration = getConfiguration();\n const basePath = stripTrailingSlash(configuration.base);\n const { next, user } = getSecurityUrlParams(location);\n const loginLink = Route.LOGIN + (next ? `?next=${encodeURIComponent(next)}` : '');\n const createUserEnabled = configuration?.flags?.createUser;\n const form = useForm<AddUserFormValues>({\n mode: 'onChange',\n defaultValues: {\n username: typeof user === 'string' ? user : '',\n password: '',\n email: '',\n },\n resolver: yupResolver(addUserSchema),\n });\n\n const {\n setError,\n handleSubmit,\n register,\n formState: { isValid, isSubmitting, errors },\n } = form;\n\n const { trigger } = useDataMutation<{ token?: string; username?: string }>(\n basePath,\n APIRoute.SIGNUP,\n 'PUT'\n );\n\n const handleAddUser = useCallback(\n async (body: AddUserBody) => {\n return await trigger(body);\n },\n [trigger]\n );\n\n // `disabled={isSubmitting}` only applies after a re-render; clicks landing in\n // the same React batch would still fire duplicate requests\n const inFlight = useRef(false);\n\n const onSubmit = useCallback(\n async (data: AddUserFormValues) => {\n if (inFlight.current) {\n return;\n }\n inFlight.current = true;\n try {\n const result = await handleAddUser({\n name: data.username,\n password: data.password,\n email: data.email,\n sessionId: generateSessionId(),\n });\n if (!result || !result.username || !result.token) {\n // a 2xx with an unexpected body must not pass as a successful signup\n throw new Error('signup response is missing the token');\n }\n saveAuth(result.username, result.token);\n // AuthProvider reads storage only once, so the header needs the state update\n setUserState?.({ username: result.username, token: result.token });\n navigate(`${Route.SUCCESS}?messageType=${MessageType.AddUser}`);\n } catch (err) {\n setError('root', {\n type: 'server',\n message: authErrorMessage(err, t('security.error.unable-to-add-user')),\n });\n } finally {\n inFlight.current = false;\n }\n },\n [handleAddUser, setError, setUserState, navigate, t]\n );\n\n useEffect(() => {\n if (!createUserEnabled) {\n navigate('/');\n }\n }, [createUserEnabled, navigate]);\n\n return createUserEnabled ? (\n <SecurityLayout>\n <SecurityContainer>\n <SecurityForm onSubmit={handleSubmit(onSubmit)}>\n <Typography align=\"center\" component=\"h1\" gutterBottom={true} variant=\"h4\">\n {t('security.addUser.title')}\n </Typography>\n <UsernameField errors={errors} register={register} />\n <PasswordField errors={errors} register={register} />\n\n <SecurityTextField\n error={!!errors.email}\n // without this the submit button silently stays disabled on an\n // invalid email, with no visible reason\n helperText={errors.email?.message ? t(errors.email.message) : undefined}\n label={t('security.addUser.email')}\n type=\"email\"\n {...register('email')}\n />\n\n <Typography color=\"text.secondary\" paragraph={true} sx={{ fontSize: 12 }} variant=\"body2\">\n {t('security.addUser.emailDescription')}\n </Typography>\n {errors.root && <LoginDialogFormError error={errors.root} />}\n <Button\n color=\"primary\"\n disabled={!isValid || isSubmitting}\n fullWidth={true}\n sx={{ mt: 2 }}\n type=\"submit\"\n variant=\"contained\"\n >\n {t('security.addUser.submit')}\n </Button>\n <Typography align=\"center\" sx={{ mt: 2, fontSize: 12 }} variant=\"body2\">\n {t('security.addUser.alreadyUserQuestion')}\n <Link component={RouterLink} sx={{ ml: 1 }} to={loginLink}>\n {t('security.addUser.login')}\n </Link>\n </Typography>\n </SecurityForm>\n </SecurityContainer>\n </SecurityLayout>\n ) : null;\n};\n\nexport default AddUser;\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"AddUser.mjs","names":[],"sources":["../../../src/sections/Security/AddUser.tsx"],"sourcesContent":["import { yupResolver } from '@hookform/resolvers/yup';\nimport { Button, Link, Typography } from '@mui/material';\nimport React, { useCallback, useEffect, useRef } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { Link as RouterLink, useLocation, useNavigate } from 'react-router';\n\nimport { useDataMutation } from '../../api/use-data-mutation';\nimport LoginDialogFormError from '../../components/LoginDialog/LoginDialogFormError';\nimport PasswordField from '../../components/LoginForm/PasswordField';\nimport UsernameField from '../../components/LoginForm/UsernameField';\nimport { getConfiguration } from '../../configuration';\nimport SecurityLayout from '../../layouts/Security/Dialog';\nimport { useAuth } from '../../providers/AuthProvider/AuthProvider';\nimport { authErrorMessage } from '../../providers/AuthProvider/utils';\nimport { saveAuth } from '../../store/storage';\nimport { stripTrailingSlash } from '../../store/utils';\nimport { Route } from '../../utils';\nimport { APIRoute } from '../../utils/routes';\nimport { generateSessionId } from '../../utils/session-id';\nimport type { AddUserFormValues } from '../../utils/schemas';\nimport { addUserSchema } from '../../utils/schemas';\nimport { MessageType } from './Success';\nimport { SecurityContainer, SecurityForm, SecurityTextField } from './styles';\nimport { getSecurityUrlParams } from './utils';\n\ntype AddUserBody = {\n name: string;\n password: string;\n email?: string;\n // the signup endpoint rejects requests without a 36-char session id\n sessionId: string;\n};\n\nconst AddUser: React.FC = () => {\n const { t } = useTranslation();\n const location = useLocation();\n const navigate = useNavigate();\n const { setUserState } = useAuth();\n const configuration = getConfiguration();\n const basePath = stripTrailingSlash(configuration.base);\n const { next, user } = getSecurityUrlParams(location);\n const loginLink = Route.LOGIN + (next ? `?next=${encodeURIComponent(next)}` : '');\n const createUserEnabled = configuration?.flags?.createUser;\n const form = useForm<AddUserFormValues>({\n mode: 'onChange',\n defaultValues: {\n username: typeof user === 'string' ? user : '',\n password: '',\n email: '',\n },\n resolver: yupResolver(addUserSchema),\n });\n\n const {\n setError,\n handleSubmit,\n register,\n formState: { isValid, isSubmitting, errors },\n } = form;\n\n const { trigger } = useDataMutation<{ token?: string; username?: string }>(\n basePath,\n APIRoute.SIGNUP,\n 'PUT'\n );\n\n const handleAddUser = useCallback(\n async (body: AddUserBody) => {\n return await trigger(body);\n },\n [trigger]\n );\n\n // `disabled={isSubmitting}` only applies after a re-render; clicks landing in\n // the same React batch would still fire duplicate requests\n const inFlight = useRef(false);\n\n const onSubmit = useCallback(\n async (data: AddUserFormValues) => {\n if (inFlight.current) {\n return;\n }\n inFlight.current = true;\n try {\n const result = await handleAddUser({\n name: data.username,\n password: data.password,\n email: data.email,\n sessionId: generateSessionId(),\n });\n if (!result || !result.username || !result.token) {\n // a 2xx with an unexpected body must not pass as a successful signup\n throw new Error('signup response is missing the token');\n }\n saveAuth(result.username, result.token);\n // AuthProvider reads storage only once, so the header needs the state update\n setUserState?.({ username: result.username, token: result.token });\n navigate(`${Route.SUCCESS}?messageType=${MessageType.AddUser}`);\n } catch (err) {\n setError('root', {\n type: 'server',\n message: authErrorMessage(err, t('security.error.unable-to-add-user')),\n });\n } finally {\n inFlight.current = false;\n }\n },\n [handleAddUser, setError, setUserState, navigate, t]\n );\n\n useEffect(() => {\n if (!createUserEnabled) {\n navigate('/');\n }\n }, [createUserEnabled, navigate]);\n\n return createUserEnabled ? (\n <SecurityLayout>\n <SecurityContainer>\n <SecurityForm onSubmit={handleSubmit(onSubmit)}>\n <Typography align=\"center\" component=\"h1\" gutterBottom={true} variant=\"h4\">\n {t('security.addUser.title')}\n </Typography>\n <UsernameField errors={errors} register={register} />\n <PasswordField errors={errors} register={register} />\n\n <SecurityTextField\n error={!!errors.email}\n // without this the submit button silently stays disabled on an\n // invalid email, with no visible reason\n helperText={errors.email?.message ? t(errors.email.message) : undefined}\n label={t('security.addUser.email')}\n type=\"email\"\n {...register('email')}\n />\n\n <Typography color=\"text.secondary\" paragraph={true} sx={{ fontSize: 12 }} variant=\"body2\">\n {t('security.addUser.emailDescription')}\n </Typography>\n {errors.root && <LoginDialogFormError error={errors.root} />}\n <Button\n color=\"primary\"\n disabled={!isValid || isSubmitting}\n fullWidth={true}\n sx={{ mt: 2 }}\n type=\"submit\"\n variant=\"contained\"\n >\n {t('security.addUser.submit')}\n </Button>\n <Typography align=\"center\" sx={{ mt: 2, fontSize: 12 }} variant=\"body2\">\n {t('security.addUser.alreadyUserQuestion')}\n <Link component={RouterLink} sx={{ ml: 1 }} to={loginLink}>\n {t('security.addUser.login')}\n </Link>\n </Typography>\n </SecurityForm>\n </SecurityContainer>\n </SecurityLayout>\n ) : null;\n};\n\nexport default AddUser;\n"],"mappings":"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"}
1
+ {"version":3,"file":"AddUser.mjs","names":["Route","Link","RouterLink"],"sources":["../../../src/sections/Security/AddUser.tsx"],"sourcesContent":["import { yupResolver } from '@hookform/resolvers/yup';\nimport { Button, Link, Typography } from '@mui/material';\nimport React, { useCallback, useEffect, useRef } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { Link as RouterLink, useLocation, useNavigate } from 'react-router';\n\nimport { useDataMutation } from '../../api/use-data-mutation';\nimport LoginDialogFormError from '../../components/LoginDialog/LoginDialogFormError';\nimport PasswordField from '../../components/LoginForm/PasswordField';\nimport UsernameField from '../../components/LoginForm/UsernameField';\nimport { getConfiguration } from '../../configuration';\nimport SecurityLayout from '../../layouts/Security/Dialog';\nimport { useAuth } from '../../providers/AuthProvider/AuthProvider';\nimport { authErrorMessage } from '../../providers/AuthProvider/utils';\nimport { saveAuth } from '../../store/storage';\nimport { stripTrailingSlash } from '../../store/utils';\nimport { Route } from '../../utils';\nimport { APIRoute } from '../../utils/routes';\nimport { generateSessionId } from '../../utils/session-id';\nimport type { AddUserFormValues } from '../../utils/schemas';\nimport { addUserSchema } from '../../utils/schemas';\nimport { MessageType } from './Success';\nimport { SecurityContainer, SecurityForm, SecurityTextField } from './styles';\nimport { getSecurityUrlParams } from './utils';\n\ntype AddUserBody = {\n name: string;\n password: string;\n email?: string;\n // the signup endpoint rejects requests without a 36-char session id\n sessionId: string;\n};\n\nconst AddUser: React.FC = () => {\n const { t } = useTranslation();\n const location = useLocation();\n const navigate = useNavigate();\n const { setUserState } = useAuth();\n const configuration = getConfiguration();\n const basePath = stripTrailingSlash(configuration.base);\n const { next, user } = getSecurityUrlParams(location);\n const loginLink = Route.LOGIN + (next ? `?next=${encodeURIComponent(next)}` : '');\n const createUserEnabled = configuration?.flags?.createUser;\n const form = useForm<AddUserFormValues>({\n mode: 'onChange',\n defaultValues: {\n username: typeof user === 'string' ? user : '',\n password: '',\n email: '',\n },\n resolver: yupResolver(addUserSchema),\n });\n\n const {\n setError,\n handleSubmit,\n register,\n formState: { isValid, isSubmitting, errors },\n } = form;\n\n const { trigger } = useDataMutation<{ token?: string; username?: string }>(\n basePath,\n APIRoute.SIGNUP,\n 'PUT'\n );\n\n const handleAddUser = useCallback(\n async (body: AddUserBody) => {\n return await trigger(body);\n },\n [trigger]\n );\n\n // `disabled={isSubmitting}` only applies after a re-render; clicks landing in\n // the same React batch would still fire duplicate requests\n const inFlight = useRef(false);\n\n const onSubmit = useCallback(\n async (data: AddUserFormValues) => {\n if (inFlight.current) {\n return;\n }\n inFlight.current = true;\n try {\n const result = await handleAddUser({\n name: data.username,\n password: data.password,\n email: data.email,\n sessionId: generateSessionId(),\n });\n if (!result || !result.username || !result.token) {\n // a 2xx with an unexpected body must not pass as a successful signup\n throw new Error('signup response is missing the token');\n }\n saveAuth(result.username, result.token);\n // AuthProvider reads storage only once, so the header needs the state update\n setUserState?.({ username: result.username, token: result.token });\n navigate(`${Route.SUCCESS}?messageType=${MessageType.AddUser}`);\n } catch (err) {\n setError('root', {\n type: 'server',\n message: authErrorMessage(err, t('security.error.unable-to-add-user')),\n });\n } finally {\n inFlight.current = false;\n }\n },\n [handleAddUser, setError, setUserState, navigate, t]\n );\n\n useEffect(() => {\n if (!createUserEnabled) {\n navigate('/');\n }\n }, [createUserEnabled, navigate]);\n\n return createUserEnabled ? (\n <SecurityLayout>\n <SecurityContainer>\n <SecurityForm onSubmit={handleSubmit(onSubmit)}>\n <Typography align=\"center\" component=\"h1\" gutterBottom={true} variant=\"h4\">\n {t('security.addUser.title')}\n </Typography>\n <UsernameField errors={errors} register={register} />\n <PasswordField errors={errors} register={register} />\n\n <SecurityTextField\n error={!!errors.email}\n // without this the submit button silently stays disabled on an\n // invalid email, with no visible reason\n helperText={errors.email?.message ? t(errors.email.message) : undefined}\n label={t('security.addUser.email')}\n type=\"email\"\n {...register('email')}\n />\n\n <Typography color=\"text.secondary\" paragraph={true} sx={{ fontSize: 12 }} variant=\"body2\">\n {t('security.addUser.emailDescription')}\n </Typography>\n {errors.root && <LoginDialogFormError error={errors.root} />}\n <Button\n color=\"primary\"\n disabled={!isValid || isSubmitting}\n fullWidth={true}\n sx={{ mt: 2 }}\n type=\"submit\"\n variant=\"contained\"\n >\n {t('security.addUser.submit')}\n </Button>\n <Typography align=\"center\" sx={{ mt: 2, fontSize: 12 }} variant=\"body2\">\n {t('security.addUser.alreadyUserQuestion')}\n <Link component={RouterLink} sx={{ ml: 1 }} to={loginLink}>\n {t('security.addUser.login')}\n </Link>\n </Typography>\n </SecurityForm>\n </SecurityContainer>\n </SecurityLayout>\n ) : null;\n};\n\nexport default AddUser;\n"],"mappings":"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"}
@@ -1,12 +1,17 @@
1
1
  const require_runtime = require("../../_virtual/_rolldown/runtime.js");
2
2
  const require_routes = require("../../utils/routes.js");
3
3
  require("../../utils/index.js");
4
+ const require_storage = require("../../store/storage.js");
5
+ const require_api = require("../../store/api.js");
4
6
  const require_configuration = require("../../configuration.js");
5
7
  const require_utils = require("../../store/utils.js");
6
8
  const require_use_data_mutation = require("../../api/use-data-mutation.js");
7
9
  const require_utils$1 = require("../../providers/AuthProvider/utils.js");
10
+ const require_AuthProvider = require("../../providers/AuthProvider/AuthProvider.js");
11
+ require("../../providers/AuthProvider/index.js");
8
12
  const require_LoginDialogFormError = require("../../components/LoginDialog/LoginDialogFormError.js");
9
13
  const require_schemas = require("../../utils/schemas.js");
14
+ const require_LoginDialog = require("../../components/LoginDialog/LoginDialog.js");
10
15
  const require_Dialog = require("../../layouts/Security/Dialog.js");
11
16
  const require_styles = require("./styles.js");
12
17
  const require_Success = require("./Success.js");
@@ -22,13 +27,27 @@ let react_hook_form = require("react-hook-form");
22
27
  var ChangePassword = () => {
23
28
  const { t } = (0, react_i18next.useTranslation)();
24
29
  const navigate = (0, react_router.useNavigate)();
25
- const configuration = require_configuration.getConfiguration();
26
- const basePath = require_utils.stripTrailingSlash(configuration.base);
27
- const changePasswordEnabled = configuration?.flags?.changePassword;
30
+ const changePasswordEnabled = require_configuration.getConfiguration()?.flags?.changePassword;
31
+ const { userState } = require_AuthProvider.useAuth();
32
+ (0, react.useEffect)(() => {
33
+ if (!changePasswordEnabled) navigate("/");
34
+ }, [changePasswordEnabled, navigate]);
35
+ if (!changePasswordEnabled) return null;
36
+ if (!userState?.token) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_LoginDialog.default, {
37
+ message: t("security.changePassword.loginRequired"),
38
+ onClose: () => navigate(require_routes.Route.ROOT),
39
+ open: true
40
+ });
41
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ChangePasswordForm, {});
42
+ };
43
+ var ChangePasswordForm = () => {
44
+ const { t } = (0, react_i18next.useTranslation)();
45
+ const navigate = (0, react_router.useNavigate)();
46
+ const { setUserState } = require_AuthProvider.useAuth();
47
+ const basePath = require_utils.stripTrailingSlash(require_configuration.getConfiguration().base);
28
48
  const { setError, handleSubmit, register, formState: { isValid, isSubmitting, errors } } = (0, react_hook_form.useForm)({
29
49
  mode: "onChange",
30
50
  defaultValues: {
31
- username: "",
32
51
  oldPassword: "",
33
52
  newPassword: "",
34
53
  confirmPassword: ""
@@ -50,6 +69,21 @@ var ChangePassword = () => {
50
69
  } });
51
70
  navigate(`${require_routes.Route.SUCCESS}?messageType=${require_Success.MessageType.ChangePassword}`);
52
71
  } catch (err) {
72
+ if (err instanceof require_api.CustomError && err.code === 401) {
73
+ require_storage.clearAuth();
74
+ setUserState?.({
75
+ username: null,
76
+ token: null
77
+ });
78
+ return;
79
+ }
80
+ if (err instanceof require_api.CustomError && err.code === 400 && err.message === "invalid old password") {
81
+ setError("oldPassword", {
82
+ type: "server",
83
+ message: "security.changePassword.invalidOldPassword"
84
+ }, { shouldFocus: true });
85
+ return;
86
+ }
53
87
  setError("root", {
54
88
  type: "server",
55
89
  message: require_utils$1.authErrorMessage(err, t("security.error.unable-to-change-password"))
@@ -60,13 +94,11 @@ var ChangePassword = () => {
60
94
  }, [
61
95
  handleChangePassword,
62
96
  setError,
97
+ setUserState,
63
98
  navigate,
64
99
  t
65
100
  ]);
66
- (0, react.useEffect)(() => {
67
- if (!changePasswordEnabled) navigate("/");
68
- }, [changePasswordEnabled, navigate]);
69
- return changePasswordEnabled ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Dialog.default, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_styles.SecurityContainer, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_styles.SecurityForm, {
101
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Dialog.default, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_styles.SecurityContainer, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_styles.SecurityForm, {
70
102
  onSubmit: handleSubmit(onSubmit),
71
103
  children: [
72
104
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material.Typography, {
@@ -76,13 +108,6 @@ var ChangePassword = () => {
76
108
  variant: "h4",
77
109
  children: t("security.changePassword.title")
78
110
  }),
79
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_styles.SecurityTextField, {
80
- error: !!errors.username,
81
- helperText: errors.username?.message ? t(errors.username.message, { length: 2 }) : void 0,
82
- label: t("security.changePassword.username"),
83
- ...register("username"),
84
- required: true
85
- }),
86
111
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_styles.SecurityTextField, {
87
112
  error: !!errors.oldPassword,
88
113
  helperText: errors.oldPassword?.message ? t(errors.oldPassword.message, { length: 2 }) : void 0,
@@ -118,7 +143,7 @@ var ChangePassword = () => {
118
143
  children: t("security.changePassword.submit")
119
144
  })
120
145
  ]
121
- }) }) }) : null;
146
+ }) }) });
122
147
  };
123
148
  //#endregion
124
149
  exports.default = ChangePassword;
@@ -1 +1 @@
1
- {"version":3,"file":"ChangePassword.js","names":[],"sources":["../../../src/sections/Security/ChangePassword.tsx"],"sourcesContent":["import { yupResolver } from '@hookform/resolvers/yup';\nimport { Button, Typography } from '@mui/material';\nimport React, { useCallback, useEffect, useRef } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { useNavigate } from 'react-router';\n\nimport { useDataMutation } from '../../api/use-data-mutation';\nimport LoginDialogFormError from '../../components/LoginDialog/LoginDialogFormError';\nimport { getConfiguration } from '../../configuration';\nimport SecurityLayout from '../../layouts/Security/Dialog';\nimport { authErrorMessage } from '../../providers/AuthProvider/utils';\nimport { stripTrailingSlash } from '../../store/utils';\nimport { Route } from '../../utils';\nimport { APIRoute } from '../../utils/routes';\nimport type { ChangePasswordFormValues } from '../../utils/schemas';\nimport {\n PASSWORD_MIN_LENGTH,\n USERNAME_MIN_LENGTH,\n changePasswordSchema,\n} from '../../utils/schemas';\nimport { MessageType } from './Success';\nimport { SecurityContainer, SecurityForm, SecurityTextField } from './styles';\n\nconst ChangePassword: React.FC = () => {\n const { t } = useTranslation();\n const navigate = useNavigate();\n const configuration = getConfiguration();\n const basePath = stripTrailingSlash(configuration.base);\n const changePasswordEnabled = configuration?.flags?.changePassword;\n\n const form = useForm<ChangePasswordFormValues>({\n mode: 'onChange',\n defaultValues: {\n username: '',\n oldPassword: '',\n newPassword: '',\n confirmPassword: '',\n },\n resolver: yupResolver(changePasswordSchema),\n });\n\n const {\n setError,\n handleSubmit,\n register,\n formState: { isValid, isSubmitting, errors },\n } = form;\n\n const { trigger } = useDataMutation<{ ok: string }>(basePath, APIRoute.RESET_PASSWORD, 'PUT');\n\n const handleChangePassword = useCallback(\n async (body: { password: { old: string; new: string } }) => {\n await trigger(body);\n },\n [trigger]\n );\n\n // `disabled={isSubmitting}` only applies after a re-render; clicks landing in\n // the same React batch would still fire duplicate requests\n const inFlight = useRef(false);\n\n const onSubmit = useCallback(\n async (data: ChangePasswordFormValues) => {\n if (inFlight.current) {\n return;\n }\n inFlight.current = true;\n try {\n await handleChangePassword({\n password: {\n old: data.oldPassword,\n new: data.newPassword,\n },\n });\n navigate(`${Route.SUCCESS}?messageType=${MessageType.ChangePassword}`);\n } catch (err) {\n setError('root', {\n type: 'server',\n message: authErrorMessage(err, t('security.error.unable-to-change-password')),\n });\n } finally {\n inFlight.current = false;\n }\n },\n [handleChangePassword, setError, navigate, t]\n );\n\n useEffect(() => {\n if (!changePasswordEnabled) {\n navigate('/');\n }\n }, [changePasswordEnabled, navigate]);\n\n return changePasswordEnabled ? (\n <SecurityLayout>\n <SecurityContainer>\n <SecurityForm onSubmit={handleSubmit(onSubmit)}>\n <Typography align=\"center\" component=\"h1\" gutterBottom={true} variant=\"h4\">\n {t('security.changePassword.title')}\n </Typography>\n <SecurityTextField\n error={!!errors.username}\n helperText={\n errors.username?.message\n ? t(errors.username.message, { length: USERNAME_MIN_LENGTH })\n : undefined\n }\n label={t('security.changePassword.username')}\n {...register('username')}\n required={true}\n />\n <SecurityTextField\n error={!!errors.oldPassword}\n helperText={\n errors.oldPassword?.message\n ? t(errors.oldPassword.message, { length: PASSWORD_MIN_LENGTH })\n : undefined\n }\n label={t('security.changePassword.oldPassword')}\n {...register('oldPassword')}\n required={true}\n type=\"password\"\n />\n <SecurityTextField\n error={!!errors.newPassword}\n helperText={\n errors.newPassword?.message\n ? t(errors.newPassword.message, { length: PASSWORD_MIN_LENGTH })\n : undefined\n }\n label={t('security.changePassword.newPassword')}\n {...register('newPassword')}\n required={true}\n type=\"password\"\n />\n <SecurityTextField\n error={!!errors.confirmPassword}\n helperText={\n errors.confirmPassword?.message ? t(errors.confirmPassword.message) : undefined\n }\n label={t('security.changePassword.confirmPassword')}\n {...register('confirmPassword')}\n required={true}\n type=\"password\"\n />\n {errors.root && <LoginDialogFormError error={errors.root} />}\n <Button\n color=\"primary\"\n disabled={!isValid || isSubmitting}\n fullWidth={true}\n sx={{ mt: 2 }}\n type=\"submit\"\n variant=\"contained\"\n >\n {t('security.changePassword.submit')}\n </Button>\n </SecurityForm>\n </SecurityContainer>\n </SecurityLayout>\n ) : null;\n};\n\nexport default ChangePassword;\n"],"mappings":"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"}
1
+ {"version":3,"file":"ChangePassword.js","names":["useTranslation","useNavigate","getConfiguration","useAuth","LoginDialog","Route","stripTrailingSlash","useForm","yupResolver","changePasswordSchema","useDataMutation","APIRoute","useCallback","useRef","MessageType","CustomError","authErrorMessage","SecurityLayout","SecurityContainer","SecurityForm","Typography","SecurityTextField","LoginDialogFormError","Button"],"sources":["../../../src/sections/Security/ChangePassword.tsx"],"sourcesContent":["import { yupResolver } from '@hookform/resolvers/yup';\nimport { Button, Typography } from '@mui/material';\nimport React, { useCallback, useEffect, useRef } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { useNavigate } from 'react-router';\n\nimport { useDataMutation } from '../../api/use-data-mutation';\nimport LoginDialog from '../../components/LoginDialog/LoginDialog';\nimport LoginDialogFormError from '../../components/LoginDialog/LoginDialogFormError';\nimport { getConfiguration } from '../../configuration';\nimport SecurityLayout from '../../layouts/Security/Dialog';\nimport { useAuth } from '../../providers/AuthProvider';\nimport { authErrorMessage } from '../../providers/AuthProvider/utils';\nimport { CustomError } from '../../store/api';\nimport { clearAuth } from '../../store/storage';\nimport { stripTrailingSlash } from '../../store/utils';\nimport { Route } from '../../utils';\nimport { APIRoute } from '../../utils/routes';\nimport type { ChangePasswordFormValues } from '../../utils/schemas';\nimport { PASSWORD_MIN_LENGTH, changePasswordSchema } from '../../utils/schemas';\nimport { MessageType } from './Success';\nimport { SecurityContainer, SecurityForm, SecurityTextField } from './styles';\n\nconst ChangePassword: React.FC = () => {\n const { t } = useTranslation();\n const navigate = useNavigate();\n const configuration = getConfiguration();\n const changePasswordEnabled = configuration?.flags?.changePassword;\n\n const { userState } = useAuth();\n\n useEffect(() => {\n if (!changePasswordEnabled) {\n navigate('/');\n }\n }, [changePasswordEnabled, navigate]);\n\n if (!changePasswordEnabled) {\n return null;\n }\n\n if (!userState?.token) {\n return (\n <LoginDialog\n message={t('security.changePassword.loginRequired')}\n onClose={() => navigate(Route.ROOT)}\n open={true}\n />\n );\n }\n\n return <ChangePasswordForm />;\n};\n\nconst ChangePasswordForm: React.FC = () => {\n const { t } = useTranslation();\n const navigate = useNavigate();\n const { setUserState } = useAuth();\n const basePath = stripTrailingSlash(getConfiguration().base);\n const form = useForm<ChangePasswordFormValues>({\n mode: 'onChange',\n defaultValues: {\n oldPassword: '',\n newPassword: '',\n confirmPassword: '',\n },\n resolver: yupResolver(changePasswordSchema),\n });\n\n const {\n setError,\n handleSubmit,\n register,\n formState: { isValid, isSubmitting, errors },\n } = form;\n\n const { trigger } = useDataMutation<{ ok: string }>(basePath, APIRoute.RESET_PASSWORD, 'PUT');\n\n const handleChangePassword = useCallback(\n async (body: { password: { old: string; new: string } }) => {\n await trigger(body);\n },\n [trigger]\n );\n\n // `disabled={isSubmitting}` only applies after a re-render; clicks landing in\n // the same React batch would still fire duplicate requests\n const inFlight = useRef(false);\n\n const onSubmit = useCallback(\n async (data: ChangePasswordFormValues) => {\n if (inFlight.current) {\n return;\n }\n inFlight.current = true;\n try {\n await handleChangePassword({\n password: {\n old: data.oldPassword,\n new: data.newPassword,\n },\n });\n navigate(`${Route.SUCCESS}?messageType=${MessageType.ChangePassword}`);\n } catch (err) {\n if (err instanceof CustomError && err.code === 401) {\n clearAuth();\n setUserState?.({ username: null, token: null });\n return;\n }\n if (\n err instanceof CustomError &&\n err.code === 400 &&\n err.message === 'invalid old password'\n ) {\n setError(\n 'oldPassword',\n {\n type: 'server',\n message: 'security.changePassword.invalidOldPassword',\n },\n { shouldFocus: true }\n );\n return;\n }\n setError('root', {\n type: 'server',\n message: authErrorMessage(err, t('security.error.unable-to-change-password')),\n });\n } finally {\n inFlight.current = false;\n }\n },\n [handleChangePassword, setError, setUserState, navigate, t]\n );\n\n return (\n <SecurityLayout>\n <SecurityContainer>\n <SecurityForm onSubmit={handleSubmit(onSubmit)}>\n <Typography align=\"center\" component=\"h1\" gutterBottom={true} variant=\"h4\">\n {t('security.changePassword.title')}\n </Typography>\n <SecurityTextField\n error={!!errors.oldPassword}\n helperText={\n errors.oldPassword?.message\n ? t(errors.oldPassword.message, { length: PASSWORD_MIN_LENGTH })\n : undefined\n }\n label={t('security.changePassword.oldPassword')}\n {...register('oldPassword')}\n required={true}\n type=\"password\"\n />\n <SecurityTextField\n error={!!errors.newPassword}\n helperText={\n errors.newPassword?.message\n ? t(errors.newPassword.message, { length: PASSWORD_MIN_LENGTH })\n : undefined\n }\n label={t('security.changePassword.newPassword')}\n {...register('newPassword')}\n required={true}\n type=\"password\"\n />\n <SecurityTextField\n error={!!errors.confirmPassword}\n helperText={\n errors.confirmPassword?.message ? t(errors.confirmPassword.message) : undefined\n }\n label={t('security.changePassword.confirmPassword')}\n {...register('confirmPassword')}\n required={true}\n type=\"password\"\n />\n {errors.root && <LoginDialogFormError error={errors.root} />}\n <Button\n color=\"primary\"\n disabled={!isValid || isSubmitting}\n fullWidth={true}\n sx={{ mt: 2 }}\n type=\"submit\"\n variant=\"contained\"\n >\n {t('security.changePassword.submit')}\n </Button>\n </SecurityForm>\n </SecurityContainer>\n </SecurityLayout>\n );\n};\n\nexport default ChangePassword;\n"],"mappings":"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"}
@@ -1,11 +1,16 @@
1
1
  import { APIRoute, Route as Route$1 } from "../../utils/routes.mjs";
2
2
  import "../../utils/index.mjs";
3
+ import { clearAuth } from "../../store/storage.mjs";
4
+ import { CustomError } from "../../store/api.mjs";
3
5
  import { getConfiguration } from "../../configuration.mjs";
4
6
  import { stripTrailingSlash } from "../../store/utils.mjs";
5
7
  import { useDataMutation } from "../../api/use-data-mutation.mjs";
6
8
  import { authErrorMessage } from "../../providers/AuthProvider/utils.mjs";
9
+ import { useAuth } from "../../providers/AuthProvider/AuthProvider.mjs";
10
+ import "../../providers/AuthProvider/index.mjs";
7
11
  import LoginDialogFormError from "../../components/LoginDialog/LoginDialogFormError.mjs";
8
12
  import { changePasswordSchema } from "../../utils/schemas.mjs";
13
+ import LoginDialog from "../../components/LoginDialog/LoginDialog.mjs";
9
14
  import SecurityLayout from "../../layouts/Security/Dialog.mjs";
10
15
  import { SecurityContainer, SecurityForm, SecurityTextField } from "./styles.mjs";
11
16
  import { MessageType } from "./Success.mjs";
@@ -20,13 +25,27 @@ import { useForm } from "react-hook-form";
20
25
  var ChangePassword = () => {
21
26
  const { t } = useTranslation();
22
27
  const navigate = useNavigate();
23
- const configuration = getConfiguration();
24
- const basePath = stripTrailingSlash(configuration.base);
25
- const changePasswordEnabled = configuration?.flags?.changePassword;
28
+ const changePasswordEnabled = getConfiguration()?.flags?.changePassword;
29
+ const { userState } = useAuth();
30
+ useEffect(() => {
31
+ if (!changePasswordEnabled) navigate("/");
32
+ }, [changePasswordEnabled, navigate]);
33
+ if (!changePasswordEnabled) return null;
34
+ if (!userState?.token) return /* @__PURE__ */ jsx(LoginDialog, {
35
+ message: t("security.changePassword.loginRequired"),
36
+ onClose: () => navigate(Route$1.ROOT),
37
+ open: true
38
+ });
39
+ return /* @__PURE__ */ jsx(ChangePasswordForm, {});
40
+ };
41
+ var ChangePasswordForm = () => {
42
+ const { t } = useTranslation();
43
+ const navigate = useNavigate();
44
+ const { setUserState } = useAuth();
45
+ const basePath = stripTrailingSlash(getConfiguration().base);
26
46
  const { setError, handleSubmit, register, formState: { isValid, isSubmitting, errors } } = useForm({
27
47
  mode: "onChange",
28
48
  defaultValues: {
29
- username: "",
30
49
  oldPassword: "",
31
50
  newPassword: "",
32
51
  confirmPassword: ""
@@ -48,6 +67,21 @@ var ChangePassword = () => {
48
67
  } });
49
68
  navigate(`${Route$1.SUCCESS}?messageType=${MessageType.ChangePassword}`);
50
69
  } catch (err) {
70
+ if (err instanceof CustomError && err.code === 401) {
71
+ clearAuth();
72
+ setUserState?.({
73
+ username: null,
74
+ token: null
75
+ });
76
+ return;
77
+ }
78
+ if (err instanceof CustomError && err.code === 400 && err.message === "invalid old password") {
79
+ setError("oldPassword", {
80
+ type: "server",
81
+ message: "security.changePassword.invalidOldPassword"
82
+ }, { shouldFocus: true });
83
+ return;
84
+ }
51
85
  setError("root", {
52
86
  type: "server",
53
87
  message: authErrorMessage(err, t("security.error.unable-to-change-password"))
@@ -58,13 +92,11 @@ var ChangePassword = () => {
58
92
  }, [
59
93
  handleChangePassword,
60
94
  setError,
95
+ setUserState,
61
96
  navigate,
62
97
  t
63
98
  ]);
64
- useEffect(() => {
65
- if (!changePasswordEnabled) navigate("/");
66
- }, [changePasswordEnabled, navigate]);
67
- return changePasswordEnabled ? /* @__PURE__ */ jsx(SecurityLayout, { children: /* @__PURE__ */ jsx(SecurityContainer, { children: /* @__PURE__ */ jsxs(SecurityForm, {
99
+ return /* @__PURE__ */ jsx(SecurityLayout, { children: /* @__PURE__ */ jsx(SecurityContainer, { children: /* @__PURE__ */ jsxs(SecurityForm, {
68
100
  onSubmit: handleSubmit(onSubmit),
69
101
  children: [
70
102
  /* @__PURE__ */ jsx(Typography, {
@@ -74,13 +106,6 @@ var ChangePassword = () => {
74
106
  variant: "h4",
75
107
  children: t("security.changePassword.title")
76
108
  }),
77
- /* @__PURE__ */ jsx(SecurityTextField, {
78
- error: !!errors.username,
79
- helperText: errors.username?.message ? t(errors.username.message, { length: 2 }) : void 0,
80
- label: t("security.changePassword.username"),
81
- ...register("username"),
82
- required: true
83
- }),
84
109
  /* @__PURE__ */ jsx(SecurityTextField, {
85
110
  error: !!errors.oldPassword,
86
111
  helperText: errors.oldPassword?.message ? t(errors.oldPassword.message, { length: 2 }) : void 0,
@@ -116,7 +141,7 @@ var ChangePassword = () => {
116
141
  children: t("security.changePassword.submit")
117
142
  })
118
143
  ]
119
- }) }) }) : null;
144
+ }) }) });
120
145
  };
121
146
  //#endregion
122
147
  export { ChangePassword as default };
@@ -1 +1 @@
1
- {"version":3,"file":"ChangePassword.mjs","names":[],"sources":["../../../src/sections/Security/ChangePassword.tsx"],"sourcesContent":["import { yupResolver } from '@hookform/resolvers/yup';\nimport { Button, Typography } from '@mui/material';\nimport React, { useCallback, useEffect, useRef } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { useNavigate } from 'react-router';\n\nimport { useDataMutation } from '../../api/use-data-mutation';\nimport LoginDialogFormError from '../../components/LoginDialog/LoginDialogFormError';\nimport { getConfiguration } from '../../configuration';\nimport SecurityLayout from '../../layouts/Security/Dialog';\nimport { authErrorMessage } from '../../providers/AuthProvider/utils';\nimport { stripTrailingSlash } from '../../store/utils';\nimport { Route } from '../../utils';\nimport { APIRoute } from '../../utils/routes';\nimport type { ChangePasswordFormValues } from '../../utils/schemas';\nimport {\n PASSWORD_MIN_LENGTH,\n USERNAME_MIN_LENGTH,\n changePasswordSchema,\n} from '../../utils/schemas';\nimport { MessageType } from './Success';\nimport { SecurityContainer, SecurityForm, SecurityTextField } from './styles';\n\nconst ChangePassword: React.FC = () => {\n const { t } = useTranslation();\n const navigate = useNavigate();\n const configuration = getConfiguration();\n const basePath = stripTrailingSlash(configuration.base);\n const changePasswordEnabled = configuration?.flags?.changePassword;\n\n const form = useForm<ChangePasswordFormValues>({\n mode: 'onChange',\n defaultValues: {\n username: '',\n oldPassword: '',\n newPassword: '',\n confirmPassword: '',\n },\n resolver: yupResolver(changePasswordSchema),\n });\n\n const {\n setError,\n handleSubmit,\n register,\n formState: { isValid, isSubmitting, errors },\n } = form;\n\n const { trigger } = useDataMutation<{ ok: string }>(basePath, APIRoute.RESET_PASSWORD, 'PUT');\n\n const handleChangePassword = useCallback(\n async (body: { password: { old: string; new: string } }) => {\n await trigger(body);\n },\n [trigger]\n );\n\n // `disabled={isSubmitting}` only applies after a re-render; clicks landing in\n // the same React batch would still fire duplicate requests\n const inFlight = useRef(false);\n\n const onSubmit = useCallback(\n async (data: ChangePasswordFormValues) => {\n if (inFlight.current) {\n return;\n }\n inFlight.current = true;\n try {\n await handleChangePassword({\n password: {\n old: data.oldPassword,\n new: data.newPassword,\n },\n });\n navigate(`${Route.SUCCESS}?messageType=${MessageType.ChangePassword}`);\n } catch (err) {\n setError('root', {\n type: 'server',\n message: authErrorMessage(err, t('security.error.unable-to-change-password')),\n });\n } finally {\n inFlight.current = false;\n }\n },\n [handleChangePassword, setError, navigate, t]\n );\n\n useEffect(() => {\n if (!changePasswordEnabled) {\n navigate('/');\n }\n }, [changePasswordEnabled, navigate]);\n\n return changePasswordEnabled ? (\n <SecurityLayout>\n <SecurityContainer>\n <SecurityForm onSubmit={handleSubmit(onSubmit)}>\n <Typography align=\"center\" component=\"h1\" gutterBottom={true} variant=\"h4\">\n {t('security.changePassword.title')}\n </Typography>\n <SecurityTextField\n error={!!errors.username}\n helperText={\n errors.username?.message\n ? t(errors.username.message, { length: USERNAME_MIN_LENGTH })\n : undefined\n }\n label={t('security.changePassword.username')}\n {...register('username')}\n required={true}\n />\n <SecurityTextField\n error={!!errors.oldPassword}\n helperText={\n errors.oldPassword?.message\n ? t(errors.oldPassword.message, { length: PASSWORD_MIN_LENGTH })\n : undefined\n }\n label={t('security.changePassword.oldPassword')}\n {...register('oldPassword')}\n required={true}\n type=\"password\"\n />\n <SecurityTextField\n error={!!errors.newPassword}\n helperText={\n errors.newPassword?.message\n ? t(errors.newPassword.message, { length: PASSWORD_MIN_LENGTH })\n : undefined\n }\n label={t('security.changePassword.newPassword')}\n {...register('newPassword')}\n required={true}\n type=\"password\"\n />\n <SecurityTextField\n error={!!errors.confirmPassword}\n helperText={\n errors.confirmPassword?.message ? t(errors.confirmPassword.message) : undefined\n }\n label={t('security.changePassword.confirmPassword')}\n {...register('confirmPassword')}\n required={true}\n type=\"password\"\n />\n {errors.root && <LoginDialogFormError error={errors.root} />}\n <Button\n color=\"primary\"\n disabled={!isValid || isSubmitting}\n fullWidth={true}\n sx={{ mt: 2 }}\n type=\"submit\"\n variant=\"contained\"\n >\n {t('security.changePassword.submit')}\n </Button>\n </SecurityForm>\n </SecurityContainer>\n </SecurityLayout>\n ) : null;\n};\n\nexport default ChangePassword;\n"],"mappings":"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"}
1
+ {"version":3,"file":"ChangePassword.mjs","names":["Route"],"sources":["../../../src/sections/Security/ChangePassword.tsx"],"sourcesContent":["import { yupResolver } from '@hookform/resolvers/yup';\nimport { Button, Typography } from '@mui/material';\nimport React, { useCallback, useEffect, useRef } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { useNavigate } from 'react-router';\n\nimport { useDataMutation } from '../../api/use-data-mutation';\nimport LoginDialog from '../../components/LoginDialog/LoginDialog';\nimport LoginDialogFormError from '../../components/LoginDialog/LoginDialogFormError';\nimport { getConfiguration } from '../../configuration';\nimport SecurityLayout from '../../layouts/Security/Dialog';\nimport { useAuth } from '../../providers/AuthProvider';\nimport { authErrorMessage } from '../../providers/AuthProvider/utils';\nimport { CustomError } from '../../store/api';\nimport { clearAuth } from '../../store/storage';\nimport { stripTrailingSlash } from '../../store/utils';\nimport { Route } from '../../utils';\nimport { APIRoute } from '../../utils/routes';\nimport type { ChangePasswordFormValues } from '../../utils/schemas';\nimport { PASSWORD_MIN_LENGTH, changePasswordSchema } from '../../utils/schemas';\nimport { MessageType } from './Success';\nimport { SecurityContainer, SecurityForm, SecurityTextField } from './styles';\n\nconst ChangePassword: React.FC = () => {\n const { t } = useTranslation();\n const navigate = useNavigate();\n const configuration = getConfiguration();\n const changePasswordEnabled = configuration?.flags?.changePassword;\n\n const { userState } = useAuth();\n\n useEffect(() => {\n if (!changePasswordEnabled) {\n navigate('/');\n }\n }, [changePasswordEnabled, navigate]);\n\n if (!changePasswordEnabled) {\n return null;\n }\n\n if (!userState?.token) {\n return (\n <LoginDialog\n message={t('security.changePassword.loginRequired')}\n onClose={() => navigate(Route.ROOT)}\n open={true}\n />\n );\n }\n\n return <ChangePasswordForm />;\n};\n\nconst ChangePasswordForm: React.FC = () => {\n const { t } = useTranslation();\n const navigate = useNavigate();\n const { setUserState } = useAuth();\n const basePath = stripTrailingSlash(getConfiguration().base);\n const form = useForm<ChangePasswordFormValues>({\n mode: 'onChange',\n defaultValues: {\n oldPassword: '',\n newPassword: '',\n confirmPassword: '',\n },\n resolver: yupResolver(changePasswordSchema),\n });\n\n const {\n setError,\n handleSubmit,\n register,\n formState: { isValid, isSubmitting, errors },\n } = form;\n\n const { trigger } = useDataMutation<{ ok: string }>(basePath, APIRoute.RESET_PASSWORD, 'PUT');\n\n const handleChangePassword = useCallback(\n async (body: { password: { old: string; new: string } }) => {\n await trigger(body);\n },\n [trigger]\n );\n\n // `disabled={isSubmitting}` only applies after a re-render; clicks landing in\n // the same React batch would still fire duplicate requests\n const inFlight = useRef(false);\n\n const onSubmit = useCallback(\n async (data: ChangePasswordFormValues) => {\n if (inFlight.current) {\n return;\n }\n inFlight.current = true;\n try {\n await handleChangePassword({\n password: {\n old: data.oldPassword,\n new: data.newPassword,\n },\n });\n navigate(`${Route.SUCCESS}?messageType=${MessageType.ChangePassword}`);\n } catch (err) {\n if (err instanceof CustomError && err.code === 401) {\n clearAuth();\n setUserState?.({ username: null, token: null });\n return;\n }\n if (\n err instanceof CustomError &&\n err.code === 400 &&\n err.message === 'invalid old password'\n ) {\n setError(\n 'oldPassword',\n {\n type: 'server',\n message: 'security.changePassword.invalidOldPassword',\n },\n { shouldFocus: true }\n );\n return;\n }\n setError('root', {\n type: 'server',\n message: authErrorMessage(err, t('security.error.unable-to-change-password')),\n });\n } finally {\n inFlight.current = false;\n }\n },\n [handleChangePassword, setError, setUserState, navigate, t]\n );\n\n return (\n <SecurityLayout>\n <SecurityContainer>\n <SecurityForm onSubmit={handleSubmit(onSubmit)}>\n <Typography align=\"center\" component=\"h1\" gutterBottom={true} variant=\"h4\">\n {t('security.changePassword.title')}\n </Typography>\n <SecurityTextField\n error={!!errors.oldPassword}\n helperText={\n errors.oldPassword?.message\n ? t(errors.oldPassword.message, { length: PASSWORD_MIN_LENGTH })\n : undefined\n }\n label={t('security.changePassword.oldPassword')}\n {...register('oldPassword')}\n required={true}\n type=\"password\"\n />\n <SecurityTextField\n error={!!errors.newPassword}\n helperText={\n errors.newPassword?.message\n ? t(errors.newPassword.message, { length: PASSWORD_MIN_LENGTH })\n : undefined\n }\n label={t('security.changePassword.newPassword')}\n {...register('newPassword')}\n required={true}\n type=\"password\"\n />\n <SecurityTextField\n error={!!errors.confirmPassword}\n helperText={\n errors.confirmPassword?.message ? t(errors.confirmPassword.message) : undefined\n }\n label={t('security.changePassword.confirmPassword')}\n {...register('confirmPassword')}\n required={true}\n type=\"password\"\n />\n {errors.root && <LoginDialogFormError error={errors.root} />}\n <Button\n color=\"primary\"\n disabled={!isValid || isSubmitting}\n fullWidth={true}\n sx={{ mt: 2 }}\n type=\"submit\"\n variant=\"contained\"\n >\n {t('security.changePassword.submit')}\n </Button>\n </SecurityForm>\n </SecurityContainer>\n </SecurityLayout>\n );\n};\n\nexport default ChangePassword;\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"Login.js","names":[],"sources":["../../../src/sections/Security/Login.tsx"],"sourcesContent":["import { yupResolver } from '@hookform/resolvers/yup';\nimport { Link, Typography } from '@mui/material';\nimport React, { useCallback, useRef } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { Link as RouterLink, useLocation, useNavigate } from 'react-router';\n\nimport { useDataMutation } from '../../api/use-data-mutation';\nimport type { LoginFormValues } from '../../components/LoginForm/Login';\nimport LoginForm from '../../components/LoginForm/Login';\nimport LoginFormHeader from '../../components/LoginForm/styles';\nimport NotFound from '../../components/NotFound';\nimport { getConfiguration } from '../../configuration';\nimport SecurityLayout from '../../layouts/Security/Dialog';\nimport { useAuth } from '../../providers/AuthProvider/AuthProvider';\nimport type { LoginBody } from '../../providers/AuthProvider/types';\nimport { authErrorMessage } from '../../providers/AuthProvider/utils';\nimport { saveAuth } from '../../store/storage';\nimport { stripTrailingSlash } from '../../store/utils';\nimport { Route } from '../../utils';\nimport { loginSchema } from '../../utils/schemas';\nimport { MessageType } from './Success';\nimport { SecurityContainer, SecurityForm } from './styles';\nimport { getSecurityUrlParams } from './utils';\n\nconst configuration = getConfiguration();\nconst basePath = stripTrailingSlash(configuration.base);\n\nconst Login: React.FC = () => {\n const { t } = useTranslation();\n const location = useLocation();\n const navigate = useNavigate();\n const { setUserState } = useAuth();\n const { next } = getSecurityUrlParams(location);\n const createUserEnabled = configuration?.flags?.createUser;\n const addUserLink = Route.ADD_USER + (next ? '?next=' + next : '');\n\n const { trigger } = useDataMutation<LoginBody>(basePath, next, 'POST');\n\n const form = useForm<LoginFormValues>({\n mode: 'onChange',\n resolver: yupResolver(loginSchema),\n });\n\n const {\n setError,\n handleSubmit,\n register,\n formState: { isValid, isSubmitting, errors },\n } = form;\n\n const handleLogin = useCallback(\n async (body: { username: string; password: string }) => {\n return await trigger(body);\n },\n [trigger]\n );\n\n const onSuccess = useCallback(() => {\n navigate(`${Route.SUCCESS}?messageType=${MessageType.Login}`);\n }, [navigate]);\n\n // `disabled={isSubmitting}` only applies after a re-render; clicks landing in\n // the same React batch would still fire duplicate requests\n const inFlight = useRef(false);\n\n const onSubmit = useCallback(\n async (data: LoginFormValues) => {\n if (inFlight.current) {\n return;\n }\n inFlight.current = true;\n try {\n const result = await handleLogin?.(data);\n if (!result || !result.username || !result.token) {\n // a 2xx with an unexpected body must not pass as a successful login\n throw new Error('login response is missing the token');\n }\n saveAuth(result.username, result.token);\n // AuthProvider reads storage only once, so the header needs the state update\n setUserState?.({ username: result.username, token: result.token });\n onSuccess();\n } catch (err: any) {\n // only a 401 means wrong credentials; a dead server, 500 or 429 must\n // not claim the credentials were invalid\n const message =\n err?.code === 401\n ? t('security.error.invalid-credentials')\n : authErrorMessage(err, t('security.error.unable-to-login'));\n setError('root', { type: 'server', message });\n } finally {\n inFlight.current = false;\n }\n },\n [handleLogin, setError, setUserState, onSuccess, t]\n );\n\n return !next ? (\n <NotFound />\n ) : (\n <SecurityLayout>\n <SecurityContainer>\n {/* container only: LoginForm renders the real <form>, and a <form>\n cannot be a descendant of another <form> */}\n <SecurityForm as=\"div\">\n <LoginFormHeader />\n <LoginForm\n errors={errors}\n handleSubmit={handleSubmit}\n isSubmitting={isSubmitting}\n isValid={isValid}\n onSubmit={onSubmit}\n register={register}\n />\n {createUserEnabled && (\n <Typography align=\"center\" sx={{ mt: 2, fontSize: 12 }} variant=\"body2\">\n {t('security.login.noUserQuestion')}\n <Link component={RouterLink} sx={{ ml: 1 }} to={addUserLink}>\n {t('security.login.createUser')}\n </Link>\n </Typography>\n )}\n </SecurityForm>\n </SecurityContainer>\n </SecurityLayout>\n );\n};\n\nexport default Login;\n"],"mappings":"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"}
1
+ {"version":3,"file":"Login.js","names":["getConfiguration","stripTrailingSlash","useTranslation","useLocation","useNavigate","useAuth","getSecurityUrlParams","Route","useDataMutation","useForm","yupResolver","loginSchema","useCallback","MessageType","useRef","authErrorMessage","NotFound","SecurityLayout","SecurityContainer","SecurityForm","LoginFormHeader","LoginForm","Typography","Link","RouterLink"],"sources":["../../../src/sections/Security/Login.tsx"],"sourcesContent":["import { yupResolver } from '@hookform/resolvers/yup';\nimport { Link, Typography } from '@mui/material';\nimport React, { useCallback, useRef } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { Link as RouterLink, useLocation, useNavigate } from 'react-router';\n\nimport { useDataMutation } from '../../api/use-data-mutation';\nimport type { LoginFormValues } from '../../components/LoginForm/Login';\nimport LoginForm from '../../components/LoginForm/Login';\nimport LoginFormHeader from '../../components/LoginForm/styles';\nimport NotFound from '../../components/NotFound';\nimport { getConfiguration } from '../../configuration';\nimport SecurityLayout from '../../layouts/Security/Dialog';\nimport { useAuth } from '../../providers/AuthProvider/AuthProvider';\nimport type { LoginBody } from '../../providers/AuthProvider/types';\nimport { authErrorMessage } from '../../providers/AuthProvider/utils';\nimport { saveAuth } from '../../store/storage';\nimport { stripTrailingSlash } from '../../store/utils';\nimport { Route } from '../../utils';\nimport { loginSchema } from '../../utils/schemas';\nimport { MessageType } from './Success';\nimport { SecurityContainer, SecurityForm } from './styles';\nimport { getSecurityUrlParams } from './utils';\n\nconst configuration = getConfiguration();\nconst basePath = stripTrailingSlash(configuration.base);\n\nconst Login: React.FC = () => {\n const { t } = useTranslation();\n const location = useLocation();\n const navigate = useNavigate();\n const { setUserState } = useAuth();\n const { next } = getSecurityUrlParams(location);\n const createUserEnabled = configuration?.flags?.createUser;\n const addUserLink = Route.ADD_USER + (next ? '?next=' + next : '');\n\n const { trigger } = useDataMutation<LoginBody>(basePath, next, 'POST');\n\n const form = useForm<LoginFormValues>({\n mode: 'onChange',\n resolver: yupResolver(loginSchema),\n });\n\n const {\n setError,\n handleSubmit,\n register,\n formState: { isValid, isSubmitting, errors },\n } = form;\n\n const handleLogin = useCallback(\n async (body: { username: string; password: string }) => {\n return await trigger(body);\n },\n [trigger]\n );\n\n const onSuccess = useCallback(() => {\n navigate(`${Route.SUCCESS}?messageType=${MessageType.Login}`);\n }, [navigate]);\n\n // `disabled={isSubmitting}` only applies after a re-render; clicks landing in\n // the same React batch would still fire duplicate requests\n const inFlight = useRef(false);\n\n const onSubmit = useCallback(\n async (data: LoginFormValues) => {\n if (inFlight.current) {\n return;\n }\n inFlight.current = true;\n try {\n const result = await handleLogin?.(data);\n if (!result || !result.username || !result.token) {\n // a 2xx with an unexpected body must not pass as a successful login\n throw new Error('login response is missing the token');\n }\n saveAuth(result.username, result.token);\n // AuthProvider reads storage only once, so the header needs the state update\n setUserState?.({ username: result.username, token: result.token });\n onSuccess();\n } catch (err: any) {\n // only a 401 means wrong credentials; a dead server, 500 or 429 must\n // not claim the credentials were invalid\n const message =\n err?.code === 401\n ? t('security.error.invalid-credentials')\n : authErrorMessage(err, t('security.error.unable-to-login'));\n setError('root', { type: 'server', message });\n } finally {\n inFlight.current = false;\n }\n },\n [handleLogin, setError, setUserState, onSuccess, t]\n );\n\n return !next ? (\n <NotFound />\n ) : (\n <SecurityLayout>\n <SecurityContainer>\n {/* container only: LoginForm renders the real <form>, and a <form>\n cannot be a descendant of another <form> */}\n <SecurityForm as=\"div\">\n <LoginFormHeader />\n <LoginForm\n errors={errors}\n handleSubmit={handleSubmit}\n isSubmitting={isSubmitting}\n isValid={isValid}\n onSubmit={onSubmit}\n register={register}\n />\n {createUserEnabled && (\n <Typography align=\"center\" sx={{ mt: 2, fontSize: 12 }} variant=\"body2\">\n {t('security.login.noUserQuestion')}\n <Link component={RouterLink} sx={{ ml: 1 }} to={addUserLink}>\n {t('security.login.createUser')}\n </Link>\n </Typography>\n )}\n </SecurityForm>\n </SecurityContainer>\n </SecurityLayout>\n );\n};\n\nexport default Login;\n"],"mappings":"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"}