Skip to content
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

feat: new you have (Portfolio) for Extension mode #1655

Merged
merged 33 commits into from
Nov 16, 2024
Merged

feat: new you have (Portfolio) for Extension mode #1655

merged 33 commits into from
Nov 16, 2024

Conversation

Nick-1979
Copy link
Member

@Nick-1979 Nick-1979 commented Nov 14, 2024

Summary by CodeRabbit

  • New Features

    • Enhanced configurability of the Currency component with new styling options.
    • Introduced a new available property in the YouHave component for better asset tracking.
    • Improved interactivity and layout in the YouHave component with new UI elements.
    • Added a new utility function for handling decimal places.
    • Expanded localization options with the addition of multiple new translation keys related to NFTs in various languages.
    • Introduced a new DecimalPart component for better rendering of decimal values in the FormatPrice component.
    • Updated the HeaderBrand component to enhance menu visibility and interactions.
    • Adjusted visual presentation of balance information in the AccountDetail component.
    • Updated the AccountBrief and Others components to improve font sizes for better readability.
    • Adjusted the AccountDetails component's layout and visual elements for enhanced clarity.
    • Improved presentation of the AccountMenu component with a full-screen dialog.
    • Enhanced the ProfileMenu component with new props for better profile management.
    • Added a new Badge style in the FavoriteChains component for improved visual presentation.
    • Updated the dark and light themes to include new color properties for enhanced customization.
  • Bug Fixes

    • Enhanced error handling in address decoding and recent chains updating functions.
  • Style

    • Updated styling for better visibility in the AiBackgroundImage component and simplified the ThemeChanger component's styling.
    • Minor adjustments to the ProfileTab component for cleaner JSX structure.
    • Adjusted layout dynamics in the Home component to emphasize the YouHave component.
    • Simplified the Menu component's props by using the useTheme hook.
    • Removed specific styling from the ThemeChanger component to enhance visual alignment.
    • Adjusted font sizes and weights in the AccountDetail component for improved visual hierarchy.
    • Enhanced color contrast in the TotalBalancePieChart component for better visibility.
    • Updated the styling of the RemoteNodeSelector and MenuItem components for improved UI clarity.
    • Adjusted the margin and size properties in the AccountIcons and Identicon components for better alignment.

@Nick-1979 Nick-1979 requested a review from AMIRKHANEF November 14, 2024 19:27
Copy link
Contributor

coderabbitai bot commented Nov 14, 2024

Caution

Review failed

The pull request is closed.

Walkthrough

The pull request introduces several modifications across multiple components in the codebase. Key changes include enhancements to the Currency component for improved configurability, updates to the useYouHave hook to include new properties and calculations, and adjustments to the SettingSubMenu, AiBackgroundImage, YouHave, and Home components for visual and structural improvements. Additionally, a new utility function getDecimal is added, and error handling is enhanced in existing functions. These changes collectively aim to improve the flexibility and user experience of the application.

Changes

File Path Change Summary
packages/extension-polkagate/src/fullscreen/homeFullScreen/partials/Currency.tsx Introduced Props interface for Currency component; updated function signature to accept new props for configurability.
packages/extension-polkagate/src/hooks/useYouHave.ts Updated YouHaveType interface to include available; modified useYouHave logic for new asset handling calculations.
packages/extension-polkagate/src/partials/SettingSubMenu.tsx Removed left='4px' from ThemeChanger component to simplify styling; no other logic changes.
packages/extension-polkagate/src/popup/home/AiBackgroundImage.tsx Updated Typography color for better visibility; no changes to logic or control flow.
packages/extension-polkagate/src/popup/home/YouHave.tsx Enhanced UI with new imports and layout adjustments; refined portfolio display logic and icon representations.
packages/extension-polkagate/src/popup/home/index.tsx Removed HeaderBrand component; adjusted YouHave rendering and Container height calculations based on recovery state.
packages/extension/polkagate/src/util/utils.ts Added getDecimal function; modified fixFloatingPoint for better handling of decimal places; enhanced error handling.
packages/extension-polkagate/src/popup/home/ProfileTab.tsx Simplified Typography component by removing fontWeight; modified VaadinIcon closing tag to self-closing syntax.
packages/extension/public/locales/en/translation.json Added new keys for localization, including "available" and others for improved user interface.
packages/extension-polkagate/src/components/FormatPrice.tsx Introduced new DecimalPart component for rendering decimal values; refactored FormatPrice to utilize this new component.
packages/extension-polkagate/src/partials/Menu.tsx Removed theme prop from Props interface; replaced with useTheme hook; redefined COLLAPSIBLE_MENUS as an enum.
packages/extension-polkagate/src/partials/HeaderBrand.tsx Updated RightItem component for conditional rendering; modified menu interaction logic related to onRefresh and showClose.
packages/extension/polkagate/src/popup/home/news.ts Updated notes for version 0.23.0 to enhance clarity and completeness; added new note regarding validators' APY.

Possibly related PRs

Suggested labels

new feature

Suggested reviewers

  • AMIRKHANEF

Poem

In the meadow where changes bloom,
The Currency dances, dispelling gloom.
With colors bright and sizes new,
It brings fresh joy in every view.
A hop, a skip, through code we play,
Enhancing style in a vibrant way! 🐇✨

Warning

Rate limit exceeded

@Nick-1979 has exceeded the limit for the number of commits or files that can be reviewed per hour. Please wait 15 minutes and 54 seconds before requesting another review.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

📥 Commits

Reviewing files that changed from the base of the PR and between 24100db and 05c88fc.


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?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

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)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link
Contributor

@coderabbitai coderabbitai bot left a 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 (11)
packages/extension-polkagate/src/hooks/useYouHave.ts (3)

Line range hint 12-16: Update YouHaveType interface to include available property

The interface is missing the available property that is being returned by the hook. This could lead to TypeScript compilation errors.

Apply this diff to fix the interface:

 export interface YouHaveType {
   change: number;
   date: number;
   portfolio: number;
+  available: number;
 }

60-64: Consider using BN for decimal calculations

While the balance calculations look correct, the change calculation on line 64 involves division with floating-point numbers which could lead to precision issues. Consider using BN throughout for consistent precision handling.

Apply this diff to improve precision handling:

-          change += calcChange(tokenValue, Number(asset.totalBalance) / (10 ** asset.decimal), tokenPriceChange);
+          const tokenBalance = asset.totalBalance.div(new BN(10).pow(new BN(asset.decimal)));
+          change += calcChange(tokenValue, tokenBalance.toNumber(), tokenPriceChange);

69-69: Remove unnecessary type assertion

The type assertion to YouHaveType is redundant since the object structure already matches the interface (after adding the missing available property).

Apply this diff to simplify the return statement:

-    return { available, change, date, portfolio } as unknown as YouHaveType;
+    return { available, change, date, portfolio };
packages/extension-polkagate/src/fullscreen/homeFullScreen/partials/Currency.tsx (1)

30-30: Consider enhancing type safety for theme colors

The implementation looks good, but we could improve type safety for the theme color values.

Consider using MUI's color type definitions:

-const textColor = useMemo(() => color || (theme.palette.mode === 'dark' ? theme.palette.text.primary : theme.palette.text.secondary), [color, theme]);
+const textColor = useMemo<string>(() => color || (theme.palette.mode === 'dark' ? theme.palette.text.primary : theme.palette.text.secondary), [color, theme]);

Also applies to: 35-35

packages/extension-polkagate/src/components/FormatPrice.tsx (3)

77-86: Consider making decimal point handling more flexible

The current implementation forces _decimalPoint to 0 when withSmallDecimal is true, which might be too restrictive. Consider allowing the decimalPoint prop to still take effect even when using small decimals, giving users more control over the main number's format.

 const _decimalPoint = useMemo(() => {
-  if (withSmallDecimal) {
-    return 0;
-  }
-
   if (currency?.code && ASSETS_AS_CURRENCY_LIST.includes(currency.code)) {
     return DECIMAL_POINTS_FOR_CRYPTO_AS_CURRENCY;
   }
   return decimalPoint;
- }, [currency?.code, decimalPoint, withSmallDecimal]);
+ }, [currency?.code, decimalPoint]);

88-98: Consider moving reduceFontSize to a shared utility file

This utility function could be useful in other components. Consider moving it to a shared utility file (e.g., utils.ts) to promote code reuse and maintain DRY principles.


60-60: Consider memoizing the decimal part rendering

The decimal part calculation and rendering could be expensive for frequently updating values. Consider memoizing this part to optimize performance.

+ const MemoizedDecimalPart = React.memo(({ value, ...props }) => (
+   value > 0 && withSmallDecimal
+     ? <Typography {...props}>
+         <DecimalPart value={value} withCountUp={withCountUp} />
+       </Typography>
+     : null
+ ));

  return (
    <Grid item mt={mt} sx={{ height }} textAlign={textAlign}>
      {total !== undefined
        ? <Stack alignItems='baseline' direction='row'>
            <Typography>...</Typography>
-           {withSmallDecimal && Number(total) > 0 &&
-             <Typography
-               fontSize={reduceFontSize(fontSize, 20)}
-               fontWeight={fontWeight}
-               lineHeight={lineHeight}
-               sx={{ color: theme.palette.secondary.contrastText }}
-             >
-               ...
-             </Typography>
-           }
+           <MemoizedDecimalPart
+             value={Number(total)}
+             fontSize={reduceFontSize(fontSize, 20)}
+             fontWeight={fontWeight}
+             lineHeight={lineHeight}
+             sx={{ color: theme.palette.secondary.contrastText }}
+           />
          </Stack>
        : <Skeleton ... />
      }
    </Grid>
  );

Also applies to: 108-148

packages/extension-polkagate/src/popup/home/YouHave.tsx (3)

24-24: Remove unused import pgBoxShadow

The pgBoxShadow utility is imported but never used in this file.

-import { countDecimalPlaces, fixFloatingPoint, pgBoxShadow } from '../../util/utils';
+import { countDecimalPlaces, fixFloatingPoint } from '../../util/utils';
🧰 Tools
🪛 GitHub Check: build

[failure] 24-24:
'pgBoxShadow' is declared but its value is never read.


62-117: Consider extracting portfolio display into a separate component

The conditional rendering block for portfolio display is quite complex with nested Stack components. Consider extracting this into a separate component for better maintainability and reusability.

Example structure:

interface PortfolioDisplayProps {
  youHave: YouHaveType;
  isHideNumbers: boolean;
  currency: CurrencyType;
}

const PortfolioDisplay: React.FC<PortfolioDisplayProps> = ({ youHave, isHideNumbers, currency }) => {
  // Extract the stars display and portfolio content here
};
🧰 Tools
🪛 GitHub Check: build

[failure] 106-106:
Property 'available' does not exist on type 'YouHaveType'.


55-145: Overall well-structured implementation with room for improvement

The component successfully implements the portfolio display with good attention to:

  • Proper price formatting and animations
  • Responsive layout with Grid and Stack
  • Clear conditional rendering logic
  • Theme-aware styling

Consider the following improvements:

  1. Component extraction for better maintainability
  2. Review of absolute positioning usage
  3. Type definition fixes
🧰 Tools
🪛 GitHub Check: build

[failure] 106-106:
Property 'available' does not exist on type 'YouHaveType'.

packages/extension-polkagate/src/util/utils.ts (1)

87-87: Consider breaking down the complex function

While the change to handle decimalDigit === 0 is correct, the fixFloatingPoint function has grown complex with multiple responsibilities. Consider breaking it down into smaller, focused functions for better maintainability.

Consider extracting the following helper functions:

  1. getIntegerPart(number: string): string
  2. getFractionalPart(number: string, digits: number): string
  3. calculateDynamicDecimalDigits(number: string): number

This would make the main function more readable and easier to test.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between d5b66df and c33e855.

📒 Files selected for processing (10)
  • packages/extension-polkagate/src/components/FormatPrice.tsx (5 hunks)
  • packages/extension-polkagate/src/fullscreen/governance/FullScreenHeader.tsx (1 hunks)
  • packages/extension-polkagate/src/fullscreen/homeFullScreen/components/CurrencySwitch.tsx (1 hunks)
  • packages/extension-polkagate/src/fullscreen/homeFullScreen/partials/Currency.tsx (2 hunks)
  • packages/extension-polkagate/src/hooks/useYouHave.ts (2 hunks)
  • packages/extension-polkagate/src/partials/SettingSubMenu.tsx (1 hunks)
  • packages/extension-polkagate/src/popup/home/AiBackgroundImage.tsx (1 hunks)
  • packages/extension-polkagate/src/popup/home/YouHave.tsx (2 hunks)
  • packages/extension-polkagate/src/popup/home/index.tsx (2 hunks)
  • packages/extension-polkagate/src/util/utils.ts (3 hunks)
✅ Files skipped from review due to trivial changes (2)
  • packages/extension-polkagate/src/partials/SettingSubMenu.tsx
  • packages/extension-polkagate/src/popup/home/AiBackgroundImage.tsx
🧰 Additional context used
🪛 GitHub Check: build
packages/extension-polkagate/src/popup/home/YouHave.tsx

[failure] 24-24:
'pgBoxShadow' is declared but its value is never read.


[failure] 106-106:
Property 'available' does not exist on type 'YouHaveType'.

🔇 Additional comments (12)
packages/extension-polkagate/src/hooks/useYouHave.ts (2)

48-50: LGTM!

The initialization of accumulator variables is correct and follows best practices.


Line range hint 48-69: Verify the hook usage in components

The hook's return type has changed significantly. Let's verify that all components using this hook have been updated accordingly.

✅ Verification successful

No breaking changes detected in hook usage

The verification shows that the hook's interface YouHaveType and its usage are consistent across the codebase:

  • The YouHaveType interface includes all fields returned by the hook: available, change, date, and portfolio
  • All components using the hook (YouHave.tsx and TotalBalancePieChart.tsx) handle the nullable return type correctly
  • The hook's return type signature YouHaveType | undefined | null remains unchanged
  • The changes in the implementation maintain backward compatibility with existing consumers
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Search for components using useYouHave hook
echo "Components using useYouHave:"
rg -l "useYouHave" --type tsx

# Check specific usage patterns
echo "\nUsage patterns:"
rg "useYouHave\(\)" -A 3 --type tsx

Length of output: 235


Script:

#!/bin/bash
# Search for components using useYouHave hook with correct file extension
echo "Components using useYouHave:"
rg -l "useYouHave"

# Check specific usage patterns
echo "\nUsage patterns:"
rg "useYouHave" -B 2 -A 3

Length of output: 6180


Script:

#!/bin/bash
# Check the type definition and its usage
echo "Type definition and usage of YouHaveType:"
rg "YouHaveType" -B 2 -A 2

# Check how the hook's return values are used
echo "\nUsage of hook's return values:"
rg "const.*youHave.*=.*useYouHave" -B 0 -A 5

Length of output: 3887

packages/extension-polkagate/src/fullscreen/homeFullScreen/partials/Currency.tsx (1)

21-28: LGTM! Well-structured Props interface

The Props interface is well-defined with optional styling properties, following TypeScript best practices.

packages/extension-polkagate/src/fullscreen/homeFullScreen/components/CurrencySwitch.tsx (1)

Line range hint 1-108: Well-structured implementation with good React practices

The overall implementation demonstrates good React practices:

  • Proper use of React.memo for optimization
  • Effective use of useCallback for memoized handlers
  • Well-implemented search functionality with proper state management
  • Clean separation of concerns and container pattern
  • Type-safe implementation with proper interfaces
packages/extension-polkagate/src/components/FormatPrice.tsx (1)

6-6: LGTM: Clean interface and import updates

The new imports and prop interface updates are well-structured and properly typed.

Also applies to: 12-12, 32-32

packages/extension-polkagate/src/popup/home/index.tsx (2)

97-97: Verify the YouHave component implementation

The YouHave component is rendered without any props. Ensure this is intentional and that the component handles the no-props scenario gracefully.

✅ Verification successful

Let me gather more information about the YouHave component implementation to verify if it's designed to work without props.


No props needed - YouHave component is correctly implemented

The YouHave component is designed to work without props as it internally uses custom hooks to fetch all required data:

  • useYouHave() - provides portfolio value, price changes, and timestamps
  • useCurrency() - provides currency information
  • useIsHideNumbers() - manages balance visibility state

The component is properly implemented with all necessary data being sourced through hooks and context.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Check YouHave component's props and implementation
# Look for required props and default prop values

# Check YouHave component implementation
ast-grep --pattern 'export $_ function YouHave($_) {
  $$$
}'

# Check for PropTypes or TypeScript interface definitions
rg -A 5 'interface.*YouHave(Props)?' 
rg -A 5 'type.*YouHave(Props)?'

Length of output: 1187


Script:

#!/bin/bash
# Check the full implementation of YouHave component
cat packages/extension-polkagate/src/popup/home/YouHave.tsx

# Check if there's any hook that might provide default values
cat packages/extension-polkagate/src/hooks/useYouHave.ts

Length of output: 8943


112-112: Review the increased height deductions

The Container's maxHeight calculation now deducts more space (252px with recovery, 197px without). This reduces the scrollable area. Please verify that:

  1. The content still fits comfortably
  2. There's no cut-off UI elements
  3. The scrolling behavior remains smooth
✅ Verification successful

Let me analyze the search results to verify the height calculations.


The git history shows that the height deduction was increased from 220px/165px to 252px/197px (a difference of 32px in both cases). Let's check the surrounding UI components to understand the layout context better.


Based on the complete context, I can now generate the final response:

Height adjustment is part of UI layout improvements

The height calculation change (from 220/165px to 252/197px) is tied to recent UI improvements where the YouHave component's layout was restructured and other styling adjustments were made. The changes appear intentional and maintain proper spacing with the new layout structure, including:

  • YouHave component's new styling
  • Warning component for recovery detection
  • ProfileTabs component
  • Proper scroll behavior for AccountsTree items
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Look for related height calculations or UI layout configurations

# Search for similar height calculations
rg 'innerHeight.*252|innerHeight.*197'

# Look for Container styling patterns
rg 'maxHeight.*innerHeight'

Length of output: 7074


Script:

#!/bin/bash
# Let's look for the previous version of this height calculation to understand the change
git log -p packages/extension-polkagate/src/popup/home/index.tsx | grep -A 5 -B 5 "innerHeight.*197"

# Also search for any related UI components or layout elements in this file
rg -A 5 -B 5 "Container.*disableGutters" packages/extension-polkagate/src/popup/home/index.tsx

Length of output: 791


Script:

#!/bin/bash
# Look for the components and layout structure in the home index file
cat packages/extension-polkagate/src/popup/home/index.tsx

# Also check for any recent commits that might explain this height adjustment
git log -p -n 3 packages/extension-polkagate/src/popup/home/index.tsx

Length of output: 9915

packages/extension-polkagate/src/fullscreen/governance/FullScreenHeader.tsx (1)

36-40: LGTM! The style changes improve layout flexibility.

The modifications to HEADER_COMPONENT_STYLE enhance the component's adaptability:

  • Setting minWidth: '42px' ensures the component maintains a minimum readable size
  • Changing width to 'fit-content' allows the component to naturally adapt to its content

Let's verify these style changes don't cause layout issues in other components:

✅ Verification successful

Style changes are safe and consistent with other components

The verification shows that HEADER_COMPONENT_STYLE is used in multiple components:

  • Currency.tsx
  • FavoriteChains.tsx
  • HideBalance.tsx
  • ThemeChanger.tsx

The style changes (minWidth: '42px' and width: 'fit-content') are appropriate because:

  1. The height: '42px' is already defined, so adding minWidth: '42px' maintains a square aspect ratio for the smallest state
  2. The style is used in header-related components that need flexible width to accommodate different content sizes
  3. All components using this style are UI elements that benefit from content-based sizing
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Search for other components using HEADER_COMPONENT_STYLE
rg "HEADER_COMPONENT_STYLE" --type tsx --type ts

# Look for potential layout-related issues in existing bug reports
gh issue list --label "bug,ui,layout" --json title,body --jq '.[] | select(.title | contains("header") or contains("layout") or contains("style"))'

Length of output: 224


Script:

#!/bin/bash
# Search for HEADER_COMPONENT_STYLE using ripgrep with correct file extensions
rg "HEADER_COMPONENT_STYLE" -t ts -t tsx

# Search for files that might import or use this style
rg -t ts -t tsx "FullScreenHeader" -A 2 -B 2

# Look for similar header style patterns
rg -t ts -t tsx "position:\s*'relative'.*width:\s*'fit-content'" -A 2 -B 2

Length of output: 258


Script:

#!/bin/bash
# Search for files containing HEADER_COMPONENT_STYLE
fd . -e ts -e tsx -x grep -l "HEADER_COMPONENT_STYLE" {}

# Search for files containing FullScreenHeader
fd . -e ts -e tsx -x grep -l "FullScreenHeader" {}

# Look at the content of the FullScreenHeader.tsx file
cat packages/extension-polkagate/src/fullscreen/governance/FullScreenHeader.tsx

Length of output: 9373

packages/extension-polkagate/src/popup/home/YouHave.tsx (3)

40-48: LGTM: Well-implemented portfolio change calculation

The calculation includes proper null checks and precise decimal handling.


92-100: LGTM: Well-implemented price change animation

The CountUp animation with proper decimal handling and sign prefixing provides a good user experience for price changes.


118-124: Review menu positioning strategy

The current implementation uses absolute positioning for the menu button. Consider using flex layout for better responsiveness and maintainability.

Let's check if this positioning strategy is consistent across the codebase:

#!/bin/bash
# Search for similar absolute positioning patterns
rg -l "position: 'absolute'" --type tsx
packages/extension-polkagate/src/util/utils.ts (1)

59-63: Verify integration with FormatPrice component

The new getDecimal function is intended to be used by the FormatPrice component. Let's verify this integration.

✅ Verification successful

The shell script results show that getDecimal is indeed imported and used in the FormatPrice component as well as in the Filters component. Let me verify the actual implementation to ensure it's being used correctly.


Based on the git history and code changes, I can now provide a final response about the integration of getDecimal with the FormatPrice component.

Integration with FormatPrice component is correctly implemented

The getDecimal function is properly imported and used in the FormatPrice component in two scenarios:

  • When withSmallDecimal prop is true, it's used to display decimal parts separately with a smaller font size
  • The implementation is consistent with the component's purpose of formatting price displays
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the usage of getDecimal function in FormatPrice component

# Search for imports of getDecimal
rg "import.*getDecimal.*from.*utils" -A 5

# Search for usage of getDecimal function
rg "getDecimal\(" -A 5

Length of output: 2104


Script:

#!/bin/bash
# Get the implementation of FormatPrice component to verify correct usage
ast-grep --pattern 'export function FormatPrice($_) {
  $$$
}'

# Also get the implementation of the previous version of decimal handling in FormatPrice
git log -p packages/extension-polkagate/src/components/FormatPrice.tsx

Length of output: 36706

@PolkaGate PolkaGate deleted a comment from coderabbitai bot Nov 15, 2024
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 4

🧹 Outside diff range and nitpick comments (3)
packages/extension-polkagate/src/hooks/useYouHave.ts (2)

Line range hint 56-67: Consider optimizing nested loops and improving readability

The nested loops for calculating portfolio values could benefit from optimization and better structure:

  1. The deep nesting (3 levels) makes the code harder to follow
  2. Multiple optional chaining operators (?.) could be simplified

Consider extracting the calculation logic into a separate function:

+ const calculateAssetValues = (asset: Asset, prices: Prices) => {
+   const tokenValue = prices[asset.priceId]?.value ?? 0;
+   const tokenPriceChange = prices[asset.priceId]?.change ?? 0;
+   
+   return {
+     assetPrice: calcPrice(tokenValue, asset.totalBalance, asset.decimal),
+     availablePrice: calcPrice(tokenValue, asset.availableBalance, asset.decimal),
+     priceChange: calcChange(
+       tokenValue,
+       Number(asset.totalBalance) / (10 ** asset.decimal),
+       tokenPriceChange
+     )
+   };
+ };

  Object.entries(balances).forEach(([address, chains]) => {
    Object.values(chains).forEach((assets) => {
      assets.forEach((asset) => {
-       const tokenValue = pricesInCurrencies.prices[asset.priceId]?.value ?? 0;
-       const tokenPriceChange = pricesInCurrencies.prices[asset.priceId]?.change ?? 0;
-       const currentAssetPrice = calcPrice(tokenValue, asset.totalBalance, asset.decimal);
-       const currentAvailableAssetPrice = calcPrice(tokenValue, asset.availableBalance, asset.decimal);
-       
-       portfolio += currentAssetPrice;
-       available += currentAvailableAssetPrice;
-       change += calcChange(tokenValue, Number(asset.totalBalance) / (10 ** asset.decimal), tokenPriceChange);
+       const values = calculateAssetValues(asset, pricesInCurrencies.prices);
+       portfolio += values.assetPrice;
+       available += values.availablePrice;
+       change += values.priceChange;
      });
    });
  });

70-70: Remove unnecessary type assertion

The type assertion as unknown as YouHaveType is redundant since the returned object structure already matches the YouHaveType interface.

- return { available, change, date, portfolio } as unknown as YouHaveType;
+ return { available, change, date, portfolio };
packages/extension-polkagate/src/popup/home/YouHave.tsx (1)

40-48: Consider memoizing the fixFloatingPoint result

The portfolioChange calculation could be optimized by memoizing the fixFloatingPoint result separately.

Consider this refactoring:

 const portfolioChange = useMemo(() => {
   if (!youHave?.change) {
     return 0;
   }

-  const value = fixFloatingPoint(youHave.change, PORTFOLIO_CHANGE_DECIMAL, false, true);
-
-  return parseFloat(value);
+  return parseFloat(fixFloatingPoint(youHave.change, PORTFOLIO_CHANGE_DECIMAL, false, true));
 }, [youHave?.change]);
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between c33e855 and 1735b0d.

📒 Files selected for processing (3)
  • packages/extension-polkagate/src/hooks/useYouHave.ts (3 hunks)
  • packages/extension-polkagate/src/popup/home/YouHave.tsx (2 hunks)
  • packages/extension/public/locales/en/translation.json (1 hunks)
🔇 Additional comments (5)
packages/extension-polkagate/src/hooks/useYouHave.ts (3)

Line range hint 13-17: LGTM: Interface extension is well-structured

The addition of the available property to YouHaveType interface is a logical extension to differentiate between total portfolio value and available balance.


49-51: Variable declarations are clear and well-named

The new variables portfolio, available, and change clearly represent their intended purposes.


61-65: Verify the usage of available balance in dependent components

The new available balance calculations look correct, but we should verify that components consuming this hook handle both total and available balances appropriately.

✅ Verification successful

Let me analyze the usage of available balance in the components. I'll check how the available property from useYouHave is consumed.


