Skip to content

Conversation

@paolampilla
Copy link
Contributor

@paolampilla paolampilla commented Dec 4, 2025

Related Issue

Closes veworld/veworld-private#574

Description of Changes

Add wrapper for NFT send flow

Reviewer(s)

@Doublemme @hughlivingstone @HiiiiD

UI/UX Changes

Simulator.Screen.Recording.-.iPhone.16.Pro.-.2025-12-05.at.10.21.32.mp4

Checklist

  • Code adheres to project guidelines and conventions.
  • Unit tests, if applicable, are updated and passing.
  • Documentation, if applicable, has been updated.
  • UI/UX changes include visuals (video or screenshots).

Thank you for contributing! 🎉

Summary by CodeRabbit

  • New Features

    • Added NFT (collectible) send flow with a two-step receiver + review experience, step indicator, animated transitions, and navigation entry for sending collectibles.
    • Send action now respects a feature toggle to route users to the appropriate send flow.
  • Documentation

    • Added and updated translation strings across languages for the new send collectible UI, step labels, and related messages.

✏️ Tip: You can customize this high-level summary in your review settings.

@coderabbitai
Copy link

coderabbitai bot commented Dec 4, 2025

Walkthrough

Adds an NFT-specific two-step send flow (insertAddress → summary) with a new SendNFTContextProvider, feature-flagged navigation to a new SEND_NFT route, type/export changes to the Send context, theme color adjustments for step UI, and translation additions for send/step/receiver across many locales.

Changes

Cohort / File(s) Summary
Send NFT Screen & exports
src/Screens/Flows/App/NFT/SendNFTScreen/SendNFTScreen.tsx, src/Screens/Flows/App/NFT/SendNFTScreen/index.ts, src/Screens/Flows/App/NFT/index.ts
Adds SendNFTScreen and SendNFTScreenContent implementing a two-step animated NFT send flow and re-exports it from module barrels.
Send NFT Context & tests
src/Components/Reusable/Send/Provider/SendNFTContextProvider.tsx, src/Components/Reusable/Send/Provider/SendNFTContextProvider.spec.tsx
New SendNFTContextProvider manages NFT send flow state, navigation (insertAddress/summary), button enable flags, and tests covering initialization, state updates, navigation, and boundary behavior.
Send context types & re-exports
src/Components/Reusable/Send/Provider/SendContextProvider.tsx, src/Components/Reusable/Send/Provider/index.ts
Exports SendFlowState (now including optional nft?: NonFungibleToken), exports SendContextType and SendContext; re-exports SendNFTContextProvider from provider index.
Navigation stacks
src/Navigation/Stacks/HomeStack.tsx, src/Navigation/Stacks/NFTStack.tsx
Adds SEND_NFT route param { contractAddress: string; tokenId: string }, registers SendNFTScreen, and gates collectible screens with the same feature flag.
Feature-flagged send routing
src/Components/Collectibles/CollectiblesSendActionButton.tsx, src/Screens/Flows/App/NFT/NFTDetailScreen/NFTDetailScreen.tsx
Reads useFeatureFlags().betterWorldFeature.balanceScreen?.send?.enabled and routes to SEND_NFT when enabled, otherwise INSERT_ADDRESS_SEND; dependency arrays updated accordingly.
Theme color structure
src/Constants/Theme/Colors.ts
Moves stepText from sendScreen.tokenAmountCard to top-level sendScreen and adds sendScreen.stepBackground across light/dark palettes.
i18n types
src/i18n/i18n-types.ts
Adds TypeScript definitions for new translation keys: SEND_COLLECTIBLE, SEND_RECEIVER, SEND_REVIEW_DETAILS, SEND_STEP_OF, and related placeholders.
Translations
src/i18n/translations/{de,en,es,fr,hi,it,ja,ko,nl,pl,pt,ru,sv,tr,tw,vi,zh}.json
Adds SEND_COLLECTIBLE, SEND_RECEIVER, SEND_REVIEW_DETAILS, SEND_STEP_OF and updates several send-related and alert strings across multiple locales (value changes only).

Sequence Diagram(s)

sequenceDiagram
    actor User
    participant UI as CollectiblesSendActionButton / NFTDetail
    participant FF as FeatureFlags
    participant Nav as Navigator
    participant Screen as SendNFTScreen
    participant Context as SendNFTContextProvider
    participant Store as Redux

    User->>UI: Tap "Send"
    UI->>FF: read betterWorldFeature.balanceScreen.send.enabled
    alt feature enabled
        FF-->>Nav: route SEND_NFT(contractAddress, tokenId)
    else feature disabled
        FF-->>Nav: route INSERT_ADDRESS_SEND(contractAddress, tokenId)
    end
    Nav->>Screen: mount SendNFTScreen(params)
    Screen->>Store: select/fetch NFT details
    Store-->>Screen: NFT data
    Screen->>Context: initialize flow with NFT
    Note over Context: step = insertAddress
    User->>Context: enter address (setFlowState)
    User->>Context: goToNext()
    Context-->>Context: step -> summary (animated transition)
    User->>Context: review & confirm (trigger send)
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

  • Pay attention to animation logic and reanimated shared values in SendNFTScreen.tsx.
  • Verify SendNFTContextProvider navigation boundary logic and correct exposure of context types/exports.
  • Confirm feature-flag dependency usage and navigation param shapes in Home/NFT stacks.
  • Spot-check translation placeholders ({currentStep}, {totalSteps}) for consistency.

Possibly related PRs

Suggested reviewers

  • hughlivingstone
  • Jonathansoufer
  • Doublemme
  • HiiiiD

Poem

🐰 A rabbit hops to send an NFT tonight,
Two gentle steps — address then review — so right,
Context snug like a burrow, flags light the way,
Translations whisper in many tongues today,
Hop, confirm, and watch the collectible take flight!

Pre-merge checks and finishing touches

❌ Failed checks (1 inconclusive)
Check name Status Explanation Resolution
Title check ❓ Inconclusive The title '574 send nft wrapper' is vague and uses non-descriptive terms. While it references an issue number and mentions NFT, it lacks clarity about the specific change and contains unclear spacing. Revise the title to be more descriptive and concise, such as 'Add SendNFTScreen wrapper with context provider' or 'Implement NFT send flow with feature flag support'.
✅ Passed checks (2 passed)
Check name Status Explanation
Description check ✅ Passed The description includes all required sections from the template: Related Issue (with issue reference), Description of Changes (though brief), Reviewer mentions, UI/UX Changes link, and a complete checklist.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch 574-send---nft-wrapper

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@paolampilla paolampilla marked this pull request as ready for review December 5, 2025 09:20
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/i18n/translations/ru.json (1)

1054-1156: Overall Russian send-flow translations look good; minor style tweak suggestion

The new/updated keys (SEND_ACCOUNTS_*, SEND_COLLECTIBLE, SEND_CREATE_CONTACT_*, SEND_RECEIVER, SEND_RECENT_EMPTY_STATE_DESCRIPTION, SEND_STEP_OF, SEND_VOT3_WARNING) preserve placeholders and correctly describe the new send / NFT send UX.

One small style suggestion for clarity:

- "SEND_RECENT_EMPTY_STATE_DESCRIPTION": "Как только вы отправите на адрес, он появится здесь для быстрого доступа.",
+ "SEND_RECENT_EMPTY_STATE_DESCRIPTION": "Как только вы отправите средства на этот адрес, он появится здесь для быстрого доступа.",

This makes the object of “отправите” explicit and reads a bit more naturally in Russian.

🧹 Nitpick comments (20)
src/i18n/translations/pt.json (3)

1138-1138: Confirm SEND_RECENT_EMPTY_STATE_DESCRIPTION aligns with user expectations.

The update from "...aparecerão aqui para acesso rápido" to "...aparecerá aqui para acesso rápido" refines the empty state messaging. Ensure this contextually matches when recent transactions/addresses are first displayed.

Consider checking the other 14 language files in this PR to confirm this wording pattern is consistent across locales (e.g., checking en.json, es.json, etc.).


1155-1155: Minor wording adjustment: "posteriormente" vs. prior phrasing.

Line 1155 updates SEND_VOT3_WARNING to use "posteriormente" (later/subsequently). Confirm this matches the semantic intent from any prior version and aligns with terminology used for time-dependent actions elsewhere in the file.

#!/bin/bash
# Cross-check VOT3-related terminology for consistency
rg -n -i 'vot3|converter|enviado' src/i18n/translations/pt.json | grep -i 'warning\|vot3'

1054-1054: Consistency check: "assim que forem adicionadas" phrasing.

The update to SEND_ACCOUNTS_EMPTY_STATE_DESCRIPTION ("assim que forem adicionadas" vs. the prior "depois de adicionadas") is a subtle improvement. Verify this matches grammatical patterns used in similar empty-state messages throughout the file.

src/Constants/Theme/Colors.ts (1)

370-382: Send screen color tokens: structure looks consistent

Moving stepText/stepBackground to sendScreen (parallel to tokenAmountCard) makes sense for step-level styling, and the Colors type matches the light/dark implementations below. Just ensure any existing usages of tokenAmountCard.stepText were updated to the new sendScreen.stepText path.

src/Components/Collectibles/CollectiblesSendActionButton.tsx (1)

16-32: Guard betterWorldFeature and hoist the flag into a local boolean

The logic is fine, but betterWorldFeature itself isn’t null‑safe: betterWorldFeature.balanceScreen?.send?.enabled will throw if betterWorldFeature is ever undefined (e.g., partial flag payloads, future refactors). You can also avoid repeating the expression by hoisting it:

-    const { betterWorldFeature } = useFeatureFlags()
+    const { betterWorldFeature } = useFeatureFlags()
+    const isSendNftEnabled = betterWorldFeature?.balanceScreen?.send?.enabled === true

-    const onPress = useCallback(async () => {
+    const onPress = useCallback(() => {
         onClose()
-        if (betterWorldFeature.balanceScreen?.send?.enabled) {
+        if (isSendNftEnabled) {
             nav.navigate(Routes.SEND_NFT, {
                 contractAddress: address,
                 tokenId,
             })
             return
         }
         nav.navigate(Routes.INSERT_ADDRESS_SEND, {
             contractAddress: address,
             tokenId,
         })
-    }, [address, nav, onClose, tokenId, betterWorldFeature.balanceScreen?.send?.enabled])
+    }, [address, nav, onClose, tokenId, isSendNftEnabled])

This makes the flag handling safer and the callback dependencies clearer.

src/i18n/translations/vi.json (2)

1062-1062: Unify “collectible” terminology.

Elsewhere in VI, “Đồ sưu tầm” is used; here it’s “vật phẩm sưu tầm”. Pick one for consistency (recommend “Đồ sưu tầm”).


1141-1141: Prefer generic step key; plan to retire hardcoded variant.

Now that SEND_STEP_OF exists, consider migrating callers off SEND_STEP_OF_3 and deprecating it to reduce duplication.

src/i18n/translations/sv.json (1)

1054-1054: Polish phrasing for natural Swedish.

Use “Dina plånbokskonton visas här när de har lagts till.” for a more idiomatic compound.

src/i18n/translations/tr.json (3)

1062-1062: Clarify “collectible” wording.

“Koleksiyon gönder” is terse. Consider “Koleksiyon ürünü gönder” or “Koleksiyon öğesi gönder” for clarity.


1144-1145: Align “token” terminology.

“SEND_TOKEN_AMOUNT/SELECT” use “Token”, while other keys in TR sometimes use “Jeton”. Pick one term (prefer “Token” for web3 consistency) across this locale.

If you want, I can list all occurrences to normalize.


1133-1133: Minor UX copy tweak (optional).

“Bu yeni adresi kişilere ekle” → “Bu yeni adresi Kişiler’e ekle” (proper noun casing) or “Kişilere bu yeni adresi ekle” (flowing order).

src/i18n/translations/zh.json (1)

1054-1156: Unify second‑person pronouns in new send‑flow strings

The new send strings mix “你/某个地址” with the more formal “您” used elsewhere in this locale. For consistency and tone, I’d align these:

-  "SEND_ACCOUNTS_EMPTY_STATE_DESCRIPTION": "添加后,你的钱包账户将显示在此处。",
+  "SEND_ACCOUNTS_EMPTY_STATE_DESCRIPTION": "添加后,您的钱包账户将显示在此处。",

-  "SEND_RECENT_EMPTY_STATE_DESCRIPTION": "当你向某个地址发送后,将会在此显示以便快速访问。",
+  "SEND_RECENT_EMPTY_STATE_DESCRIPTION": "当您向某个地址发送后,将会在此显示以便快速访问。"
src/i18n/translations/tw.json (1)

1054-1156: Align pronoun form with rest of Traditional Chinese locale

Most of this locale uses the polite “您”, while some new send‑flow strings use “你/你的”. For a consistent tone, consider:

-  "SEND_CONTACTS_EMPTY_STATE_DESCRIPTION": "新增你的第一個聯絡人以更快傳送並避免錯誤。",
+  "SEND_CONTACTS_EMPTY_STATE_DESCRIPTION": "新增您的第一個聯絡人,以更快傳送並避免錯誤。",

-  "SEND_RECENT_EMPTY_STATE_DESCRIPTION": "當你發送給一個地址後,它會顯示在這裡以便快速存取。",
+  "SEND_RECENT_EMPTY_STATE_DESCRIPTION": "當您發送給一個地址後,它會顯示在這裡以便快速存取。"
src/Screens/Flows/App/NFT/NFTDetailScreen/NFTDetailScreen.tsx (1)

7-15: Feature‑flag‑gated SEND_NFT routing is correct; consider a small readability tweak

The new useFeatureFlags usage and the conditional navigation to Routes.SEND_NFT vs Routes.INSERT_ADDRESS_SEND correctly gate the NFT send flow behind betterWorldFeature.balanceScreen?.send?.enabled, and the route params match the stack typing.

To make this a bit clearer and keep the dependency array simple, you could factor the flag into a local boolean:

const { betterWorldFeature } = useFeatureFlags()
const isNewNFTSendEnabled = betterWorldFeature.balanceScreen?.send?.enabled ?? false

const onSendPress = useCallback(() => {
    if (isNewNFTSendEnabled) {
        nav.navigate(Routes.SEND_NFT, {
            contractAddress: route.params.collectionAddress!,
            tokenId: route.params.nftTokenId,
        })
        return
    }

    nav.navigate(Routes.INSERT_ADDRESS_SEND, {
        contractAddress: route.params.collectionAddress!,
        tokenId: route.params.nftTokenId,
    })
}, [nav, route.params.collectionAddress, route.params.nftTokenId, isNewNFTSendEnabled])

Also applies to: 61-76

src/Screens/Flows/App/NFT/SendNFTScreen/SendNFTScreen.tsx (2)

25-27: Type duplication: SendNFTFlowStep is defined in multiple places.

This type is also defined in SendNFTContextProvider.tsx. Consider exporting it from a single location and importing it here to avoid divergence if the flow steps change.

-type SendNFTFlowStep = "insertAddress" | "summary"
-
-const ORDER: SendNFTFlowStep[] = ["insertAddress", "summary"]
+import { SendNFTFlowStep } from "~Components/Reusable/Send"
+
+const ORDER: SendNFTFlowStep[] = ["insertAddress", "summary"]

127-129: Summary step is a placeholder.

The summary step currently renders an empty fragment. This appears intentional for scaffolding the flow, but ensure the summary screen implementation is tracked.

Would you like me to open an issue to track implementing the summary step content?

src/Components/Reusable/Send/Provider/SendNFTContextProvider.tsx (1)

25-43: Navigation logic is correct but consider adding exhaustiveness handling.

The switch statements only handle specific cases, which is correct for a two-step flow. However, adding a default case (even if just a no-op) would provide exhaustiveness safety if additional steps are added later.

     const goToNext = useCallback(() => {
         switch (step) {
             case "insertAddress":
                 nextStep.value = "summary"
                 previousStep.value = step
                 setStep("summary")
                 break
+            default:
+                break
         }
     }, [nextStep, previousStep, step])
 
     const goToPrevious = useCallback(() => {
         switch (step) {
             case "summary":
                 nextStep.value = "insertAddress"
                 previousStep.value = step
                 setStep("insertAddress")
                 break
+            default:
+                break
         }
     }, [nextStep, previousStep, step])
src/i18n/i18n-types.ts (1)

4356-4359: Create‑contact placeholders and description keys line up correctly

SEND_CREATE_CONTACT_ADDRESS_PLACEHOLDER, SEND_CREATE_CONTACT_DESCRIPTION, and SEND_CREATE_CONTACT_NAME_PLACEHOLDER exist in both RootTranslation and TranslationFunctions with matching names and simple string/zero‑arg function types, so typed usage for the “add contact” flow is coherent.

If you want copy consistency with other placeholders like PLACEHOLDER_ENTER_ADDRESS, consider switching the English phrasing from “Insert …” to “Enter …” in the source translation files, then re‑generating this type file.

Also applies to: 4364-4367, 4372-4375, 10064-10067, 10074-10077, 10084-10087

src/i18n/translations/it.json (1)

1065-1066: Italian: receiver term and wallet address phrasing

Standardize “Destinatario” and improve “Indirizzo wallet” phrasing. “Ricevitore” (Line 63) and “Destinatario” are mixed; suggest converging on “Destinatario” across the app.

- "SEND_CREATE_CONTACT_ADDRESS": "Indirizzo wallet",
+ "SEND_CREATE_CONTACT_ADDRESS": "Indirizzo del wallet",
- "SEND_CREATE_CONTACT_ADDRESS_PLACEHOLDER": "Inserisci indirizzo wallet",
+ "SEND_CREATE_CONTACT_ADDRESS_PLACEHOLDER": "Inserisci l'indirizzo del wallet",

- "SEND_RECEIVER": "Destinatario",
+ "SEND_RECEIVER": "Destinatario", // keep, but align OTHER usages (e.g., ADDITIONAL_DETAIL_RECEIVER) in a follow-up

- "SEND_RECEIVER_ADDRESS_INPUT_ERROR": "Indirizzo wallet, username o dominio non valido",
+ "SEND_RECEIVER_ADDRESS_INPUT_ERROR": "Indirizzo del wallet, username o dominio non valido",
- "SEND_RECEIVER_ADDRESS_INPUT_LABEL": "Indirizzo wallet",
+ "SEND_RECEIVER_ADDRESS_INPUT_LABEL": "Indirizzo del wallet",

- "SEND_RECENT_EMPTY_STATE_DESCRIPTION": "Quando invii a un indirizzo, comparirà qui per un accesso rapido.",
+ "SEND_RECENT_EMPTY_STATE_DESCRIPTION": "Quando invii a un indirizzo, comparirà qui per accesso rapido."

If you prefer “Portafoglio” over “wallet”, I can generate a locale-wide diff to switch all occurrences for consistency.

Also applies to: 1126-1134, 1138-1141, 1143-1143

src/i18n/translations/es.json (1)

1057-1062: Spanish: natural phrasing and consistency in SEND strings

Tighten one phrase and keep “billetera” consistent in the changed keys.

- "SEND_RECENT_EMPTY_STATE_DESCRIPTION": "Cuando envíes a una dirección, aparecerá aquí para rápido acceso.",
+ "SEND_RECENT_EMPTY_STATE_DESCRIPTION": "Cuando envíes a una dirección, aparecerá aquí para acceso rápido."

Note: The repo mixes “billetera” y “cartera”. If desired, I can prep a follow-up PR to normalize across ES.

Also applies to: 1064-1073, 1126-1126, 1138-1141, 1155-1155

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 896646b and 327461e.

📒 Files selected for processing (30)
  • src/Components/Collectibles/CollectiblesSendActionButton.tsx (2 hunks)
  • src/Components/Reusable/Send/Provider/SendContextProvider.tsx (2 hunks)
  • src/Components/Reusable/Send/Provider/SendNFTContextProvider.spec.tsx (1 hunks)
  • src/Components/Reusable/Send/Provider/SendNFTContextProvider.tsx (1 hunks)
  • src/Components/Reusable/Send/Provider/index.ts (1 hunks)
  • src/Constants/Theme/Colors.ts (3 hunks)
  • src/Navigation/Stacks/HomeStack.tsx (3 hunks)
  • src/Navigation/Stacks/NFTStack.tsx (3 hunks)
  • src/Screens/Flows/App/NFT/NFTDetailScreen/NFTDetailScreen.tsx (2 hunks)
  • src/Screens/Flows/App/NFT/SendNFTScreen/SendNFTScreen.tsx (1 hunks)
  • src/Screens/Flows/App/NFT/SendNFTScreen/index.ts (1 hunks)
  • src/Screens/Flows/App/NFT/index.ts (1 hunks)
  • src/i18n/i18n-types.ts (6 hunks)
  • src/i18n/translations/de.json (3 hunks)
  • src/i18n/translations/en.json (3 hunks)
  • src/i18n/translations/es.json (4 hunks)
  • src/i18n/translations/fr.json (4 hunks)
  • src/i18n/translations/hi.json (3 hunks)
  • src/i18n/translations/it.json (3 hunks)
  • src/i18n/translations/ja.json (4 hunks)
  • src/i18n/translations/ko.json (3 hunks)
  • src/i18n/translations/nl.json (3 hunks)
  • src/i18n/translations/pl.json (4 hunks)
  • src/i18n/translations/pt.json (5 hunks)
  • src/i18n/translations/ru.json (4 hunks)
  • src/i18n/translations/sv.json (3 hunks)
  • src/i18n/translations/tr.json (3 hunks)
  • src/i18n/translations/tw.json (3 hunks)
  • src/i18n/translations/vi.json (2 hunks)
  • src/i18n/translations/zh.json (3 hunks)
🧰 Additional context used
🧬 Code graph analysis (7)
src/Screens/Flows/App/NFT/SendNFTScreen/SendNFTScreen.tsx (8)
src/Navigation/Stacks/NFTStack.tsx (1)
  • RootStackParamListNFT (19-52)
src/Utils/ReanimatedUtils/Reanimated.tsx (1)
  • wrapFunctionComponent (121-130)
src/Hooks/useTheme/useTheme.tsx (2)
  • useTheme (8-27)
  • useThemedStyles (29-32)
src/Components/Reusable/HeaderButtons/CloseIconHeaderButton.tsx (1)
  • CloseIconHeaderButton (12-19)
src/Screens/Flows/App/SendScreen/Animations/Entering.tsx (2)
  • EnteringFromRightAnimation (21-36)
  • EnteringFromLeftAnimation (4-19)
src/Screens/Flows/App/SendScreen/Animations/Exiting.tsx (2)
  • ExitingToLeftAnimation (4-23)
  • ExitingToRightAnimation (25-44)
src/Storage/Redux/Selectors/Nft.ts (1)
  • selectNFTWithAddressAndTokenId (121-136)
src/Components/Reusable/Send/Provider/SendNFTContextProvider.tsx (1)
  • SendNFTContextProvider (12-75)
src/Navigation/Stacks/NFTStack.tsx (1)
src/Screens/Flows/App/NFT/SendNFTScreen/SendNFTScreen.tsx (1)
  • SendNFTScreen (159-171)
src/Navigation/Stacks/HomeStack.tsx (1)
src/Screens/Flows/App/NFT/SendNFTScreen/SendNFTScreen.tsx (1)
  • SendNFTScreen (159-171)
src/Screens/Flows/App/NFT/NFTDetailScreen/NFTDetailScreen.tsx (1)
src/Components/Providers/FeatureFlagsProvider.tsx (1)
  • useFeatureFlags (142-149)
src/Components/Collectibles/CollectiblesSendActionButton.tsx (1)
src/Components/Providers/FeatureFlagsProvider.tsx (1)
  • useFeatureFlags (142-149)
src/Components/Reusable/Send/Provider/SendNFTContextProvider.tsx (2)
src/Model/Nft/Nft.ts (1)
  • NonFungibleToken (22-27)
src/Components/Reusable/Send/Provider/SendContextProvider.tsx (4)
  • SendFlowState (7-14)
  • SendFlowStep (5-5)
  • SendContextType (16-28)
  • SendContext (30-30)
src/Components/Reusable/Send/Provider/SendContextProvider.tsx (2)
src/Model/Token/Token.ts (1)
  • FungibleTokenWithBalance (59-61)
src/Model/Nft/Nft.ts (1)
  • NonFungibleToken (22-27)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (4)
  • GitHub Check: scan / unit (1)
  • GitHub Check: scan / unit (2)
  • GitHub Check: scan / unit (4)
  • GitHub Check: scan / unit (3)
🔇 Additional comments (44)
src/i18n/translations/pt.json (2)

1061-1061: ✓ New translation keys are properly added for NFT send flow.

The new keys (SEND_COLLECTIBLE, SEND_RECEIVER, SEND_STEP_OF) align with the PR objectives for the two-step NFT sending process and generalized step formatting. Placeholder syntax ({currentStep: string}, {totalSteps: string}) matches expected i18n patterns.

Also applies to: 1126-1126, 1140-1141


1064-1064: The terminology used in the "SEND_CREATE_CONTACT_*" updates aligns consistently with terminology elsewhere in the file:

  • "Endereço da carteira" (line 1064) matches the pattern used for wallet address fields (also at line 1129: SEND_RECEIVER_ADDRESS_INPUT_LABEL)
  • "Nome" (line 1068) is the standard generic term for name fields (also at line 503: COMMON_LBL_NAME), with "Nome do contato" used in other contact-specific contexts (line 197, 1069)
  • "Adicionar contato" (line 1072) matches the existing pattern for contact-related actions (also at line 319: BTN_ADD_CONTACT)

No terminology inconsistencies detected. The refinements follow established conventions in the Portuguese translation file.

src/Constants/Theme/Colors.ts (2)

880-892: Light theme mapping for send step colors is coherent with existing palette

stepText: COLORS.GREY_700 and stepBackground: COLORS.GREY_200 align with other light UI tokens (titles, chips, etc.) and should read fine on the app background. No issues from a theming/typing perspective.


1265-1277: Dark theme mapping for send step colors aligns with dark palette

Using GREY_100 for stepText over PURPLE_DISABLED background keeps consistency with other dark-surface tokens and should maintain contrast alongside the existing send screen card styling. Implementation matches the Colors shape defined above.

src/i18n/translations/ja.json (1)

1054-1156: Send-flow Japanese translations and placeholders look consistent

All updated send-related strings (SEND_ACCOUNTS_*, SEND_AMOUNT_EXCEEDS_BALANCE, SEND_COLLECTIBLE, the SEND_CREATE_CONTACT_* block, SEND_RECEIVER, SEND_RECENT_EMPTY_STATE_DESCRIPTION, SEND_STEP_OF, SEND_STEP_OF_3, SEND_TOKEN_SELECT, SEND_VOT3_WARNING) preserve the expected placeholders and match the intended UX semantics for the new NFT/send flow. I don’t see placeholder name or formatting issues here.

src/i18n/translations/ko.json (1)

1054-1156: Korean send/NFT send translations align with the new flow

The updated send-related keys (SEND_ACCOUNTS_*, SEND_COLLECTIBLE, the SEND_CREATE_CONTACT_* group, SEND_RECEIVER*, SEND_RECENT_EMPTY_STATE_DESCRIPTION, SEND_STEP_OF / SEND_STEP_OF_3, SEND_TOKEN_AMOUNT, SEND_TOKEN_SELECT, SEND_VOT3_WARNING) read naturally in Korean and keep the correct placeholder structure. They should integrate cleanly with the new two-step NFT send UI.

src/i18n/translations/tr.json (1)

1141-1141: No changes needed—step-format rendering is correct across all locales.

TR's "{stepNumber: string} / 3" uses the proper string placeholder type and localizes the connector appropriately (uses "/" instead of locale-specific prepositions like "de", "von", "van", etc.). The component calls SEND_STEP_OF() with string parameters, and all 18 locales consistently define SEND_STEP_OF_3 with the same placeholder structure and locale-specific connectors. No hardcoded "of" assumptions exist.

src/i18n/translations/fr.json (1)

1054-1156: NFT send & step translations look consistent

The new French strings for SEND_NFT (SEND_COLLECTIBLE, SEND_RECEIVER, SEND_STEP_OF and contact‑creation wording) are grammatically correct and consistent with existing terminology (“objet de collection”, “Destinataire”, “sur {totalSteps}”). No changes needed.

src/Screens/Flows/App/NFT/SendNFTScreen/index.ts (1)

1-1: Barrel export for SendNFTScreen is fine

Re‑exporting from "./SendNFTScreen" matches the pattern used elsewhere and cleanly exposes the NFT send screen.

src/Screens/Flows/App/NFT/index.ts (1)

6-6: Including SendNFTScreen in the NFT barrel is appropriate

Adding export * from "./SendNFTScreen" keeps the NFT screens index in sync with the new send flow and matches existing export style.

src/Components/Reusable/Send/Provider/index.ts (1)

1-2: Provider barrel cleanly exposes NFT send context

Re‑exporting SendNFTContextProvider alongside SendContextProvider from this index keeps the send providers discoverable from a single module and doesn’t introduce issues on its own.

src/Navigation/Stacks/NFTStack.tsx (1)

34-37: Routes.SEND_NFT type is consistently defined across stacks

The Routes.SEND_NFT route type in RootStackParamListNFT matches identical declarations in HomeStack, both defining { contractAddress: string; tokenId: string }. All navigation calls (NFTDetailScreen, CollectiblesSendActionButton) pass the correct parameters, and screen registrations in both stacks are properly configured.

src/Components/Reusable/Send/Provider/SendNFTContextProvider.spec.tsx (1)

1-149: Well-structured test coverage for the NFT context provider.

The tests comprehensively cover the key functionality: initial state, NFT initialization, flow state updates, navigation transitions, boundary behavior, and button enable states. The createWrapper pattern is clean and the tests properly use act() for state updates.

src/Components/Reusable/Send/Provider/SendContextProvider.tsx (1)

3-30: Clean extension of the Send context to support NFT flow.

The changes export existing types (SendFlowState, SendContextType, SendContext) and add an optional nft field. This approach enables the new SendNFTContextProvider to share the same context type while maintaining backward compatibility with existing token send flows.

src/i18n/translations/en.json (1)

1061-1061: Translation keys properly added for NFT send flow.

The new keys (SEND_COLLECTIBLE, SEND_RECEIVER, SEND_REVIEW_DETAILS, SEND_STEP_OF) follow existing naming conventions and support the new two-step NFT sending flow. The parameterized SEND_STEP_OF is more flexible than the hardcoded SEND_STEP_OF_3.

Also applies to: 1126-1126, 1140-1141

src/Screens/Flows/App/NFT/SendNFTScreen/SendNFTScreen.tsx (2)

65-93: Animation callbacks look correct.

The Entering and Exiting callbacks properly handle the worklet context and use shared values for direction-based animations. The fallback to a no-op animation when steps are undefined is appropriate.


159-171: Screen wrapper correctly fetches NFT and provides context.

The pattern of fetching the NFT via selector and wrapping content with the context provider is clean. Minor note: nft ?? undefined is redundant since nft is already NonFungibleToken | undefined, but it's harmless.

src/Navigation/Stacks/HomeStack.tsx (1)

186-189: SEND_NFT route correctly added to HomeStack.

The route definition matches the pattern in NFTStack.tsx and the screen registration follows the same feature flag gating (betterWorldFeature.balanceScreen.collectibles.enabled) used by other collectibles screens. This maintains consistency across navigation stacks.

Also applies to: 400-402

src/Components/Reusable/Send/Provider/SendNFTContextProvider.tsx (3)

1-10: LGTM on imports and type definitions.

The imports are appropriate, and reusing SendContext from the existing provider promotes consistency. SendNFTFlowStep correctly defines the two-step subset needed for NFT transfers.


12-23: State initialization and shared values are well-structured.

The component correctly initializes state for the two-step NFT flow and reuses the animation tracking pattern from the existing send flow.


45-75: Context value memoization is appropriate.

The useMemo correctly memoizes the context value with all required dependencies. The context correctly conforms to SendContextType, enabling reuse of existing send flow components.

src/i18n/translations/pl.json (3)

1061-1061: New translation key for NFT collectible sending.

The key SEND_COLLECTIBLE is correctly added for the NFT send flow.


1126-1126: New receiver label translation added.

SEND_RECEIVER provides a clear label for the receiver input in the NFT flow.


1140-1141: Flexible step indicator translations.

SEND_STEP_OF provides a dynamic step format with {currentStep} and {totalSteps} parameters, while SEND_STEP_OF_3 is retained for backward compatibility with the existing 3-step token send flow.

src/i18n/translations/nl.json (3)

1061-1061: Dutch translation for collectible sending added.

SEND_COLLECTIBLE: "Verzamelobject versturen" correctly translates the send collectible action.


1126-1126: Receiver label translation added.

SEND_RECEIVER: "Ontvanger" is the correct Dutch translation.


1140-1141: Step indicator translations are consistent.

The SEND_STEP_OF key with "van" (Dutch for "of") correctly mirrors the pattern used in other language files.

src/i18n/i18n-types.ts (4)

4348-4351: New SEND_COLLECTIBLE label and helper are consistent

SEND_COLLECTIBLE is correctly added to RootTranslation and mirrored in TranslationFunctions as a zero‑arg helper, matching surrounding naming for send‑flow titles. No issues found.

Also applies to: 10055-10058


4601-4604: SEND_RECEIVER key cleanly adds a receiver step title

SEND_RECEIVER is added as a plain string in RootTranslation and as a zero‑arg function in TranslationFunctions, matching the surrounding send‑flow keys and giving a clear, reusable label for the receiver step.

Also applies to: 10307-10310


4657-4660: SEND_REVIEW_DETAILS summary‑step label is wired correctly

The new SEND_REVIEW_DETAILS string and its corresponding helper function are consistent and align with the semantics of the review/summary step in the send flow; no typing or naming issues here.

Also applies to: 10363-10366


4662-4666: SEND_STEP_OF parameterization is consistent across declarations and callsites

The SEND_STEP_OF key uses RequiredParams<'currentStep' | 'totalSteps'> in RootTranslation (line 4666) and (arg: { currentStep: string, totalSteps: string }) => LocalizedString in TranslationFunctions (line 10373), with full alignment. The callsite at SendNFTScreen.tsx:115-118 correctly passes both parameters as strings via { currentStep: stepInfo.currentStep.toString(), totalSteps: TOTAL_STEPS.toString() }, and all translation strings across supported locales use the matching {currentStep: string} and {totalSteps: string} placeholders.

src/i18n/translations/de.json (13)

1054-1054: LGTM – formality standardization.

Changing from informal "deiner" to formal "Ihrer" aligns with professional app conventions. The updated wording maintains clarity.


1057-1057: LGTM – appropriate grammatical form for section title.

Using the noun form "Beobachtung" instead of the past participle "Beobachtet" is more suitable for a section header.


1059-1059: Verify translation consistency – AI summary vs. code mismatch.

The AI summary claims a change from "überschreitet" to "übersteigt", but the code shows "übersteigt". Please confirm the intended wording. Both verbs are acceptable ("übersteigt" is slightly more technical/formal).


1061-1061: LGTM – contextually appropriate for NFT sending feature.

"Sammelobjekt senden" correctly translates the collectible/NFT sending action and aligns with existing collectible terminology throughout the app.


1062-1062: LGTM – improved copy with clearer benefits and consistent formality.

The refined wording effectively communicates the benefit of adding contacts and maintains the formal tone.


1064-1064: LGTM – more precise terminology, pending consistency verification.

Changing from "Kontaktadresse" to "Wallet-Adresse" is more technically precise for the input field. Verify this terminology is consistent across the send flow screens and other language files.


1067-1067: LGTM – clearer, more direct action description.

The simplified wording is more direct and matches the action-oriented style of send flow UI.


1068-1068: LGTM – appropriate label simplification.

Shortening from "Kontaktname" to "Name" reduces redundancy while maintaining clarity in the contact creation context.


1072-1072: LGTM – more semantically appropriate verb.

Changing from "Kontakt erstellen" to "Kontakt hinzufügen" better reflects the action of saving a contact to an existing list, rather than creating a new entity.


1126-1126: LGTM – appropriate new label for receiver field.

"Empfänger" is a clear, contextually appropriate label for the receiver designation in the NFT send flow.


1138-1138: LGTM – clear and helpful empty state messaging.

The message effectively explains the purpose of the recent recipients feature and guides users toward enabling it through normal usage.


1139-1139: LGTM – consistent and clear empty state title.

Matches the pattern and style of other empty state titles in the send flow.


1140-1140: Update de.json step indicator format for NFT send flow.

The SEND_STEP_OF placeholder format {currentStep: string} von {totalSteps: string} is correctly implemented and consistently localized across all 17 supported languages. However, note that this placeholder is only used in the NFT send flow (2 steps); the token send flow does not display step indicators to users, so cross-flow consistency verification is not applicable here.

@sonarqubecloud
Copy link

sonarqubecloud bot commented Dec 5, 2025

Quality Gate Failed Quality Gate failed

Failed conditions
44.0% Coverage on New Code (required ≥ 60%)
9.1% Duplication on New Code (required ≤ 3%)
10 Added Technical Debt (required ≤ 1)
2 New Code Smells (required ≤ 1)

See analysis details on SonarQube Cloud

Catch issues before they fail your Quality Gate with our IDE extension SonarQube for IDE

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
src/i18n/i18n-types.ts (1)

4674-4678: SEND_RECEIVER_DETAILS_COUNT uses invalid RequiredParams syntax and inconsistent pattern

The current definition at both locations (lines 4674–4678 and 10417–10421) is incorrect:

  1. Invalid type syntax: RequiredParams<'current', 'total'> uses comma-separated arguments instead of a union. All other RequiredParams entries in the file use RequiredParams<'param1' | 'param2'> syntax. This should be RequiredParams<'current' | 'total'>.

  2. Inconsistent pattern in TranslationFunctions: Other parameterized entries like ALERT_MSG_LAST_BACKUP_DATE follow the pattern:

    • RootTranslation: RequiredParams<'date'>
    • TranslationFunctions: (arg: { date: string }) => LocalizedString

    SEND_RECEIVER_DETAILS_COUNT should match this pattern with a function signature in TranslationFunctions.

Fix in RootTranslation:

- SEND_RECEIVER_DETAILS_COUNT: RequiredParams<'current', 'total'>
+ SEND_RECEIVER_DETAILS_COUNT: RequiredParams<'current' | 'total'>

Fix in TranslationFunctions:

- SEND_RECEIVER_DETAILS_COUNT: RequiredParams<'current', 'total'>
+ SEND_RECEIVER_DETAILS_COUNT: (arg: { current: number; total: number }) => LocalizedString

Since this file is auto-generated, this likely indicates a generator bug in typesafe-i18n v5.26.2. Verify the fix doesn't conflict with the generator by running yarn i18n:types after making changes.

src/i18n/translations/tw.json (1)

1181-1185: Fix Simplified Chinese in TW locale (visible i18n defect).

These strings use Simplified characters (“默认/网址/选择/删除”), which is inconsistent with the rest of zh‑TW.

-  "SETTINGS_TRANSACTIONS_DEFAULT_DELEGATION": "默认委托",
-  "SETTINGS_TRANSACTIONS_MANAGE_URLS": "管理网址",
-  "SETTINGS_TRANSACTIONS_SELECT_DEFAULT_DELEGATION": "选择交易的默认委托",
-  "SETTINGS_TRANSACTIONS_SELECT_DELEGATION_URLS": "委托网址",
-  "SETTINGS_TRANSACTIONS_SELECT_DELEGATION_URLS_BODY": "添加或删除委托网址,以便在发送交易时选择",
+  "SETTINGS_TRANSACTIONS_DEFAULT_DELEGATION": "預設委託",
+  "SETTINGS_TRANSACTIONS_MANAGE_URLS": "管理網址",
+  "SETTINGS_TRANSACTIONS_SELECT_DEFAULT_DELEGATION": "選擇交易的預設委託",
+  "SETTINGS_TRANSACTIONS_SELECT_DELEGATION_URLS": "委託網址",
+  "SETTINGS_TRANSACTIONS_SELECT_DELEGATION_URLS_BODY": "新增或刪除委託網址,以便在發送交易時選擇",
🧹 Nitpick comments (1)
src/Constants/Theme/Colors.ts (1)

900-901: Good color choices for light theme.

The stepText (GREY_700) on stepBackground (GREY_200) pairing provides appropriate contrast for readability in the light theme.

Consider verifying that the color contrast ratio meets WCAG AA standards (4.5:1 for normal text) for accessibility:

#!/bin/bash
# Description: Check contrast ratio between stepText and stepBackground
# This uses a simple Python script to calculate contrast ratio

python3 << 'EOF'
def hex_to_rgb(hex_color):
    hex_color = hex_color.lstrip('#')
    return tuple(int(hex_color[i:i+2], 16) for i in (0, 2, 4))

def relative_luminance(rgb):
    r, g, b = [x / 255.0 for x in rgb]
    r = r / 12.92 if r <= 0.03928 else ((r + 0.055) / 1.055) ** 2.4
    g = g / 12.92 if g <= 0.03928 else ((g + 0.055) / 1.055) ** 2.4
    b = b / 12.92 if b <= 0.03928 else ((b + 0.055) / 1.055) ** 2.4
    return 0.2126 * r + 0.7152 * g + 0.0722 * b

def contrast_ratio(color1, color2):
    lum1 = relative_luminance(hex_to_rgb(color1))
    lum2 = relative_luminance(hex_to_rgb(color2))
    lighter = max(lum1, lum2)
    darker = min(lum1, lum2)
    return (lighter + 0.05) / (darker + 0.05)

# Light theme colors - you'll need to replace these with actual hex values from COLORS enum
# GREY_700 and GREY_200
grey_700 = "#363A3F"  # Example value, verify actual color
grey_200 = "#E7E9EB"  # Example value, verify actual color

ratio = contrast_ratio(grey_700, grey_200)
print(f"Light theme contrast ratio: {ratio:.2f}:1")
print(f"WCAG AA (normal text): {'✓ PASS' if ratio >= 4.5 else '✗ FAIL'}")
print(f"WCAG AA (large text): {'✓ PASS' if ratio >= 3.0 else '✗ FAIL'}")
EOF
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 327461e and 684b164.

📒 Files selected for processing (20)
  • src/Components/Reusable/Send/Provider/SendContextProvider.tsx (3 hunks)
  • src/Constants/Theme/Colors.ts (3 hunks)
  • src/i18n/i18n-types.ts (6 hunks)
  • src/i18n/translations/de.json (4 hunks)
  • src/i18n/translations/en.json (3 hunks)
  • src/i18n/translations/es.json (4 hunks)
  • src/i18n/translations/fr.json (5 hunks)
  • src/i18n/translations/hi.json (4 hunks)
  • src/i18n/translations/it.json (4 hunks)
  • src/i18n/translations/ja.json (3 hunks)
  • src/i18n/translations/ko.json (4 hunks)
  • src/i18n/translations/nl.json (4 hunks)
  • src/i18n/translations/pl.json (3 hunks)
  • src/i18n/translations/pt.json (4 hunks)
  • src/i18n/translations/ru.json (4 hunks)
  • src/i18n/translations/sv.json (3 hunks)
  • src/i18n/translations/tr.json (4 hunks)
  • src/i18n/translations/tw.json (4 hunks)
  • src/i18n/translations/vi.json (3 hunks)
  • src/i18n/translations/zh.json (4 hunks)
🚧 Files skipped from review as they are similar to previous changes (12)
  • src/i18n/translations/pt.json
  • src/Components/Reusable/Send/Provider/SendContextProvider.tsx
  • src/i18n/translations/it.json
  • src/i18n/translations/sv.json
  • src/i18n/translations/fr.json
  • src/i18n/translations/de.json
  • src/i18n/translations/hi.json
  • src/i18n/translations/vi.json
  • src/i18n/translations/en.json
  • src/i18n/translations/ru.json
  • src/i18n/translations/nl.json
  • src/i18n/translations/tr.json
🔇 Additional comments (21)
src/i18n/translations/pl.json (2)

1137-1137: Verify intent: SEND_RECEIVER_DETAILS and SEND_REVIEW_DETAILS share identical translations.

Both keys have the same Polish text ("Przejrzyj szczegóły"). Confirm whether this duplication is intentional or if they should be differentiated in the UI/flow context.

Also applies to: 1146-1146


1130-1130: Translation additions for NFT send flow look good.

The remaining translations are grammatically sound and follow established Polish conventions for the wallet UI:

  • SEND_RECEIVER: "Odbiorca" (correct receiver label)
  • SEND_STEP_OF: "{currentStep: string} z {totalSteps: string}" (consistent step numbering format)
  • SEND_STEP_OF_3: Specialized variant retained for backward compatibility

Also applies to: 1147-1147, 1148-1148

src/i18n/translations/ko.json (3)

1147-1147: Verify placeholder naming consistency across translation keys.

The new SEND_STEP_OF key uses placeholders {currentStep} and {totalSteps}, while the similar SEND_RECEIVER_DETAILS_COUNT key (line 1138) uses {current} and {total}. Confirm this naming variation is intentional and matches the corresponding component code that will use these translations.


1137-1137: Confirm duplicate translation values are intentional.

Both SEND_RECEIVER_DETAILS (line 1137) and SEND_REVIEW_DETAILS (line 1146) translate to the same Korean text: "세부 정보 검토". Verify this duplication is intentional or if these keys serve distinctly different UI contexts that happen to use the same translation.

Also applies to: 1146-1146


463-465: JSON structure and translation key additions look good.

The new translation keys follow the existing naming conventions (SEND_* prefix), are properly formatted JSON, and are correctly positioned alphabetically within the file. All changes support the NFT send flow feature described in the PR.

Also applies to: 1065-1065, 1130-1130, 1137-1137, 1146-1147

src/Constants/Theme/Colors.ts (2)

1290-1291: LGTM! Dark theme implementation is consistent.

The dark theme colors for stepText (GREY_100) and stepBackground (PURPLE_DISABLED) maintain proper contrast and are consistent with the overall dark theme design system.


385-386: LGTM! Migration successfully verified.

The restructuring of stepText to the sendScreen level and addition of stepBackground is properly implemented. All references have been correctly updated:

  • Type definition at lines 385-386
  • Light theme at lines 900-901 (GREY_700 on GREY_200)
  • Dark theme at lines 1290-1291 (GREY_100 on PURPLE_DISABLED)
  • Active usage in SendNFTScreen.tsx (lines 109-110)

No stale references to the old tokenAmountCard.stepText remain in the codebase.

src/i18n/i18n-types.ts (3)

4368-4395: New send-contact & collectible i18n keys are consistent and correctly wired

SEND_COLLECTIBLE, SEND_CREATE_CONTACT_ADDRESS_PLACEHOLDER, SEND_CREATE_CONTACT_DESCRIPTION, and SEND_CREATE_CONTACT_NAME_PLACEHOLDER are added to both RootTranslation (as string) and TranslationFunctions (as zero‑arg functions) with matching names and expected semantics. This keeps the send/contact flow type‑safe and aligned with existing SEND_* patterns. No changes needed.

Also applies to: 10112-10139


4622-4624: SEND_RECEIVER label is correctly exposed in both translation surfaces

The new SEND_RECEIVER key is added as a plain string in RootTranslation and as () => LocalizedString in TranslationFunctions, matching how other section titles are modelled. This will give the receiver step its own dedicated, reusable label without type holes. Looks good.

Also applies to: 10365-10367


4688-4696: Step/summary keys for the new send flow are well‑typed

SEND_REVIEW_DETAILS and SEND_STEP_OF are introduced in RootTranslation and mirrored in TranslationFunctions with an explicit arg object { currentStep, totalSteps }. The RequiredParams<'currentStep' | 'totalSteps'> usage matches the function signature and placeholder names in the JSDoc, so consumers will get proper type guidance when formatting step indicators. No issues spotted here.

Also applies to: 10431-10437

src/i18n/translations/zh.json (2)

463-465: LGTM on alert copy tweaks.

Wording reads naturally and keeps placeholders intact.


1137-1148: New SEND_ labels look consistent.*

Placeholders/types and punctuation are correct; duplication of “查看详情” for both keys is acceptable.

src/i18n/translations/es.json (4)

463-466: LGTM on alerts.

Clear and idiomatic phrasing; placeholders preserved.


1065-1065: LGTM for SEND_COLLECTIBLE.

Matches “Coleccionables” elsewhere.


1130-1131: LGTM for receiver labels.

“Destinatario” and “Revisar detalles” are consistent across the flow.

Also applies to: 1137-1137


1146-1148: LGTM for step formatting.

Types and ordering look good: “{currentStep: string} de {totalSteps: string}”.

src/i18n/translations/tw.json (3)

463-465: LGTM on alert wording.

Natural Traditional Chinese; no placeholder drift.


1065-1065: LGTM for SEND_COLLECTIBLE.

Terminology matches “收藏品” usage elsewhere.


1130-1131: LGTM for receiver and step labels.

Consistent terms and typed placeholders.

Also applies to: 1137-1137, 1146-1148

src/i18n/translations/ja.json (2)

464-466: LGTM on alert copy.

Minor wording tweak reads fine; semantics unchanged.


1065-1065: LGTM for SEND_COLLECTIBLE.

Term aligns with “コレクティブル”.

"SEND_RECEIVER_ADD_CONTACT_BTN": "この新しいアドレスを連絡先に追加する",
"SEND_RECEIVER_DETAILS": "詳細を確認",
"SEND_RECEIVER_DETAILS_COUNT": "{current} / {total}",
"SEND_RECEIVER_DETAILS_COUNT": "{current}{total}",
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Restore placeholder types and use ASCII slash for consistency.

Other locales keep typed placeholders; “/” also differs from the rest of the UI (“/”).

-  "SEND_RECEIVER_DETAILS_COUNT": "{current}/{total}",
+  "SEND_RECEIVER_DETAILS_COUNT": "{current: number} / {total: number}",
🤖 Prompt for AI Agents
src/i18n/translations/ja.json around line 1138: the translation currently uses a
fullwidth slash and untyped placeholders ("{current}/{total}"); change it to use
ASCII slash and typed placeholders consistent with other locales, e.g.
"{current, number}/{total, number}", so restore the placeholder types and
replace "/" with "/".

Comment on lines +1146 to 1148
"SEND_REVIEW_DETAILS": "詳細を確認",
"SEND_STEP_OF": "{currentStep}/{totalSteps}",
"SEND_STEP_OF_3": "{stepNumber} / 3",
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Unify placeholder typing and slash style in SEND_STEP_OF.

Match other locales’ typed placeholders and ASCII slash.

-  "SEND_STEP_OF": "{currentStep}/{totalSteps}",
+  "SEND_STEP_OF": "{currentStep: string} / {totalSteps: string}",
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"SEND_REVIEW_DETAILS": "詳細を確認",
"SEND_STEP_OF": "{currentStep}/{totalSteps}",
"SEND_STEP_OF_3": "{stepNumber} / 3",
"SEND_REVIEW_DETAILS": "詳細を確認",
"SEND_STEP_OF": "{currentStep: string} / {totalSteps: string}",
"SEND_STEP_OF_3": "{stepNumber} / 3",
🤖 Prompt for AI Agents
In src/i18n/translations/ja.json around lines 1146 to 1148, the SEND_STEP_OF
entry uses fullwidth slash and untyped placeholder names
("{currentStep}/{totalSteps}"), which is inconsistent with other locales; change
the value to use typed placeholders and an ASCII slash exactly like other
locales, e.g. "{stepNumber} / {totalSteps}" so the placeholder names and slash
style match existing translations.

"SEND_AMOUNT": "Kwota",
"SEND_AMOUNT_EXCEEDS_BALANCE": "Kwota przekracza saldo",
"SEND_BALANCE_PERCENTAGE": "Procent salda: {percentage: string}",
"SEND_COLLECTIBLE": "Wyślij kolekcjonowalny",
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Fix incomplete Polish grammar in SEND_COLLECTIBLE translation.

The phrase "Wyślij kolekcjonowalny" is grammatically incomplete—the adjective requires a noun. Consider "Wyślij zbieralny" or "Wyślij przedmiot kolekcji" to provide a complete, actionable label.

🤖 Prompt for AI Agents
In src/i18n/translations/pl.json around line 1065, the translation value for
"SEND_COLLECTIBLE" is grammatically incomplete ("Wyślij kolekcjonowalny");
replace it with a complete, natural Polish phrase such as "Wyślij przedmiot
kolekcji" (or "Wyślij przedmiot kolekcjonerski") by updating the string value to
one of those options so the label is actionable and grammatically correct.

"SEND_AMOUNT": "金额",
"SEND_AMOUNT_EXCEEDS_BALANCE": "金额超出余额",
"SEND_BALANCE_PERCENTAGE": "余额百分比: {percentage: string}",
"SEND_COLLECTIBLE": "发送藏品",
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Unify “collectible” term across zh to avoid inconsistency.

Elsewhere you use “收藏品”; here it’s “藏品”. Align to “收藏品”.

-  "SEND_COLLECTIBLE": "发送藏品",
+  "SEND_COLLECTIBLE": "发送收藏品",
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"SEND_COLLECTIBLE": "发送藏品",
"SEND_COLLECTIBLE": "发送收藏品",
🤖 Prompt for AI Agents
In src/i18n/translations/zh.json around line 1065 the key "SEND_COLLECTIBLE"
uses the term "藏品" which is inconsistent with the rest of the zh translations
that use "收藏品"; update the value to "发送收藏品" to unify terminology across the
locale.

"SEND_PLEASE_TYPE_ADDRESS": "请输入地址或 .vet 域名",
"SEND_RANGE_MAX": "最大",
"SEND_RANGE_ZERO": "0%",
"SEND_RECEIVER": "接收方",
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Use the same receiver term as the rest of the UI.

Most strings use “接收者”, not “接收方”.

-  "SEND_RECEIVER": "接收方",
+  "SEND_RECEIVER": "接收者",
🤖 Prompt for AI Agents
In src/i18n/translations/zh.json around line 1130 the key "SEND_RECEIVER" uses
the term "接收方" which is inconsistent with the rest of the UI that uses "接收者";
update the value to "接收者" to match existing translations and maintain
consistency across the interface.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants