diff --git a/__tests__/hooks/account-status-derivation.spec.ts b/__tests__/hooks/account-status-derivation.spec.ts new file mode 100644 index 000000000..e6b5054d5 --- /dev/null +++ b/__tests__/hooks/account-status-derivation.spec.ts @@ -0,0 +1,73 @@ +/** + * ENG-516 — light headline status fallbacks. + * + * `headlineFromLevel` / `capabilitiesFromLevel` are the client-side stand-ins + * for backends that don't expose `statusHeadline` / `capabilities` yet + * (lnflash/flash#452). They must match the backend derivation exactly: + * verified=L1+, bankPayout=L2+, business=L3, usdAccount orthogonal (Bridge KYC). + */ + +import { AccountLevel } from "@app/graphql/level-context" +import { + capabilitiesFromLevel, + headlineFromLevel, +} from "@app/hooks/account-status-derivation" + +describe("headlineFromLevel", () => { + it("maps NonAuth and ZERO to TRIAL", () => { + expect(headlineFromLevel(AccountLevel.NonAuth)).toBe("TRIAL") + expect(headlineFromLevel(AccountLevel.Zero)).toBe("TRIAL") + }) + + it("maps ONE and TWO to VERIFIED (L2 has no headline of its own)", () => { + expect(headlineFromLevel(AccountLevel.One)).toBe("VERIFIED") + expect(headlineFromLevel(AccountLevel.Two)).toBe("VERIFIED") + }) + + it("maps THREE to BUSINESS", () => { + expect(headlineFromLevel(AccountLevel.Three)).toBe("BUSINESS") + }) +}) + +describe("capabilitiesFromLevel", () => { + it("derives nothing for an unverified account", () => { + expect(capabilitiesFromLevel(AccountLevel.Zero, false)).toEqual({ + verified: false, + bankPayout: false, + business: false, + usdAccount: false, + }) + }) + + it("derives verified only at L1", () => { + expect(capabilitiesFromLevel(AccountLevel.One, false)).toEqual({ + verified: true, + bankPayout: false, + business: false, + usdAccount: false, + }) + }) + + it("adds bankPayout at L2", () => { + expect(capabilitiesFromLevel(AccountLevel.Two, false)).toEqual({ + verified: true, + bankPayout: true, + business: false, + usdAccount: false, + }) + }) + + it("adds business (keeping bankPayout) at L3", () => { + expect(capabilitiesFromLevel(AccountLevel.Three, false)).toEqual({ + verified: true, + bankPayout: true, + business: true, + usdAccount: false, + }) + }) + + it("keeps usdAccount orthogonal to level", () => { + expect(capabilitiesFromLevel(AccountLevel.Zero, true).usdAccount).toBe(true) + expect(capabilitiesFromLevel(AccountLevel.Three, false).usdAccount).toBe(false) + }) +}) diff --git a/__tests__/hooks/use-account-status.spec.ts b/__tests__/hooks/use-account-status.spec.ts new file mode 100644 index 000000000..d1a54493c --- /dev/null +++ b/__tests__/hooks/use-account-status.spec.ts @@ -0,0 +1,99 @@ +/** + * ENG-516 — useAccountStatus source selection. + * + * The derivation math is covered in account-status-derivation.spec.ts; this + * covers the wiring decision that every status surface depends on: backend + * `statusHeadline`/`capabilities` must take precedence over the level+KYC + * fallback, and the fallback must engage only when the backend lacks the + * fields (pre lnflash/flash#452). + */ + +import { renderHook } from "@testing-library/react-hooks" + +const mockUseAccountStatusQuery = jest.fn() +const mockUseBridgeKycStatusQuery = jest.fn() +const mockUseLevel = jest.fn() + +jest.mock("@app/graphql/generated", () => ({ + ...jest.requireActual("@app/graphql/generated"), + useAccountStatusQuery: (...args: unknown[]) => mockUseAccountStatusQuery(...args), + useBridgeKycStatusQuery: (...args: unknown[]) => mockUseBridgeKycStatusQuery(...args), +})) + +jest.mock("@app/graphql/level-context", () => ({ + ...jest.requireActual("@app/graphql/level-context"), + useLevel: () => mockUseLevel(), +})) + +jest.mock("@app/graphql/is-authed-context", () => ({ + useIsAuthed: () => true, +})) + +jest.mock("@app/config/feature-flags-context", () => ({ + useFeatureFlags: () => ({ bridgeTopupEnabled: true }), +})) + +import { AccountLevel } from "@app/graphql/level-context" +import { useAccountStatus } from "@app/hooks/use-account-status" + +describe("useAccountStatus", () => { + beforeEach(() => { + jest.clearAllMocks() + mockUseBridgeKycStatusQuery.mockReturnValue({ + data: { bridgeKycStatus: "approved" }, + }) + }) + + it("prefers backend statusHeadline + capabilities over the level fallback", () => { + // Level ZERO and KYC approved would derive TRIAL + usdAccount:true — + // the backend fields must win over both. + mockUseLevel.mockReturnValue({ currentLevel: AccountLevel.Zero }) + mockUseAccountStatusQuery.mockReturnValue({ + loading: false, + refetch: jest.fn(), + data: { + me: { + defaultAccount: { + id: "acct-1", + statusHeadline: "BUSINESS", + capabilities: { + verified: true, + bankPayout: true, + business: true, + usdAccount: false, + }, + }, + }, + }, + }) + + const { result } = renderHook(() => useAccountStatus()) + + expect(result.current.statusHeadline).toBe("BUSINESS") + expect(result.current.capabilities).toEqual({ + verified: true, + bankPayout: true, + business: true, + usdAccount: false, + }) + }) + + it("falls back to level + Bridge KYC when the backend lacks the fields", () => { + mockUseLevel.mockReturnValue({ currentLevel: AccountLevel.Two }) + mockUseAccountStatusQuery.mockReturnValue({ + loading: false, + refetch: jest.fn(), + data: { me: { defaultAccount: { id: "acct-1" } } }, + }) + + const { result } = renderHook(() => useAccountStatus()) + + expect(result.current.statusHeadline).toBe("VERIFIED") + expect(result.current.capabilities).toEqual({ + verified: true, + bankPayout: true, + business: false, + usdAccount: true, + }) + }) +}) diff --git a/app/graphql/generated.gql b/app/graphql/generated.gql index 25e7ad01a..eafee1127 100644 --- a/app/graphql/generated.gql +++ b/app/graphql/generated.gql @@ -1216,6 +1216,27 @@ query accountScreen { } } +query accountStatus { + me { + defaultAccount { + id + ... on ConsumerAccount { + statusHeadline + capabilities { + verified + bankPayout + business + usdAccount + __typename + } + __typename + } + __typename + } + __typename + } +} + query addressScreen { me { id diff --git a/app/graphql/generated.ts b/app/graphql/generated.ts index d7bc63f90..05889b5d6 100644 --- a/app/graphql/generated.ts +++ b/app/graphql/generated.ts @@ -49,7 +49,7 @@ export type Scalars = { /** BOLT11 lightning invoice payment request with the amount included */ LnPaymentRequest: { input: string; output: string; } LnPaymentSecret: { input: string; output: string; } - /** A bech32-encoded HTTPS/Onion URL that can be interacted with automatically by a WALLET in a standard way such that a SERVICE can provide extra services or a better experience for the user. Ref: https://github.com/lnurl/luds/blob/luds/01.md */ + /** A bech32-encoded HTTPS/Onion URL that can be interacted with automatically by a WALLET in a standard way such that a SERVICE can provide extra services or a better experience for the user. Ref: https://github.com/lnurl/luds/blob/luds/01.md */ Lnurl: { input: string; output: string; } /** Text field in a lightning payment transaction */ Memo: { input: string; output: string; } @@ -123,6 +123,40 @@ export type AccountTransactionsArgs = { walletIds?: InputMaybe>>; }; +export type AccountCapabilities = { + readonly __typename: 'AccountCapabilities'; + /** An approved bank account is on file for payouts. */ + readonly bankPayout: Scalars['Boolean']['output']; + /** Business profile (name and address) on file. */ + readonly business: Scalars['Boolean']['output']; + /** USD account and routing number available (Bridge KYC approved). Orthogonal to the other capabilities. */ + readonly usdAccount: Scalars['Boolean']['output']; + /** Phone and identity verified. */ + readonly verified: Scalars['Boolean']['output']; +}; + +export const AccountCapability = { + BankPayout: 'BANK_PAYOUT', + Business: 'BUSINESS' +} as const; + +export type AccountCapability = typeof AccountCapability[keyof typeof AccountCapability]; +export type AccountCapabilityUpgradeRequestInput = { + readonly address: AddressInput; + readonly bankAccount?: InputMaybe; + readonly capability: AccountCapability; + readonly fullName: Scalars['String']['input']; + readonly idDocument?: InputMaybe; + readonly terminalsRequested?: InputMaybe; +}; + +export type AccountCapabilityUpgradeRequestPayload = { + readonly __typename: 'AccountCapabilityUpgradeRequestPayload'; + readonly errors?: Maybe>>; + readonly id?: Maybe; + readonly status?: Maybe; +}; + export type AccountDeletePayload = { readonly __typename: 'AccountDeletePayload'; readonly errors: ReadonlyArray; @@ -174,6 +208,13 @@ export type AccountLimits = { readonly withdrawal: ReadonlyArray; }; +export const AccountStatusHeadline = { + Business: 'BUSINESS', + Trial: 'TRIAL', + Verified: 'VERIFIED' +} as const; + +export type AccountStatusHeadline = typeof AccountStatusHeadline[keyof typeof AccountStatusHeadline]; export type AccountUpdateDefaultWalletIdInput = { readonly walletId: Scalars['WalletId']['input']; }; @@ -252,6 +293,101 @@ export type AddressInput = { readonly title: Scalars['String']['input']; }; +export type ApiKey = { + readonly __typename: 'ApiKey'; + readonly createdAt: Scalars['Timestamp']['output']; + readonly expiresAt?: Maybe; + readonly id: Scalars['ID']['output']; + /** Public key identifier (the keyId in fk__) */ + readonly keyId: Scalars['String']['output']; + readonly lastUsedAt?: Maybe; + readonly name: Scalars['String']['output']; + /** Per-key request rate limit (requests per minute). Null means the platform default applies. */ + readonly rateLimitPerMinute?: Maybe; + readonly scopes: ReadonlyArray; + /** Effective status: keys past their expiry report EXPIRED even before the stored status catches up */ + readonly status: ApiKeyStatus; +}; + +export type ApiKeyCreateInput = { + /** Optional expiration time in seconds. If not set, the key doesn't expire. */ + readonly expiresIn?: InputMaybe; + /** A descriptive name for the API key (e.g., 'BTCPayServer Integration') */ + readonly name: Scalars['String']['input']; + /** Optional per-key request rate limit (requests per minute, 1-10000). If not set, the platform default applies. */ + readonly rateLimitPerMinute?: InputMaybe; + /** Permission scopes for the key. Defaults to read-only user access. */ + readonly scopes?: InputMaybe>; +}; + +export type ApiKeyCreatePayload = { + readonly __typename: 'ApiKeyCreatePayload'; + readonly apiKey?: Maybe; + readonly errors: ReadonlyArray; +}; + +export type ApiKeyCreated = { + readonly __typename: 'ApiKeyCreated'; + /** The raw API key. Store it securely — it won't be shown again. */ + readonly apiKey: Scalars['String']['output']; + readonly expiresAt?: Maybe; + readonly id: Scalars['ID']['output']; + /** Public key identifier (the keyId in fk__) */ + readonly keyId: Scalars['String']['output']; + readonly name: Scalars['String']['output']; + /** Per-key request rate limit (requests per minute). Null means the platform default applies. */ + readonly rateLimitPerMinute?: Maybe; + readonly scopes: ReadonlyArray; + readonly warning: Scalars['String']['output']; +}; + +export type ApiKeyRevokeInput = { + readonly id: Scalars['ID']['input']; +}; + +export type ApiKeyRevokePayload = { + readonly __typename: 'ApiKeyRevokePayload'; + readonly apiKey?: Maybe; + readonly errors: ReadonlyArray; +}; + +export type ApiKeyRotateInput = { + readonly id: Scalars['ID']['input']; +}; + +export type ApiKeyRotatePayload = { + readonly __typename: 'ApiKeyRotatePayload'; + readonly apiKey?: Maybe; + readonly errors: ReadonlyArray; +}; + +/** Permission scopes for API keys (FIP-07) */ +export const ApiKeyScope = { + /** Full administrative access */ + Admin: 'admin', + /** Read transaction history */ + ReadTransactions: 'read_transactions', + /** Read-only access to user/account data */ + ReadUser: 'read_user', + /** Read wallet balances and details */ + ReadWallet: 'read_wallet', + /** Create transactions */ + WriteTransactions: 'write_transactions', + /** Modify user/account data */ + WriteUser: 'write_user', + /** Perform wallet operations (send/receive) */ + WriteWallet: 'write_wallet' +} as const; + +export type ApiKeyScope = typeof ApiKeyScope[keyof typeof ApiKeyScope]; +/** Lifecycle status of an API key (FIP-07) */ +export const ApiKeyStatus = { + Active: 'ACTIVE', + Expired: 'EXPIRED', + Revoked: 'REVOKED' +} as const; + +export type ApiKeyStatus = typeof ApiKeyStatus[keyof typeof ApiKeyStatus]; export type AuthTokenPayload = { readonly __typename: 'AuthTokenPayload'; readonly authToken?: Maybe; @@ -312,7 +448,7 @@ export type BankAccount = { /** ERPNext bank account identifier */ readonly id?: Maybe; readonly isDefault: Scalars['Boolean']['output']; - /** An open request to change this account's details, awaiting review. Null when none is pending. */ + /** The account's in-flight update request when it needs the user's attention — Pending (awaiting review) or Rejected (declined). Null once approved/closed, or when none exists. */ readonly pendingUpdate?: Maybe; }; @@ -402,11 +538,22 @@ export type BridgeCreateVirtualAccountPayload = { readonly virtualAccount?: Maybe; }; +export type BridgeDeleteExternalAccountInput = { + readonly externalAccountId: Scalars['ID']['input']; +}; + +export type BridgeDeleteExternalAccountPayload = { + readonly __typename: 'BridgeDeleteExternalAccountPayload'; + readonly errors: ReadonlyArray; + readonly externalAccount?: Maybe; +}; + export type BridgeExternalAccount = { readonly __typename: 'BridgeExternalAccount'; readonly accountNumberLast4: Scalars['String']['output']; readonly bankName: Scalars['String']['output']; readonly id: Scalars['ID']['output']; + readonly isDefault: Scalars['Boolean']['output']; readonly status: Scalars['String']['output']; }; @@ -455,6 +602,16 @@ export type BridgeRequestWithdrawalPayload = { readonly withdrawal?: Maybe; }; +export type BridgeSetDefaultExternalAccountInput = { + readonly externalAccountId: Scalars['ID']['input']; +}; + +export type BridgeSetDefaultExternalAccountPayload = { + readonly __typename: 'BridgeSetDefaultExternalAccountPayload'; + readonly errors: ReadonlyArray; + readonly externalAccount?: Maybe; +}; + export type BridgeVirtualAccount = { readonly __typename: 'BridgeVirtualAccount'; readonly accountNumber?: Maybe; @@ -567,7 +724,8 @@ export type CashWalletCutover = { export const CashWalletCutoverState = { Complete: 'COMPLETE', InProgress: 'IN_PROGRESS', - Pre: 'PRE' + Pre: 'PRE', + RolledBack: 'ROLLED_BACK' } as const; export type CashWalletCutoverState = typeof CashWalletCutoverState[keyof typeof CashWalletCutoverState]; @@ -602,18 +760,21 @@ export type ConsumerAccount = Account & { readonly __typename: 'ConsumerAccount'; readonly btcWallet?: Maybe; readonly callbackEndpoints: ReadonlyArray; + readonly capabilities: AccountCapabilities; /** return CSV stream, base64 encoded, of the list of transactions in the wallet */ readonly csvTransactions: Scalars['String']['output']; readonly defaultWallet?: Maybe; readonly defaultWalletId: Scalars['WalletId']['output']; readonly displayCurrency: Scalars['DisplayCurrency']['output']; readonly id: Scalars['ID']['output']; + /** Internal account level, derived from capabilities (ENG-516). Present capabilities and statusHeadline instead of this. */ readonly level: AccountLevel; readonly limits: AccountLimits; readonly notificationSettings: NotificationSettings; /** List the quiz questions of the consumer account */ readonly quiz: ReadonlyArray; readonly realtimePrice: RealtimePrice; + readonly statusHeadline: AccountStatusHeadline; /** A list of all transactions associated with walletIds optionally passed. */ readonly transactions?: Maybe; readonly usdWallet?: Maybe; @@ -1054,6 +1215,7 @@ export type MobileVersions = { export type Mutation = { readonly __typename: 'Mutation'; + readonly accountCapabilityUpgradeRequest: AccountCapabilityUpgradeRequestPayload; readonly accountDelete: AccountDeletePayload; readonly accountDisableNotificationCategory: AccountUpdateNotificationSettingsPayload; readonly accountDisableNotificationChannel: AccountUpdateNotificationSettingsPayload; @@ -1061,14 +1223,22 @@ export type Mutation = { readonly accountEnableNotificationChannel: AccountUpdateNotificationSettingsPayload; readonly accountUpdateDefaultWalletId: AccountUpdateDefaultWalletIdPayload; readonly accountUpdateDisplayCurrency: AccountUpdateDisplayCurrencyPayload; + /** Generate a new API key for external service authentication. The raw key is only shown once and cannot be retrieved later. */ + readonly apiKeyCreate: ApiKeyCreatePayload; + /** Revoke an API key. Verification stops honoring it immediately; this cannot be undone. */ + readonly apiKeyRevoke: ApiKeyRevokePayload; + /** Rotate an API key: a replacement with a new secret (and keyId) is created with the same name, scopes, and expiry, and the old key is revoked. The new raw key is only shown once. */ + readonly apiKeyRotate: ApiKeyRotatePayload; readonly bankAccountUpdateRequest: BankAccountUpdateRequestPayload; readonly bridgeAddExternalAccount: BridgeAddExternalAccountPayload; readonly bridgeCancelWithdrawalRequest: BridgeCancelWithdrawalRequestPayload; readonly bridgeCreateExternalAccount: BridgeCreateExternalAccountPayload; readonly bridgeCreateVirtualAccount: BridgeCreateVirtualAccountPayload; + readonly bridgeDeleteExternalAccount: BridgeDeleteExternalAccountPayload; readonly bridgeInitiateKyc: BridgeInitiateKycPayload; readonly bridgeInitiateWithdrawal: BridgeInitiateWithdrawalPayload; readonly bridgeRequestWithdrawal: BridgeRequestWithdrawalPayload; + readonly bridgeSetDefaultExternalAccount: BridgeSetDefaultExternalAccountPayload; readonly businessAccountUpgradeRequest: AccountUpgradePayload; readonly callbackEndpointAdd: CallbackEndpointAddPayload; readonly callbackEndpointDelete: SuccessPayload; @@ -1198,6 +1368,11 @@ export type Mutation = { }; +export type MutationAccountCapabilityUpgradeRequestArgs = { + input: AccountCapabilityUpgradeRequestInput; +}; + + export type MutationAccountDisableNotificationCategoryArgs = { input: AccountDisableNotificationCategoryInput; }; @@ -1228,6 +1403,21 @@ export type MutationAccountUpdateDisplayCurrencyArgs = { }; +export type MutationApiKeyCreateArgs = { + input: ApiKeyCreateInput; +}; + + +export type MutationApiKeyRevokeArgs = { + input: ApiKeyRevokeInput; +}; + + +export type MutationApiKeyRotateArgs = { + input: ApiKeyRotateInput; +}; + + export type MutationBankAccountUpdateRequestArgs = { input: BankAccountUpdateRequestInput; }; @@ -1243,6 +1433,11 @@ export type MutationBridgeCreateExternalAccountArgs = { }; +export type MutationBridgeDeleteExternalAccountArgs = { + input: BridgeDeleteExternalAccountInput; +}; + + export type MutationBridgeInitiateKycArgs = { input: BridgeInitiateKycInput; }; @@ -1258,6 +1453,11 @@ export type MutationBridgeRequestWithdrawalArgs = { }; +export type MutationBridgeSetDefaultExternalAccountArgs = { + input: BridgeSetDefaultExternalAccountInput; +}; + + export type MutationBusinessAccountUpgradeRequestArgs = { input: BusinessAccountUpgradeRequestInput; }; @@ -1732,6 +1932,8 @@ export type PublicWallet = { export type Query = { readonly __typename: 'Query'; readonly accountDefaultWallet: PublicWallet; + /** All API keys for the calling account, newest first. Never includes secret material. */ + readonly apiKeys: ReadonlyArray; readonly beta: Scalars['Boolean']['output']; readonly bridgeExternalAccounts?: Maybe>>; readonly bridgeKycStatus?: Maybe; @@ -2884,6 +3086,11 @@ export type LevelQueryVariables = Exact<{ [key: string]: never; }>; export type LevelQuery = { readonly __typename: 'Query', readonly me?: { readonly __typename: 'User', readonly id: string, readonly defaultAccount: { readonly __typename: 'ConsumerAccount', readonly id: string, readonly level: AccountLevel } } | null }; +export type AccountStatusQueryVariables = Exact<{ [key: string]: never; }>; + + +export type AccountStatusQuery = { readonly __typename: 'Query', readonly me?: { readonly __typename: 'User', readonly defaultAccount: { readonly __typename: 'ConsumerAccount', readonly statusHeadline: AccountStatusHeadline, readonly id: string, readonly capabilities: { readonly __typename: 'AccountCapabilities', readonly verified: boolean, readonly bankPayout: boolean, readonly business: boolean, readonly usdAccount: boolean } } } | null }; + export type DisplayCurrencyQueryVariables = Exact<{ [key: string]: never; }>; @@ -6073,6 +6280,51 @@ export function useLevelLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions; export type LevelLazyQueryHookResult = ReturnType; export type LevelQueryResult = Apollo.QueryResult; +export const AccountStatusDocument = gql` + query accountStatus { + me { + defaultAccount { + id + ... on ConsumerAccount { + statusHeadline + capabilities { + verified + bankPayout + business + usdAccount + } + } + } + } +} + `; + +/** + * __useAccountStatusQuery__ + * + * To run a query within a React component, call `useAccountStatusQuery` and pass it any options that fit your needs. + * When your component renders, `useAccountStatusQuery` returns an object from Apollo Client that contains loading, error, and data properties + * you can use to render your UI. + * + * @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options; + * + * @example + * const { data, loading, error } = useAccountStatusQuery({ + * variables: { + * }, + * }); + */ +export function useAccountStatusQuery(baseOptions?: Apollo.QueryHookOptions) { + const options = {...defaultOptions, ...baseOptions} + return Apollo.useQuery(AccountStatusDocument, options); + } +export function useAccountStatusLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions) { + const options = {...defaultOptions, ...baseOptions} + return Apollo.useLazyQuery(AccountStatusDocument, options); + } +export type AccountStatusQueryHookResult = ReturnType; +export type AccountStatusLazyQueryHookResult = ReturnType; +export type AccountStatusQueryResult = Apollo.QueryResult; export const DisplayCurrencyDocument = gql` query displayCurrency { me { diff --git a/app/graphql/public-schema.graphql b/app/graphql/public-schema.graphql index aa3759bac..8a59aa075 100644 --- a/app/graphql/public-schema.graphql +++ b/app/graphql/public-schema.graphql @@ -25,6 +25,42 @@ interface Account { wallets: [Wallet!]! } +type AccountCapabilities { + """An approved bank account is on file for payouts.""" + bankPayout: Boolean! + + """Business profile (name and address) on file.""" + business: Boolean! + + """ + USD account and routing number available (Bridge KYC approved). Orthogonal to the other capabilities. + """ + usdAccount: Boolean! + + """Phone and identity verified.""" + verified: Boolean! +} + +enum AccountCapability { + BANK_PAYOUT + BUSINESS +} + +input AccountCapabilityUpgradeRequestInput { + address: AddressInput! + bankAccount: BankAccountInput + capability: AccountCapability! + fullName: String! + idDocument: String + terminalsRequested: Int = 0 +} + +type AccountCapabilityUpgradeRequestPayload { + errors: [Error] + id: String + status: String +} + type AccountDeletePayload { errors: [Error!]! success: Boolean! @@ -84,6 +120,12 @@ type AccountLimits { """Bank account number. Accepts String or Int and coerces to String.""" scalar AccountNumber +enum AccountStatusHeadline { + BUSINESS + TRIAL + VERIFIED +} + input AccountUpdateDefaultWalletIdInput { walletId: WalletId! } @@ -157,6 +199,118 @@ input AddressInput { title: String! } +type ApiKey { + createdAt: Timestamp! + expiresAt: Timestamp + id: ID! + + """Public key identifier (the keyId in fk__)""" + keyId: String! + lastUsedAt: Timestamp + name: String! + + """ + Per-key request rate limit (requests per minute). Null means the platform default applies. + """ + rateLimitPerMinute: Int + scopes: [ApiKeyScope!]! + + """ + Effective status: keys past their expiry report EXPIRED even before the stored status catches up + """ + status: ApiKeyStatus! +} + +input ApiKeyCreateInput { + """ + Optional expiration time in seconds. If not set, the key doesn't expire. + """ + expiresIn: Int + + """A descriptive name for the API key (e.g., 'BTCPayServer Integration')""" + name: String! + + """ + Optional per-key request rate limit (requests per minute, 1-10000). If not set, the platform default applies. + """ + rateLimitPerMinute: Int + + """Permission scopes for the key. Defaults to read-only user access.""" + scopes: [ApiKeyScope!] = [read_user] +} + +type ApiKeyCreatePayload { + apiKey: ApiKeyCreated + errors: [Error!]! +} + +type ApiKeyCreated { + """The raw API key. Store it securely — it won't be shown again.""" + apiKey: String! + expiresAt: Timestamp + id: ID! + + """Public key identifier (the keyId in fk__)""" + keyId: String! + name: String! + + """ + Per-key request rate limit (requests per minute). Null means the platform default applies. + """ + rateLimitPerMinute: Int + scopes: [ApiKeyScope!]! + warning: String! +} + +input ApiKeyRevokeInput { + id: ID! +} + +type ApiKeyRevokePayload { + apiKey: ApiKey + errors: [Error!]! +} + +input ApiKeyRotateInput { + id: ID! +} + +type ApiKeyRotatePayload { + apiKey: ApiKeyCreated + errors: [Error!]! +} + +"""Permission scopes for API keys (FIP-07)""" +enum ApiKeyScope { + """Full administrative access""" + admin + + """Read transaction history""" + read_transactions + + """Read-only access to user/account data""" + read_user + + """Read wallet balances and details""" + read_wallet + + """Create transactions""" + write_transactions + + """Modify user/account data""" + write_user + + """Perform wallet operations (send/receive)""" + write_wallet +} + +"""Lifecycle status of an API key (FIP-07)""" +enum ApiKeyStatus { + ACTIVE + EXPIRED + REVOKED +} + """An Opaque Bearer token""" scalar AuthToken @@ -233,7 +387,7 @@ type BankAccount { isDefault: Boolean! """ - An open request to change this account's details, awaiting review. Null when none is pending. + The account's in-flight update request when it needs the user's attention — Pending (awaiting review) or Rejected (declined). Null once approved/closed, or when none exists. """ pendingUpdate: BankAccountUpdateRequest } @@ -329,10 +483,20 @@ type BridgeCreateVirtualAccountPayload { virtualAccount: BridgeVirtualAccount } +input BridgeDeleteExternalAccountInput { + externalAccountId: ID! +} + +type BridgeDeleteExternalAccountPayload { + errors: [Error!]! + externalAccount: BridgeExternalAccount +} + type BridgeExternalAccount { accountNumberLast4: String! bankName: String! id: ID! + isDefault: Boolean! status: String! } @@ -376,6 +540,15 @@ type BridgeRequestWithdrawalPayload { withdrawal: BridgeWithdrawal } +input BridgeSetDefaultExternalAccountInput { + externalAccountId: ID! +} + +type BridgeSetDefaultExternalAccountPayload { + errors: [Error!]! + externalAccount: BridgeExternalAccount +} + type BridgeVirtualAccount { accountNumber: String accountNumberLast4: String @@ -481,6 +654,7 @@ enum CashWalletCutoverState { COMPLETE IN_PROGRESS PRE + ROLLED_BACK } type CashoutOffer { @@ -524,6 +698,7 @@ type CentAmountPayload { type ConsumerAccount implements Account { callbackEndpoints: [CallbackEndpoint!]! + capabilities: AccountCapabilities! """ return CSV stream, base64 encoded, of the list of transactions in the wallet @@ -532,6 +707,10 @@ type ConsumerAccount implements Account { defaultWalletId: WalletId! displayCurrency: DisplayCurrency! id: ID! + + """ + Internal account level, derived from capabilities (ENG-516). Present capabilities and statusHeadline instead of this. + """ level: AccountLevel! limits: AccountLimits! notificationSettings: NotificationSettings! @@ -539,6 +718,7 @@ type ConsumerAccount implements Account { """List the quiz questions of the consumer account""" quiz: [Quiz!]! realtimePrice: RealtimePrice! + statusHeadline: AccountStatusHeadline! """ A list of all transactions associated with walletIds optionally passed. @@ -998,7 +1178,7 @@ input LnUsdInvoiceFeeProbeInput { } """ -A bech32-encoded HTTPS/Onion URL that can be interacted with automatically by a WALLET in a standard way such that a SERVICE can provide extra services or a better experience for the user. Ref: https://github.com/lnurl/luds/blob/luds/01.md +A bech32-encoded HTTPS/Onion URL that can be interacted with automatically by a WALLET in a standard way such that a SERVICE can provide extra services or a better experience for the user. Ref: https://github.com/lnurl/luds/blob/luds/01.md """ scalar Lnurl @@ -1067,6 +1247,7 @@ type MobileVersions { } type Mutation { + accountCapabilityUpgradeRequest(input: AccountCapabilityUpgradeRequestInput!): AccountCapabilityUpgradeRequestPayload! accountDelete: AccountDeletePayload! accountDisableNotificationCategory(input: AccountDisableNotificationCategoryInput!): AccountUpdateNotificationSettingsPayload! accountDisableNotificationChannel(input: AccountDisableNotificationChannelInput!): AccountUpdateNotificationSettingsPayload! @@ -1074,14 +1255,31 @@ type Mutation { accountEnableNotificationChannel(input: AccountEnableNotificationChannelInput!): AccountUpdateNotificationSettingsPayload! accountUpdateDefaultWalletId(input: AccountUpdateDefaultWalletIdInput!): AccountUpdateDefaultWalletIdPayload! accountUpdateDisplayCurrency(input: AccountUpdateDisplayCurrencyInput!): AccountUpdateDisplayCurrencyPayload! + + """ + Generate a new API key for external service authentication. The raw key is only shown once and cannot be retrieved later. + """ + apiKeyCreate(input: ApiKeyCreateInput!): ApiKeyCreatePayload! + + """ + Revoke an API key. Verification stops honoring it immediately; this cannot be undone. + """ + apiKeyRevoke(input: ApiKeyRevokeInput!): ApiKeyRevokePayload! + + """ + Rotate an API key: a replacement with a new secret (and keyId) is created with the same name, scopes, and expiry, and the old key is revoked. The new raw key is only shown once. + """ + apiKeyRotate(input: ApiKeyRotateInput!): ApiKeyRotatePayload! + bankAccountUpdateRequest(input: BankAccountUpdateRequestInput!): BankAccountUpdateRequestPayload! bridgeAddExternalAccount: BridgeAddExternalAccountPayload! bridgeCancelWithdrawalRequest(input: BridgeCancelWithdrawalRequestInput!): BridgeCancelWithdrawalRequestPayload! bridgeCreateExternalAccount(input: BridgeCreateExternalAccountInput!): BridgeCreateExternalAccountPayload! bridgeCreateVirtualAccount: BridgeCreateVirtualAccountPayload! + bridgeDeleteExternalAccount(input: BridgeDeleteExternalAccountInput!): BridgeDeleteExternalAccountPayload! bridgeInitiateKyc(input: BridgeInitiateKycInput!): BridgeInitiateKycPayload! bridgeInitiateWithdrawal(input: BridgeInitiateWithdrawalInput!): BridgeInitiateWithdrawalPayload! bridgeRequestWithdrawal(input: BridgeRequestWithdrawalInput!): BridgeRequestWithdrawalPayload! - bankAccountUpdateRequest(input: BankAccountUpdateRequestInput!): BankAccountUpdateRequestPayload! + bridgeSetDefaultExternalAccount(input: BridgeSetDefaultExternalAccountInput!): BridgeSetDefaultExternalAccountPayload! businessAccountUpgradeRequest(input: BusinessAccountUpgradeRequestInput!): AccountUpgradePayload! callbackEndpointAdd(input: CallbackEndpointAddInput!): CallbackEndpointAddPayload! callbackEndpointDelete(input: CallbackEndpointDeleteInput!): SuccessPayload! @@ -1092,7 +1290,7 @@ type Mutation { idDocumentUploadUrlGenerate(input: IdDocumentUploadUrlGenerateInput!): IdDocumentUploadUrlPayload! """ - Start the Cashout process; + Start the Cashout process; User sends USD to Flash via Ibex and receives USD or JMD to bank account. """ initiateCashout(input: InitiateCashoutInput!): InitiatedCashoutResponse! @@ -1108,7 +1306,7 @@ type Mutation { Galoy: Actions a payment which is internal to the ledger e.g. it does not use onchain/lightning. Returns payment status (success, failed, pending, already_paid). - + Flash: We do not currently have an internal ledger. Consequently, intraledger payments have been updated to call Ibex instead. """ intraLedgerUsdPaymentSend(input: IntraLedgerUsdPaymentSendInput!): PaymentSendPayload! @@ -1456,6 +1654,11 @@ type PublicWallet { type Query { accountDefaultWallet(username: Username!, walletCurrency: WalletCurrency): PublicWallet! + + """ + All API keys for the calling account, newest first. Never includes secret material. + """ + apiKeys: [ApiKey!]! bridgeExternalAccounts: [BridgeExternalAccount] bridgeKycStatus: String bridgeVirtualAccount: BridgeVirtualAccount @@ -2149,4 +2352,4 @@ type npubByUsername { """Optional immutable user friendly identifier.""" username: Username -} +} \ No newline at end of file diff --git a/app/hooks/account-status-derivation.ts b/app/hooks/account-status-derivation.ts new file mode 100644 index 000000000..95c52a9ad --- /dev/null +++ b/app/hooks/account-status-derivation.ts @@ -0,0 +1,33 @@ +import { AccountLevel } from "@app/graphql/level-context" + +export type AccountStatusHeadline = "TRIAL" | "VERIFIED" | "BUSINESS" + +export type AccountCapabilities = { + verified: boolean + bankPayout: boolean + business: boolean + usdAccount: boolean +} + +// Fallbacks for older backends that don't expose statusHeadline/capabilities +// yet: the same derivations the backend uses (lnflash/flash#452), from the +// stored level. usdAccount is orthogonal to level — it comes from Bridge KYC. + +export const headlineFromLevel = (level: AccountLevel): AccountStatusHeadline => { + if (level === AccountLevel.Three) return "BUSINESS" + if (level === AccountLevel.One || level === AccountLevel.Two) return "VERIFIED" + return "TRIAL" +} + +export const capabilitiesFromLevel = ( + level: AccountLevel, + bridgeKycApproved: boolean, +): AccountCapabilities => ({ + verified: + level === AccountLevel.One || + level === AccountLevel.Two || + level === AccountLevel.Three, + bankPayout: level === AccountLevel.Two || level === AccountLevel.Three, + business: level === AccountLevel.Three, + usdAccount: bridgeKycApproved, +}) diff --git a/app/hooks/index.ts b/app/hooks/index.ts index 8850d1b58..06f495426 100644 --- a/app/hooks/index.ts +++ b/app/hooks/index.ts @@ -8,5 +8,6 @@ export * from "./useIbexFee" export * from "./useFlashcard" export * from "./useSwap" export * from "./use-transfer-flags" +export * from "./use-account-status" export * from "./use-unauthed-price-conversion" export * from "./useAccountUpgrade" diff --git a/app/hooks/use-account-status.ts b/app/hooks/use-account-status.ts new file mode 100644 index 000000000..2aa817959 --- /dev/null +++ b/app/hooks/use-account-status.ts @@ -0,0 +1,73 @@ +import { gql } from "@apollo/client" + +import { useFeatureFlags } from "@app/config/feature-flags-context" +import { useAccountStatusQuery, useBridgeKycStatusQuery } from "@app/graphql/generated" +import { useIsAuthed } from "@app/graphql/is-authed-context" +import { useLevel } from "@app/graphql/level-context" + +import { + AccountCapabilities, + AccountStatusHeadline, + capabilitiesFromLevel, + headlineFromLevel, +} from "./account-status-derivation" + +gql` + query accountStatus { + me { + defaultAccount { + id + ... on ConsumerAccount { + statusHeadline + capabilities { + verified + bankPayout + business + usdAccount + } + } + } + } + } +` + +/** + * ENG-516 "light headline status": the account leads with one word — + * Trial → Verified → Business — with capability badges as supporting detail. + * Pro/International/Merchant are retired as user-facing tiers; the numeric + * level is internal. + * + * `capabilities` is always defined: the backend object when available, else + * the level-derived fallback (with Bridge KYC status standing in for + * usdAccount). This is the single source of capability truth — screens must + * not re-derive from the level. + */ +export const useAccountStatus = () => { + const isAuthed = useIsAuthed() + const { currentLevel } = useLevel() + const { bridgeTopupEnabled } = useFeatureFlags() + + const { data, loading, refetch } = useAccountStatusQuery({ + fetchPolicy: "cache-and-network", + skip: !isAuthed, + }) + + // Only feeds the usdAccount fallback; Apollo dedupes it against other + // watchers of the same query (useBridgeKyc, useBankAccounts). + const { data: kycData } = useBridgeKycStatusQuery({ + fetchPolicy: "cache-and-network", + skip: !isAuthed || !bridgeTopupEnabled, + }) + + const account = data?.me?.defaultAccount + const statusHeadline: AccountStatusHeadline = + (account && "statusHeadline" in account && account.statusHeadline) || + headlineFromLevel(currentLevel) + + const capabilities: AccountCapabilities = + account && "capabilities" in account && account.capabilities + ? account.capabilities + : capabilitiesFromLevel(currentLevel, kycData?.bridgeKycStatus === "approved") + + return { statusHeadline, capabilities, loading, refetch } +} diff --git a/app/hooks/use-bridge-kyc.ts b/app/hooks/use-bridge-kyc.ts new file mode 100644 index 000000000..83aec1689 --- /dev/null +++ b/app/hooks/use-bridge-kyc.ts @@ -0,0 +1,103 @@ +import { useCallback, useState } from "react" +import { Alert } from "react-native" +import { useNavigation } from "@react-navigation/native" +import { StackNavigationProp } from "@react-navigation/stack" + +import { + useBridgeInitiateKycMutation, + useBridgeKycStatusQuery, +} from "@app/graphql/generated" +import { useFeatureFlags } from "@app/config/feature-flags-context" +import { useI18nContext } from "@app/i18n/i18n-react" +import { RootStackParamList } from "@app/navigation/stack-param-lists" + +import { useActivityIndicator } from "./useActivityIndicator" + +export type BridgeKycDetails = { + fullName: string + email: string + kycType: string +} + +/** + * Bridge KYC entry point (the usdAccount capability, ENG-516). Owns the + * status query, the details-modal visibility, and the initiate-KYC mutation; + * callers render wired to the returned state. Extracted from + * AccountType so other screens (e.g. Bank accounts) can launch KYC directly + * instead of routing through the upgrade picker. + */ +export const useBridgeKyc = () => { + const navigation = useNavigation>() + const { bridgeTopupEnabled } = useFeatureFlags() + const { toggleActivityIndicator } = useActivityIndicator() + const { LL } = useI18nContext() + + const [kycModalVisible, setKycModalVisible] = useState(false) + + const [initiateBridgeKyc] = useBridgeInitiateKycMutation() + const { data: kycStatusData, refetch: refetchKycStatus } = useBridgeKycStatusQuery({ + fetchPolicy: "cache-and-network", + skip: !bridgeTopupEnabled, + }) + + const bridgeKycStatus = kycStatusData?.bridgeKycStatus + + // No-op when Bridge is remotely disabled; alerts instead of opening the + // modal while a KYC submission is already pending. + const startBridgeKyc = useCallback(() => { + if (!bridgeTopupEnabled) return + if (bridgeKycStatus === "pending") { + Alert.alert(LL.BridgeKyc.pendingTitle(), LL.BridgeKyc.pendingBody()) + return + } + setKycModalVisible(true) + }, [bridgeTopupEnabled, bridgeKycStatus, LL]) + + const closeKycModal = useCallback(() => setKycModalVisible(false), []) + + const submitBridgeKyc = useCallback( + async (details: BridgeKycDetails) => { + setKycModalVisible(false) + toggleActivityIndicator(true) + try { + const res = await initiateBridgeKyc({ + variables: { + input: { + // eslint-disable-next-line camelcase -- GraphQL input field name + full_name: details.fullName, + email: details.email, + type: details.kycType, + }, + }, + }) + toggleActivityIndicator(false) + const errors = res.data?.bridgeInitiateKyc?.errors + if (errors && errors.length > 0) { + Alert.alert(LL.common.error(), errors[0].message) + return + } + const kycLink = res.data?.bridgeInitiateKyc?.kycLink + if (kycLink?.tosLink && kycLink?.kycLink) { + navigation.navigate("BridgeKycWebView", { + tosLink: kycLink.tosLink, + kycLink: kycLink.kycLink, + }) + } + } catch (err) { + toggleActivityIndicator(false) + Alert.alert(LL.common.error(), LL.BridgeKyc.genericError()) + } + }, + [initiateBridgeKyc, navigation, toggleActivityIndicator, LL], + ) + + return { + bridgeTopupEnabled, + bridgeKycStatus, + refetchKycStatus, + kycModalVisible, + startBridgeKyc, + closeKycModal, + submitBridgeKyc, + } +} diff --git a/app/i18n/en/index.ts b/app/i18n/en/index.ts index 6cf5d3b84..be25cfc80 100644 --- a/app/i18n/en/index.ts +++ b/app/i18n/en/index.ts @@ -694,8 +694,11 @@ const en: BaseTranslation = { minimumAmount: "Minimum amount is $1.00" }, BridgeKyc: { - title: "International Transfer", - description: "Please provide your details to set up international transfers", + title: "USD Account", + description: "Please provide your details to set up your USD account", + pendingTitle: "Verification pending", + pendingBody: "Your identity verification is pending. Please wait for approval.", + genericError: "Something went wrong. Please try again.", fullName: "Full Name", fullNamePlaceholder: "Enter your full name", email: "Email", @@ -1743,15 +1746,6 @@ const en: BaseTranslation = { } }, AccountUpgrade: { - accountType: "Account Type", - personal: "Personal", - personalDesc: "Secure your wallet with phone and email. Stay safe and recover easily if needed", - pro: "Pro", - proDesc: "Accept payments and get discovered on the map. Requires a business name and location.", - merchant: "Merchant", - merchantDesc: "Give rewards, appear on the map, and settle to your bank. ID and bank info required.", - international: "International", - internationalDesc: "Get an international account and routing number for bank transfers. ID required.", personalInfo: "Personal Information", fullName: "Full name", phoneNumber: "Phone Number", @@ -1777,9 +1771,32 @@ const en: BaseTranslation = { selectCurrency: "Select Currency", accountNum: "Account Number", accountNumPlaceholder: "Enter your account number", - uploadId: "Upload ID Document", - successUpgrade: "You successfully upgraded your account to {accountType: string}", - successRequest: "You successfully requested to upgrade your account to {accountType: string}" + uploadId: "Upload ID Document", + successVerified: "Your account is verified", + successBankPayoutRequest: "Your bank cash-out request has been submitted for review", + successBusinessRequest: "Your business upgrade request has been submitted for review", + hubEyebrow: "Your Flash account", + hubTitle: "Do more with Flash", + statusTrial: "Trial account", + statusVerified: "Verified", + statusBusiness: "Business", + statusUnauthorized: "Unauthorized account", + badgeBankPayout: "Bank payout", + badgeUsdAccount: "USD account", + sectionGetPaid: "Ways to get paid", + sectionGrow: "Grow", + verifyTitle: "Verify your account", + verifyDesc: "Just your phone number · unlocks higher limits in a minute", + bankCashoutTitle: "Bank cash-out", + bankCashoutDesc: "Cash out JMD to your Jamaican bank", + usdAccountTitle: "USD Virtual Bank Account", + usdAccountDesc: "Your own US account & routing number — receive ACH, wires & payroll", + lockedVerifyFirst: "Verify your account first to unlock", + businessTitle: "Business", + businessDesc: "Get on the Flash map & reward your customers", + setUp: "Set up", + enabled: "On", + inReview: "In review" } } diff --git a/app/i18n/i18n-types.ts b/app/i18n/i18n-types.ts index 375dfcc87..5d50682c6 100644 --- a/app/i18n/i18n-types.ts +++ b/app/i18n/i18n-types.ts @@ -2230,13 +2230,25 @@ type RootTranslation = { } BridgeKyc: { /** - * I​n​t​e​r​n​a​t​i​o​n​a​l​ ​T​r​a​n​s​f​e​r + * U​S​D​ ​A​c​c​o​u​n​t */ title: string /** - * P​l​e​a​s​e​ ​p​r​o​v​i​d​e​ ​y​o​u​r​ ​d​e​t​a​i​l​s​ ​t​o​ ​s​e​t​ ​u​p​ ​i​n​t​e​r​n​a​t​i​o​n​a​l​ ​t​r​a​n​s​f​e​r​s + * P​l​e​a​s​e​ ​p​r​o​v​i​d​e​ ​y​o​u​r​ ​d​e​t​a​i​l​s​ ​t​o​ ​s​e​t​ ​u​p​ ​y​o​u​r​ ​U​S​D​ ​a​c​c​o​u​n​t */ description: string + /** + * V​e​r​i​f​i​c​a​t​i​o​n​ ​p​e​n​d​i​n​g + */ + pendingTitle: string + /** + * Y​o​u​r​ ​i​d​e​n​t​i​t​y​ ​v​e​r​i​f​i​c​a​t​i​o​n​ ​i​s​ ​p​e​n​d​i​n​g​.​ ​P​l​e​a​s​e​ ​w​a​i​t​ ​f​o​r​ ​a​p​p​r​o​v​a​l​. + */ + pendingBody: string + /** + * S​o​m​e​t​h​i​n​g​ ​w​e​n​t​ ​w​r​o​n​g​.​ ​P​l​e​a​s​e​ ​t​r​y​ ​a​g​a​i​n​. + */ + genericError: string /** * F​u​l​l​ ​N​a​m​e */ @@ -5805,42 +5817,6 @@ type RootTranslation = { } } AccountUpgrade: { - /** - * A​c​c​o​u​n​t​ ​T​y​p​e - */ - accountType: string - /** - * P​e​r​s​o​n​a​l - */ - personal: string - /** - * S​e​c​u​r​e​ ​y​o​u​r​ ​w​a​l​l​e​t​ ​w​i​t​h​ ​p​h​o​n​e​ ​a​n​d​ ​e​m​a​i​l​.​ ​S​t​a​y​ ​s​a​f​e​ ​a​n​d​ ​r​e​c​o​v​e​r​ ​e​a​s​i​l​y​ ​i​f​ ​n​e​e​d​e​d - */ - personalDesc: string - /** - * P​r​o - */ - pro: string - /** - * A​c​c​e​p​t​ ​p​a​y​m​e​n​t​s​ ​a​n​d​ ​g​e​t​ ​d​i​s​c​o​v​e​r​e​d​ ​o​n​ ​t​h​e​ ​m​a​p​.​ ​R​e​q​u​i​r​e​s​ ​a​ ​b​u​s​i​n​e​s​s​ ​n​a​m​e​ ​a​n​d​ ​l​o​c​a​t​i​o​n​. - */ - proDesc: string - /** - * M​e​r​c​h​a​n​t - */ - merchant: string - /** - * G​i​v​e​ ​r​e​w​a​r​d​s​,​ ​a​p​p​e​a​r​ ​o​n​ ​t​h​e​ ​m​a​p​,​ ​a​n​d​ ​s​e​t​t​l​e​ ​t​o​ ​y​o​u​r​ ​b​a​n​k​.​ ​I​D​ ​a​n​d​ ​b​a​n​k​ ​i​n​f​o​ ​r​e​q​u​i​r​e​d​. - */ - merchantDesc: string - /** - * I​n​t​e​r​n​a​t​i​o​n​a​l - */ - international: string - /** - * G​e​t​ ​a​n​ ​i​n​t​e​r​n​a​t​i​o​n​a​l​ ​a​c​c​o​u​n​t​ ​a​n​d​ ​r​o​u​t​i​n​g​ ​n​u​m​b​e​r​ ​f​o​r​ ​b​a​n​k​ ​t​r​a​n​s​f​e​r​s​.​ ​I​D​ ​r​e​q​u​i​r​e​d​. - */ - internationalDesc: string /** * P​e​r​s​o​n​a​l​ ​I​n​f​o​r​m​a​t​i​o​n */ @@ -5946,15 +5922,105 @@ type RootTranslation = { */ uploadId: string /** - * Y​o​u​ ​s​u​c​c​e​s​s​f​u​l​l​y​ ​u​p​g​r​a​d​e​d​ ​y​o​u​r​ ​a​c​c​o​u​n​t​ ​t​o​ ​{​a​c​c​o​u​n​t​T​y​p​e​} - * @param {string} accountType + * Y​o​u​r​ ​a​c​c​o​u​n​t​ ​i​s​ ​v​e​r​i​f​i​e​d + */ + successVerified: string + /** + * Y​o​u​r​ ​b​a​n​k​ ​c​a​s​h​-​o​u​t​ ​r​e​q​u​e​s​t​ ​h​a​s​ ​b​e​e​n​ ​s​u​b​m​i​t​t​e​d​ ​f​o​r​ ​r​e​v​i​e​w + */ + successBankPayoutRequest: string + /** + * Y​o​u​r​ ​b​u​s​i​n​e​s​s​ ​u​p​g​r​a​d​e​ ​r​e​q​u​e​s​t​ ​h​a​s​ ​b​e​e​n​ ​s​u​b​m​i​t​t​e​d​ ​f​o​r​ ​r​e​v​i​e​w + */ + successBusinessRequest: string + /** + * Y​o​u​r​ ​F​l​a​s​h​ ​a​c​c​o​u​n​t + */ + hubEyebrow: string + /** + * D​o​ ​m​o​r​e​ ​w​i​t​h​ ​F​l​a​s​h + */ + hubTitle: string + /** + * T​r​i​a​l​ ​a​c​c​o​u​n​t + */ + statusTrial: string + /** + * V​e​r​i​f​i​e​d + */ + statusVerified: string + /** + * B​u​s​i​n​e​s​s + */ + statusBusiness: string + /** + * U​n​a​u​t​h​o​r​i​z​e​d​ ​a​c​c​o​u​n​t + */ + statusUnauthorized: string + /** + * B​a​n​k​ ​p​a​y​o​u​t + */ + badgeBankPayout: string + /** + * U​S​D​ ​a​c​c​o​u​n​t + */ + badgeUsdAccount: string + /** + * W​a​y​s​ ​t​o​ ​g​e​t​ ​p​a​i​d + */ + sectionGetPaid: string + /** + * G​r​o​w + */ + sectionGrow: string + /** + * V​e​r​i​f​y​ ​y​o​u​r​ ​a​c​c​o​u​n​t + */ + verifyTitle: string + /** + * J​u​s​t​ ​y​o​u​r​ ​p​h​o​n​e​ ​n​u​m​b​e​r​ ​·​ ​u​n​l​o​c​k​s​ ​h​i​g​h​e​r​ ​l​i​m​i​t​s​ ​i​n​ ​a​ ​m​i​n​u​t​e + */ + verifyDesc: string + /** + * B​a​n​k​ ​c​a​s​h​-​o​u​t + */ + bankCashoutTitle: string + /** + * C​a​s​h​ ​o​u​t​ ​J​M​D​ ​t​o​ ​y​o​u​r​ ​J​a​m​a​i​c​a​n​ ​b​a​n​k + */ + bankCashoutDesc: string + /** + * U​S​D​ ​V​i​r​t​u​a​l​ ​B​a​n​k​ ​A​c​c​o​u​n​t + */ + usdAccountTitle: string + /** + * Y​o​u​r​ ​o​w​n​ ​U​S​ ​a​c​c​o​u​n​t​ ​&​ ​r​o​u​t​i​n​g​ ​n​u​m​b​e​r​ ​—​ ​r​e​c​e​i​v​e​ ​A​C​H​,​ ​w​i​r​e​s​ ​&​ ​p​a​y​r​o​l​l + */ + usdAccountDesc: string + /** + * V​e​r​i​f​y​ ​y​o​u​r​ ​a​c​c​o​u​n​t​ ​f​i​r​s​t​ ​t​o​ ​u​n​l​o​c​k + */ + lockedVerifyFirst: string + /** + * B​u​s​i​n​e​s​s + */ + businessTitle: string + /** + * G​e​t​ ​o​n​ ​t​h​e​ ​F​l​a​s​h​ ​m​a​p​ ​&​ ​r​e​w​a​r​d​ ​y​o​u​r​ ​c​u​s​t​o​m​e​r​s + */ + businessDesc: string + /** + * S​e​t​ ​u​p */ - successUpgrade: RequiredParams<'accountType'> + setUp: string + /** + * O​n + */ + enabled: string /** - * Y​o​u​ ​s​u​c​c​e​s​s​f​u​l​l​y​ ​r​e​q​u​e​s​t​e​d​ ​t​o​ ​u​p​g​r​a​d​e​ ​y​o​u​r​ ​a​c​c​o​u​n​t​ ​t​o​ ​{​a​c​c​o​u​n​t​T​y​p​e​} - * @param {string} accountType + * I​n​ ​r​e​v​i​e​w */ - successRequest: RequiredParams<'accountType'> + inReview: string } } @@ -8140,13 +8206,25 @@ export type TranslationFunctions = { } BridgeKyc: { /** - * International Transfer + * USD Account */ title: () => LocalizedString /** - * Please provide your details to set up international transfers + * Please provide your details to set up your USD account */ description: () => LocalizedString + /** + * Verification pending + */ + pendingTitle: () => LocalizedString + /** + * Your identity verification is pending. Please wait for approval. + */ + pendingBody: () => LocalizedString + /** + * Something went wrong. Please try again. + */ + genericError: () => LocalizedString /** * Full Name */ @@ -11631,42 +11709,6 @@ export type TranslationFunctions = { } } AccountUpgrade: { - /** - * Account Type - */ - accountType: () => LocalizedString - /** - * Personal - */ - personal: () => LocalizedString - /** - * Secure your wallet with phone and email. Stay safe and recover easily if needed - */ - personalDesc: () => LocalizedString - /** - * Pro - */ - pro: () => LocalizedString - /** - * Accept payments and get discovered on the map. Requires a business name and location. - */ - proDesc: () => LocalizedString - /** - * Merchant - */ - merchant: () => LocalizedString - /** - * Give rewards, appear on the map, and settle to your bank. ID and bank info required. - */ - merchantDesc: () => LocalizedString - /** - * International - */ - international: () => LocalizedString - /** - * Get an international account and routing number for bank transfers. ID required. - */ - internationalDesc: () => LocalizedString /** * Personal Information */ @@ -11772,13 +11814,105 @@ export type TranslationFunctions = { */ uploadId: () => LocalizedString /** - * You successfully upgraded your account to {accountType} + * Your account is verified + */ + successVerified: () => LocalizedString + /** + * Your bank cash-out request has been submitted for review + */ + successBankPayoutRequest: () => LocalizedString + /** + * Your business upgrade request has been submitted for review + */ + successBusinessRequest: () => LocalizedString + /** + * Your Flash account + */ + hubEyebrow: () => LocalizedString + /** + * Do more with Flash + */ + hubTitle: () => LocalizedString + /** + * Trial account + */ + statusTrial: () => LocalizedString + /** + * Verified + */ + statusVerified: () => LocalizedString + /** + * Business + */ + statusBusiness: () => LocalizedString + /** + * Unauthorized account + */ + statusUnauthorized: () => LocalizedString + /** + * Bank payout + */ + badgeBankPayout: () => LocalizedString + /** + * USD account + */ + badgeUsdAccount: () => LocalizedString + /** + * Ways to get paid + */ + sectionGetPaid: () => LocalizedString + /** + * Grow + */ + sectionGrow: () => LocalizedString + /** + * Verify your account + */ + verifyTitle: () => LocalizedString + /** + * Just your phone number · unlocks higher limits in a minute + */ + verifyDesc: () => LocalizedString + /** + * Bank cash-out + */ + bankCashoutTitle: () => LocalizedString + /** + * Cash out JMD to your Jamaican bank + */ + bankCashoutDesc: () => LocalizedString + /** + * USD Virtual Bank Account + */ + usdAccountTitle: () => LocalizedString + /** + * Your own US account & routing number — receive ACH, wires & payroll + */ + usdAccountDesc: () => LocalizedString + /** + * Verify your account first to unlock + */ + lockedVerifyFirst: () => LocalizedString + /** + * Business + */ + businessTitle: () => LocalizedString + /** + * Get on the Flash map & reward your customers + */ + businessDesc: () => LocalizedString + /** + * Set up */ - successUpgrade: (arg: { accountType: string }) => LocalizedString + setUp: () => LocalizedString + /** + * On + */ + enabled: () => LocalizedString /** - * You successfully requested to upgrade your account to {accountType} + * In review */ - successRequest: (arg: { accountType: string }) => LocalizedString + inReview: () => LocalizedString } } diff --git a/app/i18n/raw-i18n/source/en.json b/app/i18n/raw-i18n/source/en.json index 4d517beb4..541e9ae4b 100644 --- a/app/i18n/raw-i18n/source/en.json +++ b/app/i18n/raw-i18n/source/en.json @@ -654,8 +654,11 @@ "minimumAmount": "Minimum amount is $1.00" }, "BridgeKyc": { - "title": "International Transfer", - "description": "Please provide your details to set up international transfers", + "title": "USD Account", + "description": "Please provide your details to set up your USD account", + "pendingTitle": "Verification pending", + "pendingBody": "Your identity verification is pending. Please wait for approval.", + "genericError": "Something went wrong. Please try again.", "fullName": "Full Name", "fullNamePlaceholder": "Enter your full name", "email": "Email", @@ -1635,15 +1638,6 @@ } }, "AccountUpgrade": { - "accountType": "Account Type", - "personal": "Personal", - "personalDesc": "Secure your wallet with phone and email. Stay safe and recover easily if needed", - "pro": "Pro", - "proDesc": "Accept payments and get discovered on the map. Requires a business name and location.", - "merchant": "Merchant", - "merchantDesc": "Give rewards, appear on the map, and settle to your bank. ID and bank info required.", - "international": "International", - "internationalDesc": "Get an international account and routing number for bank transfers. ID required.", "personalInfo": "Personal Information", "fullName": "Full name", "phoneNumber": "Phone Number", @@ -1670,7 +1664,30 @@ "accountNum": "Account Number", "accountNumPlaceholder": "Enter your account number", "uploadId": "Upload ID Document", - "successUpgrade": "You successfully upgraded your account to {accountType: string}", - "successRequest": "You successfully requested to upgrade your account to {accountType: string}" + "successVerified": "Your account is verified", + "successBankPayoutRequest": "Your bank cash-out request has been submitted for review", + "successBusinessRequest": "Your business upgrade request has been submitted for review", + "hubEyebrow": "Your Flash account", + "hubTitle": "Do more with Flash", + "statusTrial": "Trial account", + "statusVerified": "Verified", + "statusBusiness": "Business", + "statusUnauthorized": "Unauthorized account", + "badgeBankPayout": "Bank payout", + "badgeUsdAccount": "USD account", + "sectionGetPaid": "Ways to get paid", + "sectionGrow": "Grow", + "verifyTitle": "Verify your account", + "verifyDesc": "Just your phone number · unlocks higher limits in a minute", + "bankCashoutTitle": "Bank cash-out", + "bankCashoutDesc": "Cash out JMD to your Jamaican bank", + "usdAccountTitle": "USD Virtual Bank Account", + "usdAccountDesc": "Your own US account & routing number — receive ACH, wires & payroll", + "lockedVerifyFirst": "Verify your account first to unlock", + "businessTitle": "Business", + "businessDesc": "Get on the Flash map & reward your customers", + "setUp": "Set up", + "enabled": "On", + "inReview": "In review" } } diff --git a/app/i18n/raw-i18n/translations/af.json b/app/i18n/raw-i18n/translations/af.json index 01a91cc51..e1b240fd6 100644 --- a/app/i18n/raw-i18n/translations/af.json +++ b/app/i18n/raw-i18n/translations/af.json @@ -1206,7 +1206,6 @@ "AccountUpgrade": { "accountNum": "Account Number", "accountNumPlaceholder": "Enter your account number", - "accountType": "Account Type", "bankAccountType": "Account Type", "bankBranch": "Bank Branch", "bankBranchPlaceholder": "Enter your bank branch", @@ -1223,24 +1222,39 @@ "flashTerminal": "Do you want a Flash terminal?", "flashTerminalTooltip": "A Flash Terminal is a smart device that can accept payment via Flash for your business and print receipts. A customer service representative will contact you if you check this box.", "fullName": "Full name", - "merchant": "Merchant", - "merchantDesc": "Give rewards, appear on the map, and settle to your bank. ID and bank info required.", "optional": " (Optional)", - "personal": "Personal", - "personalDesc": "Secure your wallet with phone and email. Stay safe and recover easily if needed", "personalInfo": "Personal Information", "phoneNumber": "Phone Number", - "pro": "Pro", - "proDesc": "Accept payments and get discovered on the map. Requires a business name and location.", "selectBankAccountType": "Select account type", "selectCurrency": "Select Currency", - "successRequest": "You successfully requested to upgrade your account to {accountType: string}", - "successUpgrade": "You successfully upgraded your account to {accountType: string}", "uploadId": "Upload ID Document", "validation": "Validation", "validationCode": "Validation code", - "international": "International", - "internationalDesc": "Get an international account and routing number for bank transfers. ID required." + "badgeBankPayout": "Bankuitbetaling", + "badgeUsdAccount": "USD-rekening", + "bankCashoutTitle": "Bankuitbetaling", + "bankCashoutDesc": "Betaal JMD uit na jou Jamaikaanse bank", + "businessTitle": "Besigheid", + "businessDesc": "Kom op die Flash-kaart & beloon jou klante", + "enabled": "Aan", + "hubEyebrow": "Jou Flash-rekening", + "hubTitle": "Doen meer met Flash", + "inReview": "Onder hersiening", + "sectionGetPaid": "Maniere om betaal te word", + "sectionGrow": "Groei", + "setUp": "Stel op", + "statusBusiness": "Besigheid", + "statusTrial": "Proefrekening", + "statusUnauthorized": "Ongemagtigde rekening", + "statusVerified": "Geverifieer", + "successBankPayoutRequest": "Jou bankuitbetalingsversoek is vir hersiening ingedien", + "successBusinessRequest": "Jou besigheidsopgraderingsversoek is vir hersiening ingedien", + "successVerified": "Jou rekening is geverifieer", + "usdAccountTitle": "Virtuele USD-bankrekening", + "usdAccountDesc": "Jou eie VSA-rekening- en routingnommer — ontvang ACH, oorbetalings & salaris", + "verifyTitle": "Verifieer jou rekening", + "verifyDesc": "Net jou foonnommer · ontsluit hoër limiete binne 'n minuut", + "lockedVerifyFirst": "Verifieer eers jou rekening om te ontsluit" }, "AdvancedModeModal": { "body": "- Your BTC is non-custodial, fees may apply.\n- You can swap between BTC and USD.\n- BTC may take up to 60s to confirm.\n\nDO NOT SHARE YOUR RECOVERY PHRASE!", @@ -1539,8 +1553,8 @@ "minimumAmount": "Minimum amount is $1.00" }, "BridgeKyc": { - "title": "International Transfer", - "description": "Please provide your details to set up international transfers", + "title": "USD-rekening", + "description": "Verskaf asseblief jou besonderhede om jou USD-rekening op te stel", "fullName": "Full Name", "fullNamePlaceholder": "Enter your full name", "email": "Email", @@ -1553,7 +1567,10 @@ "fullNameRequired": "Full name is required", "emailRequired": "Email is required", "invalidEmail": "Please enter a valid email address", - "kycTypeRequired": "Please select an account type" + "kycTypeRequired": "Please select an account type", + "pendingTitle": "Verifikasie hangende", + "pendingBody": "Jou identiteitsverifikasie is hangende. Wag asseblief vir goedkeuring.", + "genericError": "Iets het verkeerd geloop. Probeer asseblief weer." }, "FygaroWebViewScreen": { "title": "Fygaro Payment", diff --git a/app/i18n/raw-i18n/translations/ar.json b/app/i18n/raw-i18n/translations/ar.json index 5281c2f22..80828ed61 100644 --- a/app/i18n/raw-i18n/translations/ar.json +++ b/app/i18n/raw-i18n/translations/ar.json @@ -1148,7 +1148,6 @@ "AccountUpgrade": { "accountNum": "Account Number", "accountNumPlaceholder": "Enter your account number", - "accountType": "Account Type", "bankAccountType": "Account Type", "bankBranch": "Bank Branch", "bankBranchPlaceholder": "Enter your bank branch", @@ -1165,24 +1164,39 @@ "flashTerminal": "Do you want a Flash terminal?", "flashTerminalTooltip": "A Flash Terminal is a smart device that can accept payment via Flash for your business and print receipts. A customer service representative will contact you if you check this box.", "fullName": "Full name", - "merchant": "Merchant", - "merchantDesc": "Give rewards, appear on the map, and settle to your bank. ID and bank info required.", "optional": " (Optional)", - "personal": "Personal", - "personalDesc": "Secure your wallet with phone and email. Stay safe and recover easily if needed", "personalInfo": "Personal Information", "phoneNumber": "Phone Number", - "pro": "Pro", - "proDesc": "Accept payments and get discovered on the map. Requires a business name and location.", "selectBankAccountType": "Select account type", "selectCurrency": "Select Currency", - "successRequest": "You successfully requested to upgrade your account to {accountType: string}", - "successUpgrade": "You successfully upgraded your account to {accountType: string}", "uploadId": "Upload ID Document", "validation": "Validation", "validationCode": "Validation code", - "international": "International", - "internationalDesc": "Get an international account and routing number for bank transfers. ID required." + "badgeBankPayout": "سحب بنكي", + "badgeUsdAccount": "حساب بالدولار", + "bankCashoutTitle": "السحب إلى البنك", + "bankCashoutDesc": "اسحب الدولار الجامايكي (JMD) إلى بنكك الجامايكي", + "businessTitle": "نشاط تجاري", + "businessDesc": "اظهر على خريطة Flash وكافئ عملاءك", + "enabled": "مفعّل", + "hubEyebrow": "حسابك في Flash", + "hubTitle": "افعل المزيد مع Flash", + "inReview": "قيد المراجعة", + "sectionGetPaid": "طرق استلام الأموال", + "sectionGrow": "النمو", + "setUp": "إعداد", + "statusBusiness": "نشاط تجاري", + "statusTrial": "حساب تجريبي", + "statusUnauthorized": "حساب غير مصرّح", + "statusVerified": "موثّق", + "successBankPayoutRequest": "تم إرسال طلب السحب البنكي الخاص بك للمراجعة", + "successBusinessRequest": "تم إرسال طلب ترقية النشاط التجاري الخاص بك للمراجعة", + "successVerified": "تم توثيق حسابك", + "usdAccountTitle": "حساب بنكي افتراضي بالدولار", + "usdAccountDesc": "رقم حساب وتوجيه أمريكي خاص بك — استلم ACH والحوالات والرواتب", + "verifyTitle": "وثّق حسابك", + "verifyDesc": "رقم هاتفك فقط · حدود أعلى في دقيقة واحدة", + "lockedVerifyFirst": "وثّق حسابك أولاً لفتح هذه الميزة" }, "AdvancedModeModal": { "body": "- Your BTC is non-custodial, fees may apply.\n- You can swap between BTC and USD.\n- BTC may take up to 60s to confirm.\n\nDO NOT SHARE YOUR RECOVERY PHRASE!", @@ -1544,8 +1558,8 @@ "minimumAmount": "Minimum amount is $1.00" }, "BridgeKyc": { - "title": "International Transfer", - "description": "Please provide your details to set up international transfers", + "title": "حساب بالدولار", + "description": "يرجى تقديم بياناتك لإعداد حسابك بالدولار", "fullName": "Full Name", "fullNamePlaceholder": "Enter your full name", "email": "Email", @@ -1558,7 +1572,10 @@ "fullNameRequired": "Full name is required", "emailRequired": "Email is required", "invalidEmail": "Please enter a valid email address", - "kycTypeRequired": "Please select an account type" + "kycTypeRequired": "Please select an account type", + "pendingTitle": "التوثيق قيد الانتظار", + "pendingBody": "توثيق هويتك قيد الانتظار. يرجى انتظار الموافقة.", + "genericError": "حدث خطأ ما. يرجى المحاولة مرة أخرى." }, "FygaroWebViewScreen": { "title": "Fygaro Payment", diff --git a/app/i18n/raw-i18n/translations/ca.json b/app/i18n/raw-i18n/translations/ca.json index b92c79d94..babe561ac 100644 --- a/app/i18n/raw-i18n/translations/ca.json +++ b/app/i18n/raw-i18n/translations/ca.json @@ -1471,13 +1471,6 @@ } }, "AccountUpgrade": { - "accountType": "Tip de compte", - "personal": "Personal Personal", - "personalDesc": "Segureu la vostra cartera amb el telèfon i el correu electrònic.", - "pro": "Pro Pro", - "proDesc": "Acceptar pagaments i ser descobert en el mapa requereix un nom i una ubicació comercial.", - "merchant": "Merchant Merchant", - "merchantDesc": "Dóna recompenses, apareix en el mapa i decideix amb el teu banc.", "personalInfo": "Informació personal", "fullName": "El nom complet", "phoneNumber": "Número de telèfon", @@ -1504,10 +1497,31 @@ "accountNum": "Número de compte", "accountNumPlaceholder": "Entreu el vostre número de compte", "uploadId": "Carrega ID Document", - "successUpgrade": "Has actualitzat amb èxit el teu compte a {accountType: string}", - "successRequest": "Vostè ha sol·licitat amb èxit una actualització del seu compte a {accountType: string}", - "international": "International", - "internationalDesc": "Get an international account and routing number for bank transfers. ID required." + "badgeBankPayout": "Pagament bancari", + "badgeUsdAccount": "Compte en USD", + "bankCashoutTitle": "Retirada al banc", + "bankCashoutDesc": "Retira JMD al teu banc jamaicà", + "businessTitle": "Negoci", + "businessDesc": "Apareix al mapa de Flash i recompensa els teus clients", + "enabled": "Actiu", + "hubEyebrow": "El teu compte de Flash", + "hubTitle": "Fes més amb Flash", + "inReview": "En revisió", + "sectionGetPaid": "Maneres de cobrar", + "sectionGrow": "Creix", + "setUp": "Configura", + "statusBusiness": "Negoci", + "statusTrial": "Compte de prova", + "statusUnauthorized": "Compte no autoritzat", + "statusVerified": "Verificat", + "successBankPayoutRequest": "La teva sol·licitud de retirada bancària s'ha enviat per a revisió", + "successBusinessRequest": "La teva sol·licitud d'actualització a negoci s'ha enviat per a revisió", + "successVerified": "El teu compte està verificat", + "usdAccountTitle": "Compte bancari virtual en USD", + "usdAccountDesc": "El teu propi número de compte i routing dels EUA — rep ACH, transferències i nòmines", + "verifyTitle": "Verifica el teu compte", + "verifyDesc": "Només el teu número de telèfon · límits més alts en un minut", + "lockedVerifyFirst": "Verifica primer el teu compte per desbloquejar-ho" }, "CashWalletCutover": { "title": "Cash Wallet Updated", @@ -1538,8 +1552,8 @@ "minimumAmount": "Minimum amount is $1.00" }, "BridgeKyc": { - "title": "International Transfer", - "description": "Please provide your details to set up international transfers", + "title": "Compte en USD", + "description": "Proporciona les teves dades per configurar el teu compte en USD", "fullName": "Full Name", "fullNamePlaceholder": "Enter your full name", "email": "Email", @@ -1552,7 +1566,10 @@ "fullNameRequired": "Full name is required", "emailRequired": "Email is required", "invalidEmail": "Please enter a valid email address", - "kycTypeRequired": "Please select an account type" + "kycTypeRequired": "Please select an account type", + "pendingTitle": "Verificació pendent", + "pendingBody": "La verificació de la teva identitat està pendent. Espera l'aprovació.", + "genericError": "Alguna cosa ha anat malament. Torna-ho a provar." }, "FygaroWebViewScreen": { "title": "Fygaro Payment", diff --git a/app/i18n/raw-i18n/translations/cs.json b/app/i18n/raw-i18n/translations/cs.json index 375e28419..33e003bc6 100644 --- a/app/i18n/raw-i18n/translations/cs.json +++ b/app/i18n/raw-i18n/translations/cs.json @@ -1471,13 +1471,6 @@ } }, "AccountUpgrade": { - "accountType": "Typ účtu", - "personal": "Osobní", - "personalDesc": "Zabezpečte si peněženku telefonem a e-mailem.", - "pro": "Pro Pro", - "proDesc": "Přijměte platby a objevte se na mapě.Potřebuje obchodní název a umístění.", - "merchant": "Obchodník", - "merchantDesc": "Dejte odměny, ukažte se na mapě a vyrovnejte se s vaší bankou.", "personalInfo": "Osobní údaje", "fullName": "Plné jméno", "phoneNumber": "Telefonní číslo", @@ -1504,10 +1497,31 @@ "accountNum": "Počet účtu ", "accountNumPlaceholder": "Vezměte si číslo účtu", "uploadId": "Upload ID Document", - "successUpgrade": "Úspěšně jste vylepšili svůj účet na {accountType: string}", - "successRequest": "Úspěšně jste požádali o aktualizaci svého účtu na {accountType: string}", - "international": "International", - "internationalDesc": "Get an international account and routing number for bank transfers. ID required." + "badgeBankPayout": "Bankovní výplata", + "badgeUsdAccount": "USD účet", + "bankCashoutTitle": "Výběr do banky", + "bankCashoutDesc": "Vyberte JMD do své jamajské banky", + "businessTitle": "Firma", + "businessDesc": "Buďte na mapě Flash a odměňujte své zákazníky", + "enabled": "Zapnuto", + "hubEyebrow": "Váš účet Flash", + "hubTitle": "Dělejte s Flash víc", + "inReview": "V posouzení", + "sectionGetPaid": "Způsoby přijímání plateb", + "sectionGrow": "Růst", + "setUp": "Nastavit", + "statusBusiness": "Firma", + "statusTrial": "Zkušební účet", + "statusUnauthorized": "Neautorizovaný účet", + "statusVerified": "Ověřeno", + "successBankPayoutRequest": "Vaše žádost o bankovní výběr byla odeslána k posouzení", + "successBusinessRequest": "Vaše žádost o firemní účet byla odeslána k posouzení", + "successVerified": "Váš účet je ověřen", + "usdAccountTitle": "Virtuální bankovní účet v USD", + "usdAccountDesc": "Vlastní americké číslo účtu a routing — přijímejte ACH, převody i výplaty", + "verifyTitle": "Ověřte svůj účet", + "verifyDesc": "Stačí vaše telefonní číslo · vyšší limity během minuty", + "lockedVerifyFirst": "Nejprve ověřte svůj účet pro odemknutí" }, "CashWalletCutover": { "title": "Cash Wallet Updated", @@ -1538,8 +1552,8 @@ "minimumAmount": "Minimum amount is $1.00" }, "BridgeKyc": { - "title": "International Transfer", - "description": "Please provide your details to set up international transfers", + "title": "USD účet", + "description": "Zadejte prosím své údaje pro zřízení USD účtu", "fullName": "Full Name", "fullNamePlaceholder": "Enter your full name", "email": "Email", @@ -1552,7 +1566,10 @@ "fullNameRequired": "Full name is required", "emailRequired": "Email is required", "invalidEmail": "Please enter a valid email address", - "kycTypeRequired": "Please select an account type" + "kycTypeRequired": "Please select an account type", + "pendingTitle": "Ověření čeká", + "pendingBody": "Ověření vaší totožnosti čeká na vyřízení. Vyčkejte prosím na schválení.", + "genericError": "Něco se pokazilo. Zkuste to prosím znovu." }, "FygaroWebViewScreen": { "title": "Fygaro Payment", diff --git a/app/i18n/raw-i18n/translations/da.json b/app/i18n/raw-i18n/translations/da.json index d8bdea752..f469bf9af 100644 --- a/app/i18n/raw-i18n/translations/da.json +++ b/app/i18n/raw-i18n/translations/da.json @@ -1471,13 +1471,6 @@ } }, "AccountUpgrade": { - "accountType": "Kontotype", - "personal": "Personligt Personligt", - "personalDesc": "Sikre din tegnebog med telefon og e-mail.", - "pro": "Pro Pro", - "proDesc": "Accepter betalinger og blive opdaget på kortet.", - "merchant": "Handlende", - "merchantDesc": "Giv belønninger, vises på kortet og afregnes hos din bank. ID og bankoplysninger kræves.", "personalInfo": "Personlige oplysninger", "fullName": "Fuldnavn", "phoneNumber": "Telefonnummer", @@ -1504,10 +1497,31 @@ "accountNum": "Konto nummer ", "accountNumPlaceholder": "Indtast dit kontonummer", "uploadId": "Upload ID Document", - "successUpgrade": "Du har succesfuldt opgraderet dit konto til {accountType: string}", - "successRequest": "Du har succesfuldt anmodet om at opgradere dit konto til {accountType: string}", - "international": "International", - "internationalDesc": "Get an international account and routing number for bank transfers. ID required." + "badgeBankPayout": "Bankudbetaling", + "badgeUsdAccount": "USD-konto", + "bankCashoutTitle": "Bankudbetaling", + "bankCashoutDesc": "Udbetal JMD til din jamaicanske bank", + "businessTitle": "Virksomhed", + "businessDesc": "Kom på Flash-kortet og beløn dine kunder", + "enabled": "Til", + "hubEyebrow": "Din Flash-konto", + "hubTitle": "Gør mere med Flash", + "inReview": "Under gennemgang", + "sectionGetPaid": "Måder at få betaling på", + "sectionGrow": "Vækst", + "setUp": "Opsæt", + "statusBusiness": "Virksomhed", + "statusTrial": "Prøvekonto", + "statusUnauthorized": "Uautoriseret konto", + "statusVerified": "Verificeret", + "successBankPayoutRequest": "Din anmodning om bankudbetaling er sendt til gennemgang", + "successBusinessRequest": "Din anmodning om virksomhedsopgradering er sendt til gennemgang", + "successVerified": "Din konto er verificeret", + "usdAccountTitle": "Virtuel USD-bankkonto", + "usdAccountDesc": "Dit eget amerikanske konto- og routingnummer — modtag ACH, overførsler og løn", + "verifyTitle": "Verificér din konto", + "verifyDesc": "Kun dit telefonnummer · højere grænser på et minut", + "lockedVerifyFirst": "Verificér din konto først for at låse op" }, "CashWalletCutover": { "title": "Cash Wallet Updated", @@ -1538,8 +1552,8 @@ "minimumAmount": "Minimum amount is $1.00" }, "BridgeKyc": { - "title": "International Transfer", - "description": "Please provide your details to set up international transfers", + "title": "USD-konto", + "description": "Angiv venligst dine oplysninger for at oprette din USD-konto", "fullName": "Full Name", "fullNamePlaceholder": "Enter your full name", "email": "Email", @@ -1552,7 +1566,10 @@ "fullNameRequired": "Full name is required", "emailRequired": "Email is required", "invalidEmail": "Please enter a valid email address", - "kycTypeRequired": "Please select an account type" + "kycTypeRequired": "Please select an account type", + "pendingTitle": "Verificering afventer", + "pendingBody": "Din identitetsverificering afventer. Vent venligst på godkendelse.", + "genericError": "Noget gik galt. Prøv venligst igen." }, "FygaroWebViewScreen": { "title": "Fygaro Payment", diff --git a/app/i18n/raw-i18n/translations/de.json b/app/i18n/raw-i18n/translations/de.json index 4416e6b54..14bd5f633 100644 --- a/app/i18n/raw-i18n/translations/de.json +++ b/app/i18n/raw-i18n/translations/de.json @@ -1471,13 +1471,6 @@ } }, "AccountUpgrade": { - "accountType": "Account-Typ", - "personal": "Persönlich Personal", - "personalDesc": "Schützen Sie Ihre Brieftasche mit Telefon und E-Mail. Bleiben Sie sicher und erholen Sie sich bei Bedarf leicht", - "pro": "Pro Pro", - "proDesc": "Akzeptieren Sie Zahlungen und werden auf der Karte entdeckt.", - "merchant": "Händler Händler", - "merchantDesc": "Geben Sie Belohnungen, erscheinen Sie auf der Karte und bezahlen Sie bei Ihrer Bank.", "personalInfo": "Persönliche Informationen", "fullName": "Voller Name", "phoneNumber": "Telefonnummer", @@ -1504,10 +1497,31 @@ "accountNum": "Kontonummer Kontonummer ", "accountNumPlaceholder": "Geben Sie Ihre Kontonummer ein", "uploadId": "Laden Sie das ID-Dokument hoch", - "successUpgrade": "Sie haben Ihr Konto erfolgreich auf {accountType: string} aktualisiert.", - "successRequest": "Sie haben erfolgreich angefordert, Ihr Konto auf {accountType: string} zu aktualisieren", - "international": "International", - "internationalDesc": "Get an international account and routing number for bank transfers. ID required." + "badgeBankPayout": "Bankauszahlung", + "badgeUsdAccount": "USD-Konto", + "bankCashoutTitle": "Bankauszahlung", + "bankCashoutDesc": "JMD auf deine jamaikanische Bank auszahlen", + "businessTitle": "Unternehmen", + "businessDesc": "Erscheine auf der Flash-Karte & belohne deine Kunden", + "enabled": "Aktiv", + "hubEyebrow": "Dein Flash-Konto", + "hubTitle": "Mehr mit Flash machen", + "inReview": "In Prüfung", + "sectionGetPaid": "Wege, bezahlt zu werden", + "sectionGrow": "Wachsen", + "setUp": "Einrichten", + "statusBusiness": "Unternehmen", + "statusTrial": "Testkonto", + "statusUnauthorized": "Nicht autorisiertes Konto", + "statusVerified": "Verifiziert", + "successBankPayoutRequest": "Deine Anfrage zur Bankauszahlung wurde zur Prüfung eingereicht", + "successBusinessRequest": "Deine Anfrage zum Unternehmens-Upgrade wurde zur Prüfung eingereicht", + "successVerified": "Dein Konto ist verifiziert", + "usdAccountTitle": "Virtuelles USD-Bankkonto", + "usdAccountDesc": "Deine eigene US-Konto- und Routing-Nummer — empfange ACH, Überweisungen & Gehalt", + "verifyTitle": "Verifiziere dein Konto", + "verifyDesc": "Nur deine Telefonnummer · höhere Limits in einer Minute", + "lockedVerifyFirst": "Verifiziere zuerst dein Konto, um freizuschalten" }, "CashWalletCutover": { "title": "Cash Wallet Updated", @@ -1538,8 +1552,8 @@ "minimumAmount": "Minimum amount is $1.00" }, "BridgeKyc": { - "title": "International Transfer", - "description": "Please provide your details to set up international transfers", + "title": "USD-Konto", + "description": "Bitte gib deine Daten an, um dein USD-Konto einzurichten", "fullName": "Full Name", "fullNamePlaceholder": "Enter your full name", "email": "Email", @@ -1552,7 +1566,10 @@ "fullNameRequired": "Full name is required", "emailRequired": "Email is required", "invalidEmail": "Please enter a valid email address", - "kycTypeRequired": "Please select an account type" + "kycTypeRequired": "Please select an account type", + "pendingTitle": "Verifizierung ausstehend", + "pendingBody": "Deine Identitätsprüfung ist ausstehend. Bitte warte auf die Freigabe.", + "genericError": "Etwas ist schiefgelaufen. Bitte versuche es erneut." }, "FygaroWebViewScreen": { "title": "Fygaro Payment", diff --git a/app/i18n/raw-i18n/translations/el.json b/app/i18n/raw-i18n/translations/el.json index 90f3d452e..1d9f395d7 100644 --- a/app/i18n/raw-i18n/translations/el.json +++ b/app/i18n/raw-i18n/translations/el.json @@ -1471,13 +1471,6 @@ } }, "AccountUpgrade": { - "accountType": "Τύπος Λογαριασμού", - "personal": "Προσωπικό Προσωπικό", - "personalDesc": "Κρατήστε το πορτοφόλι σας ασφαλές με το τηλέφωνο και το ηλεκτρονικό ταχυδρομείο.", - "pro": "Το Pro Pro", - "proDesc": "Απαιτεί όνομα και τοποθεσία της επιχείρησης.", - "merchant": "Εμπορεύτης Εμπορεύτης", - "merchantDesc": "Δώστε ανταμοιβές, εμφανιστείτε στον χάρτη και διευθετήστε με την τράπεζά σας.", "personalInfo": "Προσωπικές πληροφορίες", "fullName": "Ολόκληρο το όνομα", "phoneNumber": "Αριθμός τηλεφώνου", @@ -1504,10 +1497,31 @@ "accountNum": "Ο αριθμός λογαριασμού ", "accountNumPlaceholder": "Εισάγετε τον αριθμό του λογαριασμού σας", "uploadId": "Ανεβάστε το αναγνωριστικό έγγραφο.", - "successUpgrade": "Αναβαθμίσατε με επιτυχία το λογαριασμό σας σε {accountType: string}", - "successRequest": "Ζήτησες με επιτυχία να αναβαθμίσεις το λογαριασμό σου σε {accountType: string}", - "international": "International", - "internationalDesc": "Get an international account and routing number for bank transfers. ID required." + "badgeBankPayout": "Πληρωμή σε τράπεζα", + "badgeUsdAccount": "Λογαριασμός USD", + "bankCashoutTitle": "Ανάληψη σε τράπεζα", + "bankCashoutDesc": "Κάνε ανάληψη JMD στην τζαμαϊκανή σου τράπεζα", + "businessTitle": "Επιχείρηση", + "businessDesc": "Μπες στον χάρτη του Flash & επιβράβευσε τους πελάτες σου", + "enabled": "Ενεργό", + "hubEyebrow": "Ο λογαριασμός σου στο Flash", + "hubTitle": "Κάνε περισσότερα με το Flash", + "inReview": "Σε έλεγχο", + "sectionGetPaid": "Τρόποι να πληρώνεσαι", + "sectionGrow": "Ανάπτυξη", + "setUp": "Ρύθμιση", + "statusBusiness": "Επιχείρηση", + "statusTrial": "Δοκιμαστικός λογαριασμός", + "statusUnauthorized": "Μη εξουσιοδοτημένος λογαριασμός", + "statusVerified": "Επαληθευμένος", + "successBankPayoutRequest": "Το αίτημα ανάληψης σε τράπεζα υποβλήθηκε για έλεγχο", + "successBusinessRequest": "Το αίτημα αναβάθμισης σε επιχείρηση υποβλήθηκε για έλεγχο", + "successVerified": "Ο λογαριασμός σου επαληθεύτηκε", + "usdAccountTitle": "Εικονικός τραπεζικός λογαριασμός USD", + "usdAccountDesc": "Δικός σου αριθμός λογαριασμού & routing ΗΠΑ — δέξου ACH, εμβάσματα & μισθοδοσία", + "verifyTitle": "Επαλήθευσε τον λογαριασμό σου", + "verifyDesc": "Μόνο ο αριθμός τηλεφώνου σου · υψηλότερα όρια σε ένα λεπτό", + "lockedVerifyFirst": "Επαλήθευσε πρώτα τον λογαριασμό σου για ξεκλείδωμα" }, "CashWalletCutover": { "title": "Cash Wallet Updated", @@ -1538,8 +1552,8 @@ "minimumAmount": "Minimum amount is $1.00" }, "BridgeKyc": { - "title": "International Transfer", - "description": "Please provide your details to set up international transfers", + "title": "Λογαριασμός USD", + "description": "Δώσε τα στοιχεία σου για να ρυθμίσεις τον λογαριασμό σου σε USD", "fullName": "Full Name", "fullNamePlaceholder": "Enter your full name", "email": "Email", @@ -1552,7 +1566,10 @@ "fullNameRequired": "Full name is required", "emailRequired": "Email is required", "invalidEmail": "Please enter a valid email address", - "kycTypeRequired": "Please select an account type" + "kycTypeRequired": "Please select an account type", + "pendingTitle": "Επαλήθευση σε εκκρεμότητα", + "pendingBody": "Η επαλήθευση της ταυτότητάς σου εκκρεμεί. Περίμενε την έγκριση.", + "genericError": "Κάτι πήγε στραβά. Δοκίμασε ξανά." }, "FygaroWebViewScreen": { "title": "Fygaro Payment", diff --git a/app/i18n/raw-i18n/translations/es.json b/app/i18n/raw-i18n/translations/es.json index b968c0a3d..ce61be8c8 100644 --- a/app/i18n/raw-i18n/translations/es.json +++ b/app/i18n/raw-i18n/translations/es.json @@ -1471,13 +1471,6 @@ } }, "AccountUpgrade": { - "accountType": "Tipo de Cuenta", - "personal": "Personal Personal", - "personalDesc": "Manténgase seguro y recupere fácilmente si es necesario", - "pro": "Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro", - "proDesc": "Acceptar pagos y ser descubierto en el mapa requiere un nombre de negocio y ubicación.", - "merchant": "Merchant Merchant", - "merchantDesc": "Ofrece recompensas, aparece en el mapa y se liquida con su banco. se requiere identificación y información bancaria.", "personalInfo": "Información personal", "fullName": "nombre completo", "phoneNumber": "Número de teléfono ", @@ -1504,10 +1497,31 @@ "accountNum": "Número de Cuenta ", "accountNumPlaceholder": "Ingrese su número de cuenta", "uploadId": "Sube el documento de identificación", - "successUpgrade": "Usted ha actualizado con éxito su cuenta a {accountType: string}", - "successRequest": "Usted solicitó con éxito actualizar su cuenta a {accountType: string}", - "international": "International", - "internationalDesc": "Get an international account and routing number for bank transfers. ID required." + "badgeBankPayout": "Retiro bancario", + "badgeUsdAccount": "Cuenta en USD", + "bankCashoutTitle": "Retiro bancario", + "bankCashoutDesc": "Retira JMD a tu banco jamaiquino", + "businessTitle": "Negocio", + "businessDesc": "Aparece en el mapa de Flash y premia a tus clientes", + "enabled": "Activo", + "hubEyebrow": "Tu cuenta de Flash", + "hubTitle": "Haz más con Flash", + "inReview": "En revisión", + "sectionGetPaid": "Formas de recibir pagos", + "sectionGrow": "Crece", + "setUp": "Configurar", + "statusBusiness": "Negocio", + "statusTrial": "Cuenta de prueba", + "statusUnauthorized": "Cuenta no autorizada", + "statusVerified": "Verificada", + "successBankPayoutRequest": "Tu solicitud de retiro bancario fue enviada para revisión", + "successBusinessRequest": "Tu solicitud de actualización a negocio fue enviada para revisión", + "successVerified": "Tu cuenta está verificada", + "usdAccountTitle": "Cuenta bancaria virtual en USD", + "usdAccountDesc": "Tu propio número de cuenta y routing de EE. UU. — recibe ACH, transferencias y nómina", + "verifyTitle": "Verifica tu cuenta", + "verifyDesc": "Solo tu número de teléfono · límites más altos en un minuto", + "lockedVerifyFirst": "Verifica tu cuenta primero para desbloquear" }, "CashWalletCutover": { "title": "Cash Wallet Updated", @@ -1538,8 +1552,8 @@ "minimumAmount": "Minimum amount is $1.00" }, "BridgeKyc": { - "title": "International Transfer", - "description": "Please provide your details to set up international transfers", + "title": "Cuenta en USD", + "description": "Proporciona tus datos para configurar tu cuenta en USD", "fullName": "Full Name", "fullNamePlaceholder": "Enter your full name", "email": "Email", @@ -1552,7 +1566,10 @@ "fullNameRequired": "Full name is required", "emailRequired": "Email is required", "invalidEmail": "Please enter a valid email address", - "kycTypeRequired": "Please select an account type" + "kycTypeRequired": "Please select an account type", + "pendingTitle": "Verificación pendiente", + "pendingBody": "La verificación de tu identidad está pendiente. Espera la aprobación.", + "genericError": "Algo salió mal. Inténtalo de nuevo." }, "FygaroWebViewScreen": { "title": "Fygaro Payment", diff --git a/app/i18n/raw-i18n/translations/fr.json b/app/i18n/raw-i18n/translations/fr.json index c0bf2496c..a2f0b2d60 100644 --- a/app/i18n/raw-i18n/translations/fr.json +++ b/app/i18n/raw-i18n/translations/fr.json @@ -1471,13 +1471,6 @@ } }, "AccountUpgrade": { - "accountType": "Type de compte", - "personal": "Personnel Personnel", - "personalDesc": "Sécurisez votre portefeuille par téléphone et par courrier électronique.", - "pro": "Pro Pro", - "proDesc": "Accepter les paiements et être découvert sur la carte.", - "merchant": "Le commerçant", - "merchantDesc": "Donnez des récompenses, apparaissez sur la carte et réglez-vous auprès de votre banque.", "personalInfo": "Informations personnelles ", "fullName": "Nom complet", "phoneNumber": "Numéro de téléphone ", @@ -1504,10 +1497,31 @@ "accountNum": "Numéro de compte ", "accountNumPlaceholder": "Entrez votre numéro de compte", "uploadId": "Téléchargez le document d'identification ", - "successUpgrade": "Vous avez réussi à mettre à niveau votre compte à {accountType: string}", - "successRequest": "Vous avez demandé avec succès de mettre à niveau votre compte à {accountType: string}", - "international": "International", - "internationalDesc": "Get an international account and routing number for bank transfers. ID required." + "badgeBankPayout": "Retrait bancaire", + "badgeUsdAccount": "Compte en USD", + "bankCashoutTitle": "Retrait bancaire", + "bankCashoutDesc": "Retirez des JMD vers votre banque jamaïcaine", + "businessTitle": "Entreprise", + "businessDesc": "Apparaissez sur la carte Flash et récompensez vos clients", + "enabled": "Activé", + "hubEyebrow": "Votre compte Flash", + "hubTitle": "Faites plus avec Flash", + "inReview": "En cours d'examen", + "sectionGetPaid": "Façons d'être payé", + "sectionGrow": "Développer", + "setUp": "Configurer", + "statusBusiness": "Entreprise", + "statusTrial": "Compte d'essai", + "statusUnauthorized": "Compte non autorisé", + "statusVerified": "Vérifié", + "successBankPayoutRequest": "Votre demande de retrait bancaire a été soumise pour examen", + "successBusinessRequest": "Votre demande de passage en compte entreprise a été soumise pour examen", + "successVerified": "Votre compte est vérifié", + "usdAccountTitle": "Compte bancaire virtuel en USD", + "usdAccountDesc": "Vos propres numéros de compte et de routage US — recevez ACH, virements et salaires", + "verifyTitle": "Vérifiez votre compte", + "verifyDesc": "Seulement votre numéro de téléphone · limites plus élevées en une minute", + "lockedVerifyFirst": "Vérifiez d'abord votre compte pour débloquer" }, "CashWalletCutover": { "title": "Cash Wallet Updated", @@ -1538,8 +1552,8 @@ "minimumAmount": "Minimum amount is $1.00" }, "BridgeKyc": { - "title": "International Transfer", - "description": "Please provide your details to set up international transfers", + "title": "Compte en USD", + "description": "Veuillez fournir vos informations pour configurer votre compte en USD", "fullName": "Full Name", "fullNamePlaceholder": "Enter your full name", "email": "Email", @@ -1552,7 +1566,10 @@ "fullNameRequired": "Full name is required", "emailRequired": "Email is required", "invalidEmail": "Please enter a valid email address", - "kycTypeRequired": "Please select an account type" + "kycTypeRequired": "Please select an account type", + "pendingTitle": "Vérification en attente", + "pendingBody": "La vérification de votre identité est en attente. Veuillez attendre l'approbation.", + "genericError": "Une erreur s'est produite. Veuillez réessayer." }, "FygaroWebViewScreen": { "title": "Fygaro Payment", diff --git a/app/i18n/raw-i18n/translations/hr.json b/app/i18n/raw-i18n/translations/hr.json index ba5f9b3b5..f21071fdf 100644 --- a/app/i18n/raw-i18n/translations/hr.json +++ b/app/i18n/raw-i18n/translations/hr.json @@ -1471,13 +1471,6 @@ } }, "AccountUpgrade": { - "accountType": "Vrsta računa", - "personal": "Osobni", - "personalDesc": "Obezbedite svoj novčanik telefonom i e-poštom.", - "pro": "Pro Pro", - "proDesc": "Prihvaćanje plaćanja i otkrivanje na mapi zahtijeva poslovno ime i lokaciju.", - "merchant": "trgovac trgovac", - "merchantDesc": "Dajte nagrade, pojavite se na mapi i poravnite se u svojoj banci.", "personalInfo": "Osobni podaci", "fullName": "Potpuno ime", "phoneNumber": "Telefonski broj ", @@ -1504,10 +1497,31 @@ "accountNum": "Računovodstvo ", "accountNumPlaceholder": "Unesite svoj broj računa", "uploadId": "Upload ID Document", - "successUpgrade": "Uspješno ste nadogradili svoj račun na {accountType: string}", - "successRequest": "Uspješno ste zatražili nadogradnju računa na {accountType: string}", - "international": "International", - "internationalDesc": "Get an international account and routing number for bank transfers. ID required." + "badgeBankPayout": "Bankovna isplata", + "badgeUsdAccount": "USD račun", + "bankCashoutTitle": "Isplata na banku", + "bankCashoutDesc": "Isplatite JMD na svoju jamajčansku banku", + "businessTitle": "Tvrtka", + "businessDesc": "Budite na Flash karti i nagrađujte svoje kupce", + "enabled": "Uključeno", + "hubEyebrow": "Vaš Flash račun", + "hubTitle": "Učinite više uz Flash", + "inReview": "U pregledu", + "sectionGetPaid": "Načini primanja uplata", + "sectionGrow": "Rast", + "setUp": "Postavi", + "statusBusiness": "Tvrtka", + "statusTrial": "Probni račun", + "statusUnauthorized": "Neovlašteni račun", + "statusVerified": "Verificiran", + "successBankPayoutRequest": "Vaš zahtjev za bankovnu isplatu poslan je na pregled", + "successBusinessRequest": "Vaš zahtjev za poslovnu nadogradnju poslan je na pregled", + "successVerified": "Vaš račun je verificiran", + "usdAccountTitle": "Virtualni bankovni račun u USD", + "usdAccountDesc": "Vlastiti američki broj računa i routing — primajte ACH, doznake i plaću", + "verifyTitle": "Verificirajte svoj račun", + "verifyDesc": "Samo vaš broj telefona · veći limiti za minutu", + "lockedVerifyFirst": "Prvo verificirajte svoj račun za otključavanje" }, "CashWalletCutover": { "title": "Cash Wallet Updated", @@ -1538,8 +1552,8 @@ "minimumAmount": "Minimum amount is $1.00" }, "BridgeKyc": { - "title": "International Transfer", - "description": "Please provide your details to set up international transfers", + "title": "USD račun", + "description": "Unesite svoje podatke za otvaranje USD računa", "fullName": "Full Name", "fullNamePlaceholder": "Enter your full name", "email": "Email", @@ -1552,7 +1566,10 @@ "fullNameRequired": "Full name is required", "emailRequired": "Email is required", "invalidEmail": "Please enter a valid email address", - "kycTypeRequired": "Please select an account type" + "kycTypeRequired": "Please select an account type", + "pendingTitle": "Verifikacija na čekanju", + "pendingBody": "Verifikacija vašeg identiteta je na čekanju. Pričekajte odobrenje.", + "genericError": "Nešto je pošlo po zlu. Pokušajte ponovno." }, "FygaroWebViewScreen": { "title": "Fygaro Payment", diff --git a/app/i18n/raw-i18n/translations/hu.json b/app/i18n/raw-i18n/translations/hu.json index 304f01950..5d26055bb 100644 --- a/app/i18n/raw-i18n/translations/hu.json +++ b/app/i18n/raw-i18n/translations/hu.json @@ -1471,13 +1471,6 @@ } }, "AccountUpgrade": { - "accountType": "Számlatípus", - "personal": "Személyes", - "personalDesc": "Teljesítsd a pénztárcádat telefonon és e-mailben.", - "pro": "Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro", - "proDesc": "Elfogadja a kifizetéseket, és felfedezi magát a térképen. Szükséges egy üzleti név és hely.", - "merchant": "Kereskedő", - "merchantDesc": "Adjon jutalmat, jelenjen meg a térképen, és rendezzen a bankjával.", "personalInfo": "Személyes adatok", "fullName": "Teljes név", "phoneNumber": "Hívási szám", @@ -1504,10 +1497,31 @@ "accountNum": "Számlaszám: Számlaszám: Számlaszám: Számlaszám: Számlaszám: Számlaszám: Számlaszám: Számlaszám: Számlaszám: Számlaszám: Számlaszám: Számlaszám: Számlaszám: Számlaszám: Számlaszám: Számlaszámla", "accountNumPlaceholder": "Írd be a számláid számát", "uploadId": "Upload ID Document", - "successUpgrade": "Sikeresen frissítette a fiókját {accountType: string}-re.", - "successRequest": "Sikeresen kérte, hogy frissítse a fiókját {accountType: string}-re.", - "international": "International", - "internationalDesc": "Get an international account and routing number for bank transfers. ID required." + "badgeBankPayout": "Banki kifizetés", + "badgeUsdAccount": "USD-számla", + "bankCashoutTitle": "Banki kifizetés", + "bankCashoutDesc": "JMD kifizetése jamaicai bankszámládra", + "businessTitle": "Vállalkozás", + "businessDesc": "Jelenj meg a Flash térképen és jutalmazd a vásárlóidat", + "enabled": "Bekapcsolva", + "hubEyebrow": "A Flash-fiókod", + "hubTitle": "Hozz ki többet a Flashből", + "inReview": "Elbírálás alatt", + "sectionGetPaid": "Így juthatsz a pénzedhez", + "sectionGrow": "Növekedés", + "setUp": "Beállítás", + "statusBusiness": "Vállalkozás", + "statusTrial": "Próbafiók", + "statusUnauthorized": "Jogosulatlan fiók", + "statusVerified": "Ellenőrzött", + "successBankPayoutRequest": "A banki kifizetési kérelmedet elbírálásra beküldtük", + "successBusinessRequest": "A vállalkozási bővítési kérelmedet elbírálásra beküldtük", + "successVerified": "A fiókod ellenőrizve", + "usdAccountTitle": "Virtuális USD-bankszámla", + "usdAccountDesc": "Saját amerikai számla- és routingszám — fogadj ACH-t, utalást és fizetést", + "verifyTitle": "Ellenőrizd a fiókod", + "verifyDesc": "Csak a telefonszámod kell · magasabb limitek egy perc alatt", + "lockedVerifyFirst": "Először ellenőrizd a fiókod a feloldáshoz" }, "CashWalletCutover": { "title": "Cash Wallet Updated", @@ -1538,8 +1552,8 @@ "minimumAmount": "Minimum amount is $1.00" }, "BridgeKyc": { - "title": "International Transfer", - "description": "Please provide your details to set up international transfers", + "title": "USD-számla", + "description": "Add meg az adataidat az USD-számlád beállításához", "fullName": "Full Name", "fullNamePlaceholder": "Enter your full name", "email": "Email", @@ -1552,7 +1566,10 @@ "fullNameRequired": "Full name is required", "emailRequired": "Email is required", "invalidEmail": "Please enter a valid email address", - "kycTypeRequired": "Please select an account type" + "kycTypeRequired": "Please select an account type", + "pendingTitle": "Ellenőrzés folyamatban", + "pendingBody": "A személyazonosságod ellenőrzése folyamatban van. Kérjük, várd meg a jóváhagyást.", + "genericError": "Hiba történt. Kérjük, próbáld újra." }, "FygaroWebViewScreen": { "title": "Fygaro Payment", diff --git a/app/i18n/raw-i18n/translations/hy.json b/app/i18n/raw-i18n/translations/hy.json index b8b88c91b..ce234a92d 100644 --- a/app/i18n/raw-i18n/translations/hy.json +++ b/app/i18n/raw-i18n/translations/hy.json @@ -1471,13 +1471,6 @@ } }, "AccountUpgrade": { - "accountType": "Հաշվի տեսակ", - "personal": "Անձնական", - "personalDesc": "Պաշտպանեք ձեր դրամապանակը հեռախոսով եւ էլեկտրոնային փոստով: Պաշտպանեք ձեր անվտանգությունը եւ անհրաժեշտության դեպքում հեշտությամբ վերականգնվեք:", - "pro": "Պրո", - "proDesc": "Ընդունեք վճարումներ եւ հայտնվեք քարտեզի վրա: Այն պահանջում է բիզնեսի անուն եւ վայր:", - "merchant": "Առեւտրի", - "merchantDesc": "Տվեք պարգեւներ, հայտնվեք քարտեզում եւ կարգավորվեք ձեր բանկի հետ: Անհրաժեշտ է անձնագիր եւ բանկային տեղեկություններ:", "personalInfo": "Անձնական տվյալներ", "fullName": "Ամբողջական անունը", "phoneNumber": "Հեռախոսահամար ", @@ -1504,10 +1497,31 @@ "accountNum": "Բաժնորդագրության թիվը", "accountNumPlaceholder": "Տեղադրել ձեր հաշիվի համարը", "uploadId": "Բեռնել ID փաստաթուղթ", - "successUpgrade": "Դուք հաջողությամբ կատարելագործել եք ձեր հաշիվը մինչեւ {accountType: string}", - "successRequest": "Դուք հաջողությամբ խնդրել եք թարմացնել ձեր հաշիվը մինչեւ {accountType: string}", - "international": "International", - "internationalDesc": "Get an international account and routing number for bank transfers. ID required." + "badgeBankPayout": "Բանկային վճարում", + "badgeUsdAccount": "USD հաշիվ", + "bankCashoutTitle": "Կանխիկացում բանկ", + "bankCashoutDesc": "Կանխիկացրեք JMD ձեր ջամայկյան բանկ", + "businessTitle": "Բիզնես", + "businessDesc": "Հայտնվեք Flash-ի քարտեզում և պարգևատրեք ձեր հաճախորդներին", + "enabled": "Միացված", + "hubEyebrow": "Ձեր Flash հաշիվը", + "hubTitle": "Արեք ավելին Flash-ի հետ", + "inReview": "Դիտարկվում է", + "sectionGetPaid": "Վճարումներ ստանալու եղանակներ", + "sectionGrow": "Աճ", + "setUp": "Կարգավորել", + "statusBusiness": "Բիզնես", + "statusTrial": "Փորձնական հաշիվ", + "statusUnauthorized": "Չլիազորված հաշիվ", + "statusVerified": "Հաստատված", + "successBankPayoutRequest": "Ձեր բանկային կանխիկացման հայտը ուղարկվել է դիտարկման", + "successBusinessRequest": "Ձեր բիզնես թարմացման հայտը ուղարկվել է դիտարկման", + "successVerified": "Ձեր հաշիվը հաստատված է", + "usdAccountTitle": "Վիրտուալ USD բանկային հաշիվ", + "usdAccountDesc": "Ձեր սեփական ԱՄՆ հաշվի և routing համարը — ստացեք ACH, փոխանցումներ և աշխատավարձ", + "verifyTitle": "Հաստատեք ձեր հաշիվը", + "verifyDesc": "Միայն ձեր հեռախոսահամարը · ավելի բարձր սահմաններ մեկ րոպեում", + "lockedVerifyFirst": "Նախ հաստատեք ձեր հաշիվը՝ բացելու համար" }, "CashWalletCutover": { "title": "Cash Wallet Updated", @@ -1538,8 +1552,8 @@ "minimumAmount": "Minimum amount is $1.00" }, "BridgeKyc": { - "title": "International Transfer", - "description": "Please provide your details to set up international transfers", + "title": "USD հաշիվ", + "description": "Խնդրում ենք տրամադրել ձեր տվյալները USD հաշիվը կարգավորելու համար", "fullName": "Full Name", "fullNamePlaceholder": "Enter your full name", "email": "Email", @@ -1552,7 +1566,10 @@ "fullNameRequired": "Full name is required", "emailRequired": "Email is required", "invalidEmail": "Please enter a valid email address", - "kycTypeRequired": "Please select an account type" + "kycTypeRequired": "Please select an account type", + "pendingTitle": "Հաստատումը սպասման մեջ է", + "pendingBody": "Ձեր ինքնության հաստատումը սպասման մեջ է։ Խնդրում ենք սպասել հաստատմանը։", + "genericError": "Ինչ-որ բան սխալ գնաց։ Խնդրում ենք փորձել կրկին։" }, "FygaroWebViewScreen": { "title": "Fygaro Payment", diff --git a/app/i18n/raw-i18n/translations/it.json b/app/i18n/raw-i18n/translations/it.json index a05844ef4..da591becb 100644 --- a/app/i18n/raw-i18n/translations/it.json +++ b/app/i18n/raw-i18n/translations/it.json @@ -1471,13 +1471,6 @@ } }, "AccountUpgrade": { - "accountType": "Tipo di conto", - "personal": "Personal Personal", - "personalDesc": "Assicurare il portafoglio con telefono e e-mail, rimanere al sicuro e recuperare facilmente se necessario", - "pro": "Pro Pro", - "proDesc": "Accettare pagamenti e farsi scoprire sulla mappa richiede un nome aziendale e una posizione.", - "merchant": "Commerciante Commerciante", - "merchantDesc": "Dare ricompense, apparire sulla mappa, e regolare con la vostra banca. ID e informazioni bancarie richieste.", "personalInfo": "Informazioni personali", "fullName": "Nome completo", "phoneNumber": "Numero di telefono ", @@ -1504,10 +1497,31 @@ "accountNum": "Numero di conto Numero di conto Numero di conto Numero di conto Numero di conto Numero di conto Numero di conto Numero di conto Numero di conto Numero di conto Numero di conto Numero di conto Numero di conto Numero di conto Numero di conto Numero di conto Numero di conto Numero di conto Numero di conto Numero di conto Numero di conto Numero di conto Numero di conto Numero di conto Numero di conto Numero di conto Numero di conto Numero di conto Numero di conto Numero di conto Numero di conto Numero di conto Numero di conto Numero di conto Numero di conto Numero di conto Numero di conto Numero di conto Numero di conto Numero di conto Numero di conto Numero di conto Numero di conto Numero di conto Numero di conto Numero di conto Numero di conto Numero di conto Numero di conto Numero di conto Numero di conto Numero di conto Numero di conto Numero di conto Numero di conto Numero di conto Numero di conto Numero di conto Numero di conto Numero di conto Numero di conto Numero di conto Numero di conto Numero di conto Numero di conto", "accountNumPlaceholder": "Inserisci il tuo numero di conto", "uploadId": "Upload ID Document", - "successUpgrade": "Hai aggiornato con successo il tuo account a {accountType: string}", - "successRequest": "Hai richiesto con successo di aggiornare il tuo account a {accountType: string}", - "international": "International", - "internationalDesc": "Get an international account and routing number for bank transfers. ID required." + "badgeBankPayout": "Prelievo bancario", + "badgeUsdAccount": "Conto in USD", + "bankCashoutTitle": "Prelievo bancario", + "bankCashoutDesc": "Preleva JMD sulla tua banca giamaicana", + "businessTitle": "Attività", + "businessDesc": "Compari sulla mappa di Flash e premia i tuoi clienti", + "enabled": "Attivo", + "hubEyebrow": "Il tuo conto Flash", + "hubTitle": "Fai di più con Flash", + "inReview": "In revisione", + "sectionGetPaid": "Modi per farti pagare", + "sectionGrow": "Crescita", + "setUp": "Configura", + "statusBusiness": "Attività", + "statusTrial": "Conto di prova", + "statusUnauthorized": "Conto non autorizzato", + "statusVerified": "Verificato", + "successBankPayoutRequest": "La tua richiesta di prelievo bancario è stata inviata per la revisione", + "successBusinessRequest": "La tua richiesta di upgrade ad attività è stata inviata per la revisione", + "successVerified": "Il tuo conto è verificato", + "usdAccountTitle": "Conto bancario virtuale in USD", + "usdAccountDesc": "Il tuo numero di conto e routing USA — ricevi ACH, bonifici e stipendio", + "verifyTitle": "Verifica il tuo conto", + "verifyDesc": "Basta il tuo numero di telefono · limiti più alti in un minuto", + "lockedVerifyFirst": "Verifica prima il tuo conto per sbloccare" }, "CashWalletCutover": { "title": "Cash Wallet Updated", @@ -1538,8 +1552,8 @@ "minimumAmount": "Minimum amount is $1.00" }, "BridgeKyc": { - "title": "International Transfer", - "description": "Please provide your details to set up international transfers", + "title": "Conto in USD", + "description": "Fornisci i tuoi dati per configurare il tuo conto in USD", "fullName": "Full Name", "fullNamePlaceholder": "Enter your full name", "email": "Email", @@ -1552,7 +1566,10 @@ "fullNameRequired": "Full name is required", "emailRequired": "Email is required", "invalidEmail": "Please enter a valid email address", - "kycTypeRequired": "Please select an account type" + "kycTypeRequired": "Please select an account type", + "pendingTitle": "Verifica in sospeso", + "pendingBody": "La verifica della tua identità è in sospeso. Attendi l'approvazione.", + "genericError": "Qualcosa è andato storto. Riprova." }, "FygaroWebViewScreen": { "title": "Fygaro Payment", diff --git a/app/i18n/raw-i18n/translations/ms.json b/app/i18n/raw-i18n/translations/ms.json index 49cfb530f..c2fe01677 100644 --- a/app/i18n/raw-i18n/translations/ms.json +++ b/app/i18n/raw-i18n/translations/ms.json @@ -1471,13 +1471,6 @@ } }, "AccountUpgrade": { - "accountType": "Jenis Akaun", - "personal": "Personal Personal", - "personalDesc": "Pastikan dompet anda selamat dengan telefon dan e-mel.", - "pro": "Pro Pro", - "proDesc": "Mengaku pembayaran dan ditemui di peta memerlukan nama perniagaan dan lokasi.", - "merchant": "Merchant Merchant", - "merchantDesc": "Berikan ganjaran, muncul di peta, dan settle dengan bank anda. ID dan maklumat bank diperlukan.", "personalInfo": "Maklumat Peribadi", "fullName": "Nama penuh", "phoneNumber": "Nombor Telefon ", @@ -1504,10 +1497,31 @@ "accountNum": "Nombor Akaun ", "accountNumPlaceholder": "Masukkan nombor akaun anda", "uploadId": "Upload ID Document", - "successUpgrade": "Anda berjaya menaik taraf akaun anda ke {accountType: string}", - "successRequest": "Anda berjaya meminta untuk menaik taraf akaun anda ke {accountType: string}", - "international": "International", - "internationalDesc": "Get an international account and routing number for bank transfers. ID required." + "badgeBankPayout": "Pembayaran bank", + "badgeUsdAccount": "Akaun USD", + "bankCashoutTitle": "Pengeluaran ke bank", + "bankCashoutDesc": "Keluarkan JMD ke bank Jamaica anda", + "businessTitle": "Perniagaan", + "businessDesc": "Muncul di peta Flash & beri ganjaran kepada pelanggan anda", + "enabled": "Aktif", + "hubEyebrow": "Akaun Flash anda", + "hubTitle": "Buat lebih banyak dengan Flash", + "inReview": "Dalam semakan", + "sectionGetPaid": "Cara menerima bayaran", + "sectionGrow": "Kembangkan", + "setUp": "Sediakan", + "statusBusiness": "Perniagaan", + "statusTrial": "Akaun percubaan", + "statusUnauthorized": "Akaun tanpa kebenaran", + "statusVerified": "Disahkan", + "successBankPayoutRequest": "Permohonan pengeluaran bank anda telah dihantar untuk semakan", + "successBusinessRequest": "Permohonan naik taraf perniagaan anda telah dihantar untuk semakan", + "successVerified": "Akaun anda telah disahkan", + "usdAccountTitle": "Akaun bank maya USD", + "usdAccountDesc": "Nombor akaun dan routing AS anda sendiri — terima ACH, pindahan & gaji", + "verifyTitle": "Sahkan akaun anda", + "verifyDesc": "Hanya nombor telefon anda · had lebih tinggi dalam seminit", + "lockedVerifyFirst": "Sahkan akaun anda dahulu untuk membuka" }, "CashWalletCutover": { "title": "Cash Wallet Updated", @@ -1538,8 +1552,8 @@ "minimumAmount": "Minimum amount is $1.00" }, "BridgeKyc": { - "title": "International Transfer", - "description": "Please provide your details to set up international transfers", + "title": "Akaun USD", + "description": "Sila berikan maklumat anda untuk menyediakan akaun USD anda", "fullName": "Full Name", "fullNamePlaceholder": "Enter your full name", "email": "Email", @@ -1552,7 +1566,10 @@ "fullNameRequired": "Full name is required", "emailRequired": "Email is required", "invalidEmail": "Please enter a valid email address", - "kycTypeRequired": "Please select an account type" + "kycTypeRequired": "Please select an account type", + "pendingTitle": "Pengesahan belum selesai", + "pendingBody": "Pengesahan identiti anda belum selesai. Sila tunggu kelulusan.", + "genericError": "Sesuatu telah berlaku. Sila cuba lagi." }, "FygaroWebViewScreen": { "title": "Fygaro Payment", diff --git a/app/i18n/raw-i18n/translations/nl.json b/app/i18n/raw-i18n/translations/nl.json index 0e15f8e07..f887e7da7 100644 --- a/app/i18n/raw-i18n/translations/nl.json +++ b/app/i18n/raw-i18n/translations/nl.json @@ -1471,13 +1471,6 @@ } }, "AccountUpgrade": { - "accountType": "Accountstype", - "personal": "Persoonlijk Persoonlijk", - "personalDesc": "Beveilig je portemonnee met telefoon en e-mail.", - "pro": "Pro Pro", - "proDesc": "Accepteer betalingen en word ontdekt op de kaart.Het vereist een bedrijfsnaam en locatie.", - "merchant": "Handelaar", - "merchantDesc": "Geef beloningen, verschijn op de kaart en maak een afrekening bij je bank.", "personalInfo": "Persoonlijke informatie", "fullName": "Volledige naam", "phoneNumber": "Telefoonnummer ", @@ -1504,10 +1497,31 @@ "accountNum": "Accountsummer Accountsummer ", "accountNumPlaceholder": "Voer uw accountnummer in", "uploadId": "Upload ID Document", - "successUpgrade": "U hebt uw account met succes bijgewerkt naar {accountType: string}", - "successRequest": "U heeft met succes verzocht om uw account te upgraden naar {accountType: string}", - "international": "International", - "internationalDesc": "Get an international account and routing number for bank transfers. ID required." + "badgeBankPayout": "Bankuitbetaling", + "badgeUsdAccount": "USD-rekening", + "bankCashoutTitle": "Uitbetalen naar bank", + "bankCashoutDesc": "Betaal JMD uit naar je Jamaicaanse bank", + "businessTitle": "Bedrijf", + "businessDesc": "Kom op de Flash-kaart & beloon je klanten", + "enabled": "Aan", + "hubEyebrow": "Je Flash-account", + "hubTitle": "Doe meer met Flash", + "inReview": "In behandeling", + "sectionGetPaid": "Manieren om betaald te worden", + "sectionGrow": "Groeien", + "setUp": "Instellen", + "statusBusiness": "Bedrijf", + "statusTrial": "Proefaccount", + "statusUnauthorized": "Ongeautoriseerd account", + "statusVerified": "Geverifieerd", + "successBankPayoutRequest": "Je verzoek voor bankuitbetaling is ingediend ter beoordeling", + "successBusinessRequest": "Je verzoek voor een bedrijfsupgrade is ingediend ter beoordeling", + "successVerified": "Je account is geverifieerd", + "usdAccountTitle": "Virtuele USD-bankrekening", + "usdAccountDesc": "Je eigen Amerikaanse rekening- en routingnummer — ontvang ACH, overboekingen & salaris", + "verifyTitle": "Verifieer je account", + "verifyDesc": "Alleen je telefoonnummer · hogere limieten binnen een minuut", + "lockedVerifyFirst": "Verifieer eerst je account om te ontgrendelen" }, "CashWalletCutover": { "title": "Cash Wallet Updated", @@ -1538,8 +1552,8 @@ "minimumAmount": "Minimum amount is $1.00" }, "BridgeKyc": { - "title": "International Transfer", - "description": "Please provide your details to set up international transfers", + "title": "USD-rekening", + "description": "Geef je gegevens op om je USD-rekening in te stellen", "fullName": "Full Name", "fullNamePlaceholder": "Enter your full name", "email": "Email", @@ -1552,7 +1566,10 @@ "fullNameRequired": "Full name is required", "emailRequired": "Email is required", "invalidEmail": "Please enter a valid email address", - "kycTypeRequired": "Please select an account type" + "kycTypeRequired": "Please select an account type", + "pendingTitle": "Verificatie in behandeling", + "pendingBody": "Je identiteitsverificatie is in behandeling. Wacht op goedkeuring.", + "genericError": "Er is iets misgegaan. Probeer het opnieuw." }, "FygaroWebViewScreen": { "title": "Fygaro Payment", diff --git a/app/i18n/raw-i18n/translations/pt.json b/app/i18n/raw-i18n/translations/pt.json index 8b9335106..f785c5584 100644 --- a/app/i18n/raw-i18n/translations/pt.json +++ b/app/i18n/raw-i18n/translations/pt.json @@ -1471,13 +1471,6 @@ } }, "AccountUpgrade": { - "accountType": "Tipo de Conta", - "personal": "Pessoal Pessoal", - "personalDesc": "Segure sua carteira com telefone e e-mail, mantenha-se seguro e recupere-se facilmente se necessário", - "pro": "Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro", - "proDesc": "Aceitar pagamentos e ser descoberto no mapa requer um nome de negócio e localização.", - "merchant": "Merchant Merchant", - "merchantDesc": "Dê recompensas, apareça no mapa e decida no seu banco.", "personalInfo": "Informações pessoais", "fullName": "Nome completo", "phoneNumber": "Número de telefone", @@ -1504,10 +1497,31 @@ "accountNum": "Número de Conta ", "accountNumPlaceholder": "Digite o seu número de conta.", "uploadId": "Faça o upload de ID Document", - "successUpgrade": "Você atualizou com sucesso sua conta para {accountType: string}", - "successRequest": "Você solicitou com sucesso a atualização de sua conta para {accountType: string}", - "international": "International", - "internationalDesc": "Get an international account and routing number for bank transfers. ID required." + "badgeBankPayout": "Saque bancário", + "badgeUsdAccount": "Conta em USD", + "bankCashoutTitle": "Saque bancário", + "bankCashoutDesc": "Saque JMD para o seu banco jamaicano", + "businessTitle": "Negócio", + "businessDesc": "Apareça no mapa da Flash e recompense seus clientes", + "enabled": "Ativo", + "hubEyebrow": "Sua conta Flash", + "hubTitle": "Faça mais com a Flash", + "inReview": "Em análise", + "sectionGetPaid": "Formas de receber pagamentos", + "sectionGrow": "Crescer", + "setUp": "Configurar", + "statusBusiness": "Negócio", + "statusTrial": "Conta de teste", + "statusUnauthorized": "Conta não autorizada", + "statusVerified": "Verificada", + "successBankPayoutRequest": "Sua solicitação de saque bancário foi enviada para análise", + "successBusinessRequest": "Sua solicitação de upgrade para negócio foi enviada para análise", + "successVerified": "Sua conta está verificada", + "usdAccountTitle": "Conta bancária virtual em USD", + "usdAccountDesc": "Seu próprio número de conta e routing dos EUA — receba ACH, transferências e salário", + "verifyTitle": "Verifique sua conta", + "verifyDesc": "Só o seu número de telefone · limites mais altos em um minuto", + "lockedVerifyFirst": "Verifique sua conta primeiro para desbloquear" }, "CashWalletCutover": { "title": "Cash Wallet Updated", @@ -1538,8 +1552,8 @@ "minimumAmount": "Minimum amount is $1.00" }, "BridgeKyc": { - "title": "International Transfer", - "description": "Please provide your details to set up international transfers", + "title": "Conta em USD", + "description": "Forneça seus dados para configurar sua conta em USD", "fullName": "Full Name", "fullNamePlaceholder": "Enter your full name", "email": "Email", @@ -1552,7 +1566,10 @@ "fullNameRequired": "Full name is required", "emailRequired": "Email is required", "invalidEmail": "Please enter a valid email address", - "kycTypeRequired": "Please select an account type" + "kycTypeRequired": "Please select an account type", + "pendingTitle": "Verificação pendente", + "pendingBody": "A verificação da sua identidade está pendente. Aguarde a aprovação.", + "genericError": "Algo deu errado. Tente novamente." }, "FygaroWebViewScreen": { "title": "Fygaro Payment", diff --git a/app/i18n/raw-i18n/translations/qu.json b/app/i18n/raw-i18n/translations/qu.json index 69542dfcd..e2e572ebd 100644 --- a/app/i18n/raw-i18n/translations/qu.json +++ b/app/i18n/raw-i18n/translations/qu.json @@ -1471,13 +1471,6 @@ } }, "AccountUpgrade": { - "accountType": "Cuenta Tipu", - "personal": "Personal Personal ", - "personalDesc": "Qhapaq qollqeykita llamkaywan, correo electrónicowan jark'aq.", - "pro": "Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro", - "proDesc": "Paykunata chaskiyta munaspaqa, cartapi tarikunchik.", - "merchant": "Comerciante sutiyuq p'anqamanqa kay qatiq p'anqakunam t'inkimun:", - "merchantDesc": "Qhapaq qollqeta churay, mapapi rikhuriy, qollqeta qollqeta qollqeta qollqeta qollqeta qollqeta qollqeta qollqeta qollqeta qollqeta qollqeta qollqeta qollqeta qollqeta qollqeta qollqeta qollqeta qollqeta qollqeta qollqeta qollqeta qollqeta qollqeta qollqeta qollqeta qollqeta qollqeta qollqeta qollqeta qollqeta qollqeta qollqeta qollqeta qollqeta qollqeta qollqeta qollqeta qollqeta qollqeta qollqeta qollqeta qollqeta.", "personalInfo": "Qhapaq qhichwa qillqasqan", "fullName": "Llumpayta sutin", "phoneNumber": "Nombre de teléfono sutiyuq p'anqamanqa kay qatiq p'anqakunam t'inkimun:", @@ -1504,10 +1497,31 @@ "accountNum": "Ñawpaq qillqasqa qillqasqa qillqasqa qillqasqa qillqasqa qillqasqa qillqasqa qillqasqa qillqasqa qillqasqa qillqasqa qillqasqa qillqasqa qillqasqa qillqasqa qillqasqa qillqasqa qillqasqa qillqasqa qillqasqa qillqasqa qillqasqa qillqasqa qillqasqa qillqasqa qillqasqa qillqasqa qillqasqa qillqasqa qillqasqa qillqasqa qillqasqa qillqasqa qillqasqa qillqasqa qillqasqa qillqasqa qillqasqa qillqasqa qillqasqa qillqasqa qillqasqa qillqasqa qillqasqa qillqasqa qillqasqa qillqasqa qillqasqa qillqasqa", "accountNumPlaceholder": "Paykunapa huñunakuymanta willakuyninkunata willay.", "uploadId": "Commons nisqaqa multimidya kapuyninkunayuqmi kay hawa: Upload ID Document.", - "successUpgrade": "Qawasqaykimantaqa {accountType: string}-manmi hatuncharqanki.", - "successRequest": "Qamkunaqa allinpaqmi mañakurqankichik {accountType: string} sutiyuq p'anqamanqa kay qatiq p'anqakunam t'inkimun:", - "international": "International", - "internationalDesc": "Get an international account and routing number for bank transfers. ID required." + "badgeBankPayout": "Bancoman pagay", + "badgeUsdAccount": "USD cuenta", + "bankCashoutTitle": "Bancoman horqoy", + "bankCashoutDesc": "JMD qullqita Jamaica bancoykiman horqoy", + "businessTitle": "Negocio", + "businessDesc": "Flash mapapi rikhuriy, rantiqkunata premiay", + "enabled": "Hap'ichisqa", + "hubEyebrow": "Flash cuentayki", + "hubTitle": "Flashwan astawan ruray", + "inReview": "Qhawaypi kachkan", + "sectionGetPaid": "Imaynata pagasqa kanki", + "sectionGrow": "Wiñay", + "setUp": "Churay", + "statusBusiness": "Negocio", + "statusTrial": "Prueba cuenta", + "statusUnauthorized": "Mana kamachisqa cuenta", + "statusVerified": "Chiqaqchasqa", + "successBankPayoutRequest": "Bancoman horqoy mañakuyniyki qhawanapaq apachisqa", + "successBusinessRequest": "Negocio wicharichiy mañakuyniyki qhawanapaq apachisqa", + "successVerified": "Cuentayki chiqaqchasqa", + "usdAccountTitle": "USD virtual banco cuenta", + "usdAccountDesc": "Kikiykipa USA cuenta, routing numeroyki — ACH, transferencia, pago chaskiy", + "verifyTitle": "Cuentaykita chiqaqchay", + "verifyDesc": "Telefono numeroykillawan · aswan hatun limitekuna huk minutopi", + "lockedVerifyFirst": "Ñawpaqta cuentaykita chiqaqchay kichanapaq" }, "CashWalletCutover": { "title": "Cash Wallet Updated", @@ -1538,8 +1552,8 @@ "minimumAmount": "Minimum amount is $1.00" }, "BridgeKyc": { - "title": "International Transfer", - "description": "Please provide your details to set up international transfers", + "title": "USD cuenta", + "description": "Willakuyniykita quy USD cuentaykita churanapaq", "fullName": "Full Name", "fullNamePlaceholder": "Enter your full name", "email": "Email", @@ -1552,7 +1566,10 @@ "fullNameRequired": "Full name is required", "emailRequired": "Email is required", "invalidEmail": "Please enter a valid email address", - "kycTypeRequired": "Please select an account type" + "kycTypeRequired": "Please select an account type", + "pendingTitle": "Chiqaqchay suyasqa", + "pendingBody": "Identidadniyki chiqaqchay suyasqa kachkan. Aprobacionta suyay.", + "genericError": "Imapas mana allin. Ama hina kaspa, wakmanta ruray." }, "FygaroWebViewScreen": { "title": "Fygaro Payment", diff --git a/app/i18n/raw-i18n/translations/sr.json b/app/i18n/raw-i18n/translations/sr.json index ee740956c..64c27c16f 100644 --- a/app/i18n/raw-i18n/translations/sr.json +++ b/app/i18n/raw-i18n/translations/sr.json @@ -1471,13 +1471,6 @@ } }, "AccountUpgrade": { - "accountType": "Тип рачуна", - "personal": "Лично Лично", - "personalDesc": "Заштити свој новчаник телефоном и е-поштовом.", - "pro": "Про Про", - "proDesc": "Прихватајте плаћање и откријте се на мапи.", - "merchant": "Трговац Трговац", - "merchantDesc": "Дајте награде, појавите се на мапи и поставите се у своју банку.", "personalInfo": "Лична информација", "fullName": "Полно име", "phoneNumber": "Телефонски број", @@ -1504,10 +1497,31 @@ "accountNum": "Број рачуна ", "accountNumPlaceholder": "Уведите број рачуна", "uploadId": "Уведите идентификациони документ", - "successUpgrade": "Успешно сте унапредили свој рачун на {accountType: string}", - "successRequest": "Успешно сте захтевали да се ваш рачун унапреди на {accountType: string}", - "international": "International", - "internationalDesc": "Get an international account and routing number for bank transfers. ID required." + "badgeBankPayout": "Банковна исплата", + "badgeUsdAccount": "USD рачун", + "bankCashoutTitle": "Исплата на банку", + "bankCashoutDesc": "Исплатите JMD на своју јамајчанску банку", + "businessTitle": "Бизнис", + "businessDesc": "Будите на Flash мапи и наградите своје купце", + "enabled": "Укључено", + "hubEyebrow": "Ваш Flash налог", + "hubTitle": "Урадите више уз Flash", + "inReview": "У прегледу", + "sectionGetPaid": "Начини примања уплата", + "sectionGrow": "Раст", + "setUp": "Подеси", + "statusBusiness": "Бизнис", + "statusTrial": "Пробни налог", + "statusUnauthorized": "Неовлашћени налог", + "statusVerified": "Верификован", + "successBankPayoutRequest": "Ваш захтев за банковну исплату послат је на преглед", + "successBusinessRequest": "Ваш захтев за пословну надоградњу послат је на преглед", + "successVerified": "Ваш налог је верификован", + "usdAccountTitle": "Виртуелни банковни рачун у USD", + "usdAccountDesc": "Сопствени амерички број рачуна и routing — примајте ACH, дознаке и плату", + "verifyTitle": "Верификујте свој налог", + "verifyDesc": "Само ваш број телефона · већи лимити за минут", + "lockedVerifyFirst": "Прво верификујте свој налог да бисте откључали" }, "CashWalletCutover": { "title": "Cash Wallet Updated", @@ -1538,8 +1552,8 @@ "minimumAmount": "Minimum amount is $1.00" }, "BridgeKyc": { - "title": "International Transfer", - "description": "Please provide your details to set up international transfers", + "title": "USD рачун", + "description": "Унесите своје податке за отварање USD рачуна", "fullName": "Full Name", "fullNamePlaceholder": "Enter your full name", "email": "Email", @@ -1552,7 +1566,10 @@ "fullNameRequired": "Full name is required", "emailRequired": "Email is required", "invalidEmail": "Please enter a valid email address", - "kycTypeRequired": "Please select an account type" + "kycTypeRequired": "Please select an account type", + "pendingTitle": "Верификација на чекању", + "pendingBody": "Верификација вашег идентитета је на чекању. Сачекајте одобрење.", + "genericError": "Нешто је пошло по злу. Покушајте поново." }, "FygaroWebViewScreen": { "title": "Fygaro Payment", diff --git a/app/i18n/raw-i18n/translations/sw.json b/app/i18n/raw-i18n/translations/sw.json index b6449c08a..23ee9fe0f 100644 --- a/app/i18n/raw-i18n/translations/sw.json +++ b/app/i18n/raw-i18n/translations/sw.json @@ -1148,7 +1148,6 @@ "AccountUpgrade": { "accountNum": "Account Number", "accountNumPlaceholder": "Enter your account number", - "accountType": "Account Type", "bankAccountType": "Account Type", "bankBranch": "Bank Branch", "bankBranchPlaceholder": "Enter your bank branch", @@ -1165,24 +1164,39 @@ "flashTerminal": "Do you want a Flash terminal?", "flashTerminalTooltip": "A Flash Terminal is a smart device that can accept payment via Flash for your business and print receipts. A customer service representative will contact you if you check this box.", "fullName": "Full name", - "merchant": "Merchant", - "merchantDesc": "Give rewards, appear on the map, and settle to your bank. ID and bank info required.", "optional": " (Optional)", - "personal": "Personal", - "personalDesc": "Secure your wallet with phone and email. Stay safe and recover easily if needed", "personalInfo": "Personal Information", "phoneNumber": "Phone Number", - "pro": "Pro", - "proDesc": "Accept payments and get discovered on the map. Requires a business name and location.", "selectBankAccountType": "Select account type", "selectCurrency": "Select Currency", - "successRequest": "You successfully requested to upgrade your account to {accountType: string}", - "successUpgrade": "You successfully upgraded your account to {accountType: string}", "uploadId": "Upload ID Document", "validation": "Validation", "validationCode": "Validation code", - "international": "International", - "internationalDesc": "Get an international account and routing number for bank transfers. ID required." + "badgeBankPayout": "Malipo ya benki", + "badgeUsdAccount": "Akaunti ya USD", + "bankCashoutTitle": "Kutoa pesa benki", + "bankCashoutDesc": "Toa JMD kwenda benki yako ya Jamaica", + "businessTitle": "Biashara", + "businessDesc": "Onekana kwenye ramani ya Flash na uwazawadie wateja wako", + "enabled": "Imewashwa", + "hubEyebrow": "Akaunti yako ya Flash", + "hubTitle": "Fanya zaidi na Flash", + "inReview": "Inakaguliwa", + "sectionGetPaid": "Njia za kulipwa", + "sectionGrow": "Kua", + "setUp": "Weka", + "statusBusiness": "Biashara", + "statusTrial": "Akaunti ya majaribio", + "statusUnauthorized": "Akaunti isiyoidhinishwa", + "statusVerified": "Imethibitishwa", + "successBankPayoutRequest": "Ombi lako la kutoa pesa benki limewasilishwa kwa ukaguzi", + "successBusinessRequest": "Ombi lako la kupandisha hadhi ya biashara limewasilishwa kwa ukaguzi", + "successVerified": "Akaunti yako imethibitishwa", + "usdAccountTitle": "Akaunti pepe ya benki ya USD", + "usdAccountDesc": "Nambari yako mwenyewe ya akaunti na routing ya Marekani — pokea ACH, uhamisho na mshahara", + "verifyTitle": "Thibitisha akaunti yako", + "verifyDesc": "Nambari yako ya simu tu · vikomo vya juu ndani ya dakika moja", + "lockedVerifyFirst": "Thibitisha akaunti yako kwanza ili kufungua" }, "AdvancedModeModal": { "body": "- Your BTC is non-custodial, fees may apply.\n- You can swap between BTC and USD.\n- BTC may take up to 60s to confirm.\n\nDO NOT SHARE YOUR RECOVERY PHRASE!", @@ -1544,8 +1558,8 @@ "minimumAmount": "Minimum amount is $1.00" }, "BridgeKyc": { - "title": "International Transfer", - "description": "Please provide your details to set up international transfers", + "title": "Akaunti ya USD", + "description": "Tafadhali toa taarifa zako ili kuweka akaunti yako ya USD", "fullName": "Full Name", "fullNamePlaceholder": "Enter your full name", "email": "Email", @@ -1558,7 +1572,10 @@ "fullNameRequired": "Full name is required", "emailRequired": "Email is required", "invalidEmail": "Please enter a valid email address", - "kycTypeRequired": "Please select an account type" + "kycTypeRequired": "Please select an account type", + "pendingTitle": "Uthibitishaji unasubiri", + "pendingBody": "Uthibitishaji wa utambulisho wako unasubiri. Tafadhali subiri idhini.", + "genericError": "Hitilafu imetokea. Tafadhali jaribu tena." }, "FygaroWebViewScreen": { "title": "Fygaro Payment", diff --git a/app/i18n/raw-i18n/translations/th.json b/app/i18n/raw-i18n/translations/th.json index 7d7c5a001..b1306513d 100644 --- a/app/i18n/raw-i18n/translations/th.json +++ b/app/i18n/raw-i18n/translations/th.json @@ -1471,13 +1471,6 @@ } }, "AccountUpgrade": { - "accountType": "ประเภทบัญชี", - "personal": "รายละเอียดส่วนตัว", - "personalDesc": "ปลอดภัยกระเป๋าเปลือกของคุณด้วยโทรศัพท์และอีเมล ปลอดภัยและฟื้นฟูได้อย่างง่ายดายถ้าต้องการ", - "pro": "โปร โปร", - "proDesc": "ยอมรับการชําระเงินและได้รับการค้นพบบนแผนที่ จําเป็นต้องมีชื่อและสถานที่ของธุรกิจ", - "merchant": "นักค้า", - "merchantDesc": "แจกรางวัล ปรากฏบนแผนที่ และชําระเงินกับธนาคารของคุณ จําเป็นต้องมีบัตรประชาชนและข้อมูลธนาคาร", "personalInfo": "ข้อมูลส่วนตัว", "fullName": "ชื่อเต็ม", "phoneNumber": "เบอร์โทรศัพท์", @@ -1504,10 +1497,31 @@ "accountNum": "เบอร์บัญชี เบอร์บัญชี เบอร์บัญชี เบอร์บัญชี เบอร์บัญชี เบอร์บัญชี เบอร์บัญชี เบอร์บัญชี เบอร์บัญชี เบอร์บัญชี เบอร์บัญชี เบอร์บัญชี เบอร์บัญชี เบอร์บัญชี เบอร์บัญชี เบอร์บัญชี เบอร์บัญชี เบอร์บัญชี เบอร์บัญชี เบอร์บัญชี เบอร์บัญชี เบอร์บัญชี เบอร์บัญชี เบอร์บัญชี เบอร์บัญชี เบอร์บัญชี เบอร์บัญชี เบอร์บัญชี เบอร์บัญชี เบอร์บัญชี เบอร์บัญชี เบอร์บัญชี เบอร์บัญชี เบอร์บัญชี เบอร์บัญชี เบอร์บัญชี เบอร์บัญชี เบอร์บัญชี เบอร์บัญชี เบอร์บัญชี เบอร์บัญชี เบอร์บัญชี เบอร์บัญชี เบอร์บัญชี เบอร์บัญชี เบอร์บัญชี เบอร์บัญชี", "accountNumPlaceholder": "กรอกหมายเลขบัญชีของคุณ", "uploadId": "อัพโหลด ID Document", - "successUpgrade": "คุณได้ปรับปรุงบัญชีของคุณเป็น {accountType: string} ได้สําเร็จ", - "successRequest": "คุณขอให้อัพเกรดบัญชีของคุณเป็น {accountType: string} ได้สําเร็จ", - "international": "International", - "internationalDesc": "Get an international account and routing number for bank transfers. ID required." + "badgeBankPayout": "การจ่ายเงินเข้าธนาคาร", + "badgeUsdAccount": "บัญชี USD", + "bankCashoutTitle": "ถอนเงินเข้าธนาคาร", + "bankCashoutDesc": "ถอน JMD เข้าธนาคารจาเมกาของคุณ", + "businessTitle": "ธุรกิจ", + "businessDesc": "แสดงบนแผนที่ Flash และให้รางวัลลูกค้าของคุณ", + "enabled": "เปิดใช้งาน", + "hubEyebrow": "บัญชี Flash ของคุณ", + "hubTitle": "ทำได้มากขึ้นกับ Flash", + "inReview": "กำลังตรวจสอบ", + "sectionGetPaid": "วิธีรับเงิน", + "sectionGrow": "เติบโต", + "setUp": "ตั้งค่า", + "statusBusiness": "ธุรกิจ", + "statusTrial": "บัญชีทดลอง", + "statusUnauthorized": "บัญชีไม่ได้รับอนุญาต", + "statusVerified": "ยืนยันแล้ว", + "successBankPayoutRequest": "คำขอถอนเงินเข้าธนาคารของคุณถูกส่งเพื่อตรวจสอบแล้ว", + "successBusinessRequest": "คำขออัปเกรดธุรกิจของคุณถูกส่งเพื่อตรวจสอบแล้ว", + "successVerified": "บัญชีของคุณได้รับการยืนยันแล้ว", + "usdAccountTitle": "บัญชีธนาคารเสมือน USD", + "usdAccountDesc": "เลขบัญชีและเลข routing ของสหรัฐเป็นของคุณเอง — รับ ACH โอนเงิน และเงินเดือน", + "verifyTitle": "ยืนยันบัญชีของคุณ", + "verifyDesc": "ใช้แค่เบอร์โทรศัพท์ · เพิ่มวงเงินภายในหนึ่งนาที", + "lockedVerifyFirst": "ยืนยันบัญชีของคุณก่อนเพื่อปลดล็อก" }, "CashWalletCutover": { "title": "Cash Wallet Updated", @@ -1538,8 +1552,8 @@ "minimumAmount": "Minimum amount is $1.00" }, "BridgeKyc": { - "title": "International Transfer", - "description": "Please provide your details to set up international transfers", + "title": "บัญชี USD", + "description": "กรุณากรอกข้อมูลของคุณเพื่อตั้งค่าบัญชี USD", "fullName": "Full Name", "fullNamePlaceholder": "Enter your full name", "email": "Email", @@ -1552,7 +1566,10 @@ "fullNameRequired": "Full name is required", "emailRequired": "Email is required", "invalidEmail": "Please enter a valid email address", - "kycTypeRequired": "Please select an account type" + "kycTypeRequired": "Please select an account type", + "pendingTitle": "การยืนยันอยู่ระหว่างดำเนินการ", + "pendingBody": "การยืนยันตัวตนของคุณอยู่ระหว่างดำเนินการ กรุณารอการอนุมัติ", + "genericError": "เกิดข้อผิดพลาด กรุณาลองใหม่อีกครั้ง" }, "FygaroWebViewScreen": { "title": "Fygaro Payment", diff --git a/app/i18n/raw-i18n/translations/tr.json b/app/i18n/raw-i18n/translations/tr.json index 5bf21a7e5..1afedf69d 100644 --- a/app/i18n/raw-i18n/translations/tr.json +++ b/app/i18n/raw-i18n/translations/tr.json @@ -1471,13 +1471,6 @@ } }, "AccountUpgrade": { - "accountType": "Hesap Tipi", - "personal": "Kişisel Kişisel ", - "personalDesc": "Cüzdanınızı telefon ve e-posta ile koruyun.", - "pro": "Pro Pro", - "proDesc": "Ödemeleri kabul edin ve haritada keşfedilsin.", - "merchant": "Ticaretçi Ticaretçi", - "merchantDesc": "Ödüller verin, haritada görün ve banka hesabınıza ödeme yapın.", "personalInfo": "Kişisel Bilgiler", "fullName": "Tam adı", "phoneNumber": "Telefon numarası ", @@ -1504,10 +1497,31 @@ "accountNum": "Hesap numarası ", "accountNumPlaceholder": "Hesap numaranızı girin", "uploadId": "Yükleme Kimliği Belgesini ", - "successUpgrade": "Hesabınızı {accountType: string}'e başarılı bir şekilde yükseltmişsiniz.", - "successRequest": "Hesabınızı {accountType: string}'e yükseltmeyi başarıyla istediniz.", - "international": "International", - "internationalDesc": "Get an international account and routing number for bank transfers. ID required." + "badgeBankPayout": "Banka ödemesi", + "badgeUsdAccount": "USD hesabı", + "bankCashoutTitle": "Bankaya para çekme", + "bankCashoutDesc": "JMD'yi Jamaika'daki bankanıza çekin", + "businessTitle": "İşletme", + "businessDesc": "Flash haritasında görünün ve müşterilerinizi ödüllendirin", + "enabled": "Açık", + "hubEyebrow": "Flash hesabınız", + "hubTitle": "Flash ile daha fazlasını yapın", + "inReview": "İncelemede", + "sectionGetPaid": "Ödeme alma yolları", + "sectionGrow": "Büyüyün", + "setUp": "Kur", + "statusBusiness": "İşletme", + "statusTrial": "Deneme hesabı", + "statusUnauthorized": "Yetkisiz hesap", + "statusVerified": "Doğrulandı", + "successBankPayoutRequest": "Bankaya para çekme talebiniz incelenmek üzere gönderildi", + "successBusinessRequest": "İşletme yükseltme talebiniz incelenmek üzere gönderildi", + "successVerified": "Hesabınız doğrulandı", + "usdAccountTitle": "Sanal USD banka hesabı", + "usdAccountDesc": "Kendi ABD hesap ve routing numaranız — ACH, havale ve maaş alın", + "verifyTitle": "Hesabınızı doğrulayın", + "verifyDesc": "Sadece telefon numaranız · bir dakikada daha yüksek limitler", + "lockedVerifyFirst": "Kilidi açmak için önce hesabınızı doğrulayın" }, "CashWalletCutover": { "title": "Cash Wallet Updated", @@ -1538,8 +1552,8 @@ "minimumAmount": "Minimum amount is $1.00" }, "BridgeKyc": { - "title": "International Transfer", - "description": "Please provide your details to set up international transfers", + "title": "USD hesabı", + "description": "USD hesabınızı kurmak için lütfen bilgilerinizi girin", "fullName": "Full Name", "fullNamePlaceholder": "Enter your full name", "email": "Email", @@ -1552,7 +1566,10 @@ "fullNameRequired": "Full name is required", "emailRequired": "Email is required", "invalidEmail": "Please enter a valid email address", - "kycTypeRequired": "Please select an account type" + "kycTypeRequired": "Please select an account type", + "pendingTitle": "Doğrulama beklemede", + "pendingBody": "Kimlik doğrulamanız beklemede. Lütfen onayı bekleyin.", + "genericError": "Bir şeyler ters gitti. Lütfen tekrar deneyin." }, "FygaroWebViewScreen": { "title": "Fygaro Payment", diff --git a/app/i18n/raw-i18n/translations/vi.json b/app/i18n/raw-i18n/translations/vi.json index d2ed7b90d..7756cc52a 100644 --- a/app/i18n/raw-i18n/translations/vi.json +++ b/app/i18n/raw-i18n/translations/vi.json @@ -1471,13 +1471,6 @@ } }, "AccountUpgrade": { - "accountType": "Loại tài khoản", - "personal": "Cá nhân", - "personalDesc": "Bảo vệ ví của bạn bằng điện thoại và email.", - "pro": "Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro Pro", - "proDesc": "Chấp nhận thanh toán và được khám phá trên bản đồ.", - "merchant": "Thương nhân", - "merchantDesc": "Cung cấp phần thưởng, xuất hiện trên bản đồ và thanh toán với ngân hàng của bạn.", "personalInfo": "Thông tin cá nhân", "fullName": "Tên đầy đủ", "phoneNumber": "Số điện thoại ", @@ -1504,10 +1497,31 @@ "accountNum": "Số tài khoản ", "accountNumPlaceholder": "Nhập số tài khoản của bạn", "uploadId": "Upload ID Document", - "successUpgrade": "Bạn đã nâng cấp thành công tài khoản của mình lên {accountType: string}", - "successRequest": "Bạn đã yêu cầu thành công nâng cấp tài khoản của mình lên {accountType: string}", - "international": "International", - "internationalDesc": "Get an international account and routing number for bank transfers. ID required." + "badgeBankPayout": "Thanh toán qua ngân hàng", + "badgeUsdAccount": "Tài khoản USD", + "bankCashoutTitle": "Rút tiền về ngân hàng", + "bankCashoutDesc": "Rút JMD về ngân hàng Jamaica của bạn", + "businessTitle": "Doanh nghiệp", + "businessDesc": "Xuất hiện trên bản đồ Flash và tặng thưởng khách hàng của bạn", + "enabled": "Bật", + "hubEyebrow": "Tài khoản Flash của bạn", + "hubTitle": "Làm được nhiều hơn với Flash", + "inReview": "Đang xét duyệt", + "sectionGetPaid": "Các cách nhận tiền", + "sectionGrow": "Phát triển", + "setUp": "Thiết lập", + "statusBusiness": "Doanh nghiệp", + "statusTrial": "Tài khoản dùng thử", + "statusUnauthorized": "Tài khoản chưa được cấp quyền", + "statusVerified": "Đã xác minh", + "successBankPayoutRequest": "Yêu cầu rút tiền về ngân hàng của bạn đã được gửi để xét duyệt", + "successBusinessRequest": "Yêu cầu nâng cấp doanh nghiệp của bạn đã được gửi để xét duyệt", + "successVerified": "Tài khoản của bạn đã được xác minh", + "usdAccountTitle": "Tài khoản ngân hàng ảo USD", + "usdAccountDesc": "Số tài khoản và số routing Mỹ của riêng bạn — nhận ACH, chuyển khoản và lương", + "verifyTitle": "Xác minh tài khoản của bạn", + "verifyDesc": "Chỉ cần số điện thoại của bạn · nâng hạn mức trong một phút", + "lockedVerifyFirst": "Xác minh tài khoản của bạn trước để mở khóa" }, "CashWalletCutover": { "title": "Cash Wallet Updated", @@ -1538,8 +1552,8 @@ "minimumAmount": "Minimum amount is $1.00" }, "BridgeKyc": { - "title": "International Transfer", - "description": "Please provide your details to set up international transfers", + "title": "Tài khoản USD", + "description": "Vui lòng cung cấp thông tin để thiết lập tài khoản USD của bạn", "fullName": "Full Name", "fullNamePlaceholder": "Enter your full name", "email": "Email", @@ -1552,7 +1566,10 @@ "fullNameRequired": "Full name is required", "emailRequired": "Email is required", "invalidEmail": "Please enter a valid email address", - "kycTypeRequired": "Please select an account type" + "kycTypeRequired": "Please select an account type", + "pendingTitle": "Đang chờ xác minh", + "pendingBody": "Việc xác minh danh tính của bạn đang chờ xử lý. Vui lòng chờ phê duyệt.", + "genericError": "Đã xảy ra lỗi. Vui lòng thử lại." }, "FygaroWebViewScreen": { "title": "Fygaro Payment", diff --git a/app/i18n/raw-i18n/translations/xh.json b/app/i18n/raw-i18n/translations/xh.json index 30fe869bc..229bc5433 100644 --- a/app/i18n/raw-i18n/translations/xh.json +++ b/app/i18n/raw-i18n/translations/xh.json @@ -1471,13 +1471,6 @@ } }, "AccountUpgrade": { - "accountType": "Uhlobo lweAkhawunti", - "personal": "Personal Personal", - "personalDesc": "Khusela isipaji sakho ngefowuni kunye ne-imeyile.", - "pro": "Pro Pro", - "proDesc": "Yamkela iintlawulo uze ufumaneke kwimephu.", - "merchant": "Umrhwebi Umthengisi", - "merchantDesc": "Nika amabhaso, ubonakale kwimephu, uze uhlawule kwibhanki yakho.", "personalInfo": "Ulwazi lomntu siqu", "fullName": "Igama elipheleleyo", "phoneNumber": "Inombolo yefowuni ", @@ -1504,10 +1497,31 @@ "accountNum": "Inombolo yeAkhawunti ", "accountNumPlaceholder": "Faka inombolo yeakhawunti yakho", "uploadId": "Khuphela uxwebhu lwe-ID", - "successUpgrade": "Uphumelele ekuphuculeni iakhawunti yakho kwi-{accountType: string}", - "successRequest": "Ucele ngempumelelo ukuhlaziya iakhawunti yakho kwi-{accountType: string}", - "international": "International", - "internationalDesc": "Get an international account and routing number for bank transfers. ID required." + "badgeBankPayout": "Intlawulo yebhanki", + "badgeUsdAccount": "I-akhawunti ye-USD", + "bankCashoutTitle": "Ukukhupha imali ebhankini", + "bankCashoutDesc": "Khupha i-JMD uye kwibhanki yakho yaseJamaica", + "businessTitle": "Ishishini", + "businessDesc": "Bonakala kwimephu ye-Flash uze uvuze abathengi bakho", + "enabled": "Ivuliwe", + "hubEyebrow": "I-akhawunti yakho ye-Flash", + "hubTitle": "Yenza okungakumbi nge-Flash", + "inReview": "Iyahlolwa", + "sectionGetPaid": "Iindlela zokuhlawulwa", + "sectionGrow": "Khula", + "setUp": "Misela", + "statusBusiness": "Ishishini", + "statusTrial": "I-akhawunti yovavanyo", + "statusUnauthorized": "I-akhawunti engagunyaziswanga", + "statusVerified": "Iqinisekisiwe", + "successBankPayoutRequest": "Isicelo sakho sokukhupha imali ebhankini singenisiwe ukuze sihlolwe", + "successBusinessRequest": "Isicelo sakho sokuphucula ishishini singenisiwe ukuze sihlolwe", + "successVerified": "I-akhawunti yakho iqinisekisiwe", + "usdAccountTitle": "I-akhawunti yebhanki ebonakalayo ye-USD", + "usdAccountDesc": "Inombolo ye-akhawunti kunye ne-routing yase-US eyakho — fumana i-ACH, utyalo-mali nomvuzo", + "verifyTitle": "Qinisekisa i-akhawunti yakho", + "verifyDesc": "Inombolo yakho yefowuni kuphela · imida ephezulu ngomzuzu", + "lockedVerifyFirst": "Qinisekisa i-akhawunti yakho kuqala ukuze uvule" }, "CashWalletCutover": { "title": "Cash Wallet Updated", @@ -1538,8 +1552,8 @@ "minimumAmount": "Minimum amount is $1.00" }, "BridgeKyc": { - "title": "International Transfer", - "description": "Please provide your details to set up international transfers", + "title": "I-akhawunti ye-USD", + "description": "Nceda unike iinkcukacha zakho ukuze umisele i-akhawunti yakho ye-USD", "fullName": "Full Name", "fullNamePlaceholder": "Enter your full name", "email": "Email", @@ -1552,7 +1566,10 @@ "fullNameRequired": "Full name is required", "emailRequired": "Email is required", "invalidEmail": "Please enter a valid email address", - "kycTypeRequired": "Please select an account type" + "kycTypeRequired": "Please select an account type", + "pendingTitle": "Uqinisekiso lulindile", + "pendingBody": "Uqinisekiso lwesazisi sakho lulindile. Nceda ulinde imvume.", + "genericError": "Kukho into engahambanga kakuhle. Nceda uzame kwakhona." }, "FygaroWebViewScreen": { "title": "Fygaro Payment", diff --git a/app/navigation/root-navigator.tsx b/app/navigation/root-navigator.tsx index f78230bd4..8a237ebcc 100644 --- a/app/navigation/root-navigator.tsx +++ b/app/navigation/root-navigator.tsx @@ -637,7 +637,9 @@ export const RootStack = () => { +// "locked" = prerequisite not met (unverified) or feature remotely disabled — +// the row stays visible so the capability is discoverable, but can't be tapped. +type CapRowStatus = "available" | "on" | "pending" | "locked" + +type CapRow = { + icon: string + title: string + desc: string + status: CapRowStatus + onPress: () => void +} + +/** + * "Do more with Flash" capabilities hub (ENG-513). + * + * Replaces the old tier ladder (Personal/Pro/Merchant/International) with a + * menu of independent capabilities. Verify is the only prerequisite; each row + * routes straight into that one capability's existing setup flow — no interview. + * The internal L1/L2/L3 level stays hidden; rows key off the `capabilities` + * object from `useAccountStatus`, falling back to a level derivation for older + * backends. + */ const AccountType: React.FC = ({ navigation }) => { const dispatch = useAppDispatch() const styles = useStyles() const { colors } = useTheme().theme const { LL } = useI18nContext() const { currentLevel } = useLevel() - const { toggleActivityIndicator } = useActivityIndicator() - const { bridgeTopupEnabled } = useFeatureFlags() - - const [bridgeKycModalVisible, setBridgeKycModalVisible] = useState(false) - - const [initiateBridgeKyc] = useBridgeInitiateKycMutation() - const { data: kycStatusData, refetch: refetchKycStatus } = useBridgeKycStatusQuery({ - fetchPolicy: "cache-and-network", - skip: !bridgeTopupEnabled, - }) + const { statusHeadline, capabilities, refetch: refetchStatus } = useAccountStatus() + const { + bridgeTopupEnabled, + bridgeKycStatus, + refetchKycStatus, + kycModalVisible, + startBridgeKyc, + closeKycModal, + submitBridgeKyc, + } = useBridgeKyc() useFocusEffect( useCallback(() => { - if (!bridgeTopupEnabled) return - refetchKycStatus() - }, [bridgeTopupEnabled, refetchKycStatus]), + refetchStatus() + if (bridgeTopupEnabled) refetchKycStatus() + }, [bridgeTopupEnabled, refetchKycStatus, refetchStatus]), ) - const bridgeKycStatus = kycStatusData?.bridgeKycStatus + // `capabilities` already carries the level-derived fallback for older + // backends — useAccountStatus is the single source of capability truth. + const verifiedOn = capabilities.verified + const bankOn = capabilities.bankPayout + const businessOn = capabilities.business + const usdOn = capabilities.usdAccount + + // Bridge KYC has an L1 floor, and ENG-465 can remotely disable Bridge — + // in both cases the row shows locked rather than disappearing. + const usdStatus: CapRowStatus = usdOn + ? "on" + : bridgeKycStatus === "pending" + ? "pending" + : !bridgeTopupEnabled || !verifiedOn + ? "locked" + : "available" + // When the lock is the L1 floor (not the kill switch), say how to lift it. + const usdNeedsVerify = usdStatus === "locked" && bridgeTopupEnabled && !verifiedOn const onPress = (accountType: string) => { const numOfSteps = @@ -61,132 +95,162 @@ const AccountType: React.FC = ({ navigation }) => { navigation.navigate("PersonalInformation") } - const checkBridgeKyc = () => { - if (!bridgeTopupEnabled) return - - if (bridgeKycStatus === "pending") { - Alert.alert("KYC Pending", "Your KYC status is pending. Please wait for approval.") - } else { - setBridgeKycModalVisible(true) - } - } - - const getBridgeKycLink = async (data: { - fullName: string - email: string - kycType: string - }) => { - toggleActivityIndicator(true) - try { - const res = await initiateBridgeKyc({ - variables: { - input: { - full_name: data.fullName, - email: data.email, - type: data.kycType, - }, - }, - }) - toggleActivityIndicator(false) - const errors = res.data?.bridgeInitiateKyc?.errors - if (errors && errors.length > 0) { - Alert.alert("Error", errors[0].message) - return - } - const kycLink = res.data?.bridgeInitiateKyc?.kycLink - if (kycLink?.tosLink && kycLink?.kycLink) { - navigation.navigate("BridgeKycWebView", { - tosLink: kycLink.tosLink, - kycLink: kycLink.kycLink, - }) - } - } catch (err) { - toggleActivityIndicator(false) - Alert.alert("Error", "Something went wrong. Please try again.") - } - } - - const numOfSteps = currentLevel === AccountLevel.Zero ? 3 : 4 + const isTrial = statusHeadline === "TRIAL" || !verifiedOn + const headlineLabel = isTrial + ? LL.AccountUpgrade.statusTrial() + : statusHeadline === "BUSINESS" + ? LL.AccountUpgrade.statusBusiness() + : LL.AccountUpgrade.statusVerified() - return ( - - - {currentLevel === AccountLevel.Zero && ( - onPress(AccountLevel.One)}> - - - - {LL.AccountUpgrade.personal()} - - - {LL.AccountUpgrade.personalDesc()} - - - - - )} - {(currentLevel === AccountLevel.Zero || currentLevel === AccountLevel.One) && ( - onPress(AccountLevel.Two)}> - - - - {LL.AccountUpgrade.pro()} - - - {LL.AccountUpgrade.proDesc()} - - - - - )} - onPress(AccountLevel.Three)}> - + const renderCapRow = ({ icon, title, desc, status, onPress: onRowPress }: CapRow) => { + const on = status === "on" + return ( + + + + - {LL.AccountUpgrade.merchant()} + {title} - - {LL.AccountUpgrade.merchantDesc()} + + {desc} - + {on ? ( + + + {LL.AccountUpgrade.enabled()} + + ) : status === "pending" ? ( + + + {LL.AccountUpgrade.inReview()} + + ) : status === "locked" ? ( + + + + ) : ( + + {LL.AccountUpgrade.setUp()} + + + )} - {bridgeTopupEnabled && - currentLevel !== AccountLevel.Zero && - bridgeKycStatus !== "approved" && ( + ) + } + + return ( + + + + + {LL.AccountUpgrade.hubEyebrow()} + + + {LL.AccountUpgrade.hubTitle()} + + + + {!isTrial && ( + + )} + + {headlineLabel} + + + + + + {!verifiedOn && ( onPress(AccountLevel.One)} > - + + + - {LL.AccountUpgrade.international()} + {LL.AccountUpgrade.verifyTitle()} - - {LL.AccountUpgrade.internationalDesc()} + + {LL.AccountUpgrade.verifyDesc()} )} + + {LL.AccountUpgrade.sectionGetPaid()} + {renderCapRow({ + icon: "business", + title: LL.AccountUpgrade.bankCashoutTitle(), + desc: LL.AccountUpgrade.bankCashoutDesc(), + status: bankOn ? "on" : "available", + onPress: () => onPress(AccountLevel.Two), + })} + {renderCapRow({ + icon: "logo-usd", + title: LL.AccountUpgrade.usdAccountTitle(), + desc: usdNeedsVerify + ? LL.AccountUpgrade.lockedVerifyFirst() + : LL.AccountUpgrade.usdAccountDesc(), + status: usdStatus, + onPress: () => { + startBridgeKyc() + }, + })} + + {LL.AccountUpgrade.sectionGrow()} + {renderCapRow({ + icon: "storefront", + title: LL.AccountUpgrade.businessTitle(), + desc: LL.AccountUpgrade.businessDesc(), + status: businessOn ? "on" : "available", + onPress: () => onPress(AccountLevel.Three), + })} + + setBridgeKycModalVisible(false)} - onSubmit={(data) => { - setBridgeKycModalVisible(false) - getBridgeKycLink(data) - }} + visible={kycModalVisible} + onClose={closeKycModal} + onSubmit={submitBridgeKyc} /> ) @@ -195,17 +259,113 @@ const AccountType: React.FC = ({ navigation }) => { export default AccountType const useStyles = makeStyles(({ colors }) => ({ + container: { + paddingHorizontal: 20, + paddingTop: 8, + paddingBottom: 32, + }, + header: { + marginBottom: 8, + }, + eyebrow: { + color: colors.grey2, + }, + title: { + marginTop: 2, + }, + statusRow: { + flexDirection: "row", + marginTop: 14, + }, + pill: { + flexDirection: "row", + alignItems: "center", + paddingVertical: 7, + paddingHorizontal: 14, + borderRadius: 999, + }, + pillOn: { + backgroundColor: colors.primary, + }, + pillMuted: { + backgroundColor: colors.grey4, + }, + pillText: { + fontWeight: "600", + }, + pillTextOn: { + color: colors._white, + marginLeft: 6, + }, + pillTextMuted: { + color: colors.grey1, + }, + sectionLabel: { + color: colors.grey2, + fontSize: 12, + fontWeight: "700", + letterSpacing: 1.2, + textTransform: "uppercase", + marginTop: 22, + marginBottom: 10, + }, card: { + flexDirection: "row", + alignItems: "center", + backgroundColor: colors.grey5, + padding: 14, + marginVertical: 6, + borderRadius: 16, + }, + verifyCard: { flexDirection: "row", alignItems: "center", backgroundColor: colors.grey5, padding: 15, - marginHorizontal: 20, - marginVertical: 10, - borderRadius: 20, + marginTop: 4, + borderRadius: 16, + borderWidth: 1, + borderColor: colors.primary, + }, + verifyIcon: { + width: 44, + height: 44, + borderRadius: 12, + backgroundColor: colors.primary, + alignItems: "center", + justifyContent: "center", + }, + rowIcon: { + width: 42, + height: 42, + borderRadius: 12, + backgroundColor: colors.grey4, + alignItems: "center", + justifyContent: "center", + }, + rowIconOn: { + backgroundColor: colors.primary, }, textWrapper: { flex: 1, - marginHorizontal: 15, + marginHorizontal: 14, + }, + desc: { + marginTop: 2, + color: colors.grey1, + }, + action: { + flexDirection: "row", + alignItems: "center", + }, + setupText: { + color: colors.primary, + fontWeight: "600", + marginRight: 3, + }, + onText: { + color: colors.grey1, + fontWeight: "600", + marginLeft: 4, }, })) diff --git a/app/screens/account-upgrade-flow/Success.tsx b/app/screens/account-upgrade-flow/Success.tsx index 878b95b3c..904018e98 100644 --- a/app/screens/account-upgrade-flow/Success.tsx +++ b/app/screens/account-upgrade-flow/Success.tsx @@ -18,8 +18,6 @@ import { AccountLevel } from "@app/graphql/generated" type Props = StackScreenProps -const accountTypeLabel = { ONE: "PERSONAL", TWO: "PRO", THREE: "MERCHANT" } - const Success: React.FC = ({ navigation }) => { const styles = useStyles() const { colors } = useTheme().theme @@ -34,15 +32,20 @@ const Success: React.FC = ({ navigation }) => { }) } - const text = accountType === AccountLevel.One ? "successUpgrade" : "successRequest" + // ENG-516: capability language, not tier language. Verify applies + // immediately; bank-payout / business upgrades are requests pending review. + const successText = + accountType === AccountLevel.Two + ? LL.AccountUpgrade.successBankPayoutRequest() + : accountType === AccountLevel.Three + ? LL.AccountUpgrade.successBusinessRequest() + : LL.AccountUpgrade.successVerified() return ( - {LL.AccountUpgrade[text]({ - accountType: accountTypeLabel[accountType as keyof typeof accountTypeLabel], - })} + {successText} diff --git a/app/screens/account-upgrade-flow/Validation.tsx b/app/screens/account-upgrade-flow/Validation.tsx index 184979a15..c9b7a5361 100644 --- a/app/screens/account-upgrade-flow/Validation.tsx +++ b/app/screens/account-upgrade-flow/Validation.tsx @@ -68,7 +68,7 @@ const Validation: React.FC = ({ navigation, route }) => { } else { Alert.alert( LL.PhoneRegistrationValidateScreen.successTitle(), - LL.AccountUpgrade.successUpgrade({ accountType: "PERSONAL" }), + LL.AccountUpgrade.successVerified(), [ { text: "Continue", diff --git a/app/screens/settings-screen/account-screen.tsx b/app/screens/settings-screen/account-screen.tsx index baa727b27..5b50e8300 100644 --- a/app/screens/settings-screen/account-screen.tsx +++ b/app/screens/settings-screen/account-screen.tsx @@ -27,6 +27,7 @@ import { GaloySecondaryButton } from "@app/components/atomic/galoy-secondary-but import { getCashWallet } from "@app/graphql/wallets-utils" import { useNavigation } from "@react-navigation/native" import { useAppConfig, useBreez } from "@app/hooks" +import { useAccountStatus } from "@app/hooks/use-account-status" import useNostrProfile from "@app/hooks/use-nostr-profile" gql` @@ -129,6 +130,7 @@ export const AccountScreen = () => { } = useTheme() const { isAtLeastLevelZero, currentLevel, isAtLeastLevelOne } = useLevel() + const { statusHeadline, capabilities } = useAccountStatus() const [deleteAccount] = useAccountDeleteMutation() const [emailDeleteMutation] = useUserEmailDeleteMutation() @@ -412,12 +414,26 @@ export const AccountScreen = () => { ) } + // ENG-516 light headline status: one word (Trial / Verified / Business) + // with capability badges as supporting detail. The numeric level is + // internal and no longer shown. + const headlineLabel = { + TRIAL: LL.AccountUpgrade.statusTrial(), + VERIFIED: LL.AccountUpgrade.statusVerified(), + BUSINESS: LL.AccountUpgrade.statusBusiness(), + }[statusHeadline] + const capabilityBadges = [ + capabilities.bankPayout ? LL.AccountUpgrade.badgeBankPayout() : null, + capabilities.usdAccount ? LL.AccountUpgrade.badgeUsdAccount() : null, + ].filter(Boolean) + const statusText = [headlineLabel, ...capabilityBadges].join(" · ") + const accountSettingsList: SettingRow[] = [ { category: LL.AccountScreen.accountLevel(), id: "level", icon: "flash", - subTitleText: currentLevel, + subTitleText: statusText, enabled: false, greyed: true, }, diff --git a/app/screens/settings-screen/bank-accounts/bank-accounts-screen.tsx b/app/screens/settings-screen/bank-accounts/bank-accounts-screen.tsx index f3428aa3d..11989cbfa 100644 --- a/app/screens/settings-screen/bank-accounts/bank-accounts-screen.tsx +++ b/app/screens/settings-screen/bank-accounts/bank-accounts-screen.tsx @@ -7,9 +7,15 @@ import { StackNavigationProp } from "@react-navigation/stack" import { Icon, Text, makeStyles, useTheme } from "@rneui/themed" import { Screen } from "@app/components/screen" +import { BridgeKycModal } from "@app/components/topup-cashout-flow" import { WHATSAPP_SUPPORT_URL } from "@app/config" +import { AccountLevel } from "@app/graphql/generated" +import { useAccountStatus } from "@app/hooks/use-account-status" +import { useBridgeKyc } from "@app/hooks/use-bridge-kyc" import { useI18nContext } from "@app/i18n/i18n-react" import { RootStackParamList } from "@app/navigation/stack-param-lists" +import { useAppDispatch } from "@app/store/redux" +import { setAccountUpgrade } from "@app/store/redux/slices/accountUpgradeSlice" import { openWhatsAppUrl } from "@app/utils/external" import { toastShow } from "@app/utils/toast" @@ -276,6 +282,22 @@ export const BankAccountsScreen: React.FC = () => { const { loading, kycApproved, receiveAccount, withdrawGroups, setDefault, refetch } = useBankAccounts() + // The locked card gates on the usdAccount capability (Bridge KYC), so its + // CTA launches the KYC flow directly (ENG-516). Bridge has an L1 floor: + // unverified accounts are sent through the verify wizard first. + const { kycModalVisible, startBridgeKyc, closeKycModal, submitBridgeKyc } = + useBridgeKyc() + const { capabilities } = useAccountStatus() + const dispatch = useAppDispatch() + const onVerifyIdentity = () => { + if (!capabilities.verified) { + dispatch(setAccountUpgrade({ accountType: AccountLevel.One, numOfSteps: 3 })) + navigation.navigate("PersonalInformation") + return + } + startBridgeKyc() + } + useFocusEffect( React.useCallback(() => { refetch() @@ -326,10 +348,7 @@ export const BankAccountsScreen: React.FC = () => { {LL.BankAccountsScreen.verifyIdentityDescription()} - navigation.navigate("AccountType")} - > + { {LL.BankAccountsScreen.contactSupport()} + + ) } diff --git a/app/screens/settings-screen/settings/account-level.tsx b/app/screens/settings-screen/settings/account-level.tsx index cc1ad9c42..d165eb0e5 100644 --- a/app/screens/settings-screen/settings/account-level.tsx +++ b/app/screens/settings-screen/settings/account-level.tsx @@ -1,29 +1,36 @@ import { RootStackParamList } from "@app/navigation/stack-param-lists" import { StackNavigationProp } from "@react-navigation/stack" import { useNavigation } from "@react-navigation/native" -import { useLevel } from "@app/graphql/level-context" +import { AccountLevel, useLevel } from "@app/graphql/level-context" +import { useAccountStatus } from "@app/hooks/use-account-status" import { useI18nContext } from "@app/i18n/i18n-react" // components import { SettingsRow } from "../row" -const accountType = { - NonAuth: "UNAUTHORIZED ACCOUNT", - ZERO: "TRIAL ACCOUNT", - ONE: "PERSONAL ACCOUNT", - TWO: "PRO ACCOUNT", - THREE: "MERCHANT ACCOUNT", -} - export const AccountLevelSetting: React.FC = () => { - const { currentLevel: level } = useLevel() + const { currentLevel } = useLevel() + const { statusHeadline } = useAccountStatus() const { LL } = useI18nContext() const { navigate } = useNavigation>() + // ENG-516 light headline status: the account leads with one word — + // Trial → Verified → Business. Pro/International/Merchant are retired. + const headlineLabel = { + TRIAL: LL.AccountUpgrade.statusTrial(), + VERIFIED: LL.AccountUpgrade.statusVerified(), + BUSINESS: LL.AccountUpgrade.statusBusiness(), + } + + const subtitle = + currentLevel === AccountLevel.NonAuth + ? LL.AccountUpgrade.statusUnauthorized() + : headlineLabel[statusHeadline] + return ( { navigate("accountScreen")