-
-
Notifications
You must be signed in to change notification settings - Fork 33
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merge main into develop #4709
Merge main into develop #4709
Conversation
Next Release Sep 2024
hotfix: givbacks toast button width
The latest updates on your projects. Learn more about Vercel for Git ↗︎
|
WalkthroughThe pull request introduces various changes across multiple files, focusing on enhancing the donation process and user experience. Key updates include the addition of new variables and functionalities in the Changes
Possibly related PRs
Poem
📜 Recent review detailsConfiguration used: CodeRabbit UI 📒 Files selected for processing (2)
🚧 Files skipped from review as they are similar to previous changes (2)
Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media? 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
…ng-donation hotifx: prevent projects with Endaoment label from showing recurring donation view
Updating GIV-palooza QF banner
…efault HOTFIX: Comment-out-recurring-donation-default
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM ;) , thx @Meriem-BM
Hotifx: adding gnosis safe back to connectors
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 1
Outside diff range and nitpick comments (6)
src/components/views/nft/overview/CheckEligibility.tsx (1)
22-23
: LGTM: Constant declaration is correct. Consider adding a comment.The new constant declaration for
PFP_ABI
is correct and improves type safety.Consider adding a brief comment explaining the purpose of this constant, e.g.:
// ABI for the PFP (Profile Picture) smart contract const PFP_ABI = PFP_ARTIFACTS.abi as Abi;src/components/modals/Mint/MintModal.tsx (2)
22-22
: LGTM: Import ofPFP_ARTIFACTS
The addition of this import is appropriate and aligns with the changes described in the AI summary. It brings in the ABI for the PFP smart contract, which will be used to define the
PFP_ABI
constant.Consider using a more descriptive name for the imported artifact, such as
PFP_CONTRACT_ARTIFACTS
, to make it immediately clear what these artifacts represent.
34-34
: LGTM: Definition ofPFP_ABI
constantThe addition of this constant is appropriate and aligns with the changes described in the AI summary. It correctly uses the imported
PFP_ARTIFACTS
andAbi
type to define the ABI for the PFP contract.For consistency with TypeScript best practices, consider using a type annotation instead of a type assertion:
const PFP_ABI: Abi = PFP_ARTIFACTS.abi;This approach is generally preferred as it allows TypeScript to check the assignment rather than forcing the type.
next.config.js (1)
Line range hint
1-185
: Summary of changes and potential impactThe changes in this file primarily involve simplifying the Next.js configuration:
- Removal of unused imports (
pjson
).- Removal of environment-specific redirect logic.
- Removal of the
isProduction
variable.These changes appear to be part of a cleanup effort, which is generally positive for code maintenance. However, they may have implications for how the application behaves in different environments, particularly regarding redirects.
To ensure these changes don't introduce unexpected behavior:
- Verify that the simplified redirect logic meets the requirements for all environments.
- Confirm that the removal of
pjson
andisProduction
doesn't affect any other parts of the application.- Consider updating documentation or comments to explain the rationale behind these changes, especially if they represent a shift in how environment-specific behavior is managed.
src/apollo/apolloClient.ts (1)
Line range hint
97-156
: Summary: Improved Apollo Client setup with optimized link compositionThe changes in this file focus on refactoring the Apollo Client setup, particularly in the link composition. The improvements include:
- Removal of unnecessary type assertion in
httpLink
creation.- Use of
ApolloLink.from
for cleaner link composition.- Consistent update in the Apollo Client configuration.
These changes enhance code readability and follow best practices for Apollo Client setup. While the current implementation is solid, consider the following suggestions for future improvements:
- Enhance error handling: You could add more specific error handling logic in the
errorLink
to handle different types of GraphQL errors more granularly.- Improve retry logic: Consider customizing the
RetryLink
configuration to better suit your application's needs, such as adjusting retry attempts or adding custom retry conditions.- Performance optimization: Evaluate if implementing Apollo Client's
persistCache
feature could benefit your application by reducing unnecessary network requests.src/components/cards/MintCard.tsx (1)
29-29
: LGTM: PFP_ABI constant declarationThe declaration of
PFP_ABI
correctly extracts the ABI from the imported artifacts and applies the necessary type assertion. This approach enhances type safety and improves IDE support for contract interactions.Consider adding a comment explaining the purpose of this constant, e.g.:
// ABI for the PFP (Profile Picture) smart contract const PFP_ABI = PFP_ARTIFACTS.abi as Abi;
Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Files selected for processing (6)
- next.config.js (1 hunks)
- pages/landings/ethdenver.tsx (1 hunks)
- src/apollo/apolloClient.ts (2 hunks)
- src/components/cards/MintCard.tsx (3 hunks)
- src/components/modals/Mint/MintModal.tsx (2 hunks)
- src/components/views/nft/overview/CheckEligibility.tsx (1 hunks)
Additional comments not posted (16)
pages/landings/ethdenver.tsx (2)
Line range hint
1-48
: Ensure consistency in campaign data removalThe changes in this file appear to be part of a larger update to remove or disable the ETHDenver campaign functionality. However, the modifications are incomplete, leading to inconsistencies in the code.
Summary of findings:
- Campaign data fetching has been disabled in
getStaticProps
.- The component structure (
EthDenverRoute
andIEthDenverProps
) still expects and uses acampaign
prop.- The
EthDenverView
component is still being passed acampaign
prop that will always be undefined.To ensure consistency and prevent potential issues, consider the following next steps:
- Decide on the intended functionality: Is the ETHDenver campaign being permanently removed or temporarily disabled?
- If it's being removed:
- Remove all references to the
campaign
prop throughout the file.- Update the
EthDenverView
component to not expect acampaign
prop.- Remove any campaign-related logic from the view component.
- If it's being temporarily disabled:
- Add a comment explaining why the campaign is inactive and when it might be re-enabled.
- Consider adding a feature flag to easily re-enable the campaign fetching when needed.
- Update any tests related to this component to reflect the changes.
- Review other parts of the application that might be affected by the removal of the campaign data.
To ensure no other parts of the application are affected, run the following command:
#!/bin/bash # Description: Find other usages of the ETHDenver campaign # Test: Search for references to the ETHDenver campaign across the codebase rg --type typescript --type javascript 'ethDenver|ETHDenver'This will help identify any other components or files that might need to be updated as a result of these changes.
Line range hint
11-19
: Update component to reflect the absence of campaign dataThe
EthDenverRoute
component and its props interface haven't been updated to reflect the changes ingetStaticProps
:
- The
IEthDenverProps
interface still includes thecampaign
prop.- The component still destructures the
campaign
prop and passes it toEthDenverView
.Consider the following changes:
- Remove the
campaign
prop from theIEthDenverProps
interface.- Update the
EthDenverRoute
component to not expect or pass thecampaign
prop.Here's a suggested diff:
-export interface IEthDenverProps { - campaign?: ICampaign; -} +export interface IEthDenverProps {} -const EthDenverRoute: FC<IEthDenverProps> = ({ campaign }) => { +const EthDenverRoute: FC<IEthDenverProps> = () => { return ( <> <Head> <title>ETHDenver</title> </Head> - <EthDenverView campaign={campaign} /> + <EthDenverView /> </> ); };Let's verify if the
EthDenverView
component can handle not receiving a campaign prop:#!/bin/bash # Description: Check how EthDenverView handles the absence of a campaign prop # Test: Search for conditional rendering or default prop values in EthDenverView ast-grep --lang typescript --pattern 'const EthDenverView = ({ campaign }: { campaign?: ICampaign }) => { $$$ campaign $$$ }'src/components/views/nft/overview/CheckEligibility.tsx (3)
14-14
: LGTM: Import changes are appropriate.The new imports of
Abi
from 'viem' andPFP_ARTIFACTS
from the local JSON file are correct and necessary for the subsequent changes in the file.Also applies to: 16-16
Line range hint
52-52
: Verified: Correct usage of PFP_ABI in the component.The
PFP_ABI
constant is correctly used in thecheckAddress
function. The changes in the import and declaration ofPFP_ABI
do not affect its usage in the component, maintaining the existing functionality.
14-23
: Summary: Changes improve type safety without affecting functionality.The modifications in this file enhance type safety and clarity in importing and using the PFP ABI. The changes are minimal and don't alter the overall functionality of the
CheckEligibility
component. The new constant declaration and import statements are correctly implemented and used within the component.src/components/modals/Mint/MintModal.tsx (2)
13-13
: LGTM: Import ofAbi
from 'viem'The addition of this import is appropriate and aligns with the changes described in the AI summary. It suggests that the code will be using the
Abi
type from the 'viem' library, which is likely related to the new constant definition mentioned in the summary.
Line range hint
13-34
: Summary: Refactoring of ABI handlingThe changes in this file represent a refactoring of how the PFP (Profile Picture) contract's ABI is imported and used. This refactoring:
- Imports the
Abi
type from 'viem' for improved type safety.- Imports the PFP contract artifacts from a local JSON file.
- Defines a new constant
PFP_ABI
using the imported artifacts.These changes likely improve the maintainability and type safety of the code. The use of a structured import for the ABI, rather than a direct import, allows for better organization and potential future scalability.
While the changes are generally good, consider the minor suggestions in the previous comments for further improvements.
next.config.js (3)
11-11
: Approve removal ofisProduction
, but verify its usage.The removal of the
isProduction
variable is consistent with the changes in theredirects
function. This simplifies the configuration logic.Run the following script to verify that
isProduction
is not used elsewhere in the project:#!/bin/bash # Description: Check for any remaining usage of 'isProduction' in the project # Test: Search for 'isProduction' in all JavaScript and TypeScript files rg --type-add 'frontend:*.{js,ts,jsx,tsx}' --type frontend 'isProduction'If this script returns any results, please review those occurrences to ensure they are not affected by this change.
Line range hint
93-112
: Clarify the intent behind removing environment-specific redirects.The production-specific redirects have been commented out, and now '/qf' always redirects to '/qf/all'. This change simplifies the logic but may affect the application's behavior across different environments.
Please clarify:
- Is this change intentional?
- Are there any implications for the production environment?
- Should we keep the commented-out code for future reference, or can it be safely removed?
To verify the current redirect configuration, you can run:
#!/bin/bash # Description: Check the current redirect configuration # Test: Display the redirects configuration rg --type javascript 'redirects.*=.*\[' -A 20 next.config.jsThis will show the current redirect setup, allowing us to confirm that it matches the intended behavior.
11-11
: Approve removal of unused import, but verify its usage.The removal of the unused
pjson
import improves code cleanliness. However, it's important to ensure that this variable is not used elsewhere in the project.Run the following script to verify that
pjson
is not used elsewhere in the project:If this script returns any results, please review those occurrences to ensure they are not affected by this change.
Verification successful
Removal of
pjson
import verified as unused. No further action required.Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash # Description: Check for any remaining usage of 'pjson' in the project # Test: Search for 'pjson' in all JavaScript and TypeScript files rg --type-add 'frontend:*.{js,ts,jsx,tsx}' --type frontend 'pjson'Length of output: 232
Script:
#!/bin/bash # Description: Check for any remaining usage of 'pjson' in JavaScript and TypeScript files # Add 'frontend' type encompassing JavaScript and TypeScript file extensions rg --type-add 'frontend:*.{js,ts,jsx,tsx}' --type frontend 'pjson'Length of output: 66
Script:
#!/bin/bash # Description: Verify absence of 'pjson' usage across all JavaScript and TypeScript files # Search for 'pjson' in all JavaScript and TypeScript files without type restrictions rg 'pjson' --glob '*.{js,ts,jsx,tsx}'Length of output: 37
src/apollo/apolloClient.ts (3)
97-97
: LGTM: Improved type safety inhttpLink
creationThe removal of the type assertion
as ApolloLink
is a positive change. It suggests that thecreateUploadLink
function now returns a type that is compatible with the expectedApolloLink
type. This improvement enhances type safety by relying on the correct return type ofcreateUploadLink
.
151-152
: Great refactoring of link compositionThe use of
ApolloLink.from
to combine all links is an excellent improvement. This approach:
- Simplifies the link composition, making it more readable and maintainable.
- Follows the recommended practice for combining multiple links, including terminating links like
httpLink
.- Maintains the correct order of links: error handling, authentication, retry, and then the main HTTP link.
This refactoring enhances the overall structure and clarity of the Apollo Client setup.
156-156
: LGTM: Consistent update in Apollo Client configurationThe update to the
link
property in the ApolloClient configuration is correct and consistent with the earlier refactoring of link composition. It properly applies the combined link created usingApolloLink.from
to the Apollo Client setup.src/components/cards/MintCard.tsx (3)
21-21
: LGTM: Import PFP contract ABIThe import of the PFP contract ABI from a local JSON file is correct and follows good practices for managing contract ABIs in a React project.
76-76
: LGTM: Updated ABI usage in contract interactionsThe changes in ABI usage within the component correctly reflect the new way of importing and using the PFP contract ABI. The removal of redundant
as Abi
type assertions improves code readability and maintains type safety.Also applies to: 126-126
Line range hint
1-385
: Overall assessment: Improvements in ABI management and usageThe changes in this file enhance the management and usage of the PFP contract ABI. The new import statement, constant declaration, and updated ABI references improve code organization, type safety, and readability. These modifications align with best practices for handling smart contract ABIs in a React application.
//The campaign in not active | ||
// const { data } = await client.query({ | ||
// query: FETCH_CAMPAIGN_BY_SLUG, | ||
// variables: { | ||
// slug: 'ethDenver', | ||
// }, | ||
// fetchPolicy: 'no-cache', | ||
// }); | ||
// return { | ||
// props: { | ||
// campaign: data.findCampaignBySlug, | ||
// }, | ||
// revalidate: 600, | ||
// }; | ||
return { | ||
props: { | ||
campaign: data.findCampaignBySlug, | ||
}, | ||
revalidate: 600, | ||
props: {}, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Tip
Codebase Verification
Issues Identified with Campaign Data Fetching
The campaign
prop is still being passed to the EthDenverView
component despite disabling its data fetching:
- In
pages/landings/ethdenver.tsx
,<EthDenverView campaign={campaign} />
is called, butcampaign
is no longer provided ingetStaticProps
. - This may lead to
EthDenverView
receiving an undefined or emptycampaign
prop, potentially causing rendering issues.
Recommended Actions:
- Update
EthDenverView
Component:- Ensure it can handle cases where the
campaign
prop is absent or null.
- Ensure it can handle cases where the
- Modify
IEthDenverProps
Interface:- Remove the
campaign
prop if it's no longer used.
- Remove the
- Align
getStaticProps
:- Consistently handle the
revalidate
property in both success and error cases.
- Consistently handle the
Analysis chain
Review the implications of disabling campaign data fetching
The changes in the getStaticProps
function have several implications:
- The campaign data fetching has been disabled, as indicated by the comment "The campaign is not active".
- The function now returns an empty
props
object, which may affect the rendering of theEthDenverView
component. - The revalidation period has been removed from the successful case but remains in the error case.
Consider the following actions:
- Update the
EthDenverRoute
component to handle the case where no campaign data is provided. - Review the
EthDenverView
component to ensure it can handle anull
orundefined
campaign prop. - Consider removing the
campaign
prop from theIEthDenverProps
interface if it's no longer used. - Align the error case with the success case by removing the
revalidate
property or add it back to the success case for consistency.
To verify the impact of these changes, let's analyze the EthDenverView
component:
Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Check the usage of the campaign prop in EthDenverView
# Test: Search for the EthDenverView component definition and its usage of the campaign prop
ast-grep --lang typescript --pattern 'const EthDenverView = ({ campaign }: { campaign?: ICampaign }) => { $$$ }'
Length of output: 127
Script:
#!/bin/bash
# Description: Search for all usages of the campaign prop within EthDenverView component
rg 'EthDenverView.*campaign' --glob '*.tsx'
Length of output: 228
Script:
#!/bin/bash
# Description: Find all instances where EthDenverView is used and check if campaign prop is passed
rg 'EthDenverView' --glob '*.tsx' | xargs -I {} sh -c "echo {}; rg 'campaign' {}"
Length of output: 235
Script:
#!/bin/bash
# Description: Search for all instances where EthDenverView is used with the campaign prop
rg '<EthDenverView[^>]*campaign=' --glob '*.tsx'
Length of output: 120
Script:
#!/bin/bash
# Description: Find all lines in .tsx files where EthDenverView is used and campaign prop is passed
fd -e tsx | xargs grep '<EthDenverView[^>]*campaign='
Length of output: 125
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM ;) , thx @MohammadPCh
update translation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 0
Outside diff range and nitpick comments (1)
lang/es.json (1)
203-203
: Translation added correctly, but key contains a typoThe new translation for the warning about memos is accurate and informative. However, there's a minor typo in the key:
"label.be_careful_some_exchanges": "¡Ten cuidado! Algunos intercambios y billeteras requieren Memo para financiar tu cuenta. Asegúrate de ingresarlo en el formulario si tu billetera admite un memo.",
The key should be "be_careful" instead of "be_carefull".
Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Files selected for processing (3)
- lang/ca.json (41 hunks)
- lang/en.json (51 hunks)
- lang/es.json (42 hunks)
Files skipped from review as they are similar to previous changes (2)
- lang/ca.json
- lang/en.json
Additional comments not posted (4)
lang/es.json (4)
110-110
: New translation added correctlyThe new translation for "error.enter_amount" has been added appropriately. It provides a clear error message in Spanish, consistent with the key's meaning.
136-136
: Appropriate translation addedThe new translation for "label.add_more_info" has been added correctly. It accurately conveys the meaning of "Add more information" in Spanish, maintaining consistency with the application's style.
238-239
: Correct translations added for singular and plural formsThe new translations for "label.check_donation" and "label.check_donations" have been added correctly. They accurately convey the meaning in Spanish, maintaining consistency in terminology and correctly handling the singular and plural forms.
286-286
: Clear and accurate translation addedThe new translation for "label.copy_the_mnemo_to_use_in_your_app" has been added correctly. It provides a clear instruction in Spanish, accurately conveying the meaning of copying the mnemonic for use in a wallet application. The translation is consistent with the application's terminology and style.
Feat/update fetching token balance
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 5
Outside diff range and nitpick comments (1)
src/components/views/donate/OnTime/SelectTokenModal/SelectTokenModal.tsx (1)
Line range hint
243-256
: Improve user feedback when wallet is not connectedWhen the wallet is not connected, the message "No token supported on this chain" is displayed, which might confuse the user. Consider prompting the user to connect their wallet instead.
Apply this diff to improve user feedback:
) : sortedTokens.length > 0 && isConnected ? ( sortedTokens.map(({ token, balance }: ITokenBalance) => ( <TokenInfo key={token.symbol} token={token} hideZeroBalance={hideZeroBalance} balance={balance} onClick={() => { setSelectedOneTimeToken(token); setShowModal(false); }} /> )) + ) : !isConnected ? ( + <div>Please connect your wallet to view tokens.</div> ) : ( <div>No token supported on this chain</div> )}
Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Files selected for processing (2)
- src/components/views/donate/OnTime/SelectTokenModal/SelectTokenModal.tsx (4 hunks)
- src/services/token.ts (3 hunks)
Additional comments not posted (2)
src/components/views/donate/OnTime/SelectTokenModal/SelectTokenModal.tsx (2)
28-29
: Import statements added correctlyThe imports for
getBalanceForToken
andfetchTokenBalances
have been added appropriately and point to the correct modules.
85-86
: Destructured variables initialized properlyThe variables
walletAddress
,isOnEVM
, andisConnected
are correctly obtained fromuseGeneralWallet()
, andevmChain
is destructured fromuseAccount()
as expected.
const erc20Balances = erc20Results.map((result, index) => ({ | ||
token: erc20Tokens[index], | ||
balance: (result?.result as bigint) || 0n, | ||
})); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Handle failed multicall results safely
When using multicall
with allowFailure: true
, some calls may fail and result in undefined
or null
entries in erc20Results
. In the current mapping, accessing result?.result
without checking if result
exists can lead to unexpected behavior. Ensure that you safely handle failed calls to prevent runtime errors.
Consider updating the mapping as follows:
-const erc20Balances = erc20Results.map((result, index) => ({
- token: erc20Tokens[index],
- balance: (result?.result as bigint) || 0n,
-}));
+const erc20Balances = erc20Results.map((result, index) => {
+ const balance = result && result.result ? (result.result as bigint) : 0n;
+ return {
+ token: erc20Tokens[index],
+ balance,
+ };
+});
This change ensures that if a call fails, the balance defaults to 0n
, and avoids accessing properties on undefined
.
Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
const erc20Balances = erc20Results.map((result, index) => ({ | |
token: erc20Tokens[index], | |
balance: (result?.result as bigint) || 0n, | |
})); | |
const erc20Balances = erc20Results.map((result, index) => { | |
const balance = result && result.result ? (result.result as bigint) : 0n; | |
return { | |
token: erc20Tokens[index], | |
balance, | |
}; | |
}); |
console.error('Error fetching token balances:', error); | ||
|
||
// Return undefined balances in case of failure | ||
return tokens.map(token => ({ token, balance: undefined })); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Use consistent error handling with Sentry
In the catch
block, the error is logged to the console using console.error
. For consistency with other functions in this file that use Sentry for error tracking, consider using captureException
to log errors. This ensures that all exceptions are properly captured and monitored.
Apply the following change:
- console.error('Error fetching token balances:', error);
+ captureException(error, {
+ tags: {
+ section: 'fetchTokenBalances',
+ },
+ });
Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
console.error('Error fetching token balances:', error); | |
// Return undefined balances in case of failure | |
return tokens.map(token => ({ token, balance: undefined })); | |
captureException(error, { | |
tags: { | |
section: 'fetchTokenBalances', | |
}, | |
}); | |
// Return undefined balances in case of failure | |
return tokens.map(token => ({ token, balance: undefined })); |
const balance = await getBalance(wagmiConfig, { | ||
address: walletAddress as Address, | ||
}); | ||
return { | ||
token: nativeToken, | ||
balance: balance.value || 0n, | ||
}; | ||
}), |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Optimize fetching native token balances
Currently, for each native token in the nativeTokens
array, the code fetches the balance individually. Since the native token balance (e.g., ETH) is the same across all native tokens for a given wallet address, you can optimize this by fetching the balance once and mapping it to all native tokens. This will reduce unnecessary network calls and improve performance.
You can refactor the code as follows:
-const nativeTokenBalances = await Promise.all(
- nativeTokens.map(async nativeToken => {
- const balance = await getBalance(wagmiConfig, {
- address: walletAddress as Address,
- });
- return {
- token: nativeToken,
- balance: balance.value || 0n,
- };
- }),
-);
+const balance = await getBalance(wagmiConfig, {
+ address: walletAddress as Address,
+});
+const nativeTokenBalances = nativeTokens.map(nativeToken => ({
+ token: nativeToken,
+ balance: balance.value || 0n,
+}));
Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
const balance = await getBalance(wagmiConfig, { | |
address: walletAddress as Address, | |
}); | |
return { | |
token: nativeToken, | |
balance: balance.value || 0n, | |
}; | |
}), | |
const balance = await getBalance(wagmiConfig, { | |
address: walletAddress as Address, | |
}); | |
const nativeTokenBalances = nativeTokens.map(nativeToken => ({ | |
token: nativeToken, | |
balance: balance.value || 0n, | |
})); |
token.address !== AddressZero | ||
? erc20Tokens.push(token) | ||
: nativeTokens.push(token); | ||
}); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Tip
Codebase Verification
Token addresses are not consistently normalized
Ensure that all instances of token.address
use normalization functions to prevent case sensitivity issues:
src/hooks/useQRCodeDonation.ts
:tokenAddress: token.address
src/services/token.ts
:token.address !== AddressZero
src/services/token.ts
:address: token.address
Analysis chain
Ensure token addresses are correctly compared to AddressZero
When filtering tokens, the comparison token.address !== AddressZero
is used to separate ERC20 tokens from native tokens. Make sure that token.address
is normalized (e.g., in checksum case or lowercase) to match the format of AddressZero
. Otherwise, the comparison might fail due to case sensitivity, leading to incorrect categorization.
You can verify address normalization with the following script:
This script searches for usage of token.address
without normalization functions. If any matches are found, consider normalizing the addresses before comparison.
Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Check if all token addresses are normalized.
# Expected: All addresses should be in the same case (e.g., lowercase).
fd -e ts --type f | xargs grep -E "token\.address" | grep -vE "toLowerCase|toChecksumAddress"
Length of output: 262
const fetchBalances = async () => { | ||
try { | ||
const balances = await Promise.all( | ||
filteredTokens.map(async token => { | ||
const isEvm = token?.chainType === ChainType.EVM; | ||
return isEvm | ||
? { | ||
token, | ||
balance: await getBalanceForToken( | ||
token, | ||
walletAddress, | ||
), | ||
} | ||
: { | ||
const balances = isOnEVM | ||
? await fetchTokenBalances(filteredTokens, walletAddress) | ||
: await Promise.all( | ||
filteredTokens.map(async token => { | ||
return { | ||
token, | ||
balance: await getBalanceForToken( | ||
token, | ||
walletAddress, | ||
connection, | ||
), | ||
}; | ||
}), | ||
); | ||
}), | ||
); | ||
setTokenBalances(balances); | ||
} catch (error) { | ||
console.error('Error fetching token balances:', error); | ||
console.error('error on fetchTokenBalances', { error }); | ||
} | ||
}; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Enhance error handling in fetchBalances
function
In the fetchBalances
function, errors are currently only logged to the console. Consider providing user feedback when an error occurs during balance fetching to improve user experience.
Apply this diff to enhance error handling:
} catch (error) {
- console.error('error on fetchTokenBalances', { error });
+ showToastError('Failed to fetch token balances');
+ console.error('Error fetching token balances', error);
}
Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
const fetchBalances = async () => { | |
try { | |
const balances = await Promise.all( | |
filteredTokens.map(async token => { | |
const isEvm = token?.chainType === ChainType.EVM; | |
return isEvm | |
? { | |
token, | |
balance: await getBalanceForToken( | |
token, | |
walletAddress, | |
), | |
} | |
: { | |
const balances = isOnEVM | |
? await fetchTokenBalances(filteredTokens, walletAddress) | |
: await Promise.all( | |
filteredTokens.map(async token => { | |
return { | |
token, | |
balance: await getBalanceForToken( | |
token, | |
walletAddress, | |
connection, | |
), | |
}; | |
}), | |
); | |
}), | |
); | |
setTokenBalances(balances); | |
} catch (error) { | |
console.error('Error fetching token balances:', error); | |
console.error('error on fetchTokenBalances', { error }); | |
} | |
}; | |
const fetchBalances = async () => { | |
try { | |
const balances = isOnEVM | |
? await fetchTokenBalances(filteredTokens, walletAddress) | |
: await Promise.all( | |
filteredTokens.map(async token => { | |
return { | |
token, | |
balance: await getBalanceForToken( | |
token, | |
walletAddress, | |
connection, | |
), | |
}; | |
}), | |
); | |
setTokenBalances(balances); | |
} catch (error) { | |
showToastError('Failed to fetch token balances'); | |
console.error('Error fetching token balances', error); | |
} | |
}; |
* add givbacks and qf badges to stellar * fix connect wallet copy * remove givbacks old badge * add qf not eligible badges for stellar * fix passport banner position * donate page change for stellar donations * making the style proper * fix stellar QF green badge * fix not eligible warning badge color * remove badges on qr page * Estimated Matching Value added * update warning badges and icons * project image card change * run linter * update estimated matching toast * remove GIVBackToast from OneTimeDonationCard.tsx * QF Toast for Stellar * Check For Stellar Chain * run linter * fix: Stellar QF for issue 4752 * fix input back color, select border color, donate button type * add donation value USD to input * change anonymous donation design * fix: Donate first and lead the way text is now shown for amountraised in the round * fix: estimated amount in estimated matching toast in stellar * run linter * chore add padding to Donate Index * fix: Donation Success container padding * run linter' * update common styled and reused components * fix: pending issues realted to QF and stellar * update DonateToGiveth design * show qf badge only when there's active qf * fix Stellar usd badge design * remove DonateQFEligibleNetworks.tsx and add animation to estimated matching * add Eligible networks for QF matching * add Eligible networks for QF matching * add animation to Estimated Matching * fix connected wallet bug * fix stellar bug * fix: Already Donated if it is in Stellar Network * run linter * add new copy for qf matching * fix switch chain to Solana * fix crash on switch chain * fix: bugs realted to qf success toast and givbacks for stellar * change eligibility copies * fix: connect wallet on stellar * revert last commit * dont show connect your wallet to win and match is chain isnt in the qf round eligible networks * fix non evm chains logo * change copy * update copies * fix Solana eligibility badge check * fix: text on not connected * fix showing Stellar and Solana badges * rename getBalanceForToken * update version for donate page redesign release * this should be reverted before merge * revert * add wrong network new toast * change chain qf copy * update stellar icon * add transition for color change * amount for all tokens should be shown with the correct decimals * fix: calculate donation value according to decimals * run linter * prevent SwitchToAcceptedChain flickering * stellar: qf issues * run linter * fix XLM price --------- Co-authored-by: HrithikSampson <[email protected]>
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 38
Outside diff range and nitpick comments (23)
src/components/IconWithToolTip.tsx (2)
9-9
: LGTM: New style prop enhances component flexibility.The addition of the optional
style
prop of typeCSSProperties
is a good improvement, allowing for custom styling of the component.Consider adding a brief comment to document the purpose and usage of this new prop. For example:
/** Custom styles to be applied to the component's container */ style?: CSSProperties;
17-17
: LGTM: Correct implementation of the new style prop.The
style
prop is correctly destructured and applied to theIconWithTooltipContainer
. This implementation allows for custom styling of the component as intended.Consider using the spread operator for applying styles to allow for easier future additions:
<IconWithTooltipContainer {...otherProps} style={style} onMouseEnter={() => setShow(true)} onMouseLeave={() => setShow(false)} onClick={e => { e.stopPropagation(); }} ref={elRef} >This approach would make it easier to add more props in the future without needing to explicitly list them all.
Also applies to: 41-41
src/components/views/donate/common/DonateAnonymously.tsx (1)
34-34
: Consider moving inline style to styled component.The inline style
style={{ marginLeft: '-14px' }}
could be moved to the styled component definition for better maintainability and consistency.You could modify the
CheckBoxContainer
styled component like this:const CheckBoxContainer = styled.div` margin-top: 24px; border-radius: 8px; border: 1px solid ${neutralColors.gray[300]}; padding: 16px; + > div:first-child { + margin-left: -14px; + } > div:nth-child(2) { color: ${neutralColors.gray[900]}; font-size: 12px; margin-top: 9px; } `;Then remove the inline style from the
ToggleSwitch
component.src/components/views/donate/OneTime/TotalDonation.tsx (1)
70-76
: Improved rendering logic for total donation with minor formatting suggestionThe conditional rendering for the total donation has been simplified, consistent with previous changes. This improves code readability and reduces duplication.
Consider consolidating the string concatenation to improve readability:
<Caption $medium> {isActive - ? formatPrice(projectDonation + givethDonation) + - ' ' + - symbol + ? `${formatPrice(projectDonation + givethDonation)} ${symbol}` : '---'} </Caption>src/components/views/donate/DonateToGiveth.tsx (2)
47-47
: LGTM: Simplified handleCheckbox function.The
handleCheckbox
function has been updated to work with the new toggle switch, setting the donation amount to either 5% when enabled or 0% when disabled. This change aligns well with the new functionality.Consider using a constant or prop for the default percentage (currently 5%) to improve flexibility:
const DEFAULT_DONATION_PERCENTAGE = 5; const handleCheckbox = (e: boolean) => { setDonationToGiveth(e ? DEFAULT_DONATION_PERCENTAGE : 0); };This would make it easier to adjust the default percentage in the future if needed.
53-84
: LGTM: Implemented toggle switch and disabled state behavior.The changes effectively implement the new toggle switch functionality and disabled state behavior. The ToggleSwitch component is properly configured, and the disabled state is consistently applied across different parts of the component.
For consistency, consider using a ternary operator for the opacity in the IconWithTooltip style, similar to how it's used in the UserInput component:
style={{ marginBottom: '-5px', opacity: disabled ? 0.4 : 1, }}This makes the code style more uniform throughout the component.
src/context/donate.context.tsx (3)
36-36
: LGTM: New property for active QF round.The addition of
activeStartedRound
to theIDonateContext
interface is a good improvement. It allows the context to provide information about the currently active Quadratic Funding round.Consider adding a brief comment explaining the purpose of this property, e.g.:
// Stores information about the currently active Quadratic Funding round, if any activeStartedRound?: IQFRound;
142-144
: LGTM: Computation of activeStartedRound.The addition of
activeStartedRound
computation using thegetActiveRound
function is consistent with the interface changes and provides the necessary data for the context.Consider combining the
hasActiveQFRound
andactiveStartedRound
computations for better efficiency:const { hasActiveRound: hasActiveQFRound, activeStartedRound } = getActiveRound(project?.qfRounds);This assumes that
getActiveRound
returns an object with bothhasActiveRound
andactiveStartedRound
properties. If it doesn't, you might want to consider updating thegetActiveRound
function to return both pieces of information in a single call.
Line range hint
1-180
: Overall assessment: Well-implemented feature for active QF rounds.The changes in this file consistently implement new functionality to provide information about active Quadratic Funding rounds through the
DonateContext
. The modifications include:
- Adding necessary imports
- Updating the
IDonateContext
interface- Computing the
activeStartedRound
in theDonateProvider
- Providing the
activeStartedRound
in the context valueThese changes enhance the context's capabilities and should be useful for components that need information about active QF rounds.
To further improve the code:
- Consider adding comments to explain the purpose of new properties or complex logic.
- Evaluate the suggestion to combine the
hasActiveQFRound
andactiveStartedRound
computations for better efficiency.- Ensure that components consuming this context are updated to utilize the new
activeStartedRound
information where applicable.src/components/views/donate/SuccessView.tsx (2)
77-79
: LGTM with a small suggestion for improvement.The
isOnEligibleNetworks
check has been correctly updated to use theisStellar
prop. However, to ensure type safety and prevent potential issues with type coercion, consider using strict equality when comparing network numbers.Consider updating the line as follows:
const isOnEligibleNetworks = activeStartedRound?.eligibleNetworks?.includes( (isStellar ? config.STELLAR_NETWORK_NUMBER : chainId) ?? 0 );This change uses the nullish coalescing operator
??
instead of||
, which is more appropriate when dealing with potentialundefined
values.
Line range hint
39-79
: Summary: Stellar network support successfully integrated.The changes in this file successfully introduce support for the Stellar network in the
SuccessView
component. The modifications include:
- A new
ISuccessView
interface with an optionalisStellar
prop.- Updated component signature to use the new interface.
- Modified
isOnEligibleNetworks
check to handle Stellar network numbers.These changes enhance the component's flexibility without breaking existing functionality. The implementation is clean and well-typed, with only a minor suggestion for improvement in the network number comparison.
As the codebase evolves to support multiple networks, consider creating a utility function or a custom hook to handle network-specific logic. This would improve maintainability and reduce the need for conditional checks throughout the component.
src/config/production.tsx (1)
Line range hint
618-622
: LGTM: STELLAR_CONFIG is correctly defined.The STELLAR_CONFIG is properly defined, using the STELLAR_NETWORK constant and adding the necessary additional properties. This is consistent with other network configurations in the file.
For consistency with other configurations, consider adding a
gasPreference
property to the STELLAR_CONFIG, even if it's an empty object. This would make it easier to add gas preferences in the future if needed.STELLAR_CONFIG: { ...STELLAR_NETWORK, coingeckoChainName: 'stellar', chainLogo: (logoSize?: number) => <IconStellar size={logoSize} />, + gasPreference: { + // Keep it empty for automatic configuration + }, },src/components/views/donate/SwitchToAcceptedChain.tsx (1)
31-32
: EnsurenetworkName
is always defined to prevent undefined displayIf
networkName
is undefined or null, the user interface may display 'undefined', leading to confusion.Add a fallback value or default to handle cases where
networkName
might be undefined:const networkName = config.NETWORKS_CONFIG_WITH_ID[networkId]?.name; +const displayNetworkName = networkName || 'the current network';
And use
displayNetworkName
in your component instead ofnetworkName
.src/components/views/donate/OneTime/EstimatedMatchingToast.tsx (1)
97-106
: Avoid using negative margins for cleaner layout.In the
Wrapper
styled component:Using negative margins can lead to unexpected layout behavior and make maintenance harder.
Consider restructuring the layout or adjusting padding to eliminate the need for negative margins.
src/components/ToggleSwitch.tsx (2)
13-22
: Consider renaming the interface to match the component nameThe interface
IToggleButton
is used for theToggleSwitch
component. For clarity and consistency, consider renaming the interface toIToggleSwitchProps
to match the component name.This will enhance code readability and maintain consistency in naming conventions.
-interface IToggleButton { +interface IToggleSwitchProps { isOn: boolean; toggleOnOff: (isOn: boolean) => void; label: string; disabled?: boolean; className?: string; size?: EToggleSwitchSizes; theme?: EToggleSwitchThemes; style?: CSSProperties; } -const ToggleSwitch: FC<IToggleButton> = ({ +const ToggleSwitch: FC<IToggleSwitchProps> = ({ isOn, toggleOnOff, label, disabled, className, size, theme, style, }) => { ... }
120-120
: Avoid using!important
in stylesUsing
!important
in CSS can make styles harder to override and maintain. Unless absolutely necessary, it's best to avoid it for maintainability.You can remove
!important
from thefont-size
property:font-size: ${props => - props.size === EToggleSwitchSizes.SMALL ? '14px !important' : '16px'}; + props.size === EToggleSwitchSizes.SMALL ? '14px' : '16px'};src/components/views/donate/common/EligibilityBadges.tsx (2)
69-131
: Add error handling for when the user is not connectedCurrently, the component returns
null
whenisConnected
is false. Consider displaying a message or redirecting the user to connect their wallet for a better user experience.
33-132
: Consider adding unit tests forEligibilityBadges
componentGiven the complexity of the eligibility logic, adding unit tests would help ensure the component behaves as expected under various conditions.
Would you like assistance in creating unit tests for this component or opening a GitHub issue to track this task?
src/components/views/donate/DonatePageProjectDescription.tsx (1)
184-184
: Remove unnecessary empty<B>
elementAn empty
<B>
element at this line doesn't contribute to the UI and can be removed to clean up the code.Apply this diff to remove the empty element:
-<B></B>
src/components/views/donate/OneTime/SelectTokenModal/QRCodeDonation/QRDonationCard.tsx (1)
448-450
: Ensure consistent styling for theConnectWallet
component.The
ConnectWallet
styled component extendsBadgesBase
with only amargin-bottom
modification. Verify that this component displays correctly across different devices and consider adding responsive styles if necessary.src/components/views/donate/OneTime/OneTimeDonationCard.tsx (3)
Line range hint
223-227
: Handle empty token lists when setting accepted chainsAfter setting
acceptedChains
, iffilteredTokens
is empty, theshowChangeNetworkModal
is displayed. Ensure that this behavior is intentional and that the user experience is handled appropriately when no tokens are available.Consider providing feedback to the user or alternative options if no tokens are available on the current network.
Line range hint
329-337
: Ensure accurate conversion of gas fee to total amountThe computation of
totalAmount
convertsgasFee
to a number and fixes it to 10 decimal places. Be cautious with potential precision loss when converting fromBigInt
toNumber
. For very large values, this could introduce inaccuracies.Consider using
BigInt
arithmetic or libraries that handle large numbers to maintain precision.
617-619
: Confirm usage of 'OutlineButtonStyled'The
OutlineButtonStyled
component sets a width of 100%. Ensure that this styling does not unintentionally affect layout, especially in responsive designs.Consider reviewing its impact on different screen sizes.
Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Files ignored due to path filters (3)
package-lock.json
is excluded by!**/package-lock.json
public/images/tokens/XLM.svg
is excluded by!**/*.svg
yarn.lock
is excluded by!**/yarn.lock
,!**/*.lock
Files selected for processing (46)
- lang/ca.json (46 hunks)
- lang/en.json (56 hunks)
- lang/es.json (46 hunks)
- lang/t_ca.json (0 hunks)
- lang/t_es.json (0 hunks)
- package.json (4 hunks)
- src/components/IconWithToolTip.tsx (2 hunks)
- src/components/RewardCard.tsx (1 hunks)
- src/components/ToggleSwitch.tsx (4 hunks)
- src/components/input/BaseInput.tsx (1 hunks)
- src/components/modals/DonateWrongNetwork.tsx (1 hunks)
- src/components/modals/SwitchNetwork.tsx (3 hunks)
- src/components/modals/WrongNetworkInnerModal.tsx (1 hunks)
- src/components/views/donate/DonateIndex.tsx (10 hunks)
- src/components/views/donate/DonatePageProjectDescription.tsx (4 hunks)
- src/components/views/donate/DonateToGiveth.tsx (3 hunks)
- src/components/views/donate/DonationCard.tsx (7 hunks)
- src/components/views/donate/OnTime/DonateQFEligibleNetworks.tsx (0 hunks)
- src/components/views/donate/OnTime/EstimatedMatchingToast.tsx (0 hunks)
- src/components/views/donate/OneTime/DonateModal.tsx (5 hunks)
- src/components/views/donate/OneTime/EstimatedMatchingToast.tsx (1 hunks)
- src/components/views/donate/OneTime/OneTimeDonationCard.tsx (11 hunks)
- src/components/views/donate/OneTime/SaveGasFees.tsx (1 hunks)
- src/components/views/donate/OneTime/SelectTokenModal/QRCodeDonation/QRDonationCard.tsx (12 hunks)
- src/components/views/donate/OneTime/SelectTokenModal/SelectTokenModal.tsx (4 hunks)
- src/components/views/donate/OneTime/TotalDonation.tsx (3 hunks)
- src/components/views/donate/QFEligibleNetworks.tsx (1 hunks)
- src/components/views/donate/Recurring/RecurringDonationCard.tsx (7 hunks)
- src/components/views/donate/SuccessView.tsx (2 hunks)
- src/components/views/donate/SwitchToAcceptedChain.tsx (3 hunks)
- src/components/views/donate/common.styled.ts (0 hunks)
- src/components/views/donate/common/DonateAnonymously.tsx (1 hunks)
- src/components/views/donate/common/EligibilityBadges.tsx (1 hunks)
- src/components/views/donate/common/common.styled.ts (1 hunks)
- src/components/views/donate/common/helpers.tsx (1 hunks)
- src/components/views/transaction/DonationStatusSection.tsx (1 hunks)
- src/components/views/transaction/QRDetailsSection.tsx (1 hunks)
- src/config/development.tsx (3 hunks)
- src/config/production.tsx (3 hunks)
- src/configuration.ts (3 hunks)
- src/context/donate.context.tsx (3 hunks)
- src/hooks/useCreateEvmDonation.tsx (1 hunks)
- src/hooks/useCreateSolanaDonation.tsx (1 hunks)
- src/hooks/useQRCodeDonation.ts (1 hunks)
- src/services/donation.ts (1 hunks)
- src/types/config.ts (1 hunks)
Files not reviewed due to no reviewable changes (5)
- lang/t_ca.json
- lang/t_es.json
- src/components/views/donate/OnTime/DonateQFEligibleNetworks.tsx
- src/components/views/donate/OnTime/EstimatedMatchingToast.tsx
- src/components/views/donate/common.styled.ts
Files skipped from review due to trivial changes (5)
- src/components/input/BaseInput.tsx
- src/components/modals/DonateWrongNetwork.tsx
- src/hooks/useCreateEvmDonation.tsx
- src/hooks/useQRCodeDonation.ts
- src/services/donation.ts
Files skipped from review as they are similar to previous changes (6)
- lang/ca.json
- lang/en.json
- lang/es.json
- package.json
- src/components/views/donate/DonateIndex.tsx
- src/components/views/donate/DonationCard.tsx
Additional context used
Biome
src/components/views/donate/DonateToGiveth.tsx
[error] 41-41: isNaN is unsafe. It attempts a type coercion. Use Number.isNaN instead.
See the MDN documentation for more details.
Unsafe fix: Use Number.isNaN instead.(lint/suspicious/noGlobalIsNan)
src/components/views/donate/OneTime/SelectTokenModal/QRCodeDonation/QRDonationCard.tsx
[error] 173-173: Avoid the use of spread (
...
) syntax on accumulators.Spread syntax should be avoided on accumulators (like those in
.reduce
) because it causes a time complexity ofO(n^2)
.
Consider methods such as .splice or .push instead.(lint/performance/noAccumulatingSpread)
Additional comments not posted (72)
src/components/IconWithToolTip.tsx (2)
2-2
: LGTM: Correct import for CSSProperties.The addition of
CSSProperties
to the import statement is appropriate for the newstyle
prop.
Line range hint
1-56
: Overall, good enhancement to the IconWithTooltip component.The addition of the
style
prop improves the component's flexibility and reusability. The changes are well-implemented and don't appear to break any existing functionality.To ensure smooth integration of these changes, please verify the following:
- Update any existing usage of
IconWithTooltip
that might benefit from the newstyle
prop.- Update component documentation or storybook examples (if any) to reflect this new capability.
Run the following script to find all usages of
IconWithTooltip
in the codebase:Review the results to identify any instances where adding a
style
prop could enhance the component's usage.Verification successful
IconWithTooltip: Addition of
style
prop verifiedThe addition of the
style
prop toIconWithTooltip
enhances the component's flexibility without affecting existing functionality. All current usages have been reviewed and are compatible with this enhancement.Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash # Description: Find all usages of IconWithTooltip component # Test: Search for IconWithTooltip usage rg --type typescript --type typescriptreact -A 5 $'<IconWithTooltip'Length of output: 104
Script:
#!/bin/bash # Description: Find all usages of IconWithTooltip component in .tsx and .ts files rg '<IconWithTooltip' --type-add 'tsx:*.tsx' --type-add 'ts:*.ts' --type tsx -A 5Length of output: 19521
src/components/views/donate/OneTime/SaveGasFees.tsx (2)
10-11
: Summary: Import path updates reflect project restructuringThe changes in this file are limited to updating import paths, which reflect a restructuring of the project's file organization. These modifications do not affect the functionality of the
SaveGasFees
component.However, it's crucial to ensure that these changes are consistently applied across the entire codebase to prevent any potential breaking changes. Please review the verification scripts provided in the previous comments to check for any other imports that might need updating.
10-10
: LGTM. Verify other imports for consistency.The import path update for
common.styled
looks good. It reflects a project restructuring, adding an additional 'common' directory.To ensure consistency across the codebase, please run the following script to check for any other imports that might need updating:
src/components/views/transaction/QRDetailsSection.tsx (1)
5-5
: LGTM! Verify the corrected import path.The import path for
QRDonationCardContent
has been updated from 'OnTime' to 'OneTime', which appears to be a correction of a typo in the directory name. This change is consistent with the expected behavior and doesn't affect the component's usage within the file.To ensure the new path is correct, please run the following script:
Verification successful
Import Path Verified Successfully
The updated import path for
QRDonationCardContent
has been confirmed to exist, and no references to the old path remain.Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash # Description: Verify the existence of the QRDonationCardContent component in the new path # Test: Check if the file exists in the new path fd -p "components/views/donate/OneTime/SelectTokenModal/QRCodeDonation/QRDonationCardContent.*" src # Test: Ensure there are no remaining references to the old path rg -i "OnTime/SelectTokenModal/QRCodeDonation/QRDonationCardContent" srcLength of output: 268
src/components/views/donate/common/DonateAnonymously.tsx (3)
1-11
: LGTM: Imports are well-organized and necessary.The imports are logically structured and all seem to be used within the component. Good job on keeping the imports clean and relevant.
13-17
: LGTM: Well-defined interface for component props.The
IDonateAnonymously
interface is clear and properly typed. The use of a union type forselectedToken
and making it optional is a good practice for flexibility.
19-43
: LGTM: Component logic is well-implemented.The
DonateAnonymously
component is well-structured and follows React best practices. Good use of hooks and proper handling of the toggle's disabled state based on wallet connection and token selection.src/components/views/donate/common/helpers.tsx (3)
45-48
: Improved type safety and clarity with explicit return type.The addition of an explicit return type for the
calcDonationShare
function enhances type safety and provides better documentation of the function's output. This change makes the function's behavior more transparent and easier to understand for other developers.
Line range hint
1-1
: Verify impact of removinggetNetworkNames
function.The
getNetworkNames
function has been removed from this file. Please ensure that this removal doesn't negatively impact other parts of the codebase that might have been using this function.Run the following script to check for any remaining usages of the
getNetworkNames
function:#!/bin/bash # Description: Search for any remaining usages of getNetworkNames function echo "Searching for getNetworkNames function calls:" rg --type typescript --type tsx "getNetworkNames\(" -A 3 echo "\nSearching for imports of getNetworkNames:" rg --type typescript --type tsx "import.*getNetworkNames" -A 3If any usages are found, please update those parts of the code accordingly or consider if the function needs to be reintroduced.
45-48
: Verify usage ofcalcDonationShare
across the codebase.The change in the return type of
calcDonationShare
might affect existing code that relies on this function. Please ensure that all usages of this function have been updated to handle the new return type correctly.Run the following script to identify all usages of
calcDonationShare
:Please review the results to ensure that all usages are compatible with the new return type.
Verification successful
All usages of
calcDonationShare
have been verified and are compatible with the updated return type. No issues found.Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash # Description: Find all usages of calcDonationShare function # Search for calcDonationShare function calls echo "Searching for calcDonationShare function calls:" rg --type typescript --type tsx "calcDonationShare\(" -A 3 # Search for destructuring of calcDonationShare return value echo "\nSearching for destructuring of calcDonationShare return value:" rg --type typescript --type tsx "const\s+\{.*\}\s*=\s*calcDonationShare\(" -A 3Length of output: 584
Script:
#!/bin/bash # Description: Find all usages of calcDonationShare function # Search for calcDonationShare function calls in .ts and .tsx files echo "Searching for calcDonationShare function calls:" rg --glob "*.ts" --glob "*.tsx" "calcDonationShare\(" -A 3 # Search for destructuring of calcDonationShare return value in .ts and .tsx files echo "\nSearching for destructuring of calcDonationShare return value:" rg --glob "*.ts" --glob "*.tsx" "const\s+\{.*\}\s*=\s*calcDonationShare\(" -A 3Length of output: 2027
src/components/views/donate/OneTime/TotalDonation.tsx (4)
47-51
: Improved rendering logic for project donationThe conditional rendering has been simplified using a ternary operator. This change improves code readability and reduces duplication while maintaining the same logic.
60-64
: Consistent improvement in rendering logic for Giveth donationThe conditional rendering for the Giveth donation has been simplified in the same manner as the project donation. This change maintains consistency in the code structure and improves readability.
Line range hint
1-114
: Summary of changes in TotalDonation.tsxThe modifications in this file focus on improving code readability and consistency:
- The import path for
calcDonationShare
has been updated, suggesting a project restructure.- Conditional rendering logic has been simplified throughout the component using ternary operators.
- The changes maintain the existing functionality while reducing code duplication.
These improvements enhance the maintainability of the component without altering its behavior.
6-6
: Verify the updated import path forcalcDonationShare
The import path for
calcDonationShare
has been changed to a more general location. This suggests a restructuring of helper functions.Please run the following script to ensure this change is consistent across the project and doesn't break other imports:
Verification successful
Import path for
calcDonationShare
successfully updatedThe new import path
'@/components/views/donate/common/helpers'
has been correctly updated across the codebase without leaving any residual old import paths.Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash # Description: Verify the import path change for calcDonationShare # Test 1: Check if the new import path exists fd --type f "common/helpers.(ts|tsx)" src/components/views/donate # Test 2: Search for any remaining old import paths rg --type typescript "import.*calcDonationShare.*from.*'@/components/views/donate/helpers'" # Test 3: Check for other files that might need updating rg --type typescript "import.*calcDonationShare"Length of output: 288
Script:
#!/bin/bash # Description: Verify the import path change for calcDonationShare # Test 1: Check if the new import path exists fd --type f -e ts -e tsx 'common/helpers.ts*' src/components/views/donate # Test 2: Search for any remaining old import paths rg --type ts 'import .*calcDonationShare.* from .*@/components/views/donate/helpers' # Test 3: Check for other files that might need updating rg --type ts 'import .*calcDonationShare'Length of output: 468
src/components/modals/WrongNetworkInnerModal.tsx (1)
10-10
: LGTM! Verify impact on other files.The import path update for
INetworkIdWithChain
is correct and aligns with the reported file restructuring. This change improves the organization of the codebase.To ensure consistency across the codebase, please run the following script to check if there are any other files that need to be updated with the new import path:
Verification successful
All references updated successfully!
The import path update for
INetworkIdWithChain
has been correctly applied across the codebase.Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash # Description: Find other files that might need updating due to the path change # Search for files still using the old import path echo "Files potentially needing update:" rg --type typescript "from '../views/donate/common\.types'" -l # Search for files already using the new import path (for context) echo "\nFiles already using the new import path:" rg --type typescript "from '../views/donate/common/common\.types'" -lLength of output: 390
Script:
#!/bin/bash # Description: Find TypeScript files that might need updating due to the import path change # Search for files with .ts or .tsx extensions using the old import path echo "Files potentially needing update:" rg 'from '\''\.\.\/views\/donate\/common\.types'\''' --glob '*.ts' --glob '*.tsx' -l # Search for files already using the new import path (for context) echo "\nFiles already using the new import path:" rg 'from '\''\.\.\/views\/donate\/common\/common\.types'\''' --glob '*.ts' --glob '*.tsx' -lLength of output: 597
Script:
#!/bin/bash # Description: Find TypeScript files that might need updating due to the import path change # Search for files with .ts or .tsx extensions using the old import path echo "Files potentially needing update:" rg -F "from '../views/donate/common.types'" --glob '*.ts' --glob '*.tsx' -l # Search for files already using the new import path (for context) echo "\nFiles already using the new import path:" rg -F "from '../views/donate/common/common.types'" --glob '*.ts' --glob '*.tsx' -lLength of output: 435
src/components/views/donate/common/common.styled.ts (13)
1-13
: LGTM: Import statements are appropriate and concise.The import statements are well-organized, importing necessary design system elements and components. There are no unused imports, which is good for maintaining a clean codebase.
15-29
: LGTM: NetworkToast component is well-structured.The
NetworkToast
component is appropriately styled using the design system'sFlex
component and color palette. The styling for child elements is specific and clear, which should result in consistent rendering across the application.
31-35
: LGTM: SwitchCaption component is concise and well-styled.The
SwitchCaption
component extends the design system'sCaption
component with appropriate styling. The use of the design system's color palette ensures visual consistency.
37-57
: LGTM: BadgesBase component is well-designed with flexible styling options.The
BadgesBase
component is thoughtfully implemented:
- It extends the design system's
FlexCenter
component.- Uses props (
active
andwarning
) to modify its appearance, allowing for flexible usage.- Employs conditional styling logic that is clear and concise.
- Utilizes design system colors and transitions, enhancing visual consistency and user experience.
This approach provides a versatile and maintainable styled component.
59-70
: LGTM: EligibilityBadgeWrapper component implements responsive design effectively.The
EligibilityBadgeWrapper
component:
- Extends the design system's
Flex
component for consistent layout.- Implements responsive design using media queries, adjusting layout for different screen sizes.
- Uses the design system's media query breakpoints, ensuring consistency with other responsive elements.
This approach results in a flexible and responsive container for eligibility badges.
72-75
: LGTM: IconWrapper component is simple and purposeful.The
IconWrapper
component is a concise styled div that:
- Sets the cursor to pointer, indicating interactivity.
- Uses the design system's color palette for visual consistency.
This simple approach is appropriate for wrapping interactive icons.
77-82
: LGTM: GLinkStyled component enhances link interactivity.The
GLinkStyled
component effectively extends the design system'sGLink
:
- It focuses on enhancing the hover state, improving user interaction feedback.
- The use of
&&
increases style specificity, ensuring these styles take precedence.This approach maintains consistency with the design system while adding custom interactivity.
84-101
: LGTM: Input component is well-styled with accessibility considerations.The
Input
component is thoughtfully implemented:
- Extends
AmountInput
with additional styling.- Uses the
disabled
prop to adjust styles, enhancing accessibility.- Applies comprehensive styling to both the wrapper and inner input element.
- Utilizes design system colors for visual consistency.
This results in a flexible and accessible input component that fits well within the design system.
103-108
: LGTM: SelectTokenWrapper component is well-structured with accessibility consideration.The
SelectTokenWrapper
component:
- Extends the design system's
Flex
component for consistent layout.- Uses the
disabled
prop to adjust the cursor style, enhancing accessibility.- Applies concise styling for background, border-radius, and gap.
This approach results in a flexible wrapper component that can be easily used in various contexts.
110-112
: LGTM: SelectTokenPlaceHolder component is concise and purposeful.The
SelectTokenPlaceHolder
component:
- Extends the design system's
B
component, maintaining consistency.- Adds a single, focused style (
white-space: nowrap
) to prevent text wrapping.This minimalist approach is appropriate for a placeholder component.
114-123
: LGTM: InputWrapper component provides a consistent and well-styled container.The
InputWrapper
component:
- Extends the design system's
Flex
component for consistent layout.- Applies comprehensive styling for border, background, padding, and positioning.
- Uses design system colors, ensuring visual consistency.
- Provides styling for child elements, creating a cohesive look.
This results in a versatile wrapper component that can be used to create consistent input layouts across the application.
125-131
: LGTM: ForEstimatedMatchingAnimation component implements a smooth, prop-controlled animation.The
ForEstimatedMatchingAnimation
component:
- Uses a prop (
showEstimatedMatching
) to control its state.- Implements a transform-based animation for showing/hiding content.
- Includes a transition effect for smooth visual changes.
This approach provides a reusable animated component that can be easily controlled in various contexts.
1-131
: LGTM: Well-structured and consistent styled components for the donation view.This file provides a comprehensive set of styled components that:
- Maintain consistency with the design system by extending existing components and using system colors.
- Offer flexible styling options through props and media queries.
- Implement accessibility considerations (e.g., disabled states).
- Use appropriate styling techniques for layout, animation, and responsiveness.
The components are well-organized and should contribute to a cohesive and maintainable UI for the donation view.
src/components/views/donate/QFEligibleNetworks.tsx (2)
1-23
: LGTM: Imports and component declaration look good.The imports are appropriate for the component's functionality, and the component is correctly declared as a constant functional component.
1-130
: Overall assessment: Well-structured component with room for improvementThe
QFEligibleNetworks
component is well-structured and functional, effectively displaying eligible networks for matching donations. However, there are several areas where it could be improved:
- Robustness: Enhance the QR donation check and network filtering logic.
- Performance: Implement memoization for expensive calculations and consider using React.memo for child components.
- Accessibility: Add aria-labels to interactive elements.
- Maintainability: Refactor styled-components for better reusability and consider using a CSS-in-JS solution with static extraction.
Implementing these suggestions will result in a more robust, performant, and maintainable component.
src/components/views/donate/DonateToGiveth.tsx (5)
3-3
: LGTM: New imports for toggle switch functionality.The added imports are necessary for implementing the new toggle switch feature. They are correctly imported from the appropriate modules.
Also applies to: 16-19
25-25
: LGTM: Added optionaldisabled
prop to interface.The addition of the optional
disabled
prop to theIDonateToGiveth
interface is appropriate. It allows for implementing a disabled state for the component while maintaining backward compatibility.
34-34
: LGTM: Destructureddisabled
prop in component.The
disabled
prop is correctly destructured from the component props, allowing it to be used within the component logic.
39-39
: LGTM: Added disabled state check in handleChange.The addition of the disabled state check at the beginning of the
handleChange
function is a good practice. It efficiently prevents any modifications when the component is disabled.
110-126
: LGTM: Improved styling and responsiveness.The changes to the styled components enhance the visual consistency and responsiveness of the component:
- UserInput now properly handles the disabled state with conditional opacity.
- StyledInput has improved width, margin, and styling properties for better visual appeal.
- Container has new border and padding properties that enhance the overall look.
These updates contribute to a more polished and user-friendly interface.
Also applies to: 150-157
src/context/donate.context.tsx (2)
13-14
: LGTM: New imports for QF round functionality.The added imports for
IQFRound
,getActiveRound
, andhasActiveRound
are consistent with the changes in the context and provider. These imports support the new functionality related to Quadratic Funding rounds.
150-150
: LGTM: Providing activeStartedRound in context.The addition of
activeStartedRound
to the context value is consistent with the interface changes and makes the active QF round information available to context consumers.src/components/RewardCard.tsx (1)
24-24
: LGTM! Verify import consistency across the codebase.The update to the import path for
INetworkIdWithChain
looks good. This change likely reflects a restructuring of the project files.To ensure consistency across the codebase, please run the following script to check for any remaining occurrences of the old import path:
Verification successful
Import path is consistently updated across the codebase.
All instances of the old import path have been successfully removed, and the new import path is correctly used in
src/components/RewardCard.tsx
.Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash # Description: Check for any remaining occurrences of the old import path # Test: Search for the old import path. Expect: No results. rg --type typescript "from './views/donate/common.types'" # Test: Verify the new import path is used consistently. Expect: Consistent usage across files. rg --type typescript "from './views/donate/common/common.types'"Length of output: 208
Script:
#!/bin/bash # Description: Check for any remaining occurrences of the old import path # Test: Search for the old import path. Expect: No results. rg --type ts "from './views/donate/common.types'" # Test: Verify the new import path is used consistently. Expect: Consistent usage across files. rg --type ts "from './views/donate/common/common.types'"Length of output: 226
src/components/views/donate/SuccessView.tsx (2)
39-41
: LGTM: New interfaceISuccessView
is well-defined.The new interface
ISuccessView
is correctly defined with an optionalisStellar
prop of type boolean. This addition enhances type safety and provides clear documentation for the component's props.
42-42
: LGTM: Component signature updated correctly.The
SuccessView
component signature has been properly updated to use the newISuccessView
interface and destructure theisStellar
prop. This change enhances type safety and improves code readability.src/types/config.ts (1)
254-256
: Approved: New property added for numeric network IDs. Consider adding explanatory comment.The addition of
NETWORKS_CONFIG_WITH_ID
provides a more specific type for network configurations with numeric IDs, which can be beneficial for operations requiring only numeric network IDs.Consider adding a comment to explain the purpose and use case of this new property, especially in relation to the existing
NETWORKS_CONFIG
. This will help developers understand when to use each property.Example:
/** * Network configurations indexed by numeric IDs only. * Use this when you need to ensure all network IDs are numbers. */ NETWORKS_CONFIG_WITH_ID: { [key: number]: NetworkConfig | NonEVMNetworkConfig; };To ensure this change is properly integrated, let's verify its usage in the codebase:
This will help identify if the new property is being used correctly and consistently throughout the project.
Verification successful
Verified:
NETWORKS_CONFIG_WITH_ID
is used correctly throughout the codebase. No issues found.Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash # Search for usage of NETWORKS_CONFIG_WITH_ID echo "Searching for usage of NETWORKS_CONFIG_WITH_ID:" rg --type typescript "NETWORKS_CONFIG_WITH_ID" # Compare with usage of NETWORKS_CONFIG echo "\nComparing with usage of NETWORKS_CONFIG:" rg --type typescript "NETWORKS_CONFIG[^_]"Length of output: 361
Script:
#!/bin/bash # Search for usage of NETWORKS_CONFIG_WITH_ID with corrected file type echo "Searching for usage of NETWORKS_CONFIG_WITH_ID:" rg --type ts "NETWORKS_CONFIG_WITH_ID" # Compare with usage of NETWORKS_CONFIG with corrected file type echo "\nComparing with usage of NETWORKS_CONFIG:" rg --type ts "NETWORKS_CONFIG[^_]"Length of output: 8929
src/hooks/useCreateSolanaDonation.tsx (1)
19-19
: LGTM: Import path updated correctly.The import path for
ICreateDonation
has been updated to a more specific location. This change likely reflects a restructuring of the project's file organization, which can improve code maintainability.Let's verify if other files might be affected by this change:
Verification successful
Verified: Import path updated correctly.
The import path for
ICreateDonation
has been successfully updated to@/components/views/donate/common/helpers
, and no files are using the old import path. The newhelpers.tsx
file exists in the specified location, confirming the restructuring is correctly implemented.Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash # Description: Check for other files that might need updating due to the changed import path. # Test 1: Search for files still using the old import path echo "Files still using the old import path:" rg --type typescript --type tsx "from '@/components/views/donate/helpers'" -l # Test 2: Search for files using the new import path echo "Files already using the new import path:" rg --type typescript --type tsx "from '@/components/views/donate/common/helpers'" -l # Test 3: Verify the existence of the new file echo "Checking if the new file exists:" fd "helpers.ts" src/components/views/donate/commonLength of output: 599
Script:
#!/bin/bash # Description: Check for other files that might need updating due to the changed import path. # Test 1: Search for files still using the old import path echo "Files still using the old import path:" rg "from '@/components/views/donate/helpers'" --glob "*.ts" --glob "*.tsx" -l # Test 2: Search for files using the new import path echo "Files already using the new import path:" rg "from '@/components/views/donate/common/helpers'" --glob "*.ts" --glob "*.tsx" -l # Test 3: Verify the existence of the new file echo "Checking if the new file exists:" fd "helpers.ts" src/components/views/donate/commonLength of output: 824
src/components/views/transaction/DonationStatusSection.tsx (1)
16-16
: Approve the import path correction.The change from "OnTime" to "OneTime" in the import path appears to be a correction of a typo. This modification ensures that the correct module is imported for the
UsdAmountCard
component.To ensure the corrected path exists, please run the following command:
This command will search for the "OneTime" directory within the specified path. If the directory exists, it confirms that the import path is correct.
Verification successful
Import path correctly updated.
The
OneTime
directory exists at the specified path, confirming that the import path forUsdAmountCard
is accurate.Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash # Verify the existence of the corrected import path fd -t d 'OneTime' src/components/views/donateLength of output: 82
src/config/development.tsx (4)
81-81
: Approved: Variable name correctionThe change from
STELLAR_NOTWORK
toSTELLAR_NETWORK
corrects a typo in the variable name. This improvement enhances code readability and maintains consistency with naming conventions.
131-131
: Approved: Consistent use of corrected variable nameThe
NON_EVM_CHAINS
array now correctly includesSTELLAR_NETWORK
instead ofSTELLAR_NOTWORK
. This change maintains consistency with the variable name correction and ensures the proper use of the Stellar network configuration.
Line range hint
1-474
: Suggestion: Thoroughly test Stellar network integrationThe changes to correct the Stellar network configuration appear to be consistent and complete. However, to ensure these changes don't have any unintended side effects, it's recommended to thoroughly test the Stellar network integration within the application.
Consider the following steps:
- Verify that all components using the Stellar configuration are updated to use
STELLAR_NETWORK
.- Test any functionality related to the Stellar network to ensure it works as expected with the corrected configuration.
- Check for any hardcoded references to
STELLAR_NOTWORK
throughout the codebase and update them if found.To help with this verification, you can run the following script to check for any remaining instances of
STELLAR_NOTWORK
in the codebase:#!/bin/bash # Description: Check for any remaining instances of STELLAR_NOTWORK echo "Searching for STELLAR_NOTWORK in the codebase:" rg "STELLAR_NOTWORK" --type ts --type tsxIf this script returns any results, those occurrences should be updated to
STELLAR_NETWORK
.
466-466
: Approved: Correct spread of Stellar network configurationThe
STELLAR_CONFIG
object now correctly spreads the properties fromSTELLAR_NETWORK
instead ofSTELLAR_NOTWORK
. This change ensures the proper Stellar network configuration is used.To ensure the Stellar configuration is complete and correct, please run the following verification script:
src/config/production.tsx (3)
Line range hint
67-85
: LGTM: STELLAR_NETWORK constant is well-defined.The STELLAR_NETWORK constant is correctly defined with all necessary properties. The naming is consistent with other network definitions in the file, and the structure follows the expected pattern for network configurations.
Line range hint
1-624
: Summary of changes to STELLAR_NETWORK and STELLAR_CONFIGThe changes to the STELLAR_NETWORK constant and its usage in STELLAR_CONFIG appear to be correct and consistent with the rest of the file. Here's a summary of the review:
- The STELLAR_NETWORK constant is well-defined with all necessary properties.
- The STELLAR_CONFIG correctly uses the STELLAR_NETWORK constant and adds the required additional properties.
- A minor suggestion was made to add an empty
gasPreference
property to STELLAR_CONFIG for consistency with other configurations.- A verification script was provided to check for any impacts of these changes on other parts of the codebase.
Overall, the changes look good, but please ensure to run the verification script and address any potential impacts on the wider codebase.
97-97
: Verify the impact of STELLAR_NETWORK changes.The STELLAR_NETWORK constant is correctly used in the NON_EVM_CHAINS array. However, it's important to ensure that these changes don't affect other parts of the codebase that might be using STELLAR_NETWORK or STELLAR_CONFIG.
Run the following script to check for any other usages of STELLAR_NETWORK or STELLAR_CONFIG in the codebase:
Please review the output of this script to ensure that all usages of STELLAR_NETWORK and STELLAR_CONFIG are compatible with the changes made in this file.
src/components/views/donate/Recurring/RecurringDonationCard.tsx (5)
3-3
: Import statements look good!The new imports and reorganization improve code readability and reflect the added functionality for anonymous donations and styled components.
Also applies to: 6-6, 14-14, 57-65
126-127
: Good addition of wallet connection state!The use of
useGeneralWallet
hook improves wallet connection handling, which is a good practice for managing wallet state across the application.
291-291
: Good addition of disabled state for token selection!Adding the
disabled
prop toSelectTokenWrapper
when the wallet is not connected improves the user experience by preventing interaction when it's not possible.
384-384
: Slider component renamed for consistencyRenaming
StyledSlider
toSlider
improves code consistency and readability.
744-748
: Great addition of anonymous donation functionality!The new
DonateAnonymously
component adds important functionality for users who wish to donate anonymously. This is a valuable feature for many donors.src/configuration.ts (2)
34-35
: Initialization ofNON_EVM_NETWORKS_CONFIG_WITH_ID
is correctThe declaration of
NON_EVM_NETWORKS_CONFIG_WITH_ID
as an empty object to store non-EVM network configurations indexed by IDs is appropriate and aligns with the intended design.
62-65
: Ensure unique network IDs to prevent configuration conflictsWhen merging
EVM_NETWORKS_CONFIG
andNON_EVM_NETWORKS_CONFIG_WITH_ID
intoNETWORKS_CONFIG_WITH_ID
, it's important to ensure that the network IDs used as keys are unique across both EVM and non-EVM networks. Overlapping IDs could lead to configurations overwriting each other and cause runtime errors.Run the following script to check for overlapping network IDs:
If any overlapping IDs are found, please assign unique IDs to each network to prevent conflicts.
src/components/views/donate/OneTime/EstimatedMatchingToast.tsx (2)
59-65
: Check forNaN
or unexpected values inesMatching
calculation.The function call:
If any of the parameters are
undefined
or invalid numbers,esMatching
could beNaN
or incorrect.Ensure all parameters are validated before calling the function. You might want to add checks or defaults to prevent calculation errors.
80-90
: Ensure tooltip content is localized and accessible.In the
IconWithTooltip
component:Verify that the message ID
'component.qf-section.tooltip_polygon'
corresponds to a localized string in all supported languages. Additionally, ensure that the tooltip is accessible via keyboard navigation and compatible with screen readers.src/components/modals/SwitchNetwork.tsx (2)
22-22
: Import statement is correct.The import of
INetworkIdWithChain
is correctly updated to reflect the new path.
78-85
:⚠️ Potential issuePotential logical error due to missing
else
statementThe current control flow may result in multiple sign-in functions being called sequentially. Specifically, if
walletChainType === ChainType.SOLANA
istrue
, bothhandleSignOutAndSignInWithEVM()
and the subsequent condition could execute, leading to unintended behavior.Consider restructuring the conditional statements to prevent multiple sign-in functions from being called:
if (walletChainType === ChainType.SOLANA) { handleSignOutAndSignInWithEVM(); +} else if ( + walletChainType === ChainType.EVM && + chainType === ChainType.SOLANA +) { handleSignOutAndSignInWithSolana(); } else { switchChain?.({ chainId: networkId }); } closeModal();This ensures that only one sign-in function is called based on the wallet chain type.
Likely invalid or redundant comment.
src/components/views/donate/common/EligibilityBadges.tsx (1)
53-55
: Ensure accurate calculation ofdonationUsdValue
When calculating
donationUsdValue
, there's a possibility thattokenPrice
oramount
could beundefined
or0
, leading to unintended results. Verify that these values are always correctly defined and handle cases where they might not be.src/components/views/donate/OneTime/SelectTokenModal/SelectTokenModal.tsx (5)
28-29
: Imports added correctlyThe imports for
getBalanceForToken
andfetchTokenBalances
are appropriately added and necessary for the updated functionality.
85-86
: Correctly retrieved wallet and chain informationUsing
useGeneralWallet
anduseAccount
to access wallet address, connection status, and chain information is correct.
178-193
: Balance fetching logic handles both EVM and non-EVM chainsThe updated
fetchBalances
function correctly differentiates between EVM and non-EVM chains, fetching token balances accordingly.
200-202
: Conditional execution offetchBalances
is appropriateThe check for
isConnected
before callingfetchBalances
ensures that balance fetching is attempted only when the wallet is connected.
243-243
:⚠️ Potential issueUpdate message when wallet is not connected
When the wallet is not connected and there are no tokens to display, the message "No token supported on this chain" might be confusing. Consider updating it to prompt the user to connect their wallet.
Apply this diff to update the message:
- <div>No token supported on this chain</div> + <div>Please connect your wallet to view available tokens.</div>Likely invalid or redundant comment.
src/components/views/donate/OneTime/DonateModal.tsx (1)
211-211
:⚠️ Potential issueVerify the property name used in
setSuccessDonation
Ensure that the
setSuccessDonation
function expects a property namedexcludeFromQF
. If the expected property isincludeInQF
, usingexcludeFromQF
may lead to unintended behavior.Run the following script to verify the expected property name:
Verification successful
Verified:
setSuccessDonation
correctly usesexcludeFromQF
The
ISuccessDonation
interface includes theexcludeFromQF
property, confirming that its usage insetSuccessDonation
is correct.Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash # Description: Find the definition of `setSuccessDonation` and check the expected property name. # Search for the definition or type of `setSuccessDonation` rg --type typescript --context 5 'setSuccessDonation' --glob '*.{ts,tsx}' # Expected Result: Identify whether `excludeFromQF` or `includeInQF` is the correct property.Length of output: 108
Script:
#!/bin/bash # Description: Find the definition of `setSuccessDonation` and check the expected property name. # Search for the definition or type of `setSuccessDonation` in TypeScript files rg 'setSuccessDonation' --glob '*.ts' --glob '*.tsx' --context 5 # Expected Result: Identify whether `excludeFromQF` or `includeInQF` is the correct property.Length of output: 9858
Script:
#!/bin/bash # Description: Find the definition of the `ISuccessDonation` interface and verify the expected property names. # Search for the definition of `ISuccessDonation` in TypeScript files rg 'interface ISuccessDonation' --glob '*.ts' --glob '*.tsx' --context 5 # Alternatively, using ast-grep to precisely locate the interface properties ast-grep --lang typescript --pattern $'interface ISuccessDonation { $$$ $_: $_ $$$ }'Length of output: 820
src/components/views/donate/OneTime/SelectTokenModal/QRCodeDonation/QRDonationCard.tsx (1)
327-332
: Verify that translation IDs are defined in locale files.The
formatMessage
function usestextToDisplayOnConnect
as the message ID. Ensure that all possible IDs (label.please_connect_your_wallet_to_win_givbacks_and_match
,label.please_connect_your_wallet_to_win_givbacks
,label.please_connect_your_wallet_to_match
) are defined in your localization files to prevent missing translations.Run the following script to check if all message IDs are present:
Verification successful
All translation IDs are defined in locale files.
Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash # Description: Verify that all translation IDs used are defined in locale JSON files. # Test: Search for the message IDs in locale files. Expect: Each ID should be found at least once. for id in \ "label.please_connect_your_wallet_to_win_givbacks_and_match" \ "label.please_connect_your_wallet_to_win_givbacks" \ "label.please_connect_your_wallet_to_match" do fd --type f --extension json 'locales' --exec grep -H "\"$id\"" {} doneLength of output: 842
Script:
#!/bin/bash # Description: Verify that all translation IDs used are defined in locale JSON files using ripgrep. # Define the array of translation IDs to verify ids=( "label.please_connect_your_wallet_to_win_givbacks_and_match" "label.please_connect_your_wallet_to_win_givbacks" "label.please_connect_your_wallet_to_match" ) # Iterate over each ID and search within locale JSON files for id in "${ids[@]}"; do echo "Checking for translation ID: \"$id\"" if rg -w "\"$id\"" locales/**/*.json > /dev/null; then echo "✅ Found: $id" else echo "❌ Missing: $id" fi echo "-----------------------------" doneLength of output: 1762
Script:
#!/bin/bash # Description: Verify that all translation IDs used are defined in any locale JSON files within the repository. # Define the array of translation IDs to verify ids=( "label.please_connect_your_wallet_to_win_givbacks_and_match" "label.please_connect_your_wallet_to_win_givbacks" "label.please_connect_your_wallet_to_match" ) # Iterate over each ID and search within all JSON files in the repository for id in "${ids[@]}"; do echo "Checking for translation ID: \"$id\"" if rg -w "\"$id\"" --type json > /dev/null; then echo "✅ Found: $id" else echo "❌ Missing: $id" fi echo "-----------------------------" doneLength of output: 1552
src/components/views/donate/OneTime/OneTimeDonationCard.tsx (2)
148-151
: Confirm correctness of 'isOnQFEligibleNetworks' logicThe
isOnQFEligibleNetworks
variable relies onnetworkId
andactiveStartedRound.eligibleNetworks
. Please verify thatnetworkId
is defined and thateligibleNetworks
contains appropriate network IDs to accurately determine eligibility.
Line range hint
289-302
: Review gas fee calculation logicThe
gasFee
calculation assumes that tokens other than the native token (zeroAddress
) do not require gas fees. Verify that this assumption holds true in all cases, especially for tokens that might incur gas costs during transactions.If tokens may have associated gas fees, adjust the condition to ensure accurate fee calculations.
} from '@/components/views/donate/common.styled'; | ||
import { INetworkIdWithChain } from '../common.types'; // Import the type | ||
} from '@/components/views/donate/common/common.styled'; | ||
import { INetworkIdWithChain } from '../common/common.types'; // Import the type |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
💡 Codebase verification
LGTM. Consider removing the comment in SaveGasFees.tsx
.
The import path update for common.types
is consistent with the previous change and looks good.
-
Nitpick: Remove the unnecessary comment in
SaveGasFees.tsx
to maintain cleaner code.- import { INetworkIdWithChain } from '../common/common.types'; // Import the type + import { INetworkIdWithChain } from '../common/common.types';
Analysis chain
LGTM. Consider removing the comment and verify other imports.
The import path update for common.types
is consistent with the previous change and looks good.
Consider removing the comment "Import the type" as it doesn't provide additional value:
-import { INetworkIdWithChain } from '../common/common.types'; // Import the type
+import { INetworkIdWithChain } from '../common/common.types';
To ensure consistency across the codebase, please run the following script to check for any other imports that might need updating:
Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Check for other imports of common.types that might need updating
# Test: Search for old import path. Expect: No results
rg --type typescript "from '\.\./common\.types'" -g '!src/components/views/donate/OneTime/SaveGasFees.tsx'
# Test: Search for new import path. Expect: All imports should use this new path
rg --type typescript "from '\.\./common/common\.types'"
Length of output: 248
Script:
#!/bin/bash
# Description: Check for other imports of common.types that might need updating
# Test: Search for old import path. Expect: No results
rg --type ts "from '\.\./common\.types'" -g '!src/components/views/donate/OneTime/SaveGasFees.tsx'
# Test: Search for new import path. Expect: All imports should use this new path
rg --type ts "from '\.\./common/common\.types'"
Length of output: 417
const CheckBoxContainer = styled.div` | ||
margin-top: 24px; | ||
border-radius: 8px; | ||
border: 1px solid ${neutralColors.gray[300]}; | ||
padding: 16px; | ||
> div:nth-child(2) { | ||
color: ${neutralColors.gray[900]}; | ||
font-size: 12px; | ||
margin-top: 9px; | ||
} | ||
`; | ||
|
||
const Caption = styled.div<{ disabled: boolean }>` | ||
color: ${props => | ||
props.disabled ? neutralColors.gray[600] + ' !important' : 'inherit'}; | ||
`; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Consider simplifying styled components for better maintainability.
The styled components are well-defined, but there's room for improvement:
- The nested selector in
CheckBoxContainer
could be more specific to avoid potential conflicts. - Consider using theme variables for consistent spacing and font sizes.
Here's a suggested refactor:
const CheckBoxContainer = styled.div`
margin-top: ${props => props.theme.spacing.xl};
border-radius: ${props => props.theme.borderRadius.medium};
border: 1px solid ${neutralColors.gray[300]};
padding: ${props => props.theme.spacing.l};
`;
const StyledCaption = styled.div<{ disabled: boolean }>`
color: ${props =>
props.disabled ? neutralColors.gray[600] : neutralColors.gray[900]};
font-size: ${props => props.theme.typography.fontSize.small};
margin-top: ${props => props.theme.spacing.s};
`;
This refactor assumes you have a theme object with spacing, borderRadius, and typography properties. If not, you may need to define these values or use specific pixel values.
const [showModal, setShowModal] = useState(false); | ||
const { isConnected } = useGeneralWallet(); | ||
const { formatMessage } = useIntl(); | ||
const { activeStartedRound } = useDonateData(); | ||
const router = useRouter(); | ||
const isQRDonation = router.query.chain === ChainType.STELLAR.toLowerCase(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Consider using a more robust check for QR donations.
The current implementation for checking if it's a QR donation relies solely on the 'chain' query parameter being 'stellar'. This might lead to false positives if the URL is manipulated.
Consider implementing a more comprehensive check, possibly involving multiple parameters or a dedicated flag from the server. For example:
const isQRDonation = router.query.chain === ChainType.STELLAR.toLowerCase() && router.query.qr === 'true';
This change would require updating the URL generation logic elsewhere in the application to include the 'qr' parameter for QR donations.
const eligibleNetworksWithoutStellar = activeStartedRound?.eligibleNetworks | ||
.filter(network => network !== config.STELLAR_NETWORK_NUMBER) | ||
.map(network => ({ | ||
networkId: network, | ||
chainType: config.EVM_NETWORKS_CONFIG[network] | ||
? ChainType.EVM | ||
: ChainType.SOLANA, | ||
})); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Optimize and add error handling to the network filtering logic.
The current implementation for filtering and mapping eligible networks could be optimized and made more robust with error handling.
Consider the following improvements:
- Use optional chaining to handle potential undefined values.
- Add a type guard to ensure the network exists in the config.
- Use a single reduce operation instead of filter followed by map.
Here's an example implementation:
const eligibleNetworksWithoutStellar = activeStartedRound?.eligibleNetworks.reduce((acc, network) => {
if (network !== config.STELLAR_NETWORK_NUMBER) {
const networkConfig = config.EVM_NETWORKS_CONFIG[network];
if (networkConfig) {
acc.push({
networkId: network,
chainType: networkConfig ? ChainType.EVM : ChainType.SOLANA,
});
} else {
console.warn(`Network ${network} not found in config`);
}
}
return acc;
}, [] as Array<{ networkId: number; chainType: ChainType }>);
This implementation is more efficient and includes error handling for missing network configurations.
if (!activeStartedRound) return null; | ||
return ( | ||
<Wrapper> | ||
<Caption $medium> | ||
{formatMessage({ id: 'label.eligible_networks_for_matching' })} | ||
</Caption> | ||
<IconsWrapper> | ||
{activeStartedRound?.eligibleNetworks?.map(network => ( | ||
<IconWithTooltip | ||
icon={ | ||
<TooltipIconWrapper> | ||
{config.NETWORKS_CONFIG_WITH_ID[ | ||
network | ||
]?.chainLogo(24)} | ||
</TooltipIconWrapper> | ||
} | ||
direction='top' | ||
align='top' | ||
key={network} | ||
> | ||
<SublineBold> | ||
{config.NETWORKS_CONFIG_WITH_ID[network]?.name} | ||
</SublineBold> | ||
</IconWithTooltip> | ||
))} | ||
</IconsWrapper> | ||
{!isQRDonation && isConnected && ( | ||
<ButtonsWrapper> | ||
<OutlineButton | ||
onClick={() => setShowModal(true)} | ||
size='medium' | ||
icon={<IconNetwork24 />} | ||
label={formatMessage({ id: 'label.switch_network' })} | ||
/> | ||
<ExternalLink href={links.ACROSS_BRIDGE}> | ||
<OutlineButton | ||
size='medium' | ||
icon={<IconExternalLink24 />} | ||
label={formatMessage({ id: 'label.bridge_tokens' })} | ||
/> | ||
</ExternalLink> | ||
</ButtonsWrapper> | ||
)} | ||
{showModal && ( | ||
<SwitchNetwork | ||
setShowModal={setShowModal} | ||
customNetworks={eligibleNetworksWithoutStellar} | ||
/> | ||
)} | ||
</Wrapper> | ||
); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Enhance accessibility and performance of the rendered component.
While the rendering logic is generally sound, there are opportunities to improve accessibility and performance.
Consider the following enhancements:
- Add aria-labels to improve accessibility:
<OutlineButton
onClick={() => setShowModal(true)}
size='medium'
icon={<IconNetwork24 />}
label={formatMessage({ id: 'label.switch_network' })}
+ aria-label={formatMessage({ id: 'aria.switch_network' })}
/>
- Memoize the eligibleNetworksWithoutStellar calculation to prevent unnecessary recalculations:
const eligibleNetworksWithoutStellar = useMemo(() => {
// ... (calculation logic here)
}, [activeStartedRound?.eligibleNetworks]);
- Use React.memo for child components that don't need to re-render frequently:
const NetworkIcon = React.memo(({ network }) => (
<IconWithTooltip
icon={
<TooltipIconWrapper>
{config.NETWORKS_CONFIG_WITH_ID[network]?.chainLogo(24)}
</TooltipIconWrapper>
}
direction='top'
align='top'
key={network}
>
<SublineBold>
{config.NETWORKS_CONFIG_WITH_ID[network]?.name}
</SublineBold>
</IconWithTooltip>
));
Then use this memoized component in the render:
{activeStartedRound?.eligibleNetworks?.map(network => (
<NetworkIcon key={network} network={network} />
))}
These changes will improve the component's accessibility and performance, especially when dealing with a large number of eligible networks.
setAmount(selectedTokenBalance - gasFee) | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ensure 'amount' does not become negative
When setting the amount to selectedTokenBalance - gasFee
, there is a possibility that the result could be negative if gasFee
exceeds selectedTokenBalance
. Ensure that the amount
remains zero or positive.
Add a check to prevent negative values:
setAmount(
- selectedTokenBalance - gasFee
+ Math.max(selectedTokenBalance - gasFee, 0n)
);
Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
setAmount(selectedTokenBalance - gasFee) | |
} | |
setAmount(Math.max(selectedTokenBalance - gasFee, 0n)) | |
} |
isProjectGivbacksEligible && | ||
selectedOneTimeToken.isGivbackEligible && | ||
tokenPrice !== undefined && | ||
tokenPrice * projectDonationAmount >= | ||
GIVBACKS_DONATION_QUALIFICATION_VALUE_USD |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Validate existence of 'isGivbackEligible' property
When accessing selectedOneTimeToken.isGivbackEligible
, ensure that selectedOneTimeToken
is defined and that the property isGivbackEligible
exists on the token object to prevent runtime errors.
Add a safety check to verify that selectedOneTimeToken
and its properties are available.
- selectedOneTimeToken.isGivbackEligible &&
+ selectedOneTimeToken?.isGivbackEligible &&
Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
isProjectGivbacksEligible && | |
selectedOneTimeToken.isGivbackEligible && | |
tokenPrice !== undefined && | |
tokenPrice * projectDonationAmount >= | |
GIVBACKS_DONATION_QUALIFICATION_VALUE_USD | |
isProjectGivbacksEligible && | |
selectedOneTimeToken?.isGivbackEligible && | |
tokenPrice !== undefined && | |
tokenPrice * projectDonationAmount >= | |
GIVBACKS_DONATION_QUALIFICATION_VALUE_USD |
const FlexStyled = styled(Flex)<{ disabled: boolean }>` | ||
border-radius: 8px; | ||
background-color: white; | ||
${props => | ||
props.disabled && | ||
` | ||
opacity: 0.5; | ||
pointer-events: none; | ||
`} | ||
`; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ensure 'disabled' prop is optional in styled component
The FlexStyled
component expects a disabled
prop of type boolean
. If disabled
might be undefined, consider making the prop optional to prevent TypeScript errors.
Adjust the prop definition:
- const FlexStyled = styled(Flex)<{ disabled: boolean }>`
+ const FlexStyled = styled(Flex)<{ disabled?: boolean }>`
And update usage accordingly.
Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
const FlexStyled = styled(Flex)<{ disabled: boolean }>` | |
border-radius: 8px; | |
background-color: white; | |
${props => | |
props.disabled && | |
` | |
opacity: 0.5; | |
pointer-events: none; | |
`} | |
`; | |
const FlexStyled = styled(Flex)<{ disabled?: boolean }>` | |
border-radius: 8px; | |
background-color: white; | |
${props => | |
props.disabled && | |
` | |
opacity: 0.5; | |
pointer-events: none; | |
`} | |
`; |
<DonationPrice | ||
disabled={!selectedOneTimeToken || !isConnected} | ||
> | ||
{'$ ' + donationUsdValue.toFixed(2)} | ||
</DonationPrice> | ||
</InputWrapper> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Handle potential NaN values in 'donationUsdValue'
When displaying donationUsdValue
, ensure that it is a valid number before calling .toFixed(2)
. If donationUsdValue
is NaN
, this could cause display issues.
Consider adding a fallback value or a check to handle cases where donationUsdValue
is not a valid number.
- {'$ ' + donationUsdValue.toFixed(2)}
+ {'$ ' + (isNaN(donationUsdValue) ? '0.00' : donationUsdValue.toFixed(2))}
Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
<DonationPrice | |
disabled={!selectedOneTimeToken || !isConnected} | |
> | |
{'$ ' + donationUsdValue.toFixed(2)} | |
</DonationPrice> | |
</InputWrapper> | |
<DonationPrice | |
disabled={!selectedOneTimeToken || !isConnected} | |
> | |
{'$ ' + (isNaN(donationUsdValue) ? '0.00' : donationUsdValue.toFixed(2))} | |
</DonationPrice> | |
</InputWrapper> |
const CryptoDonation: FC<{ | ||
setIsQRDonation: (isQRDonation: boolean) => void; | ||
acceptedTokens: IProjectAcceptedToken[] | undefined; | ||
}> = ({ acceptedTokens, setIsQRDonation }) => { | ||
}> = ({ acceptedTokens }) => { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
💡 Codebase verification
Remaining references to setIsQRDonation
found in the following files:
src/components/views/donate/DonationCard.tsx
src/components/views/donate/OneTime/SelectTokenModal/QRCodeDonation/QRDonationCard.tsx
Analysis chain
Verify removal of 'setIsQRDonation' prop
The setIsQRDonation
prop has been removed from the CryptoDonation
component's props. Please ensure that all references to setIsQRDonation
have been updated or removed throughout the codebase to prevent potential runtime errors.
Run the following script to check for any remaining references:
Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Search for references to 'setIsQRDonation' in the codebase.
rg --type typescript 'setIsQRDonation'
Length of output: 73
Script:
#!/bin/bash
# Description: Search for references to 'setIsQRDonation' in TypeScript files.
rg --glob '*.ts' --glob '*.tsx' 'setIsQRDonation'
Length of output: 656
Summary by CodeRabbit