diff --git a/apps/studio/components/interfaces/Account/TOTPFactors/index.tsx b/apps/studio/components/interfaces/Account/TOTPFactors/index.tsx index 19a44f4cdeb..0eab7e9b764 100644 --- a/apps/studio/components/interfaces/Account/TOTPFactors/index.tsx +++ b/apps/studio/components/interfaces/Account/TOTPFactors/index.tsx @@ -19,8 +19,7 @@ export const TOTPFactors = () => { <>

- Generate one-time passwords via authenticator apps like 1Password, Authy, etc. as a second - factor to verify your identity during sign-in. + Use an authenticator app (like 1Password or Authy) to verify your identity at sign-in.

{isLoading && } diff --git a/apps/studio/components/interfaces/OrganizationInvite/OrganizationInvite.tsx b/apps/studio/components/interfaces/OrganizationInvite/OrganizationInvite.tsx index a89cf6162a4..10b746c6695 100644 --- a/apps/studio/components/interfaces/OrganizationInvite/OrganizationInvite.tsx +++ b/apps/studio/components/interfaces/OrganizationInvite/OrganizationInvite.tsx @@ -59,6 +59,7 @@ export const OrganizationInvite = () => { const isInvitationLoading = inviteStatus === 'loading' const inviteContent = getOrganizationInviteContent({ data, + error, isSignUpEnabled, status: inviteStatus, }) @@ -66,6 +67,8 @@ export const OrganizationInvite = () => { const loginRedirectLink = `/sign-in?returnTo=${encodeURIComponent(`/join?token=${token}&slug=${slug}`)}` const signupRedirectLink = `/sign-up?returnTo=${encodeURIComponent(`/join?token=${token}&slug=${slug}`)}` + const mfaRequiredError = error?.message.includes('MFA required') + const { mutate: joinOrganization, isPending: isJoining } = useOrganizationAcceptInvitationMutation({ onSuccess: () => { @@ -85,21 +88,21 @@ export const OrganizationInvite = () => { const withLayout = (children: ReactNode) => ( } + titleClassName="text-xl" title={ isInvitationLoading ? ( - ) : inviteContent.title ? ( + ) : ( inviteContent.title - ) : undefined + ) } description={ isInvitationLoading ? ( - ) : inviteContent.description ? ( + ) : ( inviteContent.description - ) : undefined + ) } - titleClassName="text-xl" >
{children}
@@ -154,6 +157,16 @@ export const OrganizationInvite = () => { ) } + if (mfaRequiredError) { + return withLayout( +
+ +
+ ) + } + if (hasError) { return withLayout( - - Account preferences + + Account toggleFeaturePreviewModal(true)} - // onSelect={() => toggleFeaturePreviewModal(true)} > Feature previews diff --git a/apps/studio/pages/account/security.tsx b/apps/studio/pages/account/security.tsx index 426e9cd5a4e..a6d8dfdb5cc 100644 --- a/apps/studio/pages/account/security.tsx +++ b/apps/studio/pages/account/security.tsx @@ -1,5 +1,5 @@ -import { Smartphone } from 'lucide-react' -import { Badge, cn, Collapsible, CollapsibleContent, CollapsibleTrigger } from 'ui' +import { Lock } from 'lucide-react' +import { Badge, Card, CardContent, CardHeader } from 'ui' import { PageContainer } from 'ui-patterns/PageContainer' import { PageHeader, @@ -18,19 +18,6 @@ import { useMfaListFactorsQuery } from '@/data/profile/mfa-list-factors-query' import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled' import type { NextPageWithLayout } from '@/types' -const collapsibleClasses = [ - 'bg-surface-100', - 'hover:bg-surface-200', - 'data-open:bg-surface-200', - 'border-default', - 'hover:border-strong data-open:border-strong', - 'data-open:pb-px col-span-12 rounded-sm', - '-space-y-px overflow-hidden', - 'border shadow-sm', - 'transition', - 'hover:z-50', -] - const Security: NextPageWithLayout = () => { const showSecuritySettings = useIsFeatureEnabled('account:show_security_settings') @@ -53,28 +40,23 @@ const Security: NextPageWithLayout = () => { - - - - - + {data ? ( + + {data.totp.length} app{data.totp.length === 1 ? '' : 's'} configured + + ) : null} + + - - + + )