Based on the analysis of the components using the useYouHave hook and the available balance, I can now provide a final response:

Available balance calculations are correctly handled in dependent components

The verification shows that the available balance is properly consumed:

  • In YouHave.tsx, it's correctly displayed as a separate value below the total portfolio
  • In TotalBalancePieChart.tsx and TotalChart.tsx, the calculations properly handle both total and available balances for asset aggregation
  • The changes maintain backward compatibility with existing display patterns
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Search for components using useYouHave hook
rg -l "useYouHave" packages/extension-polkagate/src/

# Check how the available property is accessed
rg "\.available" packages/extension-polkagate/src/

Length of output: 4229


Script:

#!/bin/bash
# Check the implementation of YouHave component which directly uses the available property
cat packages/extension-polkagate/src/popup/home/YouHave.tsx

# Check the pie chart implementations to see how they handle the available balance
cat packages/extension-polkagate/src/fullscreen/homeFullScreen/partials/TotalBalancePieChart.tsx
cat packages/extension-polkagate/src/fullscreen/accountDetails/components/TotalChart.tsx

Length of output: 24953

packages/extension-polkagate/src/popup/home/YouHave.tsx (1)

26-27: LGTM! Clear and focused helper function

The isPriceOutdated function has a clear purpose and proper null checks.

packages/extension/public/locales/en/translation.json (1)

1464-1465: LGTM! Translation keys are properly added.

The changes look good:

  1. Added trailing comma after "Track Id" for better git diffs
  2. Added new "available" key for the YouHaveType interface changes

packages/extension-polkagate/src/popup/home/YouHave.tsx Outdated Show resolved Hide resolved
packages/extension-polkagate/src/popup/home/YouHave.tsx Outdated Show resolved Hide resolved
packages/extension-polkagate/src/popup/home/YouHave.tsx Outdated Show resolved Hide resolved
packages/extension-polkagate/src/popup/home/YouHave.tsx Outdated Show resolved Hide resolved
@Nick-1979 Nick-1979 changed the title New you have (Portfolio) for Extension mode Feat: new you have (Portfolio) for Extension mode Nov 15, 2024
@Nick-1979 Nick-1979 changed the title Feat: new you have (Portfolio) for Extension mode feat: new you have (Portfolio) for Extension mode Nov 15, 2024
Copy link
Contributor

@coderabbitai coderabbitai bot left a 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

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between 16549ba and 3dad7ca.

📒 Files selected for processing (1)
  • packages/extension-polkagate/src/fullscreen/homeFullScreen/partials/Currency.tsx (2 hunks)
🧰 Additional context used
🪛 GitHub Check: build
packages/extension-polkagate/src/fullscreen/homeFullScreen/partials/Currency.tsx

[failure] 30-30:
'bgcolor' is declared but its value is never read.


[failure] 30-30:
'height' is declared but its value is never read.


[failure] 30-30:
'minWidth' is declared but its value is never read.


[failure] 30-30:
'noBorder' is declared but its value is never read.

🔇 Additional comments (4)
packages/extension-polkagate/src/fullscreen/homeFullScreen/partials/Currency.tsx (4)

21-28: LGTM! Well-structured Props interface

The Props interface is well-defined with proper TypeScript types and follows good naming conventions.


36-36: LGTM! Well-implemented color handling

The textColor logic is well-implemented with:

  • Proper use of useMemo for performance
  • Good fallback strategy using theme colors
  • Correct dependency array

60-62: LGTM! Typography component properly updated

The Typography component correctly uses the new fontSize prop and textColor.


Line range hint 66-78: Extract Dialog styles for better maintainability

The Dialog component contains complex inline styles that could be extracted into a separate styles object or styled component.

🧰 Tools
🪛 GitHub Check: build

[failure] 30-30:
'bgcolor' is declared but its value is never read.


[failure] 30-30:
'height' is declared but its value is never read.


[failure] 30-30:
'minWidth' is declared but its value is never read.


[failure] 30-30:
'noBorder' is declared but its value is never read.

Copy link
Contributor

@coderabbitai coderabbitai bot left a 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 (1)
packages/extension-polkagate/src/popup/home/YouHave.tsx (1)

38-52: Consider using more descriptive state variable names

The menu state management is implemented correctly, but consider renaming for clarity.

-const [isMenuOpen, setOpenMenu] = useState(false);
+const [isPortfolioMenuOpen, setPortfolioMenuOpen] = useState(false);

