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

New explore dropdown UI #2336

Open
wants to merge 9 commits into
base: develop
Choose a base branch
from
Open

New explore dropdown UI #2336

wants to merge 9 commits into from

Conversation

sunilsabatp
Copy link
Contributor

@sunilsabatp sunilsabatp commented Dec 12, 2024

This PR handles the new explore drop down UI (mobile, desktop).

Copy link

vercel bot commented Dec 12, 2024

The latest updates on your projects. Learn more about Vercel for Git ↗︎

Name Status Preview Comments Updated (UTC)
planet-webapp-multi-tenancy-setup ✅ Ready (Inspect) Visit Preview 💬 Add feedback Jan 2, 2025 6:10am
2 Skipped Deployments
Name Status Preview Comments Updated (UTC)
planet-webapp ⬜️ Ignored (Inspect) Jan 2, 2025 6:10am
planet-webapp-temp ⬜️ Ignored (Inspect) Jan 2, 2025 6:10am

Copy link
Contributor

coderabbitai bot commented Dec 12, 2024

Warning

There were issues while running some tools. Please review the errors and either fix the tool’s configuration or disable the tool if it’s a critical failure.

🔧 eslint

If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.

npm warn config production Use --omit=dev instead.
npm error code ERESOLVE
npm error ERESOLVE could not resolve
npm error
npm error While resolving: [email protected]
npm error Found: [email protected]
npm error node_modules/eslint
npm error dev eslint@"^8.26.0" from the root project
npm error peer eslint@"6 || 7 || 8" from @emotion/[email protected]
npm error node_modules/@emotion/eslint-plugin
npm error dev @emotion/eslint-plugin@"^11.12.0" from the root project
npm error 15 more (@eslint-community/eslint-utils, ...)
npm error
npm error Could not resolve dependency:
npm error peer eslint@"^5.16.0 || ^6.8.0 || ^7.2.0" from [email protected]
npm error node_modules/eslint-config-airbnb
npm error dev eslint-config-airbnb@"^18.2.0" from the root project
npm error
npm error Conflicting peer dependency: [email protected]
npm error node_modules/eslint
npm error peer eslint@"^5.16.0 || ^6.8.0 || ^7.2.0" from [email protected]
npm error node_modules/eslint-config-airbnb
npm error dev eslint-config-airbnb@"^18.2.0" from the root project
npm error
npm error Fix the upstream dependency conflict, or retry
npm error this command with --force or --legacy-peer-deps
npm error to accept an incorrect (and potentially broken) dependency resolution.
npm error
npm error
npm error For a full report see:
npm error /root/.npm/_logs/2025-01-02T05_54_14_247Z-eresolve-report.txt
npm error A complete log of this run can be found in: /root/.npm/_logs/2025-01-02T05_54_14_247Z-debug-0.log

Walkthrough

The changes in this pull request involve extensive modifications to the MapFeatureExplorer component and its associated styles in the ProjectsMap feature. The SCSS file has seen significant styling adjustments, including the removal of the .exploreContainer class and the addition of several new classes. The MapSettings component has been updated to include new props and simplified JSX structure. Additionally, new components have been introduced to enhance mobile responsiveness and functionality, while existing components have been adjusted to accommodate these changes.

Changes

File Change Summary
src/features/projectsV2/ProjectsMap/MapFeatureExplorer/MapFeatureExplorer.module.scss - Removed class: .exploreContainer
- Added classes: .exploreItemsContainer, .exploreFeatureMobileHeader, .exploreItemSection, .layerSwitchContainer, .layerInfoPopupContainer
- Updated class: .exploreMainContainer (background color, padding, max-height changed)
- Updated class: .toggleMainContainer (padding and background color added)
- Updated class: .exploreDescription (padding removed, margin-top and font size changed)
src/features/projectsV2/ProjectsMap/MapFeatureExplorer/MapSettings.tsx - Updated MapSettingsProps to include optional isMobile and setIsOpen
- Removed outer <div> with class styles.exploreContainer
- Introduced MapLayerControlPanel component and conditional rendering based on isMobile prop
src/features/projectsV2/ProjectListControls/ProjectListControlForMobile.tsx - Added isMobile prop to MapFeatureExplorer component
src/features/projectsV2/ProjectsMap/MapFeatureExplorer/index.tsx - Updated EcosystemOptionProps to remove infoIcon
- Updated MapFeatureExplorerProps to include optional isMobile property
- Altered rendering logic to wrap MapSettings in a Modal for mobile users
src/features/projectsV2/ProjectsMap/MapFeatureExplorer/microComponents/ExploreDropdownHeaderMobile.tsx - New component added: ExploreDropdownHeaderMobile with setIsOpen prop
src/features/projectsV2/ProjectsMap/MapFeatureExplorer/microComponents/LayerInfoPopupContent.tsx - New component added: LayerInfoPopupContent with props for additional info and event handlers
src/features/projectsV2/ProjectsMap/MapFeatureExplorer/microComponents/LayerSwitchContainer.tsx - New component added: LayerSwitchContainer for rendering layer switches
src/features/projectsV2/ProjectsMap/MapFeatureExplorer/microComponents/MapLayerControlPanel.tsx - New component added: MapLayerControlPanel for rendering layer control options and managing state

