@verdaccio/ui-components 5.0.0-next-9.19 → 5.0.0-next-9.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/api/use-data-mutation.js +1 -4
- package/build/api/use-data-mutation.js.map +1 -1
- package/build/api/use-data-mutation.mjs +1 -4
- package/build/api/use-data-mutation.mjs.map +1 -1
- package/build/api/use-data.d.ts +1 -0
- package/build/api/use-data.js +3 -2
- package/build/api/use-data.js.map +1 -1
- package/build/api/use-data.mjs +3 -3
- package/build/api/use-data.mjs.map +1 -1
- package/build/components/ActionBar/ActionBar.js +4 -2
- package/build/components/ActionBar/ActionBar.js.map +1 -1
- package/build/components/ActionBar/ActionBar.mjs +4 -2
- package/build/components/ActionBar/ActionBar.mjs.map +1 -1
- package/build/components/ActionBar/ActionBarAction.js +1 -1
- package/build/components/ActionBar/ActionBarAction.mjs +1 -1
- package/build/components/AppRoute/AppRoute.js +13 -0
- package/build/components/AppRoute/AppRoute.js.map +1 -1
- package/build/components/AppRoute/AppRoute.mjs +13 -0
- package/build/components/AppRoute/AppRoute.mjs.map +1 -1
- package/build/components/Author/Author.js +1 -1
- package/build/components/Author/Author.mjs +1 -1
- package/build/components/CopyClipboard/CopyToClipBoard.js +5 -0
- package/build/components/CopyClipboard/CopyToClipBoard.js.map +1 -1
- package/build/components/CopyClipboard/CopyToClipBoard.mjs +5 -0
- package/build/components/CopyClipboard/CopyToClipBoard.mjs.map +1 -1
- package/build/components/CopyClipboard/utils.js +14 -1
- package/build/components/CopyClipboard/utils.js.map +1 -1
- package/build/components/CopyClipboard/utils.mjs +14 -1
- package/build/components/CopyClipboard/utils.mjs.map +1 -1
- package/build/components/Dependencies/Dependencies.js +2 -1
- package/build/components/Dependencies/Dependencies.js.map +1 -1
- package/build/components/Dependencies/Dependencies.mjs +2 -1
- package/build/components/Dependencies/Dependencies.mjs.map +1 -1
- package/build/components/Dependencies/DependencyBlock.js +1 -1
- package/build/components/Dependencies/DependencyBlock.mjs +1 -1
- package/build/components/Developers/Title.js +1 -1
- package/build/components/Developers/Title.mjs +1 -1
- package/build/components/Developers/get-unique-developer-values.js +2 -1
- package/build/components/Developers/get-unique-developer-values.js.map +1 -1
- package/build/components/Developers/get-unique-developer-values.mjs +2 -1
- package/build/components/Developers/get-unique-developer-values.mjs.map +1 -1
- package/build/components/Distribution/Dist.js +3 -3
- package/build/components/Distribution/Dist.js.map +1 -1
- package/build/components/Distribution/Dist.mjs +3 -3
- package/build/components/Distribution/Dist.mjs.map +1 -1
- package/build/components/Engines/Engines.js +1 -1
- package/build/components/Engines/Engines.mjs +1 -1
- package/build/components/Forbidden/Forbidden.js +1 -1
- package/build/components/Forbidden/Forbidden.mjs +1 -1
- package/build/components/FundButton/FundButton.js +4 -3
- package/build/components/FundButton/FundButton.js.map +1 -1
- package/build/components/FundButton/FundButton.mjs +4 -3
- package/build/components/FundButton/FundButton.mjs.map +1 -1
- package/build/components/GenericError/GenericError.d.ts +3 -0
- package/build/components/GenericError/GenericError.js +60 -0
- package/build/components/GenericError/GenericError.js.map +1 -0
- package/build/components/GenericError/GenericError.mjs +54 -0
- package/build/components/GenericError/GenericError.mjs.map +1 -0
- package/build/components/GenericError/index.d.ts +1 -0
- package/build/components/GenericError/index.js +2 -0
- package/build/components/GenericError/index.mjs +2 -0
- package/build/components/Help/Help.js +1 -1
- package/build/components/Help/Help.mjs +1 -1
- package/build/components/Install/Install.js +1 -1
- package/build/components/Install/Install.mjs +1 -1
- package/build/components/Install/InstallListItem.js +2 -2
- package/build/components/Install/InstallListItem.js.map +1 -1
- package/build/components/Install/InstallListItem.mjs +2 -2
- package/build/components/Install/InstallListItem.mjs.map +1 -1
- package/build/components/Keywords/KeywordListItems.js +1 -1
- package/build/components/Keywords/KeywordListItems.js.map +1 -1
- package/build/components/Keywords/KeywordListItems.mjs +1 -1
- package/build/components/Keywords/KeywordListItems.mjs.map +1 -1
- package/build/components/Keywords/Keywords.js +2 -2
- package/build/components/Keywords/Keywords.js.map +1 -1
- package/build/components/Keywords/Keywords.mjs +2 -2
- package/build/components/Keywords/Keywords.mjs.map +1 -1
- package/build/components/LoginDialog/LoginDialogCloseButton.js +1 -1
- package/build/components/LoginDialog/LoginDialogCloseButton.mjs +1 -1
- package/build/components/LoginDialog/LoginDialogForm.js +2 -1
- package/build/components/LoginDialog/LoginDialogForm.js.map +1 -1
- package/build/components/LoginDialog/LoginDialogForm.mjs +2 -1
- package/build/components/LoginDialog/LoginDialogForm.mjs.map +1 -1
- package/build/components/LoginForm/Login.d.ts +1 -0
- package/build/components/LoginForm/Login.js +6 -4
- package/build/components/LoginForm/Login.js.map +1 -1
- package/build/components/LoginForm/Login.mjs +9 -7
- package/build/components/LoginForm/Login.mjs.map +1 -1
- package/build/components/LoginForm/PasswordField.js +4 -6
- package/build/components/LoginForm/PasswordField.js.map +1 -1
- package/build/components/LoginForm/PasswordField.mjs +4 -6
- package/build/components/LoginForm/PasswordField.mjs.map +1 -1
- package/build/components/LoginForm/UsernameField.js +4 -6
- package/build/components/LoginForm/UsernameField.js.map +1 -1
- package/build/components/LoginForm/UsernameField.mjs +4 -6
- package/build/components/LoginForm/UsernameField.mjs.map +1 -1
- package/build/components/LoginForm/styles.js +1 -1
- package/build/components/LoginForm/styles.mjs +1 -1
- package/build/components/LoginForm/useLoginForm.js +13 -3
- package/build/components/LoginForm/useLoginForm.js.map +1 -1
- package/build/components/LoginForm/useLoginForm.mjs +14 -4
- package/build/components/LoginForm/useLoginForm.mjs.map +1 -1
- package/build/components/NoItems/NoItems.js +2 -2
- package/build/components/NoItems/NoItems.mjs +1 -1
- package/build/components/NotFound/NotFound.js +1 -1
- package/build/components/NotFound/NotFound.mjs +1 -1
- package/build/components/Package/Package.d.ts +1 -1
- package/build/components/Package/Package.js +28 -29
- package/build/components/Package/Package.js.map +1 -1
- package/build/components/Package/Package.mjs +29 -30
- package/build/components/Package/Package.mjs.map +1 -1
- package/build/components/Person/Person.js +1 -1
- package/build/components/Person/Person.js.map +1 -1
- package/build/components/Person/Person.mjs +1 -1
- package/build/components/Person/Person.mjs.map +1 -1
- package/build/components/RawViewer/RawViewer.js +1 -1
- package/build/components/RawViewer/RawViewer.mjs +1 -1
- package/build/components/RegistryInfoDialog/RegistryInfoDialog.js +1 -1
- package/build/components/RegistryInfoDialog/RegistryInfoDialog.mjs +1 -1
- package/build/components/Repository/Repository.js +5 -8
- package/build/components/Repository/Repository.js.map +1 -1
- package/build/components/Repository/Repository.mjs +5 -8
- package/build/components/Repository/Repository.mjs.map +1 -1
- package/build/components/Search/AutoComplete/AutoComplete.d.ts +1 -0
- package/build/components/Search/AutoComplete/AutoComplete.js +4 -4
- package/build/components/Search/AutoComplete/AutoComplete.js.map +1 -1
- package/build/components/Search/AutoComplete/AutoComplete.mjs +4 -4
- package/build/components/Search/AutoComplete/AutoComplete.mjs.map +1 -1
- package/build/components/Search/Search.js +12 -4
- package/build/components/Search/Search.js.map +1 -1
- package/build/components/Search/Search.mjs +13 -5
- package/build/components/Search/Search.mjs.map +1 -1
- package/build/components/Search/SearchItem.js +1 -1
- package/build/components/Search/SearchItem.mjs +1 -1
- package/build/components/SettingsMenu/SettingsMenu.js +1 -1
- package/build/components/SettingsMenu/SettingsMenu.mjs +1 -1
- package/build/components/SideBarTitle/SideBarTitle.js +2 -2
- package/build/components/SideBarTitle/SideBarTitle.js.map +1 -1
- package/build/components/SideBarTitle/SideBarTitle.mjs +2 -2
- package/build/components/SideBarTitle/SideBarTitle.mjs.map +1 -1
- package/build/components/UpLinks/UpLinks.js +1 -1
- package/build/components/UpLinks/UpLinks.mjs +1 -1
- package/build/components/Versions/HistoryList.js +2 -2
- package/build/components/Versions/HistoryList.js.map +1 -1
- package/build/components/Versions/HistoryList.mjs +2 -2
- package/build/components/Versions/HistoryList.mjs.map +1 -1
- package/build/components/Versions/Versions.js +22 -21
- package/build/components/Versions/Versions.js.map +1 -1
- package/build/components/Versions/Versions.mjs +22 -21
- package/build/components/Versions/Versions.mjs.map +1 -1
- package/build/index.d.ts +1 -0
- package/build/index.js +4 -0
- package/build/index.mjs +4 -2
- package/build/pages/Stage/StageDetail.d.ts +2 -0
- package/build/pages/Stage/StageDetail.js +8 -0
- package/build/pages/Stage/StageDetail.js.map +1 -0
- package/build/pages/Stage/StageDetail.mjs +8 -0
- package/build/pages/Stage/StageDetail.mjs.map +1 -0
- package/build/pages/Stage/StageList.d.ts +2 -0
- package/build/pages/Stage/StageList.js +8 -0
- package/build/pages/Stage/StageList.js.map +1 -0
- package/build/pages/Stage/StageList.mjs +8 -0
- package/build/pages/Stage/StageList.mjs.map +1 -0
- package/build/pages/Stage/index.d.ts +2 -0
- package/build/pages/Version/Version.js +4 -1
- package/build/pages/Version/Version.js.map +1 -1
- package/build/pages/Version/Version.mjs +4 -1
- package/build/pages/Version/Version.mjs.map +1 -1
- package/build/providers/AuthProvider/AuthProvider.js +9 -7
- package/build/providers/AuthProvider/AuthProvider.js.map +1 -1
- package/build/providers/AuthProvider/AuthProvider.mjs +10 -8
- package/build/providers/AuthProvider/AuthProvider.mjs.map +1 -1
- package/build/providers/AuthProvider/utils.d.ts +12 -0
- package/build/providers/AuthProvider/utils.js +22 -0
- package/build/providers/AuthProvider/utils.js.map +1 -1
- package/build/providers/AuthProvider/utils.mjs +21 -2
- package/build/providers/AuthProvider/utils.mjs.map +1 -1
- package/build/providers/DownloadProvider/DownloadProvider.d.ts +1 -0
- package/build/providers/DownloadProvider/DownloadProvider.js +27 -4
- package/build/providers/DownloadProvider/DownloadProvider.js.map +1 -1
- package/build/providers/DownloadProvider/DownloadProvider.mjs +27 -6
- package/build/providers/DownloadProvider/DownloadProvider.mjs.map +1 -1
- package/build/providers/ManifestsProvider/ManifestsProvider.js +1 -1
- package/build/providers/ManifestsProvider/ManifestsProvider.js.map +1 -1
- package/build/providers/ManifestsProvider/ManifestsProvider.mjs +1 -1
- package/build/providers/ManifestsProvider/ManifestsProvider.mjs.map +1 -1
- package/build/providers/SearchProvider/SearchProvider.d.ts +1 -0
- package/build/providers/SearchProvider/SearchProvider.js +8 -6
- package/build/providers/SearchProvider/SearchProvider.js.map +1 -1
- package/build/providers/SearchProvider/SearchProvider.mjs +8 -6
- package/build/providers/SearchProvider/SearchProvider.mjs.map +1 -1
- package/build/providers/TranslatorProvider/TranslatorProvider.js +5 -3
- package/build/providers/TranslatorProvider/TranslatorProvider.js.map +1 -1
- package/build/providers/TranslatorProvider/TranslatorProvider.mjs +5 -3
- package/build/providers/TranslatorProvider/TranslatorProvider.mjs.map +1 -1
- package/build/providers/VersionProvider/VersionProvider.js +3 -3
- package/build/providers/VersionProvider/VersionProvider.js.map +1 -1
- package/build/providers/VersionProvider/VersionProvider.mjs +3 -3
- package/build/providers/VersionProvider/VersionProvider.mjs.map +1 -1
- package/build/sections/Detail/Tabs.js +1 -1
- package/build/sections/Detail/Tabs.mjs +1 -1
- package/build/sections/Footer/Footer.js +1 -1
- package/build/sections/Footer/Footer.mjs +1 -1
- package/build/sections/Header/Header.d.ts +0 -1
- package/build/sections/Header/Header.js +16 -14
- package/build/sections/Header/Header.js.map +1 -1
- package/build/sections/Header/Header.mjs +17 -15
- package/build/sections/Header/Header.mjs.map +1 -1
- package/build/sections/Header/HeaderGreetings.js +1 -1
- package/build/sections/Header/HeaderGreetings.mjs +1 -1
- package/build/sections/Header/HeaderMenu.js +26 -7
- package/build/sections/Header/HeaderMenu.js.map +1 -1
- package/build/sections/Header/HeaderMenu.mjs +26 -7
- package/build/sections/Header/HeaderMenu.mjs.map +1 -1
- package/build/sections/Header/HeaderRight.js +1 -1
- package/build/sections/Header/HeaderRight.mjs +1 -1
- package/build/sections/Header/HeaderSettingsDialog.js +1 -1
- package/build/sections/Header/HeaderSettingsDialog.mjs +1 -1
- package/build/sections/Header/LanguageSwitch.js +1 -1
- package/build/sections/Header/LanguageSwitch.mjs +1 -1
- package/build/sections/Header/RegistryInfoContent/RegistryInfoContent.js +1 -1
- package/build/sections/Header/RegistryInfoContent/RegistryInfoContent.mjs +1 -1
- package/build/sections/Home/Home.js +4 -3
- package/build/sections/Home/Home.js.map +1 -1
- package/build/sections/Home/Home.mjs +5 -4
- package/build/sections/Home/Home.mjs.map +1 -1
- package/build/sections/Security/AddUser.js +33 -18
- package/build/sections/Security/AddUser.js.map +1 -1
- package/build/sections/Security/AddUser.mjs +37 -22
- package/build/sections/Security/AddUser.mjs.map +1 -1
- package/build/sections/Security/ChangePassword.js +17 -15
- package/build/sections/Security/ChangePassword.js.map +1 -1
- package/build/sections/Security/ChangePassword.mjs +19 -17
- package/build/sections/Security/ChangePassword.mjs.map +1 -1
- package/build/sections/Security/Login.js +51 -35
- package/build/sections/Security/Login.js.map +1 -1
- package/build/sections/Security/Login.mjs +54 -38
- package/build/sections/Security/Login.mjs.map +1 -1
- package/build/sections/Security/Success.js +28 -24
- package/build/sections/Security/Success.js.map +1 -1
- package/build/sections/Security/Success.mjs +29 -25
- package/build/sections/Security/Success.mjs.map +1 -1
- package/build/sections/Stage/StageActions.d.ts +15 -0
- package/build/sections/Stage/StageActions.js +101 -0
- package/build/sections/Stage/StageActions.js.map +1 -0
- package/build/sections/Stage/StageActions.mjs +99 -0
- package/build/sections/Stage/StageActions.mjs.map +1 -0
- package/build/sections/Stage/StageDetail.d.ts +3 -0
- package/build/sections/Stage/StageDetail.js +110 -0
- package/build/sections/Stage/StageDetail.js.map +1 -0
- package/build/sections/Stage/StageDetail.mjs +108 -0
- package/build/sections/Stage/StageDetail.mjs.map +1 -0
- package/build/sections/Stage/StageList.d.ts +3 -0
- package/build/sections/Stage/StageList.js +153 -0
- package/build/sections/Stage/StageList.js.map +1 -0
- package/build/sections/Stage/StageList.mjs +151 -0
- package/build/sections/Stage/StageList.mjs.map +1 -0
- package/build/sections/Stage/index.d.ts +6 -0
- package/build/sections/Stage/index.js +13 -0
- package/build/sections/Stage/index.mjs +6 -0
- package/build/sections/Stage/types.d.ts +22 -0
- package/build/sections/Stage/useRequireSession.d.ts +14 -0
- package/build/sections/Stage/useRequireSession.js +33 -0
- package/build/sections/Stage/useRequireSession.js.map +1 -0
- package/build/sections/Stage/useRequireSession.mjs +33 -0
- package/build/sections/Stage/useRequireSession.mjs.map +1 -0
- package/build/sections/Stage/useStage.d.ts +34 -0
- package/build/sections/Stage/useStage.js +71 -0
- package/build/sections/Stage/useStage.js.map +1 -0
- package/build/sections/Stage/useStage.mjs +65 -0
- package/build/sections/Stage/useStage.mjs.map +1 -0
- package/build/store/api.js +7 -4
- package/build/store/api.js.map +1 -1
- package/build/store/api.mjs +7 -4
- package/build/store/api.mjs.map +1 -1
- package/build/types/packageMeta.d.ts +3 -2
- package/build/utils/cli-utils.js +2 -2
- package/build/utils/cli-utils.js.map +1 -1
- package/build/utils/cli-utils.mjs +2 -2
- package/build/utils/cli-utils.mjs.map +1 -1
- package/build/utils/index.js +1 -0
- package/build/utils/index.mjs +2 -2
- package/build/utils/routes.d.ts +5 -1
- package/build/utils/routes.js +4 -0
- package/build/utils/routes.js.map +1 -1
- package/build/utils/routes.mjs +4 -0
- package/build/utils/routes.mjs.map +1 -1
- package/build/utils/schemas.d.ts +1 -0
- package/build/utils/schemas.js +4 -4
- package/build/utils/schemas.js.map +1 -1
- package/build/utils/schemas.mjs +4 -4
- package/build/utils/schemas.mjs.map +1 -1
- package/build/utils/session-id.d.ts +8 -0
- package/build/utils/session-id.js +26 -0
- package/build/utils/session-id.js.map +1 -0
- package/build/utils/session-id.mjs +26 -0
- package/build/utils/session-id.mjs.map +1 -0
- package/build/utils/token.d.ts +1 -0
- package/build/utils/token.js +12 -8
- package/build/utils/token.js.map +1 -1
- package/build/utils/token.mjs +12 -9
- package/build/utils/token.mjs.map +1 -1
- package/build/utils/url.js +1 -1
- package/build/utils/url.js.map +1 -1
- package/build/utils/url.mjs +1 -1
- package/build/utils/url.mjs.map +1 -1
- package/build/utils/utils.d.ts +10 -0
- package/build/utils/utils.js +26 -0
- package/build/utils/utils.js.map +1 -1
- package/build/utils/utils.mjs +25 -1
- package/build/utils/utils.mjs.map +1 -1
- package/package.json +6 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AuthProvider.mjs","names":[],"sources":["../../../src/providers/AuthProvider/AuthProvider.tsx"],"sourcesContent":["import type { ReactElement } from 'react';\nimport React, { createContext, use } from 'react';\nimport { useSWRConfig } from 'swr';\n\nimport { useDataMutation } from '../../api/use-data-mutation';\nimport { getConfiguration } from '../../configuration';\nimport { APIRoute } from '../../store/routes';\nimport { clearAuth, saveAuth } from '../../store/storage';\nimport { stripTrailingSlash } from '../../store/utils';\nimport type { LoginBody } from './types';\nimport { getDefaultUserState } from './utils';\n\ninterface AuthContextProps {\n handleLogin: (body: { username: string; password: string }) => Promise<any>;\n setUserState: React.Dispatch<React.SetStateAction<LoginBody>>;\n logOutUser: () => void;\n userState: LoginBody;\n}\n\nexport const AuthContext = createContext<Partial<AuthContextProps>>({\n userState: { token: null, username: null },\n setUserState: () => {},\n handleLogin: async () => {},\n logOutUser: () => {},\n});\n\nconst configuration = getConfiguration();\nconst basePath = stripTrailingSlash(configuration.base);\n\nconst AuthProvider: React.FC<{ children: ReactElement }> = ({ children }) => {\n const [userState, setUserState] = React.useState<LoginBody>(getDefaultUserState());\n const { trigger } = useDataMutation<LoginBody>(basePath, APIRoute.LOGIN, 'POST');\n const { mutate } = useSWRConfig();\n\n const handleLogin = async (body: { username: string; password: string }) => {\n const result = await trigger(body);\n if (result
|
|
1
|
+
{"version":3,"file":"AuthProvider.mjs","names":[],"sources":["../../../src/providers/AuthProvider/AuthProvider.tsx"],"sourcesContent":["import type { ReactElement } from 'react';\nimport React, { createContext, use } from 'react';\nimport { useSWRConfig } from 'swr';\n\nimport { useDataMutation } from '../../api/use-data-mutation';\nimport { getConfiguration } from '../../configuration';\nimport { APIRoute } from '../../store/routes';\nimport { clearAuth, saveAuth } from '../../store/storage';\nimport { stripTrailingSlash } from '../../store/utils';\nimport type { LoginBody } from './types';\nimport { clearExpiredAuth, getDefaultUserState } from './utils';\n\ninterface AuthContextProps {\n handleLogin: (body: { username: string; password: string }) => Promise<any>;\n setUserState: React.Dispatch<React.SetStateAction<LoginBody>>;\n logOutUser: () => void;\n userState: LoginBody;\n}\n\nexport const AuthContext = createContext<Partial<AuthContextProps>>({\n userState: { token: null, username: null },\n setUserState: () => {},\n handleLogin: async () => {},\n logOutUser: () => {},\n});\n\nconst configuration = getConfiguration();\nconst basePath = stripTrailingSlash(configuration.base);\n\nconst AuthProvider: React.FC<{ children: ReactElement }> = ({ children }) => {\n // lazy initializer: reading storage and decoding the JWT on every render is wasted work\n const [userState, setUserState] = React.useState<LoginBody>(getDefaultUserState);\n\n React.useEffect(() => {\n clearExpiredAuth();\n }, []);\n const { trigger } = useDataMutation<LoginBody>(basePath, APIRoute.LOGIN, 'POST');\n const { mutate } = useSWRConfig();\n\n const handleLogin = async (body: { username: string; password: string }) => {\n const result = await trigger(body);\n if (!result || !result.username || !result.token) {\n // a 2xx with an unexpected body (proxy or auth plugin returning html)\n // 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 setUserState(result as LoginBody);\n // Revalidate the packages list so it reflects authenticated access\n mutate(`${basePath}${APIRoute.PACKAGES}`);\n };\n\n const logOutUser = () => {\n // clear storage first: getDefaultUserState reads it, and the token is\n // still valid at this point, so the old order re-hydrated the session\n clearAuth();\n setUserState(getDefaultUserState());\n window.location?.reload();\n };\n\n return (\n <AuthContext\n value={{\n handleLogin,\n userState,\n logOutUser,\n setUserState,\n }}\n >\n {children}\n </AuthContext>\n );\n};\n\nexport { AuthProvider };\n\nexport const useAuth = () => use(AuthContext);\n"],"mappings":";;;;;;;;;;AAmBA,IAAa,cAAc,cAAyC;CAClE,WAAW;EAAE,OAAO;EAAM,UAAU;CAAK;CACzC,oBAAoB,CAAC;CACrB,aAAa,YAAY,CAAC;CAC1B,kBAAkB,CAAC;AACrB,CAAC;AAED,IAAM,gBAAgB,iBAAiB;AACvC,IAAM,WAAW,mBAAmB,cAAc,IAAI;AAEtD,IAAM,gBAAsD,EAAE,eAAe;CAE3E,MAAM,CAAC,WAAW,gBAAgB,MAAM,SAAoB,mBAAmB;CAE/E,MAAM,gBAAgB;EACpB,iBAAiB;CACnB,GAAG,CAAC,CAAC;CACL,MAAM,EAAE,YAAY,gBAA2B,UAAU,SAAS,OAAO,MAAM;CAC/E,MAAM,EAAE,WAAW,aAAa;CAEhC,MAAM,cAAc,OAAO,SAAiD;EAC1E,MAAM,SAAS,MAAM,QAAQ,IAAI;EACjC,IAAI,CAAC,UAAU,CAAC,OAAO,YAAY,CAAC,OAAO,OAGzC,MAAM,IAAI,MAAM,qCAAqC;EAEvD,SAAS,OAAO,UAAU,OAAO,KAAK;EACtC,aAAa,MAAmB;EAEhC,OAAO,GAAG,WAAW,SAAS,UAAU;CAC1C;CAEA,MAAM,mBAAmB;EAGvB,UAAU;EACV,aAAa,oBAAoB,CAAC;EAClC,OAAO,UAAU,OAAO;CAC1B;CAEA,OACE,oBAAC,aAAD;EACE,OAAO;GACL;GACA;GACA;GACA;EACF;EAEC;CACU,CAAA;AAEjB;AAIA,IAAa,gBAAgB,IAAI,WAAW"}
|
|
@@ -1,3 +1,15 @@
|
|
|
1
1
|
import type { LoginBody } from './types';
|
|
2
2
|
export declare function getDefaultUserState(): LoginBody;
|
|
3
|
+
/**
|
|
4
|
+
* Drop an expired token from storage on boot: the api client attaches whatever
|
|
5
|
+
* is stored, and the server treats an expired bearer as anonymous while the
|
|
6
|
+
* header still claims the user is logged in.
|
|
7
|
+
*/
|
|
8
|
+
export declare function clearExpiredAuth(): void;
|
|
9
|
+
export declare const AUTH_ERROR_FALLBACK = "Authentication failed";
|
|
3
10
|
export declare function normalizeAuthError(err: any): Error;
|
|
11
|
+
/**
|
|
12
|
+
* Message to display for a failed auth request: the server's own message when
|
|
13
|
+
* there is one, otherwise the (already translated) fallback text.
|
|
14
|
+
*/
|
|
15
|
+
export declare function authErrorMessage(err: any, translatedFallback: string): string;
|
|
@@ -12,11 +12,33 @@ function getDefaultUserState() {
|
|
|
12
12
|
username
|
|
13
13
|
};
|
|
14
14
|
}
|
|
15
|
+
/**
|
|
16
|
+
* Drop an expired token from storage on boot: the api client attaches whatever
|
|
17
|
+
* is stored, and the server treats an expired bearer as anonymous while the
|
|
18
|
+
* header still claims the user is logged in.
|
|
19
|
+
*/
|
|
20
|
+
function clearExpiredAuth() {
|
|
21
|
+
const { token } = require_storage.getAuth();
|
|
22
|
+
if (token && require_token.isTokenExpire(token)) require_storage.clearAuth();
|
|
23
|
+
}
|
|
24
|
+
var AUTH_ERROR_FALLBACK = "Authentication failed";
|
|
15
25
|
function normalizeAuthError(err) {
|
|
16
26
|
const message = err?.info?.message || err?.response?.data?.message || err?.message || "Authentication failed";
|
|
17
27
|
return new Error(message);
|
|
18
28
|
}
|
|
29
|
+
/**
|
|
30
|
+
* Message to display for a failed auth request: the server's own message when
|
|
31
|
+
* there is one, otherwise the (already translated) fallback text.
|
|
32
|
+
*/
|
|
33
|
+
function authErrorMessage(err, translatedFallback) {
|
|
34
|
+
if (typeof err?.code !== "number") return translatedFallback;
|
|
35
|
+
const { message } = normalizeAuthError(err);
|
|
36
|
+
return message && message !== "Authentication failed" ? message : translatedFallback;
|
|
37
|
+
}
|
|
19
38
|
//#endregion
|
|
39
|
+
exports.AUTH_ERROR_FALLBACK = AUTH_ERROR_FALLBACK;
|
|
40
|
+
exports.authErrorMessage = authErrorMessage;
|
|
41
|
+
exports.clearExpiredAuth = clearExpiredAuth;
|
|
20
42
|
exports.getDefaultUserState = getDefaultUserState;
|
|
21
43
|
exports.normalizeAuthError = normalizeAuthError;
|
|
22
44
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","names":[],"sources":["../../../src/providers/AuthProvider/utils.ts"],"sourcesContent":["import { getAuth } from '../../store/storage';\nimport { isTokenExpire } from '../../utils';\nimport type { LoginBody } from './types';\n\nexport function getDefaultUserState(): LoginBody {\n const { token, username } = getAuth();\n return isTokenExpire(token) ? { token: null, username: null } : { token, username };\n}\n\nexport function normalizeAuthError(err: any): Error {\n const message =\n err?.info?.message || err?.response?.data?.message || err?.message ||
|
|
1
|
+
{"version":3,"file":"utils.js","names":[],"sources":["../../../src/providers/AuthProvider/utils.ts"],"sourcesContent":["import { clearAuth, getAuth } from '../../store/storage';\nimport { isTokenExpire } from '../../utils';\nimport type { LoginBody } from './types';\n\nexport function getDefaultUserState(): LoginBody {\n const { token, username } = getAuth();\n return isTokenExpire(token) ? { token: null, username: null } : { token, username };\n}\n\n/**\n * Drop an expired token from storage on boot: the api client attaches whatever\n * is stored, and the server treats an expired bearer as anonymous while the\n * header still claims the user is logged in.\n */\nexport function clearExpiredAuth(): void {\n const { token } = getAuth();\n if (token && isTokenExpire(token)) {\n clearAuth();\n }\n}\n\nexport const AUTH_ERROR_FALLBACK = 'Authentication failed';\n\nexport function normalizeAuthError(err: any): Error {\n const message =\n err?.info?.message || err?.response?.data?.message || err?.message || AUTH_ERROR_FALLBACK;\n\n return new Error(message);\n}\n\n/**\n * Message to display for a failed auth request: the server's own message when\n * there is one, otherwise the (already translated) fallback text.\n */\nexport function authErrorMessage(err: any, translatedFallback: string): string {\n // errors without an HTTP code (network failures, unexpected exceptions) carry\n // technical messages like \"Failed to fetch\" — not something to show the user\n if (typeof err?.code !== 'number') {\n return translatedFallback;\n }\n const { message } = normalizeAuthError(err);\n return message && message !== AUTH_ERROR_FALLBACK ? message : translatedFallback;\n}\n"],"mappings":";;;;AAIA,SAAgB,sBAAiC;CAC/C,MAAM,EAAE,OAAO,aAAa,gBAAA,QAAQ;CACpC,OAAO,cAAA,cAAc,KAAK,IAAI;EAAE,OAAO;EAAM,UAAU;CAAK,IAAI;EAAE;EAAO;CAAS;AACpF;;;;;;AAOA,SAAgB,mBAAyB;CACvC,MAAM,EAAE,UAAU,gBAAA,QAAQ;CAC1B,IAAI,SAAS,cAAA,cAAc,KAAK,GAC9B,gBAAA,UAAU;AAEd;AAEA,IAAa,sBAAsB;AAEnC,SAAgB,mBAAmB,KAAiB;CAClD,MAAM,UACJ,KAAK,MAAM,WAAW,KAAK,UAAU,MAAM,WAAW,KAAK,WAAA;CAE7D,OAAO,IAAI,MAAM,OAAO;AAC1B;;;;;AAMA,SAAgB,iBAAiB,KAAU,oBAAoC;CAG7E,IAAI,OAAO,KAAK,SAAS,UACvB,OAAO;CAET,MAAM,EAAE,YAAY,mBAAmB,GAAG;CAC1C,OAAO,WAAW,YAAA,0BAAkC,UAAU;AAChE"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { isTokenExpire } from "../../utils/token.mjs";
|
|
2
2
|
import "../../utils/index.mjs";
|
|
3
|
-
import { getAuth } from "../../store/storage.mjs";
|
|
3
|
+
import { clearAuth, getAuth } from "../../store/storage.mjs";
|
|
4
4
|
//#region src/providers/AuthProvider/utils.ts
|
|
5
5
|
function getDefaultUserState() {
|
|
6
6
|
const { token, username } = getAuth();
|
|
@@ -12,11 +12,30 @@ function getDefaultUserState() {
|
|
|
12
12
|
username
|
|
13
13
|
};
|
|
14
14
|
}
|
|
15
|
+
/**
|
|
16
|
+
* Drop an expired token from storage on boot: the api client attaches whatever
|
|
17
|
+
* is stored, and the server treats an expired bearer as anonymous while the
|
|
18
|
+
* header still claims the user is logged in.
|
|
19
|
+
*/
|
|
20
|
+
function clearExpiredAuth() {
|
|
21
|
+
const { token } = getAuth();
|
|
22
|
+
if (token && isTokenExpire(token)) clearAuth();
|
|
23
|
+
}
|
|
24
|
+
var AUTH_ERROR_FALLBACK = "Authentication failed";
|
|
15
25
|
function normalizeAuthError(err) {
|
|
16
26
|
const message = err?.info?.message || err?.response?.data?.message || err?.message || "Authentication failed";
|
|
17
27
|
return new Error(message);
|
|
18
28
|
}
|
|
29
|
+
/**
|
|
30
|
+
* Message to display for a failed auth request: the server's own message when
|
|
31
|
+
* there is one, otherwise the (already translated) fallback text.
|
|
32
|
+
*/
|
|
33
|
+
function authErrorMessage(err, translatedFallback) {
|
|
34
|
+
if (typeof err?.code !== "number") return translatedFallback;
|
|
35
|
+
const { message } = normalizeAuthError(err);
|
|
36
|
+
return message && message !== "Authentication failed" ? message : translatedFallback;
|
|
37
|
+
}
|
|
19
38
|
//#endregion
|
|
20
|
-
export { getDefaultUserState, normalizeAuthError };
|
|
39
|
+
export { AUTH_ERROR_FALLBACK, authErrorMessage, clearExpiredAuth, getDefaultUserState, normalizeAuthError };
|
|
21
40
|
|
|
22
41
|
//# sourceMappingURL=utils.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.mjs","names":[],"sources":["../../../src/providers/AuthProvider/utils.ts"],"sourcesContent":["import { getAuth } from '../../store/storage';\nimport { isTokenExpire } from '../../utils';\nimport type { LoginBody } from './types';\n\nexport function getDefaultUserState(): LoginBody {\n const { token, username } = getAuth();\n return isTokenExpire(token) ? { token: null, username: null } : { token, username };\n}\n\nexport function normalizeAuthError(err: any): Error {\n const message =\n err?.info?.message || err?.response?.data?.message || err?.message ||
|
|
1
|
+
{"version":3,"file":"utils.mjs","names":[],"sources":["../../../src/providers/AuthProvider/utils.ts"],"sourcesContent":["import { clearAuth, getAuth } from '../../store/storage';\nimport { isTokenExpire } from '../../utils';\nimport type { LoginBody } from './types';\n\nexport function getDefaultUserState(): LoginBody {\n const { token, username } = getAuth();\n return isTokenExpire(token) ? { token: null, username: null } : { token, username };\n}\n\n/**\n * Drop an expired token from storage on boot: the api client attaches whatever\n * is stored, and the server treats an expired bearer as anonymous while the\n * header still claims the user is logged in.\n */\nexport function clearExpiredAuth(): void {\n const { token } = getAuth();\n if (token && isTokenExpire(token)) {\n clearAuth();\n }\n}\n\nexport const AUTH_ERROR_FALLBACK = 'Authentication failed';\n\nexport function normalizeAuthError(err: any): Error {\n const message =\n err?.info?.message || err?.response?.data?.message || err?.message || AUTH_ERROR_FALLBACK;\n\n return new Error(message);\n}\n\n/**\n * Message to display for a failed auth request: the server's own message when\n * there is one, otherwise the (already translated) fallback text.\n */\nexport function authErrorMessage(err: any, translatedFallback: string): string {\n // errors without an HTTP code (network failures, unexpected exceptions) carry\n // technical messages like \"Failed to fetch\" — not something to show the user\n if (typeof err?.code !== 'number') {\n return translatedFallback;\n }\n const { message } = normalizeAuthError(err);\n return message && message !== AUTH_ERROR_FALLBACK ? message : translatedFallback;\n}\n"],"mappings":";;;;AAIA,SAAgB,sBAAiC;CAC/C,MAAM,EAAE,OAAO,aAAa,QAAQ;CACpC,OAAO,cAAc,KAAK,IAAI;EAAE,OAAO;EAAM,UAAU;CAAK,IAAI;EAAE;EAAO;CAAS;AACpF;;;;;;AAOA,SAAgB,mBAAyB;CACvC,MAAM,EAAE,UAAU,QAAQ;CAC1B,IAAI,SAAS,cAAc,KAAK,GAC9B,UAAU;AAEd;AAEA,IAAa,sBAAsB;AAEnC,SAAgB,mBAAmB,KAAiB;CAClD,MAAM,UACJ,KAAK,MAAM,WAAW,KAAK,UAAU,MAAM,WAAW,KAAK,WAAA;CAE7D,OAAO,IAAI,MAAM,OAAO;AAC1B;;;;;AAMA,SAAgB,iBAAiB,KAAU,oBAAoC;CAG7E,IAAI,OAAO,KAAK,SAAS,UACvB,OAAO;CAET,MAAM,EAAE,YAAY,mBAAmB,GAAG;CAC1C,OAAO,WAAW,YAAA,0BAAkC,UAAU;AAChE"}
|
|
@@ -5,6 +5,7 @@ export interface DownloadContextProps {
|
|
|
5
5
|
link: string;
|
|
6
6
|
}) => Promise<void>;
|
|
7
7
|
isDownloading: boolean;
|
|
8
|
+
hasDownloadError: boolean;
|
|
8
9
|
}
|
|
9
10
|
export declare const DownloadContext: React.Context<DownloadContextProps | undefined>;
|
|
10
11
|
export declare const DownloadProvider: React.FC<{
|
|
@@ -3,27 +3,50 @@ const require_url = require("../../utils/url.js");
|
|
|
3
3
|
const require_use_data_mutation = require("../../api/use-data-mutation.js");
|
|
4
4
|
let react = require("react");
|
|
5
5
|
react = require_runtime.__toESM(react);
|
|
6
|
+
let react_i18next = require("react-i18next");
|
|
6
7
|
let react_jsx_runtime = require("react/jsx-runtime");
|
|
8
|
+
let _mui_material_Alert = require("@mui/material/Alert");
|
|
9
|
+
_mui_material_Alert = require_runtime.__toESM(_mui_material_Alert);
|
|
10
|
+
let _mui_material_Snackbar = require("@mui/material/Snackbar");
|
|
11
|
+
_mui_material_Snackbar = require_runtime.__toESM(_mui_material_Snackbar);
|
|
7
12
|
//#region src/providers/DownloadProvider/DownloadProvider.tsx
|
|
8
13
|
var DownloadContext = (0, react.createContext)(void 0);
|
|
9
14
|
var DownloadProvider = ({ children }) => {
|
|
15
|
+
const { t } = (0, react_i18next.useTranslation)();
|
|
10
16
|
const { download, isDownloading } = require_use_data_mutation.useTarballDownload();
|
|
17
|
+
const [hasDownloadError, setHasDownloadError] = (0, react.useState)(false);
|
|
11
18
|
const downloadTarball = (0, react.useCallback)(async ({ link }) => {
|
|
12
19
|
try {
|
|
20
|
+
setHasDownloadError(false);
|
|
13
21
|
const fileStream = await download({ link });
|
|
14
|
-
if (!fileStream)
|
|
22
|
+
if (!fileStream) {
|
|
23
|
+
setHasDownloadError(true);
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
15
26
|
const fileName = require_url.extractFileName(link);
|
|
16
27
|
require_url.downloadFile(fileStream, fileName);
|
|
17
28
|
} catch (error) {
|
|
18
29
|
console.error("Error during tarball download:", error);
|
|
30
|
+
setHasDownloadError(true);
|
|
19
31
|
}
|
|
20
32
|
}, [download]);
|
|
21
|
-
return /* @__PURE__ */ (0, react_jsx_runtime.
|
|
33
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(DownloadContext.Provider, {
|
|
22
34
|
value: {
|
|
23
35
|
downloadTarball,
|
|
24
|
-
isDownloading
|
|
36
|
+
isDownloading,
|
|
37
|
+
hasDownloadError
|
|
25
38
|
},
|
|
26
|
-
children
|
|
39
|
+
children: [children, /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Snackbar.default, {
|
|
40
|
+
autoHideDuration: 6e3,
|
|
41
|
+
onClose: () => setHasDownloadError(false),
|
|
42
|
+
open: hasDownloadError,
|
|
43
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_mui_material_Alert.default, {
|
|
44
|
+
onClose: () => setHasDownloadError(false),
|
|
45
|
+
severity: "error",
|
|
46
|
+
variant: "filled",
|
|
47
|
+
children: t("error.download-tarball")
|
|
48
|
+
})
|
|
49
|
+
})]
|
|
27
50
|
});
|
|
28
51
|
};
|
|
29
52
|
var useDownload = () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DownloadProvider.js","names":[],"sources":["../../../src/providers/DownloadProvider/DownloadProvider.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport React, { createContext, useCallback, useContext } from 'react';\n\nimport { useTarballDownload } from '../../api/use-data-mutation';\nimport { downloadFile, extractFileName } from '../../utils/url';\n\nexport interface DownloadContextProps {\n downloadTarball: (args: { link: string }) => Promise<void>;\n isDownloading: boolean;\n}\n\nexport const DownloadContext = createContext<DownloadContextProps | undefined>(undefined);\n\nexport const DownloadProvider: React.FC<{ children: ReactNode }> = ({ children }) => {\n const { download, isDownloading } = useTarballDownload();\n\n const downloadTarball = useCallback(\n async ({ link }: { link: string }) => {\n try {\n const fileStream = await download({ link });\n if (!fileStream) return;\n\n const fileName = extractFileName(link);\n downloadFile(fileStream, fileName);\n } catch (error) {\n console.error('Error during tarball download:', error);\n }\n },\n [download]\n );\n\n return (\n <DownloadContext.Provider value={{ downloadTarball, isDownloading }}>\n {children}\n </DownloadContext.Provider>\n );\n};\n\nexport const useDownload = () => {\n const context = useContext(DownloadContext);\n if (!context) {\n throw new Error('useDownload must be used within a DownloadProvider');\n }\n return context;\n};\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"DownloadProvider.js","names":[],"sources":["../../../src/providers/DownloadProvider/DownloadProvider.tsx"],"sourcesContent":["import Alert from '@mui/material/Alert';\nimport Snackbar from '@mui/material/Snackbar';\nimport type { ReactNode } from 'react';\nimport React, { createContext, useCallback, useContext, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { useTarballDownload } from '../../api/use-data-mutation';\nimport { downloadFile, extractFileName } from '../../utils/url';\n\nexport interface DownloadContextProps {\n downloadTarball: (args: { link: string }) => Promise<void>;\n isDownloading: boolean;\n hasDownloadError: boolean;\n}\n\nexport const DownloadContext = createContext<DownloadContextProps | undefined>(undefined);\n\nexport const DownloadProvider: React.FC<{ children: ReactNode }> = ({ children }) => {\n const { t } = useTranslation();\n const { download, isDownloading } = useTarballDownload();\n const [hasDownloadError, setHasDownloadError] = useState(false);\n\n const downloadTarball = useCallback(\n async ({ link }: { link: string }) => {\n try {\n setHasDownloadError(false);\n const fileStream = await download({ link });\n if (!fileStream) {\n // clicking download and having nothing happen sends the user\n // retrying blindly; an empty response is an error too\n setHasDownloadError(true);\n return;\n }\n\n const fileName = extractFileName(link);\n downloadFile(fileStream, fileName);\n } catch (error) {\n console.error('Error during tarball download:', error);\n setHasDownloadError(true);\n }\n },\n [download]\n );\n\n return (\n <DownloadContext.Provider value={{ downloadTarball, isDownloading, hasDownloadError }}>\n {children}\n <Snackbar\n autoHideDuration={6000}\n onClose={() => setHasDownloadError(false)}\n open={hasDownloadError}\n >\n {/* @ts-ignore - Alert does accept children despite the type error */}\n <Alert onClose={() => setHasDownloadError(false)} severity=\"error\" variant=\"filled\">\n {t('error.download-tarball')}\n </Alert>\n </Snackbar>\n </DownloadContext.Provider>\n );\n};\n\nexport const useDownload = () => {\n const context = useContext(DownloadContext);\n if (!context) {\n throw new Error('useDownload must be used within a DownloadProvider');\n }\n return context;\n};\n"],"mappings":";;;;;;;;;;;;AAeA,IAAa,mBAAA,GAAkB,MAAA,cAAA,CAAgD,KAAA,CAAS;AAExF,IAAa,oBAAuD,EAAE,eAAe;CACnF,MAAM,EAAE,OAAA,GAAM,cAAA,eAAA,CAAe;CAC7B,MAAM,EAAE,UAAU,kBAAkB,0BAAA,mBAAmB;CACvD,MAAM,CAAC,kBAAkB,wBAAA,GAAuB,MAAA,SAAA,CAAS,KAAK;CAE9D,MAAM,mBAAA,GAAkB,MAAA,YAAA,CACtB,OAAO,EAAE,WAA6B;EACpC,IAAI;GACF,oBAAoB,KAAK;GACzB,MAAM,aAAa,MAAM,SAAS,EAAE,KAAK,CAAC;GAC1C,IAAI,CAAC,YAAY;IAGf,oBAAoB,IAAI;IACxB;GACF;GAEA,MAAM,WAAW,YAAA,gBAAgB,IAAI;GACrC,YAAA,aAAa,YAAY,QAAQ;EACnC,SAAS,OAAO;GACd,QAAQ,MAAM,kCAAkC,KAAK;GACrD,oBAAoB,IAAI;EAC1B;CACF,GACA,CAAC,QAAQ,CACX;CAEA,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,gBAAgB,UAAjB;EAA0B,OAAO;GAAE;GAAiB;GAAe;EAAiB;EAApF,UAAA,CACG,UACD,iBAAA,GAAA,kBAAA,IAAA,CAAC,uBAAA,SAAD;GACE,kBAAkB;GAClB,eAAe,oBAAoB,KAAK;GACxC,MAAM;GAGN,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,oBAAA,SAAD;IAAO,eAAe,oBAAoB,KAAK;IAAG,UAAS;IAAQ,SAAQ;IACxE,UAAA,EAAE,wBAAwB;GACtB,CAAA;EACC,CAAA,CACc;;AAE9B;AAEA,IAAa,oBAAoB;CAC/B,MAAM,WAAA,GAAU,MAAA,WAAA,CAAW,eAAe;CAC1C,IAAI,CAAC,SACH,MAAM,IAAI,MAAM,oDAAoD;CAEtE,OAAO;AACT"}
|
|
@@ -1,27 +1,48 @@
|
|
|
1
1
|
import { downloadFile, extractFileName } from "../../utils/url.mjs";
|
|
2
2
|
import { useTarballDownload } from "../../api/use-data-mutation.mjs";
|
|
3
|
-
import { createContext, useCallback, useContext } from "react";
|
|
4
|
-
import {
|
|
3
|
+
import { createContext, useCallback, useContext, useState } from "react";
|
|
4
|
+
import { useTranslation } from "react-i18next";
|
|
5
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
6
|
+
import Alert from "@mui/material/Alert";
|
|
7
|
+
import Snackbar from "@mui/material/Snackbar";
|
|
5
8
|
//#region src/providers/DownloadProvider/DownloadProvider.tsx
|
|
6
9
|
var DownloadContext = createContext(void 0);
|
|
7
10
|
var DownloadProvider = ({ children }) => {
|
|
11
|
+
const { t } = useTranslation();
|
|
8
12
|
const { download, isDownloading } = useTarballDownload();
|
|
13
|
+
const [hasDownloadError, setHasDownloadError] = useState(false);
|
|
9
14
|
const downloadTarball = useCallback(async ({ link }) => {
|
|
10
15
|
try {
|
|
16
|
+
setHasDownloadError(false);
|
|
11
17
|
const fileStream = await download({ link });
|
|
12
|
-
if (!fileStream)
|
|
18
|
+
if (!fileStream) {
|
|
19
|
+
setHasDownloadError(true);
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
13
22
|
const fileName = extractFileName(link);
|
|
14
23
|
downloadFile(fileStream, fileName);
|
|
15
24
|
} catch (error) {
|
|
16
25
|
console.error("Error during tarball download:", error);
|
|
26
|
+
setHasDownloadError(true);
|
|
17
27
|
}
|
|
18
28
|
}, [download]);
|
|
19
|
-
return /* @__PURE__ */
|
|
29
|
+
return /* @__PURE__ */ jsxs(DownloadContext.Provider, {
|
|
20
30
|
value: {
|
|
21
31
|
downloadTarball,
|
|
22
|
-
isDownloading
|
|
32
|
+
isDownloading,
|
|
33
|
+
hasDownloadError
|
|
23
34
|
},
|
|
24
|
-
children
|
|
35
|
+
children: [children, /* @__PURE__ */ jsx(Snackbar, {
|
|
36
|
+
autoHideDuration: 6e3,
|
|
37
|
+
onClose: () => setHasDownloadError(false),
|
|
38
|
+
open: hasDownloadError,
|
|
39
|
+
children: /* @__PURE__ */ jsx(Alert, {
|
|
40
|
+
onClose: () => setHasDownloadError(false),
|
|
41
|
+
severity: "error",
|
|
42
|
+
variant: "filled",
|
|
43
|
+
children: t("error.download-tarball")
|
|
44
|
+
})
|
|
45
|
+
})]
|
|
25
46
|
});
|
|
26
47
|
};
|
|
27
48
|
var useDownload = () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DownloadProvider.mjs","names":[],"sources":["../../../src/providers/DownloadProvider/DownloadProvider.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport React, { createContext, useCallback, useContext } from 'react';\n\nimport { useTarballDownload } from '../../api/use-data-mutation';\nimport { downloadFile, extractFileName } from '../../utils/url';\n\nexport interface DownloadContextProps {\n downloadTarball: (args: { link: string }) => Promise<void>;\n isDownloading: boolean;\n}\n\nexport const DownloadContext = createContext<DownloadContextProps | undefined>(undefined);\n\nexport const DownloadProvider: React.FC<{ children: ReactNode }> = ({ children }) => {\n const { download, isDownloading } = useTarballDownload();\n\n const downloadTarball = useCallback(\n async ({ link }: { link: string }) => {\n try {\n const fileStream = await download({ link });\n if (!fileStream) return;\n\n const fileName = extractFileName(link);\n downloadFile(fileStream, fileName);\n } catch (error) {\n console.error('Error during tarball download:', error);\n }\n },\n [download]\n );\n\n return (\n <DownloadContext.Provider value={{ downloadTarball, isDownloading }}>\n {children}\n </DownloadContext.Provider>\n );\n};\n\nexport const useDownload = () => {\n const context = useContext(DownloadContext);\n if (!context) {\n throw new Error('useDownload must be used within a DownloadProvider');\n }\n return context;\n};\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"DownloadProvider.mjs","names":[],"sources":["../../../src/providers/DownloadProvider/DownloadProvider.tsx"],"sourcesContent":["import Alert from '@mui/material/Alert';\nimport Snackbar from '@mui/material/Snackbar';\nimport type { ReactNode } from 'react';\nimport React, { createContext, useCallback, useContext, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { useTarballDownload } from '../../api/use-data-mutation';\nimport { downloadFile, extractFileName } from '../../utils/url';\n\nexport interface DownloadContextProps {\n downloadTarball: (args: { link: string }) => Promise<void>;\n isDownloading: boolean;\n hasDownloadError: boolean;\n}\n\nexport const DownloadContext = createContext<DownloadContextProps | undefined>(undefined);\n\nexport const DownloadProvider: React.FC<{ children: ReactNode }> = ({ children }) => {\n const { t } = useTranslation();\n const { download, isDownloading } = useTarballDownload();\n const [hasDownloadError, setHasDownloadError] = useState(false);\n\n const downloadTarball = useCallback(\n async ({ link }: { link: string }) => {\n try {\n setHasDownloadError(false);\n const fileStream = await download({ link });\n if (!fileStream) {\n // clicking download and having nothing happen sends the user\n // retrying blindly; an empty response is an error too\n setHasDownloadError(true);\n return;\n }\n\n const fileName = extractFileName(link);\n downloadFile(fileStream, fileName);\n } catch (error) {\n console.error('Error during tarball download:', error);\n setHasDownloadError(true);\n }\n },\n [download]\n );\n\n return (\n <DownloadContext.Provider value={{ downloadTarball, isDownloading, hasDownloadError }}>\n {children}\n <Snackbar\n autoHideDuration={6000}\n onClose={() => setHasDownloadError(false)}\n open={hasDownloadError}\n >\n {/* @ts-ignore - Alert does accept children despite the type error */}\n <Alert onClose={() => setHasDownloadError(false)} severity=\"error\" variant=\"filled\">\n {t('error.download-tarball')}\n </Alert>\n </Snackbar>\n </DownloadContext.Provider>\n );\n};\n\nexport const useDownload = () => {\n const context = useContext(DownloadContext);\n if (!context) {\n throw new Error('useDownload must be used within a DownloadProvider');\n }\n return context;\n};\n"],"mappings":";;;;;;;;AAeA,IAAa,kBAAkB,cAAgD,KAAA,CAAS;AAExF,IAAa,oBAAuD,EAAE,eAAe;CACnF,MAAM,EAAE,MAAM,eAAe;CAC7B,MAAM,EAAE,UAAU,kBAAkB,mBAAmB;CACvD,MAAM,CAAC,kBAAkB,uBAAuB,SAAS,KAAK;CAE9D,MAAM,kBAAkB,YACtB,OAAO,EAAE,WAA6B;EACpC,IAAI;GACF,oBAAoB,KAAK;GACzB,MAAM,aAAa,MAAM,SAAS,EAAE,KAAK,CAAC;GAC1C,IAAI,CAAC,YAAY;IAGf,oBAAoB,IAAI;IACxB;GACF;GAEA,MAAM,WAAW,gBAAgB,IAAI;GACrC,aAAa,YAAY,QAAQ;EACnC,SAAS,OAAO;GACd,QAAQ,MAAM,kCAAkC,KAAK;GACrD,oBAAoB,IAAI;EAC1B;CACF,GACA,CAAC,QAAQ,CACX;CAEA,OACE,qBAAC,gBAAgB,UAAjB;EAA0B,OAAO;GAAE;GAAiB;GAAe;EAAiB;EAApF,UAAA,CACG,UACD,oBAAC,UAAD;GACE,kBAAkB;GAClB,eAAe,oBAAoB,KAAK;GACxC,MAAM;GAGN,UAAA,oBAAC,OAAD;IAAO,eAAe,oBAAoB,KAAK;IAAG,UAAS;IAAQ,SAAQ;IACxE,UAAA,EAAE,wBAAwB;GACtB,CAAA;EACC,CAAA,CACc;;AAE9B;AAEA,IAAa,oBAAoB;CAC/B,MAAM,UAAU,WAAW,eAAe;CAC1C,IAAI,CAAC,SACH,MAAM,IAAI,MAAM,oDAAoD;CAEtE,OAAO;AACT"}
|
|
@@ -16,7 +16,7 @@ var ManifestsProvider = ({ children }) => {
|
|
|
16
16
|
value: {
|
|
17
17
|
manifests: data.data ?? [],
|
|
18
18
|
isLoading: data.isLoading,
|
|
19
|
-
isError: typeof data.error
|
|
19
|
+
isError: typeof data.error !== "undefined" && typeof data.data === "undefined"
|
|
20
20
|
},
|
|
21
21
|
children
|
|
22
22
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ManifestsProvider.js","names":[],"sources":["../../../src/providers/ManifestsProvider/ManifestsProvider.tsx"],"sourcesContent":["import type { ReactElement } from 'react';\nimport React, { createContext, useContext } from 'react';\n\nimport type { Manifest } from '@verdaccio/types';\n\nimport { useData } from '../../api/use-data';\nimport { getConfiguration } from '../../configuration';\nimport { APIRoute } from '../../store/routes';\nimport { stripTrailingSlash } from '../../store/utils';\n\nexport interface ManifestsContextProps {\n isError: boolean;\n isLoading: boolean;\n manifests: ManifestWeb[];\n}\n\nexport interface Author {\n name?: string;\n email?: string;\n url?: string;\n avatar?: string;\n}\n\nexport interface ManifestWeb extends Omit<Manifest, 'time' | 'author'> {\n time: string;\n author: Author;\n version: string;\n dist: any;\n}\n\nexport const ManifestsContext = createContext<Partial<ManifestsContextProps>>({});\n\nconst configuration = getConfiguration();\n\nconst ManifestsProvider: React.FC<{ children: ReactElement }> = ({ children }) => {\n const basePath = stripTrailingSlash(configuration.base);\n\n const data = useData<ManifestWeb[]>(basePath, APIRoute.PACKAGES);\n\n return (\n <ManifestsContext.Provider\n value={{\n manifests: (data.data as ManifestWeb[]) ?? [],\n isLoading: data.isLoading,\n isError: typeof data.error
|
|
1
|
+
{"version":3,"file":"ManifestsProvider.js","names":[],"sources":["../../../src/providers/ManifestsProvider/ManifestsProvider.tsx"],"sourcesContent":["import type { ReactElement } from 'react';\nimport React, { createContext, useContext } from 'react';\n\nimport type { Manifest } from '@verdaccio/types';\n\nimport { useData } from '../../api/use-data';\nimport { getConfiguration } from '../../configuration';\nimport { APIRoute } from '../../store/routes';\nimport { stripTrailingSlash } from '../../store/utils';\n\nexport interface ManifestsContextProps {\n isError: boolean;\n isLoading: boolean;\n manifests: ManifestWeb[];\n}\n\nexport interface Author {\n name?: string;\n email?: string;\n url?: string;\n avatar?: string;\n}\n\nexport interface ManifestWeb extends Omit<Manifest, 'time' | 'author'> {\n time: string;\n author: Author;\n version: string;\n dist: any;\n}\n\nexport const ManifestsContext = createContext<Partial<ManifestsContextProps>>({});\n\nconst configuration = getConfiguration();\n\nconst ManifestsProvider: React.FC<{ children: ReactElement }> = ({ children }) => {\n const basePath = stripTrailingSlash(configuration.base);\n\n const data = useData<ManifestWeb[]>(basePath, APIRoute.PACKAGES);\n\n return (\n <ManifestsContext.Provider\n value={{\n manifests: (data.data as ManifestWeb[]) ?? [],\n isLoading: data.isLoading,\n // any error counts (network failures have no `.code`), but a failed\n // revalidation must not hide an already-cached, renderable list\n isError: typeof data.error !== 'undefined' && typeof data.data === 'undefined',\n }}\n >\n {children}\n </ManifestsContext.Provider>\n );\n};\n\nexport default ManifestsProvider;\n\nexport const useManifests = () => useContext(ManifestsContext);\n"],"mappings":";;;;;;;;;AA8BA,IAAa,oBAAA,GAAmB,MAAA,cAAA,CAA8C,CAAC,CAAC;AAEhF,IAAM,gBAAgB,sBAAA,iBAAiB;AAEvC,IAAM,qBAA2D,EAAE,eAAe;CAChF,MAAM,WAAW,cAAA,mBAAmB,cAAc,IAAI;CAEtD,MAAM,OAAO,iBAAA,QAAuB,UAAU,eAAA,SAAS,QAAQ;CAE/D,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,iBAAiB,UAAlB;EACE,OAAO;GACL,WAAY,KAAK,QAA0B,CAAC;GAC5C,WAAW,KAAK;GAGhB,SAAS,OAAO,KAAK,UAAU,eAAe,OAAO,KAAK,SAAS;EACrE;EAEC;CACwB,CAAA;AAE/B;AAIA,IAAa,sBAAA,GAAqB,MAAA,WAAA,CAAW,gBAAgB"}
|
|
@@ -14,7 +14,7 @@ var ManifestsProvider = ({ children }) => {
|
|
|
14
14
|
value: {
|
|
15
15
|
manifests: data.data ?? [],
|
|
16
16
|
isLoading: data.isLoading,
|
|
17
|
-
isError: typeof data.error
|
|
17
|
+
isError: typeof data.error !== "undefined" && typeof data.data === "undefined"
|
|
18
18
|
},
|
|
19
19
|
children
|
|
20
20
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ManifestsProvider.mjs","names":[],"sources":["../../../src/providers/ManifestsProvider/ManifestsProvider.tsx"],"sourcesContent":["import type { ReactElement } from 'react';\nimport React, { createContext, useContext } from 'react';\n\nimport type { Manifest } from '@verdaccio/types';\n\nimport { useData } from '../../api/use-data';\nimport { getConfiguration } from '../../configuration';\nimport { APIRoute } from '../../store/routes';\nimport { stripTrailingSlash } from '../../store/utils';\n\nexport interface ManifestsContextProps {\n isError: boolean;\n isLoading: boolean;\n manifests: ManifestWeb[];\n}\n\nexport interface Author {\n name?: string;\n email?: string;\n url?: string;\n avatar?: string;\n}\n\nexport interface ManifestWeb extends Omit<Manifest, 'time' | 'author'> {\n time: string;\n author: Author;\n version: string;\n dist: any;\n}\n\nexport const ManifestsContext = createContext<Partial<ManifestsContextProps>>({});\n\nconst configuration = getConfiguration();\n\nconst ManifestsProvider: React.FC<{ children: ReactElement }> = ({ children }) => {\n const basePath = stripTrailingSlash(configuration.base);\n\n const data = useData<ManifestWeb[]>(basePath, APIRoute.PACKAGES);\n\n return (\n <ManifestsContext.Provider\n value={{\n manifests: (data.data as ManifestWeb[]) ?? [],\n isLoading: data.isLoading,\n isError: typeof data.error
|
|
1
|
+
{"version":3,"file":"ManifestsProvider.mjs","names":[],"sources":["../../../src/providers/ManifestsProvider/ManifestsProvider.tsx"],"sourcesContent":["import type { ReactElement } from 'react';\nimport React, { createContext, useContext } from 'react';\n\nimport type { Manifest } from '@verdaccio/types';\n\nimport { useData } from '../../api/use-data';\nimport { getConfiguration } from '../../configuration';\nimport { APIRoute } from '../../store/routes';\nimport { stripTrailingSlash } from '../../store/utils';\n\nexport interface ManifestsContextProps {\n isError: boolean;\n isLoading: boolean;\n manifests: ManifestWeb[];\n}\n\nexport interface Author {\n name?: string;\n email?: string;\n url?: string;\n avatar?: string;\n}\n\nexport interface ManifestWeb extends Omit<Manifest, 'time' | 'author'> {\n time: string;\n author: Author;\n version: string;\n dist: any;\n}\n\nexport const ManifestsContext = createContext<Partial<ManifestsContextProps>>({});\n\nconst configuration = getConfiguration();\n\nconst ManifestsProvider: React.FC<{ children: ReactElement }> = ({ children }) => {\n const basePath = stripTrailingSlash(configuration.base);\n\n const data = useData<ManifestWeb[]>(basePath, APIRoute.PACKAGES);\n\n return (\n <ManifestsContext.Provider\n value={{\n manifests: (data.data as ManifestWeb[]) ?? [],\n isLoading: data.isLoading,\n // any error counts (network failures have no `.code`), but a failed\n // revalidation must not hide an already-cached, renderable list\n isError: typeof data.error !== 'undefined' && typeof data.data === 'undefined',\n }}\n >\n {children}\n </ManifestsContext.Provider>\n );\n};\n\nexport default ManifestsProvider;\n\nexport const useManifests = () => useContext(ManifestsContext);\n"],"mappings":";;;;;;;AA8BA,IAAa,mBAAmB,cAA8C,CAAC,CAAC;AAEhF,IAAM,gBAAgB,iBAAiB;AAEvC,IAAM,qBAA2D,EAAE,eAAe;CAChF,MAAM,WAAW,mBAAmB,cAAc,IAAI;CAEtD,MAAM,OAAO,QAAuB,UAAU,SAAS,QAAQ;CAE/D,OACE,oBAAC,iBAAiB,UAAlB;EACE,OAAO;GACL,WAAY,KAAK,QAA0B,CAAC;GAC5C,WAAW,KAAK;GAGhB,SAAS,OAAO,KAAK,UAAU,eAAe,OAAO,KAAK,SAAS;EACrE;EAEC;CACwB,CAAA;AAE/B;AAIA,IAAa,qBAAqB,WAAW,gBAAgB"}
|
|
@@ -10,6 +10,7 @@ export interface SearchContextProps {
|
|
|
10
10
|
text: string;
|
|
11
11
|
signal?: AbortSignal;
|
|
12
12
|
}) => Promise<void>;
|
|
13
|
+
resetSearch: () => void;
|
|
13
14
|
}
|
|
14
15
|
export declare const SearchContext: React.Context<Partial<SearchContextProps>>;
|
|
15
16
|
export declare const SearchProvider: React.FC<{
|
|
@@ -16,18 +16,19 @@ var SearchContext = (0, react.createContext)({
|
|
|
16
16
|
var configuration = require_configuration.getConfiguration();
|
|
17
17
|
function useDataSearchMutation(basePath, route, method = "POST") {
|
|
18
18
|
const key = `${basePath}${route}`;
|
|
19
|
-
const { data, error, isMutating, trigger } = (0, swr_mutation.default)(key, (url, { arg }) => {
|
|
19
|
+
const { data, error, isMutating, trigger, reset } = (0, swr_mutation.default)(key, (url, { arg }) => {
|
|
20
20
|
return require_use_data_mutation.fetcher(`${url}${encodeURIComponent(arg?.text ?? "")}`, method, arg ?? {}, { signal: arg?.signal });
|
|
21
21
|
});
|
|
22
22
|
return {
|
|
23
23
|
data,
|
|
24
24
|
error,
|
|
25
25
|
isMutating,
|
|
26
|
-
trigger
|
|
26
|
+
trigger,
|
|
27
|
+
reset
|
|
27
28
|
};
|
|
28
29
|
}
|
|
29
30
|
var SearchProvider = ({ children }) => {
|
|
30
|
-
const { data, isMutating, error, trigger } = useDataSearchMutation(require_utils.stripTrailingSlash(configuration.base), require_routes.APIRoute.SEARCH, "GET");
|
|
31
|
+
const { data, isMutating, error, trigger, reset } = useDataSearchMutation(require_utils.stripTrailingSlash(configuration.base), require_routes.APIRoute.SEARCH, "GET");
|
|
31
32
|
const doSearch = async (query) => {
|
|
32
33
|
try {
|
|
33
34
|
await trigger({
|
|
@@ -35,15 +36,16 @@ var SearchProvider = ({ children }) => {
|
|
|
35
36
|
signal: query.signal
|
|
36
37
|
});
|
|
37
38
|
} catch (err) {
|
|
38
|
-
console.error("Search failed:", err);
|
|
39
|
+
if (err?.name !== "AbortError") console.error("Search failed:", err);
|
|
39
40
|
}
|
|
40
41
|
};
|
|
41
42
|
const value = {
|
|
42
43
|
searchResults: data ?? [],
|
|
43
44
|
isLoading: isMutating,
|
|
44
|
-
isError: !!error,
|
|
45
|
+
isError: !!error && error.name !== "AbortError",
|
|
45
46
|
error,
|
|
46
|
-
doSearch
|
|
47
|
+
doSearch,
|
|
48
|
+
resetSearch: reset
|
|
47
49
|
};
|
|
48
50
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SearchContext.Provider, {
|
|
49
51
|
value,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SearchProvider.js","names":[],"sources":["../../../src/providers/SearchProvider/SearchProvider.tsx"],"sourcesContent":["import type { ReactElement } from 'react';\nimport React, { createContext, useContext } from 'react';\nimport useSWRMutation from 'swr/mutation';\n\nimport type { SearchResultWeb } from '@verdaccio/types';\n\nimport { fetcher } from '../../api/use-data-mutation';\nimport { getConfiguration } from '../../configuration';\nimport { APIRoute } from '../../store/routes';\nimport { stripTrailingSlash } from '../../store/utils';\n\nexport interface SearchContextProps {\n error: Error | undefined;\n isLoading: boolean;\n isError: boolean;\n searchResults: SearchResultWeb[];\n doSearch: (query: { text: string; signal?: AbortSignal }) => Promise<void>;\n}\n\nexport const SearchContext = createContext<Partial<SearchContextProps>>({\n searchResults: [],\n isLoading: false,\n});\n\nconst configuration = getConfiguration();\n\nfunction useDataSearchMutation<T>(basePath: string, route: APIRoute | string, method = 'POST') {\n const key = `${basePath}${route}`;\n\n const { data, error, isMutating, trigger } = useSWRMutation<T, any, string, any>(\n key,\n (url, { arg }) => {\n return fetcher<T>(`${url}${encodeURIComponent(arg?.text ?? '')}`, method, arg ?? {}, {\n signal: arg?.signal,\n });\n }\n );\n\n return { data, error, isMutating, trigger };\n}\n\nexport const SearchProvider: React.FC<{ children: ReactElement }> = ({ children }) => {\n const basePath = stripTrailingSlash(configuration.base);\n\n const { data, isMutating, error, trigger } = useDataSearchMutation<SearchResultWeb[]>(\n basePath,\n APIRoute.SEARCH,\n 'GET'\n );\n\n const doSearch = async (query: { text: string; signal?: AbortSignal }) => {\n try {\n await trigger({ text: query.text, signal: query.signal });\n } catch (err: any) {\n console.error('Search failed:', err);\n }\n };\n\n const value: SearchContextProps = {\n searchResults: data ?? [],\n isLoading: isMutating,\n isError: !!error,\n error,\n doSearch,\n };\n\n return <SearchContext.Provider value={value}>{children}</SearchContext.Provider>;\n};\n\nexport default SearchProvider;\n\nexport const useSearch = () => useContext(SearchContext);\n"],"mappings":";;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"SearchProvider.js","names":[],"sources":["../../../src/providers/SearchProvider/SearchProvider.tsx"],"sourcesContent":["import type { ReactElement } from 'react';\nimport React, { createContext, useContext } from 'react';\nimport useSWRMutation from 'swr/mutation';\n\nimport type { SearchResultWeb } from '@verdaccio/types';\n\nimport { fetcher } from '../../api/use-data-mutation';\nimport { getConfiguration } from '../../configuration';\nimport { APIRoute } from '../../store/routes';\nimport { stripTrailingSlash } from '../../store/utils';\n\nexport interface SearchContextProps {\n error: Error | undefined;\n isLoading: boolean;\n isError: boolean;\n searchResults: SearchResultWeb[];\n doSearch: (query: { text: string; signal?: AbortSignal }) => Promise<void>;\n resetSearch: () => void;\n}\n\nexport const SearchContext = createContext<Partial<SearchContextProps>>({\n searchResults: [],\n isLoading: false,\n});\n\nconst configuration = getConfiguration();\n\nfunction useDataSearchMutation<T>(basePath: string, route: APIRoute | string, method = 'POST') {\n const key = `${basePath}${route}`;\n\n const { data, error, isMutating, trigger, reset } = useSWRMutation<T, any, string, any>(\n key,\n (url, { arg }) => {\n return fetcher<T>(`${url}${encodeURIComponent(arg?.text ?? '')}`, method, arg ?? {}, {\n signal: arg?.signal,\n });\n }\n );\n\n return { data, error, isMutating, trigger, reset };\n}\n\nexport const SearchProvider: React.FC<{ children: ReactElement }> = ({ children }) => {\n const basePath = stripTrailingSlash(configuration.base);\n\n const { data, isMutating, error, trigger, reset } = useDataSearchMutation<SearchResultWeb[]>(\n basePath,\n APIRoute.SEARCH,\n 'GET'\n );\n\n const doSearch = async (query: { text: string; signal?: AbortSignal }) => {\n try {\n await trigger({ text: query.text, signal: query.signal });\n } catch (err: any) {\n // an abort (user kept typing or navigated away) is expected control flow;\n // real failures are surfaced through the `isError` state below\n if (err?.name !== 'AbortError') {\n console.error('Search failed:', err);\n }\n }\n };\n\n const value: SearchContextProps = {\n searchResults: data ?? [],\n isLoading: isMutating,\n // an aborted request (user kept typing) is not an error worth showing\n isError: !!error && error.name !== 'AbortError',\n error,\n doSearch,\n resetSearch: reset,\n };\n\n return <SearchContext.Provider value={value}>{children}</SearchContext.Provider>;\n};\n\nexport default SearchProvider;\n\nexport const useSearch = () => useContext(SearchContext);\n"],"mappings":";;;;;;;;;;;AAoBA,IAAa,iBAAA,GAAgB,MAAA,cAAA,CAA2C;CACtE,eAAe,CAAC;CAChB,WAAW;AACb,CAAC;AAED,IAAM,gBAAgB,sBAAA,iBAAiB;AAEvC,SAAS,sBAAyB,UAAkB,OAA0B,SAAS,QAAQ;CAC7F,MAAM,MAAM,GAAG,WAAW;CAE1B,MAAM,EAAE,MAAM,OAAO,YAAY,SAAS,WAAA,GAAU,aAAA,QAAA,CAClD,MACC,KAAK,EAAE,UAAU;EAChB,OAAO,0BAAA,QAAW,GAAG,MAAM,mBAAmB,KAAK,QAAQ,EAAE,KAAK,QAAQ,OAAO,CAAC,GAAG,EACnF,QAAQ,KAAK,OACf,CAAC;CACH,CACF;CAEA,OAAO;EAAE;EAAM;EAAO;EAAY;EAAS;CAAM;AACnD;AAEA,IAAa,kBAAwD,EAAE,eAAe;CAGpF,MAAM,EAAE,MAAM,YAAY,OAAO,SAAS,UAAU,sBAFnC,cAAA,mBAAmB,cAAc,IAGhD,GACA,eAAA,SAAS,QACT,KACF;CAEA,MAAM,WAAW,OAAO,UAAkD;EACxE,IAAI;GACF,MAAM,QAAQ;IAAE,MAAM,MAAM;IAAM,QAAQ,MAAM;GAAO,CAAC;EAC1D,SAAS,KAAU;GAGjB,IAAI,KAAK,SAAS,cAChB,QAAQ,MAAM,kBAAkB,GAAG;EAEvC;CACF;CAEA,MAAM,QAA4B;EAChC,eAAe,QAAQ,CAAC;EACxB,WAAW;EAEX,SAAS,CAAC,CAAC,SAAS,MAAM,SAAS;EACnC;EACA;EACA,aAAa;CACf;CAEA,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,cAAc,UAAf;EAA+B;EAAQ;CAAiC,CAAA;AACjF;AAIA,IAAa,mBAAA,GAAkB,MAAA,WAAA,CAAW,aAAa"}
|
|
@@ -13,18 +13,19 @@ var SearchContext = createContext({
|
|
|
13
13
|
var configuration = getConfiguration();
|
|
14
14
|
function useDataSearchMutation(basePath, route, method = "POST") {
|
|
15
15
|
const key = `${basePath}${route}`;
|
|
16
|
-
const { data, error, isMutating, trigger } = useSWRMutation(key, (url, { arg }) => {
|
|
16
|
+
const { data, error, isMutating, trigger, reset } = useSWRMutation(key, (url, { arg }) => {
|
|
17
17
|
return fetcher(`${url}${encodeURIComponent(arg?.text ?? "")}`, method, arg ?? {}, { signal: arg?.signal });
|
|
18
18
|
});
|
|
19
19
|
return {
|
|
20
20
|
data,
|
|
21
21
|
error,
|
|
22
22
|
isMutating,
|
|
23
|
-
trigger
|
|
23
|
+
trigger,
|
|
24
|
+
reset
|
|
24
25
|
};
|
|
25
26
|
}
|
|
26
27
|
var SearchProvider = ({ children }) => {
|
|
27
|
-
const { data, isMutating, error, trigger } = useDataSearchMutation(stripTrailingSlash(configuration.base), APIRoute.SEARCH, "GET");
|
|
28
|
+
const { data, isMutating, error, trigger, reset } = useDataSearchMutation(stripTrailingSlash(configuration.base), APIRoute.SEARCH, "GET");
|
|
28
29
|
const doSearch = async (query) => {
|
|
29
30
|
try {
|
|
30
31
|
await trigger({
|
|
@@ -32,15 +33,16 @@ var SearchProvider = ({ children }) => {
|
|
|
32
33
|
signal: query.signal
|
|
33
34
|
});
|
|
34
35
|
} catch (err) {
|
|
35
|
-
console.error("Search failed:", err);
|
|
36
|
+
if (err?.name !== "AbortError") console.error("Search failed:", err);
|
|
36
37
|
}
|
|
37
38
|
};
|
|
38
39
|
const value = {
|
|
39
40
|
searchResults: data ?? [],
|
|
40
41
|
isLoading: isMutating,
|
|
41
|
-
isError: !!error,
|
|
42
|
+
isError: !!error && error.name !== "AbortError",
|
|
42
43
|
error,
|
|
43
|
-
doSearch
|
|
44
|
+
doSearch,
|
|
45
|
+
resetSearch: reset
|
|
44
46
|
};
|
|
45
47
|
return /* @__PURE__ */ jsx(SearchContext.Provider, {
|
|
46
48
|
value,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SearchProvider.mjs","names":[],"sources":["../../../src/providers/SearchProvider/SearchProvider.tsx"],"sourcesContent":["import type { ReactElement } from 'react';\nimport React, { createContext, useContext } from 'react';\nimport useSWRMutation from 'swr/mutation';\n\nimport type { SearchResultWeb } from '@verdaccio/types';\n\nimport { fetcher } from '../../api/use-data-mutation';\nimport { getConfiguration } from '../../configuration';\nimport { APIRoute } from '../../store/routes';\nimport { stripTrailingSlash } from '../../store/utils';\n\nexport interface SearchContextProps {\n error: Error | undefined;\n isLoading: boolean;\n isError: boolean;\n searchResults: SearchResultWeb[];\n doSearch: (query: { text: string; signal?: AbortSignal }) => Promise<void>;\n}\n\nexport const SearchContext = createContext<Partial<SearchContextProps>>({\n searchResults: [],\n isLoading: false,\n});\n\nconst configuration = getConfiguration();\n\nfunction useDataSearchMutation<T>(basePath: string, route: APIRoute | string, method = 'POST') {\n const key = `${basePath}${route}`;\n\n const { data, error, isMutating, trigger } = useSWRMutation<T, any, string, any>(\n key,\n (url, { arg }) => {\n return fetcher<T>(`${url}${encodeURIComponent(arg?.text ?? '')}`, method, arg ?? {}, {\n signal: arg?.signal,\n });\n }\n );\n\n return { data, error, isMutating, trigger };\n}\n\nexport const SearchProvider: React.FC<{ children: ReactElement }> = ({ children }) => {\n const basePath = stripTrailingSlash(configuration.base);\n\n const { data, isMutating, error, trigger } = useDataSearchMutation<SearchResultWeb[]>(\n basePath,\n APIRoute.SEARCH,\n 'GET'\n );\n\n const doSearch = async (query: { text: string; signal?: AbortSignal }) => {\n try {\n await trigger({ text: query.text, signal: query.signal });\n } catch (err: any) {\n console.error('Search failed:', err);\n }\n };\n\n const value: SearchContextProps = {\n searchResults: data ?? [],\n isLoading: isMutating,\n isError: !!error,\n error,\n doSearch,\n };\n\n return <SearchContext.Provider value={value}>{children}</SearchContext.Provider>;\n};\n\nexport default SearchProvider;\n\nexport const useSearch = () => useContext(SearchContext);\n"],"mappings":";;;;;;;;
|
|
1
|
+
{"version":3,"file":"SearchProvider.mjs","names":[],"sources":["../../../src/providers/SearchProvider/SearchProvider.tsx"],"sourcesContent":["import type { ReactElement } from 'react';\nimport React, { createContext, useContext } from 'react';\nimport useSWRMutation from 'swr/mutation';\n\nimport type { SearchResultWeb } from '@verdaccio/types';\n\nimport { fetcher } from '../../api/use-data-mutation';\nimport { getConfiguration } from '../../configuration';\nimport { APIRoute } from '../../store/routes';\nimport { stripTrailingSlash } from '../../store/utils';\n\nexport interface SearchContextProps {\n error: Error | undefined;\n isLoading: boolean;\n isError: boolean;\n searchResults: SearchResultWeb[];\n doSearch: (query: { text: string; signal?: AbortSignal }) => Promise<void>;\n resetSearch: () => void;\n}\n\nexport const SearchContext = createContext<Partial<SearchContextProps>>({\n searchResults: [],\n isLoading: false,\n});\n\nconst configuration = getConfiguration();\n\nfunction useDataSearchMutation<T>(basePath: string, route: APIRoute | string, method = 'POST') {\n const key = `${basePath}${route}`;\n\n const { data, error, isMutating, trigger, reset } = useSWRMutation<T, any, string, any>(\n key,\n (url, { arg }) => {\n return fetcher<T>(`${url}${encodeURIComponent(arg?.text ?? '')}`, method, arg ?? {}, {\n signal: arg?.signal,\n });\n }\n );\n\n return { data, error, isMutating, trigger, reset };\n}\n\nexport const SearchProvider: React.FC<{ children: ReactElement }> = ({ children }) => {\n const basePath = stripTrailingSlash(configuration.base);\n\n const { data, isMutating, error, trigger, reset } = useDataSearchMutation<SearchResultWeb[]>(\n basePath,\n APIRoute.SEARCH,\n 'GET'\n );\n\n const doSearch = async (query: { text: string; signal?: AbortSignal }) => {\n try {\n await trigger({ text: query.text, signal: query.signal });\n } catch (err: any) {\n // an abort (user kept typing or navigated away) is expected control flow;\n // real failures are surfaced through the `isError` state below\n if (err?.name !== 'AbortError') {\n console.error('Search failed:', err);\n }\n }\n };\n\n const value: SearchContextProps = {\n searchResults: data ?? [],\n isLoading: isMutating,\n // an aborted request (user kept typing) is not an error worth showing\n isError: !!error && error.name !== 'AbortError',\n error,\n doSearch,\n resetSearch: reset,\n };\n\n return <SearchContext.Provider value={value}>{children}</SearchContext.Provider>;\n};\n\nexport default SearchProvider;\n\nexport const useSearch = () => useContext(SearchContext);\n"],"mappings":";;;;;;;;AAoBA,IAAa,gBAAgB,cAA2C;CACtE,eAAe,CAAC;CAChB,WAAW;AACb,CAAC;AAED,IAAM,gBAAgB,iBAAiB;AAEvC,SAAS,sBAAyB,UAAkB,OAA0B,SAAS,QAAQ;CAC7F,MAAM,MAAM,GAAG,WAAW;CAE1B,MAAM,EAAE,MAAM,OAAO,YAAY,SAAS,UAAU,eAClD,MACC,KAAK,EAAE,UAAU;EAChB,OAAO,QAAW,GAAG,MAAM,mBAAmB,KAAK,QAAQ,EAAE,KAAK,QAAQ,OAAO,CAAC,GAAG,EACnF,QAAQ,KAAK,OACf,CAAC;CACH,CACF;CAEA,OAAO;EAAE;EAAM;EAAO;EAAY;EAAS;CAAM;AACnD;AAEA,IAAa,kBAAwD,EAAE,eAAe;CAGpF,MAAM,EAAE,MAAM,YAAY,OAAO,SAAS,UAAU,sBAFnC,mBAAmB,cAAc,IAGhD,GACA,SAAS,QACT,KACF;CAEA,MAAM,WAAW,OAAO,UAAkD;EACxE,IAAI;GACF,MAAM,QAAQ;IAAE,MAAM,MAAM;IAAM,QAAQ,MAAM;GAAO,CAAC;EAC1D,SAAS,KAAU;GAGjB,IAAI,KAAK,SAAS,cAChB,QAAQ,MAAM,kBAAkB,GAAG;EAEvC;CACF;CAEA,MAAM,QAA4B;EAChC,eAAe,QAAQ,CAAC;EACxB,WAAW;EAEX,SAAS,CAAC,CAAC,SAAS,MAAM,SAAS;EACnC;EACA;EACA,aAAa;CACf;CAEA,OAAO,oBAAC,cAAc,UAAf;EAA+B;EAAQ;CAAiC,CAAA;AACjF;AAIA,IAAa,kBAAkB,WAAW,aAAa"}
|
|
@@ -2,8 +2,8 @@ const require_runtime = require("../../_virtual/_rolldown/runtime.js");
|
|
|
2
2
|
const require_useLocalStorage = require("../../hooks/useLocalStorage.js");
|
|
3
3
|
let react = require("react");
|
|
4
4
|
react = require_runtime.__toESM(react);
|
|
5
|
-
let react_jsx_runtime = require("react/jsx-runtime");
|
|
6
5
|
let react_i18next = require("react-i18next");
|
|
6
|
+
let react_jsx_runtime = require("react/jsx-runtime");
|
|
7
7
|
//#region src/providers/TranslatorProvider/TranslatorProvider.tsx
|
|
8
8
|
var I18nTranslatorContext = (0, react.createContext)({
|
|
9
9
|
setLanguage: (_lng) => {},
|
|
@@ -21,8 +21,10 @@ var TranslatorProvider = ({ children, onMount, i18n, listLanguages }) => {
|
|
|
21
21
|
await i18n.changeLanguage(language);
|
|
22
22
|
}, [i18n, language]);
|
|
23
23
|
(0, react.useEffect)(() => {
|
|
24
|
-
|
|
25
|
-
|
|
24
|
+
(async () => {
|
|
25
|
+
await changeLanguage();
|
|
26
|
+
onMount();
|
|
27
|
+
})();
|
|
26
28
|
}, [
|
|
27
29
|
language,
|
|
28
30
|
onMount,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TranslatorProvider.js","names":[],"sources":["../../../src/providers/TranslatorProvider/TranslatorProvider.tsx"],"sourcesContent":["import type { i18n } from 'i18next';\nimport type { FunctionComponent } from 'react';\nimport React, { createContext, useCallback, useContext, useEffect } from 'react';\nimport { I18nextProvider } from 'react-i18next';\n\nimport useLocalStorage from '../../hooks/useLocalStorage';\n\nexport type TranslatorProviderProps = {\n setLanguage: (lng: string) => void;\n language: string;\n listLanguages: LanguageItem[];\n};\n\nexport type LanguageItem = { lng: string; icon: any; menuKey: string };\n\nconst I18nTranslatorContext = createContext<TranslatorProviderProps>({\n setLanguage: (_lng: string) => {},\n language: 'en-US',\n listLanguages: [],\n});\n\n/**\n * Translator provider\n * @category Provider\n */\nconst TranslatorProvider: FunctionComponent<{\n children: React.ReactElement<any>;\n i18n: i18n;\n listLanguages: any;\n onMount: () => {};\n}> = ({ children, onMount, i18n, listLanguages }) => {\n const currentLanguage = i18n.languages?.[0];\n const [language, setLanguage] = useLocalStorage<string>('language', currentLanguage);\n const changeLanguage = useCallback(async () => {\n await i18n.changeLanguage(language);\n }, [i18n, language]);\n\n useEffect(() => {\n changeLanguage();\n
|
|
1
|
+
{"version":3,"file":"TranslatorProvider.js","names":[],"sources":["../../../src/providers/TranslatorProvider/TranslatorProvider.tsx"],"sourcesContent":["import type { i18n } from 'i18next';\nimport type { FunctionComponent } from 'react';\nimport React, { createContext, useCallback, useContext, useEffect } from 'react';\nimport { I18nextProvider } from 'react-i18next';\n\nimport useLocalStorage from '../../hooks/useLocalStorage';\n\nexport type TranslatorProviderProps = {\n setLanguage: (lng: string) => void;\n language: string;\n listLanguages: LanguageItem[];\n};\n\nexport type LanguageItem = { lng: string; icon: any; menuKey: string };\n\nconst I18nTranslatorContext = createContext<TranslatorProviderProps>({\n setLanguage: (_lng: string) => {},\n language: 'en-US',\n listLanguages: [],\n});\n\n/**\n * Translator provider\n * @category Provider\n */\nconst TranslatorProvider: FunctionComponent<{\n children: React.ReactElement<any>;\n i18n: i18n;\n listLanguages: any;\n onMount: () => {};\n}> = ({ children, onMount, i18n, listLanguages }) => {\n const currentLanguage = i18n.languages?.[0];\n const [language, setLanguage] = useLocalStorage<string>('language', currentLanguage);\n const changeLanguage = useCallback(async () => {\n await i18n.changeLanguage(language);\n }, [i18n, language]);\n\n useEffect(() => {\n // apply the persisted language first, so onMount consumers (e.g. the dayjs\n // locale loader) read the final i18n.language instead of the default\n (async () => {\n await changeLanguage();\n onMount();\n })();\n }, [language, onMount, changeLanguage]);\n\n return (\n <I18nextProvider i18n={i18n}>\n <I18nTranslatorContext.Provider value={{ setLanguage, language, listLanguages }}>\n {children}\n </I18nTranslatorContext.Provider>\n </I18nextProvider>\n );\n};\n\nexport default TranslatorProvider;\n\nexport const useLanguage = () => useContext(I18nTranslatorContext);\n"],"mappings":";;;;;;;AAeA,IAAM,yBAAA,GAAwB,MAAA,cAAA,CAAuC;CACnE,cAAc,SAAiB,CAAC;CAChC,UAAU;CACV,eAAe,CAAC;AAClB,CAAC;;;;;AAMD,IAAM,sBAKA,EAAE,UAAU,SAAS,MAAM,oBAAoB;CACnD,MAAM,kBAAkB,KAAK,YAAY;CACzC,MAAM,CAAC,UAAU,eAAe,wBAAA,QAAwB,YAAY,eAAe;CACnF,MAAM,kBAAA,GAAiB,MAAA,YAAA,CAAY,YAAY;EAC7C,MAAM,KAAK,eAAe,QAAQ;CACpC,GAAG,CAAC,MAAM,QAAQ,CAAC;CAEnB,CAAA,GAAA,MAAA,UAAA,OAAgB;EAGd,CAAC,YAAY;GACX,MAAM,eAAe;GACrB,QAAQ;EACV,EAAA,CAAG;CACL,GAAG;EAAC;EAAU;EAAS;CAAc,CAAC;CAEtC,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,cAAA,iBAAD;EAAuB;EACrB,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,sBAAsB,UAAvB;GAAgC,OAAO;IAAE;IAAa;IAAU;GAAc;GAC3E;EAC6B,CAAA;CACjB,CAAA;AAErB;AAIA,IAAa,qBAAA,GAAoB,MAAA,WAAA,CAAW,qBAAqB"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import useLocalStorage from "../../hooks/useLocalStorage.mjs";
|
|
2
2
|
import { createContext, useCallback, useContext, useEffect } from "react";
|
|
3
|
-
import { jsx } from "react/jsx-runtime";
|
|
4
3
|
import { I18nextProvider } from "react-i18next";
|
|
4
|
+
import { jsx } from "react/jsx-runtime";
|
|
5
5
|
//#region src/providers/TranslatorProvider/TranslatorProvider.tsx
|
|
6
6
|
var I18nTranslatorContext = createContext({
|
|
7
7
|
setLanguage: (_lng) => {},
|
|
@@ -19,8 +19,10 @@ var TranslatorProvider = ({ children, onMount, i18n, listLanguages }) => {
|
|
|
19
19
|
await i18n.changeLanguage(language);
|
|
20
20
|
}, [i18n, language]);
|
|
21
21
|
useEffect(() => {
|
|
22
|
-
|
|
23
|
-
|
|
22
|
+
(async () => {
|
|
23
|
+
await changeLanguage();
|
|
24
|
+
onMount();
|
|
25
|
+
})();
|
|
24
26
|
}, [
|
|
25
27
|
language,
|
|
26
28
|
onMount,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TranslatorProvider.mjs","names":[],"sources":["../../../src/providers/TranslatorProvider/TranslatorProvider.tsx"],"sourcesContent":["import type { i18n } from 'i18next';\nimport type { FunctionComponent } from 'react';\nimport React, { createContext, useCallback, useContext, useEffect } from 'react';\nimport { I18nextProvider } from 'react-i18next';\n\nimport useLocalStorage from '../../hooks/useLocalStorage';\n\nexport type TranslatorProviderProps = {\n setLanguage: (lng: string) => void;\n language: string;\n listLanguages: LanguageItem[];\n};\n\nexport type LanguageItem = { lng: string; icon: any; menuKey: string };\n\nconst I18nTranslatorContext = createContext<TranslatorProviderProps>({\n setLanguage: (_lng: string) => {},\n language: 'en-US',\n listLanguages: [],\n});\n\n/**\n * Translator provider\n * @category Provider\n */\nconst TranslatorProvider: FunctionComponent<{\n children: React.ReactElement<any>;\n i18n: i18n;\n listLanguages: any;\n onMount: () => {};\n}> = ({ children, onMount, i18n, listLanguages }) => {\n const currentLanguage = i18n.languages?.[0];\n const [language, setLanguage] = useLocalStorage<string>('language', currentLanguage);\n const changeLanguage = useCallback(async () => {\n await i18n.changeLanguage(language);\n }, [i18n, language]);\n\n useEffect(() => {\n changeLanguage();\n
|
|
1
|
+
{"version":3,"file":"TranslatorProvider.mjs","names":[],"sources":["../../../src/providers/TranslatorProvider/TranslatorProvider.tsx"],"sourcesContent":["import type { i18n } from 'i18next';\nimport type { FunctionComponent } from 'react';\nimport React, { createContext, useCallback, useContext, useEffect } from 'react';\nimport { I18nextProvider } from 'react-i18next';\n\nimport useLocalStorage from '../../hooks/useLocalStorage';\n\nexport type TranslatorProviderProps = {\n setLanguage: (lng: string) => void;\n language: string;\n listLanguages: LanguageItem[];\n};\n\nexport type LanguageItem = { lng: string; icon: any; menuKey: string };\n\nconst I18nTranslatorContext = createContext<TranslatorProviderProps>({\n setLanguage: (_lng: string) => {},\n language: 'en-US',\n listLanguages: [],\n});\n\n/**\n * Translator provider\n * @category Provider\n */\nconst TranslatorProvider: FunctionComponent<{\n children: React.ReactElement<any>;\n i18n: i18n;\n listLanguages: any;\n onMount: () => {};\n}> = ({ children, onMount, i18n, listLanguages }) => {\n const currentLanguage = i18n.languages?.[0];\n const [language, setLanguage] = useLocalStorage<string>('language', currentLanguage);\n const changeLanguage = useCallback(async () => {\n await i18n.changeLanguage(language);\n }, [i18n, language]);\n\n useEffect(() => {\n // apply the persisted language first, so onMount consumers (e.g. the dayjs\n // locale loader) read the final i18n.language instead of the default\n (async () => {\n await changeLanguage();\n onMount();\n })();\n }, [language, onMount, changeLanguage]);\n\n return (\n <I18nextProvider i18n={i18n}>\n <I18nTranslatorContext.Provider value={{ setLanguage, language, listLanguages }}>\n {children}\n </I18nTranslatorContext.Provider>\n </I18nextProvider>\n );\n};\n\nexport default TranslatorProvider;\n\nexport const useLanguage = () => useContext(I18nTranslatorContext);\n"],"mappings":";;;;;AAeA,IAAM,wBAAwB,cAAuC;CACnE,cAAc,SAAiB,CAAC;CAChC,UAAU;CACV,eAAe,CAAC;AAClB,CAAC;;;;;AAMD,IAAM,sBAKA,EAAE,UAAU,SAAS,MAAM,oBAAoB;CACnD,MAAM,kBAAkB,KAAK,YAAY;CACzC,MAAM,CAAC,UAAU,eAAe,gBAAwB,YAAY,eAAe;CACnF,MAAM,iBAAiB,YAAY,YAAY;EAC7C,MAAM,KAAK,eAAe,QAAQ;CACpC,GAAG,CAAC,MAAM,QAAQ,CAAC;CAEnB,gBAAgB;EAGd,CAAC,YAAY;GACX,MAAM,eAAe;GACrB,QAAQ;EACV,EAAA,CAAG;CACL,GAAG;EAAC;EAAU;EAAS;CAAc,CAAC;CAEtC,OACE,oBAAC,iBAAD;EAAuB;EACrB,UAAA,oBAAC,sBAAsB,UAAvB;GAAgC,OAAO;IAAE;IAAa;IAAU;GAAc;GAC3E;EAC6B,CAAA;CACjB,CAAA;AAErB;AAIA,IAAa,oBAAoB,WAAW,qBAAqB"}
|
|
@@ -20,8 +20,8 @@ var VersionProvider = ({ children }) => {
|
|
|
20
20
|
const readmeData = require_use_data.useData(basePath, require_routes.APIRoute.README, packageName, packageVersion);
|
|
21
21
|
const sidebarData = require_use_data.useData(basePath, require_routes.APIRoute.SIDEBAR, packageName, packageVersion);
|
|
22
22
|
const isLoading = readmeData.isLoading || sidebarData.isLoading;
|
|
23
|
-
const error =
|
|
24
|
-
const errorCode =
|
|
23
|
+
const error = sidebarData.error;
|
|
24
|
+
const errorCode = sidebarData.error?.code;
|
|
25
25
|
const value = (0, react.useMemo)(() => ({
|
|
26
26
|
packageMeta: sidebarData.data,
|
|
27
27
|
readMe: readmeData.data,
|
|
@@ -31,7 +31,7 @@ var VersionProvider = ({ children }) => {
|
|
|
31
31
|
isForbidden: errorCode === 403,
|
|
32
32
|
isUnAuthorized: errorCode === 401,
|
|
33
33
|
hasNotBeenFound: errorCode === 404,
|
|
34
|
-
isError:
|
|
34
|
+
isError: error !== void 0,
|
|
35
35
|
error
|
|
36
36
|
}), [
|
|
37
37
|
sidebarData.data,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VersionProvider.js","names":[],"sources":["../../../src/providers/VersionProvider/VersionProvider.tsx"],"sourcesContent":["import React, { createContext, useContext, useMemo } from 'react';\nimport { useParams } from 'react-router';\n\nimport { useData } from '../../api/use-data';\nimport { getConfiguration } from '../../configuration';\nimport { APIRoute } from '../../store/routes';\nimport { stripTrailingSlash } from '../../store/utils';\nimport type { PackageMetaInterface } from '../../types/packageMeta';\n\nfunction getRouterPackageName(packageName: string, scope?: string): string {\n return scope ? `${scope}/${packageName}` : packageName;\n}\n\nexport interface ApiError extends Error {\n code?: number;\n}\n\nexport interface DetailContextProps {\n error: ApiError | undefined;\n hasNotBeenFound: boolean;\n isForbidden: boolean;\n isUnAuthorized: boolean;\n isError: boolean;\n isLoading: boolean;\n packageMeta?: PackageMetaInterface;\n packageName: string;\n packageVersion?: string;\n readMe?: string;\n}\n\nexport const DetailContext = createContext<DetailContextProps | undefined>(undefined);\n\nconst VersionProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => {\n const {\n scope,\n package: pkgName,\n version: packageVersion,\n } = useParams<Record<'scope' | 'package' | 'version', string | undefined>>();\n\n const configuration = getConfiguration();\n const basePath = stripTrailingSlash(configuration.base);\n const packageName = getRouterPackageName(pkgName ?? '', scope);\n\n const readmeData = useData<string>(basePath, APIRoute.README, packageName, packageVersion);\n\n const sidebarData = useData<PackageMetaInterface>(\n basePath,\n APIRoute.SIDEBAR,\n packageName,\n packageVersion\n );\n const isLoading = readmeData.isLoading || sidebarData.isLoading;\n const error: ApiError | undefined =
|
|
1
|
+
{"version":3,"file":"VersionProvider.js","names":[],"sources":["../../../src/providers/VersionProvider/VersionProvider.tsx"],"sourcesContent":["import React, { createContext, useContext, useMemo } from 'react';\nimport { useParams } from 'react-router';\n\nimport { useData } from '../../api/use-data';\nimport { getConfiguration } from '../../configuration';\nimport { APIRoute } from '../../store/routes';\nimport { stripTrailingSlash } from '../../store/utils';\nimport type { PackageMetaInterface } from '../../types/packageMeta';\n\nfunction getRouterPackageName(packageName: string, scope?: string): string {\n return scope ? `${scope}/${packageName}` : packageName;\n}\n\nexport interface ApiError extends Error {\n code?: number;\n}\n\nexport interface DetailContextProps {\n error: ApiError | undefined;\n hasNotBeenFound: boolean;\n isForbidden: boolean;\n isUnAuthorized: boolean;\n isError: boolean;\n isLoading: boolean;\n packageMeta?: PackageMetaInterface;\n packageName: string;\n packageVersion?: string;\n readMe?: string;\n}\n\nexport const DetailContext = createContext<DetailContextProps | undefined>(undefined);\n\nconst VersionProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => {\n const {\n scope,\n package: pkgName,\n version: packageVersion,\n } = useParams<Record<'scope' | 'package' | 'version', string | undefined>>();\n\n const configuration = getConfiguration();\n const basePath = stripTrailingSlash(configuration.base);\n const packageName = getRouterPackageName(pkgName ?? '', scope);\n\n const readmeData = useData<string>(basePath, APIRoute.README, packageName, packageVersion);\n\n const sidebarData = useData<PackageMetaInterface>(\n basePath,\n APIRoute.SIDEBAR,\n packageName,\n packageVersion\n );\n const isLoading = readmeData.isLoading || sidebarData.isLoading;\n // only the sidebar data drives the whole page; a readme-only failure must\n // not blank a page that can render from sidebar data\n const error: ApiError | undefined = sidebarData.error;\n const errorCode = (sidebarData.error as ApiError)?.code;\n\n const value = useMemo<DetailContextProps>(\n () => ({\n packageMeta: sidebarData.data,\n readMe: readmeData.data,\n packageName,\n packageVersion,\n isLoading,\n isForbidden: errorCode === 403,\n isUnAuthorized: errorCode === 401,\n hasNotBeenFound: errorCode === 404,\n // network failures reject without a `.code`, they are still errors\n isError: error !== undefined,\n error,\n }),\n [sidebarData.data, readmeData.data, packageName, packageVersion, isLoading, errorCode, error]\n );\n\n return <DetailContext.Provider value={value}>{children}</DetailContext.Provider>;\n};\n\nexport default VersionProvider;\n\nexport const useVersion = (): DetailContextProps => {\n const context = useContext(DetailContext);\n if (context === undefined) {\n throw new Error('useVersion must be used within a VersionProvider');\n }\n return context;\n};\n"],"mappings":";;;;;;;;;;AASA,SAAS,qBAAqB,aAAqB,OAAwB;CACzE,OAAO,QAAQ,GAAG,MAAM,GAAG,gBAAgB;AAC7C;AAmBA,IAAa,iBAAA,GAAgB,MAAA,cAAA,CAA8C,KAAA,CAAS;AAEpF,IAAM,mBAA4D,EAAE,eAAe;CACjF,MAAM,EACJ,OACA,SAAS,SACT,SAAS,oBAAA,GACP,aAAA,UAAA,CAAuE;CAE3E,MAAM,gBAAgB,sBAAA,iBAAiB;CACvC,MAAM,WAAW,cAAA,mBAAmB,cAAc,IAAI;CACtD,MAAM,cAAc,qBAAqB,WAAW,IAAI,KAAK;CAE7D,MAAM,aAAa,iBAAA,QAAgB,UAAU,eAAA,SAAS,QAAQ,aAAa,cAAc;CAEzF,MAAM,cAAc,iBAAA,QAClB,UACA,eAAA,SAAS,SACT,aACA,cACF;CACA,MAAM,YAAY,WAAW,aAAa,YAAY;CAGtD,MAAM,QAA8B,YAAY;CAChD,MAAM,YAAa,YAAY,OAAoB;CAEnD,MAAM,SAAA,GAAQ,MAAA,QAAA,QACL;EACL,aAAa,YAAY;EACzB,QAAQ,WAAW;EACnB;EACA;EACA;EACA,aAAa,cAAc;EAC3B,gBAAgB,cAAc;EAC9B,iBAAiB,cAAc;EAE/B,SAAS,UAAU,KAAA;EACnB;CACF,IACA;EAAC,YAAY;EAAM,WAAW;EAAM;EAAa;EAAgB;EAAW;EAAW;CAAK,CAC9F;CAEA,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,cAAc,UAAf;EAA+B;EAAQ;CAAiC,CAAA;AACjF;AAIA,IAAa,mBAAuC;CAClD,MAAM,WAAA,GAAU,MAAA,WAAA,CAAW,aAAa;CACxC,IAAI,YAAY,KAAA,GACd,MAAM,IAAI,MAAM,kDAAkD;CAEpE,OAAO;AACT"}
|