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

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.
@@ -1,86 +1,9 @@
1
+ import { type UseFormReturn } from 'react-hook-form';
1
2
  import type { LoginFormValues } from '../../utils/schemas';
2
3
  type Options = {
3
4
  onSuccess?: () => void;
4
5
  };
5
- export declare function useLoginForm({ onSuccess }?: Options): {
6
- watch: import("react-hook-form").UseFormWatch<{
7
- password: string;
8
- username: string;
9
- }>;
10
- getValues: import("react-hook-form").UseFormGetValues<{
11
- password: string;
12
- username: string;
13
- }>;
14
- getFieldState: import("react-hook-form").UseFormGetFieldState<{
15
- password: string;
16
- username: string;
17
- }>;
18
- setError: import("react-hook-form").UseFormSetError<{
19
- password: string;
20
- username: string;
21
- }>;
22
- clearErrors: import("react-hook-form").UseFormClearErrors<{
23
- password: string;
24
- username: string;
25
- }>;
26
- setValue: import("react-hook-form").UseFormSetValue<{
27
- password: string;
28
- username: string;
29
- }>;
30
- setValues: import("react-hook-form").UseFormSetValues<{
31
- password: string;
32
- username: string;
33
- }>;
34
- trigger: import("react-hook-form").UseFormTrigger<{
35
- password: string;
36
- username: string;
37
- }>;
38
- formState: import("react-hook-form").FormState<{
39
- password: string;
40
- username: string;
41
- }>;
42
- resetField: import("react-hook-form").UseFormResetField<{
43
- password: string;
44
- username: string;
45
- }>;
46
- reset: import("react-hook-form").UseFormReset<{
47
- password: string;
48
- username: string;
49
- }>;
50
- resetDefaultValues: import("react-hook-form").UseFormResetDefaultValues<{
51
- password: string;
52
- username: string;
53
- }>;
54
- handleSubmit: import("react-hook-form").UseFormHandleSubmit<{
55
- password: string;
56
- username: string;
57
- }, {
58
- password: string;
59
- username: string;
60
- }>;
61
- unregister: import("react-hook-form").UseFormUnregister<{
62
- password: string;
63
- username: string;
64
- }>;
65
- control: import("react-hook-form").Control<{
66
- password: string;
67
- username: string;
68
- }, any, {
69
- password: string;
70
- username: string;
71
- }>;
72
- register: import("react-hook-form").UseFormRegister<{
73
- password: string;
74
- username: string;
75
- }>;
76
- setFocus: import("react-hook-form").UseFormSetFocus<{
77
- password: string;
78
- username: string;
79
- }>;
80
- subscribe: import("react-hook-form").UseFormSubscribe<{
81
- password: string;
82
- username: string;
83
- }>;
6
+ export declare function useLoginForm({ onSuccess }?: Options): UseFormReturn<LoginFormValues> & {
84
7
  onSubmit: (data: LoginFormValues) => Promise<void>;
85
8
  };
86
9
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"useLoginForm.js","names":[],"sources":["../../../src/components/LoginForm/useLoginForm.ts"],"sourcesContent":["import { yupResolver } from '@hookform/resolvers/yup';\nimport { useCallback } from 'react';\nimport { useForm } from 'react-hook-form';\n\nimport { useAuth } from '../../providers/AuthProvider';\nimport type { LoginFormValues } from '../../utils/schemas';\nimport { loginSchema } from '../../utils/schemas';\n\ntype Options = {\n onSuccess?: () => void;\n};\n\nexport function useLoginForm({ onSuccess }: Options = {}) {\n const { handleLogin } = useAuth();\n\n const form = useForm<LoginFormValues>({\n mode: 'onChange',\n resolver: yupResolver(loginSchema),\n });\n\n const { setError } = form;\n\n const onSubmit = useCallback(\n async (data: LoginFormValues) => {\n try {\n await handleLogin?.(data);\n onSuccess?.();\n } catch {\n setError('root', {\n type: 'server',\n // TODO: add translation key\n message: 'Invalid username or password',\n });\n }\n },\n [handleLogin, setError, onSuccess]\n );\n\n return {\n ...form,\n onSubmit,\n };\n}\n"],"mappings":";;;;;;;AAYA,SAAgB,aAAa,EAAE,cAAuB,CAAC,GAAG;CACxD,MAAM,EAAE,gBAAgB,qBAAA,QAAQ;CAEhC,MAAM,QAAA,GAAO,gBAAA,QAAA,CAAyB;EACpC,MAAM;EACN,WAAA,GAAU,wBAAA,YAAA,CAAY,gBAAA,WAAW;CACnC,CAAC;CAED,MAAM,EAAE,aAAa;CAErB,MAAM,YAAA,GAAW,MAAA,YAAA,CACf,OAAO,SAA0B;EAC/B,IAAI;GACF,MAAM,cAAc,IAAI;GACxB,YAAY;EACd,QAAQ;GACN,SAAS,QAAQ;IACf,MAAM;IAEN,SAAS;GACX,CAAC;EACH;CACF,GACA;EAAC;EAAa;EAAU;CAAS,CACnC;CAEA,OAAO;EACL,GAAG;EACH;CACF;AACF"}
1
+ {"version":3,"file":"useLoginForm.js","names":[],"sources":["../../../src/components/LoginForm/useLoginForm.ts"],"sourcesContent":["import { yupResolver } from '@hookform/resolvers/yup';\nimport { useCallback } from 'react';\nimport { type UseFormReturn, useForm } from 'react-hook-form';\n\nimport { useAuth } from '../../providers/AuthProvider';\nimport type { LoginFormValues } from '../../utils/schemas';\nimport { loginSchema } from '../../utils/schemas';\n\ntype Options = {\n onSuccess?: () => void;\n};\n\nexport function useLoginForm({ onSuccess }: Options = {}): UseFormReturn<LoginFormValues> & {\n onSubmit: (data: LoginFormValues) => Promise<void>;\n} {\n const { handleLogin } = useAuth();\n\n const form = useForm<LoginFormValues>({\n mode: 'onChange',\n resolver: yupResolver(loginSchema),\n });\n\n const { setError } = form;\n\n const onSubmit = useCallback(\n async (data: LoginFormValues) => {\n try {\n await handleLogin?.(data);\n onSuccess?.();\n } catch {\n setError('root', {\n type: 'server',\n // TODO: add translation key\n message: 'Invalid username or password',\n });\n }\n },\n [handleLogin, setError, onSuccess]\n );\n\n return {\n ...form,\n onSubmit,\n };\n}\n"],"mappings":";;;;;;;AAYA,SAAgB,aAAa,EAAE,cAAuB,CAAC,GAErD;CACA,MAAM,EAAE,gBAAgB,qBAAA,QAAQ;CAEhC,MAAM,QAAA,GAAO,gBAAA,QAAA,CAAyB;EACpC,MAAM;EACN,WAAA,GAAU,wBAAA,YAAA,CAAY,gBAAA,WAAW;CACnC,CAAC;CAED,MAAM,EAAE,aAAa;CAErB,MAAM,YAAA,GAAW,MAAA,YAAA,CACf,OAAO,SAA0B;EAC/B,IAAI;GACF,MAAM,cAAc,IAAI;GACxB,YAAY;EACd,QAAQ;GACN,SAAS,QAAQ;IACf,MAAM;IAEN,SAAS;GACX,CAAC;EACH;CACF,GACA;EAAC;EAAa;EAAU;CAAS,CACnC;CAEA,OAAO;EACL,GAAG;EACH;CACF;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"useLoginForm.mjs","names":[],"sources":["../../../src/components/LoginForm/useLoginForm.ts"],"sourcesContent":["import { yupResolver } from '@hookform/resolvers/yup';\nimport { useCallback } from 'react';\nimport { useForm } from 'react-hook-form';\n\nimport { useAuth } from '../../providers/AuthProvider';\nimport type { LoginFormValues } from '../../utils/schemas';\nimport { loginSchema } from '../../utils/schemas';\n\ntype Options = {\n onSuccess?: () => void;\n};\n\nexport function useLoginForm({ onSuccess }: Options = {}) {\n const { handleLogin } = useAuth();\n\n const form = useForm<LoginFormValues>({\n mode: 'onChange',\n resolver: yupResolver(loginSchema),\n });\n\n const { setError } = form;\n\n const onSubmit = useCallback(\n async (data: LoginFormValues) => {\n try {\n await handleLogin?.(data);\n onSuccess?.();\n } catch {\n setError('root', {\n type: 'server',\n // TODO: add translation key\n message: 'Invalid username or password',\n });\n }\n },\n [handleLogin, setError, onSuccess]\n );\n\n return {\n ...form,\n onSubmit,\n };\n}\n"],"mappings":";;;;;;;AAYA,SAAgB,aAAa,EAAE,cAAuB,CAAC,GAAG;CACxD,MAAM,EAAE,gBAAgB,QAAQ;CAEhC,MAAM,OAAO,QAAyB;EACpC,MAAM;EACN,UAAU,YAAY,WAAW;CACnC,CAAC;CAED,MAAM,EAAE,aAAa;CAErB,MAAM,WAAW,YACf,OAAO,SAA0B;EAC/B,IAAI;GACF,MAAM,cAAc,IAAI;GACxB,YAAY;EACd,QAAQ;GACN,SAAS,QAAQ;IACf,MAAM;IAEN,SAAS;GACX,CAAC;EACH;CACF,GACA;EAAC;EAAa;EAAU;CAAS,CACnC;CAEA,OAAO;EACL,GAAG;EACH;CACF;AACF"}
1
+ {"version":3,"file":"useLoginForm.mjs","names":[],"sources":["../../../src/components/LoginForm/useLoginForm.ts"],"sourcesContent":["import { yupResolver } from '@hookform/resolvers/yup';\nimport { useCallback } from 'react';\nimport { type UseFormReturn, useForm } from 'react-hook-form';\n\nimport { useAuth } from '../../providers/AuthProvider';\nimport type { LoginFormValues } from '../../utils/schemas';\nimport { loginSchema } from '../../utils/schemas';\n\ntype Options = {\n onSuccess?: () => void;\n};\n\nexport function useLoginForm({ onSuccess }: Options = {}): UseFormReturn<LoginFormValues> & {\n onSubmit: (data: LoginFormValues) => Promise<void>;\n} {\n const { handleLogin } = useAuth();\n\n const form = useForm<LoginFormValues>({\n mode: 'onChange',\n resolver: yupResolver(loginSchema),\n });\n\n const { setError } = form;\n\n const onSubmit = useCallback(\n async (data: LoginFormValues) => {\n try {\n await handleLogin?.(data);\n onSuccess?.();\n } catch {\n setError('root', {\n type: 'server',\n // TODO: add translation key\n message: 'Invalid username or password',\n });\n }\n },\n [handleLogin, setError, onSuccess]\n );\n\n return {\n ...form,\n onSubmit,\n };\n}\n"],"mappings":";;;;;;;AAYA,SAAgB,aAAa,EAAE,cAAuB,CAAC,GAErD;CACA,MAAM,EAAE,gBAAgB,QAAQ;CAEhC,MAAM,OAAO,QAAyB;EACpC,MAAM;EACN,UAAU,YAAY,WAAW;CACnC,CAAC;CAED,MAAM,EAAE,aAAa;CAErB,MAAM,WAAW,YACf,OAAO,SAA0B;EAC/B,IAAI;GACF,MAAM,cAAc,IAAI;GACxB,YAAY;EACd,QAAQ;GACN,SAAS,QAAQ;IACf,MAAM;IAEN,SAAS;GACX,CAAC;EACH;CACF,GACA;EAAC;EAAa;EAAU;CAAS,CACnC;CAEA,OAAO;EACL,GAAG;EACH;CACF;AACF"}
@@ -1447,8 +1447,8 @@
1447
1447
  margin: 0 .2em .25em -1.4em;
1448
1448
  }
1449
1449
 
1450
- .markdown-body ul:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)) .task-list-item-checkbox,
1451
- .markdown-body ol:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)) .task-list-item-checkbox {
1450
+ .markdown-body ul:dir(rtl) .task-list-item-checkbox,
1451
+ .markdown-body ol:dir(rtl) .task-list-item-checkbox {
1452
1452
  margin: 0 -1.6em .25em .2em;
1453
1453
  }
1454
1454
 
@@ -25,13 +25,17 @@ var Header = ({ HeaderInfoDialog, isPlainHeader, tokenCheckIntervalMs = 36e5 })
25
25
  const { configOptions } = require_AppConfigurationProvider.useConfig();
26
26
  const { userState, logOutUser } = require_AuthProvider.useAuth();
27
27
  const tokenRef = (0, react.useRef)(userState?.token);
28
+ const logOutUserRef = (0, react.useRef)(logOutUser);
28
29
  (0, react.useEffect)(() => {
29
30
  tokenRef.current = userState?.token;
30
31
  }, [userState?.token]);
32
+ (0, react.useEffect)(() => {
33
+ logOutUserRef.current = logOutUser;
34
+ }, [logOutUser]);
31
35
  (0, react.useEffect)(() => {
32
36
  function checkToken() {
33
37
  const token = tokenRef.current;
34
- if (token && require_token.isTokenExpire(token)) logOutUser?.();
38
+ if (token && require_token.isTokenExpire(token)) logOutUserRef.current?.();
35
39
  }
36
40
  checkToken();
37
41
  const interval = setInterval(checkToken, tokenCheckIntervalMs);
@@ -1 +1 @@
1
- {"version":3,"file":"Header.js","names":[],"sources":["../../../src/sections/Header/Header.tsx"],"sourcesContent":["import Button from '@mui/material/Button';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { LoginDialog, Search, useAuth, useConfig } from '../../';\nimport { isTokenExpire } from '../../utils/token';\nimport HeaderLeft from './HeaderLeft';\nimport HeaderRight from './HeaderRight';\nimport HeaderSettingsDialog from './HeaderSettingsDialog';\nimport { InnerMobileNavBar, InnerNavBar, MobileNavBar, NavBar } from './styles';\n\ntype Props = {\n HeaderInfoDialog?: React.FC<any>;\n isPlainHeader?: boolean;\n tokenCheckIntervalMs?: number;\n};\n\n// Session timeout default is 1 hour\nconst Header: React.FC<Props> = ({\n HeaderInfoDialog,\n isPlainHeader,\n tokenCheckIntervalMs = 60 * 60 * 1000,\n}) => {\n const { t } = useTranslation();\n const [isInfoDialogOpen, setOpenInfoDialog] = useState<boolean>(false);\n const [isSettingsDialogOpen, setSettingsDialogOpen] = useState<boolean>(false);\n const [showMobileNavBar, setShowMobileNavBar] = useState<boolean>(false);\n const [showLoginModal, setShowLoginModal] = useState<boolean>(false);\n const { configOptions } = useConfig();\n const { userState, logOutUser } = useAuth();\n\n // Use a ref to always have the latest token in the interval callback\n const tokenRef = useRef(userState?.token);\n useEffect(() => {\n tokenRef.current = userState?.token;\n }, [userState?.token]);\n\n useEffect(() => {\n function checkToken() {\n const token = tokenRef.current;\n if (token && isTokenExpire(token)) {\n logOutUser?.();\n }\n }\n checkToken();\n const interval = setInterval(checkToken, tokenCheckIntervalMs);\n return () => clearInterval(interval);\n }, [tokenCheckIntervalMs]);\n\n const handleLogout = () => {\n logOutUser?.();\n setShowLoginModal(false);\n };\n if (isPlainHeader) {\n return (\n <NavBar data-testid=\"header\" position=\"static\">\n <InnerNavBar data-testid=\"inner-nav-bar\">\n <HeaderLeft showSearch={false} />\n <HeaderRight\n hasLogin={false}\n onLogout={() => {}}\n onOpenRegistryInfoDialog={() => {}}\n onOpenSettingsDialog={() => {}}\n onToggleLogin={() => {}}\n onToggleMobileNav={() => {}}\n showInfo={false}\n showSearch={false}\n showSettings={false}\n showThemeSwitch={false}\n username={''}\n />\n </InnerNavBar>\n </NavBar>\n );\n }\n\n return (\n <>\n <NavBar data-testid=\"header\" position=\"static\">\n <InnerNavBar data-testid=\"inner-nav-bar\">\n <HeaderLeft showSearch={configOptions.showSearch} />\n <HeaderRight\n hasLogin={configOptions?.login}\n onLogout={handleLogout}\n onOpenRegistryInfoDialog={() => setOpenInfoDialog(true)}\n onOpenSettingsDialog={() => setSettingsDialogOpen(true)}\n onToggleLogin={() => setShowLoginModal(!showLoginModal)}\n onToggleMobileNav={() => setShowMobileNavBar(!showMobileNavBar)}\n showInfo={configOptions.showInfo}\n showSearch={configOptions.showSearch}\n showSettings={configOptions.showSettings}\n showThemeSwitch={configOptions.showThemeSwitch}\n username={userState?.username}\n />\n </InnerNavBar>\n <HeaderSettingsDialog\n isOpen={isSettingsDialogOpen}\n onCloseDialog={() => setSettingsDialogOpen(false)}\n />\n {HeaderInfoDialog ? (\n <HeaderInfoDialog\n dialogTitle={t('dialog.registry-info.title')}\n isOpen={isInfoDialogOpen}\n onCloseDialog={() => setOpenInfoDialog(false)}\n />\n ) : null}\n </NavBar>\n {showMobileNavBar && (\n <MobileNavBar data-testid=\"mobile-nav-bar\">\n <InnerMobileNavBar>\n <Search />\n </InnerMobileNavBar>\n <Button color=\"inherit\" onClick={() => setShowMobileNavBar(false)}>\n {t('button.cancel')}\n </Button>\n </MobileNavBar>\n )}\n {!userState?.username && (\n <LoginDialog onClose={() => setShowLoginModal(false)} open={showLoginModal} />\n )}\n </>\n );\n};\n\nexport default Header;\n"],"mappings":"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"}
1
+ {"version":3,"file":"Header.js","names":[],"sources":["../../../src/sections/Header/Header.tsx"],"sourcesContent":["import Button from '@mui/material/Button';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { LoginDialog, Search, useAuth, useConfig } from '../../';\nimport { isTokenExpire } from '../../utils/token';\nimport HeaderLeft from './HeaderLeft';\nimport HeaderRight from './HeaderRight';\nimport HeaderSettingsDialog from './HeaderSettingsDialog';\nimport { InnerMobileNavBar, InnerNavBar, MobileNavBar, NavBar } from './styles';\n\ntype Props = {\n HeaderInfoDialog?: React.FC<any>;\n isPlainHeader?: boolean;\n tokenCheckIntervalMs?: number;\n};\n\n// Session timeout default is 1 hour\nconst Header: React.FC<Props> = ({\n HeaderInfoDialog,\n isPlainHeader,\n tokenCheckIntervalMs = 60 * 60 * 1000,\n}) => {\n const { t } = useTranslation();\n const [isInfoDialogOpen, setOpenInfoDialog] = useState<boolean>(false);\n const [isSettingsDialogOpen, setSettingsDialogOpen] = useState<boolean>(false);\n const [showMobileNavBar, setShowMobileNavBar] = useState<boolean>(false);\n const [showLoginModal, setShowLoginModal] = useState<boolean>(false);\n const { configOptions } = useConfig();\n const { userState, logOutUser } = useAuth();\n\n // Use refs to always have the latest token/logout in the interval callback\n const tokenRef = useRef(userState?.token);\n const logOutUserRef = useRef(logOutUser);\n useEffect(() => {\n tokenRef.current = userState?.token;\n }, [userState?.token]);\n useEffect(() => {\n logOutUserRef.current = logOutUser;\n }, [logOutUser]);\n\n useEffect(() => {\n function checkToken() {\n const token = tokenRef.current;\n if (token && isTokenExpire(token)) {\n logOutUserRef.current?.();\n }\n }\n checkToken();\n const interval = setInterval(checkToken, tokenCheckIntervalMs);\n return () => clearInterval(interval);\n }, [tokenCheckIntervalMs]);\n\n const handleLogout = () => {\n logOutUser?.();\n setShowLoginModal(false);\n };\n if (isPlainHeader) {\n return (\n <NavBar data-testid=\"header\" position=\"static\">\n <InnerNavBar data-testid=\"inner-nav-bar\">\n <HeaderLeft showSearch={false} />\n <HeaderRight\n hasLogin={false}\n onLogout={() => {}}\n onOpenRegistryInfoDialog={() => {}}\n onOpenSettingsDialog={() => {}}\n onToggleLogin={() => {}}\n onToggleMobileNav={() => {}}\n showInfo={false}\n showSearch={false}\n showSettings={false}\n showThemeSwitch={false}\n username={''}\n />\n </InnerNavBar>\n </NavBar>\n );\n }\n\n return (\n <>\n <NavBar data-testid=\"header\" position=\"static\">\n <InnerNavBar data-testid=\"inner-nav-bar\">\n <HeaderLeft showSearch={configOptions.showSearch} />\n <HeaderRight\n hasLogin={configOptions?.login}\n onLogout={handleLogout}\n onOpenRegistryInfoDialog={() => setOpenInfoDialog(true)}\n onOpenSettingsDialog={() => setSettingsDialogOpen(true)}\n onToggleLogin={() => setShowLoginModal(!showLoginModal)}\n onToggleMobileNav={() => setShowMobileNavBar(!showMobileNavBar)}\n showInfo={configOptions.showInfo}\n showSearch={configOptions.showSearch}\n showSettings={configOptions.showSettings}\n showThemeSwitch={configOptions.showThemeSwitch}\n username={userState?.username}\n />\n </InnerNavBar>\n <HeaderSettingsDialog\n isOpen={isSettingsDialogOpen}\n onCloseDialog={() => setSettingsDialogOpen(false)}\n />\n {HeaderInfoDialog ? (\n <HeaderInfoDialog\n dialogTitle={t('dialog.registry-info.title')}\n isOpen={isInfoDialogOpen}\n onCloseDialog={() => setOpenInfoDialog(false)}\n />\n ) : null}\n </NavBar>\n {showMobileNavBar && (\n <MobileNavBar data-testid=\"mobile-nav-bar\">\n <InnerMobileNavBar>\n <Search />\n </InnerMobileNavBar>\n <Button color=\"inherit\" onClick={() => setShowMobileNavBar(false)}>\n {t('button.cancel')}\n </Button>\n </MobileNavBar>\n )}\n {!userState?.username && (\n <LoginDialog onClose={() => setShowLoginModal(false)} open={showLoginModal} />\n )}\n </>\n );\n};\n\nexport default Header;\n"],"mappings":";;;;;;;;;;;;;;;;;;AAkBA,IAAM,UAA2B,EAC/B,kBACA,eACA,uBAAuB,WACnB;CACJ,MAAM,EAAE,OAAA,GAAM,cAAA,eAAA,CAAe;CAC7B,MAAM,CAAC,kBAAkB,sBAAA,GAAqB,MAAA,SAAA,CAAkB,KAAK;CACrE,MAAM,CAAC,sBAAsB,0BAAA,GAAyB,MAAA,SAAA,CAAkB,KAAK;CAC7E,MAAM,CAAC,kBAAkB,wBAAA,GAAuB,MAAA,SAAA,CAAkB,KAAK;CACvE,MAAM,CAAC,gBAAgB,sBAAA,GAAqB,MAAA,SAAA,CAAkB,KAAK;CACnE,MAAM,EAAE,kBAAkB,iCAAA,UAAU;CACpC,MAAM,EAAE,WAAW,eAAe,qBAAA,QAAQ;CAG1C,MAAM,YAAA,GAAW,MAAA,OAAA,CAAO,WAAW,KAAK;CACxC,MAAM,iBAAA,GAAgB,MAAA,OAAA,CAAO,UAAU;CACvC,CAAA,GAAA,MAAA,UAAA,OAAgB;EACd,SAAS,UAAU,WAAW;CAChC,GAAG,CAAC,WAAW,KAAK,CAAC;CACrB,CAAA,GAAA,MAAA,UAAA,OAAgB;EACd,cAAc,UAAU;CAC1B,GAAG,CAAC,UAAU,CAAC;CAEf,CAAA,GAAA,MAAA,UAAA,OAAgB;EACd,SAAS,aAAa;GACpB,MAAM,QAAQ,SAAS;GACvB,IAAI,SAAS,cAAA,cAAc,KAAK,GAC9B,cAAc,UAAU;EAE5B;EACA,WAAW;EACX,MAAM,WAAW,YAAY,YAAY,oBAAoB;EAC7D,aAAa,cAAc,QAAQ;CACrC,GAAG,CAAC,oBAAoB,CAAC;CAEzB,MAAM,qBAAqB;EACzB,aAAa;EACb,kBAAkB,KAAK;CACzB;CACA,IAAI,eACF,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,eAAA,QAAD;EAAQ,eAAY;EAAS,UAAS;EACpC,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,eAAA,aAAD;GAAa,eAAY;GAAzB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,mBAAA,SAAD,EAAY,YAAY,MAAQ,CAAA,GAChC,iBAAA,GAAA,kBAAA,IAAA,CAAC,oBAAA,SAAD;IACE,UAAU;IACV,gBAAgB,CAAC;IACjB,gCAAgC,CAAC;IACjC,4BAA4B,CAAC;IAC7B,qBAAqB,CAAC;IACtB,yBAAyB,CAAC;IAC1B,UAAU;IACV,YAAY;IACZ,cAAc;IACd,iBAAiB;IACjB,UAAU;GACX,CAAA,CACU;;CACP,CAAA;CAIZ,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA;EACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,eAAA,QAAD;GAAQ,eAAY;GAAS,UAAS;GAAtC,UAAA;IACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,eAAA,aAAD;KAAa,eAAY;KAAzB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,mBAAA,SAAD,EAAY,YAAY,cAAc,WAAa,CAAA,GACnD,iBAAA,GAAA,kBAAA,IAAA,CAAC,oBAAA,SAAD;MACE,UAAU,eAAe;MACzB,UAAU;MACV,gCAAgC,kBAAkB,IAAI;MACtD,4BAA4B,sBAAsB,IAAI;MACtD,qBAAqB,kBAAkB,CAAC,cAAc;MACtD,yBAAyB,oBAAoB,CAAC,gBAAgB;MAC9D,UAAU,cAAc;MACxB,YAAY,cAAc;MAC1B,cAAc,cAAc;MAC5B,iBAAiB,cAAc;MAC/B,UAAU,WAAW;KACtB,CAAA,CACU;;IACb,iBAAA,GAAA,kBAAA,IAAA,CAAC,6BAAA,SAAD;KACE,QAAQ;KACR,qBAAqB,sBAAsB,KAAK;IACjD,CAAA;IACA,mBACC,iBAAA,GAAA,kBAAA,IAAA,CAAC,kBAAD;KACE,aAAa,EAAE,4BAA4B;KAC3C,QAAQ;KACR,qBAAqB,kBAAkB,KAAK;IAC7C,CAAA,IACC;GACE;;EACP,oBACC,iBAAA,GAAA,kBAAA,KAAA,CAAC,eAAA,cAAD;GAAc,eAAY;GAA1B,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,eAAA,mBAAD,EAAA,UACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,eAAA,SAAD,CAAS,CAAA,EACQ,CAAA,GACnB,iBAAA,GAAA,kBAAA,IAAA,CAAC,qBAAA,SAAD;IAAQ,OAAM;IAAU,eAAe,oBAAoB,KAAK;IAC7D,UAAA,EAAE,eAAe;GACZ,CAAA,CACI;;EAEf,CAAC,WAAW,YACX,iBAAA,GAAA,kBAAA,IAAA,CAAC,oBAAA,SAAD;GAAa,eAAe,kBAAkB,KAAK;GAAG,MAAM;EAAiB,CAAA;CAE/E,EAAA,CAAA;AAEN"}
@@ -22,13 +22,17 @@ var Header = ({ HeaderInfoDialog, isPlainHeader, tokenCheckIntervalMs = 36e5 })
22
22
  const { configOptions } = useConfig();
23
23
  const { userState, logOutUser } = useAuth();
24
24
  const tokenRef = useRef(userState?.token);
25
+ const logOutUserRef = useRef(logOutUser);
25
26
  useEffect(() => {
26
27
  tokenRef.current = userState?.token;
27
28
  }, [userState?.token]);
29
+ useEffect(() => {
30
+ logOutUserRef.current = logOutUser;
31
+ }, [logOutUser]);
28
32
  useEffect(() => {
29
33
  function checkToken() {
30
34
  const token = tokenRef.current;
31
- if (token && isTokenExpire(token)) logOutUser?.();
35
+ if (token && isTokenExpire(token)) logOutUserRef.current?.();
32
36
  }
33
37
  checkToken();
34
38
  const interval = setInterval(checkToken, tokenCheckIntervalMs);
@@ -1 +1 @@
1
- {"version":3,"file":"Header.mjs","names":[],"sources":["../../../src/sections/Header/Header.tsx"],"sourcesContent":["import Button from '@mui/material/Button';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { LoginDialog, Search, useAuth, useConfig } from '../../';\nimport { isTokenExpire } from '../../utils/token';\nimport HeaderLeft from './HeaderLeft';\nimport HeaderRight from './HeaderRight';\nimport HeaderSettingsDialog from './HeaderSettingsDialog';\nimport { InnerMobileNavBar, InnerNavBar, MobileNavBar, NavBar } from './styles';\n\ntype Props = {\n HeaderInfoDialog?: React.FC<any>;\n isPlainHeader?: boolean;\n tokenCheckIntervalMs?: number;\n};\n\n// Session timeout default is 1 hour\nconst Header: React.FC<Props> = ({\n HeaderInfoDialog,\n isPlainHeader,\n tokenCheckIntervalMs = 60 * 60 * 1000,\n}) => {\n const { t } = useTranslation();\n const [isInfoDialogOpen, setOpenInfoDialog] = useState<boolean>(false);\n const [isSettingsDialogOpen, setSettingsDialogOpen] = useState<boolean>(false);\n const [showMobileNavBar, setShowMobileNavBar] = useState<boolean>(false);\n const [showLoginModal, setShowLoginModal] = useState<boolean>(false);\n const { configOptions } = useConfig();\n const { userState, logOutUser } = useAuth();\n\n // Use a ref to always have the latest token in the interval callback\n const tokenRef = useRef(userState?.token);\n useEffect(() => {\n tokenRef.current = userState?.token;\n }, [userState?.token]);\n\n useEffect(() => {\n function checkToken() {\n const token = tokenRef.current;\n if (token && isTokenExpire(token)) {\n logOutUser?.();\n }\n }\n checkToken();\n const interval = setInterval(checkToken, tokenCheckIntervalMs);\n return () => clearInterval(interval);\n }, [tokenCheckIntervalMs]);\n\n const handleLogout = () => {\n logOutUser?.();\n setShowLoginModal(false);\n };\n if (isPlainHeader) {\n return (\n <NavBar data-testid=\"header\" position=\"static\">\n <InnerNavBar data-testid=\"inner-nav-bar\">\n <HeaderLeft showSearch={false} />\n <HeaderRight\n hasLogin={false}\n onLogout={() => {}}\n onOpenRegistryInfoDialog={() => {}}\n onOpenSettingsDialog={() => {}}\n onToggleLogin={() => {}}\n onToggleMobileNav={() => {}}\n showInfo={false}\n showSearch={false}\n showSettings={false}\n showThemeSwitch={false}\n username={''}\n />\n </InnerNavBar>\n </NavBar>\n );\n }\n\n return (\n <>\n <NavBar data-testid=\"header\" position=\"static\">\n <InnerNavBar data-testid=\"inner-nav-bar\">\n <HeaderLeft showSearch={configOptions.showSearch} />\n <HeaderRight\n hasLogin={configOptions?.login}\n onLogout={handleLogout}\n onOpenRegistryInfoDialog={() => setOpenInfoDialog(true)}\n onOpenSettingsDialog={() => setSettingsDialogOpen(true)}\n onToggleLogin={() => setShowLoginModal(!showLoginModal)}\n onToggleMobileNav={() => setShowMobileNavBar(!showMobileNavBar)}\n showInfo={configOptions.showInfo}\n showSearch={configOptions.showSearch}\n showSettings={configOptions.showSettings}\n showThemeSwitch={configOptions.showThemeSwitch}\n username={userState?.username}\n />\n </InnerNavBar>\n <HeaderSettingsDialog\n isOpen={isSettingsDialogOpen}\n onCloseDialog={() => setSettingsDialogOpen(false)}\n />\n {HeaderInfoDialog ? (\n <HeaderInfoDialog\n dialogTitle={t('dialog.registry-info.title')}\n isOpen={isInfoDialogOpen}\n onCloseDialog={() => setOpenInfoDialog(false)}\n />\n ) : null}\n </NavBar>\n {showMobileNavBar && (\n <MobileNavBar data-testid=\"mobile-nav-bar\">\n <InnerMobileNavBar>\n <Search />\n </InnerMobileNavBar>\n <Button color=\"inherit\" onClick={() => setShowMobileNavBar(false)}>\n {t('button.cancel')}\n </Button>\n </MobileNavBar>\n )}\n {!userState?.username && (\n <LoginDialog onClose={() => setShowLoginModal(false)} open={showLoginModal} />\n )}\n </>\n );\n};\n\nexport default Header;\n"],"mappings":";;;;;;;;;;;;;;;AAkBA,IAAM,UAA2B,EAC/B,kBACA,eACA,uBAAuB,WACnB;CACJ,MAAM,EAAE,MAAM,eAAe;CAC7B,MAAM,CAAC,kBAAkB,qBAAqB,SAAkB,KAAK;CACrE,MAAM,CAAC,sBAAsB,yBAAyB,SAAkB,KAAK;CAC7E,MAAM,CAAC,kBAAkB,uBAAuB,SAAkB,KAAK;CACvE,MAAM,CAAC,gBAAgB,qBAAqB,SAAkB,KAAK;CACnE,MAAM,EAAE,kBAAkB,UAAU;CACpC,MAAM,EAAE,WAAW,eAAe,QAAQ;CAG1C,MAAM,WAAW,OAAO,WAAW,KAAK;CACxC,gBAAgB;EACd,SAAS,UAAU,WAAW;CAChC,GAAG,CAAC,WAAW,KAAK,CAAC;CAErB,gBAAgB;EACd,SAAS,aAAa;GACpB,MAAM,QAAQ,SAAS;GACvB,IAAI,SAAS,cAAc,KAAK,GAC9B,aAAa;EAEjB;EACA,WAAW;EACX,MAAM,WAAW,YAAY,YAAY,oBAAoB;EAC7D,aAAa,cAAc,QAAQ;CACrC,GAAG,CAAC,oBAAoB,CAAC;CAEzB,MAAM,qBAAqB;EACzB,aAAa;EACb,kBAAkB,KAAK;CACzB;CACA,IAAI,eACF,OACE,oBAAC,QAAD;EAAQ,eAAY;EAAS,UAAS;EACpC,UAAA,qBAAC,aAAD;GAAa,eAAY;GAAzB,UAAA,CACE,oBAAC,YAAD,EAAY,YAAY,MAAQ,CAAA,GAChC,oBAAC,aAAD;IACE,UAAU;IACV,gBAAgB,CAAC;IACjB,gCAAgC,CAAC;IACjC,4BAA4B,CAAC;IAC7B,qBAAqB,CAAC;IACtB,yBAAyB,CAAC;IAC1B,UAAU;IACV,YAAY;IACZ,cAAc;IACd,iBAAiB;IACjB,UAAU;GACX,CAAA,CACU;;CACP,CAAA;CAIZ,OACE,qBAAA,YAAA,EAAA,UAAA;EACE,qBAAC,QAAD;GAAQ,eAAY;GAAS,UAAS;GAAtC,UAAA;IACE,qBAAC,aAAD;KAAa,eAAY;KAAzB,UAAA,CACE,oBAAC,YAAD,EAAY,YAAY,cAAc,WAAa,CAAA,GACnD,oBAAC,aAAD;MACE,UAAU,eAAe;MACzB,UAAU;MACV,gCAAgC,kBAAkB,IAAI;MACtD,4BAA4B,sBAAsB,IAAI;MACtD,qBAAqB,kBAAkB,CAAC,cAAc;MACtD,yBAAyB,oBAAoB,CAAC,gBAAgB;MAC9D,UAAU,cAAc;MACxB,YAAY,cAAc;MAC1B,cAAc,cAAc;MAC5B,iBAAiB,cAAc;MAC/B,UAAU,WAAW;KACtB,CAAA,CACU;;IACb,oBAAC,sBAAD;KACE,QAAQ;KACR,qBAAqB,sBAAsB,KAAK;IACjD,CAAA;IACA,mBACC,oBAAC,kBAAD;KACE,aAAa,EAAE,4BAA4B;KAC3C,QAAQ;KACR,qBAAqB,kBAAkB,KAAK;IAC7C,CAAA,IACC;GACE;;EACP,oBACC,qBAAC,cAAD;GAAc,eAAY;GAA1B,UAAA,CACE,oBAAC,mBAAD,EAAA,UACE,oBAAC,QAAD,CAAS,CAAA,EACQ,CAAA,GACnB,oBAAC,QAAD;IAAQ,OAAM;IAAU,eAAe,oBAAoB,KAAK;IAC7D,UAAA,EAAE,eAAe;GACZ,CAAA,CACI;;EAEf,CAAC,WAAW,YACX,oBAAC,aAAD;GAAa,eAAe,kBAAkB,KAAK;GAAG,MAAM;EAAiB,CAAA;CAE/E,EAAA,CAAA;AAEN"}
1
+ {"version":3,"file":"Header.mjs","names":[],"sources":["../../../src/sections/Header/Header.tsx"],"sourcesContent":["import Button from '@mui/material/Button';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { LoginDialog, Search, useAuth, useConfig } from '../../';\nimport { isTokenExpire } from '../../utils/token';\nimport HeaderLeft from './HeaderLeft';\nimport HeaderRight from './HeaderRight';\nimport HeaderSettingsDialog from './HeaderSettingsDialog';\nimport { InnerMobileNavBar, InnerNavBar, MobileNavBar, NavBar } from './styles';\n\ntype Props = {\n HeaderInfoDialog?: React.FC<any>;\n isPlainHeader?: boolean;\n tokenCheckIntervalMs?: number;\n};\n\n// Session timeout default is 1 hour\nconst Header: React.FC<Props> = ({\n HeaderInfoDialog,\n isPlainHeader,\n tokenCheckIntervalMs = 60 * 60 * 1000,\n}) => {\n const { t } = useTranslation();\n const [isInfoDialogOpen, setOpenInfoDialog] = useState<boolean>(false);\n const [isSettingsDialogOpen, setSettingsDialogOpen] = useState<boolean>(false);\n const [showMobileNavBar, setShowMobileNavBar] = useState<boolean>(false);\n const [showLoginModal, setShowLoginModal] = useState<boolean>(false);\n const { configOptions } = useConfig();\n const { userState, logOutUser } = useAuth();\n\n // Use refs to always have the latest token/logout in the interval callback\n const tokenRef = useRef(userState?.token);\n const logOutUserRef = useRef(logOutUser);\n useEffect(() => {\n tokenRef.current = userState?.token;\n }, [userState?.token]);\n useEffect(() => {\n logOutUserRef.current = logOutUser;\n }, [logOutUser]);\n\n useEffect(() => {\n function checkToken() {\n const token = tokenRef.current;\n if (token && isTokenExpire(token)) {\n logOutUserRef.current?.();\n }\n }\n checkToken();\n const interval = setInterval(checkToken, tokenCheckIntervalMs);\n return () => clearInterval(interval);\n }, [tokenCheckIntervalMs]);\n\n const handleLogout = () => {\n logOutUser?.();\n setShowLoginModal(false);\n };\n if (isPlainHeader) {\n return (\n <NavBar data-testid=\"header\" position=\"static\">\n <InnerNavBar data-testid=\"inner-nav-bar\">\n <HeaderLeft showSearch={false} />\n <HeaderRight\n hasLogin={false}\n onLogout={() => {}}\n onOpenRegistryInfoDialog={() => {}}\n onOpenSettingsDialog={() => {}}\n onToggleLogin={() => {}}\n onToggleMobileNav={() => {}}\n showInfo={false}\n showSearch={false}\n showSettings={false}\n showThemeSwitch={false}\n username={''}\n />\n </InnerNavBar>\n </NavBar>\n );\n }\n\n return (\n <>\n <NavBar data-testid=\"header\" position=\"static\">\n <InnerNavBar data-testid=\"inner-nav-bar\">\n <HeaderLeft showSearch={configOptions.showSearch} />\n <HeaderRight\n hasLogin={configOptions?.login}\n onLogout={handleLogout}\n onOpenRegistryInfoDialog={() => setOpenInfoDialog(true)}\n onOpenSettingsDialog={() => setSettingsDialogOpen(true)}\n onToggleLogin={() => setShowLoginModal(!showLoginModal)}\n onToggleMobileNav={() => setShowMobileNavBar(!showMobileNavBar)}\n showInfo={configOptions.showInfo}\n showSearch={configOptions.showSearch}\n showSettings={configOptions.showSettings}\n showThemeSwitch={configOptions.showThemeSwitch}\n username={userState?.username}\n />\n </InnerNavBar>\n <HeaderSettingsDialog\n isOpen={isSettingsDialogOpen}\n onCloseDialog={() => setSettingsDialogOpen(false)}\n />\n {HeaderInfoDialog ? (\n <HeaderInfoDialog\n dialogTitle={t('dialog.registry-info.title')}\n isOpen={isInfoDialogOpen}\n onCloseDialog={() => setOpenInfoDialog(false)}\n />\n ) : null}\n </NavBar>\n {showMobileNavBar && (\n <MobileNavBar data-testid=\"mobile-nav-bar\">\n <InnerMobileNavBar>\n <Search />\n </InnerMobileNavBar>\n <Button color=\"inherit\" onClick={() => setShowMobileNavBar(false)}>\n {t('button.cancel')}\n </Button>\n </MobileNavBar>\n )}\n {!userState?.username && (\n <LoginDialog onClose={() => setShowLoginModal(false)} open={showLoginModal} />\n )}\n </>\n );\n};\n\nexport default Header;\n"],"mappings":";;;;;;;;;;;;;;;AAkBA,IAAM,UAA2B,EAC/B,kBACA,eACA,uBAAuB,WACnB;CACJ,MAAM,EAAE,MAAM,eAAe;CAC7B,MAAM,CAAC,kBAAkB,qBAAqB,SAAkB,KAAK;CACrE,MAAM,CAAC,sBAAsB,yBAAyB,SAAkB,KAAK;CAC7E,MAAM,CAAC,kBAAkB,uBAAuB,SAAkB,KAAK;CACvE,MAAM,CAAC,gBAAgB,qBAAqB,SAAkB,KAAK;CACnE,MAAM,EAAE,kBAAkB,UAAU;CACpC,MAAM,EAAE,WAAW,eAAe,QAAQ;CAG1C,MAAM,WAAW,OAAO,WAAW,KAAK;CACxC,MAAM,gBAAgB,OAAO,UAAU;CACvC,gBAAgB;EACd,SAAS,UAAU,WAAW;CAChC,GAAG,CAAC,WAAW,KAAK,CAAC;CACrB,gBAAgB;EACd,cAAc,UAAU;CAC1B,GAAG,CAAC,UAAU,CAAC;CAEf,gBAAgB;EACd,SAAS,aAAa;GACpB,MAAM,QAAQ,SAAS;GACvB,IAAI,SAAS,cAAc,KAAK,GAC9B,cAAc,UAAU;EAE5B;EACA,WAAW;EACX,MAAM,WAAW,YAAY,YAAY,oBAAoB;EAC7D,aAAa,cAAc,QAAQ;CACrC,GAAG,CAAC,oBAAoB,CAAC;CAEzB,MAAM,qBAAqB;EACzB,aAAa;EACb,kBAAkB,KAAK;CACzB;CACA,IAAI,eACF,OACE,oBAAC,QAAD;EAAQ,eAAY;EAAS,UAAS;EACpC,UAAA,qBAAC,aAAD;GAAa,eAAY;GAAzB,UAAA,CACE,oBAAC,YAAD,EAAY,YAAY,MAAQ,CAAA,GAChC,oBAAC,aAAD;IACE,UAAU;IACV,gBAAgB,CAAC;IACjB,gCAAgC,CAAC;IACjC,4BAA4B,CAAC;IAC7B,qBAAqB,CAAC;IACtB,yBAAyB,CAAC;IAC1B,UAAU;IACV,YAAY;IACZ,cAAc;IACd,iBAAiB;IACjB,UAAU;GACX,CAAA,CACU;;CACP,CAAA;CAIZ,OACE,qBAAA,YAAA,EAAA,UAAA;EACE,qBAAC,QAAD;GAAQ,eAAY;GAAS,UAAS;GAAtC,UAAA;IACE,qBAAC,aAAD;KAAa,eAAY;KAAzB,UAAA,CACE,oBAAC,YAAD,EAAY,YAAY,cAAc,WAAa,CAAA,GACnD,oBAAC,aAAD;MACE,UAAU,eAAe;MACzB,UAAU;MACV,gCAAgC,kBAAkB,IAAI;MACtD,4BAA4B,sBAAsB,IAAI;MACtD,qBAAqB,kBAAkB,CAAC,cAAc;MACtD,yBAAyB,oBAAoB,CAAC,gBAAgB;MAC9D,UAAU,cAAc;MACxB,YAAY,cAAc;MAC1B,cAAc,cAAc;MAC5B,iBAAiB,cAAc;MAC/B,UAAU,WAAW;KACtB,CAAA,CACU;;IACb,oBAAC,sBAAD;KACE,QAAQ;KACR,qBAAqB,sBAAsB,KAAK;IACjD,CAAA;IACA,mBACC,oBAAC,kBAAD;KACE,aAAa,EAAE,4BAA4B;KAC3C,QAAQ;KACR,qBAAqB,kBAAkB,KAAK;IAC7C,CAAA,IACC;GACE;;EACP,oBACC,qBAAC,cAAD;GAAc,eAAY;GAA1B,UAAA,CACE,oBAAC,mBAAD,EAAA,UACE,oBAAC,QAAD,CAAS,CAAA,EACQ,CAAA,GACnB,oBAAC,QAAD;IAAQ,OAAM;IAAU,eAAe,oBAAoB,KAAK;IAC7D,UAAA,EAAE,eAAe;GACZ,CAAA,CACI;;EAEf,CAAC,WAAW,YACX,oBAAC,aAAD;GAAa,eAAe,kBAAkB,KAAK;GAAG,MAAM;EAAiB,CAAA;CAE/E,EAAA,CAAA;AAEN"}
@@ -38,13 +38,13 @@ var Login = () => {
38
38
  mode: "onChange",
39
39
  resolver: (0, _hookform_resolvers_yup.yupResolver)(require_schemas.loginSchema)
40
40
  });
41
- const handleLogin = async (body) => {
41
+ const handleLogin = (0, react.useCallback)(async (body) => {
42
42
  try {
43
43
  return await trigger(body);
44
44
  } catch (err) {
45
45
  throw require_utils$1.normalizeAuthError(err);
46
46
  }
47
- };
47
+ }, [trigger]);
48
48
  const onSuccess = (0, react.useCallback)(() => {
49
49
  navigate(`${require_routes.Route.SUCCESS}?messageType=${require_Success.MessageType.Login}`);
50
50
  }, [navigate]);
@@ -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 } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { 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 type { LoginBody } from '../../providers/AuthProvider/types';\nimport { normalizeAuthError } 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 { 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, errors },\n } = form;\n\n const handleLogin = async (body: { username: string; password: string }) => {\n try {\n return await trigger(body);\n } catch (err) {\n throw normalizeAuthError(err);\n }\n };\n\n const onSuccess = useCallback(() => {\n navigate(`${Route.SUCCESS}?messageType=${MessageType.Login}`);\n }, [navigate]);\n\n const onSubmit = useCallback(\n async (data: LoginFormValues) => {\n try {\n const result = await handleLogin?.(data);\n if (result && result.username && result.token) {\n saveAuth(result.username, result.token);\n }\n onSuccess();\n } catch {\n setError('root', {\n type: 'server',\n // TODO: add translation key\n message: 'Invalid username or password',\n });\n }\n },\n [handleLogin, setError, onSuccess]\n );\n\n return !next ? (\n <NotFound />\n ) : (\n <SecurityLayout>\n <SecurityContainer>\n <SecurityForm>\n <LoginFormHeader />\n <LoginForm\n errors={errors}\n handleSubmit={handleSubmit}\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 href={addUserLink} sx={{ ml: 1 }}>\n {t('security.login.createUser')}\n </Link>\n </Typography>\n )}\n </SecurityForm>\n </SecurityContainer>\n </SecurityLayout>\n );\n};\n\nexport default Login;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAwBA,IAAM,gBAAgB,sBAAA,iBAAiB;AACvC,IAAM,WAAW,cAAA,mBAAmB,cAAc,IAAI;AAEtD,IAAM,cAAwB;CAC5B,MAAM,EAAE,OAAA,GAAM,cAAA,eAAA,CAAe;CAC7B,MAAM,YAAA,GAAW,aAAA,YAAA,CAAY;CAC7B,MAAM,YAAA,GAAW,aAAA,YAAA,CAAY;CAC7B,MAAM,EAAE,SAAS,gBAAA,qBAAqB,QAAQ;CAC9C,MAAM,oBAAoB,eAAe,OAAO;CAChD,MAAM,cAAc,eAAA,MAAM,YAAY,OAAO,WAAW,OAAO;CAE/D,MAAM,EAAE,YAAY,0BAAA,gBAA2B,UAAU,MAAM,MAAM;CAOrE,MAAM,EACJ,UACA,cACA,UACA,WAAW,EAAE,SAAS,cAAA,GATX,gBAAA,QAAA,CAAyB;EACpC,MAAM;EACN,WAAA,GAAU,wBAAA,YAAA,CAAY,gBAAA,WAAW;CACnC,CAOI;CAEJ,MAAM,cAAc,OAAO,SAAiD;EAC1E,IAAI;GACF,OAAO,MAAM,QAAQ,IAAI;EAC3B,SAAS,KAAK;GACZ,MAAM,gBAAA,mBAAmB,GAAG;EAC9B;CACF;CAEA,MAAM,aAAA,GAAY,MAAA,YAAA,OAAkB;EAClC,SAAS,GAAG,eAAA,MAAM,QAAQ,eAAe,gBAAA,YAAY,OAAO;CAC9D,GAAG,CAAC,QAAQ,CAAC;CAEb,MAAM,YAAA,GAAW,MAAA,YAAA,CACf,OAAO,SAA0B;EAC/B,IAAI;GACF,MAAM,SAAS,MAAM,cAAc,IAAI;GACvC,IAAI,UAAU,OAAO,YAAY,OAAO,OACtC,gBAAA,SAAS,OAAO,UAAU,OAAO,KAAK;GAExC,UAAU;EACZ,QAAQ;GACN,SAAS,QAAQ;IACf,MAAM;IAEN,SAAS;GACX,CAAC;EACH;CACF,GACA;EAAC;EAAa;EAAU;CAAS,CACnC;CAEA,OAAO,CAAC,OACN,iBAAA,GAAA,kBAAA,IAAA,CAAC,iBAAA,SAAD,CAAW,CAAA,IAEX,iBAAA,GAAA,kBAAA,IAAA,CAAC,eAAA,SAAD,EAAA,UACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,iBAAA,mBAAD,EAAA,UACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,iBAAA,cAAD,EAAA,UAAA;EACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,eAAA,SAAD,CAAkB,CAAA;EAClB,iBAAA,GAAA,kBAAA,IAAA,CAAC,cAAA,SAAD;GACU;GACM;GACL;GACC;GACA;EACX,CAAA;EACA,qBACC,iBAAA,GAAA,kBAAA,KAAA,CAAC,cAAA,YAAD;GAAY,OAAM;GAAS,IAAI;IAAE,IAAI;IAAG,UAAU;GAAG;GAAG,SAAQ;GAAhE,UAAA,CACG,EAAE,+BAA+B,GAClC,iBAAA,GAAA,kBAAA,IAAA,CAAC,cAAA,MAAD;IAAM,MAAM;IAAa,IAAI,EAAE,IAAI,EAAE;IAClC,UAAA,EAAE,2BAA2B;GAC1B,CAAA,CACI;;CAEF,EAAA,CAAA,EACG,CAAA,EACL,CAAA;AAEpB"}
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 } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { 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 type { LoginBody } from '../../providers/AuthProvider/types';\nimport { normalizeAuthError } 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 { 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, errors },\n } = form;\n\n const handleLogin = useCallback(\n async (body: { username: string; password: string }) => {\n try {\n return await trigger(body);\n } catch (err) {\n throw normalizeAuthError(err);\n }\n },\n [trigger]\n );\n\n const onSuccess = useCallback(() => {\n navigate(`${Route.SUCCESS}?messageType=${MessageType.Login}`);\n }, [navigate]);\n\n const onSubmit = useCallback(\n async (data: LoginFormValues) => {\n try {\n const result = await handleLogin?.(data);\n if (result && result.username && result.token) {\n saveAuth(result.username, result.token);\n }\n onSuccess();\n } catch {\n setError('root', {\n type: 'server',\n // TODO: add translation key\n message: 'Invalid username or password',\n });\n }\n },\n [handleLogin, setError, onSuccess]\n );\n\n return !next ? (\n <NotFound />\n ) : (\n <SecurityLayout>\n <SecurityContainer>\n <SecurityForm>\n <LoginFormHeader />\n <LoginForm\n errors={errors}\n handleSubmit={handleSubmit}\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 href={addUserLink} sx={{ ml: 1 }}>\n {t('security.login.createUser')}\n </Link>\n </Typography>\n )}\n </SecurityForm>\n </SecurityContainer>\n </SecurityLayout>\n );\n};\n\nexport default Login;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAwBA,IAAM,gBAAgB,sBAAA,iBAAiB;AACvC,IAAM,WAAW,cAAA,mBAAmB,cAAc,IAAI;AAEtD,IAAM,cAAwB;CAC5B,MAAM,EAAE,OAAA,GAAM,cAAA,eAAA,CAAe;CAC7B,MAAM,YAAA,GAAW,aAAA,YAAA,CAAY;CAC7B,MAAM,YAAA,GAAW,aAAA,YAAA,CAAY;CAC7B,MAAM,EAAE,SAAS,gBAAA,qBAAqB,QAAQ;CAC9C,MAAM,oBAAoB,eAAe,OAAO;CAChD,MAAM,cAAc,eAAA,MAAM,YAAY,OAAO,WAAW,OAAO;CAE/D,MAAM,EAAE,YAAY,0BAAA,gBAA2B,UAAU,MAAM,MAAM;CAOrE,MAAM,EACJ,UACA,cACA,UACA,WAAW,EAAE,SAAS,cAAA,GATX,gBAAA,QAAA,CAAyB;EACpC,MAAM;EACN,WAAA,GAAU,wBAAA,YAAA,CAAY,gBAAA,WAAW;CACnC,CAOI;CAEJ,MAAM,eAAA,GAAc,MAAA,YAAA,CAClB,OAAO,SAAiD;EACtD,IAAI;GACF,OAAO,MAAM,QAAQ,IAAI;EAC3B,SAAS,KAAK;GACZ,MAAM,gBAAA,mBAAmB,GAAG;EAC9B;CACF,GACA,CAAC,OAAO,CACV;CAEA,MAAM,aAAA,GAAY,MAAA,YAAA,OAAkB;EAClC,SAAS,GAAG,eAAA,MAAM,QAAQ,eAAe,gBAAA,YAAY,OAAO;CAC9D,GAAG,CAAC,QAAQ,CAAC;CAEb,MAAM,YAAA,GAAW,MAAA,YAAA,CACf,OAAO,SAA0B;EAC/B,IAAI;GACF,MAAM,SAAS,MAAM,cAAc,IAAI;GACvC,IAAI,UAAU,OAAO,YAAY,OAAO,OACtC,gBAAA,SAAS,OAAO,UAAU,OAAO,KAAK;GAExC,UAAU;EACZ,QAAQ;GACN,SAAS,QAAQ;IACf,MAAM;IAEN,SAAS;GACX,CAAC;EACH;CACF,GACA;EAAC;EAAa;EAAU;CAAS,CACnC;CAEA,OAAO,CAAC,OACN,iBAAA,GAAA,kBAAA,IAAA,CAAC,iBAAA,SAAD,CAAW,CAAA,IAEX,iBAAA,GAAA,kBAAA,IAAA,CAAC,eAAA,SAAD,EAAA,UACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,iBAAA,mBAAD,EAAA,UACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,iBAAA,cAAD,EAAA,UAAA;EACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,eAAA,SAAD,CAAkB,CAAA;EAClB,iBAAA,GAAA,kBAAA,IAAA,CAAC,cAAA,SAAD;GACU;GACM;GACL;GACC;GACA;EACX,CAAA;EACA,qBACC,iBAAA,GAAA,kBAAA,KAAA,CAAC,cAAA,YAAD;GAAY,OAAM;GAAS,IAAI;IAAE,IAAI;IAAG,UAAU;GAAG;GAAG,SAAQ;GAAhE,UAAA,CACG,EAAE,+BAA+B,GAClC,iBAAA,GAAA,kBAAA,IAAA,CAAC,cAAA,MAAD;IAAM,MAAM;IAAa,IAAI,EAAE,IAAI,EAAE;IAClC,UAAA,EAAE,2BAA2B;GAC1B,CAAA,CACI;;CAEF,EAAA,CAAA,EACG,CAAA,EACL,CAAA;AAEpB"}
@@ -36,13 +36,13 @@ var Login = () => {
36
36
  mode: "onChange",
37
37
  resolver: yupResolver(loginSchema)
38
38
  });
39
- const handleLogin = async (body) => {
39
+ const handleLogin = useCallback(async (body) => {
40
40
  try {
41
41
  return await trigger(body);
42
42
  } catch (err) {
43
43
  throw normalizeAuthError(err);
44
44
  }
45
- };
45
+ }, [trigger]);
46
46
  const onSuccess = useCallback(() => {
47
47
  navigate(`${Route$1.SUCCESS}?messageType=${MessageType.Login}`);
48
48
  }, [navigate]);
@@ -1 +1 @@
1
- {"version":3,"file":"Login.mjs","names":[],"sources":["../../../src/sections/Security/Login.tsx"],"sourcesContent":["import { yupResolver } from '@hookform/resolvers/yup';\nimport { Link, Typography } from '@mui/material';\nimport React, { useCallback } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { 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 type { LoginBody } from '../../providers/AuthProvider/types';\nimport { normalizeAuthError } 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 { 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, errors },\n } = form;\n\n const handleLogin = async (body: { username: string; password: string }) => {\n try {\n return await trigger(body);\n } catch (err) {\n throw normalizeAuthError(err);\n }\n };\n\n const onSuccess = useCallback(() => {\n navigate(`${Route.SUCCESS}?messageType=${MessageType.Login}`);\n }, [navigate]);\n\n const onSubmit = useCallback(\n async (data: LoginFormValues) => {\n try {\n const result = await handleLogin?.(data);\n if (result && result.username && result.token) {\n saveAuth(result.username, result.token);\n }\n onSuccess();\n } catch {\n setError('root', {\n type: 'server',\n // TODO: add translation key\n message: 'Invalid username or password',\n });\n }\n },\n [handleLogin, setError, onSuccess]\n );\n\n return !next ? (\n <NotFound />\n ) : (\n <SecurityLayout>\n <SecurityContainer>\n <SecurityForm>\n <LoginFormHeader />\n <LoginForm\n errors={errors}\n handleSubmit={handleSubmit}\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 href={addUserLink} sx={{ ml: 1 }}>\n {t('security.login.createUser')}\n </Link>\n </Typography>\n )}\n </SecurityForm>\n </SecurityContainer>\n </SecurityLayout>\n );\n};\n\nexport default Login;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAwBA,IAAM,gBAAgB,iBAAiB;AACvC,IAAM,WAAW,mBAAmB,cAAc,IAAI;AAEtD,IAAM,cAAwB;CAC5B,MAAM,EAAE,MAAM,eAAe;CAC7B,MAAM,WAAW,YAAY;CAC7B,MAAM,WAAW,YAAY;CAC7B,MAAM,EAAE,SAAS,qBAAqB,QAAQ;CAC9C,MAAM,oBAAoB,eAAe,OAAO;CAChD,MAAM,cAAc,QAAM,YAAY,OAAO,WAAW,OAAO;CAE/D,MAAM,EAAE,YAAY,gBAA2B,UAAU,MAAM,MAAM;CAOrE,MAAM,EACJ,UACA,cACA,UACA,WAAW,EAAE,SAAS,aATX,QAAyB;EACpC,MAAM;EACN,UAAU,YAAY,WAAW;CACnC,CAOI;CAEJ,MAAM,cAAc,OAAO,SAAiD;EAC1E,IAAI;GACF,OAAO,MAAM,QAAQ,IAAI;EAC3B,SAAS,KAAK;GACZ,MAAM,mBAAmB,GAAG;EAC9B;CACF;CAEA,MAAM,YAAY,kBAAkB;EAClC,SAAS,GAAG,QAAM,QAAQ,eAAe,YAAY,OAAO;CAC9D,GAAG,CAAC,QAAQ,CAAC;CAEb,MAAM,WAAW,YACf,OAAO,SAA0B;EAC/B,IAAI;GACF,MAAM,SAAS,MAAM,cAAc,IAAI;GACvC,IAAI,UAAU,OAAO,YAAY,OAAO,OACtC,SAAS,OAAO,UAAU,OAAO,KAAK;GAExC,UAAU;EACZ,QAAQ;GACN,SAAS,QAAQ;IACf,MAAM;IAEN,SAAS;GACX,CAAC;EACH;CACF,GACA;EAAC;EAAa;EAAU;CAAS,CACnC;CAEA,OAAO,CAAC,OACN,oBAAC,UAAD,CAAW,CAAA,IAEX,oBAAC,gBAAD,EAAA,UACE,oBAAC,mBAAD,EAAA,UACE,qBAAC,cAAD,EAAA,UAAA;EACE,oBAAC,iBAAD,CAAkB,CAAA;EAClB,oBAAC,WAAD;GACU;GACM;GACL;GACC;GACA;EACX,CAAA;EACA,qBACC,qBAAC,YAAD;GAAY,OAAM;GAAS,IAAI;IAAE,IAAI;IAAG,UAAU;GAAG;GAAG,SAAQ;GAAhE,UAAA,CACG,EAAE,+BAA+B,GAClC,oBAAC,QAAD;IAAM,MAAM;IAAa,IAAI,EAAE,IAAI,EAAE;IAClC,UAAA,EAAE,2BAA2B;GAC1B,CAAA,CACI;;CAEF,EAAA,CAAA,EACG,CAAA,EACL,CAAA;AAEpB"}
1
+ {"version":3,"file":"Login.mjs","names":[],"sources":["../../../src/sections/Security/Login.tsx"],"sourcesContent":["import { yupResolver } from '@hookform/resolvers/yup';\nimport { Link, Typography } from '@mui/material';\nimport React, { useCallback } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { 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 type { LoginBody } from '../../providers/AuthProvider/types';\nimport { normalizeAuthError } 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 { 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, errors },\n } = form;\n\n const handleLogin = useCallback(\n async (body: { username: string; password: string }) => {\n try {\n return await trigger(body);\n } catch (err) {\n throw normalizeAuthError(err);\n }\n },\n [trigger]\n );\n\n const onSuccess = useCallback(() => {\n navigate(`${Route.SUCCESS}?messageType=${MessageType.Login}`);\n }, [navigate]);\n\n const onSubmit = useCallback(\n async (data: LoginFormValues) => {\n try {\n const result = await handleLogin?.(data);\n if (result && result.username && result.token) {\n saveAuth(result.username, result.token);\n }\n onSuccess();\n } catch {\n setError('root', {\n type: 'server',\n // TODO: add translation key\n message: 'Invalid username or password',\n });\n }\n },\n [handleLogin, setError, onSuccess]\n );\n\n return !next ? (\n <NotFound />\n ) : (\n <SecurityLayout>\n <SecurityContainer>\n <SecurityForm>\n <LoginFormHeader />\n <LoginForm\n errors={errors}\n handleSubmit={handleSubmit}\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 href={addUserLink} sx={{ ml: 1 }}>\n {t('security.login.createUser')}\n </Link>\n </Typography>\n )}\n </SecurityForm>\n </SecurityContainer>\n </SecurityLayout>\n );\n};\n\nexport default Login;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAwBA,IAAM,gBAAgB,iBAAiB;AACvC,IAAM,WAAW,mBAAmB,cAAc,IAAI;AAEtD,IAAM,cAAwB;CAC5B,MAAM,EAAE,MAAM,eAAe;CAC7B,MAAM,WAAW,YAAY;CAC7B,MAAM,WAAW,YAAY;CAC7B,MAAM,EAAE,SAAS,qBAAqB,QAAQ;CAC9C,MAAM,oBAAoB,eAAe,OAAO;CAChD,MAAM,cAAc,QAAM,YAAY,OAAO,WAAW,OAAO;CAE/D,MAAM,EAAE,YAAY,gBAA2B,UAAU,MAAM,MAAM;CAOrE,MAAM,EACJ,UACA,cACA,UACA,WAAW,EAAE,SAAS,aATX,QAAyB;EACpC,MAAM;EACN,UAAU,YAAY,WAAW;CACnC,CAOI;CAEJ,MAAM,cAAc,YAClB,OAAO,SAAiD;EACtD,IAAI;GACF,OAAO,MAAM,QAAQ,IAAI;EAC3B,SAAS,KAAK;GACZ,MAAM,mBAAmB,GAAG;EAC9B;CACF,GACA,CAAC,OAAO,CACV;CAEA,MAAM,YAAY,kBAAkB;EAClC,SAAS,GAAG,QAAM,QAAQ,eAAe,YAAY,OAAO;CAC9D,GAAG,CAAC,QAAQ,CAAC;CAEb,MAAM,WAAW,YACf,OAAO,SAA0B;EAC/B,IAAI;GACF,MAAM,SAAS,MAAM,cAAc,IAAI;GACvC,IAAI,UAAU,OAAO,YAAY,OAAO,OACtC,SAAS,OAAO,UAAU,OAAO,KAAK;GAExC,UAAU;EACZ,QAAQ;GACN,SAAS,QAAQ;IACf,MAAM;IAEN,SAAS;GACX,CAAC;EACH;CACF,GACA;EAAC;EAAa;EAAU;CAAS,CACnC;CAEA,OAAO,CAAC,OACN,oBAAC,UAAD,CAAW,CAAA,IAEX,oBAAC,gBAAD,EAAA,UACE,oBAAC,mBAAD,EAAA,UACE,qBAAC,cAAD,EAAA,UAAA;EACE,oBAAC,iBAAD,CAAkB,CAAA;EAClB,oBAAC,WAAD;GACU;GACM;GACL;GACC;GACA;EACX,CAAA;EACA,qBACC,qBAAC,YAAD;GAAY,OAAM;GAAS,IAAI;IAAE,IAAI;IAAG,UAAU;GAAG;GAAG,SAAQ;GAAhE,UAAA,CACG,EAAE,+BAA+B,GAClC,oBAAC,QAAD;IAAM,MAAM;IAAa,IAAI,EAAE,IAAI,EAAE;IAClC,UAAA,EAAE,2BAA2B;GAC1B,CAAA,CACI;;CAEF,EAAA,CAAA,EACG,CAAA,EACL,CAAA;AAEpB"}
@@ -1447,8 +1447,8 @@
1447
1447
  margin: 0 .2em .25em -1.4em;
1448
1448
  }
1449
1449
 
1450
- .markdown-body ul:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)) .task-list-item-checkbox,
1451
- .markdown-body ol:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)) .task-list-item-checkbox {
1450
+ .markdown-body ul:dir(rtl) .task-list-item-checkbox,
1451
+ .markdown-body ol:dir(rtl) .task-list-item-checkbox {
1452
1452
  margin: 0 -1.6em .25em .2em;
1453
1453
  }
1454
1454
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@verdaccio/ui-components",
3
- "version": "5.0.0-next-9.17",
3
+ "version": "5.0.0-next-9.19",
4
4
  "description": "Verdaccio UI Components",
5
5
  "author": "Juan Picado <juanpicado19@gmail.com>",
6
6
  "license": "MIT",
@@ -36,33 +36,33 @@
36
36
  "dependencies": {
37
37
  "@emotion/react": "11.14.0",
38
38
  "@emotion/styled": "11.14.1",
39
- "@hookform/resolvers": "5.4.0",
40
- "@microlink/react-json-view": "1.31.22",
39
+ "@hookform/resolvers": "5.9.1",
40
+ "@microlink/react-json-view": "1.31.28",
41
41
  "@mui/icons-material": "7.3.11",
42
42
  "@mui/material": "7.3.11",
43
43
  "@mui/system": "7.3.11",
44
44
  "@verdaccio/ui-i18n": "10.0.0-next-9.4",
45
45
  "country-flag-icons": "1.6.20",
46
- "dayjs": "1.11.21",
46
+ "dayjs": "1.11.23",
47
47
  "debug": "4.4.3",
48
- "dompurify": "3.4.13",
49
- "highlight.js": "11.11.1",
48
+ "dompurify": "3.4.14",
49
+ "highlight.js": "11.12.0",
50
50
  "i18next": "25.10.10",
51
- "js-base64": "3.8.0",
51
+ "js-base64": "3.9.3",
52
52
  "localstorage-memory": "1.0.3",
53
53
  "lodash-es": "4.18.1",
54
54
  "marked": "17.0.6",
55
55
  "marked-highlight": "2.2.4",
56
56
  "normalize.css": "8.0.1",
57
- "react": "19.2.7",
58
- "react-dom": "19.2.7",
59
- "react-hook-form": "7.81.0",
57
+ "react": "19.2.8",
58
+ "react-dom": "19.2.8",
59
+ "react-hook-form": "7.85.0",
60
60
  "react-i18next": "16.6.6",
61
61
  "react-markdown": "10.1.0",
62
62
  "react-router": "8.3.0",
63
63
  "react-virtualized": "9.22.6",
64
64
  "semver": "7.8.5",
65
- "swr": "2.4.2",
65
+ "swr": "2.5.1",
66
66
  "validator": "13.15.35",
67
67
  "yup": "1.7.1"
68
68
  },
@@ -76,7 +76,7 @@
76
76
  "@types/lodash-es": "4.17.12",
77
77
  "@types/node": "24.13.2",
78
78
  "@verdaccio/types": "14.0.0-next-9.12",
79
- "@vitejs/plugin-react": "6.0.3",
79
+ "@vitejs/plugin-react": "6.0.5",
80
80
  "cross-env": "10.1.0",
81
81
  "generate-github-markdown-css": "6.6.0",
82
82
  "jsdom": "29.1.1",