Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/clear-trains-move.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@exactly/mobile": patch
---

💄 adjust tamagui tokens
5 changes: 5 additions & 0 deletions .changeset/cold-poems-end.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@exactly/mobile": patch
---

💄 update tab bar ui
5 changes: 5 additions & 0 deletions .changeset/curly-waves-yell.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@exactly/mobile": patch
---

💄 restyle card status component
5 changes: 5 additions & 0 deletions .changeset/easy-snails-brake.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@exactly/mobile": patch
---

💄 restyle action buttons
5 changes: 5 additions & 0 deletions .changeset/green-weeks-care.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@exactly/mobile": patch
---

✨ implement new pay screen
5 changes: 5 additions & 0 deletions .changeset/jolly-radios-poke.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@exactly/mobile": patch
---

♻️ unify card mode mutation
5 changes: 5 additions & 0 deletions .changeset/khaki-queens-smash.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@exactly/mobile": patch
---

💄 apply tamagui spacing tokens
5 changes: 5 additions & 0 deletions .changeset/lazy-planes-dance.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@exactly/mobile": patch
---

💄 refine benefits carousel
5 changes: 5 additions & 0 deletions .changeset/little-hoops-train.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@exactly/mobile": patch
---

💄 replace fonts
5 changes: 5 additions & 0 deletions .changeset/many-balloons-bake.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@exactly/mobile": patch
---

🌐 adjust translations
5 changes: 5 additions & 0 deletions .changeset/purple-lizards-run.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@exactly/mobile": patch
---

✨ add installments calculator
5 changes: 5 additions & 0 deletions .changeset/quick-mangos-rescue.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@exactly/mobile": patch
---

🐛 fix protocol asset logos
5 changes: 5 additions & 0 deletions .changeset/salty-fans-mate.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@exactly/mobile": patch
---

💄 add vertical frame to styled button
5 changes: 5 additions & 0 deletions .changeset/shiny-badgers-sleep.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@exactly/mobile": patch
---

💄 restyle overdue and upcoming payments
5 changes: 5 additions & 0 deletions .changeset/soft-beans-grow.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@exactly/mobile": patch
---

💫 unify animation parameters
5 changes: 5 additions & 0 deletions .changeset/spicy-doodles-give.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@exactly/mobile": patch
---

💄 restyle portfolio summary
5 changes: 5 additions & 0 deletions .changeset/spicy-dragons-raise.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@exactly/mobile": patch
---

💄 unify add funds gap value
1 change: 1 addition & 0 deletions .maestro/flows/local.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,5 @@ tags: [critical]
- runFlow: ../subflows/repay.yaml
- runFlow: ../subflows/verifyIdentity.yaml
- runFlow: ../subflows/activateCard.yaml
- runFlow: ../subflows/readHome.yaml
- runFlow: ../subflows/storeCoverage.yaml
29 changes: 28 additions & 1 deletion .maestro/subflows/activateCard.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -42,4 +42,31 @@ appId: ${APP_ID ?? "app.exactly"}
text: \$[\s\d,.\xa0]+
above: Available balance
- tapOn: Home
- assertVisible: SPENDING LIMIT
- runFlow:
when: { visible: Tap here to change the number of installments }
commands:
- tapOn: Tap here to change the number of installments
- assertVisible: Set installments
- tapOn: "3"
- tapOn: Set Pay Later in 3
- tapOn: Later in 3
- assertVisible: Set installments
- tapOn: Installments calculator
- assertVisible: Enter a purchase amount
- assertVisible: BEST APR
- runFlow: { file: ../subflows/tapAria.yaml, env: { aria: Go back } }
- assertVisible: Exa Card pay mode
- tapOn: Now
- runFlow: { file: ../subflows/tapAria.yaml, env: { aria: Spending limit info } }
- assertVisible: It's based on the USDC available in your balance.
- tapOn: Close
- tapOn: Later in \d+
- runFlow: { file: ../subflows/tapAria.yaml, env: { aria: Credit limit info } }
- assertVisible: It's based on the value of your collateral assets and updates as their value changes.
- tapOn: Close
- tapOn:
text: Learn more
rightOf: Exa Card pay mode
- assertVisible: Change the pay mode before each purchase and pay how you want.
- tapOn: Close

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

Remove trailing blank line.

YAMLlint flags a trailing empty line at the end of the file.

🧰 Tools
🪛 YAMLlint (1.38.0)

[error] 72-72: too many blank lines (1 > 0)

(empty-lines)

11 changes: 11 additions & 0 deletions .maestro/subflows/copyAria.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
appId: ${APP_ID ?? "app.exactly"}
---
# HACK https://github.com/mobile-dev-inc/Maestro/issues/2914
- runFlow:
when: { true: "${maestro.platform != 'web'}" }
commands:
- copyTextFrom: "${aria}"
- runFlow:
when: { platform: web }
commands:
- copyTextFrom: { id: "${aria}" }
2 changes: 1 addition & 1 deletion .maestro/subflows/dismissNotifications.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,5 @@ appId: ${APP_ID ?? "app.exactly"}
- tapOn: Not now
- pressKey: home
- launchApp: { permissions: { all: deny, camera: allow } }
- extendedWaitUntil: { visible: Your portfolio, timeout: 180000 }
- extendedWaitUntil: { visible: Portfolio, timeout: 180000 }
- assertNotVisible: Stay updated
67 changes: 67 additions & 0 deletions .maestro/subflows/readHome.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
appId: ${APP_ID ?? "app.exactly"}
---
- assertVisible: ${output.account.slice(0, 6)}…${output.account.slice(-4)}
- runFlow:
when: { true: "${maestro.platform != 'web'}" }
commands: [{ assertVisible: Settings }]
- runFlow:
when: { platform: web }
commands: [{ assertVisible: { id: Settings } }]
- runFlow: { file: tapAria.yaml, env: { aria: Hide sensitive } }
- assertNotVisible:
text: \$[\s\d,.\xa0]+
below: Portfolio
- runFlow: { file: tapAria.yaml, env: { aria: Show sensitive } }
- assertVisible:
text: \$[\s\d,.\xa0]+
below: Portfolio
- assertVisible: Portfolio
- assertVisible:
text: \$[\s\d,.\xa0]+
below: Portfolio
- assertVisible: Manage portfolio
- runFlow: readPortfolio.yaml
- assertTrue: ${output.portfolio > 0}
- assertVisible: Add funds
- assertVisible: Send
- assertVisible: Swap
- assertVisible: Exa Card pay mode
- assertVisible: Learn more
- assertNotVisible: Getting Started
- scrollUntilVisible: { element: Upcoming payments }
- assertVisible: Benefits
- extendedWaitUntil:
visible: 30 days of free travel insurance
timeout: 15000
- tapOn: 30 days of free travel insurance
- assertVisible: Copy your ID and get 30 days of travel insurance for free on Pax Assistance.
- tapOn: COPY ID
- runFlow: { file: tapAria.yaml, env: { aria: Close } }
- extendedWaitUntil:
visible: 20% OFF on eSims
timeout: 15000
- tapOn: 20% OFF on eSims
- assertVisible: Stay connected around the world.
- assertVisible: Terms & conditions
- runFlow: { file: tapAria.yaml, env: { aria: Close } }
- extendedWaitUntil:
visible: Visa Signature benefits
timeout: 15000
- tapOn: Visa Signature benefits
- assertVisible: Visa Signature Exa Card benefits
- assertVisible: A world of benefits.
- runFlow: { file: tapAria.yaml, env: { aria: Close } }
Comment on lines +33 to +53
Copy link

Choose a reason for hiding this comment

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

🧹 Nitpick | 🔵 Trivial

Benefits carousel content is hardcoded — consider parameterizing if content is dynamic.

The test asserts specific benefit strings ("30 days of free travel insurance", "20% OFF on eSims", "Visa Signature benefits"). If marketing content changes, these tests will break silently. This is fine for stable content, but worth noting for maintenance.

🧰 Tools
🪛 YAMLlint (1.38.0)

[error] 39-39: too many spaces inside braces

(braces)


[error] 39-39: too many spaces inside braces

(braces)


[error] 39-39: too many spaces inside braces

(braces)


[error] 39-39: too many spaces inside braces

(braces)


[error] 46-46: too many spaces inside braces

(braces)


[error] 46-46: too many spaces inside braces

(braces)


[error] 46-46: too many spaces inside braces

(braces)


[error] 46-46: too many spaces inside braces

(braces)


[error] 53-53: too many spaces inside braces

(braces)


[error] 53-53: too many spaces inside braces

(braces)


[error] 53-53: too many spaces inside braces

(braces)


[error] 53-53: too many spaces inside braces

(braces)

- assertVisible: Upcoming payments
- assertVisible:
text: \$[\d,]+\.\d{2}
below: Upcoming payments
- scrollUntilVisible: { element: Latest activity }
- assertVisible: Latest activity
- assertVisible: View all
- assertNotVisible: No activity yet
- tapOn: View all
- tapOn: Home
- assertVisible: Portfolio
- assertVisible:
text: \$[\s\d,.\xa0]+
below: Portfolio
6 changes: 3 additions & 3 deletions .maestro/subflows/readPortfolio.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
appId: ${APP_ID ?? "app.exactly"}
---
- copyTextFrom:
below: Your portfolio
text: ^(US)?\$[\s\d,.\xa0]+$
- runFlow:
file: copyAria.yaml
env: { aria: "^(US)?\\$[\\s\\d,.\\xa0]+$" }
- evalScript: ${output.portfolio = Number(maestro.copiedText.replace(/\D/g, "")) / 100}
22 changes: 10 additions & 12 deletions .maestro/subflows/repay.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,17 @@ appId: ${APP_ID ?? "app.exactly"}
---
- scrollUntilVisible: { element: Upcoming payments }
- copyTextFrom:
text: \d+[,.]\d{2}
text: \$[\d,]+\.\d{2}
below: Upcoming payments
leftOf: Repay
- evalScript: ${output.debt = Number(maestro.copiedText)}
- evalScript: ${output.debt = Number(maestro.copiedText.replace(/[^\d.]/g, ''))}
- copyTextFrom:
text: "[^%.]+"
below: "${maestro.copiedText}"
leftOf: Repay
text: "[^%.$]+"
below: Upcoming payments
leftOf: "${maestro.copiedText}"
- evalScript: ${output.maturity = maestro.copiedText}
- tapOn: { text: Repay, rightOf: "${output.maturity}" }
- tapOn: "${output.maturity}"
- waitForAnimationToEnd
- tapOn: { text: Repay, leftOf: Rollover }
- tapOn: { text: Pay, leftOf: Rollover }
- runFlow: { when: { true: "${!amount}" }, commands: [{ tapOn: Max }] }
- runFlow:
when: { true: "${amount}" }
Expand Down Expand Up @@ -50,9 +49,8 @@ appId: ${APP_ID ?? "app.exactly"}
commands:
- assertVisible: "${output.maturity}"
- copyTextFrom:
text: \d+[,.]\d{2}
above: "${output.maturity}"
text: \$[\d,]+\.\d{2}
below: Upcoming payments
leftOf: Repay
- assertTrue: ${Math.abs(output.debt - Number(maestro.copiedText) - Number(amount)) < 0.02}
rightOf: "${output.maturity}"
- assertTrue: ${Math.abs(output.debt - Number(maestro.copiedText.replace(/[^\d.]/g, '')) - Number(amount)) < 0.02}
Comment on lines 51 to +55
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Check if the Maestro config or CI sets a specific locale
rg -n -i 'locale\|LANG\|LC_' .maestro/ --include='*.yaml' --include='*.yml' || echo "No locale config found in .maestro/"
echo "---"
rg -n -i 'locale\|LANG\|LC_' .github/ -g '*.yml' -g '*.yaml' || echo "No locale config found in .github/"

Repository: exactly/exa

Length of output: 588


🏁 Script executed:

# Search for Maestro configuration files and test setup
find . -name ".maestro" -o -name "maestro.yaml" -o -name "maestro.yml" | head -20

Repository: exactly/exa

Length of output: 65


🏁 Script executed:

# Check for any environment variable setup or locale handling in test files
rg -n 'Locale\|locale\|LANG' . --include='*.yaml' --include='*.yml' --include='*.java' --include='*.kt' --include='*.js' --include='*.ts' --max-count=20 || echo "No locale settings found"

Repository: exactly/exa

Length of output: 538


🏁 Script executed:

# Read the repay.yaml file to understand the context
cat -n .maestro/subflows/repay.yaml

Repository: exactly/exa

Length of output: 2296


🏁 Script executed:

# Search for Maestro references or documentation
find . -type f \( -name "README*" -o -name "*.md" \) | head -10 | xargs grep -l "Maestro" 2>/dev/null || echo "No README found"

Repository: exactly/exa

Length of output: 70


🏁 Script executed:

# Check for Maestro configuration in common locations
ls -la .maestro/

Repository: exactly/exa

Length of output: 787


🏁 Script executed:

# Search for any test setup, runner config, or environment files
find . -maxdepth 2 -type f \( -name "*.config.*" -o -name "setup.*" -o -name "test.env" -o -name ".env*" \) 2>/dev/null | head -20

Repository: exactly/exa

Length of output: 481


🏁 Script executed:

# Check Maestro config
cat .maestro/config.yaml

Repository: exactly/exa

Length of output: 106


🏁 Script executed:

# Check package.json for test setup and locale info
cat package.json | grep -A 20 '"scripts"' || cat package.json

Repository: exactly/exa

Length of output: 1611


Fix number parsing to handle non-US locales used in e2e tests.

