Add a minimum and maximum value to Buy/Sell flow - #12323

Merged
faridsalau merged 4 commits into
mainfrom
fs-add-min-max
Jun 13, 2025
Merged

Add a minimum and maximum value to Buy/Sell flow#12323
faridsalau merged 4 commits into
mainfrom
fs-add-min-max

Conversation

@faridsalau

Copy link
Copy Markdown
Contributor

Description

This PR implements USD-based minimum and maximum constraints for token swaps and improves error handling across the buy/sell feature on both web and mobile platforms.

Changes

Core Implementation

  • USD-based limits: Added MIN_SWAP_AMOUNT_USD ($0.01) and MAX_SWAP_AMOUNT_USD ($10,000) constants that apply to all currencies
  • Dynamic limit calculation: Token-specific limits are now calculated based on current token prices and USD limits
  • Stablecoin handling: Direct USD mapping for stablecoins like USDC (1 token ≈ $1 USD)

Error Handling Improvements

  • Enhanced validation messages: Added insufficientBalance, minAmount, and maxAmount message functions to buySellMessages
  • Better error state management: Forms now properly handle empty input states without showing premature validation errors
  • Improved error propagation: Transaction data now includes error information that flows through to UI components

Form Validation Updates

  • Refined schema validation: Updated swapFormSchema to handle empty inputs gracefully during typing
  • Consolidated messaging: Moved validation messages to centralized buySellMessages for consistency
  • Enhanced form state: Added error field to transaction data type for better error tracking

Cross-platform Consistency

  • Unified error handling: Both web and mobile platforms now use the same error handling logic
  • Consistent validation: Same USD-based limits and validation rules apply across all platforms
  • Improved UX: Better error messaging that prioritizes specific validation errors over generic fallbacks

Technical Details

  • Token limits are calculated dynamically using calculateTokenLimits() function
  • Fallback limits (1-1,000,000) are used when token price data is unavailable
  • Error display logic prevents showing validation errors for empty fields during user input
  • All components updated to handle the new error field in transaction data

How Has This Been Tested?

npm run ios:prod and play around with entering values into input field

@changeset-bot

changeset-botBot commented Jun 13, 2025

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: 01e790b

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

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

)
.refine(
(val) => {
if (val === '') return false

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

do we really need the empty string check at every refine step?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

yea helps not show errors falsely when stuff is processing

if (onTransactionDataChange) {
const isValid = numericInputAmount > 0 && !errors.inputAmount
// Only report errors that should be shown to the user (not empty field errors)
const errorToReport = error // This already filters out empty field errors

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

this assign and assign back seems unnecessary

@dharit-tandharit-tan left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

imo too many ai comments, but logic seems good

@faridsalau
faridsalau merged commit cfd2741 into mainJun 13, 2025
@faridsalau
faridsalau deleted the fs-add-min-max branch June 13, 2025 18:14
audius-infra pushed a commit that referenced this pull request Jun 14, 2025
[8d4f0ca] [PE-6389] Explore screen refactor and performance (#12321) Dylan Jeffers
[02381bf] Add avoidable keyboard to buy/sell flow (#12328) Farid Salau
[31c1d5f] [PE-6338] Fix confetti (#12316) JD Francis
[f7e0aa1] [QA-2093] Fix comment history alignment and add full width prop on user links (#12326) KJ
[5997b15] More withdraw UI cleanup (#12327) Reed
[2045aa1] Fix listening history not showing items (#12322) JD Francis
[4876c94] [QA-2122] Fix track stats alignment by removing margin (#12325) KJ
[cefd8cf] [QA-2138] Remove max-width on playlist tiles for mobile web (#12324) KJ
[cdbca04] Mobile withdraw flow validation updates (#12317) Reed
[cfd2741] Add a minimum and maximum value to Buy/Sell flow (#12323) Farid Salau
[9573612] Stop error message flash on sell tab of Buy/Sell (#12310) Farid Salau
[21c1649] [PE-6337] Fix mobile sign out not working (#12318) JD Francis
[2042bb5] QA fixes for mobile explore: reseting search params and scroll + more (#12320) Isaac Solo
[4f19567] Refactor mobile left nav drawer to improve performance (#12314) Dylan Jeffers
[5ed2795] [PE-6375] Add loading state for brief sign in state (#12319) JD Francis
[7f20217] Fix text-link navigation to push (#12308) Dylan Jeffers
[c698239] Standardize query-collection options, fix refresh (#12307) Dylan Jeffers
[3294109] Add collapsing explore header animation (#12312) Isaac Solo
[8113778] Fix mobile profiles not loading (#12315) JD Francis
[c9d8b65] [PE-6224] Refactor mobile lineup-tiles for simplicity and performance (#12313) Dylan Jeffers
[2825a43] Improve feature flag performance (#12311) Dylan Jeffers
[f487fe5] Mobiles keyboard-avoiding withdraw drawer (#12306) Reed
[04ea576] [PE-6379] Fix refetching collection by permalink (#12304) Dylan Jeffers
[cc5d877] Fix missing track in upload complete screen (#12305) Dylan Jeffers
[e20aa89] Update remixes query page param calculation to account for original track in lineup (#12303) KJ
[a11c528] Fix negative limit (#12181) Farid Salau
[a4f5567] [PE-6345|PE-6351] Dep all users cache & almost all of entity cache (#12300) JD Francis
[ffba4c7] Fix mobile upload stuck at 100% (#12301) Dylan Jeffers
[1e42882] [PE-6245PE-6246] Fix mobile/web drawer behavior (#12297) Dylan Jeffers
[385c930] Fix mobile web track artwork loading (#12299) Dylan Jeffers
[d7a1778] Add remix contest card + minor fixes to mobile explore (#12298) Isaac Solo
[e692901] [PE-6335] Address mobile wallet UI M2 QA finds (#12296) Farid Salau
[8fae645] [PE-6181] Mobile withdraw flow (#12290) Reed
[eb91d5d] Fix library loading (#12288) Dylan Jeffers
[438384e] Fix remix contest section initial tab (#12295) Dylan Jeffers
[df6c087] (account fix) Fix left nav not showing (#12292) JD Francis
[7d07905] [PE-6341] Fix remix contest track page displaying empty track lineup section (#12294) KJ
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@faridsalau@dharit-tan@dylanjeffers
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Add a minimum and maximum value to Buy/Sell flow - #12323

Merged
faridsalau merged 4 commits into
mainfrom
fs-add-min-max
Jun 13, 2025
Merged

Add a minimum and maximum value to Buy/Sell flow#12323
faridsalau merged 4 commits into
mainfrom
fs-add-min-max

Conversation

@faridsalau

Copy link
Copy Markdown
Contributor

Description

This PR implements USD-based minimum and maximum constraints for token swaps and improves error handling across the buy/sell feature on both web and mobile platforms.

Changes

Core Implementation

  • USD-based limits: Added MIN_SWAP_AMOUNT_USD ($0.01) and MAX_SWAP_AMOUNT_USD ($10,000) constants that apply to all currencies
  • Dynamic limit calculation: Token-specific limits are now calculated based on current token prices and USD limits
  • Stablecoin handling: Direct USD mapping for stablecoins like USDC (1 token ≈ $1 USD)

Error Handling Improvements

  • Enhanced validation messages: Added insufficientBalance, minAmount, and maxAmount message functions to buySellMessages
  • Better error state management: Forms now properly handle empty input states without showing premature validation errors
  • Improved error propagation: Transaction data now includes error information that flows through to UI components

Form Validation Updates

  • Refined schema validation: Updated swapFormSchema to handle empty inputs gracefully during typing
  • Consolidated messaging: Moved validation messages to centralized buySellMessages for consistency
  • Enhanced form state: Added error field to transaction data type for better error tracking

Cross-platform Consistency

  • Unified error handling: Both web and mobile platforms now use the same error handling logic
  • Consistent validation: Same USD-based limits and validation rules apply across all platforms
  • Improved UX: Better error messaging that prioritizes specific validation errors over generic fallbacks

Technical Details

  • Token limits are calculated dynamically using calculateTokenLimits() function
  • Fallback limits (1-1,000,000) are used when token price data is unavailable
  • Error display logic prevents showing validation errors for empty fields during user input
  • All components updated to handle the new error field in transaction data

How Has This Been Tested?

npm run ios:prod and play around with entering values into input field

@changeset-bot

changeset-botBot commented Jun 13, 2025

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: 01e790b

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

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

)
.refine(
(val) => {
if (val === '') return false

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

do we really need the empty string check at every refine step?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

yea helps not show errors falsely when stuff is processing

if (onTransactionDataChange) {
const isValid = numericInputAmount > 0 && !errors.inputAmount
// Only report errors that should be shown to the user (not empty field errors)
const errorToReport = error // This already filters out empty field errors

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

this assign and assign back seems unnecessary

@dharit-tandharit-tan left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

imo too many ai comments, but logic seems good

@faridsalau
faridsalau merged commit cfd2741 into mainJun 13, 2025
@faridsalau
faridsalau deleted the fs-add-min-max branch June 13, 2025 18:14
audius-infra pushed a commit that referenced this pull request Jun 14, 2025
[8d4f0ca] [PE-6389] Explore screen refactor and performance (#12321) Dylan Jeffers
[02381bf] Add avoidable keyboard to buy/sell flow (#12328) Farid Salau
[31c1d5f] [PE-6338] Fix confetti (#12316) JD Francis
[f7e0aa1] [QA-2093] Fix comment history alignment and add full width prop on user links (#12326) KJ
[5997b15] More withdraw UI cleanup (#12327) Reed
[2045aa1] Fix listening history not showing items (#12322) JD Francis
[4876c94] [QA-2122] Fix track stats alignment by removing margin (#12325) KJ
[cefd8cf] [QA-2138] Remove max-width on playlist tiles for mobile web (#12324) KJ
[cdbca04] Mobile withdraw flow validation updates (#12317) Reed
[cfd2741] Add a minimum and maximum value to Buy/Sell flow (#12323) Farid Salau
[9573612] Stop error message flash on sell tab of Buy/Sell (#12310) Farid Salau
[21c1649] [PE-6337] Fix mobile sign out not working (#12318) JD Francis
[2042bb5] QA fixes for mobile explore: reseting search params and scroll + more (#12320) Isaac Solo
[4f19567] Refactor mobile left nav drawer to improve performance (#12314) Dylan Jeffers
[5ed2795] [PE-6375] Add loading state for brief sign in state (#12319) JD Francis
[7f20217] Fix text-link navigation to push (#12308) Dylan Jeffers
[c698239] Standardize query-collection options, fix refresh (#12307) Dylan Jeffers
[3294109] Add collapsing explore header animation (#12312) Isaac Solo
[8113778] Fix mobile profiles not loading (#12315) JD Francis
[c9d8b65] [PE-6224] Refactor mobile lineup-tiles for simplicity and performance (#12313) Dylan Jeffers
[2825a43] Improve feature flag performance (#12311) Dylan Jeffers
[f487fe5] Mobiles keyboard-avoiding withdraw drawer (#12306) Reed
[04ea576] [PE-6379] Fix refetching collection by permalink (#12304) Dylan Jeffers
[cc5d877] Fix missing track in upload complete screen (#12305) Dylan Jeffers
[e20aa89] Update remixes query page param calculation to account for original track in lineup (#12303) KJ
[a11c528] Fix negative limit (#12181) Farid Salau
[a4f5567] [PE-6345|PE-6351] Dep all users cache & almost all of entity cache (#12300) JD Francis
[ffba4c7] Fix mobile upload stuck at 100% (#12301) Dylan Jeffers
[1e42882] [PE-6245PE-6246] Fix mobile/web drawer behavior (#12297) Dylan Jeffers
[385c930] Fix mobile web track artwork loading (#12299) Dylan Jeffers
[d7a1778] Add remix contest card + minor fixes to mobile explore (#12298) Isaac Solo
[e692901] [PE-6335] Address mobile wallet UI M2 QA finds (#12296) Farid Salau
[8fae645] [PE-6181] Mobile withdraw flow (#12290) Reed
[eb91d5d] Fix library loading (#12288) Dylan Jeffers
[438384e] Fix remix contest section initial tab (#12295) Dylan Jeffers
[df6c087] (account fix) Fix left nav not showing (#12292) JD Francis
[7d07905] [PE-6341] Fix remix contest track page displaying empty track lineup section (#12294) KJ
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@faridsalau@dharit-tan@dylanjeffers
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add a minimum and maximum value to Buy/Sell flow - #12323

Merged
faridsalau merged 4 commits into
mainfrom
fs-add-min-max
Jun 13, 2025
Merged

Add a minimum and maximum value to Buy/Sell flow#12323
faridsalau merged 4 commits into
mainfrom
fs-add-min-max

Conversation

@faridsalau

Copy link
Copy Markdown
Contributor

Description

This PR implements USD-based minimum and maximum constraints for token swaps and improves error handling across the buy/sell feature on both web and mobile platforms.

Changes

Core Implementation

  • USD-based limits: Added MIN_SWAP_AMOUNT_USD ($0.01) and MAX_SWAP_AMOUNT_USD ($10,000) constants that apply to all currencies
  • Dynamic limit calculation: Token-specific limits are now calculated based on current token prices and USD limits
  • Stablecoin handling: Direct USD mapping for stablecoins like USDC (1 token ≈ $1 USD)

Error Handling Improvements

  • Enhanced validation messages: Added insufficientBalance, minAmount, and maxAmount message functions to buySellMessages
  • Better error state management: Forms now properly handle empty input states without showing premature validation errors
  • Improved error propagation: Transaction data now includes error information that flows through to UI components

Form Validation Updates

  • Refined schema validation: Updated swapFormSchema to handle empty inputs gracefully during typing
  • Consolidated messaging: Moved validation messages to centralized buySellMessages for consistency
  • Enhanced form state: Added error field to transaction data type for better error tracking

Cross-platform Consistency

  • Unified error handling: Both web and mobile platforms now use the same error handling logic
  • Consistent validation: Same USD-based limits and validation rules apply across all platforms
  • Improved UX: Better error messaging that prioritizes specific validation errors over generic fallbacks

Technical Details

  • Token limits are calculated dynamically using calculateTokenLimits() function
  • Fallback limits (1-1,000,000) are used when token price data is unavailable
  • Error display logic prevents showing validation errors for empty fields during user input
  • All components updated to handle the new error field in transaction data

How Has This Been Tested?

npm run ios:prod and play around with entering values into input field

@changeset-bot

changeset-botBot commented Jun 13, 2025

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: 01e790b

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

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

)
.refine(
(val) => {
if (val === '') return false

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

do we really need the empty string check at every refine step?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

yea helps not show errors falsely when stuff is processing

if (onTransactionDataChange) {
const isValid = numericInputAmount > 0 && !errors.inputAmount
// Only report errors that should be shown to the user (not empty field errors)
const errorToReport = error // This already filters out empty field errors

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

this assign and assign back seems unnecessary

@dharit-tandharit-tan left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

imo too many ai comments, but logic seems good

@faridsalau
faridsalau merged commit cfd2741 into mainJun 13, 2025
@faridsalau
faridsalau deleted the fs-add-min-max branch June 13, 2025 18:14
audius-infra pushed a commit that referenced this pull request Jun 14, 2025
[8d4f0ca] [PE-6389] Explore screen refactor and performance (#12321) Dylan Jeffers
[02381bf] Add avoidable keyboard to buy/sell flow (#12328) Farid Salau
[31c1d5f] [PE-6338] Fix confetti (#12316) JD Francis
[f7e0aa1] [QA-2093] Fix comment history alignment and add full width prop on user links (#12326) KJ
[5997b15] More withdraw UI cleanup (#12327) Reed
[2045aa1] Fix listening history not showing items (#12322) JD Francis
[4876c94] [QA-2122] Fix track stats alignment by removing margin (#12325) KJ
[cefd8cf] [QA-2138] Remove max-width on playlist tiles for mobile web (#12324) KJ
[cdbca04] Mobile withdraw flow validation updates (#12317) Reed
[cfd2741] Add a minimum and maximum value to Buy/Sell flow (#12323) Farid Salau
[9573612] Stop error message flash on sell tab of Buy/Sell (#12310) Farid Salau
[21c1649] [PE-6337] Fix mobile sign out not working (#12318) JD Francis
[2042bb5] QA fixes for mobile explore: reseting search params and scroll + more (#12320) Isaac Solo
[4f19567] Refactor mobile left nav drawer to improve performance (#12314) Dylan Jeffers
[5ed2795] [PE-6375] Add loading state for brief sign in state (#12319) JD Francis
[7f20217] Fix text-link navigation to push (#12308) Dylan Jeffers
[c698239] Standardize query-collection options, fix refresh (#12307) Dylan Jeffers
[3294109] Add collapsing explore header animation (#12312) Isaac Solo
[8113778] Fix mobile profiles not loading (#12315) JD Francis
[c9d8b65] [PE-6224] Refactor mobile lineup-tiles for simplicity and performance (#12313) Dylan Jeffers
[2825a43] Improve feature flag performance (#12311) Dylan Jeffers
[f487fe5] Mobiles keyboard-avoiding withdraw drawer (#12306) Reed
[04ea576] [PE-6379] Fix refetching collection by permalink (#12304) Dylan Jeffers
[cc5d877] Fix missing track in upload complete screen (#12305) Dylan Jeffers
[e20aa89] Update remixes query page param calculation to account for original track in lineup (#12303) KJ
[a11c528] Fix negative limit (#12181) Farid Salau
[a4f5567] [PE-6345|PE-6351] Dep all users cache & almost all of entity cache (#12300) JD Francis
[ffba4c7] Fix mobile upload stuck at 100% (#12301) Dylan Jeffers
[1e42882] [PE-6245PE-6246] Fix mobile/web drawer behavior (#12297) Dylan Jeffers
[385c930] Fix mobile web track artwork loading (#12299) Dylan Jeffers
[d7a1778] Add remix contest card + minor fixes to mobile explore (#12298) Isaac Solo
[e692901] [PE-6335] Address mobile wallet UI M2 QA finds (#12296) Farid Salau
[8fae645] [PE-6181] Mobile withdraw flow (#12290) Reed
[eb91d5d] Fix library loading (#12288) Dylan Jeffers
[438384e] Fix remix contest section initial tab (#12295) Dylan Jeffers
[df6c087] (account fix) Fix left nav not showing (#12292) JD Francis
[7d07905] [PE-6341] Fix remix contest track page displaying empty track lineup section (#12294) KJ
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@faridsalau@dharit-tan@dylanjeffers
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add a minimum and maximum value to Buy/Sell flow - #12323

Merged
faridsalau merged 4 commits into
mainfrom
fs-add-min-max
Jun 13, 2025
Merged

Add a minimum and maximum value to Buy/Sell flow#12323
faridsalau merged 4 commits into
mainfrom
fs-add-min-max

Conversation

@faridsalau

Copy link
Copy Markdown
Contributor

Description

This PR implements USD-based minimum and maximum constraints for token swaps and improves error handling across the buy/sell feature on both web and mobile platforms.

Changes

Core Implementation

  • USD-based limits: Added MIN_SWAP_AMOUNT_USD ($0.01) and MAX_SWAP_AMOUNT_USD ($10,000) constants that apply to all currencies
  • Dynamic limit calculation: Token-specific limits are now calculated based on current token prices and USD limits
  • Stablecoin handling: Direct USD mapping for stablecoins like USDC (1 token ≈ $1 USD)

Error Handling Improvements

  • Enhanced validation messages: Added insufficientBalance, minAmount, and maxAmount message functions to buySellMessages
  • Better error state management: Forms now properly handle empty input states without showing premature validation errors
  • Improved error propagation: Transaction data now includes error information that flows through to UI components

Form Validation Updates

  • Refined schema validation: Updated swapFormSchema to handle empty inputs gracefully during typing
  • Consolidated messaging: Moved validation messages to centralized buySellMessages for consistency
  • Enhanced form state: Added error field to transaction data type for better error tracking

Cross-platform Consistency

  • Unified error handling: Both web and mobile platforms now use the same error handling logic
  • Consistent validation: Same USD-based limits and validation rules apply across all platforms
  • Improved UX: Better error messaging that prioritizes specific validation errors over generic fallbacks

Technical Details

  • Token limits are calculated dynamically using calculateTokenLimits() function
  • Fallback limits (1-1,000,000) are used when token price data is unavailable
  • Error display logic prevents showing validation errors for empty fields during user input
  • All components updated to handle the new error field in transaction data

How Has This Been Tested?

npm run ios:prod and play around with entering values into input field

@changeset-bot

changeset-botBot commented Jun 13, 2025

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: 01e790b

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

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

)
.refine(
(val) => {
if (val === '') return false

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

do we really need the empty string check at every refine step?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

yea helps not show errors falsely when stuff is processing

if (onTransactionDataChange) {
const isValid = numericInputAmount > 0 && !errors.inputAmount
// Only report errors that should be shown to the user (not empty field errors)
const errorToReport = error // This already filters out empty field errors

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

this assign and assign back seems unnecessary

@dharit-tandharit-tan left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

imo too many ai comments, but logic seems good

@faridsalau
faridsalau merged commit cfd2741 into mainJun 13, 2025
@faridsalau
faridsalau deleted the fs-add-min-max branch June 13, 2025 18:14
audius-infra pushed a commit that referenced this pull request Jun 14, 2025
[8d4f0ca] [PE-6389] Explore screen refactor and performance (#12321) Dylan Jeffers
[02381bf] Add avoidable keyboard to buy/sell flow (#12328) Farid Salau
[31c1d5f] [PE-6338] Fix confetti (#12316) JD Francis
[f7e0aa1] [QA-2093] Fix comment history alignment and add full width prop on user links (#12326) KJ
[5997b15] More withdraw UI cleanup (#12327) Reed
[2045aa1] Fix listening history not showing items (#12322) JD Francis
[4876c94] [QA-2122] Fix track stats alignment by removing margin (#12325) KJ
[cefd8cf] [QA-2138] Remove max-width on playlist tiles for mobile web (#12324) KJ
[cdbca04] Mobile withdraw flow validation updates (#12317) Reed
[cfd2741] Add a minimum and maximum value to Buy/Sell flow (#12323) Farid Salau
[9573612] Stop error message flash on sell tab of Buy/Sell (#12310) Farid Salau
[21c1649] [PE-6337] Fix mobile sign out not working (#12318) JD Francis
[2042bb5] QA fixes for mobile explore: reseting search params and scroll + more (#12320) Isaac Solo
[4f19567] Refactor mobile left nav drawer to improve performance (#12314) Dylan Jeffers
[5ed2795] [PE-6375] Add loading state for brief sign in state (#12319) JD Francis
[7f20217] Fix text-link navigation to push (#12308) Dylan Jeffers
[c698239] Standardize query-collection options, fix refresh (#12307) Dylan Jeffers
[3294109] Add collapsing explore header animation (#12312) Isaac Solo
[8113778] Fix mobile profiles not loading (#12315) JD Francis
[c9d8b65] [PE-6224] Refactor mobile lineup-tiles for simplicity and performance (#12313) Dylan Jeffers
[2825a43] Improve feature flag performance (#12311) Dylan Jeffers
[f487fe5] Mobiles keyboard-avoiding withdraw drawer (#12306) Reed
[04ea576] [PE-6379] Fix refetching collection by permalink (#12304) Dylan Jeffers
[cc5d877] Fix missing track in upload complete screen (#12305) Dylan Jeffers
[e20aa89] Update remixes query page param calculation to account for original track in lineup (#12303) KJ
[a11c528] Fix negative limit (#12181) Farid Salau
[a4f5567] [PE-6345|PE-6351] Dep all users cache & almost all of entity cache (#12300) JD Francis
[ffba4c7] Fix mobile upload stuck at 100% (#12301) Dylan Jeffers
[1e42882] [PE-6245PE-6246] Fix mobile/web drawer behavior (#12297) Dylan Jeffers
[385c930] Fix mobile web track artwork loading (#12299) Dylan Jeffers
[d7a1778] Add remix contest card + minor fixes to mobile explore (#12298) Isaac Solo
[e692901] [PE-6335] Address mobile wallet UI M2 QA finds (#12296) Farid Salau
[8fae645] [PE-6181] Mobile withdraw flow (#12290) Reed
[eb91d5d] Fix library loading (#12288) Dylan Jeffers
[438384e] Fix remix contest section initial tab (#12295) Dylan Jeffers
[df6c087] (account fix) Fix left nav not showing (#12292) JD Francis
[7d07905] [PE-6341] Fix remix contest track page displaying empty track lineup section (#12294) KJ
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@faridsalau@dharit-tan@dylanjeffers
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Add a minimum and maximum value to Buy/Sell flow - #12323

Merged
faridsalau merged 4 commits into
mainfrom
fs-add-min-max
Jun 13, 2025
Merged

Add a minimum and maximum value to Buy/Sell flow#12323
faridsalau merged 4 commits into
mainfrom
fs-add-min-max

Conversation

@faridsalau

Copy link
Copy Markdown
Contributor

Description

This PR implements USD-based minimum and maximum constraints for token swaps and improves error handling across the buy/sell feature on both web and mobile platforms.

Changes

Core Implementation

  • USD-based limits: Added MIN_SWAP_AMOUNT_USD ($0.01) and MAX_SWAP_AMOUNT_USD ($10,000) constants that apply to all currencies
  • Dynamic limit calculation: Token-specific limits are now calculated based on current token prices and USD limits
  • Stablecoin handling: Direct USD mapping for stablecoins like USDC (1 token ≈ $1 USD)

Error Handling Improvements

  • Enhanced validation messages: Added insufficientBalance, minAmount, and maxAmount message functions to buySellMessages
  • Better error state management: Forms now properly handle empty input states without showing premature validation errors
  • Improved error propagation: Transaction data now includes error information that flows through to UI components

Form Validation Updates

  • Refined schema validation: Updated swapFormSchema to handle empty inputs gracefully during typing
  • Consolidated messaging: Moved validation messages to centralized buySellMessages for consistency
  • Enhanced form state: Added error field to transaction data type for better error tracking

Cross-platform Consistency

  • Unified error handling: Both web and mobile platforms now use the same error handling logic
  • Consistent validation: Same USD-based limits and validation rules apply across all platforms
  • Improved UX: Better error messaging that prioritizes specific validation errors over generic fallbacks

Technical Details

  • Token limits are calculated dynamically using calculateTokenLimits() function
  • Fallback limits (1-1,000,000) are used when token price data is unavailable
  • Error display logic prevents showing validation errors for empty fields during user input
  • All components updated to handle the new error field in transaction data

How Has This Been Tested?

npm run ios:prod and play around with entering values into input field

@changeset-bot

changeset-botBot commented Jun 13, 2025

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: 01e790b

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

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

)
.refine(
(val) => {
if (val === '') return false

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

do we really need the empty string check at every refine step?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

yea helps not show errors falsely when stuff is processing

if (onTransactionDataChange) {
const isValid = numericInputAmount > 0 && !errors.inputAmount
// Only report errors that should be shown to the user (not empty field errors)
const errorToReport = error // This already filters out empty field errors

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

this assign and assign back seems unnecessary

@dharit-tandharit-tan left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

imo too many ai comments, but logic seems good

@faridsalau
faridsalau merged commit cfd2741 into mainJun 13, 2025
@faridsalau
faridsalau deleted the fs-add-min-max branch June 13, 2025 18:14
audius-infra pushed a commit that referenced this pull request Jun 14, 2025
[8d4f0ca] [PE-6389] Explore screen refactor and performance (#12321) Dylan Jeffers
[02381bf] Add avoidable keyboard to buy/sell flow (#12328) Farid Salau
[31c1d5f] [PE-6338] Fix confetti (#12316) JD Francis
[f7e0aa1] [QA-2093] Fix comment history alignment and add full width prop on user links (#12326) KJ
[5997b15] More withdraw UI cleanup (#12327) Reed
[2045aa1] Fix listening history not showing items (#12322) JD Francis
[4876c94] [QA-2122] Fix track stats alignment by removing margin (#12325) KJ
[cefd8cf] [QA-2138] Remove max-width on playlist tiles for mobile web (#12324) KJ
[cdbca04] Mobile withdraw flow validation updates (#12317) Reed
[cfd2741] Add a minimum and maximum value to Buy/Sell flow (#12323) Farid Salau
[9573612] Stop error message flash on sell tab of Buy/Sell (#12310) Farid Salau
[21c1649] [PE-6337] Fix mobile sign out not working (#12318) JD Francis
[2042bb5] QA fixes for mobile explore: reseting search params and scroll + more (#12320) Isaac Solo
[4f19567] Refactor mobile left nav drawer to improve performance (#12314) Dylan Jeffers
[5ed2795] [PE-6375] Add loading state for brief sign in state (#12319) JD Francis
[7f20217] Fix text-link navigation to push (#12308) Dylan Jeffers
[c698239] Standardize query-collection options, fix refresh (#12307) Dylan Jeffers
[3294109] Add collapsing explore header animation (#12312) Isaac Solo
[8113778] Fix mobile profiles not loading (#12315) JD Francis
[c9d8b65] [PE-6224] Refactor mobile lineup-tiles for simplicity and performance (#12313) Dylan Jeffers
[2825a43] Improve feature flag performance (#12311) Dylan Jeffers
[f487fe5] Mobiles keyboard-avoiding withdraw drawer (#12306) Reed
[04ea576] [PE-6379] Fix refetching collection by permalink (#12304) Dylan Jeffers
[cc5d877] Fix missing track in upload complete screen (#12305) Dylan Jeffers
[e20aa89] Update remixes query page param calculation to account for original track in lineup (#12303) KJ
[a11c528] Fix negative limit (#12181) Farid Salau
[a4f5567] [PE-6345|PE-6351] Dep all users cache & almost all of entity cache (#12300) JD Francis
[ffba4c7] Fix mobile upload stuck at 100% (#12301) Dylan Jeffers
[1e42882] [PE-6245PE-6246] Fix mobile/web drawer behavior (#12297) Dylan Jeffers
[385c930] Fix mobile web track artwork loading (#12299) Dylan Jeffers
[d7a1778] Add remix contest card + minor fixes to mobile explore (#12298) Isaac Solo
[e692901] [PE-6335] Address mobile wallet UI M2 QA finds (#12296) Farid Salau
[8fae645] [PE-6181] Mobile withdraw flow (#12290) Reed
[eb91d5d] Fix library loading (#12288) Dylan Jeffers
[438384e] Fix remix contest section initial tab (#12295) Dylan Jeffers
[df6c087] (account fix) Fix left nav not showing (#12292) JD Francis
[7d07905] [PE-6341] Fix remix contest track page displaying empty track lineup section (#12294) KJ
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@faridsalau@dharit-tan@dylanjeffers
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add a minimum and maximum value to Buy/Sell flow - #12323

Merged
faridsalau merged 4 commits into
mainfrom
fs-add-min-max
Jun 13, 2025
Merged

Add a minimum and maximum value to Buy/Sell flow#12323
faridsalau merged 4 commits into
mainfrom
fs-add-min-max

Conversation

@faridsalau

Copy link
Copy Markdown
Contributor

Description

This PR implements USD-based minimum and maximum constraints for token swaps and improves error handling across the buy/sell feature on both web and mobile platforms.

Changes

Core Implementation

  • USD-based limits: Added MIN_SWAP_AMOUNT_USD ($0.01) and MAX_SWAP_AMOUNT_USD ($10,000) constants that apply to all currencies
  • Dynamic limit calculation: Token-specific limits are now calculated based on current token prices and USD limits
  • Stablecoin handling: Direct USD mapping for stablecoins like USDC (1 token ≈ $1 USD)

Error Handling Improvements

  • Enhanced validation messages: Added insufficientBalance, minAmount, and maxAmount message functions to buySellMessages
  • Better error state management: Forms now properly handle empty input states without showing premature validation errors
  • Improved error propagation: Transaction data now includes error information that flows through to UI components

Form Validation Updates

  • Refined schema validation: Updated swapFormSchema to handle empty inputs gracefully during typing
  • Consolidated messaging: Moved validation messages to centralized buySellMessages for consistency
  • Enhanced form state: Added error field to transaction data type for better error tracking

Cross-platform Consistency

  • Unified error handling: Both web and mobile platforms now use the same error handling logic
  • Consistent validation: Same USD-based limits and validation rules apply across all platforms
  • Improved UX: Better error messaging that prioritizes specific validation errors over generic fallbacks

Technical Details

  • Token limits are calculated dynamically using calculateTokenLimits() function
  • Fallback limits (1-1,000,000) are used when token price data is unavailable
  • Error display logic prevents showing validation errors for empty fields during user input
  • All components updated to handle the new error field in transaction data

How Has This Been Tested?

npm run ios:prod and play around with entering values into input field

@changeset-bot

changeset-botBot commented Jun 13, 2025

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: 01e790b

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

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

)
.refine(
(val) => {
if (val === '') return false

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

do we really need the empty string check at every refine step?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

yea helps not show errors falsely when stuff is processing

if (onTransactionDataChange) {
const isValid = numericInputAmount > 0 && !errors.inputAmount
// Only report errors that should be shown to the user (not empty field errors)
const errorToReport = error // This already filters out empty field errors

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

this assign and assign back seems unnecessary

@dharit-tandharit-tan left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

imo too many ai comments, but logic seems good

@faridsalau
faridsalau merged commit cfd2741 into mainJun 13, 2025
@faridsalau
faridsalau deleted the fs-add-min-max branch June 13, 2025 18:14
audius-infra pushed a commit that referenced this pull request Jun 14, 2025
[8d4f0ca] [PE-6389] Explore screen refactor and performance (#12321) Dylan Jeffers
[02381bf] Add avoidable keyboard to buy/sell flow (#12328) Farid Salau
[31c1d5f] [PE-6338] Fix confetti (#12316) JD Francis
[f7e0aa1] [QA-2093] Fix comment history alignment and add full width prop on user links (#12326) KJ
[5997b15] More withdraw UI cleanup (#12327) Reed
[2045aa1] Fix listening history not showing items (#12322) JD Francis
[4876c94] [QA-2122] Fix track stats alignment by removing margin (#12325) KJ
[cefd8cf] [QA-2138] Remove max-width on playlist tiles for mobile web (#12324) KJ
[cdbca04] Mobile withdraw flow validation updates (#12317) Reed
[cfd2741] Add a minimum and maximum value to Buy/Sell flow (#12323) Farid Salau
[9573612] Stop error message flash on sell tab of Buy/Sell (#12310) Farid Salau
[21c1649] [PE-6337] Fix mobile sign out not working (#12318) JD Francis
[2042bb5] QA fixes for mobile explore: reseting search params and scroll + more (#12320) Isaac Solo
[4f19567] Refactor mobile left nav drawer to improve performance (#12314) Dylan Jeffers
[5ed2795] [PE-6375] Add loading state for brief sign in state (#12319) JD Francis
[7f20217] Fix text-link navigation to push (#12308) Dylan Jeffers
[c698239] Standardize query-collection options, fix refresh (#12307) Dylan Jeffers
[3294109] Add collapsing explore header animation (#12312) Isaac Solo
[8113778] Fix mobile profiles not loading (#12315) JD Francis
[c9d8b65] [PE-6224] Refactor mobile lineup-tiles for simplicity and performance (#12313) Dylan Jeffers
[2825a43] Improve feature flag performance (#12311) Dylan Jeffers
[f487fe5] Mobiles keyboard-avoiding withdraw drawer (#12306) Reed
[04ea576] [PE-6379] Fix refetching collection by permalink (#12304) Dylan Jeffers
[cc5d877] Fix missing track in upload complete screen (#12305) Dylan Jeffers
[e20aa89] Update remixes query page param calculation to account for original track in lineup (#12303) KJ
[a11c528] Fix negative limit (#12181) Farid Salau
[a4f5567] [PE-6345|PE-6351] Dep all users cache & almost all of entity cache (#12300) JD Francis
[ffba4c7] Fix mobile upload stuck at 100% (#12301) Dylan Jeffers
[1e42882] [PE-6245PE-6246] Fix mobile/web drawer behavior (#12297) Dylan Jeffers
[385c930] Fix mobile web track artwork loading (#12299) Dylan Jeffers
[d7a1778] Add remix contest card + minor fixes to mobile explore (#12298) Isaac Solo
[e692901] [PE-6335] Address mobile wallet UI M2 QA finds (#12296) Farid Salau
[8fae645] [PE-6181] Mobile withdraw flow (#12290) Reed
[eb91d5d] Fix library loading (#12288) Dylan Jeffers
[438384e] Fix remix contest section initial tab (#12295) Dylan Jeffers
[df6c087] (account fix) Fix left nav not showing (#12292) JD Francis
[7d07905] [PE-6341] Fix remix contest track page displaying empty track lineup section (#12294) KJ
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@faridsalau@dharit-tan@dylanjeffers
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add a minimum and maximum value to Buy/Sell flow - #12323

Merged
faridsalau merged 4 commits into
mainfrom
fs-add-min-max
Jun 13, 2025
Merged

Add a minimum and maximum value to Buy/Sell flow#12323
faridsalau merged 4 commits into
mainfrom
fs-add-min-max

Conversation

@faridsalau

Copy link
Copy Markdown
Contributor

Description

This PR implements USD-based minimum and maximum constraints for token swaps and improves error handling across the buy/sell feature on both web and mobile platforms.

Changes

Core Implementation

  • USD-based limits: Added MIN_SWAP_AMOUNT_USD ($0.01) and MAX_SWAP_AMOUNT_USD ($10,000) constants that apply to all currencies
  • Dynamic limit calculation: Token-specific limits are now calculated based on current token prices and USD limits
  • Stablecoin handling: Direct USD mapping for stablecoins like USDC (1 token ≈ $1 USD)

Error Handling Improvements

  • Enhanced validation messages: Added insufficientBalance, minAmount, and maxAmount message functions to buySellMessages
  • Better error state management: Forms now properly handle empty input states without showing premature validation errors
  • Improved error propagation: Transaction data now includes error information that flows through to UI components

Form Validation Updates

  • Refined schema validation: Updated swapFormSchema to handle empty inputs gracefully during typing
  • Consolidated messaging: Moved validation messages to centralized buySellMessages for consistency
  • Enhanced form state: Added error field to transaction data type for better error tracking

Cross-platform Consistency

  • Unified error handling: Both web and mobile platforms now use the same error handling logic
  • Consistent validation: Same USD-based limits and validation rules apply across all platforms
  • Improved UX: Better error messaging that prioritizes specific validation errors over generic fallbacks

Technical Details

  • Token limits are calculated dynamically using calculateTokenLimits() function
  • Fallback limits (1-1,000,000) are used when token price data is unavailable
  • Error display logic prevents showing validation errors for empty fields during user input
  • All components updated to handle the new error field in transaction data

How Has This Been Tested?

npm run ios:prod and play around with entering values into input field

@changeset-bot

changeset-botBot commented Jun 13, 2025

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: 01e790b

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

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

)
.refine(
(val) => {
if (val === '') return false

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

do we really need the empty string check at every refine step?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

yea helps not show errors falsely when stuff is processing

if (onTransactionDataChange) {
const isValid = numericInputAmount > 0 && !errors.inputAmount
// Only report errors that should be shown to the user (not empty field errors)
const errorToReport = error // This already filters out empty field errors

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

this assign and assign back seems unnecessary

@dharit-tandharit-tan left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

imo too many ai comments, but logic seems good

@faridsalau
faridsalau merged commit cfd2741 into mainJun 13, 2025
@faridsalau
faridsalau deleted the fs-add-min-max branch June 13, 2025 18:14
audius-infra pushed a commit that referenced this pull request Jun 14, 2025
[8d4f0ca] [PE-6389] Explore screen refactor and performance (#12321) Dylan Jeffers
[02381bf] Add avoidable keyboard to buy/sell flow (#12328) Farid Salau
[31c1d5f] [PE-6338] Fix confetti (#12316) JD Francis
[f7e0aa1] [QA-2093] Fix comment history alignment and add full width prop on user links (#12326) KJ
[5997b15] More withdraw UI cleanup (#12327) Reed
[2045aa1] Fix listening history not showing items (#12322) JD Francis
[4876c94] [QA-2122] Fix track stats alignment by removing margin (#12325) KJ
[cefd8cf] [QA-2138] Remove max-width on playlist tiles for mobile web (#12324) KJ
[cdbca04] Mobile withdraw flow validation updates (#12317) Reed
[cfd2741] Add a minimum and maximum value to Buy/Sell flow (#12323) Farid Salau
[9573612] Stop error message flash on sell tab of Buy/Sell (#12310) Farid Salau
[21c1649] [PE-6337] Fix mobile sign out not working (#12318) JD Francis
[2042bb5] QA fixes for mobile explore: reseting search params and scroll + more (#12320) Isaac Solo
[4f19567] Refactor mobile left nav drawer to improve performance (#12314) Dylan Jeffers
[5ed2795] [PE-6375] Add loading state for brief sign in state (#12319) JD Francis
[7f20217] Fix text-link navigation to push (#12308) Dylan Jeffers
[c698239] Standardize query-collection options, fix refresh (#12307) Dylan Jeffers
[3294109] Add collapsing explore header animation (#12312) Isaac Solo
[8113778] Fix mobile profiles not loading (#12315) JD Francis
[c9d8b65] [PE-6224] Refactor mobile lineup-tiles for simplicity and performance (#12313) Dylan Jeffers
[2825a43] Improve feature flag performance (#12311) Dylan Jeffers
[f487fe5] Mobiles keyboard-avoiding withdraw drawer (#12306) Reed
[04ea576] [PE-6379] Fix refetching collection by permalink (#12304) Dylan Jeffers
[cc5d877] Fix missing track in upload complete screen (#12305) Dylan Jeffers
[e20aa89] Update remixes query page param calculation to account for original track in lineup (#12303) KJ
[a11c528] Fix negative limit (#12181) Farid Salau
[a4f5567] [PE-6345|PE-6351] Dep all users cache & almost all of entity cache (#12300) JD Francis
[ffba4c7] Fix mobile upload stuck at 100% (#12301) Dylan Jeffers
[1e42882] [PE-6245PE-6246] Fix mobile/web drawer behavior (#12297) Dylan Jeffers
[385c930] Fix mobile web track artwork loading (#12299) Dylan Jeffers
[d7a1778] Add remix contest card + minor fixes to mobile explore (#12298) Isaac Solo
[e692901] [PE-6335] Address mobile wallet UI M2 QA finds (#12296) Farid Salau
[8fae645] [PE-6181] Mobile withdraw flow (#12290) Reed
[eb91d5d] Fix library loading (#12288) Dylan Jeffers
[438384e] Fix remix contest section initial tab (#12295) Dylan Jeffers
[df6c087] (account fix) Fix left nav not showing (#12292) JD Francis
[7d07905] [PE-6341] Fix remix contest track page displaying empty track lineup section (#12294) KJ
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@faridsalau@dharit-tan@dylanjeffers
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Add a minimum and maximum value to Buy/Sell flow - #12323

Merged
faridsalau merged 4 commits into
mainfrom
fs-add-min-max
Jun 13, 2025
Merged

Add a minimum and maximum value to Buy/Sell flow#12323
faridsalau merged 4 commits into
mainfrom
fs-add-min-max

Conversation

@faridsalau

Copy link
Copy Markdown
Contributor

Description

This PR implements USD-based minimum and maximum constraints for token swaps and improves error handling across the buy/sell feature on both web and mobile platforms.

Changes

Core Implementation

  • USD-based limits: Added MIN_SWAP_AMOUNT_USD ($0.01) and MAX_SWAP_AMOUNT_USD ($10,000) constants that apply to all currencies
  • Dynamic limit calculation: Token-specific limits are now calculated based on current token prices and USD limits
  • Stablecoin handling: Direct USD mapping for stablecoins like USDC (1 token ≈ $1 USD)

Error Handling Improvements

  • Enhanced validation messages: Added insufficientBalance, minAmount, and maxAmount message functions to buySellMessages
  • Better error state management: Forms now properly handle empty input states without showing premature validation errors
  • Improved error propagation: Transaction data now includes error information that flows through to UI components

Form Validation Updates

  • Refined schema validation: Updated swapFormSchema to handle empty inputs gracefully during typing
  • Consolidated messaging: Moved validation messages to centralized buySellMessages for consistency
  • Enhanced form state: Added error field to transaction data type for better error tracking

Cross-platform Consistency

  • Unified error handling: Both web and mobile platforms now use the same error handling logic
  • Consistent validation: Same USD-based limits and validation rules apply across all platforms
  • Improved UX: Better error messaging that prioritizes specific validation errors over generic fallbacks

Technical Details

  • Token limits are calculated dynamically using calculateTokenLimits() function
  • Fallback limits (1-1,000,000) are used when token price data is unavailable
  • Error display logic prevents showing validation errors for empty fields during user input
  • All components updated to handle the new error field in transaction data

How Has This Been Tested?

npm run ios:prod and play around with entering values into input field

@changeset-bot

changeset-botBot commented Jun 13, 2025

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: 01e790b

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

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

)
.refine(
(val) => {
if (val === '') return false

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

do we really need the empty string check at every refine step?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

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

yea helps not show errors falsely when stuff is processing

if (onTransactionDataChange) {
const isValid = numericInputAmount > 0 && !errors.inputAmount
// Only report errors that should be shown to the user (not empty field errors)
const errorToReport = error // This already filters out empty field errors

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

this assign and assign back seems unnecessary

@dharit-tandharit-tan left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

imo too many ai comments, but logic seems good

@faridsalau
faridsalau merged commit cfd2741 into mainJun 13, 2025
@faridsalau
faridsalau deleted the fs-add-min-max branch June 13, 2025 18:14
audius-infra pushed a commit that referenced this pull request Jun 14, 2025
[8d4f0ca] [PE-6389] Explore screen refactor and performance (#12321) Dylan Jeffers
[02381bf] Add avoidable keyboard to buy/sell flow (#12328) Farid Salau
[31c1d5f] [PE-6338] Fix confetti (#12316) JD Francis
[f7e0aa1] [QA-2093] Fix comment history alignment and add full width prop on user links (#12326) KJ
[5997b15] More withdraw UI cleanup (#12327) Reed
[2045aa1] Fix listening history not showing items (#12322) JD Francis
[4876c94] [QA-2122] Fix track stats alignment by removing margin (#12325) KJ
[cefd8cf] [QA-2138] Remove max-width on playlist tiles for mobile web (#12324) KJ
[cdbca04] Mobile withdraw flow validation updates (#12317) Reed
[cfd2741] Add a minimum and maximum value to Buy/Sell flow (#12323) Farid Salau
[9573612] Stop error message flash on sell tab of Buy/Sell (#12310) Farid Salau
[21c1649] [PE-6337] Fix mobile sign out not working (#12318) JD Francis
[2042bb5] QA fixes for mobile explore: reseting search params and scroll + more (#12320) Isaac Solo
[4f19567] Refactor mobile left nav drawer to improve performance (#12314) Dylan Jeffers
[5ed2795] [PE-6375] Add loading state for brief sign in state (#12319) JD Francis
[7f20217] Fix text-link navigation to push (#12308) Dylan Jeffers
[c698239] Standardize query-collection options, fix refresh (#12307) Dylan Jeffers
[3294109] Add collapsing explore header animation (#12312) Isaac Solo
[8113778] Fix mobile profiles not loading (#12315) JD Francis
[c9d8b65] [PE-6224] Refactor mobile lineup-tiles for simplicity and performance (#12313) Dylan Jeffers
[2825a43] Improve feature flag performance (#12311) Dylan Jeffers
[f487fe5] Mobiles keyboard-avoiding withdraw drawer (#12306) Reed
[04ea576] [PE-6379] Fix refetching collection by permalink (#12304) Dylan Jeffers
[cc5d877] Fix missing track in upload complete screen (#12305) Dylan Jeffers
[e20aa89] Update remixes query page param calculation to account for original track in lineup (#12303) KJ
[a11c528] Fix negative limit (#12181) Farid Salau
[a4f5567] [PE-6345|PE-6351] Dep all users cache & almost all of entity cache (#12300) JD Francis
[ffba4c7] Fix mobile upload stuck at 100% (#12301) Dylan Jeffers
[1e42882] [PE-6245PE-6246] Fix mobile/web drawer behavior (#12297) Dylan Jeffers
[385c930] Fix mobile web track artwork loading (#12299) Dylan Jeffers
[d7a1778] Add remix contest card + minor fixes to mobile explore (#12298) Isaac Solo
[e692901] [PE-6335] Address mobile wallet UI M2 QA finds (#12296) Farid Salau
[8fae645] [PE-6181] Mobile withdraw flow (#12290) Reed
[eb91d5d] Fix library loading (#12288) Dylan Jeffers
[438384e] Fix remix contest section initial tab (#12295) Dylan Jeffers
[df6c087] (account fix) Fix left nav not showing (#12292) JD Francis
[7d07905] [PE-6341] Fix remix contest track page displaying empty track lineup section (#12294) KJ
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@faridsalau@dharit-tan@dylanjeffers