Possibly related PRs

  • Implement mobile UI for MapFeatureExplorer #2213: The changes in this PR involve implementing a mobile UI for the MapFeatureExplorer, which directly relates to the extensive modifications made to the styling and structure of the MapFeatureExplorer.module.scss file in the main PR.
  • Post Launch feedback for projects facelift #2302: This PR includes adjustments to the layout and positioning of elements within the project layout, which may impact the overall styling and responsiveness of components like MapFeatureExplorer, aligning with the changes made in the main PR.
  • Fix data explorer queries for single tree registrations #2273: This PR focuses on fixing data explorer queries for single tree registrations, which may indirectly relate to the overall functionality and presentation of map-related components, including those styled in the main PR.

Suggested labels

projects redesign, MyForest 2.0

Suggested reviewers

  • mohitb35

Poem

In the map where features play,
A container's gone, hooray!
Padding trimmed, the styles refined,
A cleaner look, oh so aligned.
With toggles set and layers bright,
We hop along, all feels just right! 🐇✨


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 generate docstrings to generate docstrings for this PR. (Beta)
  • @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.

@sunilsabatp sunilsabatp marked this pull request as draft December 12, 2024 09:20
@sunilsabatp sunilsabatp changed the title New explore feature UI New explore dropdown UI Dec 12, 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: 0

🧹 Outside diff range and nitpick comments (2)
src/features/projectsV2/ProjectsMap/MapFeatureExplorer/MapSettings.tsx (2)

28-28: Remove unnecessary div nesting

The extra <div> wrapper appears to serve no semantic or styling purpose and can be removed to improve code clarity.

-      <div>
         <div>
           <MapLayerToggle
             // ... component content
           />
         </div>
         <div className={styles.exploreDescription}>
           {tMaps('3trilliontrees')}
         </div>
-      </div>

Line range hint 31-57: Remove commented-out code blocks

Large blocks of commented code make the file harder to maintain and understand. If these features are planned for future implementation, consider:

  1. Tracking them in issues/tickets
  2. Relying on version control history
  3. Creating separate feature branches
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 9578af4 and ccb9213.

📒 Files selected for processing (2)
  • src/features/projectsV2/ProjectsMap/MapFeatureExplorer/MapFeatureExplorer.module.scss (2 hunks)
  • src/features/projectsV2/ProjectsMap/MapFeatureExplorer/MapSettings.tsx (1 hunks)
🔇 Additional comments (3)
src/features/projectsV2/ProjectsMap/MapFeatureExplorer/MapFeatureExplorer.module.scss (3)

15-15: Verify the visual impact of reduced padding

The padding has been significantly reduced from 14px 16px to a uniform 8px. This could make the content feel cramped, especially given the fixed max-width: 182px.

Please confirm that:

  1. Content has sufficient breathing room
  2. Text remains readable
  3. Interactive elements have enough touch targets

24-24: LGTM! Enhanced visual hierarchy

The new styles improve the visual hierarchy with:

  • Well-defined padding
  • Subtle background color using rgba
  • Consistent border-radius

Also applies to: 29-30


89-90: Verify the font size variable exists

The font size has been changed to $fontXXXSmallNew. Please ensure this variable is defined in the theme.

✅ Verification successful

Font size variable is properly defined

The $fontXXXSmallNew variable is correctly defined in src/theme/_fonts.scss as var(--font-xxx-extra-small-new) and is already being used in other components within the project.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Check if the font size variable is defined in theme files
rg -l '\$fontXXXSmallNew' 'src/theme/**/*'

Length of output: 99


Script:

#!/bin/bash
# Let's first find any SCSS/CSS files that might define this variable
fd -e scss -e css | xargs rg '\$fontXXXSmallNew'

# Also search for any potential definition or usage of this font size variable
rg '\$fontXXXSmallNew' 

Length of output: 911

Used MUI Modal to render explore features for better
compatibility on mobile devices. Provided a cross icon
to close the modal view for improved usability.
…project layer configurations

-Implemented LayerSwitchContainer component for reusable layer switch functionality.
-Added MapLayerControlPanel for structured display of layer categories and configurations.
-Created ExploreDropdownHeaderMobile for mobile-specific dropdown header functionality.
-Added MapSettings component with forest, soil, and project layer configurations.
-Integrated reusable layer configurations with translations and custom styles.
-Refactored existing layer toggle components for improved modularity and reusability.
-Incorporated conditional rendering for mobile and desktop layouts.
- Updated `.exploreMainContainer` to include `max-height` and hide scrollbars using `::-webkit-scrollbar`.
- Introduced a new `.exploreItemsContainer` class with `max-height` and `overflow-y: auto` to enable scrolling for the content.
- Adjusted styles for responsiveness in `xsPhoneView` to support dynamic heights for mobile views.
@sunilsabatp sunilsabatp marked this pull request as ready for review January 2, 2025 05:51
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

🧹 Nitpick comments (19)
src/features/projectsV2/ProjectsMap/MapFeatureExplorer/microComponents/ExploreDropdownHeaderMobile.tsx (4)

1-7: Ensure resilience against missing translations

In case the 'explore' key is missing in the translations, consider a fallback string or a safe check to avoid potential runtime errors.


8-10: Props naming consistency

The interface name Props is too generic. To maintain clarity and consistency with other files, consider naming it ExploreDropdownHeaderMobileProps.

-interface Props {
+interface ExploreDropdownHeaderMobileProps {
   setIsOpen: SetState<boolean>;
 }

12-25: Appropriate ARIA attributes for accessibility

When using interactive elements such as the close button, consider adding relevant ARIA attributes, like aria-label="Close" or using a textual alternative for screen readers, to improve accessibility.


27-27: Exporting multiple items

If you anticipate adding more exports (like constants or helper functions), consider consolidating them under named exports for modularity and easier refactoring in the future.

src/features/projectsV2/ProjectsMap/MapFeatureExplorer/microComponents/MapLayerControlPanel.tsx (2)

8-15: Consider optional chaining improvements

If the source, covariates, or other fields may be absent from the data model in the future, consider optional chaining and default values, particularly when rendering or performing operations on these fields.


69-69: Export statement for flexible imports

Exporting multiple named exports along with the default could help reuse this component’s types/utility functions in other parts of the codebase without extra imports.

src/features/projectsV2/ProjectsMap/MapFeatureExplorer/microComponents/LayerInfoPopupContent.tsx (2)

7-12: Prop naming clarity

anchorEl and setAnchorEl might be more descriptive as tooltipAnchorEl or popupAnchorEl, making the UI purpose clearer.


68-68: Consistent export naming

As in other files, consider matching the component name with the default export for uniformity across your codebase.

src/features/projectsV2/ProjectsMap/MapFeatureExplorer/index.tsx (4)

11-11: Check for large bundle sizes with Material-UI imports

Modal from @mui/material is straightforward, but ensure minimal bundling. Potentially use dynamic() or a code-splitting strategy if the modal is not frequently used.


103-103: Defaulting boolean props

Consider providing a default to isMobile in the destructuring, e.g. isMobile = false, to simplify conditionals below.

- isMobile,
+ isMobile = false,

117-117: Separation of concerns

Instead of inline rendering, consider extracting this logic into a small function or separate component for readability and to facilitate future changes (e.g., toggling different map feature bars).


123-132: Use ARIA attributes for modals

When rendering the <Modal> conditionally, ensure you include attributes such as aria-labelledby or aria-describedby to enhance accessibility for screen reader users.

src/features/projectsV2/ProjectListControls/ProjectListControlForMobile.tsx (1)

136-136: Use a descriptive prop name or documentation for clarity.
By hardcoding isMobile={true}, you're clearly flagging that the component should adapt its behavior for mobile. However, consider adding a comment or clarifying docstring to emphasize why the mobile override is being forced here (versus deriving it from a responsive hook or global state).

src/features/projectsV2/ProjectsMap/MapFeatureExplorer/MapFeatureExplorer.module.scss (3)

12-21: Ensure consistent overflow handling for extra content.
By setting max-height: 485px; and hiding scrollbars (display: none;), users with long content may not realize there's more to scroll. Consider adding a subtle visual scroll indicator or an alternative approach that ensures discoverability.


33-44: Improve naming clarity.
Renaming .exploreItemsContainer to something more descriptive (e.g., .exploreContentScrollContainer) might help future maintainers quickly grasp its purpose.


46-66: Add consistent spacing constants.
The .exploreFeatureMobileHeader has hardcoded padding, gap, and font sizes. Consider referencing shared spacing tokens (e.g., $spacingSmall, $fontSmall) for consistent design.

src/features/projectsV2/ProjectsMap/MapFeatureExplorer/MapSettings.tsx (3)

1-3: Clean up leftover import references.
You have new imports (SetState) and old ones (ChangeEvent or StyledSwitch) commented out. Remove no-longer-used imports to keep the codebase lean.


88-96: Remove commented-out toggles if not needed.
Code references to MapLayerToggle or StyledSwitch might become outdated quickly. Trim them if you don't plan to reintroduce them soon.


128-131: Extend modular approach to future config expansions.
Using exploreConfig arrays is a great pattern. Document how devs can add more objects (e.g., new toggles, new layers) without duplicating logic in multiple places.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between ccb9213 and 1cddf29.

⛔ Files ignored due to path filters (1)
  • public/static/locales/en/maps.json is excluded by !**/*.json
📒 Files selected for processing (8)
  • src/features/projectsV2/ProjectListControls/ProjectListControlForMobile.tsx (1 hunks)
  • src/features/projectsV2/ProjectsMap/MapFeatureExplorer/MapFeatureExplorer.module.scss (2 hunks)
  • src/features/projectsV2/ProjectsMap/MapFeatureExplorer/MapSettings.tsx (3 hunks)
  • src/features/projectsV2/ProjectsMap/MapFeatureExplorer/index.tsx (3 hunks)
  • src/features/projectsV2/ProjectsMap/MapFeatureExplorer/microComponents/ExploreDropdownHeaderMobile.tsx (1 hunks)
  • src/features/projectsV2/ProjectsMap/MapFeatureExplorer/microComponents/LayerInfoPopupContent.tsx (1 hunks)
  • src/features/projectsV2/ProjectsMap/MapFeatureExplorer/microComponents/LayerSwitchContainer.tsx (1 hunks)
  • src/features/projectsV2/ProjectsMap/MapFeatureExplorer/microComponents/MapLayerControlPanel.tsx (1 hunks)
✅ Files skipped from review due to trivial changes (1)
  • src/features/projectsV2/ProjectsMap/MapFeatureExplorer/microComponents/LayerSwitchContainer.tsx
🔇 Additional comments (11)
src/features/projectsV2/ProjectsMap/MapFeatureExplorer/microComponents/MapLayerControlPanel.tsx (1)

17-28: Ensure type safety in the mapOptions callback

The updateMapOption function sets a boolean value for options. If your MapOptions type can accept other types for different fields, consider stricter type checks or a more generalized approach.

src/features/projectsV2/ProjectsMap/MapFeatureExplorer/index.tsx (1)

97-97: Optional prop usage consistency

isMobile is optional. Ensure that any internal logic or child components referencing isMobile also handle undefined correctly, to avoid runtime issues.

src/features/projectsV2/ProjectsMap/MapFeatureExplorer/MapFeatureExplorer.module.scss (6)

25-29: Double-check phone resolution constraints.
Positioning the container absolutely in smaller viewports can lead to overlapping or unexpected layout artifacts on certain devices. Verify with a broad range of breakpoints to ensure a stable layout.


67-79: Double-check background color usage.
The subtle green background (rgba(0, 122, 73, 0.05)) might conflict with certain themes. Ensure this color aligns with brand palettes or configurable theme tokens.


80-95: Ensure accessible separation for dashed borders.
While a dashed HR provides visual separation, consider users with low vision. Confirm the contrast ratio meets accessibility standards or provide an alternative.


96-110: Keep consistent sizing with modals.
.layerInfoPopupContainer at max-width: 189px; may appear too narrow on certain device sizes. Check the final design to confirm readability of text within the popup.


116-116: Standardize container styling.
The newly added background and padding on .toggleMainContainer look good. Just ensure you apply the same styling approach used in .exploreItemSection or other containers for consistent layout patterns across the module.

Also applies to: 121-121


181-181: Confirm consistent use of extra-small font.
font-size: var(--font-xx-extra-small); is beneficial for space-limited UIs, but it can hinder readability on mobile devices. Verify that it meets accessibility guidelines.

src/features/projectsV2/ProjectsMap/MapFeatureExplorer/MapSettings.tsx (3)

12-13: Good practice: Keep module imports collocated.
It's nice to see important modules like MapLayerControlPanel and ExploreDropdownHeaderMobile grouped together. Maintaining consistent import ordering helps clarity.


18-19: Validate usage of optional props.
isMobile? and setIsOpen? are helpful for flexible design. Ensure internal logic gracefully handles the absence of these props if not explicitly passed in.


22-27: Nice decoupling for responsive behavior.
This approach of passing isMobile and setIsOpen keeps concerns isolated in the parent while allowing the child component to adapt. Good job.

Comment on lines +30 to +67
const MapLayerControlPanel = ({
category,
exploreConfig,
mapOptions,
updateMapOption,
}: Props) => {
return (
<section className={styles.exploreItemSection}>
{category && <h2>{category}</h2>}
<div>
{exploreConfig.map((item) => {
if (!item.shouldRender) return <></>;
return (
<LayerSwitchContainer
key={item.label}
showDivider={item.showDivider}
switchComponent={
<StyledSwitch
checked={mapOptions?.['showProjects'] || false}
customColor={item.color}
onChange={(
_event: ChangeEvent<HTMLInputElement>,
checked: boolean
) => {
if (updateMapOption)
updateMapOption('showProjects', checked);
}}
/>
}
label={item.label}
additionalInfo={item.additionalInfo}
/>
);
})}
</div>
</section>
);
};
Copy link
Contributor

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Proposed switch logic improvements

Here, each switch is mapped to 'showProjects'. If you plan on handling different map options, pass a dynamic key from each item object so each item toggles the correct option.

- updateMapOption('showProjects', checked);
+ if (item.mapOptionKey) {
+   updateMapOption(item.mapOptionKey, checked);
+ }

Committable suggestion skipped: line range outside the PR's diff.

Comment on lines +14 to +66
const LayerInfoPopupContent = ({
additionalInfo,
handleMouseLeave,
setAnchorEl,
anchorEl,
}: Props) => {
const tMaps = useTranslations('Maps');
return (
<div
className={styles.layerInfoPopupContainer}
onMouseEnter={() => setAnchorEl(anchorEl)}
onMouseLeave={handleMouseLeave}
>
{additionalInfo?.dataYears && (
<div>
<p className={styles.label}>{tMaps('layers.dataYears')}</p>
<p>{additionalInfo?.dataYears}</p>
</div>
)}
{additionalInfo?.resolution && (
<div>
<p className={styles.label}>{tMaps('layers.resolution')}</p>
<p>~{additionalInfo?.resolution}</p>
</div>
)}
{additionalInfo?.description && (
<div>
<p className={styles.label}>{tMaps('layers.description')}</p>
<p>{additionalInfo.description}</p>
</div>
)}
{additionalInfo?.underlyingData && (
<div>
<p className={styles.label}>{tMaps('layers.underlyingData')}</p>
<p>{additionalInfo.underlyingData}</p>
</div>
)}
{additionalInfo?.covariates && (
<div>
<p>{tMaps('layers.covariates')}</p>
<a
href={additionalInfo.source}
target="_blank"
rel="noopener noreferrer"
className={styles.source}
>
{additionalInfo.covariates}
</a>
</div>
)}
</div>
);
};
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue

Validate link fields before rendering

When rendering href from additionalInfo.source, consider validating or sanitizing the input to prevent potential security risks (e.g., ensuring it uses a safe protocol).

<a
-  href={additionalInfo.source}
+  href={additionalInfo.source?.startsWith('http') ? additionalInfo.source : '#'}
   target="_blank"
   rel="noopener noreferrer"
   className={styles.source}
>

Comment on lines +125 to +127
{isMobile && setIsOpen && (
<ExploreDropdownHeaderMobile setIsOpen={setIsOpen} />
)}
Copy link
Contributor

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Avoid cramped mobile headers.
ExploreDropdownHeaderMobile typically runs close to the top of the viewport. Ensure there's enough breathing room or margins in the enclosing layout so the header doesn't visually clash with the device notch or other UI elements.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant