@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.
- package/build/components/AppRoute/AppRoute.js +54 -47
- package/build/components/AppRoute/AppRoute.js.map +1 -1
- package/build/components/AppRoute/AppRoute.mjs +54 -47
- package/build/components/AppRoute/AppRoute.mjs.map +1 -1
- package/build/components/Install/InstallListItem.mjs +2 -2
- package/build/components/Install/InstallListItem.mjs.map +1 -1
- package/build/components/Package/styles.mjs +2 -2
- package/build/components/Package/styles.mjs.map +1 -1
- package/build/components/Readme/github-markdown.css +255 -317
- package/build/components/Repository/Repository.mjs +2 -2
- package/build/components/Repository/Repository.mjs.map +1 -1
- package/build/components/UpLinks/styles.mjs +3 -3
- package/build/components/UpLinks/styles.mjs.map +1 -1
- package/build/components/Versions/styles.mjs +3 -3
- package/build/components/Versions/styles.mjs.map +1 -1
- package/build/providers/AuthProvider/AuthProvider.js +11 -10
- package/build/providers/AuthProvider/AuthProvider.js.map +1 -1
- package/build/providers/AuthProvider/AuthProvider.mjs +12 -11
- package/build/providers/AuthProvider/AuthProvider.mjs.map +1 -1
- package/build/sections/Security/Login.js +4 -6
- package/build/sections/Security/Login.js.map +1 -1
- package/build/sections/Security/Login.mjs +5 -7
- package/build/sections/Security/Login.mjs.map +1 -1
- package/build/ui-components.css +255 -317
- package/package.json +5 -3
|
@@ -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
|
|
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(
|
|
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,
|
|
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
|
|
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(
|
|
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,
|
|
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
|
|
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(
|
|
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,
|
|
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 {
|
|
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,
|
|
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.
|
|
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,
|
|
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,
|
|
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 {
|
|
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
|
-
|
|
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 = () =>
|
|
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,
|
|
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 {
|
|
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
|
|
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
|
|
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 {
|
|
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
|
|
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"}
|