Skip to content

✨ app: home screen revamp#775

Open
dieguezguille wants to merge 12 commits intomainfrom
home
Open

✨ app: home screen revamp#775
dieguezguille wants to merge 12 commits intomainfrom
home

Conversation

@dieguezguille
Copy link
Member

@dieguezguille dieguezguille commented Feb 13, 2026

closes #501, closes #599, closes #713

Summary by CodeRabbit

  • New Features

    • Introduced pay mode selection allowing users to choose between instant payments (Pay Now) and installment plans (Pay Later).
    • Added installment rate calculations and management interface.
  • Style & UI Improvements

    • Replaced fonts for improved visual consistency.
    • Unified spacing and animation parameters across the app.
    • Refined card components, buttons, and carousel layouts.
  • Bug Fixes

    • Fixed protocol asset logo display.

Open with Devin

Greptile Summary

this pr implements a comprehensive home screen redesign focused on the new pay mode selection feature, allowing users to toggle between instant payments (pay now/debit mode) and installment-based credit (pay later/credit mode). the changes introduce:

  • pay mode system: users can now switch between debit (mode=0) and credit (mode=1-12) payment modes directly from the home screen
  • installments interface: new sheet component allowing users to select 1-12 installment periods with real-time apr calculations
  • visual refresh: replaced bdo grotesk font family with spline sans, unified spacing tokens (removed s1_5, s2_5, adjusted s10-s14), and standardized animations
  • component refactoring: extracted reusable Amount component, added ButtonColumn and ButtonLabel variants to styled button, redesigned portfolio summary with asset logo previews
  • educational ui: added three new info sheets (pay mode, credit limit, spending limit) to explain financial concepts to users

the implementation integrates with existing financial calculations from @exactly/lib and maintains consistency with the project's established patterns.

Confidence Score: 4/5

  • safe to merge with one minor optimization opportunity
  • the pr is well-structured with clear separation of concerns, proper error handling, and follows established project patterns. the font replacement and design system updates are consistent throughout. the only issue is the inefficient array initialization in useInstallmentRates.ts line 29 which has already been flagged in previous comments.
  • src/utils/useInstallmentRates.ts - contains inefficient array initialization pattern on line 29

Important Files Changed

Filename Overview
src/utils/useInstallmentRates.ts new hook for calculating installment rates and payments, implements financial calculations for credit mode
src/components/home/Home.tsx major refactoring of home screen with new card status, installments, and pay mode sheets
src/components/home/CardStatus.tsx redesigned card status component with pay mode toggle and animated limit paginator
src/components/home/InstallmentsSheet.tsx new installments configuration sheet with horizontal scrolling cards showing APR rates
tamagui.config.ts font replacement (BDOGrotesk → SplineSans), spacing token standardization, and animation adjustments
src/components/shared/Amount.tsx new reusable amount display component with accessibility support and status variants
src/components/home/PortfolioSummary.tsx redesigned portfolio summary with asset logos preview and manage portfolio link

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A[Home Screen] --> B{Card Exists?}
    B -->|Yes| C[CardStatus Component]
    C --> D[Pay Mode Toggle]
    D --> E{User Selects Mode}
    E -->|Pay Now| F[Debit Mode - mode=0]
    E -->|Pay Later| G[Credit Mode - mode>0]
    G --> H[InstallmentsSheet]
    H --> I[useInstallmentRates Hook]
    I --> J[Calculate APR for 1-12 installments]
    J --> K[Display rates in scrollable cards]
    K --> L[User selects installment count]
    L --> M[Update card mode via setCardMode API]
    C --> N[LimitPaginator]
    N --> O{Mode Check}
    O -->|mode=0| P[Show Spending Limit]
    O -->|mode>0| Q[Show Credit Limit]
    D --> R[Learn More]
    R --> S[PayModeSheet]
    S --> T[Explain Pay Now vs Pay Later]
    A --> U[PortfolioSummary]
    U --> V[Display assets with Amount component]
    V --> W[Show APR & collateral]
Loading

Last reviewed commit: b87e85f

@dieguezguille dieguezguille self-assigned this Feb 13, 2026
@changeset-bot
Copy link

changeset-bot bot commented Feb 13, 2026

🦋 Changeset detected

Latest commit: 5b91963

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

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
Copy link

