mogh_ui 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/dist/auth/index.cjs +156 -0
  2. package/dist/auth/index.cjs.map +1 -0
  3. package/dist/auth/index.d.cts +50 -0
  4. package/dist/auth/index.d.ts +50 -0
  5. package/dist/auth/index.js +115 -0
  6. package/dist/auth/index.js.map +1 -0
  7. package/dist/auth/login/header.cjs +74 -0
  8. package/dist/auth/login/header.cjs.map +1 -0
  9. package/dist/auth/login/header.d.cts +8 -0
  10. package/dist/auth/login/header.d.ts +8 -0
  11. package/dist/auth/login/header.js +60 -0
  12. package/dist/auth/login/header.js.map +1 -0
  13. package/dist/auth/login/index.cjs +245 -0
  14. package/dist/auth/login/index.cjs.map +1 -0
  15. package/dist/auth/login/index.d.cts +15 -0
  16. package/dist/auth/login/index.d.ts +15 -0
  17. package/dist/auth/login/index.js +220 -0
  18. package/dist/auth/login/index.js.map +1 -0
  19. package/dist/auth/profile/index.cjs +27 -0
  20. package/dist/auth/profile/index.cjs.map +1 -0
  21. package/dist/auth/profile/index.d.cts +5 -0
  22. package/dist/auth/profile/index.d.ts +5 -0
  23. package/dist/auth/profile/index.js +4 -0
  24. package/dist/auth/profile/index.js.map +1 -0
  25. package/dist/auth/profile/linked-logins.cjs +177 -0
  26. package/dist/auth/profile/linked-logins.cjs.map +1 -0
  27. package/dist/auth/profile/linked-logins.d.cts +13 -0
  28. package/dist/auth/profile/linked-logins.d.ts +13 -0
  29. package/dist/auth/profile/linked-logins.js +150 -0
  30. package/dist/auth/profile/linked-logins.js.map +1 -0
  31. package/dist/auth/profile/passkey.cjs +109 -0
  32. package/dist/auth/profile/passkey.cjs.map +1 -0
  33. package/dist/auth/profile/passkey.d.cts +9 -0
  34. package/dist/auth/profile/passkey.d.ts +9 -0
  35. package/dist/auth/profile/passkey.js +75 -0
  36. package/dist/auth/profile/passkey.js.map +1 -0
  37. package/dist/auth/profile/totp.cjs +147 -0
  38. package/dist/auth/profile/totp.cjs.map +1 -0
  39. package/dist/auth/profile/totp.d.cts +9 -0
  40. package/dist/auth/profile/totp.d.ts +9 -0
  41. package/dist/auth/profile/totp.js +131 -0
  42. package/dist/auth/profile/totp.js.map +1 -0
  43. package/dist/auth/utils.cjs +42 -0
  44. package/dist/auth/utils.cjs.map +1 -0
  45. package/dist/auth/utils.d.cts +4 -0
  46. package/dist/auth/utils.d.ts +4 -0
  47. package/dist/auth/utils.js +17 -0
  48. package/dist/auth/utils.js.map +1 -0
  49. package/dist/components/page-guard.d.cts +2 -2
  50. package/dist/components/page-guard.d.ts +2 -2
  51. package/dist/index.cjs +2 -0
  52. package/dist/index.cjs.map +1 -1
  53. package/dist/index.d.cts +9 -1
  54. package/dist/index.d.ts +9 -1
  55. package/dist/index.js +1 -0
  56. package/dist/index.js.map +1 -1
  57. package/dist/theme.cjs +12 -4
  58. package/dist/theme.cjs.map +1 -1
  59. package/dist/theme.d.cts +7 -4
  60. package/dist/theme.d.ts +7 -4
  61. package/dist/theme.js +12 -4
  62. package/dist/theme.js.map +1 -1
  63. package/package.json +7 -1