Line 55 asserts output.debt - Number(maestro.copiedText.replace(/[^\d.]/g, '')) - Number(amount) < 0.02. The regex /[^\d.]/g assumes US number format, but the e2e:iphone test script explicitly uses --device-locale=es-419 (Spanish, Latin America), which formats numbers with a comma as the decimal separator and dot as the thousands separator (e.g., $1.234,56). In this locale, the regex would strip the comma (the actual decimal separator) but preserve the dot (a thousands separator), producing an incorrect number like 1.23456 instead of 1234.56, causing the assertion to fail.

Additionally, the copyTextFrom pattern on line 52 (\$[\d,]+\.\d{2}) assumes US format and would not match the es-419 format, which could cause upstream failures. The number parsing needs to be locale-aware or the locale configuration should be standardized across all test environments.

- tapOn: Home
19 changes: 6 additions & 13 deletions .maestro/subflows/rollover.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,14 @@ appId: ${APP_ID ?? "app.exactly"}
---
- scrollUntilVisible: { element: Upcoming payments }
- copyTextFrom:
text: \d+[,.]\d{2}
text: "[^%.$]+"
below: Upcoming payments
leftOf: Repay
index: 1
- copyTextFrom:
text: "[^%.]+"
below: "${maestro.copiedText}"
leftOf: Repay
- evalScript: ${output.secondMaturity = maestro.copiedText}
- tapOn: Repay
- copyTextFrom:
text: "[^%.$]+"
below: Upcoming payments
- tapOn: "${maestro.copiedText}"
- waitForAnimationToEnd
- tapOn: Rollover
- runFlow:
Expand All @@ -28,12 +26,7 @@ appId: ${APP_ID ?? "app.exactly"}
env: { aria: Pending proposals, tap: Home }
- scrollUntilVisible: { element: Upcoming payments }
- copyTextFrom:
text: \d+[,.]\d{2}
text: "[^%.$]+"
below: Upcoming payments
leftOf: Repay
- copyTextFrom:
text: "[^%.]+"
below: "${maestro.copiedText}"
leftOf: Repay
- assertTrue: ${maestro.copiedText === output.secondMaturity}
- tapOn: Home
8 changes: 4 additions & 4 deletions .maestro/subflows/verifyIdentity.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ appId: ${APP_ID ?? "app.exactly"}
- runFlow:
when: { platform: android }
commands: [{ tapOn: Confirmation Code }]
- inputText: "12345"
- inputText: '12345'
- hideKeyboard
- tapOn: Continue
- assertVisible: What is your phone number?
Expand All @@ -51,14 +51,14 @@ appId: ${APP_ID ?? "app.exactly"}
- tapOn: 🇦🇷 Argentina +54
- tapOn:
containsChild: { containsChild: { id: textinput_prefix_text } } # cspell:ignore textinput
- inputText: "1199999999"
- inputText: '1199999999'
- hideKeyboard
- tapOn: Continue
- assertVisible: Confirm your phone number
- runFlow: # HACK
when: { platform: android }
commands: [{ tapOn: { id: first } }]
- inputText: "1234"
- inputText: '1234'
- hideKeyboard
- extendedWaitUntil: { visible: Economic activity }
- tapOn: Economic activity
Expand All @@ -81,6 +81,6 @@ appId: ${APP_ID ?? "app.exactly"}
- runScript: ../dist/getAccount.js
- runScript:
file: ../dist/approveKYC.js
env: { credentialId: "${output.owner}" }
env: { credentialId: '${output.owner}' }
- tapOn: Home
- assertNotVisible: Getting Started
5 changes: 2 additions & 3 deletions app.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -80,9 +80,8 @@ export default {
"expo-font",
{
fonts: [
"src/assets/fonts/BDOGrotesk-DemiBold.otf",
"src/assets/fonts/BDOGrotesk-Regular.otf",
"src/assets/fonts/IBMPlexMono-Medm.otf",
"src/assets/fonts/SplineSans-Regular.otf",
"src/assets/fonts/SplineSans-SemiBold.otf",
],
} satisfies FontProps,
],
Expand Down
4 changes: 1 addition & 3 deletions cspell.json
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,6 @@
"decisioned",
"defi",
"delegatecall",
"demi",
"deployless",
"dieguezguille",
"dismissable",
Expand All @@ -70,12 +69,10 @@
"gitmoji",
"gitmojis",
"graaljs",
"grotesk",
"hdpi",
"hexlify",
"hideable",
"hono",
"IBMPlexMono-Medm",
"IERC",
"indoc",
"infinitism",
Expand Down Expand Up @@ -146,6 +143,7 @@
"solmate",
"sourcify",
"spkg",
"splinesans",
"spotlightjs",
"staticcall",
"streamingfast",
Expand Down
Loading
Loading