@workos-inc/widgets 1.18.0 → 1.19.0-next.1790102694835
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/CHANGELOG.md +12 -0
- package/dist/cjs/admin-portal-audit-log-streaming.client.cjs +16 -20
- package/dist/cjs/admin-portal-audit-log-streaming.client.cjs.map +1 -1
- package/dist/cjs/admin-portal-audit-log-streaming.client.d.cts +2 -0
- package/dist/cjs/admin-portal-domain-verification.client.cjs +42 -34
- package/dist/cjs/admin-portal-domain-verification.client.cjs.map +1 -1
- package/dist/cjs/admin-portal-domain-verification.client.d.cts +2 -0
- package/dist/cjs/admin-portal-sso-connection.client.cjs +77 -50
- package/dist/cjs/admin-portal-sso-connection.client.cjs.map +1 -1
- package/dist/cjs/api/client-graphql/client.cjs +2 -1
- package/dist/cjs/api/client-graphql/client.cjs.map +1 -1
- package/dist/cjs/api/client-graphql/generated.cjs +2295 -6
- package/dist/cjs/api/client-graphql/generated.cjs.map +1 -1
- package/dist/cjs/api/client-graphql/generated.d.cts +2989 -7
- package/dist/cjs/api/client-graphql/hooks.cjs +67 -0
- package/dist/cjs/api/client-graphql/hooks.cjs.map +1 -0
- package/dist/cjs/api/client-graphql/hooks.d.cts +44 -0
- package/dist/cjs/api/endpoint.cjs +43 -27
- package/dist/cjs/api/endpoint.cjs.map +1 -1
- package/dist/cjs/api/endpoint.d.cts +53 -20
- package/dist/cjs/api-keys.client.cjs +1 -2
- package/dist/cjs/api-keys.client.cjs.map +1 -1
- package/dist/cjs/directory-sync.client.cjs +54 -13
- package/dist/cjs/directory-sync.client.cjs.map +1 -1
- package/dist/cjs/experimental/api/fetch.cjs +44 -16
- package/dist/cjs/experimental/api/fetch.cjs.map +1 -1
- package/dist/cjs/experimental/api/fetch.d.cts +38 -9
- package/dist/cjs/experimental/api/react-query.cjs +75 -38
- package/dist/cjs/experimental/api/react-query.cjs.map +1 -1
- package/dist/cjs/experimental/api/react-query.d.cts +57 -24
- package/dist/cjs/experimental/api/swr.cjs +77 -35
- package/dist/cjs/experimental/api/swr.cjs.map +1 -1
- package/dist/cjs/experimental/api/swr.d.cts +49 -20
- package/dist/cjs/index.d.cts +4 -0
- package/dist/cjs/lib/add-mfa-dialog.cjs +39 -33
- package/dist/cjs/lib/add-mfa-dialog.cjs.map +1 -1
- package/dist/cjs/lib/admin-portal-audit-log-streaming.cjs.map +1 -1
- package/dist/cjs/lib/admin-portal-audit-log-streaming.d.cts +5 -3
- package/dist/cjs/lib/admin-portal-domain-verification.cjs.map +1 -1
- package/dist/cjs/lib/admin-portal-domain-verification.d.cts +4 -2
- package/dist/cjs/lib/api/api-key.cjs +128 -40
- package/dist/cjs/lib/api/api-key.cjs.map +1 -1
- package/dist/cjs/lib/api/api-key.d.cts +20 -9
- package/dist/cjs/lib/api/me.cjs +70 -0
- package/dist/cjs/lib/api/me.cjs.map +1 -0
- package/dist/cjs/lib/api/me.d.cts +37 -0
- package/dist/cjs/lib/api/pipes.cjs +419 -0
- package/dist/cjs/lib/api/pipes.cjs.map +1 -0
- package/dist/cjs/lib/api/pipes.d.cts +69 -0
- package/dist/cjs/lib/api/user-api-key.cjs +116 -45
- package/dist/cjs/lib/api/user-api-key.cjs.map +1 -1
- package/dist/cjs/lib/api/user-api-key.d.cts +17 -12
- package/dist/cjs/lib/api/user.cjs +170 -51
- package/dist/cjs/lib/api/user.cjs.map +1 -1
- package/dist/cjs/lib/api/user.d.cts +4 -25
- package/dist/cjs/lib/api-keys/api-key-details-dialog.cjs +2 -2
- package/dist/cjs/lib/api-keys/api-key-details-dialog.cjs.map +1 -1
- package/dist/cjs/lib/api-keys/create-api-key.cjs +1 -2
- package/dist/cjs/lib/api-keys/create-api-key.cjs.map +1 -1
- package/dist/cjs/lib/api-keys/revoke-api-key-dialog.cjs +5 -13
- package/dist/cjs/lib/api-keys/revoke-api-key-dialog.cjs.map +1 -1
- package/dist/cjs/lib/change-email-dialog.cjs +39 -26
- package/dist/cjs/lib/change-email-dialog.cjs.map +1 -1
- package/dist/cjs/lib/change-email-dialog.d.cts +4 -3
- package/dist/cjs/lib/change-password-dialog.cjs +14 -13
- package/dist/cjs/lib/change-password-dialog.cjs.map +1 -1
- package/dist/cjs/lib/client-graphql-result.cjs +116 -0
- package/dist/cjs/lib/client-graphql-result.cjs.map +1 -0
- package/dist/cjs/lib/client-graphql-result.d.cts +32 -0
- package/dist/cjs/lib/delete-domain-dialog.cjs.map +1 -1
- package/dist/cjs/lib/delete-domain-dialog.d.cts +3 -4
- package/dist/cjs/lib/delete-user-dialog.cjs.map +1 -1
- package/dist/cjs/lib/delete-user-dialog.d.cts +3 -2
- package/dist/cjs/lib/directory-sync.cjs +59 -23
- package/dist/cjs/lib/directory-sync.cjs.map +1 -1
- package/dist/cjs/lib/directory-sync.d.cts +23 -5
- package/dist/cjs/lib/domain-actions.cjs.map +1 -1
- package/dist/cjs/lib/domain-actions.d.cts +3 -4
- package/dist/cjs/lib/domain-item.cjs.map +1 -1
- package/dist/cjs/lib/domain-item.d.cts +3 -4
- package/dist/cjs/lib/edit-user-profile-dialog.cjs +19 -19
- package/dist/cjs/lib/edit-user-profile-dialog.cjs.map +1 -1
- package/dist/cjs/lib/edit-user-profile-dialog.d.cts +4 -3
- package/dist/cjs/lib/edit-user-role-dialog.cjs +3 -8
- package/dist/cjs/lib/edit-user-role-dialog.cjs.map +1 -1
- package/dist/cjs/lib/edit-user-role-dialog.d.cts +5 -4
- package/dist/cjs/lib/elevated-access.cjs +22 -13
- package/dist/cjs/lib/elevated-access.cjs.map +1 -1
- package/dist/cjs/lib/elevated-access.d.cts +1 -1
- package/dist/cjs/lib/invite-user-dialog.cjs +9 -15
- package/dist/cjs/lib/invite-user-dialog.cjs.map +1 -1
- package/dist/cjs/lib/logout-all-sessions-dialog.cjs +13 -5
- package/dist/cjs/lib/logout-all-sessions-dialog.cjs.map +1 -1
- package/dist/cjs/lib/logout-all-sessions-dialog.d.cts +2 -2
- package/dist/cjs/lib/logout-dialog.cjs +10 -6
- package/dist/cjs/lib/logout-dialog.cjs.map +1 -1
- package/dist/cjs/lib/logout-dialog.d.cts +3 -4
- package/dist/cjs/lib/name-server-icon.cjs.map +1 -1
- package/dist/cjs/lib/name-server-icon.d.cts +3 -4
- package/dist/cjs/lib/oauth-icons.cjs +13 -2
- package/dist/cjs/lib/oauth-icons.cjs.map +1 -1
- package/dist/cjs/lib/oauth-icons.d.cts +2 -1
- package/dist/cjs/lib/organization-switcher.cjs +3 -3
- package/dist/cjs/lib/organization-switcher.cjs.map +1 -1
- package/dist/cjs/lib/organization-switcher.d.cts +6 -3
- package/dist/cjs/lib/password-error-utils.cjs +28 -43
- package/dist/cjs/lib/password-error-utils.cjs.map +1 -1
- package/dist/cjs/lib/password-error-utils.d.cts +3 -13
- package/dist/cjs/lib/pipes-admin.cjs +109 -79
- package/dist/cjs/lib/pipes-admin.cjs.map +1 -1
- package/dist/cjs/lib/pipes-admin.d.cts +1 -1
- package/dist/cjs/lib/pipes.cjs +133 -60
- package/dist/cjs/lib/pipes.cjs.map +1 -1
- package/dist/cjs/lib/resend-invite-dialog.cjs.map +1 -1
- package/dist/cjs/lib/resend-invite-dialog.d.cts +3 -2
- package/dist/cjs/lib/reset-mfa-dialog.cjs +11 -3
- package/dist/cjs/lib/reset-mfa-dialog.cjs.map +1 -1
- package/dist/cjs/lib/revoke-invite-dialog.cjs.map +1 -1
- package/dist/cjs/lib/revoke-invite-dialog.d.cts +3 -2
- package/dist/cjs/lib/set-password-dialog.cjs +16 -3
- package/dist/cjs/lib/set-password-dialog.cjs.map +1 -1
- package/dist/cjs/lib/use-security-settings.cjs +5 -25
- package/dist/cjs/lib/use-security-settings.cjs.map +1 -1
- package/dist/cjs/lib/use-security-settings.d.cts +2 -2
- package/dist/cjs/lib/user-actions-dropdown.cjs +2 -6
- package/dist/cjs/lib/user-actions-dropdown.cjs.map +1 -1
- package/dist/cjs/lib/user-actions-dropdown.d.cts +3 -2
- package/dist/cjs/lib/user-api-keys/revoke-user-api-key-dialog.cjs +3 -10
- package/dist/cjs/lib/user-api-keys/revoke-user-api-key-dialog.cjs.map +1 -1
- package/dist/cjs/lib/user-profile.cjs +10 -5
- package/dist/cjs/lib/user-profile.cjs.map +1 -1
- package/dist/cjs/lib/user-profile.d.cts +5 -2
- package/dist/cjs/lib/user-security.cjs +4 -5
- package/dist/cjs/lib/user-security.cjs.map +1 -1
- package/dist/cjs/lib/user-security.d.cts +6 -2
- package/dist/cjs/lib/user-sessions.cjs +2 -2
- package/dist/cjs/lib/user-sessions.cjs.map +1 -1
- package/dist/cjs/lib/user-sessions.d.cts +6 -4
- package/dist/cjs/lib/users-filter.cjs.map +1 -1
- package/dist/cjs/lib/users-filter.d.cts +4 -3
- package/dist/cjs/lib/users-management-context.cjs.map +1 -1
- package/dist/cjs/lib/users-management-context.d.cts +4 -18
- package/dist/cjs/lib/users-management-state.cjs.map +1 -1
- package/dist/cjs/lib/users-management-state.d.cts +4 -25
- package/dist/cjs/lib/users-management.cjs.map +1 -1
- package/dist/cjs/lib/users-management.d.cts +7 -7
- package/dist/cjs/lib/view-dns-record-dialog.cjs.map +1 -1
- package/dist/cjs/lib/view-dns-record-dialog.d.cts +3 -4
- package/dist/cjs/organization-switcher.client.cjs +7 -6
- package/dist/cjs/organization-switcher.client.cjs.map +1 -1
- package/dist/cjs/organization-switcher.client.d.cts +3 -1
- package/dist/cjs/pipes-admin.client.cjs +7 -4
- package/dist/cjs/pipes-admin.client.cjs.map +1 -1
- package/dist/cjs/pipes.client.cjs +17 -16
- package/dist/cjs/pipes.client.cjs.map +1 -1
- package/dist/cjs/user-CgBDfSHl.d.cts +502 -0
- package/dist/cjs/user-profile.client.cjs +3 -3
- package/dist/cjs/user-profile.client.cjs.map +1 -1
- package/dist/cjs/user-profile.client.d.cts +4 -1
- package/dist/cjs/user-security.client.cjs +25 -14
- package/dist/cjs/user-security.client.cjs.map +1 -1
- package/dist/cjs/user-security.client.d.cts +2 -0
- package/dist/cjs/user-sessions.client.cjs +12 -29
- package/dist/cjs/user-sessions.client.cjs.map +1 -1
- package/dist/cjs/user-sessions.client.d.cts +2 -0
- package/dist/cjs/users-management.client.cjs +1 -4
- package/dist/cjs/users-management.client.cjs.map +1 -1
- package/dist/cjs/users-management.client.d.cts +4 -1
- package/dist/cjs/utils.cjs +2 -1
- package/dist/cjs/utils.cjs.map +1 -1
- package/dist/esm/admin-portal-audit-log-streaming.client.d.ts +2 -0
- package/dist/esm/admin-portal-audit-log-streaming.client.js +20 -23
- package/dist/esm/admin-portal-audit-log-streaming.client.js.map +1 -1
- package/dist/esm/admin-portal-domain-verification.client.d.ts +2 -0
- package/dist/esm/admin-portal-domain-verification.client.js +45 -39
- package/dist/esm/admin-portal-domain-verification.client.js.map +1 -1
- package/dist/esm/admin-portal-sso-connection.client.js +80 -52
- package/dist/esm/admin-portal-sso-connection.client.js.map +1 -1
- package/dist/esm/api/client-graphql/client.js +2 -1
- package/dist/esm/api/client-graphql/client.js.map +1 -1
- package/dist/esm/api/client-graphql/generated.d.ts +2989 -7
- package/dist/esm/api/client-graphql/generated.js +2203 -0
- package/dist/esm/api/client-graphql/generated.js.map +1 -1
- package/dist/esm/api/client-graphql/hooks.d.ts +44 -0
- package/dist/esm/api/client-graphql/hooks.js +43 -0
- package/dist/esm/api/client-graphql/hooks.js.map +1 -0
- package/dist/esm/api/endpoint.d.ts +53 -20
- package/dist/esm/api/endpoint.js +43 -27
- package/dist/esm/api/endpoint.js.map +1 -1
- package/dist/esm/api-keys.client.js +4 -2
- package/dist/esm/api-keys.client.js.map +1 -1
- package/dist/esm/directory-sync.client.js +56 -7
- package/dist/esm/directory-sync.client.js.map +1 -1
- package/dist/esm/experimental/api/fetch.d.ts +38 -9
- package/dist/esm/experimental/api/fetch.js +44 -16
- package/dist/esm/experimental/api/fetch.js.map +1 -1
- package/dist/esm/experimental/api/react-query.d.ts +57 -24
- package/dist/esm/experimental/api/react-query.js +75 -38
- package/dist/esm/experimental/api/react-query.js.map +1 -1
- package/dist/esm/experimental/api/swr.d.ts +49 -20
- package/dist/esm/experimental/api/swr.js +77 -35
- package/dist/esm/experimental/api/swr.js.map +1 -1
- package/dist/esm/index.d.ts +4 -0
- package/dist/esm/lib/add-mfa-dialog.js +39 -36
- package/dist/esm/lib/add-mfa-dialog.js.map +1 -1
- package/dist/esm/lib/admin-portal-audit-log-streaming.d.ts +5 -3
- package/dist/esm/lib/admin-portal-audit-log-streaming.js.map +1 -1
- package/dist/esm/lib/admin-portal-domain-verification.d.ts +4 -2
- package/dist/esm/lib/admin-portal-domain-verification.js.map +1 -1
- package/dist/esm/lib/api/api-key.d.ts +20 -9
- package/dist/esm/lib/api/api-key.js +124 -49
- package/dist/esm/lib/api/api-key.js.map +1 -1
- package/dist/esm/lib/api/me.d.ts +37 -0
- package/dist/esm/lib/api/me.js +37 -0
- package/dist/esm/lib/api/me.js.map +1 -0
- package/dist/esm/lib/api/pipes.d.ts +69 -0
- package/dist/esm/lib/api/pipes.js +380 -0
- package/dist/esm/lib/api/pipes.js.map +1 -0
- package/dist/esm/lib/api/user-api-key.d.ts +17 -12
- package/dist/esm/lib/api/user-api-key.js +113 -52
- package/dist/esm/lib/api/user-api-key.js.map +1 -1
- package/dist/esm/lib/api/user.d.ts +4 -25
- package/dist/esm/lib/api/user.js +173 -59
- package/dist/esm/lib/api/user.js.map +1 -1
- package/dist/esm/lib/api-keys/api-key-details-dialog.js +1 -3
- package/dist/esm/lib/api-keys/api-key-details-dialog.js.map +1 -1
- package/dist/esm/lib/api-keys/create-api-key.js +2 -2
- package/dist/esm/lib/api-keys/create-api-key.js.map +1 -1
- package/dist/esm/lib/api-keys/revoke-api-key-dialog.js +5 -15
- package/dist/esm/lib/api-keys/revoke-api-key-dialog.js.map +1 -1
- package/dist/esm/lib/change-email-dialog.d.ts +4 -3
- package/dist/esm/lib/change-email-dialog.js +39 -31
- package/dist/esm/lib/change-email-dialog.js.map +1 -1
- package/dist/esm/lib/change-password-dialog.js +14 -13
- package/dist/esm/lib/change-password-dialog.js.map +1 -1
- package/dist/esm/lib/client-graphql-result.d.ts +32 -0
- package/dist/esm/lib/client-graphql-result.js +89 -0
- package/dist/esm/lib/client-graphql-result.js.map +1 -0
- package/dist/esm/lib/delete-domain-dialog.d.ts +3 -4
- package/dist/esm/lib/delete-domain-dialog.js.map +1 -1
- package/dist/esm/lib/delete-user-dialog.d.ts +3 -2
- package/dist/esm/lib/delete-user-dialog.js.map +1 -1
- package/dist/esm/lib/directory-sync.d.ts +23 -5
- package/dist/esm/lib/directory-sync.js +46 -14
- package/dist/esm/lib/directory-sync.js.map +1 -1
- package/dist/esm/lib/domain-actions.d.ts +3 -4
- package/dist/esm/lib/domain-actions.js.map +1 -1
- package/dist/esm/lib/domain-item.d.ts +3 -4
- package/dist/esm/lib/domain-item.js.map +1 -1
- package/dist/esm/lib/edit-user-profile-dialog.d.ts +4 -3
- package/dist/esm/lib/edit-user-profile-dialog.js +19 -19
- package/dist/esm/lib/edit-user-profile-dialog.js.map +1 -1
- package/dist/esm/lib/edit-user-role-dialog.d.ts +5 -4
- package/dist/esm/lib/edit-user-role-dialog.js +7 -11
- package/dist/esm/lib/edit-user-role-dialog.js.map +1 -1
- package/dist/esm/lib/elevated-access.d.ts +1 -1
- package/dist/esm/lib/elevated-access.js +20 -11
- package/dist/esm/lib/elevated-access.js.map +1 -1
- package/dist/esm/lib/invite-user-dialog.js +10 -16
- package/dist/esm/lib/invite-user-dialog.js.map +1 -1
- package/dist/esm/lib/logout-all-sessions-dialog.d.ts +2 -2
- package/dist/esm/lib/logout-all-sessions-dialog.js +16 -5
- package/dist/esm/lib/logout-all-sessions-dialog.js.map +1 -1
- package/dist/esm/lib/logout-dialog.d.ts +3 -4
- package/dist/esm/lib/logout-dialog.js +12 -8
- package/dist/esm/lib/logout-dialog.js.map +1 -1
- package/dist/esm/lib/name-server-icon.d.ts +3 -4
- package/dist/esm/lib/name-server-icon.js.map +1 -1
- package/dist/esm/lib/oauth-icons.d.ts +2 -1
- package/dist/esm/lib/oauth-icons.js +11 -1
- package/dist/esm/lib/oauth-icons.js.map +1 -1
- package/dist/esm/lib/organization-switcher.d.ts +6 -3
- package/dist/esm/lib/organization-switcher.js +3 -3
- package/dist/esm/lib/organization-switcher.js.map +1 -1
- package/dist/esm/lib/password-error-utils.d.ts +3 -13
- package/dist/esm/lib/password-error-utils.js +28 -43
- package/dist/esm/lib/password-error-utils.js.map +1 -1
- package/dist/esm/lib/pipes-admin.d.ts +1 -1
- package/dist/esm/lib/pipes-admin.js +105 -78
- package/dist/esm/lib/pipes-admin.js.map +1 -1
- package/dist/esm/lib/pipes.js +140 -71
- package/dist/esm/lib/pipes.js.map +1 -1
- package/dist/esm/lib/resend-invite-dialog.d.ts +3 -2
- package/dist/esm/lib/resend-invite-dialog.js.map +1 -1
- package/dist/esm/lib/reset-mfa-dialog.js +11 -3
- package/dist/esm/lib/reset-mfa-dialog.js.map +1 -1
- package/dist/esm/lib/revoke-invite-dialog.d.ts +3 -2
- package/dist/esm/lib/revoke-invite-dialog.js.map +1 -1
- package/dist/esm/lib/set-password-dialog.js +16 -3
- package/dist/esm/lib/set-password-dialog.js.map +1 -1
- package/dist/esm/lib/use-security-settings.d.ts +2 -2
- package/dist/esm/lib/use-security-settings.js +5 -27
- package/dist/esm/lib/use-security-settings.js.map +1 -1
- package/dist/esm/lib/user-actions-dropdown.d.ts +3 -2
- package/dist/esm/lib/user-actions-dropdown.js +2 -6
- package/dist/esm/lib/user-actions-dropdown.js.map +1 -1
- package/dist/esm/lib/user-api-keys/revoke-user-api-key-dialog.js +3 -11
- package/dist/esm/lib/user-api-keys/revoke-user-api-key-dialog.js.map +1 -1
- package/dist/esm/lib/user-profile.d.ts +5 -2
- package/dist/esm/lib/user-profile.js +15 -6
- package/dist/esm/lib/user-profile.js.map +1 -1
- package/dist/esm/lib/user-security.d.ts +6 -2
- package/dist/esm/lib/user-security.js +4 -5
- package/dist/esm/lib/user-security.js.map +1 -1
- package/dist/esm/lib/user-sessions.d.ts +6 -4
- package/dist/esm/lib/user-sessions.js +2 -2
- package/dist/esm/lib/user-sessions.js.map +1 -1
- package/dist/esm/lib/users-filter.d.ts +4 -3
- package/dist/esm/lib/users-filter.js.map +1 -1
- package/dist/esm/lib/users-management-context.d.ts +4 -18
- package/dist/esm/lib/users-management-context.js.map +1 -1
- package/dist/esm/lib/users-management-state.d.ts +4 -25
- package/dist/esm/lib/users-management-state.js.map +1 -1
- package/dist/esm/lib/users-management.d.ts +7 -7
- package/dist/esm/lib/users-management.js.map +1 -1
- package/dist/esm/lib/view-dns-record-dialog.d.ts +3 -4
- package/dist/esm/lib/view-dns-record-dialog.js.map +1 -1
- package/dist/esm/organization-switcher.client.d.ts +3 -1
- package/dist/esm/organization-switcher.client.js +10 -6
- package/dist/esm/organization-switcher.client.js.map +1 -1
- package/dist/esm/pipes-admin.client.js +10 -4
- package/dist/esm/pipes-admin.client.js.map +1 -1
- package/dist/esm/pipes.client.js +17 -14
- package/dist/esm/pipes.client.js.map +1 -1
- package/dist/esm/user-BE5sIud6.d.ts +502 -0
- package/dist/esm/user-profile.client.d.ts +4 -1
- package/dist/esm/user-profile.client.js +2 -2
- package/dist/esm/user-profile.client.js.map +1 -1
- package/dist/esm/user-security.client.d.ts +2 -0
- package/dist/esm/user-security.client.js +28 -14
- package/dist/esm/user-security.client.js.map +1 -1
- package/dist/esm/user-sessions.client.d.ts +2 -0
- package/dist/esm/user-sessions.client.js +16 -30
- package/dist/esm/user-sessions.client.js.map +1 -1
- package/dist/esm/users-management.client.d.ts +4 -1
- package/dist/esm/users-management.client.js +2 -5
- package/dist/esm/users-management.client.js.map +1 -1
- package/dist/esm/utils.js +2 -1
- package/dist/esm/utils.js.map +1 -1
- package/package.json +1 -1
|
@@ -34,8 +34,10 @@ module.exports = __toCommonJS(elevated_access_exports);
|
|
|
34
34
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
35
35
|
var Form = __toESM(require("./form.js"), 1);
|
|
36
36
|
var import_themes = require("@radix-ui/themes");
|
|
37
|
-
var
|
|
37
|
+
var import_hooks = require("../api/client-graphql/hooks.js");
|
|
38
38
|
var import_api_provider = require("../api/api-provider.js");
|
|
39
|
+
var import_me = require("./api/me.js");
|
|
40
|
+
var import_client_graphql_result = require("./client-graphql-result.js");
|
|
39
41
|
var import_react = require("react");
|
|
40
42
|
var import_elements = require("./elements.js");
|
|
41
43
|
var Otp = __toESM(require("./otp-input.js"), 1);
|
|
@@ -73,9 +75,9 @@ function ElevatedAccess({
|
|
|
73
75
|
{
|
|
74
76
|
type,
|
|
75
77
|
authenticationChallengeId,
|
|
76
|
-
onSuccess: () => {
|
|
78
|
+
onSuccess: (elevatedAccessToken) => {
|
|
77
79
|
setAuthenticationChallengeId(void 0);
|
|
78
|
-
return onVerified?.();
|
|
80
|
+
return onVerified?.(elevatedAccessToken);
|
|
79
81
|
}
|
|
80
82
|
}
|
|
81
83
|
);
|
|
@@ -87,9 +89,13 @@ function SendVerificationEmailForm({
|
|
|
87
89
|
type,
|
|
88
90
|
hasTokenExpired
|
|
89
91
|
}) {
|
|
90
|
-
const { data: me } = (0,
|
|
91
|
-
const sendVerification = (0,
|
|
92
|
-
|
|
92
|
+
const { data: me } = (0, import_me.useMe)();
|
|
93
|
+
const sendVerification = (0, import_hooks.useClientGraphqlMutation)({
|
|
94
|
+
mutationFn: async (sdk) => (0, import_client_graphql_result.expectResultMember)(
|
|
95
|
+
(await sdk.SendVerificationCode()).sendVerificationCode,
|
|
96
|
+
"VerificationCodeSent"
|
|
97
|
+
),
|
|
98
|
+
onSuccess: (data) => onSuccess(data.authenticationChallengeId)
|
|
93
99
|
});
|
|
94
100
|
const Title = type === "dialog" ? import_elements.Dialog.Title : import_elements.AlertDialog.Title;
|
|
95
101
|
const Description = type === "dialog" ? import_elements.Dialog.Description : import_elements.AlertDialog.Description;
|
|
@@ -159,9 +165,14 @@ function VerificationIdentityForm({
|
|
|
159
165
|
authenticationChallengeId,
|
|
160
166
|
type
|
|
161
167
|
}) {
|
|
162
|
-
const { data: me } = (0,
|
|
168
|
+
const { data: me } = (0, import_me.useMe)();
|
|
163
169
|
const { setElevatedAccess } = (0, import_api_provider.useElevatedAccessToken)();
|
|
164
|
-
const verifyIdentity = (0,
|
|
170
|
+
const verifyIdentity = (0, import_hooks.useClientGraphqlMutation)({
|
|
171
|
+
mutationFn: async (sdk, input) => (0, import_client_graphql_result.expectResultMember)(
|
|
172
|
+
(await sdk.VerifyCurrentEmail({ input })).verifyCurrentEmail,
|
|
173
|
+
"CurrentEmailVerified"
|
|
174
|
+
)
|
|
175
|
+
});
|
|
165
176
|
const [isSubmitting, setIsSubmitting] = (0, import_react.useState)(false);
|
|
166
177
|
const [otpValue, setOtpValue] = (0, import_react.useState)("");
|
|
167
178
|
const Title = type === "dialog" ? import_elements.Dialog.Title : import_elements.AlertDialog.Title;
|
|
@@ -174,10 +185,8 @@ function VerificationIdentityForm({
|
|
|
174
185
|
setIsSubmitting(true);
|
|
175
186
|
try {
|
|
176
187
|
const newAuthState = await verifyIdentity.mutateAsync({
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
authenticationChallengeId
|
|
180
|
-
}
|
|
188
|
+
code,
|
|
189
|
+
authenticationChallengeId
|
|
181
190
|
});
|
|
182
191
|
setElevatedAccess({
|
|
183
192
|
token: newAuthState.elevatedAccessToken,
|
|
@@ -185,7 +194,7 @@ function VerificationIdentityForm({
|
|
|
185
194
|
});
|
|
186
195
|
if (onSuccess) {
|
|
187
196
|
await new Promise((resolve) => setTimeout(resolve, 200));
|
|
188
|
-
await onSuccess();
|
|
197
|
+
await onSuccess(newAuthState.elevatedAccessToken);
|
|
189
198
|
}
|
|
190
199
|
} catch (error) {
|
|
191
200
|
console.error(error);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/lib/elevated-access.tsx"],"sourcesContent":["import * as Form from \"./form.js\";\nimport { Callout, Flex, Text } from \"@radix-ui/themes\";\nimport { useMe, useSendVerification, useVerify } from \"../api/endpoint.js\";\nimport { useElevatedAccessToken } from \"../api/api-provider.js\";\nimport { PropsWithChildren, useEffect, useRef, useState } from \"react\";\nimport { AlertDialog, Dialog, Button } from \"./elements.js\";\nimport * as Otp from \"./otp-input.js\";\nimport { Translation } from \"./i18n/translation.js\";\n\ninterface ElevatedAccessProps extends PropsWithChildren {\n onVerified?: () => Promise<unknown>;\n type?: \"dialog\" | \"alert\";\n}\n\nexport function ElevatedAccess({\n type = \"dialog\",\n children,\n onVerified,\n}: ElevatedAccessProps) {\n const { elevatedAccess } = useElevatedAccessToken();\n const [authenticationChallengeId, setAuthenticationChallengeId] =\n useState<string>();\n\n const prevAccessToken = useRef(elevatedAccess);\n\n useEffect(() => {\n prevAccessToken.current = elevatedAccess;\n }, [elevatedAccess]);\n\n if (elevatedAccess) {\n return <>{children}</>;\n }\n\n if (!authenticationChallengeId) {\n // FIXME: This should be refactored\n // eslint-disable-next-line react-hooks/refs\n const hasTokenExpired = !!prevAccessToken.current;\n\n return (\n <SendVerificationEmailForm\n type={type}\n hasTokenExpired={hasTokenExpired}\n onSuccess={(challengeId) => {\n setAuthenticationChallengeId(challengeId);\n }}\n />\n );\n }\n\n if (authenticationChallengeId) {\n return (\n <VerificationIdentityForm\n type={type}\n authenticationChallengeId={authenticationChallengeId}\n onSuccess={() => {\n // Reset the challenge id\n setAuthenticationChallengeId(undefined);\n\n return onVerified?.();\n }}\n />\n );\n }\n\n return null;\n}\n\ninterface SendVerificationEmailFormProps {\n onSuccess: (challengeId: string) => unknown | Promise<unknown>;\n type: \"dialog\" | \"alert\";\n hasTokenExpired: boolean;\n}\n\nfunction SendVerificationEmailForm({\n onSuccess,\n type,\n hasTokenExpired,\n}: SendVerificationEmailFormProps) {\n const { data: me } = useMe();\n const sendVerification = useSendVerification({\n mutation: { onSuccess: (data) => onSuccess(data.authenticationChallenge) },\n });\n\n const Title = type === \"dialog\" ? Dialog.Title : AlertDialog.Title;\n const Description =\n type === \"dialog\" ? Dialog.Description : AlertDialog.Description;\n const Close = type === \"dialog\" ? Dialog.Close : AlertDialog.Cancel;\n\n const handleSubmit = async (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n\n sendVerification.mutate();\n };\n\n return (\n <form onSubmit={handleSubmit}>\n <Title>\n {hasTokenExpired ? (\n <Translation\n defaultMessage=\"Your verification token has expired\"\n id=\"lb/AsC\"\n description=\"Dialog title when verification token has expired\"\n />\n ) : (\n <Translation\n defaultMessage=\"Verify your identity\"\n id=\"7tGCOh\"\n description=\"Dialog title for identity verification\"\n />\n )}\n </Title>\n\n <Description mb=\"5\">\n <Translation\n defaultMessage=\"To continue, we need to confirm your identity. We'll send a temporary verification code to {email}.\"\n id=\"FTUSRM\"\n description=\"Description explaining verification code will be sent\"\n values={{\n email: (\n <Text weight=\"bold\" highContrast>\n {me?.email}\n </Text>\n ),\n }}\n />\n </Description>\n\n {sendVerification.error && (\n <Callout.Root color=\"red\" mt=\"-2\" mb=\"0\">\n <Callout.Text>\n {getMutationErrorMessage(sendVerification.error)}\n </Callout.Text>\n </Callout.Root>\n )}\n\n <Flex justify=\"end\" align=\"center\" gap=\"3\" mt=\"5\">\n <Close>\n <Button\n variant=\"secondary\"\n type=\"button\"\n disabled={sendVerification.isPending}\n >\n <Translation\n defaultMessage=\"Cancel\"\n id=\"hHNj31\"\n description=\"Cancel button text\"\n />\n </Button>\n </Close>\n <Button type=\"submit\" loading={sendVerification.isPending}>\n <Translation\n defaultMessage=\"Send verification code\"\n id=\"XsTeXJ\"\n description=\"Button text to send verification code\"\n />\n </Button>\n </Flex>\n </form>\n );\n}\n\ninterface VerificationIdentityFormProps {\n onSuccess?: () => unknown | Promise<unknown>;\n authenticationChallengeId: string;\n type: \"dialog\" | \"alert\";\n}\n\nfunction VerificationIdentityForm({\n onSuccess,\n authenticationChallengeId,\n type,\n}: VerificationIdentityFormProps) {\n const { data: me } = useMe();\n const { setElevatedAccess } = useElevatedAccessToken();\n const verifyIdentity = useVerify();\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [otpValue, setOtpValue] = useState<string>(\"\");\n\n const Title = type === \"dialog\" ? Dialog.Title : AlertDialog.Title;\n const Description =\n type === \"dialog\" ? Dialog.Description : AlertDialog.Description;\n const Close = type === \"dialog\" ? Dialog.Close : AlertDialog.Cancel;\n const handleSubmit = async (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n\n const formData = new FormData(event.currentTarget);\n const code = formData.get(\"otp-code\")?.toString() ?? \"\";\n\n setIsSubmitting(true);\n\n try {\n // Mutate async so we can wait for the onSuccess callback as well\n const newAuthState = await verifyIdentity.mutateAsync({\n data: {\n code,\n authenticationChallengeId,\n },\n });\n\n setElevatedAccess({\n token: newAuthState.elevatedAccessToken,\n expiresAt: newAuthState.expiresAt,\n });\n\n if (onSuccess) {\n await new Promise((resolve) => setTimeout(resolve, 200));\n await onSuccess();\n }\n } catch (error) {\n console.error(error);\n }\n\n setIsSubmitting(false);\n };\n\n return (\n <Form.Root onSubmit={handleSubmit}>\n <Title>\n <Translation\n defaultMessage=\"Verify your identity\"\n id=\"7tGCOh\"\n description=\"Dialog title for identity verification\"\n />\n </Title>\n\n <Description>\n <Translation\n defaultMessage=\"A verification code was sent to {email}. Please enter it below.\"\n id=\"kvxE0S\"\n description=\"Description explaining where verification code was sent\"\n values={{\n email: (\n <Text weight=\"bold\" highContrast>\n {me?.email}\n </Text>\n ),\n }}\n />\n </Description>\n\n <Flex direction=\"column\" gap=\"2\" mt=\"5\" mx=\"auto\" width=\"fit-content\">\n <Otp.Root\n autoSubmit\n gap=\"2\"\n justify=\"center\"\n columns=\"repeat(6, 48px)\"\n width=\"fit-content\"\n rows=\"48px\"\n name=\"otp-code\"\n readOnly={isSubmitting}\n value={otpValue}\n onValueChange={setOtpValue}\n >\n <Otp.Input required autoFocus autoComplete=\"off\" />\n <Otp.Input required />\n <Otp.Input required />\n <Otp.Input required />\n <Otp.Input required />\n <Otp.Input required />\n </Otp.Root>\n\n {verifyIdentity.error && (\n <Text color=\"red\" size=\"2\" as=\"p\">\n {getMutationErrorMessage(verifyIdentity.error)}\n </Text>\n )}\n </Flex>\n\n <Flex justify=\"end\" align=\"center\" gap=\"3\" mt=\"5\">\n <Close>\n <Button variant=\"secondary\" type=\"button\">\n <Translation\n defaultMessage=\"Cancel\"\n id=\"hHNj31\"\n description=\"Cancel button text\"\n />\n </Button>\n </Close>\n <Button type=\"submit\" loading={isSubmitting}>\n <Translation\n defaultMessage=\"Confirm\"\n id=\"EmYENK\"\n description=\"Confirm button text for verification\"\n />\n </Button>\n </Flex>\n </Form.Root>\n );\n}\n\nfunction getMutationErrorMessage(error: unknown) {\n let message = typeof error === \"string\" ? error : \"\";\n\n if (error instanceof Error) {\n message = error.message;\n } else if (\n typeof error === \"object\" &&\n error !== null &&\n \"message\" in error &&\n typeof error.message === \"string\"\n ) {\n message = error.message;\n }\n\n if (!message || message === \"Bad Request\") {\n message = \"Invalid code, please try again.\";\n }\n\n return message;\n}\n\n// Note: Error messages in getMutationErrorMessage are kept as plain strings\n// since they are displayed dynamically\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/elevated-access.tsx"],"sourcesContent":["import * as Form from \"./form.js\";\nimport { Callout, Flex, Text } from \"@radix-ui/themes\";\nimport { useClientGraphqlMutation } from \"../api/client-graphql/hooks.js\";\nimport { useElevatedAccessToken } from \"../api/api-provider.js\";\nimport { useMe } from \"./api/me.js\";\nimport { expectResultMember } from \"./client-graphql-result.js\";\nimport { PropsWithChildren, useEffect, useRef, useState } from \"react\";\nimport { AlertDialog, Dialog, Button } from \"./elements.js\";\nimport * as Otp from \"./otp-input.js\";\nimport { Translation } from \"./i18n/translation.js\";\n\ninterface ElevatedAccessProps extends PropsWithChildren {\n onVerified?: (elevatedAccessToken: string) => Promise<unknown>;\n type?: \"dialog\" | \"alert\";\n}\n\nexport function ElevatedAccess({\n type = \"dialog\",\n children,\n onVerified,\n}: ElevatedAccessProps) {\n const { elevatedAccess } = useElevatedAccessToken();\n const [authenticationChallengeId, setAuthenticationChallengeId] =\n useState<string>();\n\n const prevAccessToken = useRef(elevatedAccess);\n\n useEffect(() => {\n prevAccessToken.current = elevatedAccess;\n }, [elevatedAccess]);\n\n if (elevatedAccess) {\n return <>{children}</>;\n }\n\n if (!authenticationChallengeId) {\n // FIXME: This should be refactored\n // eslint-disable-next-line react-hooks/refs\n const hasTokenExpired = !!prevAccessToken.current;\n\n return (\n <SendVerificationEmailForm\n type={type}\n hasTokenExpired={hasTokenExpired}\n onSuccess={(challengeId) => {\n setAuthenticationChallengeId(challengeId);\n }}\n />\n );\n }\n\n if (authenticationChallengeId) {\n return (\n <VerificationIdentityForm\n type={type}\n authenticationChallengeId={authenticationChallengeId}\n onSuccess={(elevatedAccessToken) => {\n // Reset the challenge id\n setAuthenticationChallengeId(undefined);\n\n return onVerified?.(elevatedAccessToken);\n }}\n />\n );\n }\n\n return null;\n}\n\ninterface SendVerificationEmailFormProps {\n onSuccess: (challengeId: string) => unknown | Promise<unknown>;\n type: \"dialog\" | \"alert\";\n hasTokenExpired: boolean;\n}\n\nfunction SendVerificationEmailForm({\n onSuccess,\n type,\n hasTokenExpired,\n}: SendVerificationEmailFormProps) {\n const { data: me } = useMe();\n const sendVerification = useClientGraphqlMutation({\n mutationFn: async (sdk) =>\n expectResultMember(\n (await sdk.SendVerificationCode()).sendVerificationCode,\n \"VerificationCodeSent\",\n ),\n onSuccess: (data) => onSuccess(data.authenticationChallengeId),\n });\n\n const Title = type === \"dialog\" ? Dialog.Title : AlertDialog.Title;\n const Description =\n type === \"dialog\" ? Dialog.Description : AlertDialog.Description;\n const Close = type === \"dialog\" ? Dialog.Close : AlertDialog.Cancel;\n\n const handleSubmit = async (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n\n sendVerification.mutate();\n };\n\n return (\n <form onSubmit={handleSubmit}>\n <Title>\n {hasTokenExpired ? (\n <Translation\n defaultMessage=\"Your verification token has expired\"\n id=\"lb/AsC\"\n description=\"Dialog title when verification token has expired\"\n />\n ) : (\n <Translation\n defaultMessage=\"Verify your identity\"\n id=\"7tGCOh\"\n description=\"Dialog title for identity verification\"\n />\n )}\n </Title>\n\n <Description mb=\"5\">\n <Translation\n defaultMessage=\"To continue, we need to confirm your identity. We'll send a temporary verification code to {email}.\"\n id=\"FTUSRM\"\n description=\"Description explaining verification code will be sent\"\n values={{\n email: (\n <Text weight=\"bold\" highContrast>\n {me?.email}\n </Text>\n ),\n }}\n />\n </Description>\n\n {sendVerification.error && (\n <Callout.Root color=\"red\" mt=\"-2\" mb=\"0\">\n <Callout.Text>\n {getMutationErrorMessage(sendVerification.error)}\n </Callout.Text>\n </Callout.Root>\n )}\n\n <Flex justify=\"end\" align=\"center\" gap=\"3\" mt=\"5\">\n <Close>\n <Button\n variant=\"secondary\"\n type=\"button\"\n disabled={sendVerification.isPending}\n >\n <Translation\n defaultMessage=\"Cancel\"\n id=\"hHNj31\"\n description=\"Cancel button text\"\n />\n </Button>\n </Close>\n <Button type=\"submit\" loading={sendVerification.isPending}>\n <Translation\n defaultMessage=\"Send verification code\"\n id=\"XsTeXJ\"\n description=\"Button text to send verification code\"\n />\n </Button>\n </Flex>\n </form>\n );\n}\n\ninterface VerificationIdentityFormProps {\n onSuccess?: (elevatedAccessToken: string) => unknown | Promise<unknown>;\n authenticationChallengeId: string;\n type: \"dialog\" | \"alert\";\n}\n\nfunction VerificationIdentityForm({\n onSuccess,\n authenticationChallengeId,\n type,\n}: VerificationIdentityFormProps) {\n const { data: me } = useMe();\n const { setElevatedAccess } = useElevatedAccessToken();\n const verifyIdentity = useClientGraphqlMutation({\n mutationFn: async (\n sdk,\n input: { code: string; authenticationChallengeId: string },\n ) =>\n expectResultMember(\n (await sdk.VerifyCurrentEmail({ input })).verifyCurrentEmail,\n \"CurrentEmailVerified\",\n ),\n });\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [otpValue, setOtpValue] = useState<string>(\"\");\n\n const Title = type === \"dialog\" ? Dialog.Title : AlertDialog.Title;\n const Description =\n type === \"dialog\" ? Dialog.Description : AlertDialog.Description;\n const Close = type === \"dialog\" ? Dialog.Close : AlertDialog.Cancel;\n const handleSubmit = async (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n\n const formData = new FormData(event.currentTarget);\n const code = formData.get(\"otp-code\")?.toString() ?? \"\";\n\n setIsSubmitting(true);\n\n try {\n // Mutate async so we can wait for the onSuccess callback as well\n const newAuthState = await verifyIdentity.mutateAsync({\n code,\n authenticationChallengeId,\n });\n\n setElevatedAccess({\n token: newAuthState.elevatedAccessToken,\n expiresAt: newAuthState.expiresAt,\n });\n\n if (onSuccess) {\n await new Promise((resolve) => setTimeout(resolve, 200));\n await onSuccess(newAuthState.elevatedAccessToken);\n }\n } catch (error) {\n console.error(error);\n }\n\n setIsSubmitting(false);\n };\n\n return (\n <Form.Root onSubmit={handleSubmit}>\n <Title>\n <Translation\n defaultMessage=\"Verify your identity\"\n id=\"7tGCOh\"\n description=\"Dialog title for identity verification\"\n />\n </Title>\n\n <Description>\n <Translation\n defaultMessage=\"A verification code was sent to {email}. Please enter it below.\"\n id=\"kvxE0S\"\n description=\"Description explaining where verification code was sent\"\n values={{\n email: (\n <Text weight=\"bold\" highContrast>\n {me?.email}\n </Text>\n ),\n }}\n />\n </Description>\n\n <Flex direction=\"column\" gap=\"2\" mt=\"5\" mx=\"auto\" width=\"fit-content\">\n <Otp.Root\n autoSubmit\n gap=\"2\"\n justify=\"center\"\n columns=\"repeat(6, 48px)\"\n width=\"fit-content\"\n rows=\"48px\"\n name=\"otp-code\"\n readOnly={isSubmitting}\n value={otpValue}\n onValueChange={setOtpValue}\n >\n <Otp.Input required autoFocus autoComplete=\"off\" />\n <Otp.Input required />\n <Otp.Input required />\n <Otp.Input required />\n <Otp.Input required />\n <Otp.Input required />\n </Otp.Root>\n\n {verifyIdentity.error && (\n <Text color=\"red\" size=\"2\" as=\"p\">\n {getMutationErrorMessage(verifyIdentity.error)}\n </Text>\n )}\n </Flex>\n\n <Flex justify=\"end\" align=\"center\" gap=\"3\" mt=\"5\">\n <Close>\n <Button variant=\"secondary\" type=\"button\">\n <Translation\n defaultMessage=\"Cancel\"\n id=\"hHNj31\"\n description=\"Cancel button text\"\n />\n </Button>\n </Close>\n <Button type=\"submit\" loading={isSubmitting}>\n <Translation\n defaultMessage=\"Confirm\"\n id=\"EmYENK\"\n description=\"Confirm button text for verification\"\n />\n </Button>\n </Flex>\n </Form.Root>\n );\n}\n\nfunction getMutationErrorMessage(error: unknown) {\n let message = typeof error === \"string\" ? error : \"\";\n\n if (error instanceof Error) {\n message = error.message;\n } else if (\n typeof error === \"object\" &&\n error !== null &&\n \"message\" in error &&\n typeof error.message === \"string\"\n ) {\n message = error.message;\n }\n\n if (!message || message === \"Bad Request\") {\n message = \"Invalid code, please try again.\";\n }\n\n return message;\n}\n\n// Note: Error messages in getMutationErrorMessage are kept as plain strings\n// since they are displayed dynamically\n"],"mappings":"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","names":[]}
|
|
@@ -2,7 +2,7 @@ import * as React from 'react';
|
|
|
2
2
|
import { PropsWithChildren } from 'react';
|
|
3
3
|
|
|
4
4
|
interface ElevatedAccessProps extends PropsWithChildren {
|
|
5
|
-
onVerified?: () => Promise<unknown>;
|
|
5
|
+
onVerified?: (elevatedAccessToken: string) => Promise<unknown>;
|
|
6
6
|
type?: "dialog" | "alert";
|
|
7
7
|
}
|
|
8
8
|
declare function ElevatedAccess({ type, children, onVerified, }: ElevatedAccessProps): React.JSX.Element | null;
|
|
@@ -39,7 +39,6 @@ var import_elements = require("./elements.js");
|
|
|
39
39
|
var import_elements2 = require("./elements.js");
|
|
40
40
|
var import_utils = require("./utils.js");
|
|
41
41
|
var import_user = require("./api/user.js");
|
|
42
|
-
var import_endpoint = require("../api/endpoint.js");
|
|
43
42
|
var import_translation = require("./i18n/translation.js");
|
|
44
43
|
var import_use_translation = require("./i18n/use-translation.js");
|
|
45
44
|
const PLACEHOLDER_ROLE = "_rolePlaceholder";
|
|
@@ -49,10 +48,8 @@ function InviteUserDialog({ children }) {
|
|
|
49
48
|
const dialogId = toId("invite-user", React.useId());
|
|
50
49
|
const formId = toId(dialogId, "form");
|
|
51
50
|
const inviteUser = (0, import_user.useInviteUser)();
|
|
52
|
-
const rolesQuery = (0,
|
|
53
|
-
|
|
54
|
-
});
|
|
55
|
-
const roles = rolesQuery.data;
|
|
51
|
+
const rolesQuery = (0, import_user.useRolesAndConfig)();
|
|
52
|
+
const roles = rolesQuery.data.roles;
|
|
56
53
|
const [selectedRole, setSelectedRole] = React.useState(
|
|
57
54
|
() => getDefaultRole(roles)?.slug || PLACEHOLDER_ROLE
|
|
58
55
|
);
|
|
@@ -64,18 +61,15 @@ function InviteUserDialog({ children }) {
|
|
|
64
61
|
return getDefaultRole(roles)?.slug || PLACEHOLDER_ROLE;
|
|
65
62
|
});
|
|
66
63
|
}, [roles]);
|
|
67
|
-
const onSubmitForm = (
|
|
64
|
+
const onSubmitForm = (input) => {
|
|
68
65
|
if (inviteUser.isPending || rolesQuery.status !== "success") {
|
|
69
66
|
return;
|
|
70
67
|
}
|
|
71
|
-
inviteUser.mutate(
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
onSuccess: () => {
|
|
75
|
-
setOpen(false);
|
|
76
|
-
}
|
|
68
|
+
inviteUser.mutate(input, {
|
|
69
|
+
onSuccess: () => {
|
|
70
|
+
setOpen(false);
|
|
77
71
|
}
|
|
78
|
-
);
|
|
72
|
+
});
|
|
79
73
|
};
|
|
80
74
|
const formErrors = getFormErrors(inviteUser.error);
|
|
81
75
|
useFormFieldFocusOnError(dialogId, inviteUser.error);
|
|
@@ -106,7 +100,7 @@ function InviteUserDialog({ children }) {
|
|
|
106
100
|
event.preventDefault();
|
|
107
101
|
onSubmitForm({
|
|
108
102
|
email: event.currentTarget.email.value,
|
|
109
|
-
|
|
103
|
+
roleSlug: selectedRole
|
|
110
104
|
});
|
|
111
105
|
},
|
|
112
106
|
children: [
|
|
@@ -327,7 +321,7 @@ function useFormFieldFocusOnError(dialogId, queryError) {
|
|
|
327
321
|
}, [dialogId, queryError]);
|
|
328
322
|
}
|
|
329
323
|
function getDefaultRole(roles) {
|
|
330
|
-
return roles.find((role) => role.
|
|
324
|
+
return roles.find((role) => role.isDefault) || roles[0];
|
|
331
325
|
}
|
|
332
326
|
// Annotate the CommonJS export names for ESM import in node:
|
|
333
327
|
0 && (module.exports = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/lib/invite-user-dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport { Callout, Flex, Text, VisuallyHidden } from \"@radix-ui/themes\";\nimport * as React from \"react\";\nimport { Dialog, Button, Select, TextField } from \"./elements.js\";\nimport { Label } from \"./elements.js\";\nimport { isErrorLike } from \"./utils.js\";\nimport { useInviteUser } from \"./api/user.js\";\nimport { InviteMemberInput, MemberRole, useRoles } from \"../api/endpoint.js\";\nimport { Translation } from \"./i18n/translation.js\";\nimport { useTranslation } from \"./i18n/use-translation.js\";\n\n/**\n * Used to stub a fake value for the role select. It will be selected by default\n * before the role query resolves, or if the query results in an error. We do\n * this because we need to provide _any_ value to the select to avoid\n * controlled/uncontrolled bugs.\n */\nconst PLACEHOLDER_ROLE = \"_rolePlaceholder\";\n\ninterface InviteUserDialogProps {\n children?: React.ReactNode;\n}\n\nexport function InviteUserDialog({ children }: InviteUserDialogProps) {\n const translate = useTranslation();\n const [open, setOpen] = React.useState(false);\n const dialogId = toId(\"invite-user\", React.useId());\n const formId = toId(dialogId, \"form\");\n\n const inviteUser = useInviteUser();\n const rolesQuery = useRoles({\n query: { initialData: [] },\n });\n const roles = rolesQuery.data;\n const [selectedRole, setSelectedRole] = React.useState(\n () => getDefaultRole(roles)?.slug || PLACEHOLDER_ROLE,\n );\n React.useEffect(() => {\n // Update the selected role if it's not in the list (eg if the list was\n // previously empty and the query resolved)\n setSelectedRole((selectedRole) => {\n if (roles.find((role) => role.slug === selectedRole)) {\n // if current selected role is in the new list, don't change it\n return selectedRole;\n }\n return getDefaultRole(roles)?.slug || PLACEHOLDER_ROLE;\n });\n }, [roles]);\n\n const onSubmitForm = (data: InviteMemberInput) => {\n if (inviteUser.isPending || rolesQuery.status !== \"success\") {\n return;\n }\n inviteUser.mutate(\n { data },\n {\n onSuccess: () => {\n setOpen(false);\n },\n },\n );\n };\n\n const formErrors = getFormErrors(inviteUser.error);\n useFormFieldFocusOnError(dialogId, inviteUser.error);\n\n return (\n <Dialog.Root open={open} onOpenChange={setOpen}>\n {children && <Dialog.Trigger>{children}</Dialog.Trigger>}\n <Dialog.Content maxWidth=\"480px\" key={String(open)}>\n <Dialog.Title>\n <Translation\n defaultMessage=\"Invite user\"\n id=\"6+aYFi\"\n description=\"Dialog title for inviting a user\"\n />\n </Dialog.Title>\n <Dialog.Description>\n <Translation\n defaultMessage=\"An invitation will be sent to this email address with a link to complete their account.\"\n id=\"IicELr\"\n description=\"Dialog description explaining invitation process\"\n />\n </Dialog.Description>\n <Flex direction=\"column\" gap=\"4\" mt=\"5\" asChild>\n <form\n id={formId}\n onSubmit={async (event) => {\n event.preventDefault();\n onSubmitForm({\n email: event.currentTarget.email.value,\n roles: [selectedRole],\n });\n }}\n >\n <FormField\n rootId={dialogId}\n name=\"email\"\n label={translate({\n defaultMessage: \"Email address\",\n id: \"ACNqhk\",\n description: \"Label for email address field\",\n })}\n error={formErrors.fields.email}\n required\n control={(props) => (\n <TextField\n {...props}\n data-1p-ignore=\"true\"\n data-lpignore=\"true\"\n type=\"email\"\n autoComplete=\"off\"\n placeholder={translate({\n defaultMessage: \"Enter an email address\",\n id: \"0ulARV\",\n description: \"Placeholder for email address field\",\n })}\n />\n )}\n />\n\n <FormField\n rootId={dialogId}\n name=\"role\"\n label={translate({\n defaultMessage: \"Role\",\n id: \"1Htc3a\",\n description: \"Label for role selection field\",\n })}\n error={formErrors.fields.role}\n disabled={rolesQuery.isPending || roles.length <= 1}\n info={\n roles.length === 1 ? (\n <Translation\n defaultMessage=\"New users will be invited with the {roleName} role, as it is the only one available.\"\n id=\"/CNKkm\"\n description=\"Info message when only one role is available\"\n values={{\n roleName: <Text weight=\"bold\">{roles[0].name}</Text>,\n }}\n />\n ) : undefined\n }\n control={({\n id,\n \"aria-invalid\": ariaInvalid,\n \"aria-describedby\": ariaDescribedBy,\n ...props\n }) => (\n <Select.Root\n {...props}\n value={selectedRole}\n onValueChange={setSelectedRole}\n >\n <Select.Trigger\n id={id}\n aria-invalid={ariaInvalid}\n aria-describedby={ariaDescribedBy}\n />\n <Select.Content>\n <Select.Item value={PLACEHOLDER_ROLE} disabled>\n <Translation\n defaultMessage=\"Select a role\"\n id=\"0VMIWs\"\n description=\"Placeholder option for role selection\"\n />\n </Select.Item>\n {roles.map((role) => (\n <Select.Item key={role.slug} value={role.slug}>\n {role.name}\n </Select.Item>\n ))}\n </Select.Content>\n </Select.Root>\n )}\n />\n </form>\n </Flex>\n\n {formErrors.form ? (\n <Callout.Root color=\"red\" mt=\"4\" mb=\"-2\">\n <Callout.Text>{formErrors.form}</Callout.Text>\n </Callout.Root>\n ) : null}\n\n <Flex mt=\"5\" gap=\"3\" justify=\"end\">\n <Dialog.Close>\n <Button variant=\"secondary\" disabled={inviteUser.isPending}>\n <Translation\n defaultMessage=\"Cancel\"\n id=\"hHNj31\"\n description=\"Cancel button text\"\n />\n </Button>\n </Dialog.Close>\n <Button\n type=\"submit\"\n form={formId}\n loading={inviteUser.isPending}\n disabled={rolesQuery.isPending || undefined}\n >\n <Translation\n defaultMessage=\"Invite\"\n id=\"JIQROV\"\n description=\"Invite button text to send invitation\"\n />\n </Button>\n </Flex>\n {/* mirror errors in a live region */}\n <VisuallyHidden asChild>\n <section aria-live=\"polite\">{formErrors.form}</section>\n </VisuallyHidden>\n </Dialog.Content>\n </Dialog.Root>\n );\n}\n\ninterface FormControlRenderProps {\n id: string;\n name: string;\n \"aria-describedby\": string | undefined;\n \"aria-invalid\"?: boolean;\n required: boolean | undefined;\n disabled: boolean | undefined;\n}\n\nfunction FormField({\n rootId,\n name,\n label,\n error,\n info,\n control,\n required,\n disabled,\n}: {\n rootId: string;\n name: string;\n label: string;\n error?: React.ReactNode;\n info?: React.ReactNode;\n control: (props: FormControlRenderProps) => React.ReactNode;\n required?: boolean;\n disabled?: boolean;\n}) {\n const fieldId = toId(rootId, name);\n const errorId = toId(rootId, name, \"error\");\n const infoId = toId(rootId, name, \"info\");\n return (\n <Flex direction=\"column\" gap=\"1\">\n <Label htmlFor={fieldId}>{label}</Label>\n {control({\n id: fieldId,\n name,\n \"aria-describedby\": (() => {\n const tags: string[] = [];\n if (error) {\n tags.push(errorId);\n }\n if (info) {\n tags.push(infoId);\n }\n if (tags.length === 0) {\n return undefined;\n }\n return tags.join(\" \");\n })(),\n \"aria-invalid\": !!error || undefined,\n required: required || undefined,\n disabled: disabled || undefined,\n })}\n\n {error ? (\n <Text color=\"red\" size=\"2\" id={errorId}>\n {error}\n </Text>\n ) : null}\n {info ? (\n <Text color=\"gray\" size=\"2\" id={infoId} mt=\"1\">\n {info}\n </Text>\n ) : null}\n </Flex>\n );\n}\n\nfunction toId(...parts: string[]) {\n return parts.join(\"-\");\n}\n\nfunction getFormErrors(queryError: unknown) {\n const formErrors = {\n form: null as string | null,\n fields: {\n email: null as string | null,\n role: null as string | null,\n },\n };\n\n if (queryError) {\n if (!isErrorLike(queryError)) {\n return {\n ...formErrors,\n form: \"An unexpected error occurred. Please try again.\",\n };\n }\n\n switch (queryError.message.toLowerCase()) {\n case \"user already exists\":\n case \"user already invited\":\n case \"invalid email\":\n formErrors.fields.email = queryError.message;\n break;\n case \"invalid role\":\n formErrors.fields.role = queryError.message;\n break;\n case \"this organization is not allowed to send invites.\":\n formErrors.form = queryError.message;\n break;\n default:\n // TODO handle more cases for various server errors\n formErrors.form =\n \"There was an error inviting this user. Please refresh the page and try again.\";\n break;\n }\n }\n\n return formErrors;\n}\n\n// Note: Error messages in getFormErrors are kept as plain strings\n// since they are displayed dynamically\n\nfunction useFormFieldFocusOnError(dialogId: string, queryError: unknown) {\n React.useEffect(() => {\n const fieldErrors = getFormErrors(queryError).fields;\n for (const [name, error] of Object.entries(fieldErrors)) {\n if (error) {\n const fieldElement = document.getElementById(toId(dialogId, name)) as\n | HTMLInputElement\n | HTMLButtonElement\n | null;\n if (fieldElement) {\n fieldElement?.focus();\n if (\"select\" in fieldElement) {\n fieldElement.select();\n }\n }\n break;\n }\n }\n }, [dialogId, queryError]);\n}\n\nfunction getDefaultRole(roles: MemberRole[]) {\n return roles.find((role) => role.default) || roles[0];\n}\n"],"mappings":"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","names":["import_elements","selectedRole"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/invite-user-dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport { Callout, Flex, Text, VisuallyHidden } from \"@radix-ui/themes\";\nimport * as React from \"react\";\nimport { Dialog, Button, Select, TextField } from \"./elements.js\";\nimport { Label } from \"./elements.js\";\nimport { isErrorLike } from \"./utils.js\";\nimport { useInviteUser, useRolesAndConfig, type Role } from \"./api/user.js\";\nimport type { InviteUserInput } from \"../api/client-graphql/generated.js\";\nimport { Translation } from \"./i18n/translation.js\";\nimport { useTranslation } from \"./i18n/use-translation.js\";\n\n/**\n * Used to stub a fake value for the role select. It will be selected by default\n * before the role query resolves, or if the query results in an error. We do\n * this because we need to provide _any_ value to the select to avoid\n * controlled/uncontrolled bugs.\n */\nconst PLACEHOLDER_ROLE = \"_rolePlaceholder\";\n\ninterface InviteUserDialogProps {\n children?: React.ReactNode;\n}\n\nexport function InviteUserDialog({ children }: InviteUserDialogProps) {\n const translate = useTranslation();\n const [open, setOpen] = React.useState(false);\n const dialogId = toId(\"invite-user\", React.useId());\n const formId = toId(dialogId, \"form\");\n\n const inviteUser = useInviteUser();\n const rolesQuery = useRolesAndConfig();\n const roles = rolesQuery.data.roles;\n const [selectedRole, setSelectedRole] = React.useState(\n () => getDefaultRole(roles)?.slug || PLACEHOLDER_ROLE,\n );\n React.useEffect(() => {\n // Update the selected role if it's not in the list (eg if the list was\n // previously empty and the query resolved)\n setSelectedRole((selectedRole) => {\n if (roles.find((role) => role.slug === selectedRole)) {\n // if current selected role is in the new list, don't change it\n return selectedRole;\n }\n return getDefaultRole(roles)?.slug || PLACEHOLDER_ROLE;\n });\n }, [roles]);\n\n const onSubmitForm = (input: InviteUserInput) => {\n if (inviteUser.isPending || rolesQuery.status !== \"success\") {\n return;\n }\n inviteUser.mutate(input, {\n onSuccess: () => {\n setOpen(false);\n },\n });\n };\n\n const formErrors = getFormErrors(inviteUser.error);\n useFormFieldFocusOnError(dialogId, inviteUser.error);\n\n return (\n <Dialog.Root open={open} onOpenChange={setOpen}>\n {children && <Dialog.Trigger>{children}</Dialog.Trigger>}\n <Dialog.Content maxWidth=\"480px\" key={String(open)}>\n <Dialog.Title>\n <Translation\n defaultMessage=\"Invite user\"\n id=\"6+aYFi\"\n description=\"Dialog title for inviting a user\"\n />\n </Dialog.Title>\n <Dialog.Description>\n <Translation\n defaultMessage=\"An invitation will be sent to this email address with a link to complete their account.\"\n id=\"IicELr\"\n description=\"Dialog description explaining invitation process\"\n />\n </Dialog.Description>\n <Flex direction=\"column\" gap=\"4\" mt=\"5\" asChild>\n <form\n id={formId}\n onSubmit={async (event) => {\n event.preventDefault();\n onSubmitForm({\n email: event.currentTarget.email.value,\n roleSlug: selectedRole,\n });\n }}\n >\n <FormField\n rootId={dialogId}\n name=\"email\"\n label={translate({\n defaultMessage: \"Email address\",\n id: \"ACNqhk\",\n description: \"Label for email address field\",\n })}\n error={formErrors.fields.email}\n required\n control={(props) => (\n <TextField\n {...props}\n data-1p-ignore=\"true\"\n data-lpignore=\"true\"\n type=\"email\"\n autoComplete=\"off\"\n placeholder={translate({\n defaultMessage: \"Enter an email address\",\n id: \"0ulARV\",\n description: \"Placeholder for email address field\",\n })}\n />\n )}\n />\n\n <FormField\n rootId={dialogId}\n name=\"role\"\n label={translate({\n defaultMessage: \"Role\",\n id: \"1Htc3a\",\n description: \"Label for role selection field\",\n })}\n error={formErrors.fields.role}\n disabled={rolesQuery.isPending || roles.length <= 1}\n info={\n roles.length === 1 ? (\n <Translation\n defaultMessage=\"New users will be invited with the {roleName} role, as it is the only one available.\"\n id=\"/CNKkm\"\n description=\"Info message when only one role is available\"\n values={{\n roleName: <Text weight=\"bold\">{roles[0].name}</Text>,\n }}\n />\n ) : undefined\n }\n control={({\n id,\n \"aria-invalid\": ariaInvalid,\n \"aria-describedby\": ariaDescribedBy,\n ...props\n }) => (\n <Select.Root\n {...props}\n value={selectedRole}\n onValueChange={setSelectedRole}\n >\n <Select.Trigger\n id={id}\n aria-invalid={ariaInvalid}\n aria-describedby={ariaDescribedBy}\n />\n <Select.Content>\n <Select.Item value={PLACEHOLDER_ROLE} disabled>\n <Translation\n defaultMessage=\"Select a role\"\n id=\"0VMIWs\"\n description=\"Placeholder option for role selection\"\n />\n </Select.Item>\n {roles.map((role) => (\n <Select.Item key={role.slug} value={role.slug}>\n {role.name}\n </Select.Item>\n ))}\n </Select.Content>\n </Select.Root>\n )}\n />\n </form>\n </Flex>\n\n {formErrors.form ? (\n <Callout.Root color=\"red\" mt=\"4\" mb=\"-2\">\n <Callout.Text>{formErrors.form}</Callout.Text>\n </Callout.Root>\n ) : null}\n\n <Flex mt=\"5\" gap=\"3\" justify=\"end\">\n <Dialog.Close>\n <Button variant=\"secondary\" disabled={inviteUser.isPending}>\n <Translation\n defaultMessage=\"Cancel\"\n id=\"hHNj31\"\n description=\"Cancel button text\"\n />\n </Button>\n </Dialog.Close>\n <Button\n type=\"submit\"\n form={formId}\n loading={inviteUser.isPending}\n disabled={rolesQuery.isPending || undefined}\n >\n <Translation\n defaultMessage=\"Invite\"\n id=\"JIQROV\"\n description=\"Invite button text to send invitation\"\n />\n </Button>\n </Flex>\n {/* mirror errors in a live region */}\n <VisuallyHidden asChild>\n <section aria-live=\"polite\">{formErrors.form}</section>\n </VisuallyHidden>\n </Dialog.Content>\n </Dialog.Root>\n );\n}\n\ninterface FormControlRenderProps {\n id: string;\n name: string;\n \"aria-describedby\": string | undefined;\n \"aria-invalid\"?: boolean;\n required: boolean | undefined;\n disabled: boolean | undefined;\n}\n\nfunction FormField({\n rootId,\n name,\n label,\n error,\n info,\n control,\n required,\n disabled,\n}: {\n rootId: string;\n name: string;\n label: string;\n error?: React.ReactNode;\n info?: React.ReactNode;\n control: (props: FormControlRenderProps) => React.ReactNode;\n required?: boolean;\n disabled?: boolean;\n}) {\n const fieldId = toId(rootId, name);\n const errorId = toId(rootId, name, \"error\");\n const infoId = toId(rootId, name, \"info\");\n return (\n <Flex direction=\"column\" gap=\"1\">\n <Label htmlFor={fieldId}>{label}</Label>\n {control({\n id: fieldId,\n name,\n \"aria-describedby\": (() => {\n const tags: string[] = [];\n if (error) {\n tags.push(errorId);\n }\n if (info) {\n tags.push(infoId);\n }\n if (tags.length === 0) {\n return undefined;\n }\n return tags.join(\" \");\n })(),\n \"aria-invalid\": !!error || undefined,\n required: required || undefined,\n disabled: disabled || undefined,\n })}\n\n {error ? (\n <Text color=\"red\" size=\"2\" id={errorId}>\n {error}\n </Text>\n ) : null}\n {info ? (\n <Text color=\"gray\" size=\"2\" id={infoId} mt=\"1\">\n {info}\n </Text>\n ) : null}\n </Flex>\n );\n}\n\nfunction toId(...parts: string[]) {\n return parts.join(\"-\");\n}\n\nfunction getFormErrors(queryError: unknown) {\n const formErrors = {\n form: null as string | null,\n fields: {\n email: null as string | null,\n role: null as string | null,\n },\n };\n\n if (queryError) {\n if (!isErrorLike(queryError)) {\n return {\n ...formErrors,\n form: \"An unexpected error occurred. Please try again.\",\n };\n }\n\n switch (queryError.message.toLowerCase()) {\n case \"user already exists\":\n case \"user already invited\":\n case \"invalid email\":\n formErrors.fields.email = queryError.message;\n break;\n case \"invalid role\":\n formErrors.fields.role = queryError.message;\n break;\n case \"this organization is not allowed to send invites.\":\n formErrors.form = queryError.message;\n break;\n default:\n // TODO handle more cases for various server errors\n formErrors.form =\n \"There was an error inviting this user. Please refresh the page and try again.\";\n break;\n }\n }\n\n return formErrors;\n}\n\n// Note: Error messages in getFormErrors are kept as plain strings\n// since they are displayed dynamically\n\nfunction useFormFieldFocusOnError(dialogId: string, queryError: unknown) {\n React.useEffect(() => {\n const fieldErrors = getFormErrors(queryError).fields;\n for (const [name, error] of Object.entries(fieldErrors)) {\n if (error) {\n const fieldElement = document.getElementById(toId(dialogId, name)) as\n | HTMLInputElement\n | HTMLButtonElement\n | null;\n if (fieldElement) {\n fieldElement?.focus();\n if (\"select\" in fieldElement) {\n fieldElement.select();\n }\n }\n break;\n }\n }\n }, [dialogId, queryError]);\n}\n\nfunction getDefaultRole(roles: Role[]) {\n return roles.find((role) => role.isDefault) || roles[0];\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAgEmB;AA9DnB,oBAAoD;AACpD,YAAuB;AACvB,sBAAkD;AAClD,IAAAA,mBAAsB;AACtB,mBAA4B;AAC5B,kBAA4D;AAE5D,yBAA4B;AAC5B,6BAA+B;AAQ/B,MAAM,mBAAmB;AAMlB,SAAS,iBAAiB,EAAE,SAAS,GAA0B;AACpE,QAAM,gBAAY,uCAAe;AACjC,QAAM,CAAC,MAAM,OAAO,IAAI,MAAM,SAAS,KAAK;AAC5C,QAAM,WAAW,KAAK,eAAe,MAAM,MAAM,CAAC;AAClD,QAAM,SAAS,KAAK,UAAU,MAAM;AAEpC,QAAM,iBAAa,2BAAc;AACjC,QAAM,iBAAa,+BAAkB;AACrC,QAAM,QAAQ,WAAW,KAAK;AAC9B,QAAM,CAAC,cAAc,eAAe,IAAI,MAAM;AAAA,IAC5C,MAAM,eAAe,KAAK,GAAG,QAAQ;AAAA,EACvC;AACA,QAAM,UAAU,MAAM;AAGpB,oBAAgB,CAACC,kBAAiB;AAChC,UAAI,MAAM,KAAK,CAAC,SAAS,KAAK,SAASA,aAAY,GAAG;AAEpD,eAAOA;AAAA,MACT;AACA,aAAO,eAAe,KAAK,GAAG,QAAQ;AAAA,IACxC,CAAC;AAAA,EACH,GAAG,CAAC,KAAK,CAAC;AAEV,QAAM,eAAe,CAAC,UAA2B;AAC/C,QAAI,WAAW,aAAa,WAAW,WAAW,WAAW;AAC3D;AAAA,IACF;AACA,eAAW,OAAO,OAAO;AAAA,MACvB,WAAW,MAAM;AACf,gBAAQ,KAAK;AAAA,MACf;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,aAAa,cAAc,WAAW,KAAK;AACjD,2BAAyB,UAAU,WAAW,KAAK;AAEnD,SACE,6CAAC,uBAAO,MAAP,EAAY,MAAY,cAAc,SACpC;AAAA,gBAAY,4CAAC,uBAAO,SAAP,EAAgB,UAAS;AAAA,IACvC,6CAAC,uBAAO,SAAP,EAAe,UAAS,SACvB;AAAA,kDAAC,uBAAO,OAAP,EACC;AAAA,QAAC;AAAA;AAAA,UACC,gBAAe;AAAA,UACf,IAAG;AAAA,UACH,aAAY;AAAA;AAAA,MACd,GACF;AAAA,MACA,4CAAC,uBAAO,aAAP,EACC;AAAA,QAAC;AAAA;AAAA,UACC,gBAAe;AAAA,UACf,IAAG;AAAA,UACH,aAAY;AAAA;AAAA,MACd,GACF;AAAA,MACA,4CAAC,sBAAK,WAAU,UAAS,KAAI,KAAI,IAAG,KAAI,SAAO,MAC7C;AAAA,QAAC;AAAA;AAAA,UACC,IAAI;AAAA,UACJ,UAAU,OAAO,UAAU;AACzB,kBAAM,eAAe;AACrB,yBAAa;AAAA,cACX,OAAO,MAAM,cAAc,MAAM;AAAA,cACjC,UAAU;AAAA,YACZ,CAAC;AAAA,UACH;AAAA,UAEA;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,QAAQ;AAAA,gBACR,MAAK;AAAA,gBACL,OAAO,UAAU;AAAA,kBACf,gBAAgB;AAAA,kBAChB,IAAI;AAAA,kBACJ,aAAa;AAAA,gBACf,CAAC;AAAA,gBACD,OAAO,WAAW,OAAO;AAAA,gBACzB,UAAQ;AAAA,gBACR,SAAS,CAAC,UACR;AAAA,kBAAC;AAAA;AAAA,oBACE,GAAG;AAAA,oBACJ,kBAAe;AAAA,oBACf,iBAAc;AAAA,oBACd,MAAK;AAAA,oBACL,cAAa;AAAA,oBACb,aAAa,UAAU;AAAA,sBACrB,gBAAgB;AAAA,sBAChB,IAAI;AAAA,sBACJ,aAAa;AAAA,oBACf,CAAC;AAAA;AAAA,gBACH;AAAA;AAAA,YAEJ;AAAA,YAEA;AAAA,cAAC;AAAA;AAAA,gBACC,QAAQ;AAAA,gBACR,MAAK;AAAA,gBACL,OAAO,UAAU;AAAA,kBACf,gBAAgB;AAAA,kBAChB,IAAI;AAAA,kBACJ,aAAa;AAAA,gBACf,CAAC;AAAA,gBACD,OAAO,WAAW,OAAO;AAAA,gBACzB,UAAU,WAAW,aAAa,MAAM,UAAU;AAAA,gBAClD,MACE,MAAM,WAAW,IACf;AAAA,kBAAC;AAAA;AAAA,oBACC,gBAAe;AAAA,oBACf,IAAG;AAAA,oBACH,aAAY;AAAA,oBACZ,QAAQ;AAAA,sBACN,UAAU,4CAAC,sBAAK,QAAO,QAAQ,gBAAM,CAAC,EAAE,MAAK;AAAA,oBAC/C;AAAA;AAAA,gBACF,IACE;AAAA,gBAEN,SAAS,CAAC;AAAA,kBACR;AAAA,kBACA,gBAAgB;AAAA,kBAChB,oBAAoB;AAAA,kBACpB,GAAG;AAAA,gBACL,MACE;AAAA,kBAAC,uBAAO;AAAA,kBAAP;AAAA,oBACE,GAAG;AAAA,oBACJ,OAAO;AAAA,oBACP,eAAe;AAAA,oBAEf;AAAA;AAAA,wBAAC,uBAAO;AAAA,wBAAP;AAAA,0BACC;AAAA,0BACA,gBAAc;AAAA,0BACd,oBAAkB;AAAA;AAAA,sBACpB;AAAA,sBACA,6CAAC,uBAAO,SAAP,EACC;AAAA,oEAAC,uBAAO,MAAP,EAAY,OAAO,kBAAkB,UAAQ,MAC5C;AAAA,0BAAC;AAAA;AAAA,4BACC,gBAAe;AAAA,4BACf,IAAG;AAAA,4BACH,aAAY;AAAA;AAAA,wBACd,GACF;AAAA,wBACC,MAAM,IAAI,CAAC,SACV,4CAAC,uBAAO,MAAP,EAA4B,OAAO,KAAK,MACtC,eAAK,QADU,KAAK,IAEvB,CACD;AAAA,yBACH;AAAA;AAAA;AAAA,gBACF;AAAA;AAAA,YAEJ;AAAA;AAAA;AAAA,MACF,GACF;AAAA,MAEC,WAAW,OACV,4CAAC,sBAAQ,MAAR,EAAa,OAAM,OAAM,IAAG,KAAI,IAAG,MAClC,sDAAC,sBAAQ,MAAR,EAAc,qBAAW,MAAK,GACjC,IACE;AAAA,MAEJ,6CAAC,sBAAK,IAAG,KAAI,KAAI,KAAI,SAAQ,OAC3B;AAAA,oDAAC,uBAAO,OAAP,EACC,sDAAC,0BAAO,SAAQ,aAAY,UAAU,WAAW,WAC/C;AAAA,UAAC;AAAA;AAAA,YACC,gBAAe;AAAA,YACf,IAAG;AAAA,YACH,aAAY;AAAA;AAAA,QACd,GACF,GACF;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,MAAM;AAAA,YACN,SAAS,WAAW;AAAA,YACpB,UAAU,WAAW,aAAa;AAAA,YAElC;AAAA,cAAC;AAAA;AAAA,gBACC,gBAAe;AAAA,gBACf,IAAG;AAAA,gBACH,aAAY;AAAA;AAAA,YACd;AAAA;AAAA,QACF;AAAA,SACF;AAAA,MAEA,4CAAC,gCAAe,SAAO,MACrB,sDAAC,aAAQ,aAAU,UAAU,qBAAW,MAAK,GAC/C;AAAA,SA9IoC,OAAO,IAAI,CA+IjD;AAAA,KACF;AAEJ;AAWA,SAAS,UAAU;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GASG;AACD,QAAM,UAAU,KAAK,QAAQ,IAAI;AACjC,QAAM,UAAU,KAAK,QAAQ,MAAM,OAAO;AAC1C,QAAM,SAAS,KAAK,QAAQ,MAAM,MAAM;AACxC,SACE,6CAAC,sBAAK,WAAU,UAAS,KAAI,KAC3B;AAAA,gDAAC,0BAAM,SAAS,SAAU,iBAAM;AAAA,IAC/B,QAAQ;AAAA,MACP,IAAI;AAAA,MACJ;AAAA,MACA,qBAAqB,MAAM;AACzB,cAAM,OAAiB,CAAC;AACxB,YAAI,OAAO;AACT,eAAK,KAAK,OAAO;AAAA,QACnB;AACA,YAAI,MAAM;AACR,eAAK,KAAK,MAAM;AAAA,QAClB;AACA,YAAI,KAAK,WAAW,GAAG;AACrB,iBAAO;AAAA,QACT;AACA,eAAO,KAAK,KAAK,GAAG;AAAA,MACtB,GAAG;AAAA,MACH,gBAAgB,CAAC,CAAC,SAAS;AAAA,MAC3B,UAAU,YAAY;AAAA,MACtB,UAAU,YAAY;AAAA,IACxB,CAAC;AAAA,IAEA,QACC,4CAAC,sBAAK,OAAM,OAAM,MAAK,KAAI,IAAI,SAC5B,iBACH,IACE;AAAA,IACH,OACC,4CAAC,sBAAK,OAAM,QAAO,MAAK,KAAI,IAAI,QAAQ,IAAG,KACxC,gBACH,IACE;AAAA,KACN;AAEJ;AAEA,SAAS,QAAQ,OAAiB;AAChC,SAAO,MAAM,KAAK,GAAG;AACvB;AAEA,SAAS,cAAc,YAAqB;AAC1C,QAAM,aAAa;AAAA,IACjB,MAAM;AAAA,IACN,QAAQ;AAAA,MACN,OAAO;AAAA,MACP,MAAM;AAAA,IACR;AAAA,EACF;AAEA,MAAI,YAAY;AACd,QAAI,KAAC,0BAAY,UAAU,GAAG;AAC5B,aAAO;AAAA,QACL,GAAG;AAAA,QACH,MAAM;AAAA,MACR;AAAA,IACF;AAEA,YAAQ,WAAW,QAAQ,YAAY,GAAG;AAAA,MACxC,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,mBAAW,OAAO,QAAQ,WAAW;AACrC;AAAA,MACF,KAAK;AACH,mBAAW,OAAO,OAAO,WAAW;AACpC;AAAA,MACF,KAAK;AACH,mBAAW,OAAO,WAAW;AAC7B;AAAA,MACF;AAEE,mBAAW,OACT;AACF;AAAA,IACJ;AAAA,EACF;AAEA,SAAO;AACT;AAKA,SAAS,yBAAyB,UAAkB,YAAqB;AACvE,QAAM,UAAU,MAAM;AACpB,UAAM,cAAc,cAAc,UAAU,EAAE;AAC9C,eAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,WAAW,GAAG;AACvD,UAAI,OAAO;AACT,cAAM,eAAe,SAAS,eAAe,KAAK,UAAU,IAAI,CAAC;AAIjE,YAAI,cAAc;AAChB,wBAAc,MAAM;AACpB,cAAI,YAAY,cAAc;AAC5B,yBAAa,OAAO;AAAA,UACtB;AAAA,QACF;AACA;AAAA,MACF;AAAA,IACF;AAAA,EACF,GAAG,CAAC,UAAU,UAAU,CAAC;AAC3B;AAEA,SAAS,eAAe,OAAe;AACrC,SAAO,MAAM,KAAK,CAAC,SAAS,KAAK,SAAS,KAAK,MAAM,CAAC;AACxD;","names":["import_elements","selectedRole"]}
|
|
@@ -36,26 +36,34 @@ var import_jsx_runtime = require("react/jsx-runtime");
|
|
|
36
36
|
var React = __toESM(require("react"), 1);
|
|
37
37
|
var import_themes = require("@radix-ui/themes");
|
|
38
38
|
var import_elements = require("./elements.js");
|
|
39
|
-
var
|
|
39
|
+
var import_hooks = require("../api/client-graphql/hooks.js");
|
|
40
|
+
var import_client_graphql_result = require("./client-graphql-result.js");
|
|
40
41
|
var import_react_query = require("@tanstack/react-query");
|
|
41
42
|
var import_save_button = require("./save-button.js");
|
|
42
43
|
var import_translation = require("./i18n/translation.js");
|
|
43
44
|
function LogoutAllSessionsDialog({
|
|
44
45
|
open,
|
|
45
46
|
onOpenChange,
|
|
46
|
-
children,
|
|
47
47
|
currentSessionId,
|
|
48
|
+
children,
|
|
48
49
|
...props
|
|
49
50
|
}) {
|
|
50
51
|
const client = (0, import_react_query.useQueryClient)();
|
|
51
|
-
const revokeAllSessions = (0,
|
|
52
|
+
const revokeAllSessions = (0, import_hooks.useClientGraphqlMutation)({
|
|
53
|
+
mutationFn: async (sdk) => (0, import_client_graphql_result.expectResultMember)(
|
|
54
|
+
(await sdk.RevokeAllSessions({
|
|
55
|
+
input: { currentSessionId: currentSessionId || null }
|
|
56
|
+
})).revokeAllSessions,
|
|
57
|
+
"AllSessionsRevoked"
|
|
58
|
+
)
|
|
59
|
+
});
|
|
52
60
|
const onSubmitForm = () => {
|
|
53
|
-
revokeAllSessions.mutate(
|
|
61
|
+
revokeAllSessions.mutate();
|
|
54
62
|
};
|
|
55
63
|
const handleDone = React.useCallback(() => {
|
|
56
64
|
onOpenChange?.(false);
|
|
57
65
|
client.invalidateQueries({
|
|
58
|
-
queryKey: (0,
|
|
66
|
+
queryKey: (0, import_hooks.clientGraphqlQueryKey)("Sessions")
|
|
59
67
|
});
|
|
60
68
|
}, [client, onOpenChange]);
|
|
61
69
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.AlertDialog.Root, { open, onOpenChange, ...props, children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_elements.AlertDialog.Content, { maxWidth: "480px", children: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/lib/logout-all-sessions-dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { Flex } from \"@radix-ui/themes\";\nimport { type ReactNode } from \"react\";\nimport { AlertDialog, Button } from \"./elements.js\";\nimport {
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/logout-all-sessions-dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { Flex } from \"@radix-ui/themes\";\nimport { type ReactNode } from \"react\";\nimport { AlertDialog, Button } from \"./elements.js\";\nimport {\n clientGraphqlQueryKey,\n useClientGraphqlMutation,\n} from \"../api/client-graphql/hooks.js\";\nimport { expectResultMember } from \"./client-graphql-result.js\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport { SaveButton } from \"./save-button.js\";\nimport { Translation } from \"./i18n/translation.js\";\n\ninterface LogoutAllSessionsDialogProps extends AlertDialog.RootProps {\n currentSessionId?: string;\n children?: ReactNode;\n}\n\nexport function LogoutAllSessionsDialog({\n open,\n onOpenChange,\n currentSessionId,\n children,\n ...props\n}: LogoutAllSessionsDialogProps) {\n const client = useQueryClient();\n\n const revokeAllSessions = useClientGraphqlMutation({\n mutationFn: async (sdk) =>\n expectResultMember(\n (\n await sdk.RevokeAllSessions({\n input: { currentSessionId: currentSessionId || null },\n })\n ).revokeAllSessions,\n \"AllSessionsRevoked\",\n ),\n });\n\n const onSubmitForm = () => {\n revokeAllSessions.mutate();\n };\n\n const handleDone = React.useCallback(() => {\n onOpenChange?.(false);\n\n client.invalidateQueries({\n queryKey: clientGraphqlQueryKey(\"Sessions\"),\n });\n }, [client, onOpenChange]);\n\n return (\n <AlertDialog.Root open={open} onOpenChange={onOpenChange} {...props}>\n <AlertDialog.Content maxWidth=\"480px\">\n <AlertDialog.Title>\n <Translation\n defaultMessage=\"Sign out of all other devices?\"\n id=\"x//BWg\"\n description=\"Dialog title asking to confirm signing out of all other devices\"\n />\n </AlertDialog.Title>\n <AlertDialog.Description>\n <Translation\n defaultMessage=\"You will be logged out of all other active sessions on other devices, except this one.\"\n id=\"GftsX9\"\n description=\"Description explaining all other sessions will be logged out\"\n />\n </AlertDialog.Description>\n\n <Flex gap=\"3\" justify=\"end\" mt=\"5\" asChild>\n <form\n onSubmit={(event) => {\n event.preventDefault();\n onSubmitForm();\n }}\n >\n <AlertDialog.Cancel>\n <Button\n variant=\"secondary\"\n disabled={\n revokeAllSessions.isPending || revokeAllSessions.isSuccess\n }\n >\n <Translation\n defaultMessage=\"Cancel\"\n id=\"Pnmy4H\"\n description=\"Button to cancel signing out of all devices\"\n />\n </Button>\n </AlertDialog.Cancel>\n\n <SaveButton\n asChild\n loading={revokeAllSessions.isPending}\n done={revokeAllSessions.isSuccess}\n onDone={handleDone}\n >\n <Button variant=\"destructive\" type=\"submit\">\n <Translation\n defaultMessage=\"Sign out\"\n id=\"1Fb48o\"\n description=\"Button to confirm signing out of all other devices\"\n />\n </Button>\n </SaveButton>\n </form>\n </Flex>\n </AlertDialog.Content>\n </AlertDialog.Root>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAyDU;AAvDV,YAAuB;AACvB,oBAAqB;AAErB,sBAAoC;AACpC,mBAGO;AACP,mCAAmC;AACnC,yBAA+B;AAC/B,yBAA2B;AAC3B,yBAA4B;AAOrB,SAAS,wBAAwB;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAiC;AAC/B,QAAM,aAAS,mCAAe;AAE9B,QAAM,wBAAoB,uCAAyB;AAAA,IACjD,YAAY,OAAO,YACjB;AAAA,OAEI,MAAM,IAAI,kBAAkB;AAAA,QAC1B,OAAO,EAAE,kBAAkB,oBAAoB,KAAK;AAAA,MACtD,CAAC,GACD;AAAA,MACF;AAAA,IACF;AAAA,EACJ,CAAC;AAED,QAAM,eAAe,MAAM;AACzB,sBAAkB,OAAO;AAAA,EAC3B;AAEA,QAAM,aAAa,MAAM,YAAY,MAAM;AACzC,mBAAe,KAAK;AAEpB,WAAO,kBAAkB;AAAA,MACvB,cAAU,oCAAsB,UAAU;AAAA,IAC5C,CAAC;AAAA,EACH,GAAG,CAAC,QAAQ,YAAY,CAAC;AAEzB,SACE,4CAAC,4BAAY,MAAZ,EAAiB,MAAY,cAA6B,GAAG,OAC5D,uDAAC,4BAAY,SAAZ,EAAoB,UAAS,SAC5B;AAAA,gDAAC,4BAAY,OAAZ,EACC;AAAA,MAAC;AAAA;AAAA,QACC,gBAAe;AAAA,QACf,IAAG;AAAA,QACH,aAAY;AAAA;AAAA,IACd,GACF;AAAA,IACA,4CAAC,4BAAY,aAAZ,EACC;AAAA,MAAC;AAAA;AAAA,QACC,gBAAe;AAAA,QACf,IAAG;AAAA,QACH,aAAY;AAAA;AAAA,IACd,GACF;AAAA,IAEA,4CAAC,sBAAK,KAAI,KAAI,SAAQ,OAAM,IAAG,KAAI,SAAO,MACxC;AAAA,MAAC;AAAA;AAAA,QACC,UAAU,CAAC,UAAU;AACnB,gBAAM,eAAe;AACrB,uBAAa;AAAA,QACf;AAAA,QAEA;AAAA,sDAAC,4BAAY,QAAZ,EACC;AAAA,YAAC;AAAA;AAAA,cACC,SAAQ;AAAA,cACR,UACE,kBAAkB,aAAa,kBAAkB;AAAA,cAGnD;AAAA,gBAAC;AAAA;AAAA,kBACC,gBAAe;AAAA,kBACf,IAAG;AAAA,kBACH,aAAY;AAAA;AAAA,cACd;AAAA;AAAA,UACF,GACF;AAAA,UAEA;AAAA,YAAC;AAAA;AAAA,cACC,SAAO;AAAA,cACP,SAAS,kBAAkB;AAAA,cAC3B,MAAM,kBAAkB;AAAA,cACxB,QAAQ;AAAA,cAER,sDAAC,0BAAO,SAAQ,eAAc,MAAK,UACjC;AAAA,gBAAC;AAAA;AAAA,kBACC,gBAAe;AAAA,kBACf,IAAG;AAAA,kBACH,aAAY;AAAA;AAAA,cACd,GACF;AAAA;AAAA,UACF;AAAA;AAAA;AAAA,IACF,GACF;AAAA,KACF,GACF;AAEJ;","names":[]}
|
|
@@ -3,9 +3,9 @@ import { ReactNode } from 'react';
|
|
|
3
3
|
import { RootProps } from '@radix-ui/themes/components/alert-dialog';
|
|
4
4
|
|
|
5
5
|
interface LogoutAllSessionsDialogProps extends RootProps {
|
|
6
|
+
currentSessionId?: string;
|
|
6
7
|
children?: ReactNode;
|
|
7
|
-
currentSessionId: string;
|
|
8
8
|
}
|
|
9
|
-
declare function LogoutAllSessionsDialog({ open, onOpenChange,
|
|
9
|
+
declare function LogoutAllSessionsDialog({ open, onOpenChange, currentSessionId, children, ...props }: LogoutAllSessionsDialogProps): React.JSX.Element;
|
|
10
10
|
|
|
11
11
|
export { LogoutAllSessionsDialog };
|
|
@@ -36,7 +36,8 @@ var import_jsx_runtime = require("react/jsx-runtime");
|
|
|
36
36
|
var React = __toESM(require("react"), 1);
|
|
37
37
|
var import_themes = require("@radix-ui/themes");
|
|
38
38
|
var import_elements = require("./elements.js");
|
|
39
|
-
var
|
|
39
|
+
var import_hooks = require("../api/client-graphql/hooks.js");
|
|
40
|
+
var import_client_graphql_result = require("./client-graphql-result.js");
|
|
40
41
|
var import_react_query = require("@tanstack/react-query");
|
|
41
42
|
var import_save_button = require("./save-button.js");
|
|
42
43
|
var import_utils = require("./utils.js");
|
|
@@ -56,18 +57,21 @@ function LogoutDialog({
|
|
|
56
57
|
id: "nF+P+T",
|
|
57
58
|
description: "Label for a session whose device could not be determined from its user agent"
|
|
58
59
|
});
|
|
59
|
-
const revokeSession = (0,
|
|
60
|
+
const revokeSession = (0, import_hooks.useClientGraphqlMutation)({
|
|
61
|
+
mutationFn: async (sdk, sessionId) => (0, import_client_graphql_result.expectResultMember)(
|
|
62
|
+
(await sdk.RevokeSession({ input: { sessionId } })).revokeSession,
|
|
63
|
+
"SessionRevoked"
|
|
64
|
+
)
|
|
65
|
+
});
|
|
60
66
|
const handleDone = React.useCallback(() => {
|
|
61
67
|
onOpenChange?.(false);
|
|
62
68
|
client.invalidateQueries({
|
|
63
|
-
queryKey: (0,
|
|
69
|
+
queryKey: (0, import_hooks.clientGraphqlQueryKey)("Sessions"),
|
|
64
70
|
exact: false
|
|
65
71
|
});
|
|
66
72
|
}, [onOpenChange, client]);
|
|
67
73
|
const onSubmitForm = () => {
|
|
68
|
-
revokeSession.mutate(
|
|
69
|
-
sessionId: session.id
|
|
70
|
-
});
|
|
74
|
+
revokeSession.mutate(session.id);
|
|
71
75
|
};
|
|
72
76
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.AlertDialog.Root, { open, onOpenChange, ...props, children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_elements.AlertDialog.Content, { maxWidth: "480px", children: [
|
|
73
77
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_elements.AlertDialog.Title, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/lib/logout-dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { Flex, Strong } from \"@radix-ui/themes\";\nimport { type ReactNode } from \"react\";\nimport { AlertDialog, Button } from \"./elements.js\";\nimport {\n
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/logout-dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { Flex, Strong } from \"@radix-ui/themes\";\nimport { type ReactNode } from \"react\";\nimport { AlertDialog, Button } from \"./elements.js\";\nimport type { SessionFieldsFragment } from \"../api/client-graphql/generated.js\";\nimport {\n clientGraphqlQueryKey,\n useClientGraphqlMutation,\n} from \"../api/client-graphql/hooks.js\";\nimport { expectResultMember } from \"./client-graphql-result.js\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport { SaveButton } from \"./save-button.js\";\nimport { parseUserAgent } from \"./utils.js\";\nimport { Translation } from \"./i18n/translation.js\";\nimport { useTranslation } from \"./i18n/use-translation.js\";\n\ninterface LogoutDialogProps extends AlertDialog.RootProps {\n children?: ReactNode;\n session: SessionFieldsFragment;\n}\n\nexport function LogoutDialog({\n children,\n session,\n open,\n onOpenChange,\n ...props\n}: LogoutDialogProps) {\n const client = useQueryClient();\n const translate = useTranslation();\n const device =\n parseUserAgent(session.userAgent)?.pretty ??\n translate({\n defaultMessage: \"Unknown device\",\n id: \"nF+P+T\",\n description:\n \"Label for a session whose device could not be determined from its user agent\",\n });\n\n const revokeSession = useClientGraphqlMutation({\n mutationFn: async (sdk, sessionId: string) =>\n expectResultMember(\n (await sdk.RevokeSession({ input: { sessionId } })).revokeSession,\n \"SessionRevoked\",\n ),\n });\n\n const handleDone = React.useCallback(() => {\n onOpenChange?.(false);\n\n client.invalidateQueries({\n queryKey: clientGraphqlQueryKey(\"Sessions\"),\n exact: false,\n });\n }, [onOpenChange, client]);\n\n const onSubmitForm = () => {\n revokeSession.mutate(session.id);\n };\n\n return (\n <AlertDialog.Root open={open} onOpenChange={onOpenChange} {...props}>\n <AlertDialog.Content maxWidth=\"480px\">\n <AlertDialog.Title>\n <Translation\n defaultMessage=\"Sign out of device?\"\n id=\"Jic5nB\"\n description=\"Dialog title asking to confirm signing out of a device\"\n />\n </AlertDialog.Title>\n <AlertDialog.Description>\n <Translation\n defaultMessage=\"You will be signed out of {device}.\"\n id=\"diFnRK\"\n description=\"Description explaining the user will be signed out of a specific device\"\n values={{ device: <Strong>{device}</Strong> }}\n />\n </AlertDialog.Description>\n\n <Flex gap=\"3\" justify=\"end\" mt=\"5\" asChild>\n <form\n onSubmit={(event) => {\n event.preventDefault();\n onSubmitForm();\n }}\n >\n <AlertDialog.Cancel>\n <Button\n variant=\"secondary\"\n disabled={revokeSession.isPending || revokeSession.isSuccess}\n >\n <Translation\n defaultMessage=\"Cancel\"\n id=\"KjY2RX\"\n description=\"Button to cancel the logout action\"\n />\n </Button>\n </AlertDialog.Cancel>\n\n <SaveButton\n asChild\n loading={revokeSession.isPending}\n done={revokeSession.isSuccess}\n onDone={handleDone}\n >\n <Button variant=\"destructive\" type=\"submit\">\n <Translation\n defaultMessage=\"Sign out\"\n id=\"tRJt/S\"\n description=\"Button to confirm signing out of device\"\n />\n </Button>\n </SaveButton>\n </form>\n </Flex>\n </AlertDialog.Content>\n </AlertDialog.Root>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAkEU;AAhEV,YAAuB;AACvB,oBAA6B;AAE7B,sBAAoC;AAEpC,mBAGO;AACP,mCAAmC;AACnC,yBAA+B;AAC/B,yBAA2B;AAC3B,mBAA+B;AAC/B,yBAA4B;AAC5B,6BAA+B;AAOxB,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAsB;AACpB,QAAM,aAAS,mCAAe;AAC9B,QAAM,gBAAY,uCAAe;AACjC,QAAM,aACJ,6BAAe,QAAQ,SAAS,GAAG,UACnC,UAAU;AAAA,IACR,gBAAgB;AAAA,IAChB,IAAI;AAAA,IACJ,aACE;AAAA,EACJ,CAAC;AAEH,QAAM,oBAAgB,uCAAyB;AAAA,IAC7C,YAAY,OAAO,KAAK,kBACtB;AAAA,OACG,MAAM,IAAI,cAAc,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,GAAG;AAAA,MACpD;AAAA,IACF;AAAA,EACJ,CAAC;AAED,QAAM,aAAa,MAAM,YAAY,MAAM;AACzC,mBAAe,KAAK;AAEpB,WAAO,kBAAkB;AAAA,MACvB,cAAU,oCAAsB,UAAU;AAAA,MAC1C,OAAO;AAAA,IACT,CAAC;AAAA,EACH,GAAG,CAAC,cAAc,MAAM,CAAC;AAEzB,QAAM,eAAe,MAAM;AACzB,kBAAc,OAAO,QAAQ,EAAE;AAAA,EACjC;AAEA,SACE,4CAAC,4BAAY,MAAZ,EAAiB,MAAY,cAA6B,GAAG,OAC5D,uDAAC,4BAAY,SAAZ,EAAoB,UAAS,SAC5B;AAAA,gDAAC,4BAAY,OAAZ,EACC;AAAA,MAAC;AAAA;AAAA,QACC,gBAAe;AAAA,QACf,IAAG;AAAA,QACH,aAAY;AAAA;AAAA,IACd,GACF;AAAA,IACA,4CAAC,4BAAY,aAAZ,EACC;AAAA,MAAC;AAAA;AAAA,QACC,gBAAe;AAAA,QACf,IAAG;AAAA,QACH,aAAY;AAAA,QACZ,QAAQ,EAAE,QAAQ,4CAAC,wBAAQ,kBAAO,EAAU;AAAA;AAAA,IAC9C,GACF;AAAA,IAEA,4CAAC,sBAAK,KAAI,KAAI,SAAQ,OAAM,IAAG,KAAI,SAAO,MACxC;AAAA,MAAC;AAAA;AAAA,QACC,UAAU,CAAC,UAAU;AACnB,gBAAM,eAAe;AACrB,uBAAa;AAAA,QACf;AAAA,QAEA;AAAA,sDAAC,4BAAY,QAAZ,EACC;AAAA,YAAC;AAAA;AAAA,cACC,SAAQ;AAAA,cACR,UAAU,cAAc,aAAa,cAAc;AAAA,cAEnD;AAAA,gBAAC;AAAA;AAAA,kBACC,gBAAe;AAAA,kBACf,IAAG;AAAA,kBACH,aAAY;AAAA;AAAA,cACd;AAAA;AAAA,UACF,GACF;AAAA,UAEA;AAAA,YAAC;AAAA;AAAA,cACC,SAAO;AAAA,cACP,SAAS,cAAc;AAAA,cACvB,MAAM,cAAc;AAAA,cACpB,QAAQ;AAAA,cAER,sDAAC,0BAAO,SAAQ,eAAc,MAAK,UACjC;AAAA,gBAAC;AAAA;AAAA,kBACC,gBAAe;AAAA,kBACf,IAAG;AAAA,kBACH,aAAY;AAAA;AAAA,cACd,GACF;AAAA;AAAA,UACF;AAAA;AAAA;AAAA,IACF,GACF;AAAA,KACF,GACF;AAEJ;","names":[]}
|
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
2
|
import { ReactNode } from 'react';
|
|
3
3
|
import { RootProps } from '@radix-ui/themes/components/alert-dialog';
|
|
4
|
-
import {
|
|
5
|
-
import '
|
|
6
|
-
import '../api/widgets-api-client.cjs';
|
|
4
|
+
import { SessionFieldsFragment } from '../api/client-graphql/generated.cjs';
|
|
5
|
+
import 'graphql-request';
|
|
7
6
|
|
|
8
7
|
interface LogoutDialogProps extends RootProps {
|
|
9
8
|
children?: ReactNode;
|
|
10
|
-
session:
|
|
9
|
+
session: SessionFieldsFragment;
|
|
11
10
|
}
|
|
12
11
|
declare function LogoutDialog({ children, session, open, onOpenChange, ...props }: LogoutDialogProps): React.JSX.Element;
|
|
13
12
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/lib/name-server-icon.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { VisuallyHidden } from \"@radix-ui/themes\";\nimport {
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/name-server-icon.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { VisuallyHidden } from \"@radix-ui/themes\";\nimport type { OrganizationDomainFieldsFragment } from \"../api/client-graphql/generated.js\";\nimport { ProviderIcon } from \"./provider-icon.js\";\n\ninterface NameServerIconProps {\n provider?: OrganizationDomainFieldsFragment[\"nameServer\"];\n}\n\nexport const NameServerIcon = ({ provider }: NameServerIconProps) => (\n <>\n <CustomProviderIcon\n provider=\"aws\"\n show={provider === \"AwsRoute53\"}\n size=\"2\"\n />\n <CustomProviderIcon\n provider=\"google\"\n show={provider === \"GoogleDomains\"}\n size=\"2\"\n />\n <CustomProviderIcon\n provider=\"cloudflare\"\n show={provider === \"CloudFlare\"}\n size=\"2\"\n />\n <CustomProviderIcon\n provider=\"godaddy\"\n show={provider === \"GoDaddy\"}\n size=\"2\"\n />\n\n {(provider === undefined || provider === \"Other\") && (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <g clipPath=\"url(#clip0_439_15264)\">\n <path\n d=\"M8.36963 0.84314C12.1559 1.03545 15.1665 4.16625 15.1665 8.00037C15.1663 11.9581 11.9583 15.1662 8.00049 15.1664C4.04256 15.1664 0.833672 11.9583 0.833496 8.00037C0.833496 4.04233 4.04245 0.833374 8.00049 0.833374L8.36963 0.84314ZM1.85596 8.50037C2.0802 11.2918 4.1615 13.5566 6.86475 14.0599C5.68944 12.4359 4.98911 10.5102 4.85498 8.50037H1.85596ZM11.144 8.50037C11.0099 10.5105 10.3098 12.4357 9.13428 14.0599C11.8382 13.5571 13.9198 11.2923 14.144 8.50037H11.144ZM5.85889 8.50037C6.00462 10.4763 6.75172 12.3598 7.99951 13.8978C9.24761 12.3597 9.99445 10.4765 10.1401 8.50037H5.85889ZM6.86572 1.93884C4.16183 2.44193 2.08009 4.70839 1.85596 7.50037H4.85498C4.98905 5.48961 5.68956 3.5633 6.86572 1.93884ZM7.99951 2.10193C6.75148 3.64015 6.00449 5.52408 5.85889 7.50037H10.1401C9.99457 5.5239 9.24784 3.64025 7.99951 2.10193ZM9.1333 1.93884C10.3097 3.56349 11.011 5.48937 11.145 7.50037H14.144C13.9199 4.70785 11.8378 2.44135 9.1333 1.93884Z\"\n fill=\"#2B333B\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_439_15264\">\n <rect width=\"16\" height=\"16\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n )}\n </>\n);\n\ntype IconProps = React.ComponentPropsWithoutRef<typeof ProviderIcon> & {\n show?: boolean;\n};\n\nconst CustomProviderIcon = ({ show, ...props }: IconProps) => {\n const Wrapper = show ? React.Fragment : VisuallyHidden;\n return (\n <Wrapper>\n <ProviderIcon {...props} provider={props.provider} size=\"1\" />\n </Wrapper>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAYE;AAVF,YAAuB;AACvB,oBAA+B;AAE/B,2BAA6B;AAMtB,MAAM,iBAAiB,CAAC,EAAE,SAAS,MACxC,4EACE;AAAA;AAAA,IAAC;AAAA;AAAA,MACC,UAAS;AAAA,MACT,MAAM,aAAa;AAAA,MACnB,MAAK;AAAA;AAAA,EACP;AAAA,EACA;AAAA,IAAC;AAAA;AAAA,MACC,UAAS;AAAA,MACT,MAAM,aAAa;AAAA,MACnB,MAAK;AAAA;AAAA,EACP;AAAA,EACA;AAAA,IAAC;AAAA;AAAA,MACC,UAAS;AAAA,MACT,MAAM,aAAa;AAAA,MACnB,MAAK;AAAA;AAAA,EACP;AAAA,EACA;AAAA,IAAC;AAAA;AAAA,MACC,UAAS;AAAA,MACT,MAAM,aAAa;AAAA,MACnB,MAAK;AAAA;AAAA,EACP;AAAA,GAEE,aAAa,UAAa,aAAa,YACvC;AAAA,IAAC;AAAA;AAAA,MACC,OAAM;AAAA,MACN,QAAO;AAAA,MACP,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,OAAM;AAAA,MAEN;AAAA,oDAAC,OAAE,UAAS,yBACV;AAAA,UAAC;AAAA;AAAA,YACC,GAAE;AAAA,YACF,MAAK;AAAA;AAAA,QACP,GACF;AAAA,QACA,4CAAC,UACC,sDAAC,cAAS,IAAG,mBACX,sDAAC,UAAK,OAAM,MAAK,QAAO,MAAK,MAAK,SAAQ,GAC5C,GACF;AAAA;AAAA;AAAA,EACF;AAAA,GAEJ;AAOF,MAAM,qBAAqB,CAAC,EAAE,MAAM,GAAG,MAAM,MAAiB;AAC5D,QAAM,UAAU,OAAO,MAAM,WAAW;AACxC,SACE,4CAAC,WACC,sDAAC,qCAAc,GAAG,OAAO,UAAU,MAAM,UAAU,MAAK,KAAI,GAC9D;AAEJ;","names":[]}
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
-
import {
|
|
3
|
-
import '
|
|
4
|
-
import '../api/widgets-api-client.cjs';
|
|
2
|
+
import { OrganizationDomainFieldsFragment } from '../api/client-graphql/generated.cjs';
|
|
3
|
+
import 'graphql-request';
|
|
5
4
|
|
|
6
5
|
interface NameServerIconProps {
|
|
7
|
-
provider?:
|
|
6
|
+
provider?: OrganizationDomainFieldsFragment["nameServer"];
|
|
8
7
|
}
|
|
9
8
|
declare const NameServerIcon: ({ provider }: NameServerIconProps) => React.JSX.Element;
|
|
10
9
|
|
|
@@ -29,11 +29,21 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
29
29
|
var oauth_icons_exports = {};
|
|
30
30
|
__export(oauth_icons_exports, {
|
|
31
31
|
OAuthIcon: () => OAuthIcon,
|
|
32
|
-
getOAuthName: () => getOAuthName
|
|
32
|
+
getOAuthName: () => getOAuthName,
|
|
33
|
+
isOAuthAccount: () => isOAuthAccount
|
|
33
34
|
});
|
|
34
35
|
module.exports = __toCommonJS(oauth_icons_exports);
|
|
35
36
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
36
37
|
var React = __toESM(require("react"), 1);
|
|
38
|
+
const OAUTH_ACCOUNTS = [
|
|
39
|
+
"GithubOAuth",
|
|
40
|
+
"GoogleOAuth",
|
|
41
|
+
"MicrosoftOAuth",
|
|
42
|
+
"AppleOAuth"
|
|
43
|
+
];
|
|
44
|
+
function isOAuthAccount(value) {
|
|
45
|
+
return OAUTH_ACCOUNTS.some((account) => account === value);
|
|
46
|
+
}
|
|
37
47
|
const GitHub = React.forwardRef((props, forwardedRef) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
38
48
|
"svg",
|
|
39
49
|
{
|
|
@@ -175,6 +185,7 @@ const getOAuthName = (account) => {
|
|
|
175
185
|
// Annotate the CommonJS export names for ESM import in node:
|
|
176
186
|
0 && (module.exports = {
|
|
177
187
|
OAuthIcon,
|
|
178
|
-
getOAuthName
|
|
188
|
+
getOAuthName,
|
|
189
|
+
isOAuthAccount
|
|
179
190
|
});
|
|
180
191
|
//# sourceMappingURL=oauth-icons.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/lib/oauth-icons.tsx"],"sourcesContent":["import * as React from \"react\";\n\nexport type OAuthAccount =\n | \"GithubOAuth\"\n | \"GoogleOAuth\"\n | \"MicrosoftOAuth\"\n | \"AppleOAuth\";\n\nconst GitHub = React.forwardRef<\n SVGSVGElement,\n React.ComponentPropsWithoutRef<\"svg\">\n>((props, forwardedRef) => (\n <svg\n ref={forwardedRef}\n fill=\"none\"\n height=\"16\"\n viewBox=\"0 0 15 15\"\n width=\"16\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n clipRule=\"evenodd\"\n d=\"M7.49933 0.25C3.49635 0.25 0.25 3.49593 0.25 7.50024C0.25 10.703 2.32715 13.4206 5.2081 14.3797C5.57084 14.446 5.70302 14.2222 5.70302 14.0299C5.70302 13.8576 5.69679 13.4019 5.69323 12.797C3.67661 13.235 3.25112 11.825 3.25112 11.825C2.92132 10.9874 2.44599 10.7644 2.44599 10.7644C1.78773 10.3149 2.49584 10.3238 2.49584 10.3238C3.22353 10.375 3.60629 11.0711 3.60629 11.0711C4.25298 12.1788 5.30335 11.8588 5.71638 11.6732C5.78225 11.205 5.96962 10.8854 6.17658 10.7043C4.56675 10.5209 2.87415 9.89918 2.87415 7.12104C2.87415 6.32925 3.15677 5.68257 3.62053 5.17563C3.54576 4.99226 3.29697 4.25521 3.69174 3.25691C3.69174 3.25691 4.30015 3.06196 5.68522 3.99973C6.26337 3.83906 6.8838 3.75895 7.50022 3.75583C8.1162 3.75895 8.73619 3.83906 9.31523 3.99973C10.6994 3.06196 11.3069 3.25691 11.3069 3.25691C11.7026 4.25521 11.4538 4.99226 11.3795 5.17563C11.8441 5.68257 12.1245 6.32925 12.1245 7.12104C12.1245 9.9063 10.4292 10.5192 8.81452 10.6985C9.07444 10.9224 9.30633 11.3648 9.30633 12.0413C9.30633 13.0102 9.29742 13.7922 9.29742 14.0299C9.29742 14.2239 9.42828 14.4496 9.79591 14.3788C12.6746 13.4179 14.75 10.7025 14.75 7.50024C14.75 3.49593 11.5036 0.25 7.49933 0.25Z\"\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n ></path>\n </svg>\n));\n\nGitHub.displayName = \"GitHub\";\n\nconst Google = React.forwardRef<\n SVGSVGElement,\n React.ComponentPropsWithoutRef<\"svg\">\n>((props, forwardedRef) => (\n <svg\n ref={forwardedRef}\n fill=\"none\"\n height=\"15\"\n viewBox=\"0 0 16 16\"\n width=\"15\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <g>\n <path\n d=\"M15.83 8.18C15.83 7.65333 15.7833 7.15333 15.7033 6.66667H8.17V9.67333H12.4833C12.29 10.66 11.7233 11.4933 10.8833 12.06V14.06H13.4567C14.9633 12.6667 15.83 10.6133 15.83 8.18Z\"\n fill=\"#4285F4\"\n />\n <path\n d=\"M8.17 16C10.33 16 12.1367 15.28 13.4567 14.06L10.8833 12.06C10.1633 12.54 9.25 12.8333 8.17 12.8333C6.08334 12.8333 4.31667 11.4267 3.68334 9.52667H1.03V11.5867C2.34334 14.2 5.04334 16 8.17 16Z\"\n fill=\"#34A853\"\n />\n <path\n d=\"M3.68334 9.52667C3.51667 9.04667 3.43 8.53333 3.43 8C3.43 7.46667 3.52334 6.95334 3.68334 6.47334V4.41334H1.03C0.483335 5.49334 0.170002 6.70667 0.170002 8C0.170002 9.29333 0.483335 10.5067 1.03 11.5867L3.68334 9.52667Z\"\n fill=\"#FBBC05\"\n />\n <path\n d=\"M8.17 3.16667C9.35 3.16667 10.4033 3.57334 11.2367 4.36667L13.5167 2.08667C12.1367 0.793334 10.33 0 8.17 0C5.04334 0 2.34334 1.8 1.03 4.41334L3.68334 6.47334C4.31667 4.57334 6.08334 3.16667 8.17 3.16667Z\"\n fill=\"#EA4335\"\n />\n </g>\n </svg>\n));\n\nGoogle.displayName = \"Google\";\n\nconst Microsoft = React.forwardRef<\n SVGSVGElement,\n React.ComponentPropsWithoutRef<\"svg\">\n>((props, forwardedRef) => (\n <svg\n ref={forwardedRef}\n fill=\"none\"\n height=\"15\"\n viewBox=\"0 0 15 15\"\n width=\"15\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <g>\n <path d=\"M0 0H7L7 7H-4.76837e-07L0 0Z\" fill=\"#F35325\" />\n <path d=\"M8 0H15V7H8L8 0Z\" fill=\"#81BC06\" />\n <path d=\"M0 8H7V15H0V8Z\" fill=\"#05A6F0\" />\n <path d=\"M8 8L15 8V15L8 15V8Z\" fill=\"#FFBA08\" />\n </g>\n </svg>\n));\n\nMicrosoft.displayName = \"Microsoft\";\n\nconst Apple = React.forwardRef<\n SVGSVGElement,\n React.ComponentPropsWithoutRef<\"svg\">\n>(({ style, ...props }, forwardedRef) => (\n <svg\n ref={forwardedRef}\n fill=\"none\"\n height=\"15\"\n style={{ overflow: \"visible\", ...style }}\n viewBox=\"0 0 15 15\"\n width=\"15\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n d=\"M14.219 3.33667C14.1169 3.41674 12.3137 4.44312 12.3137 6.72534C12.3137 9.3651 14.6082 10.299 14.6769 10.3221C14.6663 10.379 14.3124 11.601 13.4671 12.8462C12.7134 13.942 11.9263 15.0359 10.7288 15.0359C9.53134 15.0359 9.22317 14.3333 7.84081 14.3333C6.49366 14.3333 6.01469 15.0591 4.91935 15.0591C3.82401 15.0591 3.05978 14.0451 2.18104 12.8C1.1632 11.3378 0.34082 9.06625 0.34082 6.91034C0.34082 3.45232 2.56668 1.61835 4.75732 1.61835C5.92133 1.61835 6.89164 2.39036 7.62246 2.39036C8.31802 2.39036 9.40277 1.5721 10.7271 1.5721C11.2289 1.5721 13.0321 1.61835 14.219 3.33667ZM10.0984 0.108136C10.646 -0.548247 11.0334 -1.459 11.0334 -2.36975C11.0334 -2.49605 11.0229 -2.62412 11 -2.72729C10.1089 -2.6935 9.04883 -2.12783 8.40959 -1.37895C7.90772 -0.802617 7.43931 0.108136 7.43931 1.03134C7.43931 1.1701 7.46218 1.30883 7.47277 1.35331C7.52909 1.36398 7.62067 1.37643 7.71224 1.37643C8.51172 1.37643 9.51724 0.835672 10.0984 0.108136Z\"\n fill=\"currentColor\"\n />\n </svg>\n));\n\nApple.displayName = \"Apple\";\n\nexport const OAuthIcon = ({\n account,\n ...props\n}: React.ComponentPropsWithoutRef<\"svg\"> & { account: OAuthAccount }) => {\n switch (account) {\n case \"GithubOAuth\":\n return <GitHub {...props} />;\n case \"GoogleOAuth\":\n return <Google {...props} />;\n case \"MicrosoftOAuth\":\n return <Microsoft {...props} />;\n case \"AppleOAuth\":\n return <Apple {...props} />;\n default:\n account satisfies never;\n throw new Error(`Unknown OAuth account type: ${account}`);\n }\n};\n\nexport const getOAuthName = (account: OAuthAccount) => {\n switch (account) {\n case \"GithubOAuth\":\n return \"GitHub\";\n case \"GoogleOAuth\":\n return \"Google\";\n case \"MicrosoftOAuth\":\n return \"Microsoft\";\n case \"AppleOAuth\":\n return \"Apple\";\n default:\n account satisfies never;\n throw new Error(`Unknown OAuth account type: ${account}`);\n }\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/oauth-icons.tsx"],"sourcesContent":["import * as React from \"react\";\n\nexport type OAuthAccount =\n | \"GithubOAuth\"\n | \"GoogleOAuth\"\n | \"MicrosoftOAuth\"\n | \"AppleOAuth\";\n\nconst OAUTH_ACCOUNTS: readonly OAuthAccount[] = [\n \"GithubOAuth\",\n \"GoogleOAuth\",\n \"MicrosoftOAuth\",\n \"AppleOAuth\",\n];\n\nexport function isOAuthAccount(value: string): value is OAuthAccount {\n return OAUTH_ACCOUNTS.some((account) => account === value);\n}\n\nconst GitHub = React.forwardRef<\n SVGSVGElement,\n React.ComponentPropsWithoutRef<\"svg\">\n>((props, forwardedRef) => (\n <svg\n ref={forwardedRef}\n fill=\"none\"\n height=\"16\"\n viewBox=\"0 0 15 15\"\n width=\"16\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n clipRule=\"evenodd\"\n d=\"M7.49933 0.25C3.49635 0.25 0.25 3.49593 0.25 7.50024C0.25 10.703 2.32715 13.4206 5.2081 14.3797C5.57084 14.446 5.70302 14.2222 5.70302 14.0299C5.70302 13.8576 5.69679 13.4019 5.69323 12.797C3.67661 13.235 3.25112 11.825 3.25112 11.825C2.92132 10.9874 2.44599 10.7644 2.44599 10.7644C1.78773 10.3149 2.49584 10.3238 2.49584 10.3238C3.22353 10.375 3.60629 11.0711 3.60629 11.0711C4.25298 12.1788 5.30335 11.8588 5.71638 11.6732C5.78225 11.205 5.96962 10.8854 6.17658 10.7043C4.56675 10.5209 2.87415 9.89918 2.87415 7.12104C2.87415 6.32925 3.15677 5.68257 3.62053 5.17563C3.54576 4.99226 3.29697 4.25521 3.69174 3.25691C3.69174 3.25691 4.30015 3.06196 5.68522 3.99973C6.26337 3.83906 6.8838 3.75895 7.50022 3.75583C8.1162 3.75895 8.73619 3.83906 9.31523 3.99973C10.6994 3.06196 11.3069 3.25691 11.3069 3.25691C11.7026 4.25521 11.4538 4.99226 11.3795 5.17563C11.8441 5.68257 12.1245 6.32925 12.1245 7.12104C12.1245 9.9063 10.4292 10.5192 8.81452 10.6985C9.07444 10.9224 9.30633 11.3648 9.30633 12.0413C9.30633 13.0102 9.29742 13.7922 9.29742 14.0299C9.29742 14.2239 9.42828 14.4496 9.79591 14.3788C12.6746 13.4179 14.75 10.7025 14.75 7.50024C14.75 3.49593 11.5036 0.25 7.49933 0.25Z\"\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n ></path>\n </svg>\n));\n\nGitHub.displayName = \"GitHub\";\n\nconst Google = React.forwardRef<\n SVGSVGElement,\n React.ComponentPropsWithoutRef<\"svg\">\n>((props, forwardedRef) => (\n <svg\n ref={forwardedRef}\n fill=\"none\"\n height=\"15\"\n viewBox=\"0 0 16 16\"\n width=\"15\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <g>\n <path\n d=\"M15.83 8.18C15.83 7.65333 15.7833 7.15333 15.7033 6.66667H8.17V9.67333H12.4833C12.29 10.66 11.7233 11.4933 10.8833 12.06V14.06H13.4567C14.9633 12.6667 15.83 10.6133 15.83 8.18Z\"\n fill=\"#4285F4\"\n />\n <path\n d=\"M8.17 16C10.33 16 12.1367 15.28 13.4567 14.06L10.8833 12.06C10.1633 12.54 9.25 12.8333 8.17 12.8333C6.08334 12.8333 4.31667 11.4267 3.68334 9.52667H1.03V11.5867C2.34334 14.2 5.04334 16 8.17 16Z\"\n fill=\"#34A853\"\n />\n <path\n d=\"M3.68334 9.52667C3.51667 9.04667 3.43 8.53333 3.43 8C3.43 7.46667 3.52334 6.95334 3.68334 6.47334V4.41334H1.03C0.483335 5.49334 0.170002 6.70667 0.170002 8C0.170002 9.29333 0.483335 10.5067 1.03 11.5867L3.68334 9.52667Z\"\n fill=\"#FBBC05\"\n />\n <path\n d=\"M8.17 3.16667C9.35 3.16667 10.4033 3.57334 11.2367 4.36667L13.5167 2.08667C12.1367 0.793334 10.33 0 8.17 0C5.04334 0 2.34334 1.8 1.03 4.41334L3.68334 6.47334C4.31667 4.57334 6.08334 3.16667 8.17 3.16667Z\"\n fill=\"#EA4335\"\n />\n </g>\n </svg>\n));\n\nGoogle.displayName = \"Google\";\n\nconst Microsoft = React.forwardRef<\n SVGSVGElement,\n React.ComponentPropsWithoutRef<\"svg\">\n>((props, forwardedRef) => (\n <svg\n ref={forwardedRef}\n fill=\"none\"\n height=\"15\"\n viewBox=\"0 0 15 15\"\n width=\"15\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <g>\n <path d=\"M0 0H7L7 7H-4.76837e-07L0 0Z\" fill=\"#F35325\" />\n <path d=\"M8 0H15V7H8L8 0Z\" fill=\"#81BC06\" />\n <path d=\"M0 8H7V15H0V8Z\" fill=\"#05A6F0\" />\n <path d=\"M8 8L15 8V15L8 15V8Z\" fill=\"#FFBA08\" />\n </g>\n </svg>\n));\n\nMicrosoft.displayName = \"Microsoft\";\n\nconst Apple = React.forwardRef<\n SVGSVGElement,\n React.ComponentPropsWithoutRef<\"svg\">\n>(({ style, ...props }, forwardedRef) => (\n <svg\n ref={forwardedRef}\n fill=\"none\"\n height=\"15\"\n style={{ overflow: \"visible\", ...style }}\n viewBox=\"0 0 15 15\"\n width=\"15\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n d=\"M14.219 3.33667C14.1169 3.41674 12.3137 4.44312 12.3137 6.72534C12.3137 9.3651 14.6082 10.299 14.6769 10.3221C14.6663 10.379 14.3124 11.601 13.4671 12.8462C12.7134 13.942 11.9263 15.0359 10.7288 15.0359C9.53134 15.0359 9.22317 14.3333 7.84081 14.3333C6.49366 14.3333 6.01469 15.0591 4.91935 15.0591C3.82401 15.0591 3.05978 14.0451 2.18104 12.8C1.1632 11.3378 0.34082 9.06625 0.34082 6.91034C0.34082 3.45232 2.56668 1.61835 4.75732 1.61835C5.92133 1.61835 6.89164 2.39036 7.62246 2.39036C8.31802 2.39036 9.40277 1.5721 10.7271 1.5721C11.2289 1.5721 13.0321 1.61835 14.219 3.33667ZM10.0984 0.108136C10.646 -0.548247 11.0334 -1.459 11.0334 -2.36975C11.0334 -2.49605 11.0229 -2.62412 11 -2.72729C10.1089 -2.6935 9.04883 -2.12783 8.40959 -1.37895C7.90772 -0.802617 7.43931 0.108136 7.43931 1.03134C7.43931 1.1701 7.46218 1.30883 7.47277 1.35331C7.52909 1.36398 7.62067 1.37643 7.71224 1.37643C8.51172 1.37643 9.51724 0.835672 10.0984 0.108136Z\"\n fill=\"currentColor\"\n />\n </svg>\n));\n\nApple.displayName = \"Apple\";\n\nexport const OAuthIcon = ({\n account,\n ...props\n}: React.ComponentPropsWithoutRef<\"svg\"> & { account: OAuthAccount }) => {\n switch (account) {\n case \"GithubOAuth\":\n return <GitHub {...props} />;\n case \"GoogleOAuth\":\n return <Google {...props} />;\n case \"MicrosoftOAuth\":\n return <Microsoft {...props} />;\n case \"AppleOAuth\":\n return <Apple {...props} />;\n default:\n account satisfies never;\n throw new Error(`Unknown OAuth account type: ${account}`);\n }\n};\n\nexport const getOAuthName = (account: OAuthAccount) => {\n switch (account) {\n case \"GithubOAuth\":\n return \"GitHub\";\n case \"GoogleOAuth\":\n return \"Google\";\n case \"MicrosoftOAuth\":\n return \"Microsoft\";\n case \"AppleOAuth\":\n return \"Apple\";\n default:\n account satisfies never;\n throw new Error(`Unknown OAuth account type: ${account}`);\n }\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgCI;AAhCJ,YAAuB;AAQvB,MAAM,iBAA0C;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,SAAS,eAAe,OAAsC;AACnE,SAAO,eAAe,KAAK,CAAC,YAAY,YAAY,KAAK;AAC3D;AAEA,MAAM,SAAS,MAAM,WAGnB,CAAC,OAAO,iBACR;AAAA,EAAC;AAAA;AAAA,IACC,KAAK;AAAA,IACL,MAAK;AAAA,IACL,QAAO;AAAA,IACP,SAAQ;AAAA,IACR,OAAM;AAAA,IACN,OAAM;AAAA,IACL,GAAG;AAAA,IAEJ;AAAA,MAAC;AAAA;AAAA,QACC,UAAS;AAAA,QACT,GAAE;AAAA,QACF,MAAK;AAAA,QACL,UAAS;AAAA;AAAA,IACV;AAAA;AACH,CACD;AAED,OAAO,cAAc;AAErB,MAAM,SAAS,MAAM,WAGnB,CAAC,OAAO,iBACR;AAAA,EAAC;AAAA;AAAA,IACC,KAAK;AAAA,IACL,MAAK;AAAA,IACL,QAAO;AAAA,IACP,SAAQ;AAAA,IACR,OAAM;AAAA,IACN,OAAM;AAAA,IACL,GAAG;AAAA,IAEJ,uDAAC,OACC;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,GAAE;AAAA,UACF,MAAK;AAAA;AAAA,MACP;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,GAAE;AAAA,UACF,MAAK;AAAA;AAAA,MACP;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,GAAE;AAAA,UACF,MAAK;AAAA;AAAA,MACP;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,GAAE;AAAA,UACF,MAAK;AAAA;AAAA,MACP;AAAA,OACF;AAAA;AACF,CACD;AAED,OAAO,cAAc;AAErB,MAAM,YAAY,MAAM,WAGtB,CAAC,OAAO,iBACR;AAAA,EAAC;AAAA;AAAA,IACC,KAAK;AAAA,IACL,MAAK;AAAA,IACL,QAAO;AAAA,IACP,SAAQ;AAAA,IACR,OAAM;AAAA,IACN,OAAM;AAAA,IACL,GAAG;AAAA,IAEJ,uDAAC,OACC;AAAA,kDAAC,UAAK,GAAE,gCAA+B,MAAK,WAAU;AAAA,MACtD,4CAAC,UAAK,GAAE,oBAAmB,MAAK,WAAU;AAAA,MAC1C,4CAAC,UAAK,GAAE,kBAAiB,MAAK,WAAU;AAAA,MACxC,4CAAC,UAAK,GAAE,wBAAuB,MAAK,WAAU;AAAA,OAChD;AAAA;AACF,CACD;AAED,UAAU,cAAc;AAExB,MAAM,QAAQ,MAAM,WAGlB,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,iBACtB;AAAA,EAAC;AAAA;AAAA,IACC,KAAK;AAAA,IACL,MAAK;AAAA,IACL,QAAO;AAAA,IACP,OAAO,EAAE,UAAU,WAAW,GAAG,MAAM;AAAA,IACvC,SAAQ;AAAA,IACR,OAAM;AAAA,IACN,OAAM;AAAA,IACL,GAAG;AAAA,IAEJ;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,MAAK;AAAA;AAAA,IACP;AAAA;AACF,CACD;AAED,MAAM,cAAc;AAEb,MAAM,YAAY,CAAC;AAAA,EACxB;AAAA,EACA,GAAG;AACL,MAAyE;AACvE,UAAQ,SAAS;AAAA,IACf,KAAK;AACH,aAAO,4CAAC,UAAQ,GAAG,OAAO;AAAA,IAC5B,KAAK;AACH,aAAO,4CAAC,UAAQ,GAAG,OAAO;AAAA,IAC5B,KAAK;AACH,aAAO,4CAAC,aAAW,GAAG,OAAO;AAAA,IAC/B,KAAK;AACH,aAAO,4CAAC,SAAO,GAAG,OAAO;AAAA,IAC3B;AACE;AACA,YAAM,IAAI,MAAM,+BAA+B,OAAO,EAAE;AAAA,EAC5D;AACF;AAEO,MAAM,eAAe,CAAC,YAA0B;AACrD,UAAQ,SAAS;AAAA,IACf,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE;AACA,YAAM,IAAI,MAAM,+BAA+B,OAAO,EAAE;AAAA,EAC5D;AACF;","names":[]}
|