-const onMenuClick = useCallback(() => {
-  setOpenMenu((open) => !open);
+const onPortfolioMenuClick = useCallback(() => {
+  setPortfolioMenuOpen((open) => !open);
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between 3dad7ca and dfb792f.

📒 Files selected for processing (4)
  • packages/extension-polkagate/src/fullscreen/homeFullScreen/partials/Currency.tsx (3 hunks)
  • packages/extension-polkagate/src/popup/home/ProfileTab.tsx (1 hunks)
  • packages/extension-polkagate/src/popup/home/YouHave.tsx (2 hunks)
  • packages/extension/public/locales/en/translation.json (1 hunks)
✅ Files skipped from review due to trivial changes (1)
  • packages/extension-polkagate/src/popup/home/ProfileTab.tsx
🚧 Files skipped from review as they are similar to previous changes (1)
  • packages/extension-polkagate/src/fullscreen/homeFullScreen/partials/Currency.tsx
🔇 Additional comments (6)
packages/extension-polkagate/src/popup/home/YouHave.tsx (5)

72-78: LGTM! Currency component integration

The Currency component is well-configured with appropriate props for flexibility.


91-99: Add aria-label for accessibility

The previous review comment about adding aria-label for screen readers is still valid.


117-122: Enhance menu button accessibility

The previous review comment about adding tooltip and aria-label to the menu button is still valid.


134-138: Add alt text to logo image

The previous review comment about adding alt text to the logo image is still valid.


105-105: Fix type definition for YouHaveType interface

The previous review comment about adding the 'available' property to YouHaveType interface is still valid.

packages/extension/public/locales/en/translation.json (1)

1465-1466: LGTM! The new translation entries are well-formatted.

The additions follow the existing patterns and naming conventions in the translation file. The entries are properly integrated and support the UI changes in the useYouHave hook.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🧹 Outside diff range and nitpick comments (1)
packages/extension-polkagate/src/popup/home/YouHave.tsx (1)

55-55: Consider simplifying the Grid structure

The nested Grid structure could be simplified to improve maintainability. Consider using Stack components where appropriate.

-    <Grid alignItems='flex-start' container sx={{ bgcolor: 'background.paper', borderRadius: '10px', minHeight: '125px', m: '20px 10px 10px', width: '100%', boxShadow: isDark ? '3px 2px 15px rgba(255, 255, 255, 0.25)' : '2px 3px 4px 2px rgba(0, 0, 0, 0.10)' }}>
+    <Stack alignItems='flex-start' sx={{ bgcolor: 'background.paper', borderRadius: '10px', minHeight: '125px', m: '20px 10px 10px', width: '100%', boxShadow: isDark ? '3px 2px 15px rgba(255, 255, 255, 0.25)' : '2px 3px 4px 2px rgba(0, 0, 0, 0.10)' }}>
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between dfb792f and 81f0147.

📒 Files selected for processing (1)
  • packages/extension-polkagate/src/popup/home/YouHave.tsx (2 hunks)
🔇 Additional comments (5)
packages/extension-polkagate/src/popup/home/YouHave.tsx (5)

26-27: LGTM: Clear and well-implemented helper function

The isPriceOutdated function correctly uses the PRICE_VALIDITY_PERIOD constant to determine if the price data is stale.


40-48: LGTM: Well-implemented memoization and calculation

The portfolio change calculation is properly memoized and handles edge cases correctly.


105-105: Update YouHaveType interface to include available property

This issue was previously identified. The YouHaveType interface needs to be updated to include the available property to match its usage here.


91-99: 🛠️ Refactor suggestion

Add aria-label for portfolio change value

The portfolio change display should be accessible to screen readers.

-                <Typography sx={{ color: !youHave?.change ? 'secondary.contrastText' : youHave.change > 0 ? 'success.main' : 'warning.main', fontSize: '15px', fontWeight: 400 }}>
+                <Typography 
+                  aria-label={t('Portfolio change in last {{hours}} hours: {{change}}', { hours: COIN_GECKO_PRICE_CHANGE_DURATION, change: portfolioChange })}
+                  sx={{ color: !youHave?.change ? 'secondary.contrastText' : youHave.change > 0 ? 'success.main' : 'warning.main', fontSize: '15px', fontWeight: 400 }}
+                >

Likely invalid or redundant comment.


13-13: Consider standardizing star icons across the application

The change from stars6 to stars5 icons creates inconsistency with other parts of the application that still use stars6 icons (e.g., in TotalBalancePieChart.tsx).

packages/extension-polkagate/src/popup/home/YouHave.tsx Outdated Show resolved Hide resolved
packages/extension-polkagate/src/popup/home/YouHave.tsx Outdated Show resolved Hide resolved
Copy link
Contributor

@coderabbitai coderabbitai bot left a 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 (3)
packages/extension-polkagate/src/components/FormatPrice.tsx (1)

61-69: LGTM! Clean extraction of decimal rendering logic.

The new DecimalPart component successfully implements the suggestion from the past review, reducing code duplication and improving maintainability.

Consider tightening the type safety by making withCountUp non-optional since it's used in a boolean context:

-const DecimalPart = ({ value, withCountUp }: { value: string | number, withCountUp: boolean | undefined }) => (
+const DecimalPart = ({ value, withCountUp }: { value: string | number, withCountUp: boolean }) => (
packages/extension-polkagate/src/popup/home/YouHave.tsx (2)

40-48: Simplify portfolio change calculation

The portfolio change calculation can be simplified for better readability.

-  const portfolioChange = useMemo(() => {
-    if (!youHave?.change) {
-      return 0;
-    }
-
-    const value = fixFloatingPoint(youHave.change, PORTFOLIO_CHANGE_DECIMAL, false, true);
-
-    return parseFloat(value);
-  }, [youHave?.change]);
+  const portfolioChange = useMemo(() => 
+    youHave?.change
+      ? parseFloat(fixFloatingPoint(youHave.change, PORTFOLIO_CHANGE_DECIMAL, false, true))
+      : 0
+  , [youHave?.change]);

55-61: Extract header section into a separate component

The Grid structure is becoming complex. Consider extracting the header section into a reusable component for better maintainability.

interface PortfolioHeaderProps {
  title: string;
  isDark: boolean;
}

const PortfolioHeader: React.FC<PortfolioHeaderProps> = ({ title, isDark }) => (
  <Grid container sx={{ position: 'relative', px: '10px', py: '5px' }}>
    <Grid container item sx={{ textAlign: 'left' }}>
      <Typography sx={{ fontSize: '16px', fontVariant: 'small-caps', fontWeight: 400, mt: '10px' }}>
        {title}
      </Typography>
    </Grid>
  </Grid>
);
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between 81f0147 and ebc8e45.

📒 Files selected for processing (2)
  • packages/extension-polkagate/src/components/FormatPrice.tsx (2 hunks)
  • packages/extension-polkagate/src/popup/home/YouHave.tsx (2 hunks)
🔇 Additional comments (1)
packages/extension-polkagate/src/components/FormatPrice.tsx (1)

148-151: LGTM! Clean integration of DecimalPart component.

The component is properly integrated with correct props and styling context.

packages/extension-polkagate/src/popup/home/YouHave.tsx Outdated Show resolved Hide resolved
Copy link
Contributor

@coderabbitai coderabbitai bot left a 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 (3)
packages/extension-polkagate/src/popup/home/YouHave.tsx (3)

40-48: Simplify portfolio change calculation

The portfolio change calculation can be simplified for better readability.

-  const portfolioChange = useMemo(() => {
-    if (!youHave?.change) {
-      return 0;
-    }
-
-    const value = fixFloatingPoint(youHave.change, PORTFOLIO_CHANGE_DECIMAL, false, true);
-
-    return parseFloat(value);
-  }, [youHave?.change]);
+  const portfolioChange = useMemo(() => 
+    youHave?.change 
+      ? parseFloat(fixFloatingPoint(youHave.change, PORTFOLIO_CHANGE_DECIMAL, false, true))
+      : 0
+  , [youHave?.change]);

62-100: Consider extracting portfolio display into a separate component

The nested Grid and Stack structure is becoming complex. Consider extracting the portfolio display section into a separate component for better maintainability and reusability.

Example structure:

interface PortfolioDisplayProps {
  youHave: YouHaveType;
  currency: CurrencyType;
  portfolioChange: number;
}

const PortfolioDisplay: React.FC<PortfolioDisplayProps> = ({ youHave, currency, portfolioChange }) => {
  // Extract the Stack and FormatPrice components here
};

Line range hint 29-53: Add explicit error and loading state handling

The component could benefit from explicit error and loading state handling for better user experience.

Consider adding:

  1. Error boundary or error state handling for failed data fetches
  2. Loading state handling beyond the skeleton provided by FormatPrice
  3. Feedback for outdated prices

Example implementation:

const { error, loading, youHave } = useYouHave();

if (error) {
  return <ErrorDisplay error={error} />;
}

if (loading) {
  return <LoadingDisplay />;
}
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between ebc8e45 and 9ed7ed6.

📒 Files selected for processing (1)
  • packages/extension-polkagate/src/popup/home/YouHave.tsx (2 hunks)
🔇 Additional comments (1)
packages/extension-polkagate/src/popup/home/YouHave.tsx (1)

136-141: Good accessibility improvement!

The addition of alt text to the logo image improves accessibility. This is a good practice.

Copy link
Contributor

@coderabbitai coderabbitai bot left a 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 (4)
packages/extension-polkagate/src/popup/home/YouHave.tsx (3)

55-55: Consider using theme elevation instead of custom shadows

The custom shadow implementation could be replaced with Material-UI's elevation system for better theme consistency.

-sx={{ bgcolor: 'background.paper', borderRadius: '10px', minHeight: '125px', m: '20px 4% 10px', width: '100%', boxShadow: isDark ? '3px 2px 15px rgba(255, 255, 255, 0.25)' : '2px 3px 4px 2px rgba(0, 0, 0, 0.10)' }}
+sx={{ bgcolor: 'background.paper', borderRadius: '10px', minHeight: '125px', m: '20px 4% 10px', width: '100%', elevation: 3 }}

92-99: Consider adding error boundary for CountUp component

While the CountUp implementation is good, adding an error boundary would help gracefully handle any animation failures.

+const PortfolioChangeDisplay = ({ change, currency, duration }) => {
+  if (typeof change !== 'number') return null;
+  
+  return (
   <CountUp
     decimals={countDecimalPlaces(portfolioChange) || PORTFOLIO_CHANGE_DECIMAL}
     duration={1}
     end={portfolioChange}
     prefix={`${changeSign(youHave?.change)}${currency?.sign}`}
     suffix={`(${COIN_GECKO_PRICE_CHANGE_DURATION}h)`}
   />
+  );
+};

72-78: Consider making dialogLeft value configurable

The hardcoded dialogLeft value (64) should be made configurable through theme constants or component props for better maintainability.

+const CURRENCY_DIALOG_OFFSET = 64;

 <Currency
   color='secondary.light'
-  dialogLeft={64}
+  dialogLeft={CURRENCY_DIALOG_OFFSET}
   fontSize='25px'
   height='27px'
   minWidth='27px'
 />
packages/extension-polkagate/src/partials/Menu.tsx (1)

25-30: Consider using explicit enum values for better maintainability

While using an enum is good for type safety, consider explicitly defining the values to prevent unintended changes if the enum order is modified in the future.

 const enum COLLAPSIBLE_MENUS {
-  NONE,
-  NEW_ACCOUNT,
-  IMPORT_ACCOUNT,
-  SETTING
+  NONE = 0,
+  NEW_ACCOUNT = 1,
+  IMPORT_ACCOUNT = 2,
+  SETTING = 3
 }
🧰 Tools
🪛 Biome

[error] 24-30: The enum declaration should not be const

Const enums are not supported by bundlers and are incompatible with the 'isolatedModules' mode. Their use can lead to import inexistent values.
See TypeScript Docs for more details.
Safe fix: Turn the const enum into a regular enum.

(lint/suspicious/noConstEnum)

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between 9ed7ed6 and 28e609d.

📒 Files selected for processing (2)
  • packages/extension-polkagate/src/partials/Menu.tsx (2 hunks)
  • packages/extension-polkagate/src/popup/home/YouHave.tsx (2 hunks)
🔇 Additional comments (4)
packages/extension-polkagate/src/popup/home/YouHave.tsx (1)

40-48: LGTM: Well-implemented portfolio change calculation

The implementation properly handles edge cases, uses appropriate precision, and is correctly memoized for performance.

packages/extension-polkagate/src/partials/Menu.tsx (3)

8-8: LGTM: Proper usage of MUI's useTheme hook

The addition of useTheme import is appropriate for accessing theme context directly within the component.


20-22: LGTM: Props interface simplified

Good refactor to remove the theme prop in favor of useTheme hook, reducing prop drilling and following React best practices.


34-39: LGTM: Clean implementation of theme context

The component properly implements the theme context using the useTheme hook, and the state initialization with COLLAPSIBLE_MENUS.SETTING is type-safe.

Copy link
Contributor

@coderabbitai coderabbitai bot left a 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 (2)
packages/extension/public/locales/zh/translation.json (1)

1422-1458: Review NFT-related translations

The NFT-related translations look good overall, with accurate and culturally appropriate Chinese translations. However, there are a few suggestions for improvement:

  1. Consider using "数字藏品" instead of "NFT" in some places, as it's more commonly used in Chinese markets.
  2. The translation "独特项目" for "Uniques" might be confusing - consider "独特资产" instead.
packages/extension/public/locales/fr/translation.json (1)

1419-1454: LGTM with minor suggestions for NFT-related translations

The translations are generally good, but consider these refinements for better clarity:

  • "NFT Detail" → "Détails du NFT" (more natural in French)
  • "Unique Detail" → "Détails de l'objet unique" (more descriptive)
  • "Items" → "Éléments" (more commonly used in French UI)
-  "NFT Detail": "Détail NFT",
+  "NFT Detail": "Détails du NFT",
-  "Unique Detail": "Détail unique",
+  "Unique Detail": "Détails de l'objet unique",
-  "Items": "Articles",
+  "Items": "Éléments",
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between e6117b0 and 811769a.

📒 Files selected for processing (6)
  • packages/extension-polkagate/src/partials/HeaderBrand.tsx (0 hunks)
  • packages/extension/public/locales/en/translation.json (1 hunks)
  • packages/extension/public/locales/fr/translation.json (1 hunks)
  • packages/extension/public/locales/hi/translation.json (1 hunks)
  • packages/extension/public/locales/ru/translation.json (1 hunks)
  • packages/extension/public/locales/zh/translation.json (1 hunks)
💤 Files with no reviewable changes (1)
  • packages/extension-polkagate/src/partials/HeaderBrand.tsx
🚧 Files skipped from review as they are similar to previous changes (1)
  • packages/extension/public/locales/en/translation.json
🔇 Additional comments (9)
packages/extension/public/locales/zh/translation.json (2)

1459-1460: Review governance-related translations

The translations for referendum and track IDs are accurate and consistent with the rest of the governance-related terms in the file.


1461-1462: Review currency/balance-related translations

The translations for currency selection and availability status are accurate and consistent with common Chinese financial terminology.

packages/extension/public/locales/hi/translation.json (2)

1416-1449: LGTM! NFT-related translations are complete and accurate.

The Hindi translations for NFT functionality maintain proper grammar while keeping technical terms like "NFT" unchanged. The translations are user-friendly and consistent with the UI context.


1450-1455: LGTM! Staking and governance translations are properly localized.

The translations appropriately handle technical terms (keeping "APY" as-is) while providing clear Hindi translations for other terms. The translations maintain consistency with existing terminology in the application.

packages/extension/public/locales/ru/translation.json (3)

1414-1447: NFT-related translations look good!

The translations maintain consistency and clarity while preserving technical terms appropriately. The Russian translations accurately convey the meaning of the NFT-related features.


1448-1453: Feature translations are accurate and well-formatted!

The translations maintain technical accuracy while being natural in Russian. Technical terms like "APY" are appropriately preserved.


1411-1413: Voting-related translations are properly implemented!

The translations are consistent with the existing content and maintain proper formatting.

packages/extension/public/locales/fr/translation.json (2)

1455-1458: LGTM! Translations are accurate and consistent

The translations maintain proper French language conventions while preserving technical terminology.


1416-1458: LGTM! Overall translation quality is high

The translations are complete, consistent, and maintain proper French language conventions throughout the file. The technical terms are appropriately preserved where needed.

Copy link
Contributor

@coderabbitai coderabbitai bot left a 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 (2)
packages/extension-polkagate/src/popup/home/YouHave.tsx (2)

66-74: Consider extracting portfolio change calculation to a custom hook

The portfolio change calculation logic could be moved to a custom hook for better reusability and separation of concerns.

+const usePortfolioChange = (change: number | undefined) => {
+  return useMemo(() => {
+    if (!change) {
+      return 0;
+    }
+    const value = fixFloatingPoint(change, PORTFOLIO_CHANGE_DECIMAL, false, true);
+    return parseFloat(value);
+  }, [change]);
+};

 export default function YouHave(): React.ReactElement {
   // ...
-  const portfolioChange = useMemo(() => {
-    if (!youHave?.change) {
-      return 0;
-    }
-    const value = fixFloatingPoint(youHave.change, PORTFOLIO_CHANGE_DECIMAL, false, true);
-    return parseFloat(value);
-  }, [youHave?.change]);
+  const portfolioChange = usePortfolioChange(youHave?.change);

82-90: Consider simplifying the Grid nesting

The nested Grid structure could be simplified using Stack components for better readability and maintainability.

-      <Grid
-        alignItems='flex-start' container sx={{ ...youHaveStyle }}
-      >
-        <Grid container sx={{ position: 'relative', px: '10px', py: '5px' }}>
-          <Grid container item sx={{ textAlign: 'left' }}>
-            <Typography sx={{ fontSize: '16px', fontVariant: 'small-caps', fontWeight: 400, mt: '10px', lineHeight: 'normal' }}>
-              {t('My Portfolio')}
-            </Typography>
-          </Grid>
+      <Stack sx={{ ...youHaveStyle }}>
+        <Stack sx={{ position: 'relative', px: '10px', py: '5px' }}>
+          <Typography sx={{ fontSize: '16px', fontVariant: 'small-caps', fontWeight: 400, mt: '10px', lineHeight: 'normal' }}>
+            {t('My Portfolio')}
+          </Typography>
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between 811769a and 4a1f321.

📒 Files selected for processing (1)
  • packages/extension-polkagate/src/popup/home/YouHave.tsx (2 hunks)
🔇 Additional comments (4)
packages/extension-polkagate/src/popup/home/YouHave.tsx (4)

13-13: Verify icon consistency across the application

The change from stars6 to stars5 icons should be consistent across all components. Past reviews indicate mixed usage in different parts of the application.


64-78: Enhance menu accessibility and state management

The menu implementation should handle keyboard events and ARIA attributes. Consider using Material-UI's MenuList component for better accessibility.


132-145: Fix color contrast and type definition issues

  1. The color primary.light has insufficient contrast ratios for accessibility.
  2. The available property is being used but might be missing from the YouHaveType interface.

173-178: Add error handling for logo loading

The logo image should have error handling to gracefully handle loading failures.

Copy link
Contributor

@coderabbitai coderabbitai bot left a 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)
packages/extension-polkagate/src/popup/home/AccountDetail.tsx (1)

Line range hint 1-199: Security review: Sensitive data handling looks good.

The implementation properly handles sensitive financial data:

  • Balance masking with stars when hideNumbers is true
  • Clear visual indication of outdated prices
  • Proper overflow protection for potentially long account names

However, consider adding a loading state to prevent flash of sensitive data.

Consider implementing a loading state wrapper to ensure sensitive data isn't momentarily visible during state updates.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between 4a1f321 and 3d738a7.

📒 Files selected for processing (2)
  • packages/extension-polkagate/src/components/AccountIcons.tsx (1 hunks)
  • packages/extension-polkagate/src/popup/home/AccountDetail.tsx (3 hunks)
🔇 Additional comments (4)
packages/extension-polkagate/src/components/AccountIcons.tsx (1)

56-56: LGTM: Size adjustment appears appropriate

The reduction in Identicon size from 40 to 35 pixels aligns with the UI improvements mentioned in the PR objectives. This should provide better visual balance within the account display component.

packages/extension-polkagate/src/popup/home/AccountDetail.tsx (3)

93-93: LGTM: Font weight adjustment for visual consistency.

The reduction in font weight from 500 to 400 aligns with modern UI practices for displaying numerical data.


166-166: LGTM: Typography styling adjustments.

The Typography component's styling changes (fontSize: 18px, fontWeight: 400) maintain good readability while properly handling text overflow.


114-114: Verify the BALANCES_VALIDITY_PERIOD constant value.

The price staleness calculation logic is correct. However, let's verify the constant's value to ensure appropriate timeout.

✅ Verification successful

BALANCES_VALIDITY_PERIOD is set to 5 minutes, which is appropriate

The constant is defined in packages/extension-polkagate/src/util/constants.tsx with a value of 5 minutes (5 * 60 * 1000 milliseconds). This is a reasonable timeout period for marking balance prices as outdated, as it:

  • Provides sufficient freshness of price data
  • Balances user experience with server load
  • Aligns with common industry practices for price staleness indicators
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Check the BALANCES_VALIDITY_PERIOD constant value
rg -A 1 "BALANCES_VALIDITY_PERIOD.*=" packages/extension-polkagate/src/util/constants.ts

Length of output: 181


Script:

#!/bin/bash
# Let's try to find the constant across the codebase
rg -A 1 "BALANCES_VALIDITY_PERIOD.*=" 

# Also search for any file containing 'constants' in its name
fd constants

Length of output: 491

Copy link
Contributor

@coderabbitai coderabbitai bot left a 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 (1)
packages/extension-polkagate/src/popup/account/AccountBrief.tsx (1)

61-61: Consider adjusting the line height for better readability.

While the font size reduction aligns well with the typography standardization effort, the line height (38px) seems disproportionate to the font size (24px). A more standard line height would typically be around 1.5 times the font size.

-          <Typography sx={{ fontSize: '24px', fontWeight: 400, lineHeight: '38px', maxWidth: '92%', mt: '5px', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>
+          <Typography sx={{ fontSize: '24px', fontWeight: 400, lineHeight: '36px', maxWidth: '92%', mt: '5px', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between 3d738a7 and ed9d845.

📒 Files selected for processing (3)
  • packages/extension-polkagate/src/popup/account/AccountBrief.tsx (1 hunks)
  • packages/extension-polkagate/src/popup/account/Others.tsx (1 hunks)
  • packages/extension-polkagate/src/popup/account/index.tsx (1 hunks)
🔇 Additional comments (1)
packages/extension-polkagate/src/popup/account/index.tsx (1)

165-165: Visual refinements to the Identity component look good.

The adjustments to the Identity component's styling (reduced identicon and font sizes, added height constraints, and max-width) improve the visual hierarchy and space utilization in the header section.

Comment on lines 68 to 70
<Typography sx={{ fontSize: '22px', fontWeight: 400, maxWidth: '82%', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>
{identity?.display || accountName}
</Typography>
Copy link
Contributor

Choose a reason for hiding this comment

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

💡 Codebase verification

Font size inconsistencies found across account components

The verification reveals inconsistent font sizes for similar UI elements across account components:

  • Account name/identity display:
    • AccountBrief.tsx: 24px
    • Others.tsx: 22px (changed)
    • ReservedReasons.tsx: 28px
  • Page titles:
    • Others.tsx: 20px (changed)
    • ReservedReasons.tsx: 36px

These inconsistencies could affect the visual hierarchy and user experience. Consider standardizing the font sizes across these components.

🔗 Analysis chain

LGTM! Typography changes maintain proper visual hierarchy.

The font size adjustments for both the account identity (22px) and title (20px) look appropriate, with proper overflow handling for the account name.

Let's verify the visual hierarchy consistency across related components:

Also applies to: 73-75

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Check for similar Typography components in related files to ensure consistent styling
# Look for Typography components with fontSize properties in account-related components

rg -A 2 "Typography.*fontSize.*px" --glob "packages/extension-polkagate/src/popup/account/*.tsx"

Length of output: 2071

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 7

🧹 Outside diff range and nitpick comments (17)
packages/extension-polkagate/src/fullscreen/homeFullScreen/partials/Currency.tsx (3)

21-27: Add JSDoc comments to document the Props interface.

While the props are well-typed, adding JSDoc comments would improve maintainability by documenting the purpose and expected values for each prop.

+/**
+ * Props for the Currency component
+ */
 interface Props {
+  /** Custom text color for the currency symbol */
   color?: string;
+  /** Left position offset for the currency selection dialog */
   dialogLeft?: number;
+  /** Font size for the currency symbol */
   fontSize?: string;
+  /** Custom height for the currency button */
   height?: string;
+  /** Custom minimum width for the currency button */
   minWidth?: string;
 }

29-30: Remove commented out code.

The commented out line is unnecessary since the code is version controlled. Clean up by removing it to improve code readability.

 function Currency ({ color, fontSize = '22px', height, minWidth, dialogLeft=260 }: Props): React.ReactElement {
-// export default function Currency ({ color, fontSize = '22px' }: Props): React.ReactElement {

58-66: Enhance button accessibility.

The Grid component is rendered as a button but lacks proper accessibility attributes.

 <Grid
   alignItems='center'
   component='button'
   container
   direction='column'
   item
   justifyContent='center'
   onClick={onCurrencyClick}
+  aria-label="Select currency"
+  role="button"
   sx={{
     ...HEADER_COMPONENT_STYLE,
     height: height || HEADER_COMPONENT_STYLE?.height,
     minWidth: minWidth || HEADER_COMPONENT_STYLE?.minWidth,
     zIndex: anchorEl && theme.zIndex.modal + 1
   }}
 >
packages/extension-polkagate/src/popup/home/AccountLabel.tsx (1)

145-145: Good performance optimization with React.memo!

The addition of React.memo is a good optimization as this component:

  • Receives simple props
  • Has multiple child elements in its render tree
  • Performs various calculations based on props

Consider adding a custom comparison function to React.memo if you need to fine-tune the re-rendering behavior based on specific prop changes.

packages/extension-polkagate/src/popup/home/YouHave.tsx (3)

35-61: Extract styles to a separate file

The complex shadow and gradient styles should be moved to a separate styles file for better maintainability and reusability.

Create a new file YouHave.styles.ts:

import { SxProps, Theme } from '@mui/material';

export const getYouHaveStyles = (theme: Theme): Record<string, SxProps> => ({
  container: {
    '&::before': {
      background: 'linear-gradient(to bottom right, rgba(255, 255, 255, 0.3), transparent)',
      content: '""',
      height: '100%',
      left: '-50%',
      pointerEvents: 'none',
      position: 'absolute',
      top: '-50%',
      transform: 'rotate(12deg)',
      width: '100%'
    },
    bgcolor: 'divider',
    border: '1px solid',
    borderColor: 'divider',
    borderRadius: '10px',
    boxShadow: theme.palette.mode === 'dark'
      ? '0px 0px 5px 2px rgba(255, 255, 255, 0.1)'
      : '0px 0px 10px rgba(0, 0, 0, 0.10)',
    m: '20px 4% 10px',
    minHeight: '125px',
    overflow: 'hidden',
    position: 'relative',
    width: '100%'
  }
});

66-74: Optimize useMemo dependencies

The portfolio change calculation can be optimized by destructuring youHave.change directly in the dependencies array.

-  const portfolioChange = useMemo(() => {
-    if (!youHave?.change) {
-      return 0;
-    }
-
-    const value = fixFloatingPoint(youHave.change, PORTFOLIO_CHANGE_DECIMAL, false, true);
-
-    return parseFloat(value);
-  }, [youHave?.change]);
+  const portfolioChange = useMemo(() => {
+    const change = youHave?.change;
+    if (!change) {
+      return 0;
+    }
+    const value = fixFloatingPoint(change, PORTFOLIO_CHANGE_DECIMAL, false, true);
+    return parseFloat(value);
+  }, [youHave?.change]);

109-119: Replace hardcoded width with dynamic width

The FormatPrice component uses a hardcoded width which could cause text truncation issues with larger numbers.

 <FormatPrice
   fontSize='28px'
   fontWeight={500}
   num={youHave?.portfolio}
   sign=' '
   skeletonHeight={28}
   textColor={isPriceOutdated(youHave) ? 'primary.light' : 'text.primary'}
-  width='100px'
+  sx={{ minWidth: '100px', maxWidth: '200px' }}
   withCountUp
   withSmallDecimal
 />
packages/extension-polkagate/src/partials/HeaderBrand.tsx (3)

215-219: LGTM! Consider adding type safety for state setters.

The menu visibility control and conditional rendering look good. The state management is properly implemented with controlled components.

Consider adding explicit type annotations for the state setter props to ensure type safety:

 <Menu
   isMenuOpen={isMenuOpen}
-  setShowMenu={setOpenMenu}
+  setShowMenu={React.Dispatch<React.SetStateAction<boolean>>}
 />
 {address &&
   <AccountMenu
     address={address}
     isMenuOpen={isAccountMenuOpen}
-    setShowMenu={setShowAccountMenu}
+    setShowMenu={React.Dispatch<React.SetStateAction<boolean>>}
   />
 }

Line range hint 66-68: Fix potential race condition and incomplete menu handling.

The outside click handler has two issues:

  1. Potential race condition with isMenuOpen && setOpenMenu(!isMenuOpen)
  2. Missing handling for the account menu

Apply this fix:

 useOutsideClick([setIconRef, setMenuRef], (): void => {
-  isMenuOpen && setOpenMenu(!isMenuOpen);
+  if (isMenuOpen) {
+    setOpenMenu(false);
+  }
+  if (isAccountMenuOpen) {
+    setShowAccountMenu(false);
+  }
 });

Line range hint 71-71: Consider simplifying the RightItem component.

The component has complex conditional rendering logic with multiple boolean props. This could be simplified for better maintainability.

Consider these improvements:

  1. Extract icon rendering into separate components
  2. Replace multiple boolean props with an enum for icon type:
type IconType = 'menu' | 'account' | 'refresh' | 'close' | 'none';

interface RightItemProps {
  iconType: IconType;
  onIconClick?: () => void;
  isRefreshing?: boolean;
  showFullScreen?: boolean;
  fullScreenURL?: string;
}
packages/extension-polkagate/src/partials/AccountMenu.tsx (3)

6-6: Consider enhancing type safety for MUI imports

The Material-UI imports could benefit from more specific type imports to improve type safety and bundle size optimization.

-import { Dialog, Divider, Grid, IconButton, Slide, useTheme } from '@mui/material';
+import Dialog from '@mui/material/Dialog';
+import Divider from '@mui/material/Divider';
+import Grid from '@mui/material/Grid';
+import IconButton from '@mui/material/IconButton';
+import Slide from '@mui/material/Slide';
+import useTheme from '@mui/material/styles/useTheme';

Also applies to: 12-12


28-30: Consider enhancing the Transition component

While the implementation is functional, consider these improvements:

  1. Memoize the component to prevent unnecessary re-renders
  2. Add explicit return type annotation
-const Transition = React.forwardRef(function Transition (props: TransitionProps & { children: React.ReactElement<unknown>;}, ref: React.Ref<unknown>) {
+const Transition = React.memo(React.forwardRef(function Transition (
+  props: TransitionProps & { children: React.ReactElement<unknown>; },
+  ref: React.Ref<unknown>
+): React.ReactElement {
   return <Slide direction='up' ref={ref} {...props} />;
-});
+}));

Line range hint 32-98: Consider breaking down the component for better maintainability

The component has grown quite large with multiple responsibilities. Consider these architectural improvements:

  1. Extract menu action handlers into a custom hook
  2. Split the menu items into separate components
  3. Use a reducer for state management

Example custom hook extraction:

function useMenuActions(address: string, account?: AccountType) {
  const onAction = useContext(ActionContext);
  
  const onForgetAccount = useCallback(() => {
    onAction(`/forget/${address}/${account?.isExternal}`);
  }, [address, account, onAction]);
  
  // ... other handlers
  
  return {
    onForgetAccount,
    onDeriveAccount,
    // ... other handlers
  };
}
packages/extension-polkagate/src/fullscreen/accountDetails/index.tsx (4)

Line range hint 155-165: Improve i18n handling for warning message

The warning message for dual staking should use translation placeholders instead of concatenating the full text. This makes it easier to maintain translations and handle dynamic content.

 <Warning
   iconDanger
   marginTop={0}
   theme={theme}
 >
-  {t('Nomination Pools are evolving! Unstake your solo staked funds soon to benefit from automatic pool migration, which allows participation in both a pool and governance, and avoid manual changes.')}
+  {t('nomination_pools_warning', {
+    defaultValue: 'Nomination Pools are evolving! Unstake your solo staked funds soon to benefit from automatic pool migration, which allows participation in both a pool and governance, and avoid manual changes.'
+  })}
 </Warning>

Line range hint 134-149: Simplify paramAssetId effect logic

The effect hook has complex nested conditions that could be simplified. Consider extracting the asset finding logic into a separate function for better readability and maintainability.

 useEffect(() => {
-  if (paramAssetId === undefined || !paramAssetId || !genesisHash || selectedAsset) {
+  if (!paramAssetId || !genesisHash || selectedAsset) {
     return;
   }
 
-  const maybeAssetIdSelectedInHomePage = assetId !== undefined ? assetId : paramAssetId;
+  const targetAssetId = assetId ?? paramAssetId;
 
-  if (maybeAssetIdSelectedInHomePage as number >= 0 && accountAssets) {
-    const found = accountAssets.find(({ assetId, genesisHash: _genesisHash }) => String(assetId) === String(maybeAssetIdSelectedInHomePage) && genesisHash === _genesisHash);
-
-    found && setSelectedAsset(found);
-  }
+  const found = accountAssets?.find(({ assetId: aid, genesisHash: gh }) => 
+    String(aid) === String(targetAssetId) && gh === genesisHash
+  );
+  
+  found && setSelectedAsset(found);
 }, [genesisHash, accountAssets, assetId, paramAssetId, selectedAsset]);

Line range hint 293-336: Improve modal rendering logic

The current implementation uses multiple conditional checks for modal rendering. Consider using a more maintainable approach with a modal registry pattern.

+ const MODAL_COMPONENTS = {
+   [popupNumbers.LOCKED_IN_REFERENDA]: LockedInReferenda,
+   [popupNumbers.FORGET_ACCOUNT]: ForgetAccountModal,
+   [popupNumbers.RENAME]: RenameModal,
+   [popupNumbers.EXPORT_ACCOUNT]: ExportAccountModal,
+   [popupNumbers.DERIVE_ACCOUNT]: DeriveAccountModal,
+   [popupNumbers.RECEIVE]: ReceiveModal,
+   [popupNumbers.HISTORY]: HistoryModal,
+ } as const;
+
+ const renderModal = () => {
+   if (!displayPopup) return null;
+   
+   const ModalComponent = MODAL_COMPONENTS[displayPopup];
+   if (!ModalComponent) return null;
+   
+   const props = {
+     address,
+     setDisplayPopup,
+     ...(displayPopup === popupNumbers.LOCKED_IN_REFERENDA && {
+       api,
+       classToUnlock: unlockInformation?.classToUnlock,
+       setRefresh: setRefreshNeeded,
+       totalLocked: unlockInformation?.totalLocked,
+       unlockableAmount: unlockInformation?.unlockableAmount
+     })
+   };
+   
+   return <ModalComponent {...props} />;
+ };

Line range hint 284-285: Review hardcoded layout values

The grid layout uses hardcoded pixel values which could affect responsiveness on different screen sizes. Consider using theme-based spacing or relative units.

- <Grid container item justifyContent='space-between' mb='15px'>
-   <Grid container direction='column' item mb='10px' minWidth='735px' rowGap='10px' width='calc(100% - 300px - 3%)'>
+ <Grid container item justifyContent='space-between' mb={theme.spacing(2)}>
+   <Grid container direction='column' item mb={theme.spacing(1)} minWidth={{ sm: '100%', md: '735px' }} rowGap={theme.spacing(1)} width={{ sm: '100%', md: 'calc(100% - 300px - 3%)' }}>
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between ed9d845 and f061cf6.

📒 Files selected for processing (11)
  • packages/extension-polkagate/src/fullscreen/accountDetails/index.tsx (1 hunks)
  • packages/extension-polkagate/src/fullscreen/homeFullScreen/partials/AccountItem.tsx (1 hunks)
  • packages/extension-polkagate/src/fullscreen/homeFullScreen/partials/Currency.tsx (4 hunks)
  • packages/extension-polkagate/src/partials/AccountMenu.tsx (3 hunks)
  • packages/extension-polkagate/src/partials/HeaderBrand.tsx (1 hunks)
  • packages/extension-polkagate/src/partials/Menu.tsx (4 hunks)
  • packages/extension-polkagate/src/popup/home/AccountDetail.tsx (5 hunks)
  • packages/extension-polkagate/src/popup/home/AccountLabel.tsx (2 hunks)
  • packages/extension-polkagate/src/popup/home/AccountPreview.tsx (2 hunks)
  • packages/extension-polkagate/src/popup/home/AccountsTree.tsx (3 hunks)
  • packages/extension-polkagate/src/popup/home/YouHave.tsx (2 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • packages/extension-polkagate/src/popup/home/AccountDetail.tsx
🧰 Additional context used
🪛 Biome
packages/extension-polkagate/src/partials/Menu.tsx

[error] 27-33: The enum declaration should not be const

Const enums are not supported by bundlers and are incompatible with the 'isolatedModules' mode. Their use can lead to import inexistent values.
See TypeScript Docs for more details.
Safe fix: Turn the const enum into a regular enum.

(lint/suspicious/noConstEnum)

🔇 Additional comments (16)
packages/extension-polkagate/src/fullscreen/homeFullScreen/partials/Currency.tsx (3)

36-36: LGTM! Well-optimized text color logic.

The text color calculation is properly memoized and handles both theme modes and custom color override effectively.


58-66: Previous style refactoring suggestion still applies.

A previous review already suggested extracting these styles into a separate function or styled component. That suggestion remains valid for improving maintainability.


110-110: Verify React.memo effectiveness.

The use of React.memo is appropriate for optimizing re-renders, but we should verify its effectiveness with the current prop types.

✅ Verification successful

React.memo is appropriately used here

The Currency component is well-suited for memoization because:

  • It receives only simple props (color, fontSize, height, minWidth, dialogLeft) that are primarily primitive values
  • Internal state management (anchorEl, currencyToShow) is handled with useState, not affecting memoization
  • The component's re-rendering is expensive due to Dialog and Grid components
  • Props are primarily used for styling and unlikely to change frequently
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Check for other usages of this component to understand re-render patterns
rg -l "Currency" --type tsx

Length of output: 55


Script:

#!/bin/bash
# Check for other usages of this component and its props
rg "Currency" -A 5 -B 5 --type ts --type tsx --type jsx --type js

# Also check the Currency component implementation to understand its props
cat "packages/extension-polkagate/src/fullscreen/homeFullScreen/partials/Currency.tsx"

Length of output: 3718

packages/extension-polkagate/src/fullscreen/homeFullScreen/partials/AccountItem.tsx (2)

Line range hint 1-93: Implementation looks solid!

The component is well-structured with:

  • Proper TypeScript typing
  • Effective use of hooks and memoization
  • Clean separation of concerns
  • Good error handling through proper typing

18-18: Verify AccountLabel default export compatibility

The import statement has been changed from named to default import. While this change is valid, we should verify that AccountLabel is properly exported as default from its source file.

✅ Verification successful

Import change is compatible with source export

The verification confirms that AccountLabel is correctly exported as default in its source file (export default React.memo(AccountLabel)), and there are no named exports that could be affected by this change. The import modification is safe to proceed with.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify that AccountLabel is exported as default in its source file
# Expected: Should find a default export of AccountLabel

ast-grep --pattern 'export default $_' packages/extension-polkagate/src/popup/home/AccountLabel.tsx

# Also check for any named exports to ensure we're not breaking other imports
ast-grep --pattern 'export { $_ }' packages/extension-polkagate/src/popup/home/AccountLabel.tsx

Length of output: 305

packages/extension-polkagate/src/popup/home/AccountPreview.tsx (3)

38-38: LGTM! Good improvement to component declaration.

The change to a named function declaration improves debugging experience while maintaining proper TypeScript types.


109-109: LGTM! Good performance optimization.

Wrapping AccountPreview with React.memo is appropriate given its complexity and child components. This will prevent unnecessary re-renders when parent components update with the same props.


97-101: Verify performance impact of always-rendered AccountMenu.

While always rendering the AccountMenu component (instead of conditional rendering) is a valid pattern for smooth transitions and state preservation, let's verify that this doesn't impact the initial load performance significantly.

✅ Verification successful

Let me try different commands to gather the necessary information.


Based on the code analysis, I can now generate the final response:

No performance concerns with always-rendered AccountMenu

The AccountMenu implementation is well-optimized:

  • Uses React.memo for memoization
  • Renders a Material-UI Dialog component which handles its own mounting/unmounting
  • Contains mostly lightweight UI components and event handlers
  • Dialog is rendered with a Slide transition, which benefits from always being mounted for smooth animations
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Check if AccountMenu is a heavy component by analyzing its dependencies and size
rg -l "AccountMenu" --type ts --type tsx | xargs cat | wc -l

# Check if AccountMenu uses React.memo or other performance optimizations
ast-grep --pattern 'export $_ = React.memo($$$)' packages/extension-polkagate/src/partials/AccountMenu.tsx

Length of output: 199


Script:

#!/bin/bash
# Check AccountMenu implementation and its dependencies
rg -p "AccountMenu" --type typescript --type tsx -A 10

# Look for imports in AccountMenu
fd AccountMenu.tsx -x cat {}

# Check if there are any performance optimizations
ast-grep --pattern 'const AccountMenu = $_'

Length of output: 16244

packages/extension-polkagate/src/popup/home/AccountsTree.tsx (3)

Line range hint 27-101: Implementation follows React best practices

The component implementation is well-structured with:

  • Proper TypeScript typing for props
  • Efficient use of hooks for state management
  • Good separation of concerns
  • Proper cleanup with useCallback

103-103: Good performance optimization with React.memo

The memoization is a good optimization for this complex component, as it can prevent unnecessary re-renders when props don't change. However, let's verify that all props are suitable for memoization (i.e., they don't change on every parent render).

#!/bin/bash
# Description: Check usage of AccountsTree to verify prop stability

# Look for parent components that render AccountsTree
rg "AccountsTree.*" -A 10 -B 10

# Check for any inline prop definitions that could break memoization
ast-grep --pattern '<AccountsTree $$$={$_} $$$>'

16-16: Verify AccountLabel default export consistency

The import statement has been changed to use a default import. Let's verify that this is consistent with the AccountLabel component's export.

✅ Verification successful

Let me generate another script to check the export in AccountLabel.tsx since the previous results didn't show its content:


Import change is consistent with the module's export

The import change in AccountsTree.tsx is correct as AccountLabel is indeed exported as a default export using export default React.memo(AccountLabel). All other imports of AccountLabel in the codebase also use default import syntax, maintaining consistency.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify that AccountLabel is exported as default from its module
# and that all other imports of AccountLabel are consistent

# Check the export in AccountLabel file
ast-grep --pattern 'export default $_' packages/extension-polkagate/src/popup/home/AccountLabel.tsx

# Check all imports of AccountLabel for consistency
rg "import.*AccountLabel.*from.*" -g '*.{ts,tsx}'

Length of output: 9199


Script:

#!/bin/bash
# Check the export in AccountLabel.tsx
cat packages/extension-polkagate/src/popup/home/AccountLabel.tsx

Length of output: 4278

packages/extension-polkagate/src/popup/home/AccountLabel.tsx (1)

20-20: LGTM! Export restructuring looks good.

The removal of the named export in favor of a default export helps standardize the component's export pattern.

packages/extension-polkagate/src/fullscreen/accountDetails/index.tsx (1)

21-21: Verify AccountLabel default export

The import statement has been changed to use a default import. Please ensure that AccountLabel is properly exported as default in ../../popup/home/AccountLabel.

✅ Verification successful

Import change is consistent with module export

The verification confirms that AccountLabel is correctly exported as default in the source module using React.memo(AccountLabel). The import change is valid and won't cause any issues.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify AccountLabel export type
# Check if AccountLabel is exported as default

ast-grep --pattern 'export default $_' packages/extension-polkagate/src/popup/home/AccountLabel.tsx

# Also check for named exports to ensure we're not breaking existing usage
ast-grep --pattern 'export { AccountLabel }' packages/extension-polkagate/src/popup/home/AccountLabel.tsx

Length of output: 315

packages/extension-polkagate/src/partials/Menu.tsx (3)

70-70: Simplification of onCloseMenu function is appropriate

The onCloseMenu function has been simplified correctly, enhancing code readability and efficiency.


43-43: Proper usage of useTheme hook

Switching from prop-based theme access to the useTheme hook is appropriate and aligns with best practices.


35-37: Transition component is correctly implemented

The custom Transition component using React.forwardRef and Slide is implemented correctly and enhances the modal presentation.

Copy link
Contributor

@coderabbitai coderabbitai bot left a 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 (4)
packages/extension-polkagate/src/popup/home/YouHave.tsx (4)

8-24: Consider organizing imports by category

The imports could be better organized into groups:

  1. External dependencies (React, MUI)
  2. Local components
  3. Icons and assets
  4. Hooks and utilities
 import type { YouHaveType } from '../../hooks/useYouHave';
 
+// External dependencies
 import { MoreVert as MoreVertIcon } from '@mui/icons-material';
 import { Box, Grid, IconButton, Stack, Typography, useTheme } from '@mui/material';
 import React, { useCallback, useMemo, useState } from 'react';
 import CountUp from 'react-countup';
 
+// Icons and assets
 import { stars5Black, stars5White } from '../../assets/icons';
 import { logoBlack, logoWhite } from '../../assets/logos';
+
+// Local components
 import { FormatPrice, Infotip2 } from '../../components';
 import HideBalance from '../../components/SVG/HideBalance';
 import Currency from '../../fullscreen/homeFullScreen/partials/Currency';
+
+// Hooks and utilities
 import { changeSign, PORTFOLIO_CHANGE_DECIMAL } from '../../fullscreen/homeFullScreen/partials/TotalBalancePieChart';
 import { useCurrency, useIsHideNumbers, useYouHave } from '../../hooks';
 import { PRICE_VALIDITY_PERIOD } from '../../hooks/usePrices';
 import useTranslation from '../../hooks/useTranslation';
 import Menu from '../../partials/Menu';
 import { COIN_GECKO_PRICE_CHANGE_DURATION } from '../../util/api/getPrices';
 import { countDecimalPlaces, fixFloatingPoint } from '../../util/utils';

40-64: Extract styles to a separate file

The youHaveStyle object is quite large and contains complex styling logic. Consider moving it to a separate styles file to improve maintainability and reusability.

Create a new file YouHave.styles.ts:

import { Theme } from '@mui/material';

export const getYouHaveStyle = (theme: Theme) => {
  const isDark = theme.palette.mode === 'dark';
  const shadow = isDark
    ? '0px 0px 5px 2px rgba(255, 255, 255, 0.1)'
    : '0px 0px 10px rgba(0, 0, 0, 0.10)';

  return {
    '&::before': {
      background: isDark
        ? 'linear-gradient(to bottom right, rgba(255, 255, 255, 0.3), transparent)'
        : 'linear-gradient(to bottom right, rgba(66, 61, 61, 0.276), transparent)',
      content: '""',
      height: '100%',
      left: '-50%',
      pointerEvents: 'none',
      position: 'absolute',
      top: '-50%',
      transform: 'rotate(12deg)',
      width: '100%'
    },
    bgcolor: 'divider',
    border: '1px solid',
    borderColor: 'divider',
    borderRadius: '10px',
    boxShadow: shadow,
    m: '20px 4% 10px',
    minHeight: '125px',
    overflow: 'hidden',
    position: 'relative',
    width: '100%'
  };
};

69-77: Simplify portfolioChange calculation

The portfolioChange calculation can be simplified using nullish coalescing operator.

 const portfolioChange = useMemo(() => {
-  if (!youHave?.change) {
-    return 0;
-  }
-
-  const value = fixFloatingPoint(youHave.change, PORTFOLIO_CHANGE_DECIMAL, false, true);
-
-  return parseFloat(value);
+  const value = fixFloatingPoint(youHave?.change ?? 0, PORTFOLIO_CHANGE_DECIMAL, false, true);
+  return parseFloat(value);
 }, [youHave?.change]);

88-93: Simplify Grid nesting

The nested Grid structure can be simplified by removing unnecessary containers.

-        <Grid container sx={{ position: 'relative', px: '10px', py: '5px' }}>
-          <Grid container item sx={{ textAlign: 'left' }}>
-            <Typography sx={{ fontSize: '16px', fontVariant: 'small-caps', fontWeight: 400, lineHeight: 'normal', mt: '10px' }}>
-              {t('My Portfolio')}
-            </Typography>
-          </Grid>
+        <Grid sx={{ position: 'relative', px: '10px', py: '5px' }}>
+          <Typography sx={{ fontSize: '16px', fontVariant: 'small-caps', fontWeight: 400, lineHeight: 'normal', mt: '10px', textAlign: 'left' }}>
+            {t('My Portfolio')}
+          </Typography>
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between f061cf6 and e16eb2a.

📒 Files selected for processing (1)
  • packages/extension-polkagate/src/popup/home/YouHave.tsx (2 hunks)

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🧹 Outside diff range and nitpick comments (2)
packages/extension-polkagate/src/popup/home/YouHave.tsx (2)

8-24: Consider grouping related imports

The imports could be better organized by grouping them into:

  1. External dependencies (React, MUI)
  2. Internal components
  3. Hooks
  4. Constants and utilities
 import { MoreVert as MoreVertIcon } from '@mui/icons-material';
 import { Box, Grid, IconButton, Stack, Typography, useTheme } from '@mui/material';
 import React, { useCallback, useMemo, useState } from 'react';
 import CountUp from 'react-countup';
+
 import { stars5Black, stars5White } from '../../assets/icons';
 import { logoBlack, logoWhite } from '../../assets/logos';
 import { FormatPrice, Infotip2 } from '../../components';
 import HideBalance from '../../components/SVG/HideBalance';
 import Currency from '../../fullscreen/homeFullScreen/partials/Currency';
+
 import { changeSign, PORTFOLIO_CHANGE_DECIMAL } from '../../fullscreen/homeFullScreen/partials/TotalBalancePieChart';
 import { useCurrency, useIsHideNumbers, useYouHave } from '../../hooks';
 import { PRICE_VALIDITY_PERIOD } from '../../hooks/usePrices';
 import useTranslation from '../../hooks/useTranslation';
 import Menu from '../../partials/Menu';
+
 import { COIN_GECKO_PRICE_CHANGE_DURATION } from '../../util/api/getPrices';
 import { countDecimalPlaces, fixFloatingPoint } from '../../util/utils';

35-64: Consider extracting styles to a separate file

The youHaveStyle object is quite large and contains complex styling. Consider:

  1. Moving it to a separate styles file
  2. Extracting shadow values as theme constants
  3. Using MUI's styled API for better maintainability

Example:

// styles/YouHave.styles.ts
import { styled } from '@mui/material/styles';
import { Box } from '@mui/material';

export const SHADOWS = {
  dark: '0px 0px 5px 2px rgba(255, 255, 255, 0.1)',
  light: '0px 0px 10px rgba(0, 0, 0, 0.10)'
};

export const StyledPortfolioCard = styled(Box)(({ theme }) => ({
  // ... existing styles
  boxShadow: theme.palette.mode === 'dark' ? SHADOWS.dark : SHADOWS.light,
  // ... remaining styles
}));
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between e16eb2a and 6ffc4e5.

📒 Files selected for processing (4)
  • packages/extension-polkagate/src/fullscreen/homeFullScreen/partials/TotalBalancePieChart.tsx (1 hunks)
  • packages/extension-polkagate/src/popup/home/YouHave.tsx (2 hunks)
  • packages/extension-polkagate/src/themes/dark.ts (1 hunks)
  • packages/extension-polkagate/src/themes/light.ts (1 hunks)
🔇 Additional comments (8)
packages/extension-polkagate/src/themes/light.ts (1)

Line range hint 11-23: LGTM: Type declarations are well-structured

The module augmentation properly extends the Material-UI theme types with new palette options. The type definitions are consistent and follow the Material-UI patterns.

packages/extension-polkagate/src/themes/dark.ts (3)

Line range hint 11-24: LGTM! Type definitions are well-structured

The interface extensions follow Material-UI's type system conventions correctly. The use of TypeText for backgroundFL and Palette['primary'] for color properties maintains type consistency.


45-45: LGTM! Success color enhancement

The addition of contrastText: '#2ECC71' to the success palette improves visibility while maintaining the semantic meaning of success states.


Line range hint 25-48: Verify color contrast ratios for accessibility

Some color combinations might not meet WCAG accessibility guidelines for contrast ratios:

  1. approval: #BA82A4 (background) vs #DFCBD7 (contrast)
  2. support: #BCE2DB (background) vs #008080 (contrast)

Consider using a color contrast checker to ensure all combinations meet at least WCAG AA standards (4.5:1 for normal text, 3:1 for large text).

Consider adding a comment in the code documenting the WCAG compliance status of these color combinations for future reference.

packages/extension-polkagate/src/popup/home/YouHave.tsx (3)

69-77: LGTM! Well-optimized portfolio change calculation

The implementation correctly:

  • Handles edge cases
  • Uses memoization for performance
  • Applies proper number formatting

135-148: Verify available balance type definition

The component uses youHave?.available but we need to verify its type definition:

#!/bin/bash
# Check YouHaveType interface definition
rg "type YouHaveType|interface YouHaveType" packages/extension-polkagate/src/hooks/useYouHave.ts -A 5

# Check available property usage
rg "\.available" packages/extension-polkagate/src/hooks/useYouHave.ts -B 5 -A 5

102-134: Verify portfolio display calculations

The portfolio display logic looks good, but let's verify the calculations and data flow:

✅ Verification successful

Based on the gathered information, I can now provide a final response:

Portfolio display calculations are correctly implemented

The portfolio display implementation is verified and working as expected:

  • Portfolio value is correctly calculated by summing up individual asset prices (currentAssetPrice) in the useYouHave hook
  • Price outdated status is properly handled using isPriceOutdated function with appropriate validity periods
  • 24-hour price change is correctly fetched from CoinGecko API and displayed with proper formatting
  • FormatPrice component properly handles the display states including outdated prices with different text colors
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Check implementation of useYouHave hook
rg -A 10 "export function useYouHave" packages/extension-polkagate/src/hooks/useYouHave.ts

# Check FormatPrice component props
rg "export (type|interface) .*Props" packages/extension-polkagate/src/components/FormatPrice.tsx -A 5

Length of output: 1112


Script:

#!/bin/bash
# Check FormatPrice component props with correct path pattern
rg "export (type|interface) .*Props" -g "*FormatPrice*.tsx" 

# Check implementation of useYouHave hook with broader pattern
ast-grep --pattern 'export function useYouHave() {
  $$$
}'

# Check portfolio calculation logic
rg "portfolio.*=" -B 5 -A 5

Length of output: 5936


Script:

#!/bin/bash
# Check calcPrice and calcChange functions implementation
rg "function calcPrice|function calcChange" -B 2 -A 10

# Check FormatPrice component implementation
ast-grep --pattern 'export function FormatPrice({$$$}: $$$) {
  $$$
}'

# Check currency and price update logic
rg "COIN_GECKO_PRICE_CHANGE_DURATION|isPriceOutdated" -B 2 -A 2

Length of output: 16644

packages/extension-polkagate/src/fullscreen/homeFullScreen/partials/TotalBalancePieChart.tsx (1)

234-234: LGTM! Verify theme configuration for contrast text.

The change from success.main to success.contrastText improves text contrast for positive portfolio changes, which is good for accessibility.

Let's verify the theme configuration:

✅ Verification successful

Theme configuration is properly defined and consistent

The change from success.main to success.contrastText is well-supported as both light and dark themes properly define the success.contrastText color:

  • Light theme: #228B22 (forest green)
  • Dark theme: #2ECC71 (emerald green)

The usage is also consistent across components, being used in both TotalBalancePieChart.tsx and YouHave.tsx with the same conditional logic.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Check if success.contrastText is properly defined in the theme
# and verify contrast ratios meet WCAG guidelines

# Search for theme configuration files
fd -e ts -e js -e tsx -e jsx --full-path '.*theme.*' --exec rg -l 'success.*contrastText'

# Search for any other uses of success.contrastText to ensure consistent usage
rg 'success\.contrastText'

Length of output: 743


Script:

#!/bin/bash
# Let's check the theme configuration files to verify success.contrastText is properly defined
cat ./packages/extension-polkagate/src/themes/light.ts ./packages/extension-polkagate/src/themes/dark.ts

Length of output: 4011

Copy link
Contributor

@coderabbitai coderabbitai bot left a 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 (3)
packages/extension-polkagate/src/components/MenuItem.tsx (1)

38-39: UX improvement for disabled state

The explicit 'default' cursor for disabled state improves user experience by clearly indicating non-interactive elements. However, there's a minor formatting inconsistency in the indentation.

Consider consistent indentation for the Grid props:

-      <Grid alignItems='center' color={disabled ? '#4B4B4B' : 'inherit'} container item justifyContent='space-between' my='4px' onClick={disabled ? noop : onClick} pl={pl} py={py} sx={{ cursor: disabled ? 'default' : 'pointer', ...(withHoverEffect ? hoverEffectStyles : {}) }} textAlign='left' xs={12}>
-        <Grid alignItems='center' container item sx={{ flexWrap: 'nowrap' }} xs>
+      <Grid
+        alignItems='center'
+        color={disabled ? '#4B4B4B' : 'inherit'}
+        container
+        item
+        justifyContent='space-between'
+        my='4px'
+        onClick={disabled ? noop : onClick}
+        pl={pl}
+        py={py}
+        sx={{ cursor: disabled ? 'default' : 'pointer', ...(withHoverEffect ? hoverEffectStyles : {}) }}
+        textAlign='left'
+        xs={12}
+      >
+        <Grid
+          alignItems='center'
+          container
+          item
+          sx={{ flexWrap: 'nowrap' }}
+          xs
+        >
packages/extension-polkagate/src/fullscreen/homeFullScreen/partials/ProfileMenu.tsx (1)

250-253: Consider refactoring the promise chain using async/await

The nested promise structure could be simplified for better readability and maintainability.

Consider this refactoring:

-    updateMeta(address, metaData)
-      .then(() => {
-        const isLastAccountWithTheProfile = accountsWithTheSameProfile.length === 1;
-
-        if (isLastAccountWithTheProfile && currentProfile === profileToBeRemoved) {
-          setStorage('profile', PROFILE_TAGS.ALL)
-            .then(() => {
-              handleClose();
-              closeParentMenu();
-            })
-            .catch(console.error);
-        } else {
-          handleClose();
-          closeParentMenu();
-        }
-      })
-      .catch(console.error);
+    try {
+      await updateMeta(address, metaData);
+      const isLastAccountWithTheProfile = accountsWithTheSameProfile.length === 1;
+
+      if (isLastAccountWithTheProfile && currentProfile === profileToBeRemoved) {
+        await setStorage('profile', PROFILE_TAGS.ALL);
+      }
+      
+      handleClose();
+      closeParentMenu();
+    } catch (error) {
+      console.error(error);
+    }

Also applies to: 257-257, 261-261

packages/extension-polkagate/src/partials/AccountMenu.tsx (1)

153-154: Consider removing the redundant disabled={false} prop

The disabled prop is explicitly set to false, which is unnecessary since false is the default value. Removing it can simplify the code.

Apply this diff to clean up the code:

-              disabled={false} // We check NFTs across all supported chains, so this feature is not specific to the current chain and should not be disabled.
+              // We check NFTs across all supported chains, so this feature is not specific to the current chain and should not be disabled.
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between 6ffc4e5 and ec5f133.

📒 Files selected for processing (4)
  • packages/extension-polkagate/src/components/MenuItem.tsx (2 hunks)
  • packages/extension-polkagate/src/components/RemoteNodeSelector.tsx (1 hunks)
  • packages/extension-polkagate/src/fullscreen/homeFullScreen/partials/ProfileMenu.tsx (10 hunks)
  • packages/extension-polkagate/src/partials/AccountMenu.tsx (3 hunks)
✅ Files skipped from review due to trivial changes (1)
  • packages/extension-polkagate/src/components/RemoteNodeSelector.tsx
🔇 Additional comments (8)
packages/extension-polkagate/src/components/MenuItem.tsx (1)

15-15: LGTM: Type refinement improves clarity

The change from JSX.Element to React.JSX.Element makes the React dependency explicit and aligns with modern TypeScript best practices.

packages/extension-polkagate/src/fullscreen/homeFullScreen/partials/ProfileMenu.tsx (6)

63-68: LGTM: Interface additions are well-typed and purposeful

The new props closeParentMenu and extensionMode are properly typed and their names clearly indicate their purposes.


71-71: LGTM: AddMenu changes handle both functionality and styling appropriately

The changes properly integrate the menu closing behavior and provide consistent styling based on extension mode. The useCallback dependencies are correctly maintained.

Also applies to: 108-110, 113-113, 121-121, 130-130, 134-134


162-162: LGTM: RemoveMenu changes maintain consistency with AddMenu

The extensionMode integration follows the same pattern as AddMenu, ensuring consistent UI behavior across the application.

Also applies to: 165-165, 170-170, 175-175


217-217: LGTM: handleClose dependencies are correctly maintained

The empty dependency array is appropriate as the function only uses React setState functions which are guaranteed to be stable.


270-270: LGTM: MenuItem styling is consistent with extension mode

The fontSize adjustments maintain UI consistency in extension mode.

Also applies to: 299-299


337-338: LGTM: Props are correctly passed to child components

The new props are properly passed down to AddMenu and RemoveMenu components, maintaining component contract.

Also applies to: 345-345

packages/extension-polkagate/src/partials/AccountMenu.tsx (1)

28-30: ⚠️ Potential issue

Fix the syntax error in the 'Transition' component type definition

There's an unnecessary semicolon in the type definition of the Transition component, which may cause a syntax error.

Apply this diff to fix the issue:

-const Transition = React.forwardRef(function Transition (props: TransitionProps & { children: React.ReactElement<unknown>;}, ref: React.Ref<unknown>) {
+const Transition = React.forwardRef(function Transition (props: TransitionProps & { children: React.ReactElement<unknown> }, ref: React.Ref<unknown>) {

Likely invalid or redundant comment.

Copy link
Contributor

@coderabbitai coderabbitai bot left a 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 (1)
packages/extension-polkagate/src/partials/AccountMenu.tsx (1)

28-30: Improve type safety of the Transition component

The ref parameter could be more strictly typed using React.Ref<HTMLDivElement> instead of React.Ref<unknown>.

-const Transition = React.forwardRef(function Transition (props: TransitionProps & { children: React.ReactElement<unknown>;}, ref: React.Ref<unknown>) {
+const Transition = React.forwardRef(function Transition (props: TransitionProps & { children: React.ReactElement<unknown>;}, ref: React.Ref<HTMLDivElement>) {
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between ec5f133 and be34cbc.

📒 Files selected for processing (3)
  • packages/extension-polkagate/src/components/AccountIcons.tsx (1 hunks)
  • packages/extension-polkagate/src/partials/AccountMenu.tsx (3 hunks)
  • packages/extension-polkagate/src/popup/home/AccountDetail.tsx (5 hunks)
🚧 Files skipped from review as they are similar to previous changes (2)
  • packages/extension-polkagate/src/components/AccountIcons.tsx
  • packages/extension-polkagate/src/popup/home/AccountDetail.tsx
🔇 Additional comments (1)
packages/extension-polkagate/src/partials/AccountMenu.tsx (1)

152-165: Validate NFT feature availability

While the comment indicates that NFTs are checked across all supported chains, there's no validation to ensure the feature is actually available. Consider:

  1. Adding a check for NFT support before enabling the menu item
  2. Handling potential errors in the onNFTAlbum callback
✅ Verification successful

Based on the extensive search results, I can now provide a conclusive response about the NFT feature validation concern:

NFT feature is properly validated and available across supported chains

The implementation shows proper validation and error handling:

  1. The NFT feature is supported on specific chains defined in SUPPORTED_NFT_CHAINS (Kusama Asset Hub and Polkadot Asset Hub)
  2. The useNFT hook handles NFT fetching with proper error handling and retries
  3. The NFT worker (getNFTs.js) validates chain support and handles errors appropriately
  4. The UI shows proper loading states and error messages when fetching fails

The comment about checking NFTs across all supported chains is accurate because:

  1. The feature is chain-agnostic at the UI level since it aggregates NFTs from all supported chains
  2. The disabled={false} flag is correct as the feature works independently of the currently selected chain
  3. Error handling exists in the worker to handle unsupported chains
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Check for NFT-related implementations and validations
rg -A 5 "nft|NFT" --type typescript

Length of output: 72


Script:

#!/bin/bash
# Search for NFT-related implementations using ripgrep without file type restriction
rg -A 5 "nft|NFT"

# Also search for the onNFTAlbum handler implementation
rg -A 5 "onNFTAlbum"

Length of output: 112215

Copy link
Contributor

@coderabbitai coderabbitai bot left a 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 (2)
packages/extension-polkagate/src/fullscreen/homeFullScreen/partials/FavoriteChains.tsx (1)

53-57: LGTM! Consider making the badge text color configurable.

The badge styling follows MUI best practices and improves text visibility.

Consider making the badge text color configurable through theme to better support different color schemes:

  sx={{
    '& .MuiBadge-badge': {
-     color: 'white'
+     color: theme.palette.primary.contrastText
    },
  }}
packages/extension-polkagate/src/partials/RemoteNodeSelectorWithSignals.tsx (1)

255-255: Simplify complex conditional styling logic

The Grid component's sx prop contains complex conditional logic for border and background color. Consider extracting this into a separate style object or custom hook for better maintainability.

+ const containerStyle = useMemo(() => ({
+   bgcolor: bgcolorOnAccountDetail,
+   border: isDark && !onExtension ? 2 : 1,
+   borderColor: onExtension ? theme.palette.secondary.light : 'divider',
+   borderRadius: '5px',
+   cursor: 'pointer',
+   height: `${iconSize + 7}px`,
+   position: 'relative',
+   width: `${iconSize + 7}px`,
+   zIndex: 10
+ }), [bgcolorOnAccountDetail, isDark, onExtension, theme, iconSize]);

- <Grid container item onClick={onClick} sx={{ bgcolor: bgcolorOnAccountDetail, border: isDark && !onExtension ? 2 : 1, borderColor: onExtension ? theme.palette.secondary.light : 'divider', borderRadius: '5px', cursor: 'pointer', height: `${iconSize + 7}px`, position: 'relative', width: `${iconSize + 7}px`, zIndex: 10 }}>
+ <Grid container item onClick={onClick} sx={containerStyle}>
🧰 Tools
🪛 GitHub Check: build

[failure] 255-255:
No overload matches this call.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between be34cbc and 1499c25.

📒 Files selected for processing (2)
  • packages/extension-polkagate/src/fullscreen/homeFullScreen/partials/FavoriteChains.tsx (1 hunks)
  • packages/extension-polkagate/src/partials/RemoteNodeSelectorWithSignals.tsx (2 hunks)
🧰 Additional context used
🪛 GitHub Check: build
packages/extension-polkagate/src/partials/RemoteNodeSelectorWithSignals.tsx

[failure] 255-255:
No overload matches this call.

🔇 Additional comments (2)
packages/extension-polkagate/src/partials/RemoteNodeSelectorWithSignals.tsx (2)

Line range hint 235-263: Implementation follows React best practices

The ListIndicator component and its parent RemoteNodeSelectorWithSignals demonstrate good use of:

  • React hooks for state and performance optimization
  • Proper separation of concerns
  • Comprehensive error handling
  • Theme-based styling

255-255: Verify Grid component props usage

While the static analysis reports a type error, the Grid component props appear to be correctly typed. However, consider verifying:

  1. That using both container and item props together is intentional
  2. If the component needs to handle other mouse event types besides click
🧰 Tools
🪛 GitHub Check: build

[failure] 255-255:
No overload matches this call.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 3

🧹 Outside diff range and nitpick comments (2)
packages/extension-polkagate/src/fullscreen/homeFullScreen/partials/Currency.tsx (1)

58-67: Consider extracting styles for better maintainability

While the implementation correctly uses the style props and fallbacks, the sx prop could be further improved for maintainability.

Consider extracting the styles into a separate function:

+const getGridStyles = (props: Props, baseStyle: typeof HEADER_COMPONENT_STYLE, anchorEl: HTMLButtonElement | null, theme: Theme) => ({
+  ...baseStyle,
+  borderColor: props.borderColor || baseStyle?.borderColor,
+  height: props.height || baseStyle?.height,
+  minWidth: props.minWidth || baseStyle?.minWidth,
+  zIndex: anchorEl && theme.zIndex.modal + 1
+});

 <Grid
   alignItems='center'
   component='button'
   container
   direction='column'
   item
   justifyContent='center'
   onClick={onCurrencyClick}
-  sx={{
-    ...HEADER_COMPONENT_STYLE,
-    borderColor: borderColor || HEADER_COMPONENT_STYLE?.borderColor,
-    height: height || HEADER_COMPONENT_STYLE?.height,
-    minWidth: minWidth || HEADER_COMPONENT_STYLE?.minWidth,
-    zIndex: anchorEl && theme.zIndex.modal + 1
-  }}
+  sx={getGridStyles({ borderColor, height, minWidth }, HEADER_COMPONENT_STYLE, anchorEl, theme)}
 >
packages/extension-polkagate/src/popup/home/YouHave.tsx (1)

69-77: Consider using useCallback for memoized calculation

The portfolio change calculation could benefit from useCallback to prevent unnecessary recalculations.

-  const portfolioChange = useMemo(() => {
+  const calculatePortfolioChange = useCallback(() => {
     if (!youHave?.change) {
       return 0;
     }

     const value = fixFloatingPoint(youHave.change, PORTFOLIO_CHANGE_DECIMAL, false, true);

     return parseFloat(value);
-  }, [youHave?.change]);
+  }, [youHave?.change]);
+
+  const portfolioChange = useMemo(() => calculatePortfolioChange(), [calculatePortfolioChange]);
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between 1499c25 and b48da3d.

📒 Files selected for processing (3)
  • packages/extension-polkagate/src/fullscreen/homeFullScreen/partials/Currency.tsx (4 hunks)
  • packages/extension-polkagate/src/partials/RemoteNodeSelectorWithSignals.tsx (2 hunks)
  • packages/extension-polkagate/src/popup/home/YouHave.tsx (2 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • packages/extension-polkagate/src/partials/RemoteNodeSelectorWithSignals.tsx
🔇 Additional comments (6)
packages/extension-polkagate/src/fullscreen/homeFullScreen/partials/Currency.tsx (3)

21-28: LGTM: Well-structured Props interface

The Props interface is well-defined with appropriate optional modifiers and clear property names.


30-30: LGTM: Proper prop handling and optimized color logic

Good use of default values and memoization for the theme-aware color logic.

Also applies to: 36-36


111-111: LGTM: Appropriate use of memoization

React.memo is correctly applied to optimize re-renders based on prop changes.

packages/extension-polkagate/src/popup/home/YouHave.tsx (3)

13-13: Maintain UI consistency with star icons

The change from stars6 to stars5 icons creates inconsistency with other parts of the application that still use stars6 icons.


139-139: Verify YouHaveType interface includes 'available' property

The component uses youHave?.available, but according to past review comments, this property might be missing from the YouHaveType interface.

✅ Verification successful

YouHaveType interface correctly includes 'available' property

The interface definition in packages/extension-polkagate/src/hooks/useYouHave.ts shows that available is a valid property of type number in the YouHaveType interface, so the usage of youHave?.available is correct.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Search for YouHaveType interface definition
ast-grep --pattern 'type YouHaveType = {
  $$$
}'

# Also check interface definition
rg "interface YouHaveType" -A 10

Length of output: 1071


176-181: 🛠️ Refactor suggestion

Enhance logo accessibility and error handling

The logo implementation needs improvements for accessibility and resilience.

 <Box
   alt='PolkaGate logo'
   component='img'
+  role="img"
+  loading="lazy"
+  onError={(e: React.SyntheticEvent<HTMLImageElement>) => {
+    console.error('Failed to load logo:', e);
+    const img = e.currentTarget;
+    img.onerror = null;
+    img.style.display = 'none';
+  }}
   src={theme.palette.mode === 'dark' ? logoBlack as string : logoWhite as string}
   sx={{ borderRadius: '30px', boxShadow: '0px 0px 5px 1px rgba(0,0,0,0.15)', height: 34, left: 'calc(50% - 17px)', position: 'absolute', top: '5px', width: 34 }}
 />

Likely invalid or redundant comment.

Copy link
Contributor

@coderabbitai coderabbitai bot left a 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 (3)
packages/extension-polkagate/src/partials/Menu.tsx (3)

35-37: LGTM: Well-implemented transition component with a minor suggestion

The Transition component is well-implemented using forwardRef. Consider using a more specific type for the ref parameter.

-const Transition = React.forwardRef(function Transition (props: TransitionProps & { children: React.ReactElement<unknown>;}, ref: React.Ref<unknown>) {
+const Transition = React.forwardRef(function Transition (props: TransitionProps & { children: React.ReactElement<unknown>;}, ref: React.Ref<HTMLDivElement>) {

103-107: Consider adding accessibility attributes to Dialog

The Dialog implementation should include accessibility attributes for better screen reader support.

 <Dialog
   TransitionComponent={Transition}
   fullScreen
   open={isMenuOpen}
+  aria-labelledby="menu-dialog-title"
+  aria-describedby="menu-dialog-description"
 >

162-187: Consider extracting warning dialog into a separate component

The warning dialog implementation is quite large and could be extracted into a separate component for better maintainability and reusability.

Example structure:

interface TestnetWarningProps {
  onConfirm: () => void;
  onReject: () => void;
}

const TestnetWarning: React.FC<TestnetWarningProps> = ({ onConfirm, onReject }) => (
  <Grid container justifyContent='space-between' sx={{ pt: '30px' }}>
    {/* ... existing warning implementation ... */}
  </Grid>
);
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between b48da3d and f017e4b.

📒 Files selected for processing (1)
  • packages/extension-polkagate/src/partials/Menu.tsx (4 hunks)
🔇 Additional comments (3)
packages/extension-polkagate/src/partials/Menu.tsx (3)

Line range hint 6-25: LGTM: Props and imports updated appropriately

The changes to imports and Props interface are well-structured. Using useTheme hook directly instead of passing theme as a prop follows better React practices.


109-109: Previous issue: Invalid height value still needs to be addressed


126-126: Previous issue: Invalid 'float' prop on VaadinIcon still needs to be addressed

@Nick-1979 Nick-1979 merged commit 013f454 into main Nov 16, 2024
5 checks passed
@Nick-1979 Nick-1979 deleted the newYouHave branch November 16, 2024 12:19
github-actions bot pushed a commit that referenced this pull request Nov 16, 2024
# [0.30.0](v0.29.1...v0.30.0) (2024-11-16)

### Features

* new you have (Portfolio) for Extension mode ([#1655](#1655)) ([013f454](013f454))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants