@verdaccio/ui-components 5.0.0-next-9.9 → 5.0.0-next-9.10

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.
@@ -15,7 +15,7 @@ import List from "@mui/material/List";
15
15
  import Avatar from "@mui/material/Avatar";
16
16
  import Typography from "@mui/material/Typography";
17
17
  import ListItem from "@mui/material/ListItem";
18
- import MuiListItemText from "@mui/material/ListItemText";
18
+ import ListItemText from "@mui/material/ListItemText";
19
19
  //#region src/components/Repository/Repository.tsx
20
20
  var StyledText = styled(Typography)((props) => ({
21
21
  fontWeight: props.theme.fontWeight.bold,
@@ -25,7 +25,7 @@ var RepositoryListItem = styled(ListItem)({
25
25
  padding: 0,
26
26
  ":hover": { backgroundColor: "transparent" }
27
27
  });
28
- var RepositoryListItemText = styled(MuiListItemText)({
28
+ var RepositoryListItemText = styled(ListItemText)({
29
29
  padding: "0 0 0 10px",
30
30
  margin: 0
31
31
  });
@@ -1 +1 @@
1
- {"version":3,"file":"Repository.mjs","names":[],"sources":["../../../src/components/Repository/Repository.tsx"],"sourcesContent":["import styled from '@emotion/styled';\nimport Avatar from '@mui/material/Avatar';\nimport List from '@mui/material/List';\nimport ListItem from '@mui/material/ListItem';\nimport ListItemText from '@mui/material/ListItemText';\nimport Typography from '@mui/material/Typography';\nimport { common } from '@mui/material/colors';\nimport React from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport type { Theme } from '../../Theme';\nimport { url as urlUtils } from '../../utils';\nimport CopyClipboard from '../CopyClipboard';\nimport { Git } from '../Icons';\nimport LinkExternal from '../LinkExternal';\n\nconst StyledText = styled(Typography)<{ theme?: Theme }>((props) => ({\n fontWeight: props.theme.fontWeight.bold,\n textTransform: 'capitalize',\n}));\n\nconst RepositoryListItem = styled(ListItem)({\n padding: 0,\n ':hover': {\n backgroundColor: 'transparent',\n },\n});\n\nconst RepositoryListItemText = styled(ListItemText)({\n padding: '0 0 0 10px',\n margin: 0,\n});\n\nconst RepositoryAvatar = styled(Avatar)({\n padding: 0,\n marginLeft: 0,\n backgroundColor: 'transparent',\n});\n\nconst Repository: React.FC<{ packageMeta: any }> = ({ packageMeta }) => {\n const { t } = useTranslation();\n const url = packageMeta?.latest?.repository?.url;\n if (!url || !urlUtils.isURL(url)) {\n return null;\n }\n\n const getCorrectRepositoryURL = (): string => {\n if (!url.includes('git+')) {\n return url;\n }\n\n return url.split('git+')[1];\n };\n\n const repositoryURL = getCorrectRepositoryURL();\n\n return (\n <List\n dense={true}\n subheader={<StyledText variant=\"subtitle1\">{t('sidebar.repository.title')}</StyledText>}\n >\n <RepositoryListItem>\n <RepositoryAvatar sx={{ bgcolor: common.white }}>\n <Git />\n </RepositoryAvatar>\n <RepositoryListItemText\n primary={\n <CopyClipboard dataTestId=\"repositoryID\" text={repositoryURL} title={repositoryURL}>\n <LinkExternal to={repositoryURL} variant=\"outline\">\n {repositoryURL}\n </LinkExternal>\n </CopyClipboard>\n }\n />\n </RepositoryListItem>\n </List>\n );\n};\n\nexport default Repository;\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAgBA,IAAM,aAAa,OAAO,WAAW,EAAqB,WAAW;CACnE,YAAY,MAAM,MAAM,WAAW;CACnC,eAAe;CAChB,EAAE;AAEH,IAAM,qBAAqB,OAAO,SAAS,CAAC;CAC1C,SAAS;CACT,UAAU,EACR,iBAAiB,eAClB;CACF,CAAC;AAEF,IAAM,yBAAyB,OAAO,gBAAa,CAAC;CAClD,SAAS;CACT,QAAQ;CACT,CAAC;AAEF,IAAM,mBAAmB,OAAO,OAAO,CAAC;CACtC,SAAS;CACT,YAAY;CACZ,iBAAiB;CAClB,CAAC;AAEF,IAAM,cAA8C,EAAE,kBAAkB;CACtE,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,MAAM,aAAa,QAAQ,YAAY;AAC7C,KAAI,CAAC,OAAO,CAAC,MAAe,IAAI,CAC9B,QAAO;CAGT,MAAM,gCAAwC;AAC5C,MAAI,CAAC,IAAI,SAAS,OAAO,CACvB,QAAO;AAGT,SAAO,IAAI,MAAM,OAAO,CAAC;;CAG3B,MAAM,gBAAgB,yBAAyB;AAE/C,QACE,oBAAC,MAAD;EACE,OAAO;EACP,WAAW,oBAAC,YAAD;GAAY,SAAQ;aAAa,EAAE,2BAA2B;GAAc,CAAA;YAEvF,qBAAC,oBAAD,EAAA,UAAA,CACE,oBAAC,kBAAD;GAAkB,IAAI,EAAE,SAAS,OAAO,OAAO;aAC7C,oBAAC,KAAD,EAAO,CAAA;GACU,CAAA,EACnB,oBAAC,wBAAD,EACE,SACE,oBAAC,iBAAD;GAAe,YAAW;GAAe,MAAM;GAAe,OAAO;aACnE,oBAAC,cAAD;IAAc,IAAI;IAAe,SAAQ;cACtC;IACY,CAAA;GACD,CAAA,EAElB,CAAA,CACiB,EAAA,CAAA;EAChB,CAAA"}
1
+ {"version":3,"file":"Repository.mjs","names":[],"sources":["../../../src/components/Repository/Repository.tsx"],"sourcesContent":["import styled from '@emotion/styled';\nimport Avatar from '@mui/material/Avatar';\nimport List from '@mui/material/List';\nimport ListItem from '@mui/material/ListItem';\nimport ListItemText from '@mui/material/ListItemText';\nimport Typography from '@mui/material/Typography';\nimport { common } from '@mui/material/colors';\nimport React from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport type { Theme } from '../../Theme';\nimport { url as urlUtils } from '../../utils';\nimport CopyClipboard from '../CopyClipboard';\nimport { Git } from '../Icons';\nimport LinkExternal from '../LinkExternal';\n\nconst StyledText = styled(Typography)<{ theme?: Theme }>((props) => ({\n fontWeight: props.theme.fontWeight.bold,\n textTransform: 'capitalize',\n}));\n\nconst RepositoryListItem = styled(ListItem)({\n padding: 0,\n ':hover': {\n backgroundColor: 'transparent',\n },\n});\n\nconst RepositoryListItemText = styled(ListItemText)({\n padding: '0 0 0 10px',\n margin: 0,\n});\n\nconst RepositoryAvatar = styled(Avatar)({\n padding: 0,\n marginLeft: 0,\n backgroundColor: 'transparent',\n});\n\nconst Repository: React.FC<{ packageMeta: any }> = ({ packageMeta }) => {\n const { t } = useTranslation();\n const url = packageMeta?.latest?.repository?.url;\n if (!url || !urlUtils.isURL(url)) {\n return null;\n }\n\n const getCorrectRepositoryURL = (): string => {\n if (!url.includes('git+')) {\n return url;\n }\n\n return url.split('git+')[1];\n };\n\n const repositoryURL = getCorrectRepositoryURL();\n\n return (\n <List\n dense={true}\n subheader={<StyledText variant=\"subtitle1\">{t('sidebar.repository.title')}</StyledText>}\n >\n <RepositoryListItem>\n <RepositoryAvatar sx={{ bgcolor: common.white }}>\n <Git />\n </RepositoryAvatar>\n <RepositoryListItemText\n primary={\n <CopyClipboard dataTestId=\"repositoryID\" text={repositoryURL} title={repositoryURL}>\n <LinkExternal to={repositoryURL} variant=\"outline\">\n {repositoryURL}\n </LinkExternal>\n </CopyClipboard>\n }\n />\n </RepositoryListItem>\n </List>\n );\n};\n\nexport default Repository;\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAgBA,IAAM,aAAa,OAAO,WAAW,EAAqB,WAAW;CACnE,YAAY,MAAM,MAAM,WAAW;CACnC,eAAe;CAChB,EAAE;AAEH,IAAM,qBAAqB,OAAO,SAAS,CAAC;CAC1C,SAAS;CACT,UAAU,EACR,iBAAiB,eAClB;CACF,CAAC;AAEF,IAAM,yBAAyB,OAAO,aAAa,CAAC;CAClD,SAAS;CACT,QAAQ;CACT,CAAC;AAEF,IAAM,mBAAmB,OAAO,OAAO,CAAC;CACtC,SAAS;CACT,YAAY;CACZ,iBAAiB;CAClB,CAAC;AAEF,IAAM,cAA8C,EAAE,kBAAkB;CACtE,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,MAAM,aAAa,QAAQ,YAAY;AAC7C,KAAI,CAAC,OAAO,CAAC,MAAe,IAAI,CAC9B,QAAO;CAGT,MAAM,gCAAwC;AAC5C,MAAI,CAAC,IAAI,SAAS,OAAO,CACvB,QAAO;AAGT,SAAO,IAAI,MAAM,OAAO,CAAC;;CAG3B,MAAM,gBAAgB,yBAAyB;AAE/C,QACE,oBAAC,MAAD;EACE,OAAO;EACP,WAAW,oBAAC,YAAD;GAAY,SAAQ;aAAa,EAAE,2BAA2B;GAAc,CAAA;YAEvF,qBAAC,oBAAD,EAAA,UAAA,CACE,oBAAC,kBAAD;GAAkB,IAAI,EAAE,SAAS,OAAO,OAAO;aAC7C,oBAAC,KAAD,EAAO,CAAA;GACU,CAAA,EACnB,oBAAC,wBAAD,EACE,SACE,oBAAC,iBAAD;GAAe,YAAW;GAAe,MAAM;GAAe,OAAO;aACnE,oBAAC,cAAD;IAAc,IAAI;IAAe,SAAQ;cACtC;IACY,CAAA;GACD,CAAA,EAElB,CAAA,CACiB,EAAA,CAAA;EAChB,CAAA"}
@@ -1,7 +1,7 @@
1
1
  import styled from "@emotion/styled";
2
2
  import { common } from "@mui/material/colors";
3
3
  import Typography from "@mui/material/Typography";
4
- import MuiListItemText from "@mui/material/ListItemText";
4
+ import ListItemText from "@mui/material/ListItemText";
5
5
  //#region src/components/UpLinks/styles.ts
6
6
  var StyledText = styled(Typography)((props) => ({ fontWeight: props.theme.fontWeight.bold }));
7
7
  var Spacer = styled("div")(({ theme }) => ({
@@ -11,12 +11,12 @@ var Spacer = styled("div")(({ theme }) => ({
11
11
  height: "0.5em",
12
12
  margin: "0 16px"
13
13
  }));
14
- var ListItemText = styled(MuiListItemText)(({ theme }) => ({
14
+ var ListItemText$1 = styled(ListItemText)(({ theme }) => ({
15
15
  flex: "none",
16
16
  color: theme.palette.mode == "light" ? theme.palette.black : common.white,
17
17
  opacity: .6
18
18
  }));
19
19
  //#endregion
20
- export { ListItemText, Spacer, StyledText };
20
+ export { ListItemText$1 as ListItemText, Spacer, StyledText };
21
21
 
22
22
  //# sourceMappingURL=styles.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"styles.mjs","names":[],"sources":["../../../src/components/UpLinks/styles.ts"],"sourcesContent":["import styled from '@emotion/styled';\nimport { default as MuiListItemText } from '@mui/material/ListItemText';\nimport Typography from '@mui/material/Typography';\nimport { common } from '@mui/material/colors';\n\nimport type { Theme } from '../../Theme';\n\nexport const StyledText = styled(Typography)<{ theme?: Theme }>((props) => ({\n fontWeight: props.theme.fontWeight.bold,\n}));\n\nexport const Spacer = styled('div')<{ theme?: Theme }>(({ theme }) => ({\n flex: '1 1 auto',\n borderBottom: `1px dotted ${\n theme.palette.mode == 'light' ? 'rgba(0, 0, 0, 0.2)' : 'rgba(255, 255, 255, 0.2)'\n } `,\n whiteSpace: 'nowrap',\n height: '0.5em',\n margin: '0 16px',\n}));\n\nexport const ListItemText = styled(MuiListItemText)<{ theme?: Theme }>(({ theme }) => ({\n flex: 'none',\n color: theme.palette.mode == 'light' ? theme.palette.black : common.white,\n opacity: 0.6,\n}));\n"],"mappings":";;;;;AAOA,IAAa,aAAa,OAAO,WAAW,EAAqB,WAAW,EAC1E,YAAY,MAAM,MAAM,WAAW,MACpC,EAAE;AAEH,IAAa,SAAS,OAAO,MAAM,EAAqB,EAAE,aAAa;CACrE,MAAM;CACN,cAAc,cACZ,MAAM,QAAQ,QAAQ,UAAU,uBAAuB,2BACxD;CACD,YAAY;CACZ,QAAQ;CACR,QAAQ;CACT,EAAE;AAEH,IAAa,eAAe,OAAO,gBAAgB,EAAqB,EAAE,aAAa;CACrF,MAAM;CACN,OAAO,MAAM,QAAQ,QAAQ,UAAU,MAAM,QAAQ,QAAQ,OAAO;CACpE,SAAS;CACV,EAAE"}
1
+ {"version":3,"file":"styles.mjs","names":[],"sources":["../../../src/components/UpLinks/styles.ts"],"sourcesContent":["import styled from '@emotion/styled';\nimport { default as MuiListItemText } from '@mui/material/ListItemText';\nimport Typography from '@mui/material/Typography';\nimport { common } from '@mui/material/colors';\n\nimport type { Theme } from '../../Theme';\n\nexport const StyledText = styled(Typography)<{ theme?: Theme }>((props) => ({\n fontWeight: props.theme.fontWeight.bold,\n}));\n\nexport const Spacer = styled('div')<{ theme?: Theme }>(({ theme }) => ({\n flex: '1 1 auto',\n borderBottom: `1px dotted ${\n theme.palette.mode == 'light' ? 'rgba(0, 0, 0, 0.2)' : 'rgba(255, 255, 255, 0.2)'\n } `,\n whiteSpace: 'nowrap',\n height: '0.5em',\n margin: '0 16px',\n}));\n\nexport const ListItemText = styled(MuiListItemText)<{ theme?: Theme }>(({ theme }) => ({\n flex: 'none',\n color: theme.palette.mode == 'light' ? theme.palette.black : common.white,\n opacity: 0.6,\n}));\n"],"mappings":";;;;;AAOA,IAAa,aAAa,OAAO,WAAW,EAAqB,WAAW,EAC1E,YAAY,MAAM,MAAM,WAAW,MACpC,EAAE;AAEH,IAAa,SAAS,OAAO,MAAM,EAAqB,EAAE,aAAa;CACrE,MAAM;CACN,cAAc,cACZ,MAAM,QAAQ,QAAQ,UAAU,uBAAuB,2BACxD;CACD,YAAY;CACZ,QAAQ;CACR,QAAQ;CACT,EAAE;AAEH,IAAa,iBAAe,OAAO,aAAgB,EAAqB,EAAE,aAAa;CACrF,MAAM;CACN,OAAO,MAAM,QAAQ,QAAQ,UAAU,MAAM,QAAQ,QAAQ,OAAO;CACpE,SAAS;CACV,EAAE"}
@@ -1,6 +1,6 @@
1
1
  import styled from "@emotion/styled";
2
2
  import { common } from "@mui/material/colors";
3
- import MuiListItemText from "@mui/material/ListItemText";
3
+ import ListItemText from "@mui/material/ListItemText";
4
4
  //#region src/components/Versions/styles.ts
5
5
  var Spacer = styled("div")(({ theme }) => ({
6
6
  flex: "1 1 auto",
@@ -9,12 +9,12 @@ var Spacer = styled("div")(({ theme }) => ({
9
9
  height: "0.5em",
10
10
  margin: "0 16px"
11
11
  }));
12
- var ListItemText = styled(MuiListItemText)(({ theme }) => ({
12
+ var ListItemText$1 = styled(ListItemText)(({ theme }) => ({
13
13
  flex: "none",
14
14
  opacity: .6,
15
15
  color: theme.palette.mode == "light" ? theme.palette.black : common.white
16
16
  }));
17
17
  //#endregion
18
- export { ListItemText, Spacer };
18
+ export { ListItemText$1 as ListItemText, Spacer };
19
19
 
20
20
  //# sourceMappingURL=styles.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"styles.mjs","names":[],"sources":["../../../src/components/Versions/styles.ts"],"sourcesContent":["import styled from '@emotion/styled';\nimport { default as MuiListItemText } from '@mui/material/ListItemText';\nimport { common } from '@mui/material/colors';\n\nimport type { Theme } from '../../Theme';\n\nexport const Spacer = styled('div')<{ theme?: Theme }>(({ theme }) => ({\n flex: '1 1 auto',\n borderBottom: `1px dotted ${\n theme.palette.mode == 'light' ? 'rgba(0, 0, 0, 0.2)' : 'rgba(255, 255, 255, 0.2)'\n } `,\n whiteSpace: 'nowrap',\n height: '0.5em',\n margin: '0 16px',\n}));\n\nexport const ListItemText = styled(MuiListItemText)<{ theme?: Theme }>(({ theme }) => ({\n flex: 'none',\n opacity: 0.6,\n color: theme.palette.mode == 'light' ? theme.palette.black : common.white,\n}));\n"],"mappings":";;;;AAMA,IAAa,SAAS,OAAO,MAAM,EAAqB,EAAE,aAAa;CACrE,MAAM;CACN,cAAc,cACZ,MAAM,QAAQ,QAAQ,UAAU,uBAAuB,2BACxD;CACD,YAAY;CACZ,QAAQ;CACR,QAAQ;CACT,EAAE;AAEH,IAAa,eAAe,OAAO,gBAAgB,EAAqB,EAAE,aAAa;CACrF,MAAM;CACN,SAAS;CACT,OAAO,MAAM,QAAQ,QAAQ,UAAU,MAAM,QAAQ,QAAQ,OAAO;CACrE,EAAE"}
1
+ {"version":3,"file":"styles.mjs","names":[],"sources":["../../../src/components/Versions/styles.ts"],"sourcesContent":["import styled from '@emotion/styled';\nimport { default as MuiListItemText } from '@mui/material/ListItemText';\nimport { common } from '@mui/material/colors';\n\nimport type { Theme } from '../../Theme';\n\nexport const Spacer = styled('div')<{ theme?: Theme }>(({ theme }) => ({\n flex: '1 1 auto',\n borderBottom: `1px dotted ${\n theme.palette.mode == 'light' ? 'rgba(0, 0, 0, 0.2)' : 'rgba(255, 255, 255, 0.2)'\n } `,\n whiteSpace: 'nowrap',\n height: '0.5em',\n margin: '0 16px',\n}));\n\nexport const ListItemText = styled(MuiListItemText)<{ theme?: Theme }>(({ theme }) => ({\n flex: 'none',\n opacity: 0.6,\n color: theme.palette.mode == 'light' ? theme.palette.black : common.white,\n}));\n"],"mappings":";;;;AAMA,IAAa,SAAS,OAAO,MAAM,EAAqB,EAAE,aAAa;CACrE,MAAM;CACN,cAAc,cACZ,MAAM,QAAQ,QAAQ,UAAU,uBAAuB,2BACxD;CACD,YAAY;CACZ,QAAQ;CACR,QAAQ;CACT,EAAE;AAEH,IAAa,iBAAe,OAAO,aAAgB,EAAqB,EAAE,aAAa;CACrF,MAAM;CACN,SAAS;CACT,OAAO,MAAM,QAAQ,QAAQ,UAAU,MAAM,QAAQ,QAAQ,OAAO;CACrE,EAAE"}
@@ -8,6 +8,7 @@ const require_utils$1 = require("./utils.js");
8
8
  let react = require("react");
9
9
  react = require_runtime.__toESM(react);
10
10
  let react_jsx_runtime = require("react/jsx-runtime");
11
+ let swr = require("swr");
11
12
  //#region src/providers/AuthProvider/AuthProvider.tsx
12
13
  var AuthContext = (0, react.createContext)({
13
14
  userState: {
@@ -21,22 +22,22 @@ var AuthContext = (0, react.createContext)({
21
22
  var basePath = require_utils.stripTrailingSlash(require_configuration.getConfiguration().base);
22
23
  var AuthProvider = ({ children }) => {
23
24
  const [userState, setUserState] = react.default.useState(require_utils$1.getDefaultUserState());
24
- const { data, isMutating, trigger } = require_use_data_mutation.useDataMutation(basePath, require_routes.APIRoute.LOGIN, "POST");
25
+ const { trigger } = require_use_data_mutation.useDataMutation(basePath, require_routes.APIRoute.LOGIN, "POST");
26
+ const { mutate } = (0, swr.useSWRConfig)();
25
27
  const handleLogin = async (body) => {
26
- await trigger(body);
28
+ const result = await trigger(body);
29
+ if (result && result.username && result.token) {
30
+ require_storage.saveAuth(result.username, result.token);
31
+ setUserState(result);
32
+ mutate(`${basePath}${require_routes.APIRoute.PACKAGES}`);
33
+ }
27
34
  };
28
35
  const logOutUser = () => {
29
36
  setUserState(require_utils$1.getDefaultUserState());
30
37
  require_storage.clearAuth();
31
38
  window.location?.reload();
32
39
  };
33
- (0, react.useEffect)(() => {
34
- if (data && !isMutating) {
35
- setUserState(data);
36
- if (data.username && data.token) require_storage.saveAuth(data.username, data.token);
37
- }
38
- }, [data, isMutating]);
39
- return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(AuthContext.Provider, {
40
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(AuthContext, {
40
41
  value: {
41
42
  handleLogin,
42
43
  userState,
@@ -46,7 +47,7 @@ var AuthProvider = ({ children }) => {
46
47
  children
47
48
  });
48
49
  };
49
- var useAuth = () => (0, react.useContext)(AuthContext);
50
+ var useAuth = () => (0, react.use)(AuthContext);
50
51
  //#endregion
51
52
  exports.AuthContext = AuthContext;
52
53
  exports.AuthProvider = AuthProvider;
@@ -1 +1 @@
1
- {"version":3,"file":"AuthProvider.js","names":[],"sources":["../../../src/providers/AuthProvider/AuthProvider.tsx"],"sourcesContent":["import type { ReactElement } from 'react';\nimport React, { createContext, useContext, useEffect } from 'react';\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 { data, isMutating, trigger } = useDataMutation<LoginBody>(\n basePath,\n APIRoute.LOGIN,\n 'POST'\n );\n\n const handleLogin = async (body: { username: string; password: string }) => {\n await trigger(body);\n };\n\n const logOutUser = () => {\n setUserState(getDefaultUserState());\n clearAuth();\n window.location?.reload();\n };\n\n useEffect(() => {\n if (data && !isMutating) {\n setUserState(data as LoginBody);\n if (data.username && data.token) {\n saveAuth(data.username, data.token);\n }\n }\n }, [data, isMutating]);\n\n return (\n <AuthContext.Provider\n value={{\n handleLogin,\n userState,\n logOutUser,\n setUserState,\n }}\n >\n {children}\n </AuthContext.Provider>\n );\n};\n\nexport { AuthProvider };\n\nexport const useAuth = () => useContext(AuthContext);\n"],"mappings":";;;;;;;;;;;AAkBA,IAAa,eAAA,GAAA,MAAA,eAAuD;CAClE,WAAW;EAAE,OAAO;EAAM,UAAU;EAAM;CAC1C,oBAAoB;CACpB,aAAa,YAAY;CACzB,kBAAkB;CACnB,CAAC;AAGF,IAAM,WAAW,cAAA,mBADK,sBAAA,kBAAkB,CACU,KAAK;AAEvD,IAAM,gBAAsD,EAAE,eAAe;CAC3E,MAAM,CAAC,WAAW,gBAAgB,MAAA,QAAM,SAAoB,gBAAA,qBAAqB,CAAC;CAClF,MAAM,EAAE,MAAM,YAAY,YAAY,0BAAA,gBACpC,UACA,eAAA,SAAS,OACT,OACD;CAED,MAAM,cAAc,OAAO,SAAiD;AAC1E,QAAM,QAAQ,KAAK;;CAGrB,MAAM,mBAAmB;AACvB,eAAa,gBAAA,qBAAqB,CAAC;AACnC,kBAAA,WAAW;AACX,SAAO,UAAU,QAAQ;;AAG3B,EAAA,GAAA,MAAA,iBAAgB;AACd,MAAI,QAAQ,CAAC,YAAY;AACvB,gBAAa,KAAkB;AAC/B,OAAI,KAAK,YAAY,KAAK,MACxB,iBAAA,SAAS,KAAK,UAAU,KAAK,MAAM;;IAGtC,CAAC,MAAM,WAAW,CAAC;AAEtB,QACE,iBAAA,GAAA,kBAAA,KAAC,YAAY,UAAb;EACE,OAAO;GACL;GACA;GACA;GACA;GACD;EAEA;EACoB,CAAA;;AAM3B,IAAa,iBAAA,GAAA,MAAA,YAA2B,YAAY"}
1
+ {"version":3,"file":"AuthProvider.js","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 && result.username && result.token) {\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\n const logOutUser = () => {\n setUserState(getDefaultUserState());\n clearAuth();\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,eAAA,GAAA,MAAA,eAAuD;CAClE,WAAW;EAAE,OAAO;EAAM,UAAU;EAAM;CAC1C,oBAAoB;CACpB,aAAa,YAAY;CACzB,kBAAkB;CACnB,CAAC;AAGF,IAAM,WAAW,cAAA,mBADK,sBAAA,kBAAkB,CACU,KAAK;AAEvD,IAAM,gBAAsD,EAAE,eAAe;CAC3E,MAAM,CAAC,WAAW,gBAAgB,MAAA,QAAM,SAAoB,gBAAA,qBAAqB,CAAC;CAClF,MAAM,EAAE,YAAY,0BAAA,gBAA2B,UAAU,eAAA,SAAS,OAAO,OAAO;CAChF,MAAM,EAAE,YAAA,GAAA,IAAA,eAAyB;CAEjC,MAAM,cAAc,OAAO,SAAiD;EAC1E,MAAM,SAAS,MAAM,QAAQ,KAAK;AAClC,MAAI,UAAU,OAAO,YAAY,OAAO,OAAO;AAC7C,mBAAA,SAAS,OAAO,UAAU,OAAO,MAAM;AACvC,gBAAa,OAAoB;AAEjC,UAAO,GAAG,WAAW,eAAA,SAAS,WAAW;;;CAI7C,MAAM,mBAAmB;AACvB,eAAa,gBAAA,qBAAqB,CAAC;AACnC,kBAAA,WAAW;AACX,SAAO,UAAU,QAAQ;;AAG3B,QACE,iBAAA,GAAA,kBAAA,KAAC,aAAD;EACE,OAAO;GACL;GACA;GACA;GACA;GACD;EAEA;EACW,CAAA;;AAMlB,IAAa,iBAAA,GAAA,MAAA,KAAoB,YAAY"}
@@ -4,8 +4,9 @@ import { APIRoute } from "../../store/routes.mjs";
4
4
  import { stripTrailingSlash } from "../../store/utils.mjs";
5
5
  import { useDataMutation } from "../../api/use-data-mutation.mjs";
6
6
  import { getDefaultUserState } from "./utils.mjs";
7
- import React, { createContext, useContext, useEffect } from "react";
7
+ import React, { createContext, use } from "react";
8
8
  import { jsx } from "react/jsx-runtime";
9
+ import { useSWRConfig } from "swr";
9
10
  //#region src/providers/AuthProvider/AuthProvider.tsx
10
11
  var AuthContext = createContext({
11
12
  userState: {
@@ -19,22 +20,22 @@ var AuthContext = createContext({
19
20
  var basePath = stripTrailingSlash(getConfiguration().base);
20
21
  var AuthProvider = ({ children }) => {
21
22
  const [userState, setUserState] = React.useState(getDefaultUserState());
22
- const { data, isMutating, trigger } = useDataMutation(basePath, APIRoute.LOGIN, "POST");
23
+ const { trigger } = useDataMutation(basePath, APIRoute.LOGIN, "POST");
24
+ const { mutate } = useSWRConfig();
23
25
  const handleLogin = async (body) => {
24
- await trigger(body);
26
+ const result = await trigger(body);
27
+ if (result && result.username && result.token) {
28
+ saveAuth(result.username, result.token);
29
+ setUserState(result);
30
+ mutate(`${basePath}${APIRoute.PACKAGES}`);
31
+ }
25
32
  };
26
33
  const logOutUser = () => {
27
34
  setUserState(getDefaultUserState());
28
35
  clearAuth();
29
36
  window.location?.reload();
30
37
  };
31
- useEffect(() => {
32
- if (data && !isMutating) {
33
- setUserState(data);
34
- if (data.username && data.token) saveAuth(data.username, data.token);
35
- }
36
- }, [data, isMutating]);
37
- return /* @__PURE__ */ jsx(AuthContext.Provider, {
38
+ return /* @__PURE__ */ jsx(AuthContext, {
38
39
  value: {
39
40
  handleLogin,
40
41
  userState,
@@ -44,7 +45,7 @@ var AuthProvider = ({ children }) => {
44
45
  children
45
46
  });
46
47
  };
47
- var useAuth = () => useContext(AuthContext);
48
+ var useAuth = () => use(AuthContext);
48
49
  //#endregion
49
50
  export { AuthContext, AuthProvider, useAuth };
50
51
 
@@ -1 +1 @@
1
- {"version":3,"file":"AuthProvider.mjs","names":[],"sources":["../../../src/providers/AuthProvider/AuthProvider.tsx"],"sourcesContent":["import type { ReactElement } from 'react';\nimport React, { createContext, useContext, useEffect } from 'react';\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 { data, isMutating, trigger } = useDataMutation<LoginBody>(\n basePath,\n APIRoute.LOGIN,\n 'POST'\n );\n\n const handleLogin = async (body: { username: string; password: string }) => {\n await trigger(body);\n };\n\n const logOutUser = () => {\n setUserState(getDefaultUserState());\n clearAuth();\n window.location?.reload();\n };\n\n useEffect(() => {\n if (data && !isMutating) {\n setUserState(data as LoginBody);\n if (data.username && data.token) {\n saveAuth(data.username, data.token);\n }\n }\n }, [data, isMutating]);\n\n return (\n <AuthContext.Provider\n value={{\n handleLogin,\n userState,\n logOutUser,\n setUserState,\n }}\n >\n {children}\n </AuthContext.Provider>\n );\n};\n\nexport { AuthProvider };\n\nexport const useAuth = () => useContext(AuthContext);\n"],"mappings":";;;;;;;;;AAkBA,IAAa,cAAc,cAAyC;CAClE,WAAW;EAAE,OAAO;EAAM,UAAU;EAAM;CAC1C,oBAAoB;CACpB,aAAa,YAAY;CACzB,kBAAkB;CACnB,CAAC;AAGF,IAAM,WAAW,mBADK,kBAAkB,CACU,KAAK;AAEvD,IAAM,gBAAsD,EAAE,eAAe;CAC3E,MAAM,CAAC,WAAW,gBAAgB,MAAM,SAAoB,qBAAqB,CAAC;CAClF,MAAM,EAAE,MAAM,YAAY,YAAY,gBACpC,UACA,SAAS,OACT,OACD;CAED,MAAM,cAAc,OAAO,SAAiD;AAC1E,QAAM,QAAQ,KAAK;;CAGrB,MAAM,mBAAmB;AACvB,eAAa,qBAAqB,CAAC;AACnC,aAAW;AACX,SAAO,UAAU,QAAQ;;AAG3B,iBAAgB;AACd,MAAI,QAAQ,CAAC,YAAY;AACvB,gBAAa,KAAkB;AAC/B,OAAI,KAAK,YAAY,KAAK,MACxB,UAAS,KAAK,UAAU,KAAK,MAAM;;IAGtC,CAAC,MAAM,WAAW,CAAC;AAEtB,QACE,oBAAC,YAAY,UAAb;EACE,OAAO;GACL;GACA;GACA;GACA;GACD;EAEA;EACoB,CAAA;;AAM3B,IAAa,gBAAgB,WAAW,YAAY"}
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 && result.username && result.token) {\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\n const logOutUser = () => {\n setUserState(getDefaultUserState());\n clearAuth();\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;EAAM;CAC1C,oBAAoB;CACpB,aAAa,YAAY;CACzB,kBAAkB;CACnB,CAAC;AAGF,IAAM,WAAW,mBADK,kBAAkB,CACU,KAAK;AAEvD,IAAM,gBAAsD,EAAE,eAAe;CAC3E,MAAM,CAAC,WAAW,gBAAgB,MAAM,SAAoB,qBAAqB,CAAC;CAClF,MAAM,EAAE,YAAY,gBAA2B,UAAU,SAAS,OAAO,OAAO;CAChF,MAAM,EAAE,WAAW,cAAc;CAEjC,MAAM,cAAc,OAAO,SAAiD;EAC1E,MAAM,SAAS,MAAM,QAAQ,KAAK;AAClC,MAAI,UAAU,OAAO,YAAY,OAAO,OAAO;AAC7C,YAAS,OAAO,UAAU,OAAO,MAAM;AACvC,gBAAa,OAAoB;AAEjC,UAAO,GAAG,WAAW,SAAS,WAAW;;;CAI7C,MAAM,mBAAmB;AACvB,eAAa,qBAAqB,CAAC;AACnC,aAAW;AACX,SAAO,UAAU,QAAQ;;AAG3B,QACE,oBAAC,aAAD;EACE,OAAO;GACL;GACA;GACA;GACA;GACD;EAEA;EACW,CAAA;;AAMlB,IAAa,gBAAgB,IAAI,YAAY"}
@@ -33,14 +33,14 @@ var Login = () => {
33
33
  const { next } = require_utils$2.getSecurityUrlParams(location);
34
34
  const createUserEnabled = configuration?.flags?.createUser;
35
35
  const addUserLink = require_routes.Route.ADD_USER + (next ? "?next=" + next : "");
36
- const { data, isMutating, trigger } = require_use_data_mutation.useDataMutation(basePath, next, "POST");
36
+ const { trigger } = require_use_data_mutation.useDataMutation(basePath, next, "POST");
37
37
  const { setError, handleSubmit, register, formState: { isValid, errors } } = (0, react_hook_form.useForm)({
38
38
  mode: "onChange",
39
39
  resolver: (0, _hookform_resolvers_yup.yupResolver)(require_schemas.loginSchema)
40
40
  });
41
41
  const handleLogin = async (body) => {
42
42
  try {
43
- await trigger(body);
43
+ return await trigger(body);
44
44
  } catch (err) {
45
45
  throw require_utils$1.normalizeAuthError(err);
46
46
  }
@@ -50,7 +50,8 @@ var Login = () => {
50
50
  }, [navigate]);
51
51
  const onSubmit = (0, react.useCallback)(async (data) => {
52
52
  try {
53
- await handleLogin?.(data);
53
+ const result = await handleLogin?.(data);
54
+ if (result && result.username && result.token) require_storage.saveAuth(result.username, result.token);
54
55
  onSuccess();
55
56
  } catch {
56
57
  setError("root", {
@@ -63,9 +64,6 @@ var Login = () => {
63
64
  setError,
64
65
  onSuccess
65
66
  ]);
66
- (0, react.useEffect)(() => {
67
- if (data && !isMutating && data.username && data.token) require_storage.saveAuth(data.username, data.token);
68
- }, [data, isMutating]);
69
67
  return !next ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_NotFound.default, {}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Dialog.default, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_styles$1.SecurityContainer, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_styles$1.SecurityForm, { children: [
70
68
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_styles.default, {}),
71
69
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Login.default, {
@@ -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, useEffect } 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 { data, isMutating, 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 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 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 useEffect(() => {\n if (data && !isMutating && data.username && data.token) {\n saveAuth(data.username, data.token);\n }\n }, [data, isMutating]);\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,kBAAkB;AACxC,IAAM,WAAW,cAAA,mBAAmB,cAAc,KAAK;AAEvD,IAAM,cAAwB;CAC5B,MAAM,EAAE,OAAA,GAAA,cAAA,iBAAsB;CAC9B,MAAM,YAAA,GAAA,aAAA,cAAwB;CAC9B,MAAM,YAAA,GAAA,aAAA,cAAwB;CAC9B,MAAM,EAAE,SAAS,gBAAA,qBAAqB,SAAS;CAC/C,MAAM,oBAAoB,eAAe,OAAO;CAChD,MAAM,cAAc,eAAA,MAAM,YAAY,OAAO,WAAW,OAAO;CAE/D,MAAM,EAAE,MAAM,YAAY,YAAY,0BAAA,gBAA2B,UAAU,MAAM,OAAO;CAOxF,MAAM,EACJ,UACA,cACA,UACA,WAAW,EAAE,SAAS,cAAA,GAAA,gBAAA,SATc;EACpC,MAAM;EACN,WAAA,GAAA,wBAAA,aAAsB,gBAAA,YAAY;EACnC,CAAC;CASF,MAAM,cAAc,OAAO,SAAiD;AAC1E,MAAI;AACF,SAAM,QAAQ,KAAK;WACZ,KAAK;AACZ,SAAM,gBAAA,mBAAmB,IAAI;;;CAIjC,MAAM,aAAA,GAAA,MAAA,mBAA8B;AAClC,WAAS,GAAG,eAAA,MAAM,QAAQ,eAAe,gBAAA,YAAY,QAAQ;IAC5D,CAAC,SAAS,CAAC;CAEd,MAAM,YAAA,GAAA,MAAA,aACJ,OAAO,SAA0B;AAC/B,MAAI;AACF,SAAM,cAAc,KAAK;AACzB,cAAW;UACL;AACN,YAAS,QAAQ;IACf,MAAM;IAEN,SAAS;IACV,CAAC;;IAGN;EAAC;EAAa;EAAU;EAAU,CACnC;AAED,EAAA,GAAA,MAAA,iBAAgB;AACd,MAAI,QAAQ,CAAC,cAAc,KAAK,YAAY,KAAK,MAC/C,iBAAA,SAAS,KAAK,UAAU,KAAK,MAAM;IAEpC,CAAC,MAAM,WAAW,CAAC;AAEtB,QAAO,CAAC,OACN,iBAAA,GAAA,kBAAA,KAAC,iBAAA,SAAD,EAAY,CAAA,GAEZ,iBAAA,GAAA,kBAAA,KAAC,eAAA,SAAD,EAAA,UACE,iBAAA,GAAA,kBAAA,KAAC,iBAAA,mBAAD,EAAA,UACE,iBAAA,GAAA,kBAAA,MAAC,iBAAA,cAAD,EAAA,UAAA;EACE,iBAAA,GAAA,kBAAA,KAAC,eAAA,SAAD,EAAmB,CAAA;EACnB,iBAAA,GAAA,kBAAA,KAAC,cAAA,SAAD;GACU;GACM;GACL;GACC;GACA;GACV,CAAA;EACD,qBACC,iBAAA,GAAA,kBAAA,MAAC,cAAA,YAAD;GAAY,OAAM;GAAS,IAAI;IAAE,IAAI;IAAG,UAAU;IAAI;GAAE,SAAQ;aAAhE,CACG,EAAE,gCAAgC,EACnC,iBAAA,GAAA,kBAAA,KAAC,cAAA,MAAD;IAAM,MAAM;IAAa,IAAI,EAAE,IAAI,GAAG;cACnC,EAAE,4BAA4B;IAC1B,CAAA,CACI;;EAEF,EAAA,CAAA,EACG,CAAA,EACL,CAAA"}
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,kBAAkB;AACxC,IAAM,WAAW,cAAA,mBAAmB,cAAc,KAAK;AAEvD,IAAM,cAAwB;CAC5B,MAAM,EAAE,OAAA,GAAA,cAAA,iBAAsB;CAC9B,MAAM,YAAA,GAAA,aAAA,cAAwB;CAC9B,MAAM,YAAA,GAAA,aAAA,cAAwB;CAC9B,MAAM,EAAE,SAAS,gBAAA,qBAAqB,SAAS;CAC/C,MAAM,oBAAoB,eAAe,OAAO;CAChD,MAAM,cAAc,eAAA,MAAM,YAAY,OAAO,WAAW,OAAO;CAE/D,MAAM,EAAE,YAAY,0BAAA,gBAA2B,UAAU,MAAM,OAAO;CAOtE,MAAM,EACJ,UACA,cACA,UACA,WAAW,EAAE,SAAS,cAAA,GAAA,gBAAA,SATc;EACpC,MAAM;EACN,WAAA,GAAA,wBAAA,aAAsB,gBAAA,YAAY;EACnC,CAAC;CASF,MAAM,cAAc,OAAO,SAAiD;AAC1E,MAAI;AACF,UAAO,MAAM,QAAQ,KAAK;WACnB,KAAK;AACZ,SAAM,gBAAA,mBAAmB,IAAI;;;CAIjC,MAAM,aAAA,GAAA,MAAA,mBAA8B;AAClC,WAAS,GAAG,eAAA,MAAM,QAAQ,eAAe,gBAAA,YAAY,QAAQ;IAC5D,CAAC,SAAS,CAAC;CAEd,MAAM,YAAA,GAAA,MAAA,aACJ,OAAO,SAA0B;AAC/B,MAAI;GACF,MAAM,SAAS,MAAM,cAAc,KAAK;AACxC,OAAI,UAAU,OAAO,YAAY,OAAO,MACtC,iBAAA,SAAS,OAAO,UAAU,OAAO,MAAM;AAEzC,cAAW;UACL;AACN,YAAS,QAAQ;IACf,MAAM;IAEN,SAAS;IACV,CAAC;;IAGN;EAAC;EAAa;EAAU;EAAU,CACnC;AAED,QAAO,CAAC,OACN,iBAAA,GAAA,kBAAA,KAAC,iBAAA,SAAD,EAAY,CAAA,GAEZ,iBAAA,GAAA,kBAAA,KAAC,eAAA,SAAD,EAAA,UACE,iBAAA,GAAA,kBAAA,KAAC,iBAAA,mBAAD,EAAA,UACE,iBAAA,GAAA,kBAAA,MAAC,iBAAA,cAAD,EAAA,UAAA;EACE,iBAAA,GAAA,kBAAA,KAAC,eAAA,SAAD,EAAmB,CAAA;EACnB,iBAAA,GAAA,kBAAA,KAAC,cAAA,SAAD;GACU;GACM;GACL;GACC;GACA;GACV,CAAA;EACD,qBACC,iBAAA,GAAA,kBAAA,MAAC,cAAA,YAAD;GAAY,OAAM;GAAS,IAAI;IAAE,IAAI;IAAG,UAAU;IAAI;GAAE,SAAQ;aAAhE,CACG,EAAE,gCAAgC,EACnC,iBAAA,GAAA,kBAAA,KAAC,cAAA,MAAD;IAAM,MAAM;IAAa,IAAI,EAAE,IAAI,GAAG;cACnC,EAAE,4BAA4B;IAC1B,CAAA,CACI;;EAEF,EAAA,CAAA,EACG,CAAA,EACL,CAAA"}
@@ -14,7 +14,7 @@ import SecurityLayout from "../../layouts/Security/Dialog.mjs";
14
14
  import { SecurityContainer, SecurityForm } from "./styles.mjs";
15
15
  import { MessageType } from "./Success.mjs";
16
16
  import { getSecurityUrlParams } from "./utils.mjs";
17
- import { useCallback, useEffect } from "react";
17
+ import { useCallback } from "react";
18
18
  import { jsx, jsxs } from "react/jsx-runtime";
19
19
  import { useTranslation } from "react-i18next";
20
20
  import { useLocation, useNavigate } from "react-router";
@@ -31,14 +31,14 @@ var Login = () => {
31
31
  const { next } = getSecurityUrlParams(location);
32
32
  const createUserEnabled = configuration?.flags?.createUser;
33
33
  const addUserLink = Route$1.ADD_USER + (next ? "?next=" + next : "");
34
- const { data, isMutating, trigger } = useDataMutation(basePath, next, "POST");
34
+ const { trigger } = useDataMutation(basePath, next, "POST");
35
35
  const { setError, handleSubmit, register, formState: { isValid, errors } } = useForm({
36
36
  mode: "onChange",
37
37
  resolver: yupResolver(loginSchema)
38
38
  });
39
39
  const handleLogin = async (body) => {
40
40
  try {
41
- await trigger(body);
41
+ return await trigger(body);
42
42
  } catch (err) {
43
43
  throw normalizeAuthError(err);
44
44
  }
@@ -48,7 +48,8 @@ var Login = () => {
48
48
  }, [navigate]);
49
49
  const onSubmit = useCallback(async (data) => {
50
50
  try {
51
- await handleLogin?.(data);
51
+ const result = await handleLogin?.(data);
52
+ if (result && result.username && result.token) saveAuth(result.username, result.token);
52
53
  onSuccess();
53
54
  } catch {
54
55
  setError("root", {
@@ -61,9 +62,6 @@ var Login = () => {
61
62
  setError,
62
63
  onSuccess
63
64
  ]);
64
- useEffect(() => {
65
- if (data && !isMutating && data.username && data.token) saveAuth(data.username, data.token);
66
- }, [data, isMutating]);
67
65
  return !next ? /* @__PURE__ */ jsx(NotFound, {}) : /* @__PURE__ */ jsx(SecurityLayout, { children: /* @__PURE__ */ jsx(SecurityContainer, { children: /* @__PURE__ */ jsxs(SecurityForm, { children: [
68
66
  /* @__PURE__ */ jsx(LoginFormHeader, {}),
69
67
  /* @__PURE__ */ jsx(LoginForm, {
@@ -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, useEffect } 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 { data, isMutating, 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 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 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 useEffect(() => {\n if (data && !isMutating && data.username && data.token) {\n saveAuth(data.username, data.token);\n }\n }, [data, isMutating]);\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,kBAAkB;AACxC,IAAM,WAAW,mBAAmB,cAAc,KAAK;AAEvD,IAAM,cAAwB;CAC5B,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,WAAW,aAAa;CAC9B,MAAM,WAAW,aAAa;CAC9B,MAAM,EAAE,SAAS,qBAAqB,SAAS;CAC/C,MAAM,oBAAoB,eAAe,OAAO;CAChD,MAAM,cAAc,QAAM,YAAY,OAAO,WAAW,OAAO;CAE/D,MAAM,EAAE,MAAM,YAAY,YAAY,gBAA2B,UAAU,MAAM,OAAO;CAOxF,MAAM,EACJ,UACA,cACA,UACA,WAAW,EAAE,SAAS,aATX,QAAyB;EACpC,MAAM;EACN,UAAU,YAAY,YAAY;EACnC,CAAC;CASF,MAAM,cAAc,OAAO,SAAiD;AAC1E,MAAI;AACF,SAAM,QAAQ,KAAK;WACZ,KAAK;AACZ,SAAM,mBAAmB,IAAI;;;CAIjC,MAAM,YAAY,kBAAkB;AAClC,WAAS,GAAG,QAAM,QAAQ,eAAe,YAAY,QAAQ;IAC5D,CAAC,SAAS,CAAC;CAEd,MAAM,WAAW,YACf,OAAO,SAA0B;AAC/B,MAAI;AACF,SAAM,cAAc,KAAK;AACzB,cAAW;UACL;AACN,YAAS,QAAQ;IACf,MAAM;IAEN,SAAS;IACV,CAAC;;IAGN;EAAC;EAAa;EAAU;EAAU,CACnC;AAED,iBAAgB;AACd,MAAI,QAAQ,CAAC,cAAc,KAAK,YAAY,KAAK,MAC/C,UAAS,KAAK,UAAU,KAAK,MAAM;IAEpC,CAAC,MAAM,WAAW,CAAC;AAEtB,QAAO,CAAC,OACN,oBAAC,UAAD,EAAY,CAAA,GAEZ,oBAAC,gBAAD,EAAA,UACE,oBAAC,mBAAD,EAAA,UACE,qBAAC,cAAD,EAAA,UAAA;EACE,oBAAC,iBAAD,EAAmB,CAAA;EACnB,oBAAC,WAAD;GACU;GACM;GACL;GACC;GACA;GACV,CAAA;EACD,qBACC,qBAAC,YAAD;GAAY,OAAM;GAAS,IAAI;IAAE,IAAI;IAAG,UAAU;IAAI;GAAE,SAAQ;aAAhE,CACG,EAAE,gCAAgC,EACnC,oBAAC,QAAD;IAAM,MAAM;IAAa,IAAI,EAAE,IAAI,GAAG;cACnC,EAAE,4BAA4B;IAC1B,CAAA,CACI;;EAEF,EAAA,CAAA,EACG,CAAA,EACL,CAAA"}
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,kBAAkB;AACxC,IAAM,WAAW,mBAAmB,cAAc,KAAK;AAEvD,IAAM,cAAwB;CAC5B,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,WAAW,aAAa;CAC9B,MAAM,WAAW,aAAa;CAC9B,MAAM,EAAE,SAAS,qBAAqB,SAAS;CAC/C,MAAM,oBAAoB,eAAe,OAAO;CAChD,MAAM,cAAc,QAAM,YAAY,OAAO,WAAW,OAAO;CAE/D,MAAM,EAAE,YAAY,gBAA2B,UAAU,MAAM,OAAO;CAOtE,MAAM,EACJ,UACA,cACA,UACA,WAAW,EAAE,SAAS,aATX,QAAyB;EACpC,MAAM;EACN,UAAU,YAAY,YAAY;EACnC,CAAC;CASF,MAAM,cAAc,OAAO,SAAiD;AAC1E,MAAI;AACF,UAAO,MAAM,QAAQ,KAAK;WACnB,KAAK;AACZ,SAAM,mBAAmB,IAAI;;;CAIjC,MAAM,YAAY,kBAAkB;AAClC,WAAS,GAAG,QAAM,QAAQ,eAAe,YAAY,QAAQ;IAC5D,CAAC,SAAS,CAAC;CAEd,MAAM,WAAW,YACf,OAAO,SAA0B;AAC/B,MAAI;GACF,MAAM,SAAS,MAAM,cAAc,KAAK;AACxC,OAAI,UAAU,OAAO,YAAY,OAAO,MACtC,UAAS,OAAO,UAAU,OAAO,MAAM;AAEzC,cAAW;UACL;AACN,YAAS,QAAQ;IACf,MAAM;IAEN,SAAS;IACV,CAAC;;IAGN;EAAC;EAAa;EAAU;EAAU,CACnC;AAED,QAAO,CAAC,OACN,oBAAC,UAAD,EAAY,CAAA,GAEZ,oBAAC,gBAAD,EAAA,UACE,oBAAC,mBAAD,EAAA,UACE,qBAAC,cAAD,EAAA,UAAA;EACE,oBAAC,iBAAD,EAAmB,CAAA;EACnB,oBAAC,WAAD;GACU;GACM;GACL;GACC;GACA;GACV,CAAA;EACD,qBACC,qBAAC,YAAD;GAAY,OAAM;GAAS,IAAI;IAAE,IAAI;IAAG,UAAU;IAAI;GAAE,SAAQ;aAAhE,CACG,EAAE,gCAAgC,EACnC,oBAAC,QAAD;IAAM,MAAM;IAAa,IAAI,EAAE,IAAI,GAAG;cACnC,EAAE,4BAA4B;IAC1B,CAAA,CACI;;EAEF,EAAA,CAAA,EACG,CAAA,EACL,CAAA"}