@tinyrack/tinyauth-server 0.6.0 → 0.7.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.
- package/dist/entrypoints/app.d.ts +1 -1
- package/dist/routes/api/consent/index.d.ts +1 -1
- package/dist/routes/api/consent/post.d.ts +1 -1
- package/dist/routes/api/consent/post.d.ts.map +1 -1
- package/dist/routes/api/consent/post.js +9 -1
- package/dist/routes/api/consent/post.js.map +1 -1
- package/dist/routes/api/index.d.ts +1 -1
- package/dist/routes/index.d.ts +1 -1
- package/dist/routes/oauth/authorize/get.d.ts.map +1 -1
- package/dist/routes/oauth/authorize/get.js +9 -1
- package/dist/routes/oauth/authorize/get.js.map +1 -1
- package/dist/services/account-selection.service.d.ts.map +1 -1
- package/dist/services/account-selection.service.js +3 -1
- package/dist/services/account-selection.service.js.map +1 -1
- package/dist/services/oauth-authorize.service.d.ts.map +1 -1
- package/dist/services/oauth-authorize.service.js +15 -15
- package/dist/services/oauth-authorize.service.js.map +1 -1
- package/package.json +1 -1
- package/public/assets/2fa-BMEIiDXv.js +2 -0
- package/public/assets/{2fa-SSKfXB7c.js.map → 2fa-BMEIiDXv.js.map} +1 -1
- package/public/assets/{2fa-BoyBKrjD.js → 2fa-BhCgCfEc.js} +2 -2
- package/public/assets/{2fa-BoyBKrjD.js.map → 2fa-BhCgCfEc.js.map} +1 -1
- package/public/assets/2fa-Cteolf9l.js +2 -0
- package/public/assets/{2fa-IkQlgUP0.js.map → 2fa-Cteolf9l.js.map} +1 -1
- package/public/assets/{2fa-DfWvDjDW.js → 2fa-E0x3Samn.js} +2 -2
- package/public/assets/{2fa-DfWvDjDW.js.map → 2fa-E0x3Samn.js.map} +1 -1
- package/public/assets/{admin-D2CMlWzS.js → admin-CXJ0z2QN.js} +2 -2
- package/public/assets/{admin-D2CMlWzS.js.map → admin-CXJ0z2QN.js.map} +1 -1
- package/public/assets/{consent-DwuWkp63.js → consent-B17hGrta.js} +2 -2
- package/public/assets/{consent-DwuWkp63.js.map → consent-B17hGrta.js.map} +1 -1
- package/public/assets/{consent-C5Qo0iLd.js → consent-C-h_pWHQ.js} +2 -2
- package/public/assets/{consent-C5Qo0iLd.js.map → consent-C-h_pWHQ.js.map} +1 -1
- package/public/assets/email-BMEIiDXv.js +2 -0
- package/public/assets/{email-SSKfXB7c.js.map → email-BMEIiDXv.js.map} +1 -1
- package/public/assets/{email-CIttZRBe.js → email-DjE7mqnX.js} +2 -2
- package/public/assets/{email-CIttZRBe.js.map → email-DjE7mqnX.js.map} +1 -1
- package/public/assets/{error-D60wkdWN.js → error-BKXsXhdR.js} +2 -2
- package/public/assets/{error-D60wkdWN.js.map → error-BKXsXhdR.js.map} +1 -1
- package/public/assets/forgot-BMEIiDXv.js +2 -0
- package/public/assets/{forgot-SSKfXB7c.js.map → forgot-BMEIiDXv.js.map} +1 -1
- package/public/assets/{forgot-x-UDyHXT.js → forgot-C9zSfaX9.js} +2 -2
- package/public/assets/{forgot-x-UDyHXT.js.map → forgot-C9zSfaX9.js.map} +1 -1
- package/public/assets/{index-CsT6OVnP.js → index-BmfaaNx6.js} +3 -3
- package/public/assets/index-BmfaaNx6.js.map +1 -0
- package/public/assets/login-BMEIiDXv.js +2 -0
- package/public/assets/login-BMEIiDXv.js.map +1 -0
- package/public/assets/login-DG1Yfmb8.js +2 -0
- package/public/assets/login-DG1Yfmb8.js.map +1 -0
- package/public/assets/{passkey-BdISbWr7.js → passkey-BDrX3jVg.js} +2 -2
- package/public/assets/{passkey-BdISbWr7.js.map → passkey-BDrX3jVg.js.map} +1 -1
- package/public/assets/{passkey-Bv7zPLAZ.js → passkey-C-h8Fvqn.js} +2 -2
- package/public/assets/{passkey-Bv7zPLAZ.js.map → passkey-C-h8Fvqn.js.map} +1 -1
- package/public/assets/password-86C-hCze.js +2 -0
- package/public/assets/password-86C-hCze.js.map +1 -0
- package/public/assets/password-BMEIiDXv.js +2 -0
- package/public/assets/password-BMEIiDXv.js.map +1 -0
- package/public/assets/{profile-D2cuVYgE.js → profile-8buOY6GT.js} +2 -2
- package/public/assets/{profile-D2cuVYgE.js.map → profile-8buOY6GT.js.map} +1 -1
- package/public/assets/{profile-TKdT20x5.js → profile-DcpL_XUt.js} +2 -2
- package/public/assets/{profile-TKdT20x5.js.map → profile-DcpL_XUt.js.map} +1 -1
- package/public/assets/{recovery-DM8h2gbb.js → recovery-Csf6dtvj.js} +2 -2
- package/public/assets/{recovery-DM8h2gbb.js.map → recovery-Csf6dtvj.js.map} +1 -1
- package/public/assets/register-BMEIiDXv.js +2 -0
- package/public/assets/{register-SSKfXB7c.js.map → register-BMEIiDXv.js.map} +1 -1
- package/public/assets/{register-vWW_43cD.js → register-X6dycne4.js} +2 -2
- package/public/assets/{register-vWW_43cD.js.map → register-X6dycne4.js.map} +1 -1
- package/public/assets/{reset-CgACYrdp.js → reset-1nsqPlxL.js} +2 -2
- package/public/assets/{reset-CgACYrdp.js.map → reset-1nsqPlxL.js.map} +1 -1
- package/public/assets/reset-BMEIiDXv.js +2 -0
- package/public/assets/{reset-SSKfXB7c.js.map → reset-BMEIiDXv.js.map} +1 -1
- package/public/assets/select-BMEIiDXv.js +2 -0
- package/public/assets/select-BMEIiDXv.js.map +1 -0
- package/public/assets/{select-BCP5fwfB.js → select-CDdb3jyc.js} +2 -2
- package/public/assets/select-CDdb3jyc.js.map +1 -0
- package/public/assets/{terms-DPWrbYY2.js → terms-CUhvMN9k.js} +2 -2
- package/public/assets/{terms-DPWrbYY2.js.map → terms-CUhvMN9k.js.map} +1 -1
- package/public/assets/{terms-TKdT20x5.js → terms-DcpL_XUt.js} +2 -2
- package/public/assets/{terms-TKdT20x5.js.map → terms-DcpL_XUt.js.map} +1 -1
- package/public/assets/{totp-CKZ6N1NS.js → totp-DB9WqW4V.js} +2 -2
- package/public/assets/{totp-CKZ6N1NS.js.map → totp-DB9WqW4V.js.map} +1 -1
- package/public/assets/{totp-D-PVOsGQ.js → totp-UDT2P91H.js} +2 -2
- package/public/assets/{totp-D-PVOsGQ.js.map → totp-UDT2P91H.js.map} +1 -1
- package/public/assets/{use-totp-setup-BH75uEbE.js → use-totp-setup-9fktn_he.js} +2 -2
- package/public/assets/{use-totp-setup-BH75uEbE.js.map → use-totp-setup-9fktn_he.js.map} +1 -1
- package/public/assets/{useMutation-DVMopbtG.js → useMutation-Iu4AJCB4.js} +2 -2
- package/public/assets/{useMutation-DVMopbtG.js.map → useMutation-Iu4AJCB4.js.map} +1 -1
- package/public/assets/{users-B7ofdp72.js → users-Bi7gjreq.js} +2 -2
- package/public/assets/{users-B7ofdp72.js.map → users-Bi7gjreq.js.map} +1 -1
- package/public/index.html +1 -1
- package/public/assets/2fa-IkQlgUP0.js +0 -2
- package/public/assets/2fa-SSKfXB7c.js +0 -2
- package/public/assets/email-SSKfXB7c.js +0 -2
- package/public/assets/forgot-SSKfXB7c.js +0 -2
- package/public/assets/index-CsT6OVnP.js.map +0 -1
- package/public/assets/login-DhbnCudI.js +0 -2
- package/public/assets/login-DhbnCudI.js.map +0 -1
- package/public/assets/login-SSKfXB7c.js +0 -2
- package/public/assets/login-SSKfXB7c.js.map +0 -1
- package/public/assets/password-CkeV4qxb.js +0 -2
- package/public/assets/password-CkeV4qxb.js.map +0 -1
- package/public/assets/password-SSKfXB7c.js +0 -2
- package/public/assets/password-SSKfXB7c.js.map +0 -1
- package/public/assets/register-SSKfXB7c.js +0 -2
- package/public/assets/reset-SSKfXB7c.js +0 -2
- package/public/assets/select-BCP5fwfB.js.map +0 -1
- package/public/assets/select-SSKfXB7c.js +0 -2
- package/public/assets/select-SSKfXB7c.js.map +0 -1
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{o as e,r as t,s as n,t as r,u as i}from"./IconBase.es-d5KP98Ac.js";import{Q as a,f as o,h as s,n as c,ut as l}from"./use-theme-cVUDAjtt.js";import{t as u}from"./useMutation-DVMopbtG.js";import{t as d}from"./page-layout-C475gs09.js";import{t as f}from"./EnvelopeSimple.es-BZ7u3LYh.js";import{t as p}from"./Fingerprint.es-CW755VWD.js";import{t as m}from"./Link.es-B-IJS4Q5.js";import{A as h,M as g,P as _,S as v,b as y,j as b}from"./index-CsT6OVnP.js";import{t as x}from"./page-header-BYMFSGfT.js";import{t as S}from"./alert-CSXqgDVi.js";import{t as C}from"./promise-OpBtq8tG.js";import{t as w}from"./passkey-e6uvApHa.js";var T=i(n(),1),E=new Map([[`bold`,T.createElement(T.Fragment,null,T.createElement(`path`,{d:`M227,168a12,12,0,0,0-4.21-5.09C207.25,152.22,204,133.68,204,120c0-16.17,12.68-30.6,20.25-37.76a12,12,0,0,0,0-17.43C210.89,52.17,188.81,44,168,44a76.29,76.29,0,0,0-40,11.37,75.59,75.59,0,0,0-93.58,11A78.64,78.64,0,0,0,12,123.51,131,131,0,0,0,53.43,216,43.81,43.81,0,0,0,83.6,228h87.69a43.87,43.87,0,0,0,32.05-13.85,127.63,127.63,0,0,0,18.4-25.39c1.57-2.88,3-5.71,4.14-8.41C227.47,176.67,229.12,172.87,227,168Zm-41.23,29.82A19.78,19.78,0,0,1,171.29,204H83.6a19.85,19.85,0,0,1-13.7-5.42A107.18,107.18,0,0,1,36,122.88,54.49,54.49,0,0,1,51.5,83.28,50.86,50.86,0,0,1,88,68h.72A51.5,51.5,0,0,1,120.48,79.4a12,12,0,0,0,15,0A51.41,51.41,0,0,1,168,68a67.24,67.24,0,0,1,29.88,7.4C186.26,89.66,180,105.13,180,120c0,23.33,7.47,42.89,21.25,56.19A103.3,103.3,0,0,1,185.76,197.81ZM128.75,13A43.83,43.83,0,0,1,142.17,1.51a12,12,0,0,1,11.64,21,19.84,19.84,0,0,0-6.11,5.24A12,12,0,0,1,128.75,13Z`}))],[`duotone`,T.createElement(T.Fragment,null,T.createElement(`path`,{d:`M216,73.52Zm0,99.26c-16.79-11.53-24-30.87-24-52.78,0-18.3,11.68-34.81,24-46.48C204.53,62.66,185,56,168,56a63.72,63.72,0,0,0-40,14h0A63.71,63.71,0,0,0,88.88,56C52,55.5,23.06,86.3,24,123.19a119.62,119.62,0,0,0,37.65,84.12A32,32,0,0,0,83.6,216h87.7a31.75,31.75,0,0,0,23.26-10c15.85-17,21.44-33.2,21.44-33.2Z`,opacity:`0.2`}),T.createElement(`path`,{d:`M223.3,169.59a8.07,8.07,0,0,0-2.8-3.4C203.53,154.53,200,134.64,200,120c0-17.67,13.47-33.06,21.5-40.67a8,8,0,0,0,0-11.62C208.82,55.74,187.82,48,168,48a72.23,72.23,0,0,0-40,12.13,71.56,71.56,0,0,0-90.71,9.09A74.63,74.63,0,0,0,16,123.4a127,127,0,0,0,40.14,89.73A39.8,39.8,0,0,0,83.59,224h87.68a39.84,39.84,0,0,0,29.12-12.57,125,125,0,0,0,17.82-24.6C225.23,174,224.33,172,223.3,169.59Zm-34.63,30.94a23.76,23.76,0,0,1-17.4,7.47H83.59a23.82,23.82,0,0,1-16.44-6.51A111.14,111.14,0,0,1,32,123,58.5,58.5,0,0,1,48.65,80.47,54.81,54.81,0,0,1,88,64h.78A55.45,55.45,0,0,1,123,76.28a8,8,0,0,0,10,0A55.39,55.39,0,0,1,168,64a70.64,70.64,0,0,1,36,10.35c-13,14.52-20,30.47-20,45.65,0,23.77,7.64,42.73,22.18,55.3A105.52,105.52,0,0,1,188.67,200.53ZM128.23,30A40,40,0,0,1,167,0h1a8,8,0,0,1,0,16h-1a24,24,0,0,0-23.24,18,8,8,0,1,1-15.5-4Z`}))],[`fill`,T.createElement(T.Fragment,null,T.createElement(`path`,{d:`M128.23,30A40,40,0,0,1,167,0h1a8,8,0,0,1,0,16h-1a24,24,0,0,0-23.24,18,8,8,0,1,1-15.5-4ZM223.3,169.59a8.07,8.07,0,0,0-2.8-3.4C203.53,154.53,200,134.64,200,120c0-17.67,13.47-33.06,21.5-40.67a8,8,0,0,0,0-11.62C208.82,55.74,187.82,48,168,48a72.23,72.23,0,0,0-40,12.13,71.56,71.56,0,0,0-90.71,9.09A74.63,74.63,0,0,0,16,123.4a127,127,0,0,0,40.14,89.73A39.8,39.8,0,0,0,83.59,224h87.68a39.84,39.84,0,0,0,29.12-12.57,125,125,0,0,0,17.82-24.6C225.23,174,224.33,172,223.3,169.59Z`}))],[`light`,T.createElement(T.Fragment,null,T.createElement(`path`,{d:`M219.4,167.84C201.71,155.69,198,135.12,198,120c0-18.42,13.86-34.29,22.12-42.12a6,6,0,0,0,0-8.71C208,57.7,187.07,50,168,50a70.23,70.23,0,0,0-40,12.55,69.6,69.6,0,0,0-89.31,8.08A72.63,72.63,0,0,0,18,123.35a125.11,125.11,0,0,0,39.53,88.33A37.85,37.85,0,0,0,83.6,222h87.7A37.83,37.83,0,0,0,199,210.07a122.6,122.6,0,0,0,17.54-24.2c6.55-12,5.77-13.75,5-15.48A6.07,6.07,0,0,0,219.4,167.84Zm-29.23,34A25.82,25.82,0,0,1,171.3,210H83.6A25.85,25.85,0,0,1,65.78,203,113.21,113.21,0,0,1,30,123a60.55,60.55,0,0,1,17.21-44A56.82,56.82,0,0,1,88,62h.81a57.35,57.35,0,0,1,35.44,12.71,6,6,0,0,0,7.5,0A57.39,57.39,0,0,1,168,62c13.89,0,28.81,4.68,39.11,12-9.44,10.14-21.1,26.59-21.1,46,0,23.78,7.81,42.6,22.66,54.77A107.33,107.33,0,0,1,190.17,201.89Zm-60-171.39A38,38,0,0,1,167,2h1a6,6,0,0,1,0,12h-1a26,26,0,0,0-25.18,19.5,6,6,0,1,1-11.62-3Z`}))],[`regular`,T.createElement(T.Fragment,null,T.createElement(`path`,{d:`M223.3,169.59a8.07,8.07,0,0,0-2.8-3.4C203.53,154.53,200,134.64,200,120c0-17.67,13.47-33.06,21.5-40.67a8,8,0,0,0,0-11.62C208.82,55.74,187.82,48,168,48a72.2,72.2,0,0,0-40,12.13,71.56,71.56,0,0,0-90.71,9.09A74.63,74.63,0,0,0,16,123.4a127.06,127.06,0,0,0,40.14,89.73A39.8,39.8,0,0,0,83.59,224h87.68a39.84,39.84,0,0,0,29.12-12.57,125,125,0,0,0,17.82-24.6C225.23,174,224.33,172,223.3,169.59Zm-34.63,30.94a23.76,23.76,0,0,1-17.4,7.47H83.59a23.82,23.82,0,0,1-16.44-6.51A111.14,111.14,0,0,1,32,123,58.5,58.5,0,0,1,48.65,80.47,54.81,54.81,0,0,1,88,64h.78A55.45,55.45,0,0,1,123,76.28a8,8,0,0,0,10,0A55.44,55.44,0,0,1,168,64a70.64,70.64,0,0,1,36,10.35c-13,14.52-20,30.47-20,45.65,0,23.77,7.64,42.73,22.18,55.3A105.82,105.82,0,0,1,188.67,200.53ZM128.23,30A40,40,0,0,1,167,0h1a8,8,0,0,1,0,16h-1a24,24,0,0,0-23.24,18,8,8,0,1,1-15.5-4Z`}))],[`thin`,T.createElement(T.Fragment,null,T.createElement(`path`,{d:`M218.27,169.49C199.86,156.84,196,135.6,196,120c0-19.17,14.25-35.53,22.75-43.57a4,4,0,0,0,0-5.81C207,59.48,186.59,52,168,52a68.3,68.3,0,0,0-40,13,67.61,67.61,0,0,0-87.88,7A70.65,70.65,0,0,0,20,123.3a123.11,123.11,0,0,0,38.9,86.92A35.81,35.81,0,0,0,83.6,220h87.7a35.84,35.84,0,0,0,26.19-11.3,119.93,119.93,0,0,0,17.24-23.79c6.08-11.1,5.42-12.62,4.94-13.72A4,4,0,0,0,218.27,169.49Zm-26.64,33.77A27.83,27.83,0,0,1,171.3,212H83.6a27.84,27.84,0,0,1-19.19-7.6A115.15,115.15,0,0,1,28,123.09,62.55,62.55,0,0,1,45.81,77.66,58.78,58.78,0,0,1,88,60h.84a59.37,59.37,0,0,1,36.66,13.15,4,4,0,0,0,5,0A59.35,59.35,0,0,1,168,60c15.12,0,31.45,5.41,42.11,13.73C200.68,83.42,188,100.16,188,120c0,23.79,8,42.44,23.12,54.17A107.64,107.64,0,0,1,191.63,203.26ZM132.13,31A36,36,0,0,1,167,4h1a4,4,0,0,1,0,8h-1a28,28,0,0,0-27.12,21A4,4,0,0,1,136,36a3.87,3.87,0,0,1-1-.13A4,4,0,0,1,132.13,31Z`}))]]),D=new Map([[`bold`,T.createElement(T.Fragment,null,T.createElement(`path`,{d:`M212.62,75.17A63.7,63.7,0,0,0,206.39,26,12,12,0,0,0,196,20a63.71,63.71,0,0,0-50,24H126A63.71,63.71,0,0,0,76,20a12,12,0,0,0-10.39,6,63.7,63.7,0,0,0-6.23,49.17A61.5,61.5,0,0,0,52,104v8a60.1,60.1,0,0,0,45.76,58.28A43.66,43.66,0,0,0,92,192v4H76a20,20,0,0,1-20-20,44.05,44.05,0,0,0-44-44,12,12,0,0,0,0,24,20,20,0,0,1,20,20,44.05,44.05,0,0,0,44,44H92v12a12,12,0,0,0,24,0V192a20,20,0,0,1,40,0v40a12,12,0,0,0,24,0V192a43.66,43.66,0,0,0-5.76-21.72A60.1,60.1,0,0,0,220,112v-8A61.5,61.5,0,0,0,212.62,75.17ZM196,112a36,36,0,0,1-36,36H112a36,36,0,0,1-36-36v-8a37.87,37.87,0,0,1,6.13-20.12,11.65,11.65,0,0,0,1.58-11.49,39.9,39.9,0,0,1-.4-27.72,39.87,39.87,0,0,1,26.41,17.8A12,12,0,0,0,119.82,68h32.35a12,12,0,0,0,10.11-5.53,39.84,39.84,0,0,1,26.41-17.8,39.9,39.9,0,0,1-.4,27.72,12,12,0,0,0,1.61,11.53A37.85,37.85,0,0,1,196,104Z`}))],[`duotone`,T.createElement(T.Fragment,null,T.createElement(`path`,{d:`M208,104v8a48,48,0,0,1-48,48H136a32,32,0,0,1,32,32v40H104V192a32,32,0,0,1,32-32H112a48,48,0,0,1-48-48v-8a49.28,49.28,0,0,1,8.51-27.3A51.92,51.92,0,0,1,76,32a52,52,0,0,1,43.83,24h32.34A52,52,0,0,1,196,32a51.92,51.92,0,0,1,3.49,44.7A49.28,49.28,0,0,1,208,104Z`,opacity:`0.2`}),T.createElement(`path`,{d:`M208.3,75.68A59.74,59.74,0,0,0,202.93,28,8,8,0,0,0,196,24a59.75,59.75,0,0,0-48,24H124A59.75,59.75,0,0,0,76,24a8,8,0,0,0-6.93,4,59.78,59.78,0,0,0-5.38,47.68A58.14,58.14,0,0,0,56,104v8a56.06,56.06,0,0,0,48.44,55.47A39.8,39.8,0,0,0,96,192v8H72a24,24,0,0,1-24-24A40,40,0,0,0,8,136a8,8,0,0,0,0,16,24,24,0,0,1,24,24,40,40,0,0,0,40,40H96v16a8,8,0,0,0,16,0V192a24,24,0,0,1,48,0v40a8,8,0,0,0,16,0V192a39.8,39.8,0,0,0-8.44-24.53A56.06,56.06,0,0,0,216,112v-8A58,58,0,0,0,208.3,75.68ZM200,112a40,40,0,0,1-40,40H112a40,40,0,0,1-40-40v-8a41.74,41.74,0,0,1,6.9-22.48A8,8,0,0,0,80,73.83a43.81,43.81,0,0,1,.79-33.58,43.88,43.88,0,0,1,32.32,20.06A8,8,0,0,0,119.82,64h32.35a8,8,0,0,0,6.74-3.69,43.87,43.87,0,0,1,32.32-20.06A43.81,43.81,0,0,1,192,73.83a8.09,8.09,0,0,0,1,7.65A41.76,41.76,0,0,1,200,104Z`}))],[`fill`,T.createElement(T.Fragment,null,T.createElement(`path`,{d:`M216,104v8a56.06,56.06,0,0,1-48.44,55.47A39.8,39.8,0,0,1,176,192v40a8,8,0,0,1-8,8H104a8,8,0,0,1-8-8V216H72a40,40,0,0,1-40-40A24,24,0,0,0,8,152a8,8,0,0,1,0-16,40,40,0,0,1,40,40,24,24,0,0,0,24,24H96v-8a39.8,39.8,0,0,1,8.44-24.53A56.06,56.06,0,0,1,56,112v-8a58.14,58.14,0,0,1,7.69-28.32A59.78,59.78,0,0,1,69.07,28,8,8,0,0,1,76,24a59.75,59.75,0,0,1,48,24h24a59.75,59.75,0,0,1,48-24,8,8,0,0,1,6.93,4,59.74,59.74,0,0,1,5.37,47.68A58,58,0,0,1,216,104Z`}))],[`light`,T.createElement(T.Fragment,null,T.createElement(`path`,{d:`M206.13,75.92A57.79,57.79,0,0,0,201.2,29a6,6,0,0,0-5.2-3,57.77,57.77,0,0,0-47,24H123A57.77,57.77,0,0,0,76,26a6,6,0,0,0-5.2,3,57.79,57.79,0,0,0-4.93,46.92A55.88,55.88,0,0,0,58,104v8a54.06,54.06,0,0,0,50.45,53.87A37.85,37.85,0,0,0,98,192v10H72a26,26,0,0,1-26-26A38,38,0,0,0,8,138a6,6,0,0,0,0,12,26,26,0,0,1,26,26,38,38,0,0,0,38,38H98v18a6,6,0,0,0,12,0V192a26,26,0,0,1,52,0v40a6,6,0,0,0,12,0V192a37.85,37.85,0,0,0-10.45-26.13A54.06,54.06,0,0,0,214,112v-8A55.88,55.88,0,0,0,206.13,75.92ZM202,112a42,42,0,0,1-42,42H112a42,42,0,0,1-42-42v-8a43.86,43.86,0,0,1,7.3-23.69,6,6,0,0,0,.81-5.76,45.85,45.85,0,0,1,1.43-36.42,45.85,45.85,0,0,1,35.23,21.1A6,6,0,0,0,119.83,62h32.34a6,6,0,0,0,5.06-2.76,45.83,45.83,0,0,1,35.23-21.11,45.85,45.85,0,0,1,1.43,36.42,6,6,0,0,0,.79,5.74A43.78,43.78,0,0,1,202,104Z`}))],[`regular`,T.createElement(T.Fragment,null,T.createElement(`path`,{d:`M208.31,75.68A59.78,59.78,0,0,0,202.93,28,8,8,0,0,0,196,24a59.75,59.75,0,0,0-48,24H124A59.75,59.75,0,0,0,76,24a8,8,0,0,0-6.93,4,59.78,59.78,0,0,0-5.38,47.68A58.14,58.14,0,0,0,56,104v8a56.06,56.06,0,0,0,48.44,55.47A39.8,39.8,0,0,0,96,192v8H72a24,24,0,0,1-24-24A40,40,0,0,0,8,136a8,8,0,0,0,0,16,24,24,0,0,1,24,24,40,40,0,0,0,40,40H96v16a8,8,0,0,0,16,0V192a24,24,0,0,1,48,0v40a8,8,0,0,0,16,0V192a39.8,39.8,0,0,0-8.44-24.53A56.06,56.06,0,0,0,216,112v-8A58.14,58.14,0,0,0,208.31,75.68ZM200,112a40,40,0,0,1-40,40H112a40,40,0,0,1-40-40v-8a41.74,41.74,0,0,1,6.9-22.48A8,8,0,0,0,80,73.83a43.81,43.81,0,0,1,.79-33.58,43.88,43.88,0,0,1,32.32,20.06A8,8,0,0,0,119.82,64h32.35a8,8,0,0,0,6.74-3.69,43.87,43.87,0,0,1,32.32-20.06A43.81,43.81,0,0,1,192,73.83a8.09,8.09,0,0,0,1,7.65A41.72,41.72,0,0,1,200,104Z`}))],[`thin`,T.createElement(T.Fragment,null,T.createElement(`path`,{d:`M203.94,76.16A55.73,55.73,0,0,0,199.46,30,4,4,0,0,0,196,28a55.78,55.78,0,0,0-46,24H122A55.78,55.78,0,0,0,76,28a4,4,0,0,0-3.46,2,55.73,55.73,0,0,0-4.48,46.16A53.78,53.78,0,0,0,60,104v8a52.06,52.06,0,0,0,52,52h1.41A36,36,0,0,0,100,192v12H72a28,28,0,0,1-28-28A36,36,0,0,0,8,140a4,4,0,0,0,0,8,28,28,0,0,1,28,28,36,36,0,0,0,36,36h28v20a4,4,0,0,0,8,0V192a28,28,0,0,1,56,0v40a4,4,0,0,0,8,0V192a36,36,0,0,0-13.41-28H160a52.06,52.06,0,0,0,52-52v-8A53.78,53.78,0,0,0,203.94,76.16ZM204,112a44.05,44.05,0,0,1-44,44H112a44.05,44.05,0,0,1-44-44v-8a45.76,45.76,0,0,1,7.71-24.89,4,4,0,0,0,.53-3.84,47.82,47.82,0,0,1,2.1-39.21,47.8,47.8,0,0,1,38.12,22.1A4,4,0,0,0,119.83,60h32.34a4,4,0,0,0,3.37-1.84,47.8,47.8,0,0,1,38.12-22.1,47.82,47.82,0,0,1,2.1,39.21,4,4,0,0,0,.53,3.83A45.85,45.85,0,0,1,204,104Z`}))]]),O=new Map([[`bold`,T.createElement(T.Fragment,null,T.createElement(`path`,{d:`M228,128a100,100,0,1,1-22.86-63.64,12,12,0,0,1-18.51,15.28A76,76,0,1,0,203.05,140H128a12,12,0,0,1,0-24h88A12,12,0,0,1,228,128Z`}))],[`duotone`,T.createElement(T.Fragment,null,T.createElement(`path`,{d:`M216,128a88,88,0,1,1-88-88A88,88,0,0,1,216,128Z`,opacity:`0.2`}),T.createElement(`path`,{d:`M224,128a96,96,0,1,1-21.95-61.09,8,8,0,1,1-12.33,10.18A80,80,0,1,0,207.6,136H128a8,8,0,0,1,0-16h88A8,8,0,0,1,224,128Z`}))],[`fill`,T.createElement(T.Fragment,null,T.createElement(`path`,{d:`M128,24A104,104,0,1,0,232,128,104,104,0,0,0,128,24Zm0,184A80,80,0,1,1,181.34,68.37a8,8,0,0,1-10.67,11.92A64,64,0,1,0,191.5,136H128a8,8,0,0,1,0-16h72a8,8,0,0,1,8,8A80.09,80.09,0,0,1,128,208Z`}))],[`light`,T.createElement(T.Fragment,null,T.createElement(`path`,{d:`M222,128a94,94,0,1,1-21.49-59.82,6,6,0,1,1-9.25,7.64A82,82,0,1,0,209.78,134H128a6,6,0,0,1,0-12h88A6,6,0,0,1,222,128Z`}))],[`regular`,T.createElement(T.Fragment,null,T.createElement(`path`,{d:`M224,128a96,96,0,1,1-21.95-61.09,8,8,0,1,1-12.33,10.18A80,80,0,1,0,207.6,136H128a8,8,0,0,1,0-16h88A8,8,0,0,1,224,128Z`}))],[`thin`,T.createElement(T.Fragment,null,T.createElement(`path`,{d:`M220,128a92,92,0,1,1-21-58.55,4,4,0,0,1-6.17,5.1A84,84,0,1,0,211.91,132H128a4,4,0,0,1,0-8h88A4,4,0,0,1,220,128Z`}))]]),k=T.forwardRef((e,t)=>T.createElement(r,{ref:t,...e,weights:E}));k.displayName=`AppleLogoIcon`;var A=T.forwardRef((e,t)=>T.createElement(r,{ref:t,...e,weights:D}));A.displayName=`GithubLogoIcon`;var j=T.forwardRef((e,t)=>T.createElement(r,{ref:t,...e,weights:O}));j.displayName=`GoogleLogoIcon`;var M=e(),N={google:(0,M.jsx)(j,{className:`size-6`,weight:`regular`}),github:(0,M.jsx)(A,{className:`size-6`,weight:`regular`}),apple:(0,M.jsx)(k,{className:`size-6`,weight:`regular`})};function P({as:e,icon:t,label:n,providerType:r,isLoading:i,...a}){let o;o=r&&r!==`generic_oauth`?N[r]:typeof t==`string`?(0,M.jsx)(`img`,{alt:``,className:`size-6`,src:t}):t||(0,M.jsx)(m,{className:`size-6`,weight:`regular`});let s=i?(0,M.jsx)(`span`,{className:`loading loading-spinner loading-md`}):(0,M.jsxs)(M.Fragment,{children:[o,(0,M.jsx)(`span`,{className:`text-xs`,children:n})]});return(0,T.createElement)(e,{className:`btn btn-ghost flex h-auto flex-row gap-2 border-base-300 py-3 sm:flex-col`,...a},s)}function F({children:e}){return(0,M.jsx)(`div`,{className:`grid grid-cols-1 gap-2 sm:grid-cols-3`,children:e})}var I={access_denied:`oauth.error.accessDenied`,temporarily_unavailable:`oauth.error.temporarilyUnavailable`,server_error:`oauth.error.serverError`,registration_email_not_allowed:`oauth.error.registrationEmailNotAllowed`};function L(){let{t:e,i18n:n}=t(),r=s(),i=l(),m=y.useSearch(),T=m.lang??n.language,{data:E}=a(c),D=E.registration.signup_notice?.[T]??E.registration.signup_notice?.[E.i18n.fallback_language],O=E.identity_providers,k=m.oauth_error,A=k?e(I[k]??`oauth.error.failed`):void 0,j=E.auth.password.enabled,N=E.auth.passkey.enabled,L=E.branding.title?.[T]??E.branding.title?.[E.i18n.fallback_language],R=E.branding.subtitle?.[T]??E.branding.subtitle?.[E.i18n.fallback_language],z=async e=>{e.user&&(i.setQueryData(v.queryKey,e),await C(),g(m)?window.location.href=h(m):r.navigate({to:`/profile`})),i.invalidateQueries({queryKey:v.queryKey})},B=u({...w,onSuccess:z,onSettled:()=>{i.invalidateQueries({queryKey:v.queryKey})}}),V=e=>{let t=`/api/oauth/${e}/authorize?mode=login`;if(g(m)){let e=new URL(h(m)),n=`${e.pathname}${e.search}${e.hash}`;t+=`&return_url=${encodeURIComponent(n)}`}return t};return(0,M.jsxs)(d,{cardPadding:!0,maxWidth:`100`,children:[(0,M.jsx)(x,{iconUrl:E.branding.icon_url,subtitle:R??e(`login.selectMethod.subtitle`),title:L??e(`login.title`)}),A&&(0,M.jsx)(S,{className:`mb-4`,icon:_,type:`error`,children:A}),(0,M.jsxs)(F,{children:[O.map(e=>(0,M.jsx)(P,{as:`a`,href:V(e.id),icon:e.icon_url,label:e.display_name,providerType:e.type},e.id)),j&&(0,M.jsx)(P,{as:o,icon:(0,M.jsx)(f,{className:`size-6`,weight:`regular`}),label:e(`login.method.password`),search:b(m),to:`/login/password`}),N&&(0,M.jsx)(P,{as:`button`,disabled:B.isPending,icon:(0,M.jsx)(p,{className:`size-6`,weight:`regular`}),isLoading:B.isPending,label:e(`login.method.passkey`),onClick:()=>B.mutate(),type:`button`})]}),D&&(0,M.jsx)(`div`,{className:`mt-6 text-center text-base-content/60 text-xs`,children:(0,M.jsx)(`div`,{className:`prose prose-sm text-xs! **:text-xs!`,dangerouslySetInnerHTML:{__html:D}})})]})}export{L as component};
|
|
2
|
-
//# sourceMappingURL=login-DhbnCudI.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"login-DhbnCudI.js","names":["e","e","t","e","t","p","a","a","i","a","m","EnvelopeSimpleIcon","FingerprintIcon","WarningCircleIcon","useMutation","useQueryClient","useSuspenseQuery","Link","useRouter","useTranslation","LoginMethodButton","LoginMethodList","PageHeader","Alert","PageLayout","buildAuthorizeUrl","extractOAuthParams","isOAuthFlow","tick","appConfigQueryOptions","authenticateWithPasskeyMutationOptions","getSessionQueryOptions","OAUTH_ERROR_I18N_MAP","Record","access_denied","temporarily_unavailable","server_error","registration_email_not_allowed","Route","Login","t","i18n","router","queryClient","search","useSearch","lang","language","data","configData","implicitNotice","registration","signup_notice","fallback_language","oauthProviders","identity_providers","oauthError","oauth_error","oauthErrorMessage","undefined","isPasswordAuthEnabled","auth","password","enabled","isPasskeyEnabled","passkey","customTitle","branding","title","customSubtitle","subtitle","handlePasskeySuccess","AuthResponse","user","setQueryData","queryKey","window","location","href","navigate","to","invalidateQueries","passkeyLoginMutation","onSuccess","onSettled","buildOAuthUrl","providerId","oauthUrl","authUrl","URL","returnUrl","pathname","hash","encodeURIComponent","icon_url","map","provider","id","display_name","type","isPending","mutate","__html","component"],"sources":["../../../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@phosphor-icons/react/dist/defs/AppleLogo.es.js","../../../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@phosphor-icons/react/dist/defs/GithubLogo.es.js","../../../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@phosphor-icons/react/dist/defs/GoogleLogo.es.js","../../../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@phosphor-icons/react/dist/csr/AppleLogo.es.js","../../../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@phosphor-icons/react/dist/csr/GithubLogo.es.js","../../../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@phosphor-icons/react/dist/csr/GoogleLogo.es.js","../../../frontend/src/components/auth/login-method-button.tsx","../../../frontend/src/components/auth/login-method-list.tsx","../../../frontend/src/routes/login/index.tsx?tsr-split=component"],"sourcesContent":["import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n [\n \"bold\",\n /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M227,168a12,12,0,0,0-4.21-5.09C207.25,152.22,204,133.68,204,120c0-16.17,12.68-30.6,20.25-37.76a12,12,0,0,0,0-17.43C210.89,52.17,188.81,44,168,44a76.29,76.29,0,0,0-40,11.37,75.59,75.59,0,0,0-93.58,11A78.64,78.64,0,0,0,12,123.51,131,131,0,0,0,53.43,216,43.81,43.81,0,0,0,83.6,228h87.69a43.87,43.87,0,0,0,32.05-13.85,127.63,127.63,0,0,0,18.4-25.39c1.57-2.88,3-5.71,4.14-8.41C227.47,176.67,229.12,172.87,227,168Zm-41.23,29.82A19.78,19.78,0,0,1,171.29,204H83.6a19.85,19.85,0,0,1-13.7-5.42A107.18,107.18,0,0,1,36,122.88,54.49,54.49,0,0,1,51.5,83.28,50.86,50.86,0,0,1,88,68h.72A51.5,51.5,0,0,1,120.48,79.4a12,12,0,0,0,15,0A51.41,51.41,0,0,1,168,68a67.24,67.24,0,0,1,29.88,7.4C186.26,89.66,180,105.13,180,120c0,23.33,7.47,42.89,21.25,56.19A103.3,103.3,0,0,1,185.76,197.81ZM128.75,13A43.83,43.83,0,0,1,142.17,1.51a12,12,0,0,1,11.64,21,19.84,19.84,0,0,0-6.11,5.24A12,12,0,0,1,128.75,13Z\" }))\n ],\n [\n \"duotone\",\n /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\n \"path\",\n {\n d: \"M216,73.52Zm0,99.26c-16.79-11.53-24-30.87-24-52.78,0-18.3,11.68-34.81,24-46.48C204.53,62.66,185,56,168,56a63.72,63.72,0,0,0-40,14h0A63.71,63.71,0,0,0,88.88,56C52,55.5,23.06,86.3,24,123.19a119.62,119.62,0,0,0,37.65,84.12A32,32,0,0,0,83.6,216h87.7a31.75,31.75,0,0,0,23.26-10c15.85-17,21.44-33.2,21.44-33.2Z\",\n opacity: \"0.2\"\n }\n ), /* @__PURE__ */ a.createElement(\"path\", { d: \"M223.3,169.59a8.07,8.07,0,0,0-2.8-3.4C203.53,154.53,200,134.64,200,120c0-17.67,13.47-33.06,21.5-40.67a8,8,0,0,0,0-11.62C208.82,55.74,187.82,48,168,48a72.23,72.23,0,0,0-40,12.13,71.56,71.56,0,0,0-90.71,9.09A74.63,74.63,0,0,0,16,123.4a127,127,0,0,0,40.14,89.73A39.8,39.8,0,0,0,83.59,224h87.68a39.84,39.84,0,0,0,29.12-12.57,125,125,0,0,0,17.82-24.6C225.23,174,224.33,172,223.3,169.59Zm-34.63,30.94a23.76,23.76,0,0,1-17.4,7.47H83.59a23.82,23.82,0,0,1-16.44-6.51A111.14,111.14,0,0,1,32,123,58.5,58.5,0,0,1,48.65,80.47,54.81,54.81,0,0,1,88,64h.78A55.45,55.45,0,0,1,123,76.28a8,8,0,0,0,10,0A55.39,55.39,0,0,1,168,64a70.64,70.64,0,0,1,36,10.35c-13,14.52-20,30.47-20,45.65,0,23.77,7.64,42.73,22.18,55.3A105.52,105.52,0,0,1,188.67,200.53ZM128.23,30A40,40,0,0,1,167,0h1a8,8,0,0,1,0,16h-1a24,24,0,0,0-23.24,18,8,8,0,1,1-15.5-4Z\" }))\n ],\n [\n \"fill\",\n /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M128.23,30A40,40,0,0,1,167,0h1a8,8,0,0,1,0,16h-1a24,24,0,0,0-23.24,18,8,8,0,1,1-15.5-4ZM223.3,169.59a8.07,8.07,0,0,0-2.8-3.4C203.53,154.53,200,134.64,200,120c0-17.67,13.47-33.06,21.5-40.67a8,8,0,0,0,0-11.62C208.82,55.74,187.82,48,168,48a72.23,72.23,0,0,0-40,12.13,71.56,71.56,0,0,0-90.71,9.09A74.63,74.63,0,0,0,16,123.4a127,127,0,0,0,40.14,89.73A39.8,39.8,0,0,0,83.59,224h87.68a39.84,39.84,0,0,0,29.12-12.57,125,125,0,0,0,17.82-24.6C225.23,174,224.33,172,223.3,169.59Z\" }))\n ],\n [\n \"light\",\n /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M219.4,167.84C201.71,155.69,198,135.12,198,120c0-18.42,13.86-34.29,22.12-42.12a6,6,0,0,0,0-8.71C208,57.7,187.07,50,168,50a70.23,70.23,0,0,0-40,12.55,69.6,69.6,0,0,0-89.31,8.08A72.63,72.63,0,0,0,18,123.35a125.11,125.11,0,0,0,39.53,88.33A37.85,37.85,0,0,0,83.6,222h87.7A37.83,37.83,0,0,0,199,210.07a122.6,122.6,0,0,0,17.54-24.2c6.55-12,5.77-13.75,5-15.48A6.07,6.07,0,0,0,219.4,167.84Zm-29.23,34A25.82,25.82,0,0,1,171.3,210H83.6A25.85,25.85,0,0,1,65.78,203,113.21,113.21,0,0,1,30,123a60.55,60.55,0,0,1,17.21-44A56.82,56.82,0,0,1,88,62h.81a57.35,57.35,0,0,1,35.44,12.71,6,6,0,0,0,7.5,0A57.39,57.39,0,0,1,168,62c13.89,0,28.81,4.68,39.11,12-9.44,10.14-21.1,26.59-21.1,46,0,23.78,7.81,42.6,22.66,54.77A107.33,107.33,0,0,1,190.17,201.89Zm-60-171.39A38,38,0,0,1,167,2h1a6,6,0,0,1,0,12h-1a26,26,0,0,0-25.18,19.5,6,6,0,1,1-11.62-3Z\" }))\n ],\n [\n \"regular\",\n /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M223.3,169.59a8.07,8.07,0,0,0-2.8-3.4C203.53,154.53,200,134.64,200,120c0-17.67,13.47-33.06,21.5-40.67a8,8,0,0,0,0-11.62C208.82,55.74,187.82,48,168,48a72.2,72.2,0,0,0-40,12.13,71.56,71.56,0,0,0-90.71,9.09A74.63,74.63,0,0,0,16,123.4a127.06,127.06,0,0,0,40.14,89.73A39.8,39.8,0,0,0,83.59,224h87.68a39.84,39.84,0,0,0,29.12-12.57,125,125,0,0,0,17.82-24.6C225.23,174,224.33,172,223.3,169.59Zm-34.63,30.94a23.76,23.76,0,0,1-17.4,7.47H83.59a23.82,23.82,0,0,1-16.44-6.51A111.14,111.14,0,0,1,32,123,58.5,58.5,0,0,1,48.65,80.47,54.81,54.81,0,0,1,88,64h.78A55.45,55.45,0,0,1,123,76.28a8,8,0,0,0,10,0A55.44,55.44,0,0,1,168,64a70.64,70.64,0,0,1,36,10.35c-13,14.52-20,30.47-20,45.65,0,23.77,7.64,42.73,22.18,55.3A105.82,105.82,0,0,1,188.67,200.53ZM128.23,30A40,40,0,0,1,167,0h1a8,8,0,0,1,0,16h-1a24,24,0,0,0-23.24,18,8,8,0,1,1-15.5-4Z\" }))\n ],\n [\n \"thin\",\n /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M218.27,169.49C199.86,156.84,196,135.6,196,120c0-19.17,14.25-35.53,22.75-43.57a4,4,0,0,0,0-5.81C207,59.48,186.59,52,168,52a68.3,68.3,0,0,0-40,13,67.61,67.61,0,0,0-87.88,7A70.65,70.65,0,0,0,20,123.3a123.11,123.11,0,0,0,38.9,86.92A35.81,35.81,0,0,0,83.6,220h87.7a35.84,35.84,0,0,0,26.19-11.3,119.93,119.93,0,0,0,17.24-23.79c6.08-11.1,5.42-12.62,4.94-13.72A4,4,0,0,0,218.27,169.49Zm-26.64,33.77A27.83,27.83,0,0,1,171.3,212H83.6a27.84,27.84,0,0,1-19.19-7.6A115.15,115.15,0,0,1,28,123.09,62.55,62.55,0,0,1,45.81,77.66,58.78,58.78,0,0,1,88,60h.84a59.37,59.37,0,0,1,36.66,13.15,4,4,0,0,0,5,0A59.35,59.35,0,0,1,168,60c15.12,0,31.45,5.41,42.11,13.73C200.68,83.42,188,100.16,188,120c0,23.79,8,42.44,23.12,54.17A107.64,107.64,0,0,1,191.63,203.26ZM132.13,31A36,36,0,0,1,167,4h1a4,4,0,0,1,0,8h-1a28,28,0,0,0-27.12,21A4,4,0,0,1,136,36a3.87,3.87,0,0,1-1-.13A4,4,0,0,1,132.13,31Z\" }))\n ]\n]);\nexport {\n e as default\n};\n","import * as a from \"react\";\nconst e = /* @__PURE__ */ new Map([\n [\n \"bold\",\n /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M212.62,75.17A63.7,63.7,0,0,0,206.39,26,12,12,0,0,0,196,20a63.71,63.71,0,0,0-50,24H126A63.71,63.71,0,0,0,76,20a12,12,0,0,0-10.39,6,63.7,63.7,0,0,0-6.23,49.17A61.5,61.5,0,0,0,52,104v8a60.1,60.1,0,0,0,45.76,58.28A43.66,43.66,0,0,0,92,192v4H76a20,20,0,0,1-20-20,44.05,44.05,0,0,0-44-44,12,12,0,0,0,0,24,20,20,0,0,1,20,20,44.05,44.05,0,0,0,44,44H92v12a12,12,0,0,0,24,0V192a20,20,0,0,1,40,0v40a12,12,0,0,0,24,0V192a43.66,43.66,0,0,0-5.76-21.72A60.1,60.1,0,0,0,220,112v-8A61.5,61.5,0,0,0,212.62,75.17ZM196,112a36,36,0,0,1-36,36H112a36,36,0,0,1-36-36v-8a37.87,37.87,0,0,1,6.13-20.12,11.65,11.65,0,0,0,1.58-11.49,39.9,39.9,0,0,1-.4-27.72,39.87,39.87,0,0,1,26.41,17.8A12,12,0,0,0,119.82,68h32.35a12,12,0,0,0,10.11-5.53,39.84,39.84,0,0,1,26.41-17.8,39.9,39.9,0,0,1-.4,27.72,12,12,0,0,0,1.61,11.53A37.85,37.85,0,0,1,196,104Z\" }))\n ],\n [\n \"duotone\",\n /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\n \"path\",\n {\n d: \"M208,104v8a48,48,0,0,1-48,48H136a32,32,0,0,1,32,32v40H104V192a32,32,0,0,1,32-32H112a48,48,0,0,1-48-48v-8a49.28,49.28,0,0,1,8.51-27.3A51.92,51.92,0,0,1,76,32a52,52,0,0,1,43.83,24h32.34A52,52,0,0,1,196,32a51.92,51.92,0,0,1,3.49,44.7A49.28,49.28,0,0,1,208,104Z\",\n opacity: \"0.2\"\n }\n ), /* @__PURE__ */ a.createElement(\"path\", { d: \"M208.3,75.68A59.74,59.74,0,0,0,202.93,28,8,8,0,0,0,196,24a59.75,59.75,0,0,0-48,24H124A59.75,59.75,0,0,0,76,24a8,8,0,0,0-6.93,4,59.78,59.78,0,0,0-5.38,47.68A58.14,58.14,0,0,0,56,104v8a56.06,56.06,0,0,0,48.44,55.47A39.8,39.8,0,0,0,96,192v8H72a24,24,0,0,1-24-24A40,40,0,0,0,8,136a8,8,0,0,0,0,16,24,24,0,0,1,24,24,40,40,0,0,0,40,40H96v16a8,8,0,0,0,16,0V192a24,24,0,0,1,48,0v40a8,8,0,0,0,16,0V192a39.8,39.8,0,0,0-8.44-24.53A56.06,56.06,0,0,0,216,112v-8A58,58,0,0,0,208.3,75.68ZM200,112a40,40,0,0,1-40,40H112a40,40,0,0,1-40-40v-8a41.74,41.74,0,0,1,6.9-22.48A8,8,0,0,0,80,73.83a43.81,43.81,0,0,1,.79-33.58,43.88,43.88,0,0,1,32.32,20.06A8,8,0,0,0,119.82,64h32.35a8,8,0,0,0,6.74-3.69,43.87,43.87,0,0,1,32.32-20.06A43.81,43.81,0,0,1,192,73.83a8.09,8.09,0,0,0,1,7.65A41.76,41.76,0,0,1,200,104Z\" }))\n ],\n [\n \"fill\",\n /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M216,104v8a56.06,56.06,0,0,1-48.44,55.47A39.8,39.8,0,0,1,176,192v40a8,8,0,0,1-8,8H104a8,8,0,0,1-8-8V216H72a40,40,0,0,1-40-40A24,24,0,0,0,8,152a8,8,0,0,1,0-16,40,40,0,0,1,40,40,24,24,0,0,0,24,24H96v-8a39.8,39.8,0,0,1,8.44-24.53A56.06,56.06,0,0,1,56,112v-8a58.14,58.14,0,0,1,7.69-28.32A59.78,59.78,0,0,1,69.07,28,8,8,0,0,1,76,24a59.75,59.75,0,0,1,48,24h24a59.75,59.75,0,0,1,48-24,8,8,0,0,1,6.93,4,59.74,59.74,0,0,1,5.37,47.68A58,58,0,0,1,216,104Z\" }))\n ],\n [\n \"light\",\n /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M206.13,75.92A57.79,57.79,0,0,0,201.2,29a6,6,0,0,0-5.2-3,57.77,57.77,0,0,0-47,24H123A57.77,57.77,0,0,0,76,26a6,6,0,0,0-5.2,3,57.79,57.79,0,0,0-4.93,46.92A55.88,55.88,0,0,0,58,104v8a54.06,54.06,0,0,0,50.45,53.87A37.85,37.85,0,0,0,98,192v10H72a26,26,0,0,1-26-26A38,38,0,0,0,8,138a6,6,0,0,0,0,12,26,26,0,0,1,26,26,38,38,0,0,0,38,38H98v18a6,6,0,0,0,12,0V192a26,26,0,0,1,52,0v40a6,6,0,0,0,12,0V192a37.85,37.85,0,0,0-10.45-26.13A54.06,54.06,0,0,0,214,112v-8A55.88,55.88,0,0,0,206.13,75.92ZM202,112a42,42,0,0,1-42,42H112a42,42,0,0,1-42-42v-8a43.86,43.86,0,0,1,7.3-23.69,6,6,0,0,0,.81-5.76,45.85,45.85,0,0,1,1.43-36.42,45.85,45.85,0,0,1,35.23,21.1A6,6,0,0,0,119.83,62h32.34a6,6,0,0,0,5.06-2.76,45.83,45.83,0,0,1,35.23-21.11,45.85,45.85,0,0,1,1.43,36.42,6,6,0,0,0,.79,5.74A43.78,43.78,0,0,1,202,104Z\" }))\n ],\n [\n \"regular\",\n /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M208.31,75.68A59.78,59.78,0,0,0,202.93,28,8,8,0,0,0,196,24a59.75,59.75,0,0,0-48,24H124A59.75,59.75,0,0,0,76,24a8,8,0,0,0-6.93,4,59.78,59.78,0,0,0-5.38,47.68A58.14,58.14,0,0,0,56,104v8a56.06,56.06,0,0,0,48.44,55.47A39.8,39.8,0,0,0,96,192v8H72a24,24,0,0,1-24-24A40,40,0,0,0,8,136a8,8,0,0,0,0,16,24,24,0,0,1,24,24,40,40,0,0,0,40,40H96v16a8,8,0,0,0,16,0V192a24,24,0,0,1,48,0v40a8,8,0,0,0,16,0V192a39.8,39.8,0,0,0-8.44-24.53A56.06,56.06,0,0,0,216,112v-8A58.14,58.14,0,0,0,208.31,75.68ZM200,112a40,40,0,0,1-40,40H112a40,40,0,0,1-40-40v-8a41.74,41.74,0,0,1,6.9-22.48A8,8,0,0,0,80,73.83a43.81,43.81,0,0,1,.79-33.58,43.88,43.88,0,0,1,32.32,20.06A8,8,0,0,0,119.82,64h32.35a8,8,0,0,0,6.74-3.69,43.87,43.87,0,0,1,32.32-20.06A43.81,43.81,0,0,1,192,73.83a8.09,8.09,0,0,0,1,7.65A41.72,41.72,0,0,1,200,104Z\" }))\n ],\n [\n \"thin\",\n /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement(\"path\", { d: \"M203.94,76.16A55.73,55.73,0,0,0,199.46,30,4,4,0,0,0,196,28a55.78,55.78,0,0,0-46,24H122A55.78,55.78,0,0,0,76,28a4,4,0,0,0-3.46,2,55.73,55.73,0,0,0-4.48,46.16A53.78,53.78,0,0,0,60,104v8a52.06,52.06,0,0,0,52,52h1.41A36,36,0,0,0,100,192v12H72a28,28,0,0,1-28-28A36,36,0,0,0,8,140a4,4,0,0,0,0,8,28,28,0,0,1,28,28,36,36,0,0,0,36,36h28v20a4,4,0,0,0,8,0V192a28,28,0,0,1,56,0v40a4,4,0,0,0,8,0V192a36,36,0,0,0-13.41-28H160a52.06,52.06,0,0,0,52-52v-8A53.78,53.78,0,0,0,203.94,76.16ZM204,112a44.05,44.05,0,0,1-44,44H112a44.05,44.05,0,0,1-44-44v-8a45.76,45.76,0,0,1,7.71-24.89,4,4,0,0,0,.53-3.84,47.82,47.82,0,0,1,2.1-39.21,47.8,47.8,0,0,1,38.12,22.1A4,4,0,0,0,119.83,60h32.34a4,4,0,0,0,3.37-1.84,47.8,47.8,0,0,1,38.12-22.1,47.82,47.82,0,0,1,2.1,39.21,4,4,0,0,0,.53,3.83A45.85,45.85,0,0,1,204,104Z\" }))\n ]\n]);\nexport {\n e as default\n};\n","import * as e from \"react\";\nconst t = /* @__PURE__ */ new Map([\n [\n \"bold\",\n /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M228,128a100,100,0,1,1-22.86-63.64,12,12,0,0,1-18.51,15.28A76,76,0,1,0,203.05,140H128a12,12,0,0,1,0-24h88A12,12,0,0,1,228,128Z\" }))\n ],\n [\n \"duotone\",\n /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M216,128a88,88,0,1,1-88-88A88,88,0,0,1,216,128Z\", opacity: \"0.2\" }), /* @__PURE__ */ e.createElement(\"path\", { d: \"M224,128a96,96,0,1,1-21.95-61.09,8,8,0,1,1-12.33,10.18A80,80,0,1,0,207.6,136H128a8,8,0,0,1,0-16h88A8,8,0,0,1,224,128Z\" }))\n ],\n [\n \"fill\",\n /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M128,24A104,104,0,1,0,232,128,104,104,0,0,0,128,24Zm0,184A80,80,0,1,1,181.34,68.37a8,8,0,0,1-10.67,11.92A64,64,0,1,0,191.5,136H128a8,8,0,0,1,0-16h72a8,8,0,0,1,8,8A80.09,80.09,0,0,1,128,208Z\" }))\n ],\n [\n \"light\",\n /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M222,128a94,94,0,1,1-21.49-59.82,6,6,0,1,1-9.25,7.64A82,82,0,1,0,209.78,134H128a6,6,0,0,1,0-12h88A6,6,0,0,1,222,128Z\" }))\n ],\n [\n \"regular\",\n /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M224,128a96,96,0,1,1-21.95-61.09,8,8,0,1,1-12.33,10.18A80,80,0,1,0,207.6,136H128a8,8,0,0,1,0-16h88A8,8,0,0,1,224,128Z\" }))\n ],\n [\n \"thin\",\n /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M220,128a92,92,0,1,1-21-58.55,4,4,0,0,1-6.17,5.1A84,84,0,1,0,211.91,132H128a4,4,0,0,1,0-8h88A4,4,0,0,1,220,128Z\" }))\n ]\n]);\nexport {\n t as default\n};\n","import * as o from \"react\";\nimport t from \"../lib/IconBase.es.js\";\nimport a from \"../defs/AppleLogo.es.js\";\nconst e = o.forwardRef((p, r) => /* @__PURE__ */ o.createElement(t, { ref: r, ...p, weights: a }));\ne.displayName = \"AppleLogoIcon\";\nconst s = e;\nexport {\n s as AppleLogo,\n e as AppleLogoIcon\n};\n","import * as o from \"react\";\nimport a from \"../lib/IconBase.es.js\";\nimport i from \"../defs/GithubLogo.es.js\";\nconst t = o.forwardRef((e, r) => /* @__PURE__ */ o.createElement(a, { ref: r, ...e, weights: i }));\nt.displayName = \"GithubLogoIcon\";\nconst s = t;\nexport {\n s as GithubLogo,\n t as GithubLogoIcon\n};\n","import * as o from \"react\";\nimport a from \"../lib/IconBase.es.js\";\nimport m from \"../defs/GoogleLogo.es.js\";\nconst e = o.forwardRef((r, t) => /* @__PURE__ */ o.createElement(a, { ref: t, ...r, weights: m }));\ne.displayName = \"GoogleLogoIcon\";\nconst s = e;\nexport {\n s as GoogleLogo,\n e as GoogleLogoIcon\n};\n","import {\n AppleLogoIcon,\n GithubLogoIcon,\n GoogleLogoIcon,\n LinkIcon,\n} from '@phosphor-icons/react';\nimport { createElement, type ElementType, type ReactNode } from 'react';\nimport type { OAuthProviderType } from '#frontend/queries/config.ts';\n\ntype LoginMethodButtonProps<C extends ElementType> = {\n as: C;\n icon?: string | ReactNode;\n label: string;\n providerType?: OAuthProviderType;\n isLoading?: boolean;\n} & Record<string, unknown>;\n\nconst PROVIDER_ICONS: Record<\n Exclude<OAuthProviderType, 'generic_oauth'>,\n ReactNode\n> = {\n google: <GoogleLogoIcon className=\"size-6\" weight=\"regular\" />,\n github: <GithubLogoIcon className=\"size-6\" weight=\"regular\" />,\n apple: <AppleLogoIcon className=\"size-6\" weight=\"regular\" />,\n};\n\nexport function LoginMethodButton<C extends ElementType>({\n as: Component,\n icon,\n label,\n providerType,\n isLoading,\n ...rest\n}: LoginMethodButtonProps<C>) {\n let iconElement: ReactNode;\n if (providerType && providerType !== 'generic_oauth') {\n iconElement = PROVIDER_ICONS[providerType];\n } else if (typeof icon === 'string') {\n iconElement = <img alt=\"\" className=\"size-6\" src={icon} />;\n } else if (icon) {\n iconElement = icon;\n } else {\n iconElement = <LinkIcon className=\"size-6\" weight=\"regular\" />;\n }\n\n const content = isLoading ? (\n <span className=\"loading loading-spinner loading-md\" />\n ) : (\n <>\n {iconElement}\n <span className=\"text-xs\">{label}</span>\n </>\n );\n\n return createElement(\n Component,\n {\n className:\n 'btn btn-ghost flex h-auto flex-row gap-2 border-base-300 py-3 sm:flex-col',\n ...rest,\n },\n content,\n );\n}\n","import type { ReactNode } from 'react';\n\ntype LoginMethodListProps = {\n children: ReactNode;\n};\n\nexport function LoginMethodList({ children }: LoginMethodListProps) {\n return (\n <div className=\"grid grid-cols-1 gap-2 sm:grid-cols-3\">{children}</div>\n );\n}\n","import {\n EnvelopeSimpleIcon,\n FingerprintIcon,\n WarningCircleIcon,\n} from '@phosphor-icons/react';\nimport {\n useMutation,\n useQueryClient,\n useSuspenseQuery,\n} from '@tanstack/react-query';\nimport { createFileRoute, Link, useRouter } from '@tanstack/react-router';\nimport { useTranslation } from 'react-i18next';\nimport { z } from 'zod';\nimport { LoginMethodButton } from '#frontend/components/auth/login-method-button.tsx';\nimport { LoginMethodList } from '#frontend/components/auth/login-method-list.tsx';\nimport { PageHeader } from '#frontend/components/auth/page-header.tsx';\nimport { Alert } from '#frontend/components/ui/alert.tsx';\nimport { RouteErrorFallback } from '#frontend/components/ui/route-error-fallback.tsx';\nimport { PageLayout } from '#frontend/features/layout/page-layout.tsx';\nimport {\n buildAuthorizeUrl,\n extractOAuthParams,\n isOAuthFlow,\n OAuthSearchSchema,\n} from '#frontend/libs/oauth-search.ts';\nimport { tick } from '#frontend/libs/promise.ts';\nimport { appConfigQueryOptions } from '#frontend/queries/config.ts';\nimport { authenticateWithPasskeyMutationOptions } from '#frontend/queries/passkey.ts';\nimport {\n type AuthResponse,\n getSessionQueryOptions,\n} from '#frontend/queries/session.ts';\n\nconst SearchSchema = OAuthSearchSchema.extend({\n oauth_error: z.string().optional(),\n oauth_error_description: z.string().optional(),\n});\n\nconst OAUTH_ERROR_I18N_MAP: Record<string, string> = {\n access_denied: 'oauth.error.accessDenied',\n temporarily_unavailable: 'oauth.error.temporarilyUnavailable',\n server_error: 'oauth.error.serverError',\n registration_email_not_allowed: 'oauth.error.registrationEmailNotAllowed',\n};\n\nexport const Route = createFileRoute('/login/')({\n component: Login,\n errorComponent: RouteErrorFallback,\n validateSearch: SearchSchema,\n loader: async ({ context }) => {\n await context.queryClient.ensureQueryData(appConfigQueryOptions);\n },\n});\n\nfunction Login() {\n const { t, i18n } = useTranslation();\n const router = useRouter();\n const queryClient = useQueryClient();\n const search = Route.useSearch();\n\n const lang = search.lang ?? i18n.language;\n const { data: configData } = useSuspenseQuery(appConfigQueryOptions);\n\n // Get implicit notice from config for OAuth signup\n const implicitNotice =\n configData.registration.signup_notice?.[lang] ??\n configData.registration.signup_notice?.[configData.i18n.fallback_language];\n const oauthProviders = configData.identity_providers;\n\n const oauthError = search.oauth_error;\n const oauthErrorMessage = oauthError\n ? t(OAUTH_ERROR_I18N_MAP[oauthError] ?? 'oauth.error.failed')\n : undefined;\n\n const isPasswordAuthEnabled = configData.auth.password.enabled;\n const isPasskeyEnabled = configData.auth.passkey.enabled;\n\n // Config-based title/subtitle (overrides i18n defaults)\n const customTitle =\n configData.branding.title?.[lang] ??\n configData.branding.title?.[configData.i18n.fallback_language];\n const customSubtitle =\n configData.branding.subtitle?.[lang] ??\n configData.branding.subtitle?.[configData.i18n.fallback_language];\n\n const handlePasskeySuccess = async (data: AuthResponse) => {\n if (data.user) {\n queryClient.setQueryData(getSessionQueryOptions.queryKey, data);\n await tick();\n\n if (isOAuthFlow(search)) {\n window.location.href = buildAuthorizeUrl(search);\n } else {\n router.navigate({ to: '/profile' });\n }\n }\n queryClient.invalidateQueries({\n queryKey: getSessionQueryOptions.queryKey,\n });\n };\n\n const passkeyLoginMutation = useMutation({\n ...authenticateWithPasskeyMutationOptions,\n onSuccess: handlePasskeySuccess,\n onSettled: () => {\n queryClient.invalidateQueries({\n queryKey: getSessionQueryOptions.queryKey,\n });\n },\n });\n\n const buildOAuthUrl = (providerId: string) => {\n let oauthUrl = `/api/oauth/${providerId}/authorize?mode=login`;\n\n if (isOAuthFlow(search)) {\n const authUrl = new URL(buildAuthorizeUrl(search));\n const returnUrl = `${authUrl.pathname}${authUrl.search}${authUrl.hash}`;\n oauthUrl += `&return_url=${encodeURIComponent(returnUrl)}`;\n }\n\n return oauthUrl;\n };\n\n return (\n <PageLayout cardPadding maxWidth=\"100\">\n <PageHeader\n iconUrl={configData.branding.icon_url}\n subtitle={customSubtitle ?? t('login.selectMethod.subtitle')}\n title={customTitle ?? t('login.title')}\n />\n\n {oauthErrorMessage && (\n <Alert className=\"mb-4\" icon={WarningCircleIcon} type=\"error\">\n {oauthErrorMessage}\n </Alert>\n )}\n\n <LoginMethodList>\n {/* OAuth Providers */}\n {oauthProviders.map((provider) => (\n <LoginMethodButton\n as=\"a\"\n href={buildOAuthUrl(provider.id)}\n icon={provider.icon_url}\n key={provider.id}\n label={provider.display_name}\n providerType={provider.type}\n />\n ))}\n\n {/* Password Login */}\n {isPasswordAuthEnabled && (\n <LoginMethodButton\n as={Link}\n icon={<EnvelopeSimpleIcon className=\"size-6\" weight=\"regular\" />}\n label={t('login.method.password')}\n search={extractOAuthParams(search)}\n to=\"/login/password\"\n />\n )}\n\n {/* Passkey Login */}\n {isPasskeyEnabled && (\n <LoginMethodButton\n as=\"button\"\n disabled={passkeyLoginMutation.isPending}\n icon={<FingerprintIcon className=\"size-6\" weight=\"regular\" />}\n isLoading={passkeyLoginMutation.isPending}\n label={t('login.method.passkey')}\n onClick={() => passkeyLoginMutation.mutate()}\n type=\"button\"\n />\n )}\n </LoginMethodList>\n\n {implicitNotice && (\n <div className=\"mt-6 text-center text-base-content/60 text-xs\">\n <div\n className=\"prose prose-sm text-xs! **:text-xs!\"\n dangerouslySetInnerHTML={{ __html: implicitNotice }}\n />\n </div>\n )}\n </PageLayout>\n );\n}\n"],"x_google_ignoreList":[0,1,2,3,4,5],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"login-SSKfXB7c.js","names":["RouteErrorFallback","SplitErrorComponent","errorComponent"],"sources":["../../../frontend/src/routes/login/index.tsx?tsr-split=errorComponent"],"sourcesContent":["import {\n EnvelopeSimpleIcon,\n FingerprintIcon,\n WarningCircleIcon,\n} from '@phosphor-icons/react';\nimport {\n useMutation,\n useQueryClient,\n useSuspenseQuery,\n} from '@tanstack/react-query';\nimport { createFileRoute, Link, useRouter } from '@tanstack/react-router';\nimport { useTranslation } from 'react-i18next';\nimport { z } from 'zod';\nimport { LoginMethodButton } from '#frontend/components/auth/login-method-button.tsx';\nimport { LoginMethodList } from '#frontend/components/auth/login-method-list.tsx';\nimport { PageHeader } from '#frontend/components/auth/page-header.tsx';\nimport { Alert } from '#frontend/components/ui/alert.tsx';\nimport { RouteErrorFallback } from '#frontend/components/ui/route-error-fallback.tsx';\nimport { PageLayout } from '#frontend/features/layout/page-layout.tsx';\nimport {\n buildAuthorizeUrl,\n extractOAuthParams,\n isOAuthFlow,\n OAuthSearchSchema,\n} from '#frontend/libs/oauth-search.ts';\nimport { tick } from '#frontend/libs/promise.ts';\nimport { appConfigQueryOptions } from '#frontend/queries/config.ts';\nimport { authenticateWithPasskeyMutationOptions } from '#frontend/queries/passkey.ts';\nimport {\n type AuthResponse,\n getSessionQueryOptions,\n} from '#frontend/queries/session.ts';\n\nconst SearchSchema = OAuthSearchSchema.extend({\n oauth_error: z.string().optional(),\n oauth_error_description: z.string().optional(),\n});\n\nconst OAUTH_ERROR_I18N_MAP: Record<string, string> = {\n access_denied: 'oauth.error.accessDenied',\n temporarily_unavailable: 'oauth.error.temporarilyUnavailable',\n server_error: 'oauth.error.serverError',\n registration_email_not_allowed: 'oauth.error.registrationEmailNotAllowed',\n};\n\nexport const Route = createFileRoute('/login/')({\n component: Login,\n errorComponent: RouteErrorFallback,\n validateSearch: SearchSchema,\n loader: async ({ context }) => {\n await context.queryClient.ensureQueryData(appConfigQueryOptions);\n },\n});\n\nfunction Login() {\n const { t, i18n } = useTranslation();\n const router = useRouter();\n const queryClient = useQueryClient();\n const search = Route.useSearch();\n\n const lang = search.lang ?? i18n.language;\n const { data: configData } = useSuspenseQuery(appConfigQueryOptions);\n\n // Get implicit notice from config for OAuth signup\n const implicitNotice =\n configData.registration.signup_notice?.[lang] ??\n configData.registration.signup_notice?.[configData.i18n.fallback_language];\n const oauthProviders = configData.identity_providers;\n\n const oauthError = search.oauth_error;\n const oauthErrorMessage = oauthError\n ? t(OAUTH_ERROR_I18N_MAP[oauthError] ?? 'oauth.error.failed')\n : undefined;\n\n const isPasswordAuthEnabled = configData.auth.password.enabled;\n const isPasskeyEnabled = configData.auth.passkey.enabled;\n\n // Config-based title/subtitle (overrides i18n defaults)\n const customTitle =\n configData.branding.title?.[lang] ??\n configData.branding.title?.[configData.i18n.fallback_language];\n const customSubtitle =\n configData.branding.subtitle?.[lang] ??\n configData.branding.subtitle?.[configData.i18n.fallback_language];\n\n const handlePasskeySuccess = async (data: AuthResponse) => {\n if (data.user) {\n queryClient.setQueryData(getSessionQueryOptions.queryKey, data);\n await tick();\n\n if (isOAuthFlow(search)) {\n window.location.href = buildAuthorizeUrl(search);\n } else {\n router.navigate({ to: '/profile' });\n }\n }\n queryClient.invalidateQueries({\n queryKey: getSessionQueryOptions.queryKey,\n });\n };\n\n const passkeyLoginMutation = useMutation({\n ...authenticateWithPasskeyMutationOptions,\n onSuccess: handlePasskeySuccess,\n onSettled: () => {\n queryClient.invalidateQueries({\n queryKey: getSessionQueryOptions.queryKey,\n });\n },\n });\n\n const buildOAuthUrl = (providerId: string) => {\n let oauthUrl = `/api/oauth/${providerId}/authorize?mode=login`;\n\n if (isOAuthFlow(search)) {\n const authUrl = new URL(buildAuthorizeUrl(search));\n const returnUrl = `${authUrl.pathname}${authUrl.search}${authUrl.hash}`;\n oauthUrl += `&return_url=${encodeURIComponent(returnUrl)}`;\n }\n\n return oauthUrl;\n };\n\n return (\n <PageLayout cardPadding maxWidth=\"100\">\n <PageHeader\n iconUrl={configData.branding.icon_url}\n subtitle={customSubtitle ?? t('login.selectMethod.subtitle')}\n title={customTitle ?? t('login.title')}\n />\n\n {oauthErrorMessage && (\n <Alert className=\"mb-4\" icon={WarningCircleIcon} type=\"error\">\n {oauthErrorMessage}\n </Alert>\n )}\n\n <LoginMethodList>\n {/* OAuth Providers */}\n {oauthProviders.map((provider) => (\n <LoginMethodButton\n as=\"a\"\n href={buildOAuthUrl(provider.id)}\n icon={provider.icon_url}\n key={provider.id}\n label={provider.display_name}\n providerType={provider.type}\n />\n ))}\n\n {/* Password Login */}\n {isPasswordAuthEnabled && (\n <LoginMethodButton\n as={Link}\n icon={<EnvelopeSimpleIcon className=\"size-6\" weight=\"regular\" />}\n label={t('login.method.password')}\n search={extractOAuthParams(search)}\n to=\"/login/password\"\n />\n )}\n\n {/* Passkey Login */}\n {isPasskeyEnabled && (\n <LoginMethodButton\n as=\"button\"\n disabled={passkeyLoginMutation.isPending}\n icon={<FingerprintIcon className=\"size-6\" weight=\"regular\" />}\n isLoading={passkeyLoginMutation.isPending}\n label={t('login.method.passkey')}\n onClick={() => passkeyLoginMutation.mutate()}\n type=\"button\"\n />\n )}\n </LoginMethodList>\n\n {implicitNotice && (\n <div className=\"mt-6 text-center text-base-content/60 text-xs\">\n <div\n className=\"prose prose-sm text-xs! **:text-xs!\"\n dangerouslySetInnerHTML={{ __html: implicitNotice }}\n />\n </div>\n )}\n </PageLayout>\n );\n}\n"],"mappings":"wCAiBsF,IAAAC,EAA7ED"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{o as e,r as t,s as n,u as r}from"./IconBase.es-d5KP98Ac.js";import{Q as i,a,f as o,h as s,i as c,n as l,ut as u}from"./use-theme-cVUDAjtt.js";import{t as d}from"./useMutation-DVMopbtG.js";import{t as f}from"./mutationOptions-Dfvzj6n2.js";import{t as p}from"./page-layout-C475gs09.js";import{t as m}from"./EnvelopeSimple.es-BZ7u3LYh.js";import{t as h}from"./Lock.es-Cb_uwQly.js";import{c as g,i as _,o as v}from"./zod-BItJDQBQ.js";import{A as y,M as b,S as x,j as S,s as C}from"./index-CsT6OVnP.js";import{t as w}from"./page-header-BYMFSGfT.js";import{t as T}from"./promise-OpBtq8tG.js";import{o as E}from"./passkey-e6uvApHa.js";import{r as D,t as O}from"./standard-schema-o4V-s4uY.js";import{t as k}from"./footer-link-Ib1Hd-fr.js";import{t as A}from"./icon-input-8iU7PNzd.js";import{t as j}from"./submit-button-Xx6DwLyh.js";var M=r(n()),N=f({mutationFn:async e=>a(await c.api.auth.login.$post({json:e}))}),P=e();function F(){let{t:e,i18n:n}=t(),r=s(),a=u(),c=C.useSearch(),f=c.lang??n.language,{data:F}=i(l),I=F.branding.title?.[f]??F.branding.title?.[F.i18n.fallback_language],L=F.branding.subtitle?.[f]??F.branding.subtitle?.[F.i18n.fallback_language],R=F.auth.password.enabled,z=F.auth.passkey.enabled,B=(0,M.useMemo)(()=>v({email:_(e(`validation.email.invalid`)),password:g().min(1,e(`validation.password.required`))}),[e]),V=d({...N,onSuccess:async(e,t)=>{let n=e.user;if(n.email_verification_required&&!n.email_verified){r.navigate({to:`/verify/email`,search:{email:t.email,...S(c)}});return}a.setQueryData(x.queryKey,{user:n}),await T();let i=[];if(F.auth.password.totp.enabled&&n.totp_registered&&i.push(`totp`),F.auth.passkey.enabled&&n.passkey_count>0&&i.push(`passkey`),n.second_factor_required&&i.length===0){if(F.available_2fa_setup_methods.length>1)return r.navigate({to:`/setup/2fa`,search:S(c)});if(F.available_2fa_setup_methods.length===1)return F.available_2fa_setup_methods[0]===`totp`?r.navigate({to:`/setup/totp`,search:S(c)}):r.navigate({to:`/setup/passkey`,search:{...S(c),passkey_name:`default`}})}if(i.length>1)return r.navigate({to:`/verify/2fa`,search:S(c)});if(i.length===1)return i[0]===`totp`?r.navigate({to:`/verify/totp`,search:S(c)}):r.navigate({to:`/verify/passkey`,search:S(c)});if(b(c))window.location.href=y(c);else return r.navigate({to:`/profile`})},onError:t=>{G(`email`,{type:`manual`,message:e(`login.error.failed`)})},onSettled:()=>{a.invalidateQueries({queryKey:x.queryKey})}}),H=(0,M.useCallback)(async e=>{e.user&&(a.setQueryData(x.queryKey,e),await T(),b(c)?window.location.href=y(c):r.navigate({to:`/profile`})),a.invalidateQueries({queryKey:x.queryKey})},[a,r,c]),U=(0,M.useRef)(null);(0,M.useEffect)(()=>{if(!(!z||!R))return U.current=new AbortController,E(H,U.current.signal),()=>{U.current?.abort()}},[z,R,H]);let{register:W,setError:G,handleSubmit:K,formState:{errors:q}}=D({defaultValues:{email:``,password:``},resolver:O(B)});return(0,P.jsxs)(p,{cardPadding:!0,maxWidth:`100`,children:[(0,P.jsx)(w,{iconUrl:F.branding.icon_url,subtitle:L??e(`login.selectMethod.subtitle`),title:I??e(`login.title`)}),R&&(0,P.jsxs)(`form`,{className:`flex flex-col gap-4`,onSubmit:K(async e=>{V.mutate(e)}),children:[(0,P.jsx)(A,{autoComplete:`username webauthn`,error:q.email,icon:m,placeholder:e(`login.email.placeholder`),...W(`email`),type:`email`}),(0,P.jsx)(A,{autoComplete:`current-password`,error:q.password,icon:h,placeholder:e(`login.password.placeholder`),...W(`password`),type:`password`}),F.email.enabled&&(0,P.jsx)(`div`,{className:`flex items-center justify-end`,children:(0,P.jsx)(o,{className:`link text-sm`,to:`/password/forgot`,children:e(`login.link.forgotPassword`)})}),(0,P.jsx)(j,{className:`mt-2`,isPending:V.isPending,pendingText:e(`login.submitting`),children:e(`login.submit`)})]}),F.registration.public_registration&&(0,P.jsx)(k,{as:o,linkText:e(`login.link.register`),search:S(c),text:e(`login.footer.noAccount`),to:`/register`})]})}export{F as component};
|
|
2
|
-
//# sourceMappingURL=password-CkeV4qxb.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"password-CkeV4qxb.js","names":["standardSchemaResolver","EnvelopeSimpleIcon","LockIcon","useMutation","useQueryClient","useSuspenseQuery","Link","useRouter","useCallback","useEffect","useMemo","useRef","useForm","useTranslation","z","FooterLink","IconInput","PageHeader","SubmitButton","PageLayout","buildAuthorizeUrl","extractOAuthParams","isOAuthFlow","tick","appConfigQueryOptions","loginMutationOptions","startConditionalPasskeyAuth","getSessionQueryOptions","Route","LoginPassword","t","i18n","router","queryClient","search","useSearch","lang","language","data","configData","customTitle","branding","title","fallback_language","customSubtitle","subtitle","isPasswordAuthEnabled","auth","password","enabled","isPasskeyEnabled","passkey","loginSchema","object","email","string","min","loginMutation","onSuccess","params","user","email_verification_required","email_verified","navigate","to","setQueryData","queryKey","registered_2fa_methods","SecondFactorMethod","totp","totp_registered","push","passkey_count","second_factor_required","length","available_2fa_setup_methods","method","passkey_name","window","location","href","onError","_error","setError","type","message","onSettled","invalidateQueries","handlePasskeySuccess","AuthResponse","abortControllerRef","AbortController","current","signal","abort","register","handleSubmit","formState","errors","defaultValues","resolver","onSubmit","values","infer","mutate","icon_url","isPending","registration","public_registration","component"],"sources":["../../../frontend/src/queries/login.ts","../../../frontend/src/routes/login/password/index.tsx?tsr-split=component"],"sourcesContent":["import { mutationOptions } from '@tanstack/react-query';\nimport type { InferRequestType, InferResponseType } from 'hono/client';\nimport { client, jsonOk } from '#frontend/libs/api.ts';\n\nexport type LoginParams = InferRequestType<\n (typeof client.api.auth.login)['$post']\n>['json'];\n\nexport type LoginResponse = InferResponseType<\n (typeof client.api.auth.login)['$post'],\n 200\n>;\n\nexport const loginMutationOptions = mutationOptions({\n mutationFn: async (values: LoginParams) => {\n const res = await client.api.auth.login.$post({\n json: values,\n });\n return jsonOk(res);\n },\n});\n","import { standardSchemaResolver } from '@hookform/resolvers/standard-schema';\nimport { EnvelopeSimpleIcon, LockIcon } from '@phosphor-icons/react';\nimport {\n useMutation,\n useQueryClient,\n useSuspenseQuery,\n} from '@tanstack/react-query';\nimport { createFileRoute, Link, useRouter } from '@tanstack/react-router';\nimport { useCallback, useEffect, useMemo, useRef } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { z } from 'zod';\nimport { FooterLink } from '#frontend/components/auth/footer-link.tsx';\nimport { IconInput } from '#frontend/components/auth/icon-input.tsx';\nimport { PageHeader } from '#frontend/components/auth/page-header.tsx';\nimport { SubmitButton } from '#frontend/components/auth/submit-button.tsx';\nimport { RouteErrorFallback } from '#frontend/components/ui/route-error-fallback.tsx';\nimport { PageLayout } from '#frontend/features/layout/page-layout.tsx';\nimport {\n buildAuthorizeUrl,\n extractOAuthParams,\n isOAuthFlow,\n OAuthSearchSchema,\n type SecondFactorMethod,\n} from '#frontend/libs/oauth-search.ts';\nimport { tick } from '#frontend/libs/promise.ts';\nimport { appConfigQueryOptions } from '#frontend/queries/config.ts';\nimport { loginMutationOptions } from '#frontend/queries/login.ts';\nimport { startConditionalPasskeyAuth } from '#frontend/queries/passkey.ts';\nimport {\n type AuthResponse,\n getSessionQueryOptions,\n} from '#frontend/queries/session.ts';\n\nconst SearchSchema = OAuthSearchSchema;\n\nexport const Route = createFileRoute('/login/password/')({\n component: LoginPassword,\n errorComponent: RouteErrorFallback,\n validateSearch: SearchSchema,\n loader: async ({ context }) => {\n await context.queryClient.ensureQueryData(appConfigQueryOptions);\n },\n});\n\nfunction LoginPassword() {\n const { t, i18n } = useTranslation();\n const router = useRouter();\n const queryClient = useQueryClient();\n const search = Route.useSearch();\n const lang = search.lang ?? i18n.language;\n\n const { data: configData } = useSuspenseQuery(appConfigQueryOptions);\n\n const customTitle =\n configData.branding.title?.[lang] ??\n configData.branding.title?.[configData.i18n.fallback_language];\n const customSubtitle =\n configData.branding.subtitle?.[lang] ??\n configData.branding.subtitle?.[configData.i18n.fallback_language];\n const isPasswordAuthEnabled = configData.auth.password.enabled;\n const isPasskeyEnabled = configData.auth.passkey.enabled;\n\n const loginSchema = useMemo(\n () =>\n z.object({\n email: z.email(t('validation.email.invalid')),\n password: z.string().min(1, t('validation.password.required')),\n }),\n [t],\n );\n\n const loginMutation = useMutation({\n ...loginMutationOptions,\n onSuccess: async (data, params) => {\n const user = data.user;\n\n if (user.email_verification_required && !user.email_verified) {\n router.navigate({\n to: '/verify/email',\n search: {\n email: params.email,\n ...extractOAuthParams(search),\n },\n });\n return;\n }\n\n queryClient.setQueryData(getSessionQueryOptions.queryKey, {\n user: user,\n });\n await tick();\n\n const registered_2fa_methods: SecondFactorMethod[] = [];\n if (configData.auth.password.totp.enabled && user.totp_registered) {\n registered_2fa_methods.push('totp');\n }\n if (configData.auth.passkey.enabled && user.passkey_count > 0) {\n registered_2fa_methods.push('passkey');\n }\n\n if (user.second_factor_required && registered_2fa_methods.length === 0) {\n if (configData.available_2fa_setup_methods.length > 1) {\n return router.navigate({\n to: '/setup/2fa',\n search: extractOAuthParams(search),\n });\n } else if (configData.available_2fa_setup_methods.length === 1) {\n const method = configData.available_2fa_setup_methods[0];\n if (method === 'totp') {\n return router.navigate({\n to: '/setup/totp',\n search: extractOAuthParams(search),\n });\n } else {\n return router.navigate({\n to: '/setup/passkey',\n search: {\n ...extractOAuthParams(search),\n passkey_name: 'default',\n },\n });\n }\n }\n }\n\n if (registered_2fa_methods.length > 1) {\n return router.navigate({\n to: '/verify/2fa',\n search: extractOAuthParams(search),\n });\n } else if (registered_2fa_methods.length === 1) {\n const method = registered_2fa_methods[0];\n if (method === 'totp') {\n return router.navigate({\n to: '/verify/totp',\n search: extractOAuthParams(search),\n });\n } else {\n return router.navigate({\n to: '/verify/passkey',\n search: extractOAuthParams(search),\n });\n }\n } else {\n if (isOAuthFlow(search)) {\n window.location.href = buildAuthorizeUrl(search);\n } else {\n return router.navigate({ to: '/profile' });\n }\n }\n },\n onError: (_error) => {\n setError('email', {\n type: 'manual',\n message: t('login.error.failed'),\n });\n },\n onSettled: () => {\n queryClient.invalidateQueries({\n queryKey: getSessionQueryOptions.queryKey,\n });\n },\n });\n\n const handlePasskeySuccess = useCallback(\n async (data: AuthResponse) => {\n if (data.user) {\n queryClient.setQueryData(getSessionQueryOptions.queryKey, data);\n await tick();\n\n if (isOAuthFlow(search)) {\n window.location.href = buildAuthorizeUrl(search);\n } else {\n router.navigate({ to: '/profile' });\n }\n }\n queryClient.invalidateQueries({\n queryKey: getSessionQueryOptions.queryKey,\n });\n },\n [queryClient, router, search],\n );\n\n // Conditional UI: Start passkey autofill on page load\n const abortControllerRef = useRef<AbortController | null>(null);\n\n useEffect(() => {\n if (!isPasskeyEnabled || !isPasswordAuthEnabled) {\n return;\n }\n\n abortControllerRef.current = new AbortController();\n startConditionalPasskeyAuth(\n handlePasskeySuccess,\n abortControllerRef.current.signal,\n );\n\n return () => {\n abortControllerRef.current?.abort();\n };\n }, [isPasskeyEnabled, isPasswordAuthEnabled, handlePasskeySuccess]);\n\n const {\n register,\n setError,\n handleSubmit,\n formState: { errors },\n } = useForm({\n defaultValues: {\n email: '',\n password: '',\n },\n resolver: standardSchemaResolver(loginSchema),\n });\n\n const onSubmit = async (values: z.infer<typeof loginSchema>) => {\n loginMutation.mutate(values);\n };\n\n return (\n <PageLayout cardPadding maxWidth=\"100\">\n <PageHeader\n iconUrl={configData.branding.icon_url}\n subtitle={customSubtitle ?? t('login.selectMethod.subtitle')}\n title={customTitle ?? t('login.title')}\n />\n\n {isPasswordAuthEnabled && (\n <form className=\"flex flex-col gap-4\" onSubmit={handleSubmit(onSubmit)}>\n <IconInput\n autoComplete=\"username webauthn\"\n error={errors.email}\n icon={EnvelopeSimpleIcon}\n placeholder={t('login.email.placeholder')}\n {...register('email')}\n type=\"email\"\n />\n\n <IconInput\n autoComplete=\"current-password\"\n error={errors.password}\n icon={LockIcon}\n placeholder={t('login.password.placeholder')}\n {...register('password')}\n type=\"password\"\n />\n\n {configData.email.enabled && (\n <div className=\"flex items-center justify-end\">\n <Link className=\"link text-sm\" to=\"/password/forgot\">\n {t('login.link.forgotPassword')}\n </Link>\n </div>\n )}\n\n <SubmitButton\n className=\"mt-2\"\n isPending={loginMutation.isPending}\n pendingText={t('login.submitting')}\n >\n {t('login.submit')}\n </SubmitButton>\n </form>\n )}\n\n {configData.registration.public_registration && (\n <FooterLink\n as={Link}\n linkText={t('login.link.register')}\n search={extractOAuthParams(search)}\n text={t('login.footer.noAccount')}\n to=\"/register\"\n />\n )}\n\n {/* <div className=\"flex flex-col items-center gap-2\">\n <Link\n to=\"/login\"\n search={extractOAuthParams(search)}\n className=\"link text-sm\"\n >\n {t('login.password.backToMethods')}\n </Link>\n </div> */}\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"password-SSKfXB7c.js","names":["RouteErrorFallback","SplitErrorComponent","errorComponent"],"sources":["../../../frontend/src/routes/login/password/index.tsx?tsr-split=errorComponent"],"sourcesContent":["import { standardSchemaResolver } from '@hookform/resolvers/standard-schema';\nimport { EnvelopeSimpleIcon, LockIcon } from '@phosphor-icons/react';\nimport {\n useMutation,\n useQueryClient,\n useSuspenseQuery,\n} from '@tanstack/react-query';\nimport { createFileRoute, Link, useRouter } from '@tanstack/react-router';\nimport { useCallback, useEffect, useMemo, useRef } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { z } from 'zod';\nimport { FooterLink } from '#frontend/components/auth/footer-link.tsx';\nimport { IconInput } from '#frontend/components/auth/icon-input.tsx';\nimport { PageHeader } from '#frontend/components/auth/page-header.tsx';\nimport { SubmitButton } from '#frontend/components/auth/submit-button.tsx';\nimport { RouteErrorFallback } from '#frontend/components/ui/route-error-fallback.tsx';\nimport { PageLayout } from '#frontend/features/layout/page-layout.tsx';\nimport {\n buildAuthorizeUrl,\n extractOAuthParams,\n isOAuthFlow,\n OAuthSearchSchema,\n type SecondFactorMethod,\n} from '#frontend/libs/oauth-search.ts';\nimport { tick } from '#frontend/libs/promise.ts';\nimport { appConfigQueryOptions } from '#frontend/queries/config.ts';\nimport { loginMutationOptions } from '#frontend/queries/login.ts';\nimport { startConditionalPasskeyAuth } from '#frontend/queries/passkey.ts';\nimport {\n type AuthResponse,\n getSessionQueryOptions,\n} from '#frontend/queries/session.ts';\n\nconst SearchSchema = OAuthSearchSchema;\n\nexport const Route = createFileRoute('/login/password/')({\n component: LoginPassword,\n errorComponent: RouteErrorFallback,\n validateSearch: SearchSchema,\n loader: async ({ context }) => {\n await context.queryClient.ensureQueryData(appConfigQueryOptions);\n },\n});\n\nfunction LoginPassword() {\n const { t, i18n } = useTranslation();\n const router = useRouter();\n const queryClient = useQueryClient();\n const search = Route.useSearch();\n const lang = search.lang ?? i18n.language;\n\n const { data: configData } = useSuspenseQuery(appConfigQueryOptions);\n\n const customTitle =\n configData.branding.title?.[lang] ??\n configData.branding.title?.[configData.i18n.fallback_language];\n const customSubtitle =\n configData.branding.subtitle?.[lang] ??\n configData.branding.subtitle?.[configData.i18n.fallback_language];\n const isPasswordAuthEnabled = configData.auth.password.enabled;\n const isPasskeyEnabled = configData.auth.passkey.enabled;\n\n const loginSchema = useMemo(\n () =>\n z.object({\n email: z.email(t('validation.email.invalid')),\n password: z.string().min(1, t('validation.password.required')),\n }),\n [t],\n );\n\n const loginMutation = useMutation({\n ...loginMutationOptions,\n onSuccess: async (data, params) => {\n const user = data.user;\n\n if (user.email_verification_required && !user.email_verified) {\n router.navigate({\n to: '/verify/email',\n search: {\n email: params.email,\n ...extractOAuthParams(search),\n },\n });\n return;\n }\n\n queryClient.setQueryData(getSessionQueryOptions.queryKey, {\n user: user,\n });\n await tick();\n\n const registered_2fa_methods: SecondFactorMethod[] = [];\n if (configData.auth.password.totp.enabled && user.totp_registered) {\n registered_2fa_methods.push('totp');\n }\n if (configData.auth.passkey.enabled && user.passkey_count > 0) {\n registered_2fa_methods.push('passkey');\n }\n\n if (user.second_factor_required && registered_2fa_methods.length === 0) {\n if (configData.available_2fa_setup_methods.length > 1) {\n return router.navigate({\n to: '/setup/2fa',\n search: extractOAuthParams(search),\n });\n } else if (configData.available_2fa_setup_methods.length === 1) {\n const method = configData.available_2fa_setup_methods[0];\n if (method === 'totp') {\n return router.navigate({\n to: '/setup/totp',\n search: extractOAuthParams(search),\n });\n } else {\n return router.navigate({\n to: '/setup/passkey',\n search: {\n ...extractOAuthParams(search),\n passkey_name: 'default',\n },\n });\n }\n }\n }\n\n if (registered_2fa_methods.length > 1) {\n return router.navigate({\n to: '/verify/2fa',\n search: extractOAuthParams(search),\n });\n } else if (registered_2fa_methods.length === 1) {\n const method = registered_2fa_methods[0];\n if (method === 'totp') {\n return router.navigate({\n to: '/verify/totp',\n search: extractOAuthParams(search),\n });\n } else {\n return router.navigate({\n to: '/verify/passkey',\n search: extractOAuthParams(search),\n });\n }\n } else {\n if (isOAuthFlow(search)) {\n window.location.href = buildAuthorizeUrl(search);\n } else {\n return router.navigate({ to: '/profile' });\n }\n }\n },\n onError: (_error) => {\n setError('email', {\n type: 'manual',\n message: t('login.error.failed'),\n });\n },\n onSettled: () => {\n queryClient.invalidateQueries({\n queryKey: getSessionQueryOptions.queryKey,\n });\n },\n });\n\n const handlePasskeySuccess = useCallback(\n async (data: AuthResponse) => {\n if (data.user) {\n queryClient.setQueryData(getSessionQueryOptions.queryKey, data);\n await tick();\n\n if (isOAuthFlow(search)) {\n window.location.href = buildAuthorizeUrl(search);\n } else {\n router.navigate({ to: '/profile' });\n }\n }\n queryClient.invalidateQueries({\n queryKey: getSessionQueryOptions.queryKey,\n });\n },\n [queryClient, router, search],\n );\n\n // Conditional UI: Start passkey autofill on page load\n const abortControllerRef = useRef<AbortController | null>(null);\n\n useEffect(() => {\n if (!isPasskeyEnabled || !isPasswordAuthEnabled) {\n return;\n }\n\n abortControllerRef.current = new AbortController();\n startConditionalPasskeyAuth(\n handlePasskeySuccess,\n abortControllerRef.current.signal,\n );\n\n return () => {\n abortControllerRef.current?.abort();\n };\n }, [isPasskeyEnabled, isPasswordAuthEnabled, handlePasskeySuccess]);\n\n const {\n register,\n setError,\n handleSubmit,\n formState: { errors },\n } = useForm({\n defaultValues: {\n email: '',\n password: '',\n },\n resolver: standardSchemaResolver(loginSchema),\n });\n\n const onSubmit = async (values: z.infer<typeof loginSchema>) => {\n loginMutation.mutate(values);\n };\n\n return (\n <PageLayout cardPadding maxWidth=\"100\">\n <PageHeader\n iconUrl={configData.branding.icon_url}\n subtitle={customSubtitle ?? t('login.selectMethod.subtitle')}\n title={customTitle ?? t('login.title')}\n />\n\n {isPasswordAuthEnabled && (\n <form className=\"flex flex-col gap-4\" onSubmit={handleSubmit(onSubmit)}>\n <IconInput\n autoComplete=\"username webauthn\"\n error={errors.email}\n icon={EnvelopeSimpleIcon}\n placeholder={t('login.email.placeholder')}\n {...register('email')}\n type=\"email\"\n />\n\n <IconInput\n autoComplete=\"current-password\"\n error={errors.password}\n icon={LockIcon}\n placeholder={t('login.password.placeholder')}\n {...register('password')}\n type=\"password\"\n />\n\n {configData.email.enabled && (\n <div className=\"flex items-center justify-end\">\n <Link className=\"link text-sm\" to=\"/password/forgot\">\n {t('login.link.forgotPassword')}\n </Link>\n </div>\n )}\n\n <SubmitButton\n className=\"mt-2\"\n isPending={loginMutation.isPending}\n pendingText={t('login.submitting')}\n >\n {t('login.submit')}\n </SubmitButton>\n </form>\n )}\n\n {configData.registration.public_registration && (\n <FooterLink\n as={Link}\n linkText={t('login.link.register')}\n search={extractOAuthParams(search)}\n text={t('login.footer.noAccount')}\n to=\"/register\"\n />\n )}\n\n {/* <div className=\"flex flex-col items-center gap-2\">\n <Link\n to=\"/login\"\n search={extractOAuthParams(search)}\n className=\"link text-sm\"\n >\n {t('login.password.backToMethods')}\n </Link>\n </div> */}\n </PageLayout>\n );\n}\n"],"mappings":"wCAgBsF,IAAAC,EAA7ED"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"select-BCP5fwfB.js","names":["a","a","r","a","i","t","a","s","t","ArrowRightIcon","PlusIcon","TrashIcon","UserCircleIcon","useMutation","useQueryClient","useSuspenseQuery","PageHeader","Alert","PageLayout","buildAuthorizeUrl","extractOAuthParams","accountsQueryOptions","removeAccountMutationOptions","selectAccountMutationOptions","queryKeys","Route","buildLoginHref","search","ReturnType","useSearch","params","URLSearchParams","key","value","Object","entries","account_selected","undefined","set","String","toString","AccountSelect","queryClient","data","client_id","continueWithSelectedAccount","window","location","href","selectMutation","onSuccess","removeMutation","invalidateQueries","queryKey","accounts","length","map","account","sub","isPending","mutate","email","current","allow_remove_account","allow_add_account","component"],"sources":["../../../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@phosphor-icons/react/dist/defs/ArrowRight.es.js","../../../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@phosphor-icons/react/dist/defs/Plus.es.js","../../../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@phosphor-icons/react/dist/defs/UserCircle.es.js","../../../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@phosphor-icons/react/dist/csr/ArrowRight.es.js","../../../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@phosphor-icons/react/dist/csr/Plus.es.js","../../../../node_modules/.pnpm/@phosphor-icons+react@2.1.10_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@phosphor-icons/react/dist/csr/UserCircle.es.js","../../../frontend/src/routes/account/select/index.tsx?tsr-split=component"],"sourcesContent":["import * as e from \"react\";\nconst a = /* @__PURE__ */ new Map([\n [\n \"bold\",\n /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M224.49,136.49l-72,72a12,12,0,0,1-17-17L187,140H40a12,12,0,0,1,0-24H187L135.51,64.48a12,12,0,0,1,17-17l72,72A12,12,0,0,1,224.49,136.49Z\" }))\n ],\n [\n \"duotone\",\n /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M216,128l-72,72V56Z\", opacity: \"0.2\" }), /* @__PURE__ */ e.createElement(\"path\", { d: \"M221.66,122.34l-72-72A8,8,0,0,0,136,56v64H40a8,8,0,0,0,0,16h96v64a8,8,0,0,0,13.66,5.66l72-72A8,8,0,0,0,221.66,122.34ZM152,180.69V75.31L204.69,128Z\" }))\n ],\n [\n \"fill\",\n /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M221.66,133.66l-72,72A8,8,0,0,1,136,200V136H40a8,8,0,0,1,0-16h96V56a8,8,0,0,1,13.66-5.66l72,72A8,8,0,0,1,221.66,133.66Z\" }))\n ],\n [\n \"light\",\n /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M220.24,132.24l-72,72a6,6,0,0,1-8.48-8.48L201.51,134H40a6,6,0,0,1,0-12H201.51L139.76,60.24a6,6,0,0,1,8.48-8.48l72,72A6,6,0,0,1,220.24,132.24Z\" }))\n ],\n [\n \"regular\",\n /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M221.66,133.66l-72,72a8,8,0,0,1-11.32-11.32L196.69,136H40a8,8,0,0,1,0-16H196.69L138.34,61.66a8,8,0,0,1,11.32-11.32l72,72A8,8,0,0,1,221.66,133.66Z\" }))\n ],\n [\n \"thin\",\n /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M218.83,130.83l-72,72a4,4,0,0,1-5.66-5.66L206.34,132H40a4,4,0,0,1,0-8H206.34L141.17,58.83a4,4,0,0,1,5.66-5.66l72,72A4,4,0,0,1,218.83,130.83Z\" }))\n ]\n]);\nexport {\n a as default\n};\n","import * as e from \"react\";\nconst a = /* @__PURE__ */ new Map([\n [\n \"bold\",\n /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M228,128a12,12,0,0,1-12,12H140v76a12,12,0,0,1-24,0V140H40a12,12,0,0,1,0-24h76V40a12,12,0,0,1,24,0v76h76A12,12,0,0,1,228,128Z\" }))\n ],\n [\n \"duotone\",\n /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\n \"path\",\n {\n d: \"M216,56V200a16,16,0,0,1-16,16H56a16,16,0,0,1-16-16V56A16,16,0,0,1,56,40H200A16,16,0,0,1,216,56Z\",\n opacity: \"0.2\"\n }\n ), /* @__PURE__ */ e.createElement(\"path\", { d: \"M224,128a8,8,0,0,1-8,8H136v80a8,8,0,0,1-16,0V136H40a8,8,0,0,1,0-16h80V40a8,8,0,0,1,16,0v80h80A8,8,0,0,1,224,128Z\" }))\n ],\n [\n \"fill\",\n /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M208,32H48A16,16,0,0,0,32,48V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V48A16,16,0,0,0,208,32ZM184,136H136v48a8,8,0,0,1-16,0V136H72a8,8,0,0,1,0-16h48V72a8,8,0,0,1,16,0v48h48a8,8,0,0,1,0,16Z\" }))\n ],\n [\n \"light\",\n /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M222,128a6,6,0,0,1-6,6H134v82a6,6,0,0,1-12,0V134H40a6,6,0,0,1,0-12h82V40a6,6,0,0,1,12,0v82h82A6,6,0,0,1,222,128Z\" }))\n ],\n [\n \"regular\",\n /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M224,128a8,8,0,0,1-8,8H136v80a8,8,0,0,1-16,0V136H40a8,8,0,0,1,0-16h80V40a8,8,0,0,1,16,0v80h80A8,8,0,0,1,224,128Z\" }))\n ],\n [\n \"thin\",\n /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M220,128a4,4,0,0,1-4,4H132v84a4,4,0,0,1-8,0V132H40a4,4,0,0,1,0-8h84V40a4,4,0,0,1,8,0v84h84A4,4,0,0,1,220,128Z\" }))\n ]\n]);\nexport {\n a as default\n};\n","import * as e from \"react\";\nconst a = /* @__PURE__ */ new Map([\n [\n \"bold\",\n /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M128,20A108,108,0,1,0,236,128,108.12,108.12,0,0,0,128,20ZM79.57,196.57a60,60,0,0,1,96.86,0,83.72,83.72,0,0,1-96.86,0ZM100,120a28,28,0,1,1,28,28A28,28,0,0,1,100,120ZM194,179.94a83.48,83.48,0,0,0-29-23.42,52,52,0,1,0-74,0,83.48,83.48,0,0,0-29,23.42,84,84,0,1,1,131.9,0Z\" }))\n ],\n [\n \"duotone\",\n /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\n \"path\",\n {\n d: \"M224,128a95.76,95.76,0,0,1-31.8,71.37A72,72,0,0,0,128,160a40,40,0,1,0-40-40,40,40,0,0,0,40,40,72,72,0,0,0-64.2,39.37h0A96,96,0,1,1,224,128Z\",\n opacity: \"0.2\"\n }\n ), /* @__PURE__ */ e.createElement(\"path\", { d: \"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24ZM74.08,197.5a64,64,0,0,1,107.84,0,87.83,87.83,0,0,1-107.84,0ZM96,120a32,32,0,1,1,32,32A32,32,0,0,1,96,120Zm97.76,66.41a79.66,79.66,0,0,0-36.06-28.75,48,48,0,1,0-59.4,0,79.66,79.66,0,0,0-36.06,28.75,88,88,0,1,1,131.52,0Z\" }))\n ],\n [\n \"fill\",\n /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M172,120a44,44,0,1,1-44-44A44.05,44.05,0,0,1,172,120Zm60,8A104,104,0,1,1,128,24,104.11,104.11,0,0,1,232,128Zm-16,0a88.09,88.09,0,0,0-91.47-87.93C77.43,41.89,39.87,81.12,40,128.25a87.65,87.65,0,0,0,22.24,58.16A79.71,79.71,0,0,1,84,165.1a4,4,0,0,1,4.83.32,59.83,59.83,0,0,0,78.28,0,4,4,0,0,1,4.83-.32,79.71,79.71,0,0,1,21.79,21.31A87.62,87.62,0,0,0,216,128Z\" }))\n ],\n [\n \"light\",\n /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M128,26A102,102,0,1,0,230,128,102.12,102.12,0,0,0,128,26ZM71.44,198a66,66,0,0,1,113.12,0,89.8,89.8,0,0,1-113.12,0ZM94,120a34,34,0,1,1,34,34A34,34,0,0,1,94,120Zm99.51,69.64a77.53,77.53,0,0,0-40-31.38,46,46,0,1,0-51,0,77.53,77.53,0,0,0-40,31.38,90,90,0,1,1,131,0Z\" }))\n ],\n [\n \"regular\",\n /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24ZM74.08,197.5a64,64,0,0,1,107.84,0,87.83,87.83,0,0,1-107.84,0ZM96,120a32,32,0,1,1,32,32A32,32,0,0,1,96,120Zm97.76,66.41a79.66,79.66,0,0,0-36.06-28.75,48,48,0,1,0-59.4,0,79.66,79.66,0,0,0-36.06,28.75,88,88,0,1,1,131.52,0Z\" }))\n ],\n [\n \"thin\",\n /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"path\", { d: \"M128,28A100,100,0,1,0,228,128,100.11,100.11,0,0,0,128,28ZM68.87,198.42a68,68,0,0,1,118.26,0,91.8,91.8,0,0,1-118.26,0Zm124.3-5.55a75.61,75.61,0,0,0-44.51-34,44,44,0,1,0-41.32,0,75.61,75.61,0,0,0-44.51,34,92,92,0,1,1,130.34,0ZM128,156a36,36,0,1,1,36-36A36,36,0,0,1,128,156Z\" }))\n ]\n]);\nexport {\n a as default\n};\n","import * as o from \"react\";\nimport a from \"../lib/IconBase.es.js\";\nimport i from \"../defs/ArrowRight.es.js\";\nconst r = o.forwardRef((t, e) => /* @__PURE__ */ o.createElement(a, { ref: e, ...t, weights: i }));\nr.displayName = \"ArrowRightIcon\";\nconst s = r;\nexport {\n s as ArrowRight,\n r as ArrowRightIcon\n};\n","import * as o from \"react\";\nimport t from \"../lib/IconBase.es.js\";\nimport a from \"../defs/Plus.es.js\";\nconst e = o.forwardRef((r, s) => /* @__PURE__ */ o.createElement(t, { ref: s, ...r, weights: a }));\ne.displayName = \"PlusIcon\";\nconst n = e;\nexport {\n n as Plus,\n e as PlusIcon\n};\n","import * as e from \"react\";\nimport s from \"../lib/IconBase.es.js\";\nimport t from \"../defs/UserCircle.es.js\";\nconst r = e.forwardRef((o, c) => /* @__PURE__ */ e.createElement(s, { ref: c, ...o, weights: t }));\nr.displayName = \"UserCircleIcon\";\nconst m = r;\nexport {\n m as UserCircle,\n r as UserCircleIcon\n};\n","import {\n ArrowRightIcon,\n PlusIcon,\n TrashIcon,\n UserCircleIcon,\n} from '@phosphor-icons/react';\nimport {\n useMutation,\n useQueryClient,\n useSuspenseQuery,\n} from '@tanstack/react-query';\nimport { createFileRoute } from '@tanstack/react-router';\nimport { PageHeader } from '#frontend/components/auth/page-header.tsx';\nimport { Alert } from '#frontend/components/ui/alert.tsx';\nimport { RouteErrorFallback } from '#frontend/components/ui/route-error-fallback.tsx';\nimport { PageLayout } from '#frontend/features/layout/page-layout.tsx';\nimport {\n buildAuthorizeUrl,\n extractOAuthParams,\n OAuthSearchSchema,\n} from '#frontend/libs/oauth-search.ts';\nimport {\n accountsQueryOptions,\n removeAccountMutationOptions,\n selectAccountMutationOptions,\n} from '#frontend/queries/accounts.ts';\nimport { queryKeys } from '#frontend/queries/keys.ts';\n\nexport const Route = createFileRoute('/account/select/')({\n component: AccountSelect,\n errorComponent: RouteErrorFallback,\n validateSearch: OAuthSearchSchema,\n loader: async ({ context, location }) => {\n const search = location.search as { client_id?: string };\n await context.queryClient.ensureQueryData(\n accountsQueryOptions(search.client_id),\n );\n },\n});\n\nfunction buildLoginHref(search: ReturnType<typeof Route.useSearch>) {\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries({\n ...extractOAuthParams(search),\n account_selected: '1',\n })) {\n if (value !== undefined) {\n params.set(key, String(value));\n }\n }\n return `/login?${params.toString()}`;\n}\n\nfunction AccountSelect() {\n const search = Route.useSearch();\n const queryClient = useQueryClient();\n const { data } = useSuspenseQuery(accountsQueryOptions(search.client_id));\n\n const continueWithSelectedAccount = () => {\n window.location.href = buildAuthorizeUrl({\n ...search,\n account_selected: '1',\n });\n };\n\n const selectMutation = useMutation({\n ...selectAccountMutationOptions,\n onSuccess: continueWithSelectedAccount,\n });\n const removeMutation = useMutation({\n ...removeAccountMutationOptions,\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: queryKeys.accounts(search.client_id),\n });\n },\n });\n\n return (\n <PageLayout cardPadding maxWidth=\"100\">\n <PageHeader\n subtitle=\"Choose an account to continue to this application\"\n title=\"Choose an account\"\n />\n\n {data.accounts.length === 0 ? (\n <Alert className=\"mb-4\" icon={UserCircleIcon} type=\"info\">\n No remembered accounts are available in this browser session.\n </Alert>\n ) : (\n <div className=\"flex flex-col gap-2\" data-testid=\"account-list\">\n {data.accounts.map((account) => (\n <div\n className=\"flex items-center gap-3 rounded-box border border-base-300 bg-base-100 p-3 shadow-sm\"\n data-testid=\"remembered-account\"\n key={account.sub}\n >\n <div className=\"avatar placeholder\">\n <div className=\"w-10 rounded-full bg-primary/10 text-primary\">\n <UserCircleIcon className=\"size-7\" weight=\"duotone\" />\n </div>\n </div>\n <button\n className=\"min-w-0 flex-1 text-left\"\n data-testid={`select-account-${account.sub}`}\n disabled={selectMutation.isPending}\n onClick={() => selectMutation.mutate({ sub: account.sub })}\n type=\"button\"\n >\n <div className=\"truncate font-medium text-sm\">\n {account.email}\n </div>\n <div className=\"text-base-content/60 text-xs\">\n {account.current ? 'Current account' : 'Remembered account'}\n </div>\n </button>\n {account.current ? (\n <span className=\"badge badge-primary badge-sm\">Current</span>\n ) : null}\n {data.allow_remove_account && !account.current ? (\n <button\n aria-label={`Remove ${account.email}`}\n className=\"btn btn-ghost btn-square btn-sm text-base-content/60\"\n data-testid={`remove-account-${account.sub}`}\n disabled={removeMutation.isPending}\n onClick={() => removeMutation.mutate({ sub: account.sub })}\n type=\"button\"\n >\n <TrashIcon className=\"size-4\" />\n </button>\n ) : null}\n </div>\n ))}\n </div>\n )}\n\n {data.allow_add_account ? (\n <a\n className=\"btn btn-outline mt-4 w-full justify-between\"\n href={buildLoginHref(search)}\n >\n <span className=\"inline-flex items-center gap-2\">\n <PlusIcon className=\"size-4\" />\n Use another account\n </span>\n <ArrowRightIcon className=\"size-4\" />\n </a>\n ) : null}\n </PageLayout>\n );\n}\n"],"x_google_ignoreList":[0,1,2,3,4,5],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"select-SSKfXB7c.js","names":["RouteErrorFallback","SplitErrorComponent","errorComponent"],"sources":["../../../frontend/src/routes/account/select/index.tsx?tsr-split=errorComponent"],"sourcesContent":["import {\n ArrowRightIcon,\n PlusIcon,\n TrashIcon,\n UserCircleIcon,\n} from '@phosphor-icons/react';\nimport {\n useMutation,\n useQueryClient,\n useSuspenseQuery,\n} from '@tanstack/react-query';\nimport { createFileRoute } from '@tanstack/react-router';\nimport { PageHeader } from '#frontend/components/auth/page-header.tsx';\nimport { Alert } from '#frontend/components/ui/alert.tsx';\nimport { RouteErrorFallback } from '#frontend/components/ui/route-error-fallback.tsx';\nimport { PageLayout } from '#frontend/features/layout/page-layout.tsx';\nimport {\n buildAuthorizeUrl,\n extractOAuthParams,\n OAuthSearchSchema,\n} from '#frontend/libs/oauth-search.ts';\nimport {\n accountsQueryOptions,\n removeAccountMutationOptions,\n selectAccountMutationOptions,\n} from '#frontend/queries/accounts.ts';\nimport { queryKeys } from '#frontend/queries/keys.ts';\n\nexport const Route = createFileRoute('/account/select/')({\n component: AccountSelect,\n errorComponent: RouteErrorFallback,\n validateSearch: OAuthSearchSchema,\n loader: async ({ context, location }) => {\n const search = location.search as { client_id?: string };\n await context.queryClient.ensureQueryData(\n accountsQueryOptions(search.client_id),\n );\n },\n});\n\nfunction buildLoginHref(search: ReturnType<typeof Route.useSearch>) {\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries({\n ...extractOAuthParams(search),\n account_selected: '1',\n })) {\n if (value !== undefined) {\n params.set(key, String(value));\n }\n }\n return `/login?${params.toString()}`;\n}\n\nfunction AccountSelect() {\n const search = Route.useSearch();\n const queryClient = useQueryClient();\n const { data } = useSuspenseQuery(accountsQueryOptions(search.client_id));\n\n const continueWithSelectedAccount = () => {\n window.location.href = buildAuthorizeUrl({\n ...search,\n account_selected: '1',\n });\n };\n\n const selectMutation = useMutation({\n ...selectAccountMutationOptions,\n onSuccess: continueWithSelectedAccount,\n });\n const removeMutation = useMutation({\n ...removeAccountMutationOptions,\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: queryKeys.accounts(search.client_id),\n });\n },\n });\n\n return (\n <PageLayout cardPadding maxWidth=\"100\">\n <PageHeader\n subtitle=\"Choose an account to continue to this application\"\n title=\"Choose an account\"\n />\n\n {data.accounts.length === 0 ? (\n <Alert className=\"mb-4\" icon={UserCircleIcon} type=\"info\">\n No remembered accounts are available in this browser session.\n </Alert>\n ) : (\n <div className=\"flex flex-col gap-2\" data-testid=\"account-list\">\n {data.accounts.map((account) => (\n <div\n className=\"flex items-center gap-3 rounded-box border border-base-300 bg-base-100 p-3 shadow-sm\"\n data-testid=\"remembered-account\"\n key={account.sub}\n >\n <div className=\"avatar placeholder\">\n <div className=\"w-10 rounded-full bg-primary/10 text-primary\">\n <UserCircleIcon className=\"size-7\" weight=\"duotone\" />\n </div>\n </div>\n <button\n className=\"min-w-0 flex-1 text-left\"\n data-testid={`select-account-${account.sub}`}\n disabled={selectMutation.isPending}\n onClick={() => selectMutation.mutate({ sub: account.sub })}\n type=\"button\"\n >\n <div className=\"truncate font-medium text-sm\">\n {account.email}\n </div>\n <div className=\"text-base-content/60 text-xs\">\n {account.current ? 'Current account' : 'Remembered account'}\n </div>\n </button>\n {account.current ? (\n <span className=\"badge badge-primary badge-sm\">Current</span>\n ) : null}\n {data.allow_remove_account && !account.current ? (\n <button\n aria-label={`Remove ${account.email}`}\n className=\"btn btn-ghost btn-square btn-sm text-base-content/60\"\n data-testid={`remove-account-${account.sub}`}\n disabled={removeMutation.isPending}\n onClick={() => removeMutation.mutate({ sub: account.sub })}\n type=\"button\"\n >\n <TrashIcon className=\"size-4\" />\n </button>\n ) : null}\n </div>\n ))}\n </div>\n )}\n\n {data.allow_add_account ? (\n <a\n className=\"btn btn-outline mt-4 w-full justify-between\"\n href={buildLoginHref(search)}\n >\n <span className=\"inline-flex items-center gap-2\">\n <PlusIcon className=\"size-4\" />\n Use another account\n </span>\n <ArrowRightIcon className=\"size-4\" />\n </a>\n ) : null}\n </PageLayout>\n );\n}\n"],"mappings":"wCAcsF,IAAAC,EAA7ED"}
|