mogh_ui 1.3.2 → 1.3.4
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/dist/auth/index.cjs +3 -3
- package/dist/auth/index.cjs.map +1 -1
- package/dist/auth/index.d.ts +11 -1
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +3 -3
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/login/index.cjs +3 -1
- package/dist/auth/login/index.cjs.map +1 -1
- package/dist/auth/login/index.d.ts +8 -1
- package/dist/auth/login/index.d.ts.map +1 -1
- package/dist/auth/login/index.js +3 -1
- package/dist/auth/login/index.js.map +1 -1
- package/package.json +17 -17
package/dist/auth/index.cjs
CHANGED
|
@@ -81,11 +81,11 @@ function useLogin(type, config) {
|
|
|
81
81
|
...config
|
|
82
82
|
});
|
|
83
83
|
}
|
|
84
|
-
function useUserId() {
|
|
84
|
+
function useUserId(options) {
|
|
85
85
|
return (0, import_react_query.useQuery)({
|
|
86
|
-
queryKey: [""],
|
|
86
|
+
queryKey: ["GetUserId"],
|
|
87
87
|
queryFn: () => authClient().manage("GetUserId", {}),
|
|
88
|
-
enabled: !!MoghAuth.LOGIN_TOKENS.jwt()
|
|
88
|
+
enabled: (options?.enabled ?? true) && !!MoghAuth.LOGIN_TOKENS.jwt()
|
|
89
89
|
});
|
|
90
90
|
}
|
|
91
91
|
function useManageAuth(type, config) {
|
package/dist/auth/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/auth/index.ts"],"sourcesContent":["import { notifications } from \"@mantine/notifications\";\nimport {\n useMutation,\n UseMutationOptions,\n useQuery,\n} from \"@tanstack/react-query\";\nimport * as MoghAuth from \"mogh_auth_client\";\nimport { sanitizeQueryInner } from \"./utils\";\n\nexport * from \"./login\";\nexport * from \"./profile\";\nexport * from \"./utils\";\n\nexport let AUTH_URL: string;\n\n/**\n * Set the global auth url.\n * Make sure to call this before first render.\n * @param url The global url\n */\nexport function setAuthUrl(url: string) {\n AUTH_URL = url;\n}\n\nexport function authClient() {\n return MoghAuth.MoghAuthClient(AUTH_URL, MoghAuth.LOGIN_TOKENS!.jwt());\n}\n\nexport function useLoginOptions() {\n return useQuery({\n queryKey: [\"GetLoginOptions\"],\n queryFn: () => authClient().login(\"GetLoginOptions\", {}),\n });\n}\n\nexport function useLogin<\n T extends MoghAuth.Types.LoginRequest[\"type\"],\n R extends Extract<MoghAuth.Types.LoginRequest, { type: T }>,\n P extends R[\"params\"],\n C extends Omit<\n UseMutationOptions<MoghAuth.LoginResponses[T], unknown, P, unknown>,\n \"mutationKey\" | \"mutationFn\"\n >,\n>(type: T, config?: C) {\n return useMutation({\n mutationKey: [type],\n mutationFn: (params: P) => authClient().login<T, R>(type, params),\n onError: (e: { result: { error?: string; trace?: string[] } }, ...args) => {\n console.log(\"Login error:\", e);\n const msg = e.result.error ?? \"Unknown error. See console.\";\n const detail = e.result?.trace\n ?.map((msg) => msg[0].toUpperCase() + msg.slice(1))\n .join(\" | \");\n let msg_log = msg ? msg[0].toUpperCase() + msg.slice(1) + \" | \" : \"\";\n if (detail) {\n msg_log += detail + \" | \";\n }\n notifications.show({\n title: `Login request ${type} failed`,\n message: `${msg_log}See console for details`,\n color: \"red\",\n });\n config?.onError && config.onError(e, ...args);\n },\n ...config,\n });\n}\n\nexport function useUserId() {\n return useQuery({\n queryKey: [\"\"],\n queryFn: () => authClient().manage(\"GetUserId\", {}),\n enabled: !!MoghAuth.LOGIN_TOKENS!.jwt(),\n });\n}\n\nexport function useManageAuth<\n T extends MoghAuth.Types.ManageRequest[\"type\"],\n R extends Extract<MoghAuth.Types.ManageRequest, { type: T }>,\n P extends R[\"params\"],\n C extends Omit<\n UseMutationOptions<MoghAuth.ManageResponses[T], unknown, P, unknown>,\n \"mutationKey\" | \"mutationFn\"\n >,\n>(type: T, config?: C) {\n return useMutation({\n mutationKey: [type],\n mutationFn: (params: P) => authClient().manage<T, R>(type, params),\n onError: (e: { result: { error?: string; trace?: string[] } }, ...args) => {\n console.log(\"Manage auth error:\", e);\n const msg = e.result.error ?? \"Unknown error. See console.\";\n const detail = e.result?.trace\n ?.map((msg) => msg[0].toUpperCase() + msg.slice(1))\n .join(\" | \");\n let msg_log = msg ? msg[0].toUpperCase() + msg.slice(1) + \" | \" : \"\";\n if (detail) {\n msg_log += detail + \" | \";\n }\n notifications.show({\n title: `Manage auth request ${type} failed`,\n message: `${msg_log}See console for details`,\n color: \"red\",\n });\n config?.onError && config.onError(e, ...args);\n },\n ...config,\n });\n}\n\nlet jwt_redeem_sent = false;\nlet passkey_sent = false;\n\n/// returns whether to show login / loading screen depending on state of exchange token loop\nexport function useAuthState() {\n const onSuccess = ({ jwt }: MoghAuth.Types.JwtResponse) => {\n MoghAuth.LOGIN_TOKENS!.add_and_change(jwt);\n sanitizeQueryInner(search);\n };\n const { mutate: redeemJwt } = useLogin(\"ExchangeForJwt\", {\n onSuccess,\n });\n const { mutate: completePasskeyLogin } = useLogin(\"CompletePasskeyLogin\", {\n onSuccess,\n });\n const search = new URLSearchParams(location.search);\n\n const _passkey = search.get(\"passkey\");\n const passkey = _passkey\n ? JSON.parse(MoghAuth.Passkey.base64UrlDecode(_passkey))\n : null;\n\n // guard against multiple reqs sent\n // maybe isPending would do this but not sure about with render loop, this for sure will.\n if (passkey && !passkey_sent) {\n navigator.credentials\n .get(MoghAuth.Passkey.prepareRequestChallengeResponse(passkey))\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 passkey_sent = true;\n }\n\n const jwt_redeem_ready = search.get(\"redeem_ready\") === \"true\";\n\n // guard against multiple reqs sent\n // maybe isPending would do this but not sure about with render loop, this for sure will.\n if (jwt_redeem_ready && !jwt_redeem_sent) {\n redeemJwt({});\n jwt_redeem_sent = true;\n }\n\n return {\n jwt_redeem_ready,\n passkey_pending: !!passkey,\n totp: search.get(\"totp\") === \"true\",\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2BAA8B;AAC9B,yBAIO;AACP,eAA0B;AAC1B,mBAAmC;AAEnC,yBAAc,oBATd;AAUA,yBAAc,sBAVd;AAWA,yBAAc,oBAXd;AAaO,IAAI;AAOJ,SAAS,WAAW,KAAa;AACtC,aAAW;AACb;AAEO,SAAS,aAAa;AAC3B,SAAO,SAAS,eAAe,UAAU,SAAS,aAAc,IAAI,CAAC;AACvE;AAEO,SAAS,kBAAkB;AAChC,aAAO,6BAAS;AAAA,IACd,UAAU,CAAC,iBAAiB;AAAA,IAC5B,SAAS,MAAM,WAAW,EAAE,MAAM,mBAAmB,CAAC,CAAC;AAAA,EACzD,CAAC;AACH;AAEO,SAAS,SAQd,MAAS,QAAY;AACrB,aAAO,gCAAY;AAAA,IACjB,aAAa,CAAC,IAAI;AAAA,IAClB,YAAY,CAAC,WAAc,WAAW,EAAE,MAAY,MAAM,MAAM;AAAA,IAChE,SAAS,CAAC,MAAwD,SAAS;AACzE,cAAQ,IAAI,gBAAgB,CAAC;AAC7B,YAAM,MAAM,EAAE,OAAO,SAAS;AAC9B,YAAM,SAAS,EAAE,QAAQ,OACrB,IAAI,CAACA,SAAQA,KAAI,CAAC,EAAE,YAAY,IAAIA,KAAI,MAAM,CAAC,CAAC,EACjD,KAAK,KAAK;AACb,UAAI,UAAU,MAAM,IAAI,CAAC,EAAE,YAAY,IAAI,IAAI,MAAM,CAAC,IAAI,QAAQ;AAClE,UAAI,QAAQ;AACV,mBAAW,SAAS;AAAA,MACtB;AACA,yCAAc,KAAK;AAAA,QACjB,OAAO,iBAAiB,IAAI;AAAA,QAC5B,SAAS,GAAG,OAAO;AAAA,QACnB,OAAO;AAAA,MACT,CAAC;AACD,cAAQ,WAAW,OAAO,QAAQ,GAAG,GAAG,IAAI;AAAA,IAC9C;AAAA,IACA,GAAG;AAAA,EACL,CAAC;AACH;
|
|
1
|
+
{"version":3,"sources":["../../src/auth/index.ts"],"sourcesContent":["import { notifications } from \"@mantine/notifications\";\nimport {\n useMutation,\n UseMutationOptions,\n useQuery,\n} from \"@tanstack/react-query\";\nimport * as MoghAuth from \"mogh_auth_client\";\nimport { sanitizeQueryInner } from \"./utils\";\n\nexport * from \"./login\";\nexport * from \"./profile\";\nexport * from \"./utils\";\n\nexport let AUTH_URL: string;\n\n/**\n * Set the global auth url.\n * Make sure to call this before first render.\n * @param url The global url\n */\nexport function setAuthUrl(url: string) {\n AUTH_URL = url;\n}\n\nexport function authClient() {\n return MoghAuth.MoghAuthClient(AUTH_URL, MoghAuth.LOGIN_TOKENS!.jwt());\n}\n\nexport function useLoginOptions() {\n return useQuery({\n queryKey: [\"GetLoginOptions\"],\n queryFn: () => authClient().login(\"GetLoginOptions\", {}),\n });\n}\n\nexport function useLogin<\n T extends MoghAuth.Types.LoginRequest[\"type\"],\n R extends Extract<MoghAuth.Types.LoginRequest, { type: T }>,\n P extends R[\"params\"],\n C extends Omit<\n UseMutationOptions<MoghAuth.LoginResponses[T], unknown, P, unknown>,\n \"mutationKey\" | \"mutationFn\"\n >,\n>(type: T, config?: C) {\n return useMutation({\n mutationKey: [type],\n mutationFn: (params: P) => authClient().login<T, R>(type, params),\n onError: (e: { result: { error?: string; trace?: string[] } }, ...args) => {\n console.log(\"Login error:\", e);\n const msg = e.result.error ?? \"Unknown error. See console.\";\n const detail = e.result?.trace\n ?.map((msg) => msg[0].toUpperCase() + msg.slice(1))\n .join(\" | \");\n let msg_log = msg ? msg[0].toUpperCase() + msg.slice(1) + \" | \" : \"\";\n if (detail) {\n msg_log += detail + \" | \";\n }\n notifications.show({\n title: `Login request ${type} failed`,\n message: `${msg_log}See console for details`,\n color: \"red\",\n });\n config?.onError && config.onError(e, ...args);\n },\n ...config,\n });\n}\n\n/**\n * Look up the signed in user's id.\n *\n * Pass `enabled: false` where the host app already knows the answer\n * from its own session query. Every request which fails auth counts\n * against the server's per IP auth rate limit, so a token the server\n * rejects should only ever be sent once.\n */\nexport function useUserId(options?: { enabled?: boolean }) {\n return useQuery({\n queryKey: [\"GetUserId\"],\n queryFn: () => authClient().manage(\"GetUserId\", {}),\n enabled: (options?.enabled ?? true) && !!MoghAuth.LOGIN_TOKENS!.jwt(),\n });\n}\n\nexport function useManageAuth<\n T extends MoghAuth.Types.ManageRequest[\"type\"],\n R extends Extract<MoghAuth.Types.ManageRequest, { type: T }>,\n P extends R[\"params\"],\n C extends Omit<\n UseMutationOptions<MoghAuth.ManageResponses[T], unknown, P, unknown>,\n \"mutationKey\" | \"mutationFn\"\n >,\n>(type: T, config?: C) {\n return useMutation({\n mutationKey: [type],\n mutationFn: (params: P) => authClient().manage<T, R>(type, params),\n onError: (e: { result: { error?: string; trace?: string[] } }, ...args) => {\n console.log(\"Manage auth error:\", e);\n const msg = e.result.error ?? \"Unknown error. See console.\";\n const detail = e.result?.trace\n ?.map((msg) => msg[0].toUpperCase() + msg.slice(1))\n .join(\" | \");\n let msg_log = msg ? msg[0].toUpperCase() + msg.slice(1) + \" | \" : \"\";\n if (detail) {\n msg_log += detail + \" | \";\n }\n notifications.show({\n title: `Manage auth request ${type} failed`,\n message: `${msg_log}See console for details`,\n color: \"red\",\n });\n config?.onError && config.onError(e, ...args);\n },\n ...config,\n });\n}\n\nlet jwt_redeem_sent = false;\nlet passkey_sent = false;\n\n/// returns whether to show login / loading screen depending on state of exchange token loop\nexport function useAuthState() {\n const onSuccess = ({ jwt }: MoghAuth.Types.JwtResponse) => {\n MoghAuth.LOGIN_TOKENS!.add_and_change(jwt);\n sanitizeQueryInner(search);\n };\n const { mutate: redeemJwt } = useLogin(\"ExchangeForJwt\", {\n onSuccess,\n });\n const { mutate: completePasskeyLogin } = useLogin(\"CompletePasskeyLogin\", {\n onSuccess,\n });\n const search = new URLSearchParams(location.search);\n\n const _passkey = search.get(\"passkey\");\n const passkey = _passkey\n ? JSON.parse(MoghAuth.Passkey.base64UrlDecode(_passkey))\n : null;\n\n // guard against multiple reqs sent\n // maybe isPending would do this but not sure about with render loop, this for sure will.\n if (passkey && !passkey_sent) {\n navigator.credentials\n .get(MoghAuth.Passkey.prepareRequestChallengeResponse(passkey))\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 passkey_sent = true;\n }\n\n const jwt_redeem_ready = search.get(\"redeem_ready\") === \"true\";\n\n // guard against multiple reqs sent\n // maybe isPending would do this but not sure about with render loop, this for sure will.\n if (jwt_redeem_ready && !jwt_redeem_sent) {\n redeemJwt({});\n jwt_redeem_sent = true;\n }\n\n return {\n jwt_redeem_ready,\n passkey_pending: !!passkey,\n totp: search.get(\"totp\") === \"true\",\n };\n}\n"],"mappings":"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","names":["msg"]}
|
package/dist/auth/index.d.ts
CHANGED
|
@@ -28,7 +28,17 @@ export declare function useLogin<T extends MoghAuth.Types.LoginRequest["type"],
|
|
|
28
28
|
trace?: string[];
|
|
29
29
|
};
|
|
30
30
|
}, P, unknown>;
|
|
31
|
-
|
|
31
|
+
/**
|
|
32
|
+
* Look up the signed in user's id.
|
|
33
|
+
*
|
|
34
|
+
* Pass `enabled: false` where the host app already knows the answer
|
|
35
|
+
* from its own session query. Every request which fails auth counts
|
|
36
|
+
* against the server's per IP auth rate limit, so a token the server
|
|
37
|
+
* rejects should only ever be sent once.
|
|
38
|
+
*/
|
|
39
|
+
export declare function useUserId(options?: {
|
|
40
|
+
enabled?: boolean;
|
|
41
|
+
}): import("@tanstack/react-query").UseQueryResult<MoghAuth.Types.GetUserIdResponse, Error>;
|
|
32
42
|
export declare function useManageAuth<T extends MoghAuth.Types.ManageRequest["type"], R extends Extract<MoghAuth.Types.ManageRequest, {
|
|
33
43
|
type: T;
|
|
34
44
|
}>, P extends R["params"], C extends Omit<UseMutationOptions<MoghAuth.ManageResponses[T], unknown, P, unknown>, "mutationKey" | "mutationFn">>(type: T, config?: C): import("@tanstack/react-query").UseMutationResult<MoghAuth.ManageResponses[R["type"]], {
|
package/dist/auth/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,kBAAkB,EAEnB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAG7C,cAAc,SAAS,CAAC;AACxB,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC;AAExB,eAAO,IAAI,QAAQ,EAAE,MAAM,CAAC;AAE5B;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,QAErC;AAED,wBAAgB,UAAU;;;;;;;;EAEzB;AAED,wBAAgB,eAAe,kGAK9B;AAED,wBAAgB,QAAQ,CACtB,CAAC,SAAS,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,EAC7C,CAAC,SAAS,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,YAAY,EAAE;IAAE,IAAI,EAAE,CAAC,CAAA;CAAE,CAAC,EAC3D,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,EACrB,CAAC,SAAS,IAAI,CACZ,kBAAkB,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,CAAC,EACnE,aAAa,GAAG,YAAY,CAC7B,EACD,IAAI,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC;YAIM;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE;eAmB9D;AAED,wBAAgB,SAAS,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,kBAAkB,EAEnB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAG7C,cAAc,SAAS,CAAC;AACxB,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC;AAExB,eAAO,IAAI,QAAQ,EAAE,MAAM,CAAC;AAE5B;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,QAErC;AAED,wBAAgB,UAAU;;;;;;;;EAEzB;AAED,wBAAgB,eAAe,kGAK9B;AAED,wBAAgB,QAAQ,CACtB,CAAC,SAAS,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,EAC7C,CAAC,SAAS,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,YAAY,EAAE;IAAE,IAAI,EAAE,CAAC,CAAA;CAAE,CAAC,EAC3D,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,EACrB,CAAC,SAAS,IAAI,CACZ,kBAAkB,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,CAAC,EACnE,aAAa,GAAG,YAAY,CAC7B,EACD,IAAI,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC;YAIM;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE;eAmB9D;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,2FAMxD;AAED,wBAAgB,aAAa,CAC3B,CAAC,SAAS,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,EAC9C,CAAC,SAAS,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,aAAa,EAAE;IAAE,IAAI,EAAE,CAAC,CAAA;CAAE,CAAC,EAC5D,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,EACrB,CAAC,SAAS,IAAI,CACZ,kBAAkB,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,CAAC,EACpE,aAAa,GAAG,YAAY,CAC7B,EACD,IAAI,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC;YAIM;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE;eAmB9D;AAMD,wBAAgB,YAAY;;;;EAiD3B"}
|
package/dist/auth/index.js
CHANGED
|
@@ -43,11 +43,11 @@ function useLogin(type, config) {
|
|
|
43
43
|
...config
|
|
44
44
|
});
|
|
45
45
|
}
|
|
46
|
-
function useUserId() {
|
|
46
|
+
function useUserId(options) {
|
|
47
47
|
return useQuery({
|
|
48
|
-
queryKey: [""],
|
|
48
|
+
queryKey: ["GetUserId"],
|
|
49
49
|
queryFn: () => authClient().manage("GetUserId", {}),
|
|
50
|
-
enabled: !!MoghAuth.LOGIN_TOKENS.jwt()
|
|
50
|
+
enabled: (options?.enabled ?? true) && !!MoghAuth.LOGIN_TOKENS.jwt()
|
|
51
51
|
});
|
|
52
52
|
}
|
|
53
53
|
function useManageAuth(type, config) {
|
package/dist/auth/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/auth/index.ts"],"sourcesContent":["import { notifications } from \"@mantine/notifications\";\nimport {\n useMutation,\n UseMutationOptions,\n useQuery,\n} from \"@tanstack/react-query\";\nimport * as MoghAuth from \"mogh_auth_client\";\nimport { sanitizeQueryInner } from \"./utils\";\n\nexport * from \"./login\";\nexport * from \"./profile\";\nexport * from \"./utils\";\n\nexport let AUTH_URL: string;\n\n/**\n * Set the global auth url.\n * Make sure to call this before first render.\n * @param url The global url\n */\nexport function setAuthUrl(url: string) {\n AUTH_URL = url;\n}\n\nexport function authClient() {\n return MoghAuth.MoghAuthClient(AUTH_URL, MoghAuth.LOGIN_TOKENS!.jwt());\n}\n\nexport function useLoginOptions() {\n return useQuery({\n queryKey: [\"GetLoginOptions\"],\n queryFn: () => authClient().login(\"GetLoginOptions\", {}),\n });\n}\n\nexport function useLogin<\n T extends MoghAuth.Types.LoginRequest[\"type\"],\n R extends Extract<MoghAuth.Types.LoginRequest, { type: T }>,\n P extends R[\"params\"],\n C extends Omit<\n UseMutationOptions<MoghAuth.LoginResponses[T], unknown, P, unknown>,\n \"mutationKey\" | \"mutationFn\"\n >,\n>(type: T, config?: C) {\n return useMutation({\n mutationKey: [type],\n mutationFn: (params: P) => authClient().login<T, R>(type, params),\n onError: (e: { result: { error?: string; trace?: string[] } }, ...args) => {\n console.log(\"Login error:\", e);\n const msg = e.result.error ?? \"Unknown error. See console.\";\n const detail = e.result?.trace\n ?.map((msg) => msg[0].toUpperCase() + msg.slice(1))\n .join(\" | \");\n let msg_log = msg ? msg[0].toUpperCase() + msg.slice(1) + \" | \" : \"\";\n if (detail) {\n msg_log += detail + \" | \";\n }\n notifications.show({\n title: `Login request ${type} failed`,\n message: `${msg_log}See console for details`,\n color: \"red\",\n });\n config?.onError && config.onError(e, ...args);\n },\n ...config,\n });\n}\n\nexport function useUserId() {\n return useQuery({\n queryKey: [\"\"],\n queryFn: () => authClient().manage(\"GetUserId\", {}),\n enabled: !!MoghAuth.LOGIN_TOKENS!.jwt(),\n });\n}\n\nexport function useManageAuth<\n T extends MoghAuth.Types.ManageRequest[\"type\"],\n R extends Extract<MoghAuth.Types.ManageRequest, { type: T }>,\n P extends R[\"params\"],\n C extends Omit<\n UseMutationOptions<MoghAuth.ManageResponses[T], unknown, P, unknown>,\n \"mutationKey\" | \"mutationFn\"\n >,\n>(type: T, config?: C) {\n return useMutation({\n mutationKey: [type],\n mutationFn: (params: P) => authClient().manage<T, R>(type, params),\n onError: (e: { result: { error?: string; trace?: string[] } }, ...args) => {\n console.log(\"Manage auth error:\", e);\n const msg = e.result.error ?? \"Unknown error. See console.\";\n const detail = e.result?.trace\n ?.map((msg) => msg[0].toUpperCase() + msg.slice(1))\n .join(\" | \");\n let msg_log = msg ? msg[0].toUpperCase() + msg.slice(1) + \" | \" : \"\";\n if (detail) {\n msg_log += detail + \" | \";\n }\n notifications.show({\n title: `Manage auth request ${type} failed`,\n message: `${msg_log}See console for details`,\n color: \"red\",\n });\n config?.onError && config.onError(e, ...args);\n },\n ...config,\n });\n}\n\nlet jwt_redeem_sent = false;\nlet passkey_sent = false;\n\n/// returns whether to show login / loading screen depending on state of exchange token loop\nexport function useAuthState() {\n const onSuccess = ({ jwt }: MoghAuth.Types.JwtResponse) => {\n MoghAuth.LOGIN_TOKENS!.add_and_change(jwt);\n sanitizeQueryInner(search);\n };\n const { mutate: redeemJwt } = useLogin(\"ExchangeForJwt\", {\n onSuccess,\n });\n const { mutate: completePasskeyLogin } = useLogin(\"CompletePasskeyLogin\", {\n onSuccess,\n });\n const search = new URLSearchParams(location.search);\n\n const _passkey = search.get(\"passkey\");\n const passkey = _passkey\n ? JSON.parse(MoghAuth.Passkey.base64UrlDecode(_passkey))\n : null;\n\n // guard against multiple reqs sent\n // maybe isPending would do this but not sure about with render loop, this for sure will.\n if (passkey && !passkey_sent) {\n navigator.credentials\n .get(MoghAuth.Passkey.prepareRequestChallengeResponse(passkey))\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 passkey_sent = true;\n }\n\n const jwt_redeem_ready = search.get(\"redeem_ready\") === \"true\";\n\n // guard against multiple reqs sent\n // maybe isPending would do this but not sure about with render loop, this for sure will.\n if (jwt_redeem_ready && !jwt_redeem_sent) {\n redeemJwt({});\n jwt_redeem_sent = true;\n }\n\n return {\n jwt_redeem_ready,\n passkey_pending: !!passkey,\n totp: search.get(\"totp\") === \"true\",\n };\n}\n"],"mappings":"AAAA,SAAS,qBAAqB;AAC9B;AAAA,EACE;AAAA,EAEA;AAAA,OACK;AACP,YAAY,cAAc;AAC1B,SAAS,0BAA0B;AAEnC,cAAc;AACd,cAAc;AACd,cAAc;AAEP,IAAI;AAOJ,SAAS,WAAW,KAAa;AACtC,aAAW;AACb;AAEO,SAAS,aAAa;AAC3B,SAAO,SAAS,eAAe,UAAU,SAAS,aAAc,IAAI,CAAC;AACvE;AAEO,SAAS,kBAAkB;AAChC,SAAO,SAAS;AAAA,IACd,UAAU,CAAC,iBAAiB;AAAA,IAC5B,SAAS,MAAM,WAAW,EAAE,MAAM,mBAAmB,CAAC,CAAC;AAAA,EACzD,CAAC;AACH;AAEO,SAAS,SAQd,MAAS,QAAY;AACrB,SAAO,YAAY;AAAA,IACjB,aAAa,CAAC,IAAI;AAAA,IAClB,YAAY,CAAC,WAAc,WAAW,EAAE,MAAY,MAAM,MAAM;AAAA,IAChE,SAAS,CAAC,MAAwD,SAAS;AACzE,cAAQ,IAAI,gBAAgB,CAAC;AAC7B,YAAM,MAAM,EAAE,OAAO,SAAS;AAC9B,YAAM,SAAS,EAAE,QAAQ,OACrB,IAAI,CAACA,SAAQA,KAAI,CAAC,EAAE,YAAY,IAAIA,KAAI,MAAM,CAAC,CAAC,EACjD,KAAK,KAAK;AACb,UAAI,UAAU,MAAM,IAAI,CAAC,EAAE,YAAY,IAAI,IAAI,MAAM,CAAC,IAAI,QAAQ;AAClE,UAAI,QAAQ;AACV,mBAAW,SAAS;AAAA,MACtB;AACA,oBAAc,KAAK;AAAA,QACjB,OAAO,iBAAiB,IAAI;AAAA,QAC5B,SAAS,GAAG,OAAO;AAAA,QACnB,OAAO;AAAA,MACT,CAAC;AACD,cAAQ,WAAW,OAAO,QAAQ,GAAG,GAAG,IAAI;AAAA,IAC9C;AAAA,IACA,GAAG;AAAA,EACL,CAAC;AACH;
|
|
1
|
+
{"version":3,"sources":["../../src/auth/index.ts"],"sourcesContent":["import { notifications } from \"@mantine/notifications\";\nimport {\n useMutation,\n UseMutationOptions,\n useQuery,\n} from \"@tanstack/react-query\";\nimport * as MoghAuth from \"mogh_auth_client\";\nimport { sanitizeQueryInner } from \"./utils\";\n\nexport * from \"./login\";\nexport * from \"./profile\";\nexport * from \"./utils\";\n\nexport let AUTH_URL: string;\n\n/**\n * Set the global auth url.\n * Make sure to call this before first render.\n * @param url The global url\n */\nexport function setAuthUrl(url: string) {\n AUTH_URL = url;\n}\n\nexport function authClient() {\n return MoghAuth.MoghAuthClient(AUTH_URL, MoghAuth.LOGIN_TOKENS!.jwt());\n}\n\nexport function useLoginOptions() {\n return useQuery({\n queryKey: [\"GetLoginOptions\"],\n queryFn: () => authClient().login(\"GetLoginOptions\", {}),\n });\n}\n\nexport function useLogin<\n T extends MoghAuth.Types.LoginRequest[\"type\"],\n R extends Extract<MoghAuth.Types.LoginRequest, { type: T }>,\n P extends R[\"params\"],\n C extends Omit<\n UseMutationOptions<MoghAuth.LoginResponses[T], unknown, P, unknown>,\n \"mutationKey\" | \"mutationFn\"\n >,\n>(type: T, config?: C) {\n return useMutation({\n mutationKey: [type],\n mutationFn: (params: P) => authClient().login<T, R>(type, params),\n onError: (e: { result: { error?: string; trace?: string[] } }, ...args) => {\n console.log(\"Login error:\", e);\n const msg = e.result.error ?? \"Unknown error. See console.\";\n const detail = e.result?.trace\n ?.map((msg) => msg[0].toUpperCase() + msg.slice(1))\n .join(\" | \");\n let msg_log = msg ? msg[0].toUpperCase() + msg.slice(1) + \" | \" : \"\";\n if (detail) {\n msg_log += detail + \" | \";\n }\n notifications.show({\n title: `Login request ${type} failed`,\n message: `${msg_log}See console for details`,\n color: \"red\",\n });\n config?.onError && config.onError(e, ...args);\n },\n ...config,\n });\n}\n\n/**\n * Look up the signed in user's id.\n *\n * Pass `enabled: false` where the host app already knows the answer\n * from its own session query. Every request which fails auth counts\n * against the server's per IP auth rate limit, so a token the server\n * rejects should only ever be sent once.\n */\nexport function useUserId(options?: { enabled?: boolean }) {\n return useQuery({\n queryKey: [\"GetUserId\"],\n queryFn: () => authClient().manage(\"GetUserId\", {}),\n enabled: (options?.enabled ?? true) && !!MoghAuth.LOGIN_TOKENS!.jwt(),\n });\n}\n\nexport function useManageAuth<\n T extends MoghAuth.Types.ManageRequest[\"type\"],\n R extends Extract<MoghAuth.Types.ManageRequest, { type: T }>,\n P extends R[\"params\"],\n C extends Omit<\n UseMutationOptions<MoghAuth.ManageResponses[T], unknown, P, unknown>,\n \"mutationKey\" | \"mutationFn\"\n >,\n>(type: T, config?: C) {\n return useMutation({\n mutationKey: [type],\n mutationFn: (params: P) => authClient().manage<T, R>(type, params),\n onError: (e: { result: { error?: string; trace?: string[] } }, ...args) => {\n console.log(\"Manage auth error:\", e);\n const msg = e.result.error ?? \"Unknown error. See console.\";\n const detail = e.result?.trace\n ?.map((msg) => msg[0].toUpperCase() + msg.slice(1))\n .join(\" | \");\n let msg_log = msg ? msg[0].toUpperCase() + msg.slice(1) + \" | \" : \"\";\n if (detail) {\n msg_log += detail + \" | \";\n }\n notifications.show({\n title: `Manage auth request ${type} failed`,\n message: `${msg_log}See console for details`,\n color: \"red\",\n });\n config?.onError && config.onError(e, ...args);\n },\n ...config,\n });\n}\n\nlet jwt_redeem_sent = false;\nlet passkey_sent = false;\n\n/// returns whether to show login / loading screen depending on state of exchange token loop\nexport function useAuthState() {\n const onSuccess = ({ jwt }: MoghAuth.Types.JwtResponse) => {\n MoghAuth.LOGIN_TOKENS!.add_and_change(jwt);\n sanitizeQueryInner(search);\n };\n const { mutate: redeemJwt } = useLogin(\"ExchangeForJwt\", {\n onSuccess,\n });\n const { mutate: completePasskeyLogin } = useLogin(\"CompletePasskeyLogin\", {\n onSuccess,\n });\n const search = new URLSearchParams(location.search);\n\n const _passkey = search.get(\"passkey\");\n const passkey = _passkey\n ? JSON.parse(MoghAuth.Passkey.base64UrlDecode(_passkey))\n : null;\n\n // guard against multiple reqs sent\n // maybe isPending would do this but not sure about with render loop, this for sure will.\n if (passkey && !passkey_sent) {\n navigator.credentials\n .get(MoghAuth.Passkey.prepareRequestChallengeResponse(passkey))\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 passkey_sent = true;\n }\n\n const jwt_redeem_ready = search.get(\"redeem_ready\") === \"true\";\n\n // guard against multiple reqs sent\n // maybe isPending would do this but not sure about with render loop, this for sure will.\n if (jwt_redeem_ready && !jwt_redeem_sent) {\n redeemJwt({});\n jwt_redeem_sent = true;\n }\n\n return {\n jwt_redeem_ready,\n passkey_pending: !!passkey,\n totp: search.get(\"totp\") === \"true\",\n };\n}\n"],"mappings":"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","names":["msg"]}
|
|
@@ -44,6 +44,7 @@ var import__ = require("../..");
|
|
|
44
44
|
function LoginPage({
|
|
45
45
|
passkeyIsPending: _passkeyIsPending,
|
|
46
46
|
totpIsPending: _totpIsPending,
|
|
47
|
+
alreadyLoggedIn: _alreadyLoggedIn,
|
|
47
48
|
onLogin,
|
|
48
49
|
exampleConfigLink,
|
|
49
50
|
...branding
|
|
@@ -54,7 +55,8 @@ function LoginPage({
|
|
|
54
55
|
);
|
|
55
56
|
const [totpIsPending, setTotpPending] = (0, import_react2.useState)(_totpIsPending ?? false);
|
|
56
57
|
const secondFactorPending = passkeyIsPending || totpIsPending;
|
|
57
|
-
const
|
|
58
|
+
const userId = (0, import__.useUserId)({ enabled: _alreadyLoggedIn === void 0 });
|
|
59
|
+
const alreadyLoggedIn = _alreadyLoggedIn ?? !!userId.data?.id;
|
|
58
60
|
(0, import_react2.useEffect)(() => {
|
|
59
61
|
if (options?.oidc_auto_redirect && options?.oidc && !secondFactorPending) {
|
|
60
62
|
const params = new URLSearchParams(location.search);
|
|
@@ -1 +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 { useEffect, useState } from \"react\";\nimport LoginHeader from \"./header\";\nimport {\n authClient,\n BackButton,\n sanitizeQuery,\n useLogin,\n useLoginOptions,\n useUserId,\n} 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 const alreadyLoggedIn = useUserId().data?.id!!;\n\n // Auto-redirect to OIDC provider if configured and disableAutoLogin is not set\n useEffect(() => {\n if (options?.oidc_auto_redirect && options?.oidc && !secondFactorPending) {\n const params = new URLSearchParams(location.search);\n if (!params.has(\"disableAutoLogin\")) {\n authClient().externalLogin(MoghAuth.Types.ExternalLoginProvider.Oidc);\n }\n }\n }, [options?.oidc_auto_redirect, options?.oidc, secondFactorPending]);\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=\"space-between\">\n {alreadyLoggedIn && (\n <BackButton\n to={new URLSearchParams(location.search).get(\"backto\") ?? \"/\"}\n />\n )}\n <Group 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 </Group>\n </>\n )}\n\n {alreadyLoggedIn && !(options?.local && !secondFactorPending) && (\n <Group>\n <BackButton\n to={new URLSearchParams(location.search).get(\"backto\") ?? \"/\"}\n />\n </Group>\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"]}
|
|
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 { useEffect, useState } from \"react\";\nimport LoginHeader from \"./header\";\nimport {\n authClient,\n BackButton,\n sanitizeQuery,\n useLogin,\n useLoginOptions,\n useUserId,\n} 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 alreadyLoggedIn: _alreadyLoggedIn,\n onLogin,\n exampleConfigLink,\n ...branding\n}: {\n passkeyIsPending?: boolean;\n totpIsPending?: boolean;\n /**\n * Whether another user is already signed in, which puts a back button\n * on the form. Pass it from the host app's own session query. Left\n * out, the login page has to query the api itself, which counts \n * against its auth rate limit.\n */\n alreadyLoggedIn?: 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 const userId = useUserId({ enabled: _alreadyLoggedIn === undefined });\n const alreadyLoggedIn = _alreadyLoggedIn ?? !!userId.data?.id;\n\n // Auto-redirect to OIDC provider if configured and disableAutoLogin is not set\n useEffect(() => {\n if (options?.oidc_auto_redirect && options?.oidc && !secondFactorPending) {\n const params = new URLSearchParams(location.search);\n if (!params.has(\"disableAutoLogin\")) {\n authClient().externalLogin(MoghAuth.Types.ExternalLoginProvider.Oidc);\n }\n }\n }, [options?.oidc_auto_redirect, options?.oidc, secondFactorPending]);\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=\"space-between\">\n {alreadyLoggedIn && (\n <BackButton\n to={new URLSearchParams(location.search).get(\"backto\") ?? \"/\"}\n />\n )}\n <Group 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 </Group>\n </>\n )}\n\n {alreadyLoggedIn && !(options?.local && !secondFactorPending) && (\n <Group>\n <BackButton\n to={new URLSearchParams(location.search).get(\"backto\") ?? \"/\"}\n />\n </Group>\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"]}
|
|
@@ -3,9 +3,16 @@ export interface LoginBrandingProps {
|
|
|
3
3
|
iconLink: string;
|
|
4
4
|
iconLinkAlt: string;
|
|
5
5
|
}
|
|
6
|
-
export declare function LoginPage({ passkeyIsPending: _passkeyIsPending, totpIsPending: _totpIsPending, onLogin, exampleConfigLink, ...branding }: {
|
|
6
|
+
export declare function LoginPage({ passkeyIsPending: _passkeyIsPending, totpIsPending: _totpIsPending, alreadyLoggedIn: _alreadyLoggedIn, onLogin, exampleConfigLink, ...branding }: {
|
|
7
7
|
passkeyIsPending?: boolean;
|
|
8
8
|
totpIsPending?: boolean;
|
|
9
|
+
/**
|
|
10
|
+
* Whether another user is already signed in, which puts a back button
|
|
11
|
+
* on the form. Pass it from the host app's own session query. Left
|
|
12
|
+
* out, the login page has to query the api itself, which counts
|
|
13
|
+
* against its auth rate limit.
|
|
14
|
+
*/
|
|
15
|
+
alreadyLoggedIn?: boolean;
|
|
9
16
|
onLogin?: () => void;
|
|
10
17
|
exampleConfigLink: string;
|
|
11
18
|
} & LoginBrandingProps): import("react").JSX.Element;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/auth/login/index.tsx"],"names":[],"mappings":"AAyBA,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,SAAS,CAAC,EACxB,gBAAgB,EAAE,iBAAiB,EACnC,aAAa,EAAE,cAAc,EAC7B,OAAO,EACP,iBAAiB,EACjB,GAAG,QAAQ,EACZ,EAAE;IACD,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;CAC3B,GAAG,kBAAkB,+
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/auth/login/index.tsx"],"names":[],"mappings":"AAyBA,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,SAAS,CAAC,EACxB,gBAAgB,EAAE,iBAAiB,EACnC,aAAa,EAAE,cAAc,EAC7B,eAAe,EAAE,gBAAgB,EACjC,OAAO,EACP,iBAAiB,EACjB,GAAG,QAAQ,EACZ,EAAE;IACD,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;;;OAKG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;CAC3B,GAAG,kBAAkB,+BAqPrB"}
|
package/dist/auth/login/index.js
CHANGED
|
@@ -27,6 +27,7 @@ import {
|
|
|
27
27
|
function LoginPage({
|
|
28
28
|
passkeyIsPending: _passkeyIsPending,
|
|
29
29
|
totpIsPending: _totpIsPending,
|
|
30
|
+
alreadyLoggedIn: _alreadyLoggedIn,
|
|
30
31
|
onLogin,
|
|
31
32
|
exampleConfigLink,
|
|
32
33
|
...branding
|
|
@@ -37,7 +38,8 @@ function LoginPage({
|
|
|
37
38
|
);
|
|
38
39
|
const [totpIsPending, setTotpPending] = useState(_totpIsPending ?? false);
|
|
39
40
|
const secondFactorPending = passkeyIsPending || totpIsPending;
|
|
40
|
-
const
|
|
41
|
+
const userId = useUserId({ enabled: _alreadyLoggedIn === void 0 });
|
|
42
|
+
const alreadyLoggedIn = _alreadyLoggedIn ?? !!userId.data?.id;
|
|
41
43
|
useEffect(() => {
|
|
42
44
|
if (options?.oidc_auto_redirect && options?.oidc && !secondFactorPending) {
|
|
43
45
|
const params = new URLSearchParams(location.search);
|
|
@@ -1 +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 { useEffect, useState } from \"react\";\nimport LoginHeader from \"./header\";\nimport {\n authClient,\n BackButton,\n sanitizeQuery,\n useLogin,\n useLoginOptions,\n useUserId,\n} 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 const alreadyLoggedIn = useUserId().data?.id!!;\n\n // Auto-redirect to OIDC provider if configured and disableAutoLogin is not set\n useEffect(() => {\n if (options?.oidc_auto_redirect && options?.oidc && !secondFactorPending) {\n const params = new URLSearchParams(location.search);\n if (!params.has(\"disableAutoLogin\")) {\n authClient().externalLogin(MoghAuth.Types.ExternalLoginProvider.Oidc);\n }\n }\n }, [options?.oidc_auto_redirect, options?.oidc, secondFactorPending]);\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=\"space-between\">\n {alreadyLoggedIn && (\n <BackButton\n to={new URLSearchParams(location.search).get(\"backto\") ?? \"/\"}\n />\n )}\n <Group 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 </Group>\n </>\n )}\n\n {alreadyLoggedIn && !(options?.local && !secondFactorPending) && (\n <Group>\n <BackButton\n to={new URLSearchParams(location.search).get(\"backto\") ?? \"/\"}\n />\n </Group>\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":[]}
|
|
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 { useEffect, useState } from \"react\";\nimport LoginHeader from \"./header\";\nimport {\n authClient,\n BackButton,\n sanitizeQuery,\n useLogin,\n useLoginOptions,\n useUserId,\n} 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 alreadyLoggedIn: _alreadyLoggedIn,\n onLogin,\n exampleConfigLink,\n ...branding\n}: {\n passkeyIsPending?: boolean;\n totpIsPending?: boolean;\n /**\n * Whether another user is already signed in, which puts a back button\n * on the form. Pass it from the host app's own session query. Left\n * out, the login page has to query the api itself, which counts \n * against its auth rate limit.\n */\n alreadyLoggedIn?: 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 const userId = useUserId({ enabled: _alreadyLoggedIn === undefined });\n const alreadyLoggedIn = _alreadyLoggedIn ?? !!userId.data?.id;\n\n // Auto-redirect to OIDC provider if configured and disableAutoLogin is not set\n useEffect(() => {\n if (options?.oidc_auto_redirect && options?.oidc && !secondFactorPending) {\n const params = new URLSearchParams(location.search);\n if (!params.has(\"disableAutoLogin\")) {\n authClient().externalLogin(MoghAuth.Types.ExternalLoginProvider.Oidc);\n }\n }\n }, [options?.oidc_auto_redirect, options?.oidc, secondFactorPending]);\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=\"space-between\">\n {alreadyLoggedIn && (\n <BackButton\n to={new URLSearchParams(location.search).get(\"backto\") ?? \"/\"}\n />\n )}\n <Group 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 </Group>\n </>\n )}\n\n {alreadyLoggedIn && !(options?.local && !secondFactorPending) && (\n <Group>\n <BackButton\n to={new URLSearchParams(location.search).get(\"backto\") ?? \"/\"}\n />\n </Group>\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":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mogh_ui",
|
|
3
|
-
"version": "1.3.
|
|
3
|
+
"version": "1.3.4",
|
|
4
4
|
"description": "Common UI components and styling used across Mogh apps.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
@@ -29,37 +29,37 @@
|
|
|
29
29
|
"typecheck": "tsc --noEmit"
|
|
30
30
|
},
|
|
31
31
|
"peerDependencies": {
|
|
32
|
-
"@mantine/core": "^9.6.
|
|
33
|
-
"@mantine/form": "^9.6.
|
|
34
|
-
"@mantine/hooks": "^9.6.
|
|
35
|
-
"@mantine/notifications": "^9.6.
|
|
32
|
+
"@mantine/core": "^9.6.1",
|
|
33
|
+
"@mantine/form": "^9.6.1",
|
|
34
|
+
"@mantine/hooks": "^9.6.1",
|
|
35
|
+
"@mantine/notifications": "^9.6.1",
|
|
36
36
|
"@monaco-editor/react": "^4.7.0",
|
|
37
37
|
"@tanstack/react-table": "^9.2.4",
|
|
38
38
|
"@tanstack/react-query": "^5.102.8",
|
|
39
|
-
"lucide-react": "^1.
|
|
39
|
+
"lucide-react": "^1.43.0",
|
|
40
40
|
"mogh_auth_client": "^2.1.0",
|
|
41
41
|
"monaco-editor": "^0.56.0",
|
|
42
42
|
"monaco-yaml": "^5.5.1",
|
|
43
|
-
"react": "^19.
|
|
44
|
-
"react-dom": "^19.
|
|
43
|
+
"react": "^19.3.0",
|
|
44
|
+
"react-dom": "^19.3.0",
|
|
45
45
|
"react-router-dom": "^7.18.2"
|
|
46
46
|
},
|
|
47
47
|
"devDependencies": {
|
|
48
|
-
"@mantine/core": "^9.6.
|
|
49
|
-
"@mantine/form": "^9.6.
|
|
50
|
-
"@mantine/hooks": "^9.6.
|
|
51
|
-
"@mantine/notifications": "^9.6.
|
|
48
|
+
"@mantine/core": "^9.6.1",
|
|
49
|
+
"@mantine/form": "^9.6.1",
|
|
50
|
+
"@mantine/hooks": "^9.6.1",
|
|
51
|
+
"@mantine/notifications": "^9.6.1",
|
|
52
52
|
"@monaco-editor/react": "^4.7.0",
|
|
53
53
|
"@tanstack/react-table": "^9.2.4",
|
|
54
54
|
"@tanstack/react-query": "^5.102.8",
|
|
55
|
-
"@types/react": "^19.
|
|
56
|
-
"@types/react-dom": "^19.
|
|
57
|
-
"lucide-react": "^1.
|
|
55
|
+
"@types/react": "^19.3.0",
|
|
56
|
+
"@types/react-dom": "^19.3.0",
|
|
57
|
+
"lucide-react": "^1.43.0",
|
|
58
58
|
"mogh_auth_client": "^2.1.0",
|
|
59
59
|
"monaco-editor": "^0.56.0",
|
|
60
60
|
"monaco-yaml": "^5.5.1",
|
|
61
|
-
"react": "^19.
|
|
62
|
-
"react-dom": "^19.
|
|
61
|
+
"react": "^19.3.0",
|
|
62
|
+
"react-dom": "^19.3.0",
|
|
63
63
|
"react-router-dom": "^7.18.3",
|
|
64
64
|
"tsup": "^8.5.1",
|
|
65
65
|
"typescript": "^7.0.2"
|