@@ -0,0 +1,245 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var login_exports = {};
30
+ __export(login_exports, {
31
+ LoginPage: () => LoginPage
32
+ });
33
+ module.exports = __toCommonJS(login_exports);
34
+ var import_jsx_runtime = require("react/jsx-runtime");
35
+ var import_react = require("react");
36
+ var import_core = require("@mantine/core");
37
+ var import_form = require("@mantine/form");
38
+ var import_notifications = require("@mantine/notifications");
39
+ var MoghAuth = __toESM(require("mogh_auth_client"), 1);
40
+ var import_lucide_react = require("lucide-react");
41
+ var import_react2 = require("react");
42
+ var import_header = __toESM(require("./header"), 1);
43
+ var import__ = require("../..");
44
+ function LoginPage({
45
+ passkeyIsPending: _passkeyIsPending,
46
+ totpIsPending: _totpIsPending,
47
+ onLogin,
48
+ exampleConfigLink,
49
+ ...branding
50
+ }) {
51
+ const options = (0, import__.useLoginOptions)().data;
52
+ const [passkeyIsPending, setPasskeyPending] = (0, import_react2.useState)(
53
+ _passkeyIsPending ?? false
54
+ );
55
+ const [totpIsPending, setTotpPending] = (0, import_react2.useState)(_totpIsPending ?? false);
56
+ const secondFactorPending = passkeyIsPending || totpIsPending;
57
+ const maybeNavigate = location.pathname.startsWith("/login") ? () => location.replace(
58
+ new URLSearchParams(location.search).get("backto") ?? "/"
59
+ ) : void 0;
60
+ const onSuccess = ({ jwt }) => {
61
+ MoghAuth.LOGIN_TOKENS.add_and_change(jwt);
62
+ onLogin?.();
63
+ maybeNavigate?.();
64
+ };
65
+ const secondFactorOnSuccess = (res) => {
66
+ (0, import__.sanitizeQuery)();
67
+ onSuccess(res);
68
+ };
69
+ const { mutate: signup, isPending: signupPending } = (0, import__.useLogin)(
70
+ "SignUpLocalUser",
71
+ {
72
+ onSuccess
73
+ }
74
+ );
75
+ const { mutate: completePasskeyLogin } = (0, import__.useLogin)("CompletePasskeyLogin", {
76
+ onSuccess: secondFactorOnSuccess
77
+ });
78
+ const { mutate: completeTotpLogin, isPending: totpPending } = (0, import__.useLogin)(
79
+ "CompleteTotpLogin",
80
+ {
81
+ onSuccess: secondFactorOnSuccess
82
+ }
83
+ );
84
+ const { mutate: login, isPending: loginPending } = (0, import__.useLogin)(
85
+ "LoginLocalUser",
86
+ {
87
+ onSuccess: ({ type, data }) => {
88
+ switch (type) {
89
+ case "Jwt":
90
+ return onSuccess(data);
91
+ case "Passkey":
92
+ setPasskeyPending(true);
93
+ return navigator.credentials.get(MoghAuth.Passkey.prepareRequestChallengeResponse(data)).then((credential) => completePasskeyLogin({ credential })).catch((e) => {
94
+ console.error(e);
95
+ import_notifications.notifications.show({
96
+ title: "Failed to select passkey",
97
+ message: "See console for details",
98
+ color: "red"
99
+ });
100
+ });
101
+ case "Totp":
102
+ return setTotpPending(true);
103
+ }
104
+ }
105
+ }
106
+ );
107
+ const noAuthConfigured = options !== void 0 && Object.values(options).every((value) => value === false);
108
+ const showSignUp = options !== void 0 && !options.registration_disabled;
109
+ const localForm = (0, import_form.useForm)({
110
+ mode: "uncontrolled",
111
+ initialValues: {
112
+ username: "",
113
+ password: ""
114
+ },
115
+ validate: {
116
+ username: (username) => username.length ? null : "Username cannot be empty",
117
+ password: (password) => password.length ? null : "Password cannot be empty"
118
+ }
119
+ });
120
+ const totpForm = (0, import_form.useForm)({
121
+ mode: "uncontrolled",
122
+ initialValues: {
123
+ code: ""
124
+ },
125
+ validate: {
126
+ code: (code) => code.length === 6 ? null : "Code should be 6 digits"
127
+ }
128
+ });
129
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_core.Center, { h: "80vh", children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
130
+ import_core.Fieldset,
131
+ {
132
+ legend: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
133
+ import_header.default,
134
+ {
135
+ secondFactorPending,
136
+ ...branding
137
+ }
138
+ ),
139
+ component: "form",
140
+ onSubmit: totpIsPending ? totpForm.onSubmit((form) => completeTotpLogin(form)) : localForm.onSubmit((form) => login(form)),
141
+ style: { display: "flex", flexDirection: "column", gap: "1rem" },
142
+ miw: { base: "95vw", xs: "530px" },
143
+ maw: "95vw",
144
+ children: [
145
+ options?.local && !secondFactorPending && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
146
+ /* @__PURE__ */ (0, import_react.createElement)(
147
+ import_core.TextInput,
148
+ {
149
+ ...localForm.getInputProps("username"),
150
+ autoFocus: true,
151
+ label: "Username",
152
+ placeholder: "Enter username",
153
+ autoComplete: "username",
154
+ autoCapitalize: "off",
155
+ autoCorrect: "off",
156
+ key: localForm.key("username")
157
+ }
158
+ ),
159
+ /* @__PURE__ */ (0, import_react.createElement)(
160
+ import_core.PasswordInput,
161
+ {
162
+ ...localForm.getInputProps("password"),
163
+ label: "Password",
164
+ placeholder: "Enter password",
165
+ autoComplete: "password",
166
+ autoCapitalize: "off",
167
+ autoCorrect: "off",
168
+ key: localForm.key("password")
169
+ }
170
+ ),
171
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_core.Group, { mt: "sm", justify: "end", children: [
172
+ showSignUp && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
173
+ import_core.Button,
174
+ {
175
+ variant: "outline",
176
+ w: 110,
177
+ onClick: localForm.onSubmit((form) => signup(form)),
178
+ loading: signupPending,
179
+ children: "Sign Up"
180
+ }
181
+ ),
182
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_core.Button, { w: 110, type: "submit", loading: loginPending, children: "Log In" })
183
+ ] })
184
+ ] }),
185
+ passkeyIsPending && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_core.Group, { justify: "center", my: "lg", children: [
186
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.KeyRound, { size: "1.5rem" }),
187
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_core.Text, { size: "lg", children: "Provide your passkey to finish login..." }),
188
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_core.Loader, {})
189
+ ] }),
190
+ totpIsPending && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
191
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
192
+ import_core.TextInput,
193
+ {
194
+ ...totpForm.getInputProps("code"),
195
+ label: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_core.Group, { gap: "sm", children: [
196
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.KeyRound, { size: "1rem" }),
197
+ "2FA Code"
198
+ ] }),
199
+ autoComplete: "code",
200
+ autoCapitalize: "none",
201
+ autoCorrect: "off",
202
+ autoFocus: true
203
+ }
204
+ ),
205
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_core.Group, { justify: "end", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
206
+ import_core.Button,
207
+ {
208
+ w: 110,
209
+ variant: "filled",
210
+ type: "submit",
211
+ loading: totpPending,
212
+ children: "Log In"
213
+ }
214
+ ) })
215
+ ] }),
216
+ noAuthConfigured && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_core.Group, { my: "lg", children: [
217
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.AlertTriangle, { size: "2rem" }),
218
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_core.Text, { children: [
219
+ "No login methods have been configured. ",
220
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("br", {}),
221
+ "See the",
222
+ " ",
223
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
224
+ "a",
225
+ {
226
+ href: exampleConfigLink,
227
+ target: "_blank",
228
+ rel: "noreferrer",
229
+ className: "hover-underline",
230
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("b", { children: "example config" })
231
+ }
232
+ ),
233
+ " ",
234
+ "for information on configuring auth."
235
+ ] })
236
+ ] })
237
+ ]
238
+ }
239
+ ) });
240
+ }
241
+ // Annotate the CommonJS export names for ESM import in node:
242
+ 0 && (module.exports = {
243
+ LoginPage
244
+ });
245
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/auth/login/index.tsx"],"sourcesContent":["import {\n Button,\n Center,\n Fieldset,\n Group,\n Loader,\n PasswordInput,\n Text,\n TextInput,\n} from \"@mantine/core\";\nimport { useForm } from \"@mantine/form\";\nimport { notifications } from \"@mantine/notifications\";\nimport * as MoghAuth from \"mogh_auth_client\";\nimport { AlertTriangle, KeyRound } from \"lucide-react\";\nimport { useState } from \"react\";\nimport LoginHeader from \"./header\";\nimport { sanitizeQuery, useLogin, useLoginOptions } from \"../..\";\n\nexport interface LoginBrandingProps {\n appName: string;\n iconLink: string;\n iconLinkAlt: string;\n}\n\nexport function LoginPage({\n passkeyIsPending: _passkeyIsPending,\n totpIsPending: _totpIsPending,\n onLogin,\n exampleConfigLink,\n ...branding\n}: {\n passkeyIsPending?: boolean;\n totpIsPending?: boolean;\n onLogin?: () => void;\n exampleConfigLink: string;\n} & LoginBrandingProps) {\n const options = useLoginOptions().data;\n const [passkeyIsPending, setPasskeyPending] = useState(\n _passkeyIsPending ?? false,\n );\n const [totpIsPending, setTotpPending] = useState(_totpIsPending ?? false);\n const secondFactorPending = passkeyIsPending || totpIsPending;\n\n // If signing in another user, need to redirect away from /login manually\n const maybeNavigate = location.pathname.startsWith(\"/login\")\n ? () =>\n location.replace(\n new URLSearchParams(location.search).get(\"backto\") ?? \"/\",\n )\n : undefined;\n\n const onSuccess = ({ jwt }: MoghAuth.Types.JwtResponse) => {\n MoghAuth.LOGIN_TOKENS.add_and_change(jwt);\n onLogin?.();\n maybeNavigate?.();\n };\n\n const secondFactorOnSuccess = (res: MoghAuth.Types.JwtResponse) => {\n sanitizeQuery();\n onSuccess(res);\n };\n\n const { mutate: signup, isPending: signupPending } = useLogin(\n \"SignUpLocalUser\",\n {\n onSuccess,\n },\n );\n\n const { mutate: completePasskeyLogin } = useLogin(\"CompletePasskeyLogin\", {\n onSuccess: secondFactorOnSuccess,\n });\n\n const { mutate: completeTotpLogin, isPending: totpPending } = useLogin(\n \"CompleteTotpLogin\",\n {\n onSuccess: secondFactorOnSuccess,\n },\n );\n\n const { mutate: login, isPending: loginPending } = useLogin(\n \"LoginLocalUser\",\n {\n onSuccess: ({ type, data }) => {\n switch (type) {\n case \"Jwt\":\n return onSuccess(data);\n case \"Passkey\":\n setPasskeyPending(true);\n return navigator.credentials\n .get(MoghAuth.Passkey.prepareRequestChallengeResponse(data))\n .then((credential) => completePasskeyLogin({ credential }))\n .catch((e) => {\n console.error(e);\n notifications.show({\n title: \"Failed to select passkey\",\n message: \"See console for details\",\n color: \"red\",\n });\n });\n case \"Totp\":\n return setTotpPending(true);\n }\n },\n },\n );\n\n const noAuthConfigured =\n options !== undefined &&\n Object.values(options).every((value) => value === false);\n\n const showSignUp = options !== undefined && !options.registration_disabled;\n\n const localForm = useForm({\n mode: \"uncontrolled\",\n initialValues: {\n username: \"\",\n password: \"\",\n },\n validate: {\n username: (username) =>\n username.length ? null : \"Username cannot be empty\",\n password: (password) =>\n password.length ? null : \"Password cannot be empty\",\n },\n });\n\n const totpForm = useForm({\n mode: \"uncontrolled\",\n initialValues: {\n code: \"\",\n },\n validate: {\n code: (code) => (code.length === 6 ? null : \"Code should be 6 digits\"),\n },\n });\n\n return (\n <Center h=\"80vh\">\n <Fieldset\n legend={\n <LoginHeader\n secondFactorPending={secondFactorPending}\n {...branding}\n />\n }\n component=\"form\"\n onSubmit={\n totpIsPending\n ? totpForm.onSubmit((form) => completeTotpLogin(form))\n : (localForm.onSubmit((form) => login(form)) as any)\n }\n style={{ display: \"flex\", flexDirection: \"column\", gap: \"1rem\" }}\n miw={{ base: \"95vw\", xs: \"530px\" }}\n maw=\"95vw\"\n >\n {options?.local && !secondFactorPending && (\n <>\n <TextInput\n {...localForm.getInputProps(\"username\")}\n autoFocus\n label=\"Username\"\n placeholder=\"Enter username\"\n autoComplete=\"username\"\n autoCapitalize=\"off\"\n autoCorrect=\"off\"\n key={localForm.key(\"username\")}\n />\n <PasswordInput\n {...localForm.getInputProps(\"password\")}\n label=\"Password\"\n placeholder=\"Enter password\"\n autoComplete=\"password\"\n autoCapitalize=\"off\"\n autoCorrect=\"off\"\n key={localForm.key(\"password\")}\n />\n <Group mt=\"sm\" justify=\"end\">\n {showSignUp && (\n <Button\n variant=\"outline\"\n w={110}\n onClick={localForm.onSubmit((form) => signup(form)) as any}\n loading={signupPending}\n >\n Sign Up\n </Button>\n )}\n <Button w={110} type=\"submit\" loading={loginPending}>\n Log In\n </Button>\n </Group>\n </>\n )}\n\n {passkeyIsPending && (\n <Group justify=\"center\" my=\"lg\">\n <KeyRound size=\"1.5rem\" />\n <Text size=\"lg\">Provide your passkey to finish login...</Text>\n <Loader />\n </Group>\n )}\n\n {totpIsPending && (\n <>\n <TextInput\n {...totpForm.getInputProps(\"code\")}\n label={\n <Group gap=\"sm\">\n <KeyRound size=\"1rem\" />\n 2FA Code\n </Group>\n }\n autoComplete=\"code\"\n autoCapitalize=\"none\"\n autoCorrect=\"off\"\n autoFocus\n />\n <Group justify=\"end\">\n <Button\n w={110}\n variant=\"filled\"\n type=\"submit\"\n loading={totpPending}\n >\n Log In\n </Button>\n </Group>\n </>\n )}\n\n {noAuthConfigured && (\n <Group my=\"lg\">\n <AlertTriangle size=\"2rem\" />\n <Text>\n No login methods have been configured. <br />\n See the{\" \"}\n <a\n href={exampleConfigLink}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"hover-underline\"\n >\n <b>example config</b>\n </a>{\" \"}\n for information on configuring auth.\n </Text>\n </Group>\n )}\n </Fieldset>\n </Center>\n );\n}\n"],"mappings":"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","names":["import_react","LoginHeader"]}
@@ -0,0 +1,15 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ interface LoginBrandingProps {
4
+ appName: string;
5
+ iconLink: string;
6
+ iconLinkAlt: string;
7
+ }
8
+ declare function LoginPage({ passkeyIsPending: _passkeyIsPending, totpIsPending: _totpIsPending, onLogin, exampleConfigLink, ...branding }: {
9
+ passkeyIsPending?: boolean;
10
+ totpIsPending?: boolean;
11
+ onLogin?: () => void;
12
+ exampleConfigLink: string;
13
+ } & LoginBrandingProps): react_jsx_runtime.JSX.Element;
14
+
15
+ export { type LoginBrandingProps, LoginPage };
@@ -0,0 +1,15 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ interface LoginBrandingProps {
4
+ appName: string;
5
+ iconLink: string;
6
+ iconLinkAlt: string;
7
+ }
8
+ declare function LoginPage({ passkeyIsPending: _passkeyIsPending, totpIsPending: _totpIsPending, onLogin, exampleConfigLink, ...branding }: {
9
+ passkeyIsPending?: boolean;
10
+ totpIsPending?: boolean;
11
+ onLogin?: () => void;
12
+ exampleConfigLink: string;
13
+ } & LoginBrandingProps): react_jsx_runtime.JSX.Element;
14
+
15
+ export { type LoginBrandingProps, LoginPage };
@@ -0,0 +1,220 @@
1
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
2
+ import { createElement } from "react";
3
+ import {
4
+ Button,
5
+ Center,
6
+ Fieldset,
7
+ Group,
8
+ Loader,
9
+ PasswordInput,
10
+ Text,
11
+ TextInput
12
+ } from "@mantine/core";
13
+ import { useForm } from "@mantine/form";
14
+ import { notifications } from "@mantine/notifications";
15
+ import * as MoghAuth from "mogh_auth_client";
16
+ import { AlertTriangle, KeyRound } from "lucide-react";
17
+ import { useState } from "react";
18
+ import LoginHeader from "./header";
19
+ import { sanitizeQuery, useLogin, useLoginOptions } from "../..";
20
+ function LoginPage({
21
+ passkeyIsPending: _passkeyIsPending,
22
+ totpIsPending: _totpIsPending,
23
+ onLogin,
24
+ exampleConfigLink,
25
+ ...branding
26
+ }) {
27
+ const options = useLoginOptions().data;
28
+ const [passkeyIsPending, setPasskeyPending] = useState(
29
+ _passkeyIsPending ?? false
30
+ );
31
+ const [totpIsPending, setTotpPending] = useState(_totpIsPending ?? false);
32
+ const secondFactorPending = passkeyIsPending || totpIsPending;
33
+ const maybeNavigate = location.pathname.startsWith("/login") ? () => location.replace(
34
+ new URLSearchParams(location.search).get("backto") ?? "/"
35
+ ) : void 0;
36
+ const onSuccess = ({ jwt }) => {
37
+ MoghAuth.LOGIN_TOKENS.add_and_change(jwt);
38
+ onLogin?.();
39
+ maybeNavigate?.();
40
+ };
41
+ const secondFactorOnSuccess = (res) => {
42
+ sanitizeQuery();
43
+ onSuccess(res);
44
+ };
45
+ const { mutate: signup, isPending: signupPending } = useLogin(
46
+ "SignUpLocalUser",
47
+ {
48
+ onSuccess
49
+ }
50
+ );
51
+ const { mutate: completePasskeyLogin } = useLogin("CompletePasskeyLogin", {
52
+ onSuccess: secondFactorOnSuccess
53
+ });
54
+ const { mutate: completeTotpLogin, isPending: totpPending } = useLogin(
55
+ "CompleteTotpLogin",
56
+ {
57
+ onSuccess: secondFactorOnSuccess
58
+ }
59
+ );
60
+ const { mutate: login, isPending: loginPending } = useLogin(
61
+ "LoginLocalUser",
62
+ {
63
+ onSuccess: ({ type, data }) => {
64
+ switch (type) {
65
+ case "Jwt":
66
+ return onSuccess(data);
67
+ case "Passkey":
68
+ setPasskeyPending(true);
69
+ return navigator.credentials.get(MoghAuth.Passkey.prepareRequestChallengeResponse(data)).then((credential) => completePasskeyLogin({ credential })).catch((e) => {
70
+ console.error(e);
71
+ notifications.show({
72
+ title: "Failed to select passkey",
73
+ message: "See console for details",
74
+ color: "red"
75
+ });
76
+ });
77
+ case "Totp":
78
+ return setTotpPending(true);
79
+ }
80
+ }
81
+ }
82
+ );
83
+ const noAuthConfigured = options !== void 0 && Object.values(options).every((value) => value === false);
84
+ const showSignUp = options !== void 0 && !options.registration_disabled;
85
+ const localForm = useForm({
86
+ mode: "uncontrolled",
87
+ initialValues: {
88
+ username: "",
89
+ password: ""
90
+ },
91
+ validate: {
92
+ username: (username) => username.length ? null : "Username cannot be empty",
93
+ password: (password) => password.length ? null : "Password cannot be empty"
94
+ }
95
+ });
96
+ const totpForm = useForm({
97
+ mode: "uncontrolled",
98
+ initialValues: {
99
+ code: ""
100
+ },
101
+ validate: {
102
+ code: (code) => code.length === 6 ? null : "Code should be 6 digits"
103
+ }
104
+ });
105
+ return /* @__PURE__ */ jsx(Center, { h: "80vh", children: /* @__PURE__ */ jsxs(
106
+ Fieldset,
107
+ {
108
+ legend: /* @__PURE__ */ jsx(
109
+ LoginHeader,
110
+ {
111
+ secondFactorPending,
112
+ ...branding
113
+ }
114
+ ),
115
+ component: "form",
116
+ onSubmit: totpIsPending ? totpForm.onSubmit((form) => completeTotpLogin(form)) : localForm.onSubmit((form) => login(form)),
117
+ style: { display: "flex", flexDirection: "column", gap: "1rem" },
118
+ miw: { base: "95vw", xs: "530px" },
119
+ maw: "95vw",
120
+ children: [
121
+ options?.local && !secondFactorPending && /* @__PURE__ */ jsxs(Fragment, { children: [
122
+ /* @__PURE__ */ createElement(
123
+ TextInput,
124
+ {
125
+ ...localForm.getInputProps("username"),
126
+ autoFocus: true,
127
+ label: "Username",
128
+ placeholder: "Enter username",
129
+ autoComplete: "username",
130
+ autoCapitalize: "off",
131
+ autoCorrect: "off",
132
+ key: localForm.key("username")
133
+ }
134
+ ),
135
+ /* @__PURE__ */ createElement(
136
+ PasswordInput,
137
+ {
138
+ ...localForm.getInputProps("password"),
139
+ label: "Password",
140
+ placeholder: "Enter password",
141
+ autoComplete: "password",
142
+ autoCapitalize: "off",
143
+ autoCorrect: "off",
144
+ key: localForm.key("password")
145
+ }
146
+ ),
147
+ /* @__PURE__ */ jsxs(Group, { mt: "sm", justify: "end", children: [
148
+ showSignUp && /* @__PURE__ */ jsx(
149
+ Button,
150
+ {
151
+ variant: "outline",
152
+ w: 110,
153
+ onClick: localForm.onSubmit((form) => signup(form)),
154
+ loading: signupPending,
155
+ children: "Sign Up"
156
+ }
157
+ ),
158
+ /* @__PURE__ */ jsx(Button, { w: 110, type: "submit", loading: loginPending, children: "Log In" })
159
+ ] })
160
+ ] }),
161
+ passkeyIsPending && /* @__PURE__ */ jsxs(Group, { justify: "center", my: "lg", children: [
162
+ /* @__PURE__ */ jsx(KeyRound, { size: "1.5rem" }),
163
+ /* @__PURE__ */ jsx(Text, { size: "lg", children: "Provide your passkey to finish login..." }),
164
+ /* @__PURE__ */ jsx(Loader, {})
165
+ ] }),
166
+ totpIsPending && /* @__PURE__ */ jsxs(Fragment, { children: [
167
+ /* @__PURE__ */ jsx(
168
+ TextInput,
169
+ {
170
+ ...totpForm.getInputProps("code"),
171
+ label: /* @__PURE__ */ jsxs(Group, { gap: "sm", children: [
172
+ /* @__PURE__ */ jsx(KeyRound, { size: "1rem" }),
173
+ "2FA Code"
174
+ ] }),
175
+ autoComplete: "code",
176
+ autoCapitalize: "none",
177
+ autoCorrect: "off",
178
+ autoFocus: true
179
+ }
180
+ ),
181
+ /* @__PURE__ */ jsx(Group, { justify: "end", children: /* @__PURE__ */ jsx(
182
+ Button,
183
+ {
184
+ w: 110,
185
+ variant: "filled",
186
+ type: "submit",
187
+ loading: totpPending,
188
+ children: "Log In"
189
+ }
190
+ ) })
191
+ ] }),
192
+ noAuthConfigured && /* @__PURE__ */ jsxs(Group, { my: "lg", children: [
193
+ /* @__PURE__ */ jsx(AlertTriangle, { size: "2rem" }),
194
+ /* @__PURE__ */ jsxs(Text, { children: [
195
+ "No login methods have been configured. ",
196
+ /* @__PURE__ */ jsx("br", {}),
197
+ "See the",
198
+ " ",
199
+ /* @__PURE__ */ jsx(
200
+ "a",
201
+ {
202
+ href: exampleConfigLink,
203
+ target: "_blank",
204
+ rel: "noreferrer",
205
+ className: "hover-underline",
206
+ children: /* @__PURE__ */ jsx("b", { children: "example config" })
207
+ }
208
+ ),
209
+ " ",
210
+ "for information on configuring auth."
211
+ ] })
212
+ ] })
213
+ ]
214
+ }
215
+ ) });
216
+ }
217
+ export {
218
+ LoginPage
219
+ };
220
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/auth/login/index.tsx"],"sourcesContent":["import {\n Button,\n Center,\n Fieldset,\n Group,\n Loader,\n PasswordInput,\n Text,\n TextInput,\n} from \"@mantine/core\";\nimport { useForm } from \"@mantine/form\";\nimport { notifications } from \"@mantine/notifications\";\nimport * as MoghAuth from \"mogh_auth_client\";\nimport { AlertTriangle, KeyRound } from \"lucide-react\";\nimport { useState } from \"react\";\nimport LoginHeader from \"./header\";\nimport { sanitizeQuery, useLogin, useLoginOptions } from \"../..\";\n\nexport interface LoginBrandingProps {\n appName: string;\n iconLink: string;\n iconLinkAlt: string;\n}\n\nexport function LoginPage({\n passkeyIsPending: _passkeyIsPending,\n totpIsPending: _totpIsPending,\n onLogin,\n exampleConfigLink,\n ...branding\n}: {\n passkeyIsPending?: boolean;\n totpIsPending?: boolean;\n onLogin?: () => void;\n exampleConfigLink: string;\n} & LoginBrandingProps) {\n const options = useLoginOptions().data;\n const [passkeyIsPending, setPasskeyPending] = useState(\n _passkeyIsPending ?? false,\n );\n const [totpIsPending, setTotpPending] = useState(_totpIsPending ?? false);\n const secondFactorPending = passkeyIsPending || totpIsPending;\n\n // If signing in another user, need to redirect away from /login manually\n const maybeNavigate = location.pathname.startsWith(\"/login\")\n ? () =>\n location.replace(\n new URLSearchParams(location.search).get(\"backto\") ?? \"/\",\n )\n : undefined;\n\n const onSuccess = ({ jwt }: MoghAuth.Types.JwtResponse) => {\n MoghAuth.LOGIN_TOKENS.add_and_change(jwt);\n onLogin?.();\n maybeNavigate?.();\n };\n\n const secondFactorOnSuccess = (res: MoghAuth.Types.JwtResponse) => {\n sanitizeQuery();\n onSuccess(res);\n };\n\n const { mutate: signup, isPending: signupPending } = useLogin(\n \"SignUpLocalUser\",\n {\n onSuccess,\n },\n );\n\n const { mutate: completePasskeyLogin } = useLogin(\"CompletePasskeyLogin\", {\n onSuccess: secondFactorOnSuccess,\n });\n\n const { mutate: completeTotpLogin, isPending: totpPending } = useLogin(\n \"CompleteTotpLogin\",\n {\n onSuccess: secondFactorOnSuccess,\n },\n );\n\n const { mutate: login, isPending: loginPending } = useLogin(\n \"LoginLocalUser\",\n {\n onSuccess: ({ type, data }) => {\n switch (type) {\n case \"Jwt\":\n return onSuccess(data);\n case \"Passkey\":\n setPasskeyPending(true);\n return navigator.credentials\n .get(MoghAuth.Passkey.prepareRequestChallengeResponse(data))\n .then((credential) => completePasskeyLogin({ credential }))\n .catch((e) => {\n console.error(e);\n notifications.show({\n title: \"Failed to select passkey\",\n message: \"See console for details\",\n color: \"red\",\n });\n });\n case \"Totp\":\n return setTotpPending(true);\n }\n },\n },\n );\n\n const noAuthConfigured =\n options !== undefined &&\n Object.values(options).every((value) => value === false);\n\n const showSignUp = options !== undefined && !options.registration_disabled;\n\n const localForm = useForm({\n mode: \"uncontrolled\",\n initialValues: {\n username: \"\",\n password: \"\",\n },\n validate: {\n username: (username) =>\n username.length ? null : \"Username cannot be empty\",\n password: (password) =>\n password.length ? null : \"Password cannot be empty\",\n },\n });\n\n const totpForm = useForm({\n mode: \"uncontrolled\",\n initialValues: {\n code: \"\",\n },\n validate: {\n code: (code) => (code.length === 6 ? null : \"Code should be 6 digits\"),\n },\n });\n\n return (\n <Center h=\"80vh\">\n <Fieldset\n legend={\n <LoginHeader\n secondFactorPending={secondFactorPending}\n {...branding}\n />\n }\n component=\"form\"\n onSubmit={\n totpIsPending\n ? totpForm.onSubmit((form) => completeTotpLogin(form))\n : (localForm.onSubmit((form) => login(form)) as any)\n }\n style={{ display: \"flex\", flexDirection: \"column\", gap: \"1rem\" }}\n miw={{ base: \"95vw\", xs: \"530px\" }}\n maw=\"95vw\"\n >\n {options?.local && !secondFactorPending && (\n <>\n <TextInput\n {...localForm.getInputProps(\"username\")}\n autoFocus\n label=\"Username\"\n placeholder=\"Enter username\"\n autoComplete=\"username\"\n autoCapitalize=\"off\"\n autoCorrect=\"off\"\n key={localForm.key(\"username\")}\n />\n <PasswordInput\n {...localForm.getInputProps(\"password\")}\n label=\"Password\"\n placeholder=\"Enter password\"\n autoComplete=\"password\"\n autoCapitalize=\"off\"\n autoCorrect=\"off\"\n key={localForm.key(\"password\")}\n />\n <Group mt=\"sm\" justify=\"end\">\n {showSignUp && (\n <Button\n variant=\"outline\"\n w={110}\n onClick={localForm.onSubmit((form) => signup(form)) as any}\n loading={signupPending}\n >\n Sign Up\n </Button>\n )}\n <Button w={110} type=\"submit\" loading={loginPending}>\n Log In\n </Button>\n </Group>\n </>\n )}\n\n {passkeyIsPending && (\n <Group justify=\"center\" my=\"lg\">\n <KeyRound size=\"1.5rem\" />\n <Text size=\"lg\">Provide your passkey to finish login...</Text>\n <Loader />\n </Group>\n )}\n\n {totpIsPending && (\n <>\n <TextInput\n {...totpForm.getInputProps(\"code\")}\n label={\n <Group gap=\"sm\">\n <KeyRound size=\"1rem\" />\n 2FA Code\n </Group>\n }\n autoComplete=\"code\"\n autoCapitalize=\"none\"\n autoCorrect=\"off\"\n autoFocus\n />\n <Group justify=\"end\">\n <Button\n w={110}\n variant=\"filled\"\n type=\"submit\"\n loading={totpPending}\n >\n Log In\n </Button>\n </Group>\n </>\n )}\n\n {noAuthConfigured && (\n <Group my=\"lg\">\n <AlertTriangle size=\"2rem\" />\n <Text>\n No login methods have been configured. <br />\n See the{\" \"}\n <a\n href={exampleConfigLink}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"hover-underline\"\n >\n <b>example config</b>\n </a>{\" \"}\n for information on configuring auth.\n </Text>\n </Group>\n )}\n </Fieldset>\n </Center>\n );\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __copyProps = (to, from, except, desc) => {
7
+ if (from && typeof from === "object" || typeof from === "function") {
8
+ for (let key of __getOwnPropNames(from))
9
+ if (!__hasOwnProp.call(to, key) && key !== except)
10
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
11
+ }
12
+ return to;
13
+ };
14
+ var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
15
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
16
+ var profile_exports = {};
17
+ module.exports = __toCommonJS(profile_exports);
18
+ __reExport(profile_exports, require("./linked-logins"), module.exports);
19
+ __reExport(profile_exports, require("./passkey"), module.exports);
20
+ __reExport(profile_exports, require("./totp"), module.exports);
21
+ // Annotate the CommonJS export names for ESM import in node:
22
+ 0 && (module.exports = {
23
+ ...require("./linked-logins"),
24
+ ...require("./passkey"),
25
+ ...require("./totp")
26
+ });
27
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/auth/profile/index.ts"],"sourcesContent":["export * from \"./linked-logins\"\nexport * from \"./passkey\"\nexport * from \"./totp\""],"mappings":";;;;;;;;;;;;;;;AAAA;AAAA;AAAA,4BAAc,4BAAd;AACA,4BAAc,sBADd;AAEA,4BAAc,mBAFd;","names":[]}
@@ -0,0 +1,5 @@
1
+ export { LinkedLogins } from './linked-logins.cjs';
2
+ export { EnrollPasskey } from './passkey.cjs';
3
+ export { EnrollTotp } from './totp.cjs';
4
+ import 'react/jsx-runtime';
5
+ import 'mogh_auth_client';
@@ -0,0 +1,5 @@
1
+ export { LinkedLogins } from './linked-logins.js';
2
+ export { EnrollPasskey } from './passkey.js';
3
+ export { EnrollTotp } from './totp.js';
4
+ import 'react/jsx-runtime';
5
+ import 'mogh_auth_client';
@@ -0,0 +1,4 @@
1
+ export * from "./linked-logins";
2
+ export * from "./passkey";
3
+ export * from "./totp";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/auth/profile/index.ts"],"sourcesContent":["export * from \"./linked-logins\"\nexport * from \"./passkey\"\nexport * from \"./totp\""],"mappings":"AAAA,cAAc;AACd,cAAc;AACd,cAAc;","names":[]}