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,177 @@
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 linked_logins_exports = {};
30
+ __export(linked_logins_exports, {
31
+ LinkedLogins: () => LinkedLogins
32
+ });
33
+ module.exports = __toCommonJS(linked_logins_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_notifications = require("@mantine/notifications");
38
+ var import__ = require("../..");
39
+ var MoghAuth = __toESM(require("mogh_auth_client"), 1);
40
+ var import_lucide_react = require("lucide-react");
41
+ function useLinkWithExternalLogin() {
42
+ const { mutateAsync } = (0, import__.useManageAuth)("BeginExternalLoginLink");
43
+ return (provider) => mutateAsync({}).then(
44
+ () => location.replace(`${import__.AUTH_URL}/${provider.toLowerCase()}/link`)
45
+ );
46
+ }
47
+ function LinkedLogins({
48
+ refetchUser,
49
+ passwordSet,
50
+ oidcLinkedId,
51
+ githubLinkedId,
52
+ googleLinkedId,
53
+ extraProviderFilter
54
+ }) {
55
+ const options = (0, import__.useLoginOptions)().data;
56
+ const loginProviders = (0, import_react.useMemo)(() => {
57
+ return [
58
+ {
59
+ provider: MoghAuth.Types.LoginProvider.Local,
60
+ enabled: !!options?.local,
61
+ data: passwordSet ? "########" : void 0
62
+ },
63
+ {
64
+ provider: MoghAuth.Types.LoginProvider.Oidc,
65
+ enabled: !!options?.oidc,
66
+ data: oidcLinkedId
67
+ },
68
+ {
69
+ provider: MoghAuth.Types.LoginProvider.Github,
70
+ enabled: !!options?.github,
71
+ data: githubLinkedId
72
+ },
73
+ {
74
+ provider: MoghAuth.Types.LoginProvider.Google,
75
+ enabled: !!options?.google,
76
+ data: googleLinkedId
77
+ }
78
+ ].filter(
79
+ ({ enabled, provider }) => enabled && (extraProviderFilter?.(provider) ?? true)
80
+ );
81
+ }, [passwordSet, oidcLinkedId, githubLinkedId, googleLinkedId, options]);
82
+ const linkWithExternalLogin = useLinkWithExternalLogin();
83
+ const { mutateAsync: unlink } = (0, import__.useManageAuth)("UnlinkLogin", {
84
+ onSuccess: () => {
85
+ import_notifications.notifications.show({ message: "Unlinked login." });
86
+ refetchUser();
87
+ }
88
+ });
89
+ if (!loginProviders.length) {
90
+ return null;
91
+ }
92
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
93
+ import__.Section,
94
+ {
95
+ title: "Providers",
96
+ titleFz: "h3",
97
+ icon: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.CloudCog, { size: "1.2rem" }),
98
+ withBorder: true,
99
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
100
+ import__.DataTable,
101
+ {
102
+ noBorder: true,
103
+ tableKey: "login-providers-v1",
104
+ data: loginProviders,
105
+ columns: [
106
+ {
107
+ header: "Provider",
108
+ accessorKey: "provider",
109
+ cell: ({ row }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_core.Text, { fw: "bold", children: row.original.provider })
110
+ },
111
+ {
112
+ header: "Linked",
113
+ cell: ({
114
+ row: {
115
+ original: { data }
116
+ }
117
+ }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_core.Badge, { color: data ? "green.8" : "red", children: data ? "Linked" : "Unlinked" })
118
+ },
119
+ {
120
+ header: "Data",
121
+ cell: ({
122
+ row: {
123
+ original: { data }
124
+ }
125
+ }) => data && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
126
+ import_core.Text,
127
+ {
128
+ maw: "20vw",
129
+ size: "sm",
130
+ style: {
131
+ overflow: "hidden",
132
+ textOverflow: "ellipsis",
133
+ textWrap: "nowrap"
134
+ },
135
+ children: data
136
+ }
137
+ )
138
+ },
139
+ {
140
+ header: "Link",
141
+ cell: ({
142
+ row: {
143
+ original: { provider, data }
144
+ }
145
+ }) => data ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
146
+ import__.ConfirmModal,
147
+ {
148
+ icon: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Unlink, { size: "1rem" }),
149
+ onConfirm: () => unlink({ provider }),
150
+ confirmText: "Unlink",
151
+ title: "Unlink Login",
152
+ confirmProps: { variant: "filled", color: "red" },
153
+ children: "Unlink"
154
+ }
155
+ ) : provider === "Local" ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, { children: "Set password above to enable." }) : /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
156
+ import_core.Button,
157
+ {
158
+ onClick: () => linkWithExternalLogin(provider),
159
+ leftSection: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Plus, { size: "1rem" }),
160
+ children: [
161
+ "Link ",
162
+ provider
163
+ ]
164
+ }
165
+ )
166
+ }
167
+ ]
168
+ }
169
+ )
170
+ }
171
+ );
172
+ }
173
+ // Annotate the CommonJS export names for ESM import in node:
174
+ 0 && (module.exports = {
175
+ LinkedLogins
176
+ });
177
+ //# sourceMappingURL=linked-logins.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/auth/profile/linked-logins.tsx"],"sourcesContent":["import { useMemo } from \"react\";\nimport { Badge, Button, Text } from \"@mantine/core\";\nimport { notifications } from \"@mantine/notifications\";\nimport {\n AUTH_URL,\n ConfirmModal,\n DataTable,\n Section,\n useLoginOptions,\n useManageAuth,\n} from \"../..\";\nimport * as MoghAuth from \"mogh_auth_client\";\nimport { CloudCog, Plus, Unlink } from \"lucide-react\";\n\nfunction useLinkWithExternalLogin() {\n const { mutateAsync } = useManageAuth(\"BeginExternalLoginLink\");\n return (provider: MoghAuth.Types.ExternalLoginProvider) =>\n mutateAsync({}).then(() =>\n location.replace(`${AUTH_URL}/${provider.toLowerCase()}/link`),\n );\n}\n\nexport function LinkedLogins({\n refetchUser,\n passwordSet,\n oidcLinkedId,\n githubLinkedId,\n googleLinkedId,\n extraProviderFilter,\n}: {\n refetchUser: () => void;\n passwordSet?: boolean;\n oidcLinkedId?: string;\n githubLinkedId?: string;\n googleLinkedId?: string;\n extraProviderFilter?: (provider: MoghAuth.Types.LoginProvider) => boolean;\n}) {\n const options = useLoginOptions().data;\n const loginProviders: Array<{\n provider: MoghAuth.Types.LoginProvider;\n enabled: boolean;\n data: string | undefined;\n }> = useMemo(() => {\n return [\n {\n provider: MoghAuth.Types.LoginProvider.Local,\n enabled: !!options?.local,\n data: passwordSet ? \"########\" : undefined,\n },\n {\n provider: MoghAuth.Types.LoginProvider.Oidc,\n enabled: !!options?.oidc,\n data: oidcLinkedId,\n },\n {\n provider: MoghAuth.Types.LoginProvider.Github,\n enabled: !!options?.github,\n data: githubLinkedId,\n },\n {\n provider: MoghAuth.Types.LoginProvider.Google,\n enabled: !!options?.google,\n data: googleLinkedId,\n },\n ].filter(\n ({ enabled, provider }) =>\n enabled && (extraProviderFilter?.(provider) ?? true),\n );\n }, [passwordSet, oidcLinkedId, githubLinkedId, googleLinkedId, options]);\n const linkWithExternalLogin = useLinkWithExternalLogin();\n const { mutateAsync: unlink } = useManageAuth(\"UnlinkLogin\", {\n onSuccess: () => {\n notifications.show({ message: \"Unlinked login.\" });\n refetchUser();\n },\n });\n\n if (!loginProviders.length) {\n return null;\n }\n\n return (\n <Section\n title=\"Providers\"\n titleFz=\"h3\"\n icon={<CloudCog size=\"1.2rem\" />}\n withBorder\n >\n <DataTable\n noBorder\n tableKey=\"login-providers-v1\"\n data={loginProviders}\n columns={[\n {\n header: \"Provider\",\n accessorKey: \"provider\",\n cell: ({ row }) => <Text fw=\"bold\">{row.original.provider}</Text>,\n },\n {\n header: \"Linked\",\n cell: ({\n row: {\n original: { data },\n },\n }) => (\n <Badge color={data ? \"green.8\" : \"red\"}>\n {data ? \"Linked\" : \"Unlinked\"}\n </Badge>\n ),\n },\n {\n header: \"Data\",\n cell: ({\n row: {\n original: { data },\n },\n }) =>\n data && (\n <Text\n maw=\"20vw\"\n size=\"sm\"\n style={{\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n textWrap: \"nowrap\",\n }}\n >\n {data}\n </Text>\n ),\n },\n {\n header: \"Link\",\n cell: ({\n row: {\n original: { provider, data },\n },\n }) =>\n data ? (\n <ConfirmModal\n icon={<Unlink size=\"1rem\" />}\n onConfirm={() => unlink({ provider })}\n confirmText=\"Unlink\"\n title=\"Unlink Login\"\n confirmProps={{ variant: \"filled\", color: \"red\" }}\n >\n Unlink\n </ConfirmModal>\n ) : provider === \"Local\" ? (\n <>Set password above to enable.</>\n ) : (\n <Button\n onClick={() => linkWithExternalLogin(provider as any)}\n leftSection={<Plus size=\"1rem\" />}\n >\n Link {provider}\n </Button>\n ),\n },\n ]}\n />\n </Section>\n );\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,13 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import * as MoghAuth from 'mogh_auth_client';
3
+
4
+ declare function LinkedLogins({ refetchUser, passwordSet, oidcLinkedId, githubLinkedId, googleLinkedId, extraProviderFilter, }: {
5
+ refetchUser: () => void;
6
+ passwordSet?: boolean;
7
+ oidcLinkedId?: string;
8
+ githubLinkedId?: string;
9
+ googleLinkedId?: string;
10
+ extraProviderFilter?: (provider: MoghAuth.Types.LoginProvider) => boolean;
11
+ }): react_jsx_runtime.JSX.Element | null;
12
+
13
+ export { LinkedLogins };
@@ -0,0 +1,13 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import * as MoghAuth from 'mogh_auth_client';
3
+
4
+ declare function LinkedLogins({ refetchUser, passwordSet, oidcLinkedId, githubLinkedId, googleLinkedId, extraProviderFilter, }: {
5
+ refetchUser: () => void;
6
+ passwordSet?: boolean;
7
+ oidcLinkedId?: string;
8
+ githubLinkedId?: string;
9
+ googleLinkedId?: string;
10
+ extraProviderFilter?: (provider: MoghAuth.Types.LoginProvider) => boolean;
11
+ }): react_jsx_runtime.JSX.Element | null;
12
+
13
+ export { LinkedLogins };
@@ -0,0 +1,150 @@
1
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
2
+ import { useMemo } from "react";
3
+ import { Badge, Button, Text } from "@mantine/core";
4
+ import { notifications } from "@mantine/notifications";
5
+ import {
6
+ AUTH_URL,
7
+ ConfirmModal,
8
+ DataTable,
9
+ Section,
10
+ useLoginOptions,
11
+ useManageAuth
12
+ } from "../..";
13
+ import * as MoghAuth from "mogh_auth_client";
14
+ import { CloudCog, Plus, Unlink } from "lucide-react";
15
+ function useLinkWithExternalLogin() {
16
+ const { mutateAsync } = useManageAuth("BeginExternalLoginLink");
17
+ return (provider) => mutateAsync({}).then(
18
+ () => location.replace(`${AUTH_URL}/${provider.toLowerCase()}/link`)
19
+ );
20
+ }
21
+ function LinkedLogins({
22
+ refetchUser,
23
+ passwordSet,
24
+ oidcLinkedId,
25
+ githubLinkedId,
26
+ googleLinkedId,
27
+ extraProviderFilter
28
+ }) {
29
+ const options = useLoginOptions().data;
30
+ const loginProviders = useMemo(() => {
31
+ return [
32
+ {
33
+ provider: MoghAuth.Types.LoginProvider.Local,
34
+ enabled: !!options?.local,
35
+ data: passwordSet ? "########" : void 0
36
+ },
37
+ {
38
+ provider: MoghAuth.Types.LoginProvider.Oidc,
39
+ enabled: !!options?.oidc,
40
+ data: oidcLinkedId
41
+ },
42
+ {
43
+ provider: MoghAuth.Types.LoginProvider.Github,
44
+ enabled: !!options?.github,
45
+ data: githubLinkedId
46
+ },
47
+ {
48
+ provider: MoghAuth.Types.LoginProvider.Google,
49
+ enabled: !!options?.google,
50
+ data: googleLinkedId
51
+ }
52
+ ].filter(
53
+ ({ enabled, provider }) => enabled && (extraProviderFilter?.(provider) ?? true)
54
+ );
55
+ }, [passwordSet, oidcLinkedId, githubLinkedId, googleLinkedId, options]);
56
+ const linkWithExternalLogin = useLinkWithExternalLogin();
57
+ const { mutateAsync: unlink } = useManageAuth("UnlinkLogin", {
58
+ onSuccess: () => {
59
+ notifications.show({ message: "Unlinked login." });
60
+ refetchUser();
61
+ }
62
+ });
63
+ if (!loginProviders.length) {
64
+ return null;
65
+ }
66
+ return /* @__PURE__ */ jsx(
67
+ Section,
68
+ {
69
+ title: "Providers",
70
+ titleFz: "h3",
71
+ icon: /* @__PURE__ */ jsx(CloudCog, { size: "1.2rem" }),
72
+ withBorder: true,
73
+ children: /* @__PURE__ */ jsx(
74
+ DataTable,
75
+ {
76
+ noBorder: true,
77
+ tableKey: "login-providers-v1",
78
+ data: loginProviders,
79
+ columns: [
80
+ {
81
+ header: "Provider",
82
+ accessorKey: "provider",
83
+ cell: ({ row }) => /* @__PURE__ */ jsx(Text, { fw: "bold", children: row.original.provider })
84
+ },
85
+ {
86
+ header: "Linked",
87
+ cell: ({
88
+ row: {
89
+ original: { data }
90
+ }
91
+ }) => /* @__PURE__ */ jsx(Badge, { color: data ? "green.8" : "red", children: data ? "Linked" : "Unlinked" })
92
+ },
93
+ {
94
+ header: "Data",
95
+ cell: ({
96
+ row: {
97
+ original: { data }
98
+ }
99
+ }) => data && /* @__PURE__ */ jsx(
100
+ Text,
101
+ {
102
+ maw: "20vw",
103
+ size: "sm",
104
+ style: {
105
+ overflow: "hidden",
106
+ textOverflow: "ellipsis",
107
+ textWrap: "nowrap"
108
+ },
109
+ children: data
110
+ }
111
+ )
112
+ },
113
+ {
114
+ header: "Link",
115
+ cell: ({
116
+ row: {
117
+ original: { provider, data }
118
+ }
119
+ }) => data ? /* @__PURE__ */ jsx(
120
+ ConfirmModal,
121
+ {
122
+ icon: /* @__PURE__ */ jsx(Unlink, { size: "1rem" }),
123
+ onConfirm: () => unlink({ provider }),
124
+ confirmText: "Unlink",
125
+ title: "Unlink Login",
126
+ confirmProps: { variant: "filled", color: "red" },
127
+ children: "Unlink"
128
+ }
129
+ ) : provider === "Local" ? /* @__PURE__ */ jsx(Fragment, { children: "Set password above to enable." }) : /* @__PURE__ */ jsxs(
130
+ Button,
131
+ {
132
+ onClick: () => linkWithExternalLogin(provider),
133
+ leftSection: /* @__PURE__ */ jsx(Plus, { size: "1rem" }),
134
+ children: [
135
+ "Link ",
136
+ provider
137
+ ]
138
+ }
139
+ )
140
+ }
141
+ ]
142
+ }
143
+ )
144
+ }
145
+ );
146
+ }
147
+ export {
148
+ LinkedLogins
149
+ };
150
+ //# sourceMappingURL=linked-logins.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/auth/profile/linked-logins.tsx"],"sourcesContent":["import { useMemo } from \"react\";\nimport { Badge, Button, Text } from \"@mantine/core\";\nimport { notifications } from \"@mantine/notifications\";\nimport {\n AUTH_URL,\n ConfirmModal,\n DataTable,\n Section,\n useLoginOptions,\n useManageAuth,\n} from \"../..\";\nimport * as MoghAuth from \"mogh_auth_client\";\nimport { CloudCog, Plus, Unlink } from \"lucide-react\";\n\nfunction useLinkWithExternalLogin() {\n const { mutateAsync } = useManageAuth(\"BeginExternalLoginLink\");\n return (provider: MoghAuth.Types.ExternalLoginProvider) =>\n mutateAsync({}).then(() =>\n location.replace(`${AUTH_URL}/${provider.toLowerCase()}/link`),\n );\n}\n\nexport function LinkedLogins({\n refetchUser,\n passwordSet,\n oidcLinkedId,\n githubLinkedId,\n googleLinkedId,\n extraProviderFilter,\n}: {\n refetchUser: () => void;\n passwordSet?: boolean;\n oidcLinkedId?: string;\n githubLinkedId?: string;\n googleLinkedId?: string;\n extraProviderFilter?: (provider: MoghAuth.Types.LoginProvider) => boolean;\n}) {\n const options = useLoginOptions().data;\n const loginProviders: Array<{\n provider: MoghAuth.Types.LoginProvider;\n enabled: boolean;\n data: string | undefined;\n }> = useMemo(() => {\n return [\n {\n provider: MoghAuth.Types.LoginProvider.Local,\n enabled: !!options?.local,\n data: passwordSet ? \"########\" : undefined,\n },\n {\n provider: MoghAuth.Types.LoginProvider.Oidc,\n enabled: !!options?.oidc,\n data: oidcLinkedId,\n },\n {\n provider: MoghAuth.Types.LoginProvider.Github,\n enabled: !!options?.github,\n data: githubLinkedId,\n },\n {\n provider: MoghAuth.Types.LoginProvider.Google,\n enabled: !!options?.google,\n data: googleLinkedId,\n },\n ].filter(\n ({ enabled, provider }) =>\n enabled && (extraProviderFilter?.(provider) ?? true),\n );\n }, [passwordSet, oidcLinkedId, githubLinkedId, googleLinkedId, options]);\n const linkWithExternalLogin = useLinkWithExternalLogin();\n const { mutateAsync: unlink } = useManageAuth(\"UnlinkLogin\", {\n onSuccess: () => {\n notifications.show({ message: \"Unlinked login.\" });\n refetchUser();\n },\n });\n\n if (!loginProviders.length) {\n return null;\n }\n\n return (\n <Section\n title=\"Providers\"\n titleFz=\"h3\"\n icon={<CloudCog size=\"1.2rem\" />}\n withBorder\n >\n <DataTable\n noBorder\n tableKey=\"login-providers-v1\"\n data={loginProviders}\n columns={[\n {\n header: \"Provider\",\n accessorKey: \"provider\",\n cell: ({ row }) => <Text fw=\"bold\">{row.original.provider}</Text>,\n },\n {\n header: \"Linked\",\n cell: ({\n row: {\n original: { data },\n },\n }) => (\n <Badge color={data ? \"green.8\" : \"red\"}>\n {data ? \"Linked\" : \"Unlinked\"}\n </Badge>\n ),\n },\n {\n header: \"Data\",\n cell: ({\n row: {\n original: { data },\n },\n }) =>\n data && (\n <Text\n maw=\"20vw\"\n size=\"sm\"\n style={{\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n textWrap: \"nowrap\",\n }}\n >\n {data}\n </Text>\n ),\n },\n {\n header: \"Link\",\n cell: ({\n row: {\n original: { provider, data },\n },\n }) =>\n data ? (\n <ConfirmModal\n icon={<Unlink size=\"1rem\" />}\n onConfirm={() => unlink({ provider })}\n confirmText=\"Unlink\"\n title=\"Unlink Login\"\n confirmProps={{ variant: \"filled\", color: \"red\" }}\n >\n Unlink\n </ConfirmModal>\n ) : provider === \"Local\" ? (\n <>Set password above to enable.</>\n ) : (\n <Button\n onClick={() => linkWithExternalLogin(provider as any)}\n leftSection={<Plus size=\"1rem\" />}\n >\n Link {provider}\n </Button>\n ),\n },\n ]}\n />\n </Section>\n );\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,109 @@
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 passkey_exports = {};
30
+ __export(passkey_exports, {
31
+ EnrollPasskey: () => EnrollPasskey
32
+ });
33
+ module.exports = __toCommonJS(passkey_exports);
34
+ var import_jsx_runtime = require("react/jsx-runtime");
35
+ var import_core = require("@mantine/core");
36
+ var import_notifications = require("@mantine/notifications");
37
+ var import_lucide_react = require("lucide-react");
38
+ var import__ = require("../..");
39
+ var MoghAuth = __toESM(require("mogh_auth_client"), 1);
40
+ function EnrollPasskey({
41
+ userInvalidate,
42
+ passkeyEnrolled,
43
+ totpEnrolled
44
+ }) {
45
+ const { mutateAsync: unenroll, isPending: unenrollPending } = (0, import__.useManageAuth)(
46
+ "UnenrollPasskey",
47
+ {
48
+ onSuccess: () => {
49
+ userInvalidate?.();
50
+ import_notifications.notifications.show({
51
+ message: "Unenrolled in passkey 2FA",
52
+ color: "green"
53
+ });
54
+ }
55
+ }
56
+ );
57
+ const { mutate: confirmEnrollment } = (0, import__.useManageAuth)(
58
+ "ConfirmPasskeyEnrollment",
59
+ {
60
+ onSuccess: () => {
61
+ userInvalidate?.();
62
+ import_notifications.notifications.show({
63
+ message: "Enrolled in passkey authentication",
64
+ color: "green"
65
+ });
66
+ }
67
+ }
68
+ );
69
+ const { mutate: beginEnrollment } = (0, import__.useManageAuth)("BeginPasskeyEnrollment", {
70
+ onSuccess: (challenge) => {
71
+ navigator.credentials.create(MoghAuth.Passkey.prepareCreationChallengeResponse(challenge)).then((credential) => confirmEnrollment({ credential })).catch((e) => {
72
+ console.error(e);
73
+ import_notifications.notifications.show({
74
+ title: "Failed to create passkey",
75
+ message: "See console for details",
76
+ color: "red"
77
+ });
78
+ });
79
+ }
80
+ });
81
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
82
+ !passkeyEnrolled && !totpEnrolled && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
83
+ import_core.Button,
84
+ {
85
+ leftSection: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Fingerprint, { size: "1rem" }),
86
+ onClick: () => beginEnrollment({}),
87
+ w: 220,
88
+ children: "Enroll Passkey 2FA"
89
+ }
90
+ ),
91
+ passkeyEnrolled && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
92
+ import__.ConfirmModal,
93
+ {
94
+ confirmText: "Unenroll",
95
+ icon: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Trash, { size: "1rem" }),
96
+ loading: unenrollPending,
97
+ onConfirm: () => unenroll({}),
98
+ targetProps: { c: "bw", w: 220 },
99
+ confirmProps: { variant: "filled", color: "red" },
100
+ children: "Unenroll Passkey 2FA"
101
+ }
102
+ )
103
+ ] });
104
+ }
105
+ // Annotate the CommonJS export names for ESM import in node:
106
+ 0 && (module.exports = {
107
+ EnrollPasskey
108
+ });
109
+ //# sourceMappingURL=passkey.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/auth/profile/passkey.tsx"],"sourcesContent":["import { Button } from \"@mantine/core\";\nimport { notifications } from \"@mantine/notifications\";\nimport { Fingerprint, Trash } from \"lucide-react\";\nimport { ConfirmModal, useManageAuth } from \"../..\";\nimport * as MoghAuth from \"mogh_auth_client\";\n\nexport function EnrollPasskey({\n userInvalidate,\n passkeyEnrolled,\n totpEnrolled,\n}: {\n userInvalidate?: () => void;\n passkeyEnrolled?: boolean;\n totpEnrolled?: boolean;\n}) {\n const { mutateAsync: unenroll, isPending: unenrollPending } = useManageAuth(\n \"UnenrollPasskey\",\n {\n onSuccess: () => {\n userInvalidate?.();\n notifications.show({\n message: \"Unenrolled in passkey 2FA\",\n color: \"green\",\n });\n },\n },\n );\n\n const { mutate: confirmEnrollment } = useManageAuth(\n \"ConfirmPasskeyEnrollment\",\n {\n onSuccess: () => {\n userInvalidate?.();\n notifications.show({\n message: \"Enrolled in passkey authentication\",\n color: \"green\",\n });\n },\n },\n );\n\n const { mutate: beginEnrollment } = useManageAuth(\"BeginPasskeyEnrollment\", {\n onSuccess: (challenge) => {\n navigator.credentials\n .create(MoghAuth.Passkey.prepareCreationChallengeResponse(challenge))\n .then((credential) => confirmEnrollment({ credential }))\n .catch((e) => {\n console.error(e);\n notifications.show({\n title: \"Failed to create passkey\",\n message: \"See console for details\",\n color: \"red\",\n });\n });\n },\n });\n\n return (\n <>\n {!passkeyEnrolled && !totpEnrolled && (\n <Button\n leftSection={<Fingerprint size=\"1rem\" />}\n onClick={() => beginEnrollment({})}\n w={220}\n >\n Enroll Passkey 2FA\n </Button>\n )}\n {passkeyEnrolled && (\n <ConfirmModal\n confirmText=\"Unenroll\"\n icon={<Trash size=\"1rem\" />}\n loading={unenrollPending}\n onConfirm={() => unenroll({})}\n targetProps={{ c: \"bw\", w: 220 }}\n confirmProps={{ variant: \"filled\", color: \"red\" }}\n >\n Unenroll Passkey 2FA\n </ConfirmModal>\n )}\n </>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA0DI;AA1DJ,kBAAuB;AACvB,2BAA8B;AAC9B,0BAAmC;AACnC,eAA4C;AAC5C,eAA0B;AAEnB,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,QAAM,EAAE,aAAa,UAAU,WAAW,gBAAgB,QAAI;AAAA,IAC5D;AAAA,IACA;AAAA,MACE,WAAW,MAAM;AACf,yBAAiB;AACjB,2CAAc,KAAK;AAAA,UACjB,SAAS;AAAA,UACT,OAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,QAAM,EAAE,QAAQ,kBAAkB,QAAI;AAAA,IACpC;AAAA,IACA;AAAA,MACE,WAAW,MAAM;AACf,yBAAiB;AACjB,2CAAc,KAAK;AAAA,UACjB,SAAS;AAAA,UACT,OAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,QAAM,EAAE,QAAQ,gBAAgB,QAAI,wBAAc,0BAA0B;AAAA,IAC1E,WAAW,CAAC,cAAc;AACxB,gBAAU,YACP,OAAO,SAAS,QAAQ,iCAAiC,SAAS,CAAC,EACnE,KAAK,CAAC,eAAe,kBAAkB,EAAE,WAAW,CAAC,CAAC,EACtD,MAAM,CAAC,MAAM;AACZ,gBAAQ,MAAM,CAAC;AACf,2CAAc,KAAK;AAAA,UACjB,OAAO;AAAA,UACP,SAAS;AAAA,UACT,OAAO;AAAA,QACT,CAAC;AAAA,MACH,CAAC;AAAA,IACL;AAAA,EACF,CAAC;AAED,SACE,4EACG;AAAA,KAAC,mBAAmB,CAAC,gBACpB;AAAA,MAAC;AAAA;AAAA,QACC,aAAa,4CAAC,mCAAY,MAAK,QAAO;AAAA,QACtC,SAAS,MAAM,gBAAgB,CAAC,CAAC;AAAA,QACjC,GAAG;AAAA,QACJ;AAAA;AAAA,IAED;AAAA,IAED,mBACC;AAAA,MAAC;AAAA;AAAA,QACC,aAAY;AAAA,QACZ,MAAM,4CAAC,6BAAM,MAAK,QAAO;AAAA,QACzB,SAAS;AAAA,QACT,WAAW,MAAM,SAAS,CAAC,CAAC;AAAA,QAC5B,aAAa,EAAE,GAAG,MAAM,GAAG,IAAI;AAAA,QAC/B,cAAc,EAAE,SAAS,UAAU,OAAO,MAAM;AAAA,QACjD;AAAA;AAAA,IAED;AAAA,KAEJ;AAEJ;","names":[]}
@@ -0,0 +1,9 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ declare function EnrollPasskey({ userInvalidate, passkeyEnrolled, totpEnrolled, }: {
4
+ userInvalidate?: () => void;
5
+ passkeyEnrolled?: boolean;
6
+ totpEnrolled?: boolean;
7
+ }): react_jsx_runtime.JSX.Element;
8
+
9
+ export { EnrollPasskey };
@@ -0,0 +1,9 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ declare function EnrollPasskey({ userInvalidate, passkeyEnrolled, totpEnrolled, }: {
4
+ userInvalidate?: () => void;
5
+ passkeyEnrolled?: boolean;
6
+ totpEnrolled?: boolean;
7
+ }): react_jsx_runtime.JSX.Element;
8
+
9
+ export { EnrollPasskey };
@@ -0,0 +1,75 @@
1
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
2
+ import { Button } from "@mantine/core";
3
+ import { notifications } from "@mantine/notifications";
4
+ import { Fingerprint, Trash } from "lucide-react";
5
+ import { ConfirmModal, useManageAuth } from "../..";
6
+ import * as MoghAuth from "mogh_auth_client";
7
+ function EnrollPasskey({
8
+ userInvalidate,
9
+ passkeyEnrolled,
10
+ totpEnrolled
11
+ }) {
12
+ const { mutateAsync: unenroll, isPending: unenrollPending } = useManageAuth(
13
+ "UnenrollPasskey",
14
+ {
15
+ onSuccess: () => {
16
+ userInvalidate?.();
17
+ notifications.show({
18
+ message: "Unenrolled in passkey 2FA",
19
+ color: "green"
20
+ });
21
+ }
22
+ }
23
+ );
24
+ const { mutate: confirmEnrollment } = useManageAuth(
25
+ "ConfirmPasskeyEnrollment",
26
+ {
27
+ onSuccess: () => {
28
+ userInvalidate?.();
29
+ notifications.show({
30
+ message: "Enrolled in passkey authentication",
31
+ color: "green"
32
+ });
33
+ }
34
+ }
35
+ );
36
+ const { mutate: beginEnrollment } = useManageAuth("BeginPasskeyEnrollment", {
37
+ onSuccess: (challenge) => {
38
+ navigator.credentials.create(MoghAuth.Passkey.prepareCreationChallengeResponse(challenge)).then((credential) => confirmEnrollment({ credential })).catch((e) => {
39
+ console.error(e);
40
+ notifications.show({
41
+ title: "Failed to create passkey",
42
+ message: "See console for details",
43
+ color: "red"
44
+ });
45
+ });
46
+ }
47
+ });
48
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
49
+ !passkeyEnrolled && !totpEnrolled && /* @__PURE__ */ jsx(
50
+ Button,
51
+ {
52
+ leftSection: /* @__PURE__ */ jsx(Fingerprint, { size: "1rem" }),
53
+ onClick: () => beginEnrollment({}),
54
+ w: 220,
55
+ children: "Enroll Passkey 2FA"
56
+ }
57
+ ),
58
+ passkeyEnrolled && /* @__PURE__ */ jsx(
59
+ ConfirmModal,
60
+ {
61
+ confirmText: "Unenroll",
62
+ icon: /* @__PURE__ */ jsx(Trash, { size: "1rem" }),
63
+ loading: unenrollPending,
64
+ onConfirm: () => unenroll({}),
65
+ targetProps: { c: "bw", w: 220 },
66
+ confirmProps: { variant: "filled", color: "red" },
67
+ children: "Unenroll Passkey 2FA"
68
+ }
69
+ )
70
+ ] });
71
+ }
72
+ export {
73
+ EnrollPasskey
74
+ };
75
+ //# sourceMappingURL=passkey.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/auth/profile/passkey.tsx"],"sourcesContent":["import { Button } from \"@mantine/core\";\nimport { notifications } from \"@mantine/notifications\";\nimport { Fingerprint, Trash } from \"lucide-react\";\nimport { ConfirmModal, useManageAuth } from \"../..\";\nimport * as MoghAuth from \"mogh_auth_client\";\n\nexport function EnrollPasskey({\n userInvalidate,\n passkeyEnrolled,\n totpEnrolled,\n}: {\n userInvalidate?: () => void;\n passkeyEnrolled?: boolean;\n totpEnrolled?: boolean;\n}) {\n const { mutateAsync: unenroll, isPending: unenrollPending } = useManageAuth(\n \"UnenrollPasskey\",\n {\n onSuccess: () => {\n userInvalidate?.();\n notifications.show({\n message: \"Unenrolled in passkey 2FA\",\n color: \"green\",\n });\n },\n },\n );\n\n const { mutate: confirmEnrollment } = useManageAuth(\n \"ConfirmPasskeyEnrollment\",\n {\n onSuccess: () => {\n userInvalidate?.();\n notifications.show({\n message: \"Enrolled in passkey authentication\",\n color: \"green\",\n });\n },\n },\n );\n\n const { mutate: beginEnrollment } = useManageAuth(\"BeginPasskeyEnrollment\", {\n onSuccess: (challenge) => {\n navigator.credentials\n .create(MoghAuth.Passkey.prepareCreationChallengeResponse(challenge))\n .then((credential) => confirmEnrollment({ credential }))\n .catch((e) => {\n console.error(e);\n notifications.show({\n title: \"Failed to create passkey\",\n message: \"See console for details\",\n color: \"red\",\n });\n });\n },\n });\n\n return (\n <>\n {!passkeyEnrolled && !totpEnrolled && (\n <Button\n leftSection={<Fingerprint size=\"1rem\" />}\n onClick={() => beginEnrollment({})}\n w={220}\n >\n Enroll Passkey 2FA\n </Button>\n )}\n {passkeyEnrolled && (\n <ConfirmModal\n confirmText=\"Unenroll\"\n icon={<Trash size=\"1rem\" />}\n loading={unenrollPending}\n onConfirm={() => unenroll({})}\n targetProps={{ c: \"bw\", w: 220 }}\n confirmProps={{ variant: \"filled\", color: \"red\" }}\n >\n Unenroll Passkey 2FA\n </ConfirmModal>\n )}\n </>\n );\n}\n"],"mappings":"AA0DI,mBAGmB,KAHnB;AA1DJ,SAAS,cAAc;AACvB,SAAS,qBAAqB;AAC9B,SAAS,aAAa,aAAa;AACnC,SAAS,cAAc,qBAAqB;AAC5C,YAAY,cAAc;AAEnB,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,QAAM,EAAE,aAAa,UAAU,WAAW,gBAAgB,IAAI;AAAA,IAC5D;AAAA,IACA;AAAA,MACE,WAAW,MAAM;AACf,yBAAiB;AACjB,sBAAc,KAAK;AAAA,UACjB,SAAS;AAAA,UACT,OAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,QAAM,EAAE,QAAQ,kBAAkB,IAAI;AAAA,IACpC;AAAA,IACA;AAAA,MACE,WAAW,MAAM;AACf,yBAAiB;AACjB,sBAAc,KAAK;AAAA,UACjB,SAAS;AAAA,UACT,OAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,QAAM,EAAE,QAAQ,gBAAgB,IAAI,cAAc,0BAA0B;AAAA,IAC1E,WAAW,CAAC,cAAc;AACxB,gBAAU,YACP,OAAO,SAAS,QAAQ,iCAAiC,SAAS,CAAC,EACnE,KAAK,CAAC,eAAe,kBAAkB,EAAE,WAAW,CAAC,CAAC,EACtD,MAAM,CAAC,MAAM;AACZ,gBAAQ,MAAM,CAAC;AACf,sBAAc,KAAK;AAAA,UACjB,OAAO;AAAA,UACP,SAAS;AAAA,UACT,OAAO;AAAA,QACT,CAAC;AAAA,MACH,CAAC;AAAA,IACL;AAAA,EACF,CAAC;AAED,SACE,iCACG;AAAA,KAAC,mBAAmB,CAAC,gBACpB;AAAA,MAAC;AAAA;AAAA,QACC,aAAa,oBAAC,eAAY,MAAK,QAAO;AAAA,QACtC,SAAS,MAAM,gBAAgB,CAAC,CAAC;AAAA,QACjC,GAAG;AAAA,QACJ;AAAA;AAAA,IAED;AAAA,IAED,mBACC;AAAA,MAAC;AAAA;AAAA,QACC,aAAY;AAAA,QACZ,MAAM,oBAAC,SAAM,MAAK,QAAO;AAAA,QACzB,SAAS;AAAA,QACT,WAAW,MAAM,SAAS,CAAC,CAAC;AAAA,QAC5B,aAAa,EAAE,GAAG,MAAM,GAAG,IAAI;AAAA,QAC/B,cAAc,EAAE,SAAS,UAAU,OAAO,MAAM;AAAA,QACjD;AAAA;AAAA,IAED;AAAA,KAEJ;AAEJ;","names":[]}