Skip to content

✨ app: support offramp transfer reference - #1201

Open
franm91 wants to merge 1 commit into
referencefrom
reference-ui
Open

✨ app: support offramp transfer reference#1201
franm91 wants to merge 1 commit into
referencefrom
reference-ui

Conversation

@franm91

@franm91 franm91 commented Aug 7, 2026

Copy link
Copy Markdown
Member

Summary by CodeRabbit

  • New Features
    • Added ACH and wire transfer selection with fees, processing times, and reference requirements.
    • Added transfer details, including type and reference, to the review screen.
    • Added guidance explaining transfer types and costs.
    • Added recovery options when a transfer contact is unavailable.
  • Bug Fixes
    • Improved missing-transfer handling and quote retry behavior.
    • Added clearer validation and error messages for references and recipient details.
  • Localization
    • Added Spanish and Portuguese translations for transfer and validation messaging.

@changeset-bot

changeset-bot Bot commented Aug 7, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: ac23132

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
Name Type
@exactly/mobile Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@coderabbitai

coderabbitai Bot commented Aug 7, 2026

Copy link
Copy Markdown

Review Change Stack

Walkthrough

The send-funds flow now supports ACH and wire selection, currency-specific transfer references, rail-specific timing and fees, transfer-type guidance, and recovery when saved transfer details are unavailable.

Changes

Offramp transfer flow

Layer / File(s) Summary
Recipient field contracts and rendering
src/components/send-funds/recipientForm.tsx, src/utils/currencies.ts
Recipient forms now support option fields, rail metadata, multiline inputs, and validation for ACH, wire, EUR, GBP, MXN, and BRL references.
Recipient rail selection and reference fields
src/components/send-funds/NewRecipient.tsx, src/components/send-funds/TransferTypeSheet.tsx, src/components/shared/ModalSheet.tsx, src/i18n/es.json, src/i18n/pt.json, .changeset/common-weeks-laugh.md
New recipient steps select transfer variants, generate conditional reference fields, show transfer-type guidance, and include Spanish and Portuguese translations.
Missing-transfer quote handling and recovery
src/components/send-funds/SendAmount.tsx, src/components/send-funds/MissingTransferSheet.tsx, src/utils/queryClient.ts
Missing transfers block continuation, open a recovery sheet, support external-account deletion, invalidate cached data, and use updated quote retry and triage rules.
Rail-aware review details
src/components/send-funds/Review.tsx
Review details display the selected rail and reference and calculate fees from rail metadata when available.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
  participant SendAmount
  participant QuoteQuery as "ramp quote query"
  participant MissingTransferSheet
  participant ExternalAccountMutation as "external-account deletion mutation"
  participant RecipientCreation
  SendAmount->>QuoteQuery: request quote
  QuoteQuery-->>SendAmount: return transfer-not-found error
  SendAmount->>MissingTransferSheet: open with transfer context
  MissingTransferSheet->>ExternalAccountMutation: delete external account
  ExternalAccountMutation-->>RecipientCreation: redirect after cache invalidation
Loading

Possibly related PRs

  • exactly/exa#1115: Extends the same Bridge offramp send-funds components and transfer-reference flow.
  • exactly/exa#1165: Adds related offramp rails, transfer references, and TRANSFER_NOT_FOUND handling.

Suggested reviewers: dieguezguille, cruzdanilo

🚥 Pre-merge checks | ✅ 4
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly identifies the main feature area: offramp transfer reference support.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch reference-ui
✨ Simplify code
  • Create PR with simplified code
  • Commit simplified code in branch reference-ui

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.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1


ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: e2e44be5-e518-4faa-835f-4fc362de0789

📥 Commits

Reviewing files that changed from the base of the PR and between 06db66b and b64b94b.

📒 Files selected for processing (12)
  • .changeset/common-weeks-laugh.md
  • src/components/send-funds/MissingTransferSheet.tsx
  • src/components/send-funds/NewRecipient.tsx
  • src/components/send-funds/Review.tsx
  • src/components/send-funds/SendAmount.tsx
  • src/components/send-funds/TransferTypeSheet.tsx
  • src/components/send-funds/recipientForm.tsx
  • src/components/shared/ModalSheet.tsx
  • src/i18n/es.json
  • src/i18n/pt.json
  • src/utils/currencies.ts
  • src/utils/queryClient.ts

Comment thread src/components/send-funds/recipientForm.tsx Outdated

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: b64b94b13d

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment thread src/components/send-funds/NewRecipient.tsx Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 2


ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 7283904f-d260-40e5-8248-6873b8e03f7a

📥 Commits

Reviewing files that changed from the base of the PR and between b64b94b and ac23132.

📒 Files selected for processing (2)
  • src/components/send-funds/NewRecipient.tsx
  • src/components/send-funds/recipientForm.tsx

Comment thread src/components/send-funds/NewRecipient.tsx
Comment on lines +62 to +68
export const wireReference = pipe(
string(),
minLength(1, "Required"),
check(
(value) => value.split("\n").every((line, index) => index < 4 && line.length <= 35),
"Up to 4 lines of 35 characters",
),

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Reject whitespace-only wire references.

minLength(1) accepts a newline. The line check also accepts empty lines. The required wire field can therefore submit with no reference content.

Require at least one non-whitespace character.

Proposed fix
 export const wireReference = pipe(
   string(),
   minLength(1, "Required"),
+  regex(/\S/, "Required"),
   check(
     (value) => value.split("\n").every((line, index) => index < 4 && line.length <= 35),
     "Up to 4 lines of 35 characters",
   ),
 );
📝 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
export const wireReference = pipe(
string(),
minLength(1, "Required"),
check(
(value) => value.split("\n").every((line, index) => index < 4 && line.length <= 35),
"Up to 4 lines of 35 characters",
),
export const wireReference = pipe(
string(),
minLength(1, "Required"),
regex(/\S/, "Required"),
check(
(value) => value.split("\n").every((line, index) => index < 4 && line.length <= 35),
"Up to 4 lines of 35 characters",
),

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.

1 participant