coderabbitai bot commented Feb 13, 2026

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

Walkthrough

Comprehensive feature release introducing installments/pay-later payment modes, redesigned home screen with new CardStatus and PortfolioSummary components, font unification to SplineSans, widespread design token standardization across spacing, new payment-related UI sheets, hook refactoring, and Spanish translation expansion. Includes Maestro E2E test updates validating new payment flows.

Changes

Cohort / File(s) Summary
Changesets
.changeset/*
Multiple patch release declarations covering design token adjustments, font replacement, card/button styling, animation refinements, protocol asset fixes, and benefits carousel updates.
Maestro E2E Tests
.maestro/flows/local.yaml, .maestro/subflows/*
New readHome subflow added to validation flow; readPortfolio refactored to use copyAria helper; new copyAria subflow introduced for platform-specific clipboard operations; minor text assertions updated (SPENDING LIMIT → Spending limit, Your portfolio → Portfolio).
Design System & Fonts
tamagui.config.ts, app.config.ts, src/app/_layout.tsx, cspell.json
Font migration from BDOGrotesk/IBMPlexMono to SplineSans; spacing token adjustments (s10–s14 values updated); animation configuration updated (moderate → default timing); font faces remapped (400/600/700 weights to SplineSans variants); theme border colors made explicit.
Home Screen Redesign & Card Components
src/components/home/CardStatus.tsx, src/components/home/PortfolioSummary.tsx, src/components/home/Home.tsx, src/components/home/GettingStarted.tsx
CardStatus completely restructured with new API (collateral, creditLimit, mode, spotlightRef, callbacks); PortfolioSummary refactored with new assets prop and visual asset thumbnails; Home.tsx extended with installment/mode mutations, new sheet components, and collateral/limit calculations; animation tokens updated to default.
New Payment Mode Components
src/components/home/CreditLimitSheet.tsx, src/components/home/InstallmentsSheet.tsx, src/components/home/InstallmentsSpotlight.tsx, src/components/home/PayModeSheet.tsx, src/components/home/SpendingLimitSheet.tsx
Five new modal/overlay components enabling installments/pay-later selection, credit/spending limit info displays, and targeted spotlight UI for guiding users through payment mode setup.
Removed Components
src/components/home/CardLimits.tsx, src/components/home/SpendingLimitsSheet.tsx
Deleted CardLimits and SpendingLimitsSheet components, replaced by refactored CardStatus and new sheet components with expanded functionality.
Shared & Utility Components
src/components/shared/Amount.tsx, src/components/shared/StyledButton.tsx, src/components/shared/Text.tsx, src/components/shared/AssetSelector.tsx
New Amount component for monetary display with status-based theming; StyledButton extended with Column and Label subcomponents; Text typography updated with lineHeight-aware variants; AssetSelector refactored to use updated usePortfolio signature.
Widespread Design Token Standardization
src/components/activity/*, src/components/add-funds/*, src/components/benefits/*, src/components/card/*, src/components/getting-started/*, src/components/home/*, src/components/loans/*, src/components/pay-mode/*, src/components/send-funds/*, src/components/shared/*, src/components/swaps/*
Pervasive replacement of numeric gap/padding values with design tokens (10→$s3_5, 20→$s4_5, 5→$s2, etc.) and removal of fontFamily="$mono" overrides across 50+ files.
Hook Refactoring
src/utils/usePortfolio.ts, src/utils/useInstallmentRates.ts, src/utils/queryClient.ts
usePortfolio signature simplified (account parameter removed, now derives from useAccount); new useInstallmentRates hook added for computing payment schedules; installments-spotlight query defaults added.
Internationalization
src/i18n/es.json
Extensive Spanish translation additions covering portfolio management, pay-later/installments workflow, spending/credit limits, payment terms, and activity labels; 40+ new entries with capitalization adjustments.
Feature-Specific Updates
src/components/benefits/BenefitsSection.tsx, src/components/card/CardDetails.tsx, src/components/card/CardPIN.tsx, src/components/card/exa-card/CardContents.tsx, src/components/home/HomeActions.tsx, src/components/auth/Auth.tsx, src/components/benefits/BenefitCard.tsx, src/components/benefits/BenefitSheet.tsx
Benefits carousel refined (pagination dot sizing, animation config); Card display simplified (removed mono fonts); HomeActions refactored to use Button.Column layout with per-item disabled logic; Carousel animations updated; gesture handling modernized in BenefitCard.

Sequence Diagram(s)

sequenceDiagram
    actor User
    participant Home as Home Component
    participant CardStatus as CardStatus Component
    participant PayModeSheet as PayModeSheet
    participant InstallmentsSheet as InstallmentsSheet
    participant useInstallmentRates as useInstallmentRates Hook
    participant mutateMode as setCardMode Mutation
    participant Backend as Backend API

    User->>Home: Opens Home Screen
    Home->>CardStatus: Renders with mode, collateral, creditLimit
    User->>CardStatus: Taps "Now/Later" Toggle
    CardStatus->>PayModeSheet: Opens mode selection
    User->>PayModeSheet: Selects "Pay Later"
    PayModeSheet->>CardStatus: Calls onModeChange
    CardStatus->>InstallmentsSheet: Opens installment selector
    User->>InstallmentsSheet: Selects installment count
    InstallmentsSheet->>useInstallmentRates: Requests APR for selection
    useInstallmentRates->>Backend: Queries market data
    Backend-->>useInstallmentRates: Returns rates, utilization
    useInstallmentRates-->>InstallmentsSheet: Returns payment schedule
    InstallmentsSheet->>User: Displays APR and payments
    User->>InstallmentsSheet: Confirms installment count
    InstallmentsSheet->>mutateMode: Calls onModeChange(installmentCount)
    mutateMode->>Backend: POST card mode change
    Backend-->>mutateMode: Confirms update, returns new limits
    mutateMode->>Home: Updates state optimistically
    Home->>CardStatus: Re-renders with new mode/limits
    CardStatus-->>User: Displays updated spending limit
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~75 minutes

Possibly related PRs

Suggested reviewers

  • cruzdanilo
  • franm91
🚥 Pre-merge checks | ✅ 4
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The PR title '✨ app: home screen revamp' directly describes the primary change—a comprehensive redesign of the home screen including UI components, layouts, and animations.
Linked Issues check ✅ Passed Changes comprehensively address all three linked issues: improved loading states via new skeleton/loading components [#501], removed Visa/SignatureCard UI elements [#599], and extensive home screen redesign with new sheets, spotlight, and card status overhaul [#713].
Out of Scope Changes check ✅ Passed Changes are appropriately scoped: primarily home screen UI revamp, font system standardization, design token updates, and translation additions directly supporting the home screen redesign objectives.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch home

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.

@gemini-code-assist
Copy link

Summary of Changes

Hello @dieguezguille, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request delivers a comprehensive redesign of the application's core user interface, specifically targeting the home and payments sections. The changes aim to modernize the application's appearance, improve navigation, and introduce new functionalities such as an installments calculator and enhanced card management options. The update focuses on providing a more intuitive and visually appealing experience for users interacting with their financial data and card services.

Highlights

  • UI Revamp: The home and payments screens have undergone a significant visual overhaul, including redesigned components for the tab bar, card status, action buttons, benefits carousel, and portfolio summary. New fonts and spacing tokens have been applied across the application for a refreshed look.
  • New Payments Screen: A dedicated payments screen has been implemented, providing a centralized view for total outstanding amounts, overdue payments, and upcoming payments, along with detailed information and actions for each.
  • Installments Calculator: A new installments calculator feature has been added, allowing users to estimate the cost of purchases across various installment plans.
  • Card Mode Management: The card mode mutation logic has been unified, and new UI components for managing and understanding card spending and credit limits have been introduced, including an interactive spotlight for installment selection.
  • Maestro Test Flow Updates: Maestro test flows have been updated to reflect the new UI and functionalities, ensuring continued test coverage for the revamped home and payments features.
Changelog
  • @exactly/mobile
    • adjust tamagui tokens
    • update tab bar ui
    • restyle card status component
    • restyle action buttons
    • implement new pay screen
    • unify card mode mutation
    • apply tamagui spacing tokens
    • refine benefits carousel
    • replace fonts
    • adjust translations
    • add installments calculator
    • fix protocol asset logos
    • add vertical frame to styled button
    • restyle overdue and upcoming payments
    • unify animation parameters
    • restyle portfolio summary
    • unify add funds gap value
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

gemini-code-assist[bot]

This comment was marked as resolved.

coderabbitai[bot]

This comment was marked as resolved.

@sentry
Copy link

sentry bot commented Feb 18, 2026

❌ 1 Tests Failed:

Tests completed Failed Passed Skipped
577 1 576 1
View the top 1 failed test(s) by shortest run time
local::local
Stack Traces | 311s run time
Assertion is false: "How installment repayment works" is visible

To view more test analytics, go to the Prevent Tests Dashboard

coderabbitai[bot]

This comment was marked as resolved.

@cruzdanilo cruzdanilo marked this pull request as ready for review February 18, 2026 15:20
chatgpt-codex-connector[bot]

This comment was marked as resolved.

devin-ai-integration[bot]

This comment was marked as resolved.

chatgpt-codex-connector[bot]

This comment was marked as resolved.

devin-ai-integration[bot]

This comment was marked as resolved.

coderabbitai[bot]

This comment was marked as resolved.

chatgpt-codex-connector[bot]

This comment was marked as resolved.

devin-ai-integration[bot]

This comment was marked as resolved.

coderabbitai[bot]

This comment was marked as resolved.

devin-ai-integration[bot]

This comment was marked as resolved.

chatgpt-codex-connector[bot]

This comment was marked as resolved.

@greptile-apps
Copy link

greptile-apps bot commented Feb 19, 2026

Greptile Summary

redesigned home screen with new installments payment system and visual refresh

  • replaced BDOGrotesk and IBM Plex Mono fonts with SplineSans family throughout the app
  • added interactive pay mode toggle (Now/Later) to CardStatus component with animated limit paginator showing spending limit in debit mode and credit limit with collateral in credit mode
  • implemented InstallmentsSheet for selecting 1-12 installments with real-time APR display using new useInstallmentRates hook that calculates rates via splitInstallments and fixedRate from @exactly/lib
  • added InstallmentsSpotlight onboarding overlay with SVG mask cutout and auto-scroll positioning to highlight installments feature
  • created PayModeSheet educational modal explaining Now vs Later payment modes
  • refactored PortfolioSummary and added new Amount component for consistent currency formatting
  • updated typography system in Text component with explicit line heights and letter spacing values
  • modified spacing token scale in tamagui config (removed intermediate values, adjusted upper range)
  • changed default animation from moderate spring to default timing with bezier easing
  • expanded Spanish translations for installments and payment flows

Confidence Score: 4/5

  • safe to merge with one minor style optimization recommended
  • large but well-structured UI refactor with proper state management, no critical bugs found, one inefficient array initialization pattern that doesn't affect functionality
  • pay close attention to src/utils/useInstallmentRates.ts for the array initialization pattern

Important Files Changed

Filename Overview
src/components/home/Home.tsx added installments sheet, pay mode sheet, and spotlight feature with proper state management
src/components/home/CardStatus.tsx completely redesigned with pay mode toggle, animated limit paginator, and interactive card preview
src/components/home/InstallmentsSheet.tsx new sheet for selecting installments with horizontal scroll and APR display
src/utils/useInstallmentRates.ts new hook calculating installment rates, minor inefficiency in Array.from usage
src/components/pay-mode/Pay.tsx updated payment flow with improved UI, route handling, and asset selection
tamagui.config.ts font changed from BDOGrotesk to SplineSans, updated spacing tokens and animations

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    Start[User opens Home screen] --> CardStatus[CardStatus Component]
    CardStatus --> Toggle{Pay Mode Toggle}
    Toggle -->|Now mode = 0| DebitView[Shows Spending Limit]
    Toggle -->|Later mode > 0| CreditView[Shows Credit Limit]
    
    Toggle --> InstallmentsButton[User taps Later toggle]
    InstallmentsButton -->|mode = 0| SetMode[Set mode to lastInstallments ?? 1]
    InstallmentsButton -->|mode > 0| OpenSheet[Open InstallmentsSheet]
    
    OpenSheet --> SelectInstallments[InstallmentsSheet]
    SelectInstallments --> LoadRates[useInstallmentRates hook]
    LoadRates --> CalcRates[Calculate APR for 1-12 installments]
    CalcRates --> Display[Display horizontal scroll cards]
    Display --> UserSelect[User selects installment count]
    UserSelect --> UpdateMode[Call onModeChange with selected count]
    UpdateMode --> MutateMode[mutateMode API call]
    MutateMode --> UpdateCache[Update queryClient cache]
    
    CardStatus --> LearnMore[User taps Learn More]
    LearnMore --> PayModeSheet[PayModeSheet Component]
    PayModeSheet --> ExplainModes[Explain Now vs Later modes]
    
    CreditView --> Payment[User makes purchase]
    Payment --> CreateDebt[Debt created with maturity]
    CreateDebt --> HomePayments[OverduePayments/UpcomingPayments]
    HomePayments --> PaymentClick[User clicks payment]
    PaymentClick --> PayComponent[Pay Component]
    PayComponent --> AssetSelect[Select payment asset]
    AssetSelect --> CalcRoute[Calculate swap route if needed]
    CalcRoute --> RepayDebt[Execute repayAtMaturity]
Loading

Last reviewed commit: 1220ff6

greptile-apps[bot]

This comment was marked as resolved.

chatgpt-codex-connector[bot]

This comment was marked as resolved.

chatgpt-codex-connector[bot]

This comment was marked as resolved.

Copy link

@devin-ai-integration devin-ai-integration bot left a comment

Choose a reason for hiding this comment

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

Devin Review found 1 new potential issue.

View 6 additional findings in Devin Review.

Open in Devin Review

Comment on lines +31 to +36
if (!formatted) {
return (
<XStack alignItems="center" position="relative" {...properties}>
{children}
</XStack>
);

Choose a reason for hiding this comment

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

🟡 Amount component ignores label prop in the children rendering path, making amounts inaccessible to screen readers

When the Amount component is used with children instead of the amount prop (i.e., amount is undefined), the label prop is destructured out but never applied to the fallback XStack wrapper. The children inside use aria-hidden, so screen readers cannot access the amount value at all.

Root Cause

The Amount component at src/components/shared/Amount.tsx:31-36 has two rendering paths:

  1. Formatted path (when amount is provided): correctly applies aria-label={hidden ? "***" : (label ?? ...)} and tabIndex={0} on line 47-48.
  2. Children path (when amount is undefined): renders a plain XStack without aria-label or tabIndex, discarding the label prop entirely.

The LimitPaginator in src/components/home/CardStatus.tsx:250-263 and 282-295 uses the children path, passing label with the formatted dollar amount but no amount prop. The children (<Text aria-hidden ...>) are explicitly hidden from assistive technology. Since label is not forwarded, and tabIndex is not set, the spending limit and credit limit values are completely invisible to screen readers.

Impact: Users relying on screen readers cannot access spending limit or credit limit values on the home screen card status component.

Suggested change
if (!formatted) {
return (
<XStack alignItems="center" position="relative" {...properties}>
{children}
</XStack>
);
if (!formatted) {
return (
<XStack alignItems="center" position="relative" aria-label={hidden ? "***" : label} tabIndex={label ? 0 : undefined} {...properties}>
{children}
</XStack>
);
}
Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

devin-ai-integration[bot]

This comment was marked as resolved.

chatgpt-codex-connector[bot]

This comment was marked as resolved.

@dieguezguille dieguezguille force-pushed the home branch 2 times, most recently from af0e857 to dd8f188 Compare March 4, 2026 19:14
chatgpt-codex-connector[bot]

This comment was marked as resolved.

devin-ai-integration[bot]

This comment was marked as resolved.

chatgpt-codex-connector[bot]

This comment was marked as resolved.

devin-ai-integration[bot]

This comment was marked as resolved.

Copy link

@devin-ai-integration devin-ai-integration bot left a comment

Choose a reason for hiding this comment

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

Devin Review found 2 new potential issues.

View 3 additional findings in Devin Review.

Open in Devin Review

Comment on lines +72 to +82
const { installments: payments, effectiveRate } = splitInstallments(
amount,
totalFloatingDepositAssets,
firstMaturity,
fixedPools.length,
poolUtilizations,
floatingUtilization,
marketUtilization,
parameters,
now,
);

Choose a reason for hiding this comment

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

🚩 useInstallmentRates passes extra now argument to splitInstallments

In useInstallmentRates.ts:72-82, splitInstallments is called with 9 arguments (including now as the 9th), while the existing useInstallments.ts:34-52 calls it with only 8 arguments (no timestamp). If splitInstallments has an optional 9th timestamp parameter, then useInstallments may be relying on a default value while useInstallmentRates explicitly passes it — which would be the more correct usage. If there's no 9th parameter, the extra argument is silently ignored in JavaScript. Either way this isn't a runtime error, but the inconsistency between the two call sites is worth verifying against the @exactly/lib function signature.

Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Comment on lines +75 to +147
<Modal transparent visible animationType="fade" statusBarTranslucent>
<View style={StyleSheet.absoluteFill}>
<SVG width={screenWidth} height={screenHeight}>
<Defs>
<Mask id="cutout">
<Rect width={screenWidth} height={screenHeight} fill="white" />
<Rect
transform={[{ translateX: cutout.x }, { translateY: cutout.y }]}
width={cutout.width}
height={cutout.height}
rx={cutoutRadius}
fill="black"
/>
</Mask>
</Defs>
<Rect width={screenWidth} height={screenHeight} fill="rgba(0,0,0,0.56)" mask="url(#cutout)" />
<Rect
transform={[{ translateX: cutout.x }, { translateY: cutout.y }]}
width={cutout.width}
height={cutout.height}
rx={cutoutRadius}
fill="none"
stroke="white"
strokeWidth={2}
/>
</SVG>
</View>
<Pressable
aria-label={t("Tap here to change the number of installments")}
style={[
styles.cutoutPress,
{ top: cutout.y, left: cutout.x, width: cutout.width, height: cutout.height, borderRadius: cutoutRadius },
]}
onPress={() => {
onPress();
onDismiss();
}}
/>
<Theme name="light">
<YStack
position="absolute"
top={tooltipTop}
left={tooltipLeft}
width={200}
backgroundColor="$backgroundSoft"
borderRadius="$r3"
padding="$s4"
shadowColor="$uiNeutralSecondary"
shadowOffset={{ width: 0, height: 2 }}
shadowOpacity={0.15}
shadowRadius={8}
onPress={() => {
onPress();
onDismiss();
}}
>
<View
position="absolute"
top={-6}
left={arrowLeft}
width={12}
height={12}
backgroundColor="$backgroundSoft"
borderRadius={2}
transform={[{ rotate: "45deg" }]}
/>
<Text footnote textAlign="center">
{t("Tap here to change the number of installments")}
</Text>
</YStack>
</Theme>
</Modal>
);

Choose a reason for hiding this comment

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

🚩 InstallmentsSpotlight has no full-screen dismiss affordance

The InstallmentsSpotlight modal overlay renders an SVG mask with a cutout, a Pressable over the cutout area, and a tooltip — but there's no Pressable covering the rest of the screen for dismissal. Users can only dismiss by tapping the highlighted cutout or the tooltip, both of which also trigger onPress (opening the installments sheet). There's no way to simply dismiss the spotlight without also opening the sheet. This may be intentional (force engagement with the feature), but it could frustrate users who want to dismiss it.

Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

Copy link

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

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: 5b91963e64

ℹ️ 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 on lines +203 to +205
if (mode > 0) onInstallmentsPress();
else onModeChange(lastInstallments ?? 1);
}}

Choose a reason for hiding this comment

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

P1 Badge Initialize pay-later fallback from current card mode

When the card is already in Pay Later mode on first load, this toggle falls back to lastInstallments from local query state, but that state defaults to 1 unless a prior setCardMode mutation populated it. In the common case of a fresh install/cleared cache (or mode changed on another device), switching to Now and then tapping Later here will unexpectedly set mode 1 instead of restoring the user’s actual previous installment count from card.mode, changing repayment behavior silently.

Useful? React with 👍 / 👎.

Comment on lines +47 to +49
<YStack flex={1} padding="$s4" gap="$s4_5">
<YStack flex={1} gap="$s4">
<View flex={1} width="100%">

Choose a reason for hiding this comment

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

P2 Badge Restore scrolling in connection sheet content

This sheet now uses a fixed-height YStack inside a 90% modal without a ScrollView, so on smaller devices or larger accessibility text sizes the combined illustration, disclaimer, terms, and CTA can exceed viewport height and push the action button out of reach. That blocks users from completing the connection flow in those contexts.

Useful? React with 👍 / 👎.

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.

app: home screen redesign ui: remove visa logo from home app: improve component loading states

1 participant