diff --git a/src/app/(mobile-ui)/home/page.tsx b/src/app/(mobile-ui)/home/page.tsx
index 62b554b1f..51a3b1531 100644
--- a/src/app/(mobile-ui)/home/page.tsx
+++ b/src/app/(mobile-ui)/home/page.tsx
@@ -10,7 +10,7 @@ import { UserHeader } from '@/components/UserHeader'
import { useAuth } from '@/context/authContext'
import { useWallet } from '@/hooks/wallet/useWallet'
import { useUserStore } from '@/redux/hooks'
-import { formatExtendedNumber, getUserPreferences, updateUserPreferences, getRedirectUrl } from '@/utils/general.utils'
+import { formatExtendedNumber, getUserPreferences, updateUserPreferences } from '@/utils/general.utils'
import { printableUsdc } from '@/utils/balance.utils'
import { useDisconnect } from '@reown/appkit/react'
import Link from 'next/link'
@@ -24,7 +24,7 @@ import { PEANUT_WALLET_TOKEN_DECIMALS } from '@/constants/zerodev.consts'
import { PostSignupActionManager } from '@/components/Global/PostSignupActionManager'
import { useWithdrawFlow } from '@/context/WithdrawFlowContext'
import { useClaimBankFlow } from '@/context/ClaimBankFlowContext'
-import { useDeviceType, DeviceType } from '@/hooks/useGetDeviceType'
+import { useDeviceType } from '@/hooks/useGetDeviceType'
import { useNotifications } from '@/hooks/useNotifications'
import useKycStatus from '@/hooks/useKycStatus'
import { useCardPioneerInfo } from '@/hooks/useCardPioneerInfo'
diff --git a/src/app/(mobile-ui)/profile/identity-verification/[region]/[country]/page.tsx b/src/app/(mobile-ui)/profile/identity-verification/[region]/[country]/page.tsx
deleted file mode 100644
index 8ffed617b..000000000
--- a/src/app/(mobile-ui)/profile/identity-verification/[region]/[country]/page.tsx
+++ /dev/null
@@ -1,6 +0,0 @@
-'use client'
-import IdentityVerificationView from '@/components/Profile/views/IdentityVerification.view'
-
-export default function IdentityVerificationCountryPage() {
- return
-}
diff --git a/src/app/(mobile-ui)/profile/identity-verification/[region]/page.tsx b/src/app/(mobile-ui)/profile/identity-verification/[region]/page.tsx
deleted file mode 100644
index d1843f861..000000000
--- a/src/app/(mobile-ui)/profile/identity-verification/[region]/page.tsx
+++ /dev/null
@@ -1,10 +0,0 @@
-'use client'
-import RegionsPage from '@/components/Profile/views/RegionsPage.view'
-import { useParams } from 'next/navigation'
-
-export default function IdentityVerificationRegionPage() {
- const params = useParams()
- const region = params.region as string
-
- return
-}
diff --git a/src/app/(mobile-ui)/profile/identity-verification/layout.tsx b/src/app/(mobile-ui)/profile/identity-verification/layout.tsx
index 29884066e..5f6049aa8 100644
--- a/src/app/(mobile-ui)/profile/identity-verification/layout.tsx
+++ b/src/app/(mobile-ui)/profile/identity-verification/layout.tsx
@@ -1,59 +1,7 @@
'use client'
import PageContainer from '@/components/0_Bruddle/PageContainer'
-import ActionModal from '@/components/Global/ActionModal'
-import { useIdentityVerification } from '@/hooks/useIdentityVerification'
-import { useParams, useRouter } from 'next/navigation'
-import { useEffect, useState } from 'react'
export default function IdentityVerificationLayout({ children }: { children: React.ReactNode }) {
- const [isAlreadyVerifiedModalOpen, setIsAlreadyVerifiedModalOpen] = useState(false)
- const router = useRouter()
- const { isRegionAlreadyUnlocked, isVerifiedForCountry } = useIdentityVerification()
- const params = useParams()
- const regionParams = params.region as string
- const countryParams = params.country as string
-
- useEffect(() => {
- const isAlreadyVerified =
- (countryParams && isVerifiedForCountry(countryParams)) ||
- (regionParams && isRegionAlreadyUnlocked(regionParams))
-
- if (isAlreadyVerified) {
- setIsAlreadyVerifiedModalOpen(true)
- }
- }, [countryParams, regionParams, isVerifiedForCountry, isRegionAlreadyUnlocked])
-
- return (
-
- {children}
-
- {
- setIsAlreadyVerifiedModalOpen(false)
- router.push('/profile')
- }}
- title="You're already verified"
- description={
-
- Your identity has already been successfully verified for this region. You can continue to use
- features available in this region. No further action is needed.
-
- The verification is done by Persona, which only shares a yes/no with Peanut.
+ The verification is done using a trusted provider, which shares your verification status with
+ Peanut.
- Persona is trusted by millions and it operates under strict security and privacy standards.
+ It operates under industry-standard security and privacy practices.
Peanut never sees or stores your verification data.
- To send and receive money locally, you'll need to verify your identity with a
- government-issued ID from {selectedCountry.title}.
-
- )
- }
-
- if (isSelectedCountryMantecaCountry && !isIdentityMantecaCountry) {
- return `Without an ${selectedCountry.title} Issued ID, you can still pay in stores using QR codes but you won't be able to transfer money directly to bank accounts.`
- }
-
- return (
-
- To send money to and from bank accounts and local payment methods, verify your identity with a
- government-issued ID.
-
diff --git a/src/components/Kyc/BridgeTosReminder.tsx b/src/components/Kyc/BridgeTosReminder.tsx
new file mode 100644
index 000000000..e2965a62e
--- /dev/null
+++ b/src/components/Kyc/BridgeTosReminder.tsx
@@ -0,0 +1,51 @@
+'use client'
+
+import { useState, useCallback } from 'react'
+import Card from '@/components/Global/Card'
+import { Icon } from '@/components/Global/Icons/Icon'
+import { BridgeTosStep } from '@/components/Kyc/BridgeTosStep'
+import { useAuth } from '@/context/authContext'
+import { type CardPosition } from '@/components/Global/Card/card.utils'
+
+interface BridgeTosReminderProps {
+ position?: CardPosition
+}
+
+// shown in the activity feed when user has bridge rails needing ToS acceptance.
+// clicking opens the bridge ToS flow.
+export const BridgeTosReminder = ({ position = 'single' }: BridgeTosReminderProps) => {
+ const { fetchUser } = useAuth()
+ const [showTosStep, setShowTosStep] = useState(false)
+
+ const handleClick = useCallback(() => {
+ setShowTosStep(true)
+ }, [])
+
+ const handleComplete = useCallback(async () => {
+ setShowTosStep(false)
+ await fetchUser()
+ }, [fetchUser])
+
+ const handleSkip = useCallback(() => {
+ setShowTosStep(false)
+ }, [])
+
+ return (
+ <>
+
+
+
+
+
+
+
Accept terms of service
+
Required to enable bank transfers
+
+
+
+
+
+
+ >
+ )
+}
diff --git a/src/components/Kyc/BridgeTosStep.tsx b/src/components/Kyc/BridgeTosStep.tsx
new file mode 100644
index 000000000..ac23576ab
--- /dev/null
+++ b/src/components/Kyc/BridgeTosStep.tsx
@@ -0,0 +1,132 @@
+'use client'
+
+import { useState, useCallback, useEffect } from 'react'
+import ActionModal from '@/components/Global/ActionModal'
+import IframeWrapper from '@/components/Global/IframeWrapper'
+import { type IconName } from '@/components/Global/Icons/Icon'
+import { getBridgeTosLink, confirmBridgeTos } from '@/app/actions/users'
+import { useAuth } from '@/context/authContext'
+
+interface BridgeTosStepProps {
+ visible: boolean
+ onComplete: () => void
+ onSkip: () => void
+}
+
+// shown immediately after sumsub kyc approval when bridge rails need ToS acceptance.
+// displays a prompt, then opens the bridge ToS iframe.
+export const BridgeTosStep = ({ visible, onComplete, onSkip }: BridgeTosStepProps) => {
+ const { fetchUser } = useAuth()
+ const [showIframe, setShowIframe] = useState(false)
+ const [tosLink, setTosLink] = useState(null)
+ const [isLoading, setIsLoading] = useState(false)
+ const [error, setError] = useState(null)
+
+ // reset state when visibility changes
+ useEffect(() => {
+ if (!visible) {
+ setShowIframe(false)
+ setTosLink(null)
+ setError(null)
+ }
+ }, [visible])
+
+ const handleAcceptTerms = useCallback(async () => {
+ setIsLoading(true)
+ setError(null)
+
+ try {
+ const response = await getBridgeTosLink()
+
+ if (response.error || !response.data?.tosLink) {
+ // if we can't get the tos link (e.g. bridge customer not created yet),
+ // skip this step — the activity feed will show a reminder later
+ setError(response.error || 'Could not load terms. You can accept them later from your activity feed.')
+ return
+ }
+
+ setTosLink(response.data.tosLink)
+ setShowIframe(true)
+ } catch {
+ setError('Something went wrong. You can accept terms later from your activity feed.')
+ } finally {
+ setIsLoading(false)
+ }
+ }, [])
+
+ const handleIframeClose = useCallback(
+ async (source?: 'manual' | 'completed' | 'tos_accepted') => {
+ setShowIframe(false)
+
+ if (source === 'tos_accepted') {
+ // confirm with backend that bridge actually accepted the ToS
+ const result = await confirmBridgeTos()
+
+ if (result.data?.accepted) {
+ await fetchUser()
+ onComplete()
+ return
+ }
+
+ // bridge hasn't registered acceptance yet — poll once after a short delay
+ await new Promise((resolve) => setTimeout(resolve, 2000))
+ const retry = await confirmBridgeTos()
+
+ if (retry.data?.accepted) {
+ await fetchUser()
+ onComplete()
+ } else {
+ // will be caught by poller/webhook eventually
+ await fetchUser()
+ onComplete()
+ }
+ } else {
+ // user closed without accepting — skip, activity feed will remind them
+ onSkip()
+ }
+ },
+ [fetchUser, onComplete, onSkip]
+ )
+
+ if (!visible) return null
+
+ return (
+ <>
+ {!showIframe && (
+
+ )}
+
+ {tosLink && }
+ >
+ )
+}
diff --git a/src/components/Kyc/InitiateMantecaKYCModal.tsx b/src/components/Kyc/InitiateMantecaKYCModal.tsx
index d72f425cc..6f547e6f3 100644
--- a/src/components/Kyc/InitiateMantecaKYCModal.tsx
+++ b/src/components/Kyc/InitiateMantecaKYCModal.tsx
@@ -6,7 +6,7 @@ import { type IconName } from '@/components/Global/Icons/Icon'
import { useMantecaKycFlow } from '@/hooks/useMantecaKycFlow'
import { type CountryData } from '@/components/AddMoney/consts'
import { Button } from '@/components/0_Bruddle/Button'
-import { PeanutDoesntStoreAnyPersonalInformation } from './KycVerificationInProgressModal'
+import { PeanutDoesntStoreAnyPersonalInformation } from '@/components/Kyc/PeanutDoesntStoreAnyPersonalInformation'
import { useEffect } from 'react'
interface Props {
diff --git a/src/components/Kyc/KYCStatusDrawerItem.tsx b/src/components/Kyc/KYCStatusDrawerItem.tsx
index 0d2cae261..f377c2ad0 100644
--- a/src/components/Kyc/KYCStatusDrawerItem.tsx
+++ b/src/components/Kyc/KYCStatusDrawerItem.tsx
@@ -2,13 +2,13 @@ import Card from '@/components/Global/Card'
import StatusBadge, { type StatusType } from '../Global/Badges/StatusBadge'
import { KYCStatusIcon } from './KYCStatusIcon'
-export const KYCStatusDrawerItem = ({ status }: { status: StatusType }) => {
+export const KYCStatusDrawerItem = ({ status, customText }: { status: StatusType; customText?: string }) => {
return (
Identity verification
-
+
)
diff --git a/src/components/Kyc/KycFlow.tsx b/src/components/Kyc/KycFlow.tsx
index 88795f515..0ac66bd38 100644
--- a/src/components/Kyc/KycFlow.tsx
+++ b/src/components/Kyc/KycFlow.tsx
@@ -1,22 +1,22 @@
-import { Button, type ButtonProps } from '@/components/0_Bruddle/Button'
-import IframeWrapper from '@/components/Global/IframeWrapper'
-import { useBridgeKycFlow } from '@/hooks/useBridgeKycFlow'
+import { type ButtonProps } from '@/components/0_Bruddle/Button'
+import { SumsubKycFlow } from '@/components/Kyc/SumsubKycFlow'
+import { type KYCRegionIntent } from '@/app/actions/types/sumsub.types'
-// this component is the main entry point for the kyc flow
-// it renders a button that, when clicked, initiates the process of fetching
-// tos/kyc links, showing them in an iframe, and then displaying a status modal
-export const KycFlow = (props: ButtonProps) => {
- const { isLoading, error, iframeOptions, handleInitiateKyc, handleIframeClose } = useBridgeKycFlow()
+interface KycFlowProps extends ButtonProps {
+ regionIntent?: KYCRegionIntent
+ onKycSuccess?: () => void
+ onManualClose?: () => void
+}
+// main entry point for the kyc flow.
+// renders SumsubKycFlow with an optional region intent for context-aware verification.
+export const KycFlow = ({ regionIntent, onKycSuccess, onManualClose, ...buttonProps }: KycFlowProps) => {
return (
- <>
-
-
- {error &&
{error}
}
-
-
- >
+
)
}
diff --git a/src/components/Kyc/KycStatusDrawer.tsx b/src/components/Kyc/KycStatusDrawer.tsx
index e8a80f9fd..07b6b292d 100644
--- a/src/components/Kyc/KycStatusDrawer.tsx
+++ b/src/components/Kyc/KycStatusDrawer.tsx
@@ -1,31 +1,21 @@
+import { KycActionRequired } from './states/KycActionRequired'
import { KycCompleted } from './states/KycCompleted'
import { KycFailed } from './states/KycFailed'
import { KycProcessing } from './states/KycProcessing'
+import { KycRequiresDocuments } from './states/KycRequiresDocuments'
import { Drawer, DrawerContent, DrawerTitle } from '../Global/Drawer'
import { type BridgeKycStatus } from '@/utils/bridge-accounts.utils'
-import { type IUserKycVerification, MantecaKycStatus } from '@/interfaces'
+import { type IUserKycVerification } from '@/interfaces'
import { useUserStore } from '@/redux/hooks'
import { useBridgeKycFlow } from '@/hooks/useBridgeKycFlow'
import { useMantecaKycFlow } from '@/hooks/useMantecaKycFlow'
+import { useSumsubKycFlow } from '@/hooks/useSumsubKycFlow'
import { type CountryData, countryData } from '@/components/AddMoney/consts'
import IFrameWrapper from '@/components/Global/IframeWrapper'
-
-// a helper to categorize the kyc status from the user object
-const getKycStatusCategory = (status: BridgeKycStatus | MantecaKycStatus): 'processing' | 'completed' | 'failed' => {
- switch (status) {
- case 'approved':
- case MantecaKycStatus.ACTIVE:
- return 'completed'
- case 'rejected':
- case MantecaKycStatus.INACTIVE:
- return 'failed'
- case 'under_review':
- case 'incomplete':
- case MantecaKycStatus.ONBOARDING:
- default:
- return 'processing'
- }
-}
+import { SumsubKycWrapper } from '@/components/Kyc/SumsubKycWrapper'
+import { KycVerificationInProgressModal } from '@/components/Kyc/KycVerificationInProgressModal'
+import { getKycStatusCategory, isKycStatusNotStarted } from '@/constants/kyc.consts'
+import { type KYCRegionIntent } from '@/app/actions/types/sumsub.types'
interface KycStatusDrawerProps {
isOpen: boolean
@@ -43,6 +33,10 @@ export const KycStatusDrawer = ({ isOpen, onClose, verification, bridgeKycStatus
const countryCode = verification ? verification.mantecaGeo || verification.bridgeGeo : null
const isBridgeKyc = !verification && !!bridgeKycStatus
const provider = verification ? verification.provider : 'BRIDGE'
+ // derive region intent from sumsub verification metadata so token uses correct level
+ const sumsubRegionIntent = (
+ verification?.provider === 'SUMSUB' ? verification?.metadata?.regionIntent : undefined
+ ) as KYCRegionIntent | undefined
const {
handleInitiateKyc: initiateBridgeKyc,
@@ -65,17 +59,71 @@ export const KycStatusDrawer = ({ isOpen, onClose, verification, bridgeKycStatus
country: country as CountryData,
})
+ const {
+ handleInitiateKyc: initiateSumsub,
+ showWrapper: showSumsubWrapper,
+ accessToken: sumsubAccessToken,
+ handleSdkComplete: handleSumsubComplete,
+ handleClose: handleSumsubClose,
+ refreshToken: sumsubRefreshToken,
+ isLoading: isSumsubLoading,
+ isVerificationProgressModalOpen: isSumsubProgressModalOpen,
+ closeVerificationProgressModal: closeSumsubProgressModal,
+ error: sumsubError,
+ } = useSumsubKycFlow({ onKycSuccess: onClose, onManualClose: onClose, regionIntent: sumsubRegionIntent })
+
const onRetry = async () => {
- if (provider === 'MANTECA') {
+ if (provider === 'SUMSUB') {
+ await initiateSumsub()
+ } else if (provider === 'MANTECA') {
await openMantecaKyc(country as CountryData)
} else {
await initiateBridgeKyc()
}
}
- const isLoadingKyc = isBridgeLoading || isMantecaLoading
+ const isLoadingKyc = isBridgeLoading || isMantecaLoading || isSumsubLoading
+
+ // check if any bridge rail needs additional documents
+ const bridgeRailsNeedingDocs = (user?.rails ?? []).filter(
+ (r) => r.status === 'REQUIRES_EXTRA_INFORMATION' && r.rail.provider.code === 'BRIDGE'
+ )
+ const needsAdditionalDocs = bridgeRailsNeedingDocs.length > 0
+ // aggregate requirements across all rails and deduplicate
+ const additionalRequirements: string[] = needsAdditionalDocs
+ ? [
+ ...new Set(
+ bridgeRailsNeedingDocs.flatMap((r) => {
+ const reqs = r.metadata?.additionalRequirements
+ return Array.isArray(reqs) ? reqs : []
+ })
+ ),
+ ]
+ : []
+
+ // count sumsub rejections for failure lockout.
+ // counts total REJECTED entries — accurate if backend creates a new row per attempt.
+ // if backend updates in-place (single row), this will be 0 or 1 and the lockout
+ // won't trigger from count alone (terminal labels and rejectType still work).
+ const sumsubFailureCount =
+ user?.user?.kycVerifications?.filter((v) => v.provider === 'SUMSUB' && v.status === 'REJECTED').length ?? 0
+
+ const handleSubmitAdditionalDocs = async () => {
+ await initiateSumsub(undefined, 'peanut-additional-docs')
+ }
const renderContent = () => {
+ // bridge additional document requirement — but don't mask terminal kyc states
+ if (needsAdditionalDocs && statusCategory !== 'failed' && statusCategory !== 'action_required') {
+ return (
+
+ )
+ }
+
switch (statusCategory) {
case 'processing':
return (
@@ -93,10 +141,22 @@ export const KycStatusDrawer = ({ isOpen, onClose, verification, bridgeKycStatus
isBridge={isBridgeKyc}
/>
)
+ case 'action_required':
+ return (
+
+ )
case 'failed':
return (
KYC Status
{renderContent()}
+ {sumsubError && provider === 'SUMSUB' && (
+
{sumsubError}
+ )}
+
+
>
)
}
diff --git a/src/components/Kyc/KycStatusItem.tsx b/src/components/Kyc/KycStatusItem.tsx
index 1ca8536ed..7eae92316 100644
--- a/src/components/Kyc/KycStatusItem.tsx
+++ b/src/components/Kyc/KycStatusItem.tsx
@@ -10,6 +10,13 @@ import { twMerge } from 'tailwind-merge'
import { type IUserKycVerification } from '@/interfaces'
import StatusPill from '../Global/StatusPill'
import { KYCStatusIcon } from './KYCStatusIcon'
+import {
+ isKycStatusApproved,
+ isKycStatusPending,
+ isKycStatusFailed,
+ isKycStatusNotStarted,
+ isKycStatusActionRequired,
+} from '@/constants/kyc.consts'
// this component shows the current kyc status and opens a drawer with more details on click
export const KycStatusItem = ({
@@ -45,23 +52,26 @@ export const KycStatusItem = ({
const finalBridgeKycStatus = wsBridgeKycStatus || bridgeKycStatus || user?.user?.bridgeKycStatus
const kycStatus = verification ? verification.status : finalBridgeKycStatus
- // Check if KYC is approved to show points earned
- const isApproved = kycStatus === 'approved' || kycStatus === 'ACTIVE'
-
- const isPending = kycStatus === 'under_review' || kycStatus === 'incomplete' || kycStatus === 'ONBOARDING'
- const isRejected = kycStatus === 'rejected' || kycStatus === 'INACTIVE'
+ const isApproved = isKycStatusApproved(kycStatus)
+ const isPending = isKycStatusPending(kycStatus)
+ const isRejected = isKycStatusFailed(kycStatus)
+ const isActionRequired = isKycStatusActionRequired(kycStatus)
+ // if a verification record exists with NOT_STARTED, the user has initiated KYC
+ // (backend creates the record on initiation). only hide for bridge's default state.
+ const isInitiatedButNotStarted = !!verification && isKycStatusNotStarted(kycStatus)
const subtitle = useMemo(() => {
- if (isPending) {
- return 'Under review'
- }
- if (isApproved) {
- return 'Approved'
- }
- return 'Rejected'
- }, [isPending, isApproved, isRejected])
+ if (isInitiatedButNotStarted) return 'In progress'
+ if (isActionRequired) return 'Action needed'
+ if (isPending) return 'Under review'
+ if (isApproved) return 'Approved'
+ if (isRejected) return 'Rejected'
+ return 'Unknown'
+ }, [isInitiatedButNotStarted, isActionRequired, isPending, isApproved, isRejected])
- if (!kycStatus || kycStatus === 'not_started') {
+ // only hide for bridge's default "not_started" state.
+ // if a verification record exists, the user has initiated KYC — show it.
+ if (!verification && isKycStatusNotStarted(kycStatus)) {
return null
}
@@ -81,19 +91,29 @@ export const KycStatusItem = ({
Identity verification
{subtitle}
-
+
-
+ {isDrawerOpen && (
+
+ )}
>
)
}
diff --git a/src/components/Kyc/KycVerificationInProgressModal.tsx b/src/components/Kyc/KycVerificationInProgressModal.tsx
index 401aa0ba9..c7f23d04c 100644
--- a/src/components/Kyc/KycVerificationInProgressModal.tsx
+++ b/src/components/Kyc/KycVerificationInProgressModal.tsx
@@ -1,16 +1,34 @@
import { useRouter } from 'next/navigation'
import ActionModal from '@/components/Global/ActionModal'
-import { Icon, type IconName } from '@/components/Global/Icons/Icon'
-import { twMerge } from 'tailwind-merge'
+import { type IconName } from '@/components/Global/Icons/Icon'
+import { PeanutDoesntStoreAnyPersonalInformation } from '@/components/Kyc/PeanutDoesntStoreAnyPersonalInformation'
+import { type KycModalPhase } from '@/interfaces'
interface KycVerificationInProgressModalProps {
isOpen: boolean
onClose: () => void
+ phase?: KycModalPhase
+ onAcceptTerms?: () => void
+ onSkipTerms?: () => void
+ onContinue?: () => void
+ tosError?: string | null
+ isLoadingTos?: boolean
+ preparingTimedOut?: boolean
}
-// this modal is shown after the user submits their kyc information.
-// it waits for a final status from the websocket before disappearing.
-export const KycVerificationInProgressModal = ({ isOpen, onClose }: KycVerificationInProgressModalProps) => {
+// multi-phase modal shown during and after kyc verification.
+// phase transitions are controlled by the parent orchestrator (SumsubKycFlow).
+export const KycVerificationInProgressModal = ({
+ isOpen,
+ onClose,
+ phase = 'verifying',
+ onAcceptTerms,
+ onSkipTerms,
+ onContinue,
+ tosError,
+ isLoadingTos,
+ preparingTimedOut,
+}: KycVerificationInProgressModalProps) => {
const router = useRouter()
const handleGoHome = () => {
@@ -18,42 +36,124 @@ export const KycVerificationInProgressModal = ({ isOpen, onClose }: KycVerificat
router.push('/home')
}
- const descriptionWithInfo = (
-
- This usually takes less than a minute. You can stay here while we finish, or return to the home screen and
- we'll notify you when it's done.
-
- )
+ if (phase === 'verifying') {
+ return (
+
+ This usually takes less than a minute. You can stay here while we finish, or return to the home
+ screen and we'll notify you when it's done.
+
- {
- const { id, title } = country
- setUserClickedCountry({ id, title })
- setIsStartVerificationModalOpen(true)
- }}
- showLoadingState={false} // we don't want to show loading state when clicking a country, here because there is no async operation when clicking a country
- />
-
- )}
-
- {selectedCountry && (
-
- )}
-
- {userClickedCountry && selectedCountryParams && (
- {
- // we dont show ID issuer country list for bridge countries
- if (
- isBridgeSupportedCountry(selectedCountryParams.id) ||
- selectedCountryParams.id === 'bridge'
- ) {
- handleRedirect()
- } else {
- setIsStartVerificationModalOpen(false)
- }
- }}
- onStartVerification={() => {
- setIsStartVerificationModalOpen(false)
- if (isMantecaSupportedCountry(userClickedCountry.id)) {
- setSelectedCountry(userClickedCountry)
- setIsMantecaModalOpen(true)
- } else {
- setShowUserDetailsForm(true)
- }
- }}
- selectedIdentityCountry={userClickedCountry}
- selectedCountry={selectedCountryParams}
- />
- )}
-