Skip to content

Revamp About Page: Thematic Section Enhancements, Dynamic Content Structuring, and Comprehensive Testing Integration #1584

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

Open
wants to merge 22 commits into
base: main
Choose a base branch
from

Conversation

rishyym0927
Copy link
Contributor

@rishyym0927 rishyym0927 commented Jun 11, 2025

📝 Description

Fixes #1385

This PR introduces a significant enhancement to the About page with a focus on structure, scalability, and theme alignment.

✅ New Sections Added

  • Mission
  • Key Features
  • Who It's For
  • Get Involved
  • Project History Timeline (with major milestones)

🌗 Theme Compatibility

All newly added sections are fully responsive and aligned with both light and dark themes for a consistent visual experience.

🧩 Content Management

  • Section data is now managed via TypeScript types, enabling effortless content updates without modifying core logic.
  • Built with a modular approach for maintainability and future extensibility.

🧪 Testing Improvements

  • Unit tests and E2E tests added for all new sections.
  • Existing tests for older sections have been updated and refactored for improved accuracy and performance.

Copy link
Contributor

coderabbitai bot commented Jun 11, 2025

Summary by CodeRabbit

  • New Features

    • Expanded About page with new sections: Mission, Who It's For, Key Features, Get Involved, and a detailed Project History timeline.
    • Enhanced project statistics with precise animated counters.
    • Added structured content for platform mission, features, community involvement, history, and leadership.
  • Refactor

    • Redesigned About page layout for improved readability and organization.
  • Tests

    • Significantly expanded test coverage for all new About page sections and enriched mock data for more comprehensive validation.

Summary by CodeRabbit

  • New Features

    • The About page now includes dedicated sections for Mission, Who It's For, Key Features, Get Involved, and a redesigned Project History timeline, each with distinct icons and improved layout.
    • Project statistics counters now display exact values.
    • Additional information about leadership and technologies is presented.
  • Improvements

    • Enhanced structure and clarity of the About page for easier navigation and readability.
    • Expanded and more detailed content about the platform’s features, history, and ways to get involved.

Walkthrough

The About page was extensively restructured to introduce new sections: mission, key features, target audience, ways to get involved, and a project history timeline. Existing tests were updated and expanded to validate the presence and content of these new sections, with both unit and end-to-end coverage reflecting the revised page structure and content.

Changes

Files Change Summary
frontend/src/app/about/page.tsx Replaced static history section with structured sections: mission, audience, features, involvement, and timeline; updated stats UI.
frontend/tests/unit/pages/About.test.tsx Expanded test suite for About page to cover new sections and updated mock technology data.
frontend/tests/e2e/pages/About.spec.ts Modified assertion for "History" heading to require exact match; relaxed animated counters test to check labels only.
frontend/src/utils/aboutData.ts Added new structured data constants and interfaces for mission, key features, get involved, project history, and leader certifications.
frontend/src/types/about.ts Added TypeScript interfaces and types for new about page content sections including mission, features, involvement, history, and leaders.

Assessment against linked issues

Objective Addressed Explanation
Add mission, key features, who it's for, get involved, and project history timeline sections (#1385)

Assessment against linked issues: Out-of-scope changes

No out-of-scope changes identified.

Possibly related PRs

Suggested reviewers

  • kasya
  • arkid15r
✨ Finishing Touches
  • 📝 Generate Docstrings
🧪 Generate Unit Tests
  • Create PR with Unit Tests
  • Commit Unit Tests in branch about
  • Post Copyable Unit Tests in Comment

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ 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.
    • Explain this complex logic.
    • 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 explain this code block.
    • @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 explain its main purpose.
    • @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.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

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.
  • @coderabbitai generate sequence diagram to generate a sequence diagram of the changes in this PR.
  • @coderabbitai auto-generate unit tests to generate unit tests for this 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.

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: 2

🧹 Nitpick comments (1)
frontend/__tests__/unit/pages/About.test.tsx (1)

227-228: Consider more specific selectors for year indicators.

The current approach of checking for text "23" and "24" could be fragile if these numbers appear elsewhere in the page. Consider using more specific selectors or data attributes.

-    // Check for year indicators
-    expect(screen.getAllByText('23')).toHaveLength(2) // 2023 entries
-    expect(screen.getAllByText('24')).toHaveLength(3) // 2024 entries
+    // Check for year indicators within the timeline
+    const timelineSection = screen.getByText('History').closest('div')
+    const yearIndicators = within(timelineSection).getAllByText(/^\d{2}$/)
+    const year23Count = yearIndicators.filter(el => el.textContent === '23').length
+    const year24Count = yearIndicators.filter(el => el.textContent === '24').length
+    expect(year23Count).toBe(2) // 2023 entries
+    expect(year24Count).toBe(3) // 2024 entries
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between e939a52 and 6681ba7.

📒 Files selected for processing (3)
  • frontend/__tests__/e2e/pages/About.spec.ts (1 hunks)
  • frontend/__tests__/unit/pages/About.test.tsx (5 hunks)
  • frontend/src/app/about/page.tsx (8 hunks)
🧰 Additional context used
🧬 Code Graph Analysis (1)
frontend/src/app/about/page.tsx (1)
frontend/src/components/MarkdownWrapper.tsx (1)
  • Markdown (4-17)
🔇 Additional comments (5)
frontend/__tests__/e2e/pages/About.spec.ts (1)

39-39: Good practice: Using exact match for heading assertion.

The addition of exact: true ensures the test specifically targets the "History" heading without matching partial text. This prevents false positives and aligns well with the restructured About page content.

frontend/__tests__/unit/pages/About.test.tsx (2)

46-100: LGTM! Mock data aligns with new technologies displayed.

The expanded mock technology data correctly includes all the new tools mentioned in the About page restructuring.


165-211: Well-structured tests for new content sections.

The new test cases comprehensively cover the mission, key features, and get involved sections with appropriate assertions for both headings and content.

frontend/src/app/about/page.tsx (2)

337-364: Excellent timeline implementation!

The new project history timeline with visual indicators, gradient line, and year badges provides a much better user experience compared to the previous static content. The implementation is clean and accessible.


332-332:

✅ Verification successful

Verify Markdown component sanitization for external links.

The Markdown component is being used to render content that includes links to external resources. Ensure the component properly sanitizes content and handles external links securely.


🏁 Script executed:

#!/bin/bash
# Description: Verify the MarkdownWrapper component's security configuration

# Check the MarkdownWrapper implementation for proper sanitization
cat frontend/src/components/MarkdownWrapper.tsx

# Search for any security-related configurations
rg -A 5 "DOMPurify|sanitize|linkify" frontend/src/components/

Length of output: 1727


Markdown content is properly sanitized

  • The markdown-it parser is initialized with html: false, preventing raw HTML in the source.
  • All rendered output is passed through DOMPurify.sanitize(), neutralizing any malicious markup.
  • Linkification (linkify: true) only converts plain URLs to safe <a> tags without introducing XSS vectors.

No further action needed here—sanitization is correctly implemented.

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

🧹 Nitpick comments (3)
frontend/src/utils/aboutData.ts (3)

11-13: Consider a clearer key than whoItsFor

whoItsFor is a little awkward to read and stylistically differs from the other nouns (mission, keyFeatures, …).
audience or targetAudience would be easier to scan. Rename here and where it’s consumed.


50-78: Store year as a number, not a string

year is a numeric concept; keeping it as a number avoids ad-hoc parsing when you need to sort or perform arithmetic.

-  year: '2024',
+  year: 2024,

Repeat for every history item.


82-86: Give leaders an explicit type

Without a declaration TS infers leaders as { [x: string]: string }, which is fine but implicit.
A quick Record<string, string> (or a dedicated enum/union of known handles if you prefer) makes intent crystal clear.

-export const leaders = {
+export const leaders: Record<string, string> = {
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 6681ba7 and d74913e.

📒 Files selected for processing (3)
  • frontend/__tests__/unit/pages/About.test.tsx (6 hunks)
  • frontend/src/app/about/page.tsx (7 hunks)
  • frontend/src/utils/aboutData.ts (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (2)
  • frontend/tests/unit/pages/About.test.tsx
  • frontend/src/app/about/page.tsx

Copy link
Collaborator

@kasya kasya left a comment

Choose a reason for hiding this comment

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

Thanks for working on this! Left some comments ⬇️

@rishyym0927 rishyym0927 requested a review from kasya June 12, 2025 05:45
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 comments (1)
frontend/src/app/about/page.tsx (1)

79-87: ⚠️ Potential issue

Loading gate misses loading flags & may show “Data not found” prematurely

useQuery always returns an object, so projectMetadataResponse / topContributorsResponse are never falsy.
During the first render loading is still true, but isLoading evaluates to false, causing the component to drop into the 404/Data not found branch for a split-second and then re-render. This flashes the error UI and breaks SSR.

-const isLoading =
-  !projectMetadataResponse ||
-  !topContributorsResponse ||
-  (projectMetadataRequestError && !projectMetadata) ||
-  (topContributorsRequestError && !topContributors)
+const isLoading =
+  projectMetadataResponse?.loading ||
+  topContributorsResponse?.loading ||
+  (projectMetadataRequestError && !projectMetadata) ||
+  (topContributorsRequestError && !topContributors)
🧹 Nitpick comments (3)
frontend/src/app/about/page.tsx (2)

296-297: Don’t always append “+” to stats – misleading for exact counts

If a repository has exactly 0 forks or 1 star the UI will still show 0+, 1+.
Only add the suffix when the number is rounded/abbreviated.

-<AnimatedCounter end={stat.value} duration={2} />+
+<AnimatedCounter end={stat.value} duration={2} />
+{stat.value > 0 && '+'}

308-316: Surface GraphQL errors consistently via handleAppError

Inside LeaderData, GraphQL errors are rendered as plain text while other errors are piped through the global toaster. For UX consistency delegate to the same handler:

-if (error) return <p>Error loading {username}'s data</p>
+if (error) {
+  handleAppError(error)
+  return <p>Error loading {username}'s data</p>
+}
frontend/__tests__/unit/pages/About.test.tsx (1)

237-268: Repetitive render boilerplate – extract a helper

Every test repeats:

await act(async () => { render(<About />) })

Create a renderAbout helper in beforeEach (or use RTL’s render() inside a wrapper). This shortens each test and centralises default setup.

No code diff provided as change spans multiple blocks.

Also applies to: 251-283, 285-297

📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between d74913e and af99246.

📒 Files selected for processing (4)
  • frontend/__tests__/e2e/pages/About.spec.ts (2 hunks)
  • frontend/__tests__/unit/pages/About.test.tsx (6 hunks)
  • frontend/src/app/about/page.tsx (8 hunks)
  • frontend/src/utils/aboutData.ts (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (2)
  • frontend/tests/e2e/pages/About.spec.ts
  • frontend/src/utils/aboutData.ts
🔇 Additional comments (1)
frontend/__tests__/unit/pages/About.test.tsx (1)

298-301: ⚠️ Potential issue

Fuzzy text match makes the test brittle – use exact match

getAllByText('23') also matches “2023”, so the expected length will break if the copy changes. Make the query exact or target the badge element instead.

-expect(screen.getAllByText('23')).toHaveLength(2)
-expect(screen.getAllByText('24')).toHaveLength(3)
+expect(screen.getAllByText('23', { exact: true })).toHaveLength(2)
+expect(screen.getAllByText('24', { exact: true })).toHaveLength(3)

Likely an incorrect or invalid review 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

♻️ Duplicate comments (1)
frontend/src/app/about/page.tsx (1)

121-129: 🛠️ Refactor suggestion

Array index still used as React key – use a stable identifier instead.

Using index breaks reconciliation if keyFeatures order changes (e.g., translations, A/B tests).
Use the feature title (unique) or add an explicit id.

-            {keyFeatures.map((feature, index) => (
-              <div key={index} className="rounded-lg bg-gray-100 p-4 dark:bg-gray-700">
+            {keyFeatures.map((feature) => (
+              <div key={feature.title} className="rounded-lg bg-gray-100 p-4 dark:bg-gray-700">
🧹 Nitpick comments (3)
frontend/src/app/about/page.tsx (3)

249-254: Minor: replace index with the string itself for list keys.

Each entry in getInvolvedContent.ways is already a unique string; using it avoids unnecessary DOM churn.

-              {getInvolvedContent.ways.map((way, index) => (
-                <li key={index} className="flex items-start gap-2">
+              {getInvolvedContent.ways.map((way) => (
+                <li key={way} className="flex items-start gap-2">

267-286: Use deterministic key for timeline milestones.

Relying on index can cause flicker if history order is updated. Combine year & title for a stable key.

-              {projectHistory.map((milestone, index) => (
-                <div key={index} className="relative flex gap-6">
+              {projectHistory.map((milestone) => (
+                <div key={`${milestone.year}-${milestone.title}`} className="relative flex gap-6">

301-302: Consistency: consider dropping the hard-coded “+” after the animated count.

AnimatedCounter already millifies values (e.g., 1.2K). Appending + yields 1.2K+, which may be misleading when the exact count is shown (e.g., 73+). Decide on either exact or “at least” semantics and apply consistently.

📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between af99246 and 74e9f3c.

📒 Files selected for processing (2)
  • frontend/__tests__/e2e/pages/About.spec.ts (2 hunks)
  • frontend/src/app/about/page.tsx (8 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • frontend/tests/e2e/pages/About.spec.ts
🧰 Additional context used
🧬 Code Graph Analysis (1)
frontend/src/app/about/page.tsx (3)
frontend/src/utils/aboutData.ts (4)
  • missionContent (25-30)
  • keyFeatures (32-52)
  • getInvolvedContent (54-66)
  • projectHistory (68-97)
frontend/src/components/MarkdownWrapper.tsx (1)
  • Markdown (4-17)
frontend/src/components/AnimatedCounter.tsx (1)
  • AnimatedCounter (10-35)
🔇 Additional comments (1)
frontend/src/app/about/page.tsx (1)

11-15:

❓ Verification inconclusive

Verify that faTimeline & other newly-added icons exist in the installed free icon pack.

faTimeline (and, depending on the Font Awesome version, faHandsHelping) are not part of the free solid set in some releases. If they are missing at runtime the page will crash with: “icon not found”.


🏁 Script executed:

#!/bin/bash
# Check if the requested icons exist in @fortawesome/free-solid-svg-icons
grep -R --line-number -e "faTimeline" -e "faHandsHelping" "$(npm root)/@fortawesome" || echo "Icon(s) not found"

Length of output: 235


Verify newly added FontAwesome icons exist in your free‐solid package

Ensure you’ve installed your front-end dependencies and then confirm that both faTimeline and faHandsHelping are exported by your @fortawesome/free-solid-svg-icons package. Missing icons will throw an “icon not found” error at runtime.

• Locations to check

  • frontend/src/app/about/page.tsx (lines 11–15): references to faTimeline, faHandsHelping

• Verification steps (run from project root):

# 1. Install dependencies (if you haven’t already)
cd frontend
npm install

# 2. Confirm icon exports
grep -R -n "faTimeline" node_modules/@fortawesome/free-solid-svg-icons || echo "❌ faTimeline not found"
grep -R -n "faHandsHelping" node_modules/@fortawesome/free-solid-svg-icons || echo "❌ faHandsHelping not found"

If either icon is missing, swap in a supported free icon or bump your FontAwesome version before merging.

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

♻️ Duplicate comments (1)
frontend/src/app/about/page.tsx (1)

123-128: Array index still used as React key – re-introduces the reconciliation bug
The earlier review already flagged this; the fix seems to have been reverted.

-{keyFeatures.map((feature, index) => (
-  <div key={index} …
+{keyFeatures.map((feature) => (
+  <div key={feature.title} …
🧹 Nitpick comments (3)
frontend/src/app/about/page.tsx (3)

249-255: Minor: use a stable key for getInvolvedContent.ways

Using the list item text as the key avoids potential reordering issues and removes the need for the index param.

-{getInvolvedContent.ways.map((way, index) => (
-  <li key={index} …
+{getInvolvedContent.ways.map((way) => (
+  <li key={way} …

267-286: Timeline items keyed by array index

projectHistory provides both title and year; prefer a composite key for stability.

-{projectHistory.map((milestone, index) => (
-  <div key={index} …
+{projectHistory.map((milestone) => (
+  <div key={`${milestone.year}-${milestone.title}`} …

301-302: + suffix may contradict the new exact counters

Since AnimatedCounter now animates to the precise stat.value, appending “+” can mislead users (e.g., “42+ Stars”). Remove the suffix or change the counter to round down if the “+” is desired.

-<AnimatedCounter end={stat.value} duration={2} />+
+<AnimatedCounter end={stat.value} duration={2} />
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 74e9f3c and 76d67b6.

📒 Files selected for processing (1)
  • frontend/src/app/about/page.tsx (8 hunks)
🧰 Additional context used
🧬 Code Graph Analysis (1)
frontend/src/app/about/page.tsx (3)
frontend/src/utils/aboutData.ts (4)
  • missionContent (25-30)
  • keyFeatures (32-52)
  • getInvolvedContent (54-66)
  • projectHistory (68-97)
frontend/src/components/MarkdownWrapper.tsx (1)
  • Markdown (4-17)
frontend/src/components/AnimatedCounter.tsx (1)
  • AnimatedCounter (10-35)
🔇 Additional comments (1)
frontend/src/app/about/page.tsx (1)

11-15:

❓ Verification inconclusive

Verify that faTimeline exists in the Free-Solid icon set

faTimeline is part of Font Awesome 6 Pro and is not available in the free solid bundle used elsewhere in the project. Importing an icon that is absent at runtime will crash the page with
icon.lookup === undefined.

Run this check to confirm availability:

If faTimeline is missing, switch to a free alternative (e.g. faBarsStaggered) or add the Pro package.


🏁 Script executed:

#!/bin/bash
# List all exported icon names from @fortawesome/free-solid-svg-icons
node - <<'JS'
const { ...icons } = require('@fortawesome/free-solid-svg-icons')
console.log(Object.keys(icons).filter(k => k.startsWith('fa')))
JS

Length of output: 872


Verify that faTimeline exists in the Free-Solid icon set
The automated script failed (module not installed locally), so please manually confirm that faTimeline is exported by @fortawesome/free-solid-svg-icons. Importing a non-existent icon at runtime will cause icon.lookup === undefined and crash the page.

If faTimeline isn’t available in the free bundle:

  • Swap it out for a free alternative (e.g. faBarsStaggered)
  • Or install the Pro package (@fortawesome/pro-solid-svg-icons)

@rishyym0927
Copy link
Contributor Author

@kasya @arkid15r any more changes required in this pr?

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

🧹 Nitpick comments (4)
frontend/src/app/about/page.tsx (4)

111-119: Consider semantic <section> wrappers for top-level blocks

The Mission / Who-It’s-For cards are visually distinct but still reside in a generic <div>.
Wrapping each major area in a semantic <section> (with an aria-labelledby pointing to the AnchorTitle) will slightly improve accessibility and document outline without changing layout.


123-131: Use a guaranteed-unique key for keyFeatures items

key={${feature.title}-${feature.description.slice(0, 10)}} is better than an index, yet still risks collisions if two features share a title prefix or similar opening text.
If the data model allows it, expose an explicit id/slug field and use that instead:

- key={`${feature.title}-${feature.description.slice(0, 10)}`}
+ key={feature.id}

252-257: Minor: bullet list keys have the same collision risk

key={way.slice(0, 32)} can duplicate when two items start with the same phrase.
Either use the full string or (preferred) store an id alongside each entry in aboutData.ts.


265-295: Decorative timeline spine should be hidden from screen readers

The absolutely-positioned gradient line is purely visual.
Add aria-hidden="true" (or role="presentation") to the element to avoid it being announced as an empty “separator”.

-<div className="absolute bottom-0 left-4 top-8 w-0.5 bg-gradient-to-b ..."></div>
+<div
+  aria-hidden="true"
+  className="absolute bottom-0 left-4 top-8 w-0.5 bg-gradient-to-b ..."
+/>
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 76d67b6 and b261546.

📒 Files selected for processing (1)
  • frontend/src/app/about/page.tsx (8 hunks)
🔇 Additional comments (2)
frontend/src/app/about/page.tsx (2)

11-16: Verify newly-imported FontAwesome icons exist in the bundled library

faHandsHelping and faTimeline were historically PRO-only / renamed across FontAwesome major versions. If the project is still on @fortawesome/free-solid-svg-icons v5.x or an early 6.x release, this import will break the build at runtime (undefined icon).
Please double-check the installed package version and, if needed, upgrade or swap in the closest free alternative (e.g. faHandHoldingHeart, faStream).


30-37: 👍 Content extraction improves separation of concerns

Importing missionContent, keyFeatures, etc. from utils/aboutData keeps the page component lean and easier to maintain. Nicely done.

@rishyym0927
Copy link
Contributor Author

@kasya any more update required in this pr?

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

🧹 Nitpick comments (2)
frontend/src/app/about/page.tsx (2)

123-132: Key generator still fragile.

key={${feature.title}-${feature.description.slice(0, 10)}} improves on the array-index key, yet it can still collide if different features share the same title/first-10-chars combination (translation variants, AB tests, etc.).

- key={`${feature.title}-${feature.description.slice(0, 10)}`}
+ key={feature.id ?? feature.title}

Ideally expose a stable id in keyFeatures and use that here.


304-305: Literal "+" may double-count visual cue.

AnimatedCounter already counts to the exact value; appending a literal plus (+) could render 1234+, which might be misleading (implies “and more” while you’re showing the exact count).

Options:

  1. Remove + altogether if accuracy is intended.
  2. If “and more” is desired, round the value (e.g., to 1.2K) and keep the +.

Decision depends on UX, but current combo mixes semantics.

📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between b261546 and 3324527.

📒 Files selected for processing (3)
  • frontend/__tests__/e2e/pages/About.spec.ts (3 hunks)
  • frontend/__tests__/unit/pages/About.test.tsx (7 hunks)
  • frontend/src/app/about/page.tsx (8 hunks)
🚧 Files skipped from review as they are similar to previous changes (2)
  • frontend/tests/e2e/pages/About.spec.ts
  • frontend/tests/unit/pages/About.test.tsx

@rishyym0927 rishyym0927 changed the title Enhance About Page with New Sections and Tests Revamp About Page: Thematic Section Enhancements, Dynamic Content Structuring, and Comprehensive Testing Integration Jun 13, 2025
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 comments (1)
frontend/src/app/about/page.tsx (1)

3-17: ⚠️ Potential issue

Broken import block – file will not compile.

The first import { … statement is missing the closing } and the from '@fortawesome/free-solid-svg-icons' clause, so every line that follows is parsed as garbage. The linter error you saw (expected "as" but instead found "{") comes from this. Merge the two blocks into one well-formed import:

-import {
-  faCircleCheck,
-  faClock,
-  faUserGear,
-  faMapSigns,
-  faUsers,
-  faTools,
-  faArrowUpRightFromSquare,
-import {
-  faBullseye,
-  faUserGroup,
-  faRocket,
-  faHandshake,   // alternative to faHandsHelping
-  faHistory,     // alternative to faTimeline
-} from '@fortawesome/free-solid-svg-icons'
+import {
+  faCircleCheck,
+  faClock,
+  faUserGear,
+  faMapSigns,
+  faUsers,
+  faTools,
+  faArrowUpRightFromSquare,
+  faBullseye,
+  faUserGroup,
+  faRocket,
+  faHandshake,   // alternative to faHandsHelping
+  faHistory,     // alternative to faTimeline
+} from '@fortawesome/free-solid-svg-icons'

This single change removes the syntax error and restores the intended imports.

🧰 Tools
🪛 Biome (1.9.4)

[error] 11-11: expected as but instead found {

Remove {

(parse)


[error] 16-17: Expected an expression but instead found '}'.

Expected an expression here.

(parse)


[error] 17-17: Expected a semicolon or an implicit semicolon after a statement, but found none

An explicit or implicit semicolon is expected here...

...Which is required to end this statement

(parse)


[error] 11-17: This block statement doesn't serve any purpose and can be safely removed.

Standalone block statements without any block-level declarations are redundant in JavaScript and can be removed to simplify the code.

(lint/complexity/noUselessLoneBlockStatements)

🧹 Nitpick comments (1)
frontend/src/app/about/page.tsx (1)

274-276: Guard against non-string year type.

milestone.year.slice(-2) assumes year is a string. It is today, but one accidental change to a number will explode. Coerce defensively:

-  {milestone.year.slice(-2)}
+  {String(milestone.year).slice(-2)}

Tiny change, but eliminates a fragile runtime assumption.

📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 3324527 and 9738c2d.

📒 Files selected for processing (1)
  • frontend/src/app/about/page.tsx (8 hunks)
🧰 Additional context used
🧬 Code Graph Analysis (1)
frontend/src/app/about/page.tsx (3)
frontend/src/utils/aboutData.ts (4)
  • missionContent (25-30)
  • keyFeatures (32-52)
  • getInvolvedContent (54-66)
  • projectHistory (68-97)
frontend/src/components/MarkdownWrapper.tsx (1)
  • Markdown (4-17)
frontend/src/components/AnimatedCounter.tsx (1)
  • AnimatedCounter (10-35)
🪛 Biome (1.9.4)
frontend/src/app/about/page.tsx

[error] 11-11: expected as but instead found {

Remove {

(parse)


[error] 11-17: This block statement doesn't serve any purpose and can be safely removed.

Standalone block statements without any block-level declarations are redundant in JavaScript and can be removed to simplify the code.

(lint/complexity/noUselessLoneBlockStatements)

rishyym0927 and others added 2 commits June 14, 2025 00:36
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
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 comments (1)
frontend/src/app/about/page.tsx (1)

86-91: 🛠️ Refactor suggestion

isLoading / error-handling logic misses the “contributors query failed” case

topContributors is initialised as [] (truthy).
If topContributorsRequestError is non-null, !topContributors is false, so the error path is skipped and the component renders with an empty contributors list, silently swallowing the failure.

Consider simplifying the flags:

-const isLoading =
-  !projectMetadataResponse ||
-  !topContributorsResponse ||
-  (projectMetadataRequestError && !projectMetadata) ||
-  (topContributorsRequestError && !topContributors)
+const isLoading = !projectMetadataResponse || !topContributorsResponse
+
+if (projectMetadataRequestError) handleAppError(projectMetadataRequestError)
+if (topContributorsRequestError) handleAppError(topContributorsRequestError)

…and render a dedicated <ErrorDisplay> when either error is present.
This prevents silent data loss and improves UX.

♻️ Duplicate comments (1)
frontend/src/app/about/page.tsx (1)

11-16: ⚠️ Potential issue

Missing & obsolete Font-Awesome imports – will crash at runtime

faHandshake and faHistory are used below (lines 248 & 265) but are not imported, while faHandsHelping and faTimeline are no longer used (and don’t exist in the free-solid set). This results in ReferenceError: faHandshake is not defined.

-import {
-  faCircleCheck,
-  faClock,
-  faUserGear,
-  faMapSigns,
-  faUsers,
-  faTools,
-  faArrowUpRightFromSquare,
-  faBullseye,
-  faUserGroup,
-  faRocket,
-  faHandsHelping,
-  faTimeline,
-} from '@fortawesome/free-solid-svg-icons'
+import {
+  faCircleCheck,
+  faClock,
+  faUserGear,
+  faMapSigns,
+  faUsers,
+  faTools,
+  faArrowUpRightFromSquare,
+  faBullseye,
+  faUserGroup,
+  faRocket,
+  faHandshake,
+  faHistory,
+} from '@fortawesome/free-solid-svg-icons'
🧹 Nitpick comments (1)
frontend/src/app/about/page.tsx (1)

124-127: Unstable React keys – risk of duplicate key warnings

Using a slice of description is fragile; two features with identical first 10 chars collide. Prefer a stable, intrinsic identifier.

- key={`${feature.title}-${feature.description.slice(0, 10)}`}
+ key={feature.title}
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 4f3184b and 547a7c4.

📒 Files selected for processing (1)
  • frontend/src/app/about/page.tsx (8 hunks)
🔇 Additional comments (1)
frontend/src/app/about/page.tsx (1)

270-275: milestone.year.slice() assumes string – possible runtime error

If year comes in as a number (e.g., 2020) you’ll get year.slice is not a function.

- {milestone.year.slice(-2)}
+ {String(milestone.year).slice(-2)}

Copy link
Collaborator

@kasya kasya left a comment

Choose a reason for hiding this comment

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

Thanks for the updates! I have a few more requests!

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 comments (1)
frontend/src/app/about/page.tsx (1)

296-306: 🛠️ Refactor suggestion

Animated counter can render “0+” for small projects.

Rounding down with Math.floor(stat.value / 10) * 10 makes counts below 10 display as 0+, which looks broken.

- <AnimatedCounter end={Math.floor(stat.value / 10) * 10} duration={2} />+
+ <AnimatedCounter
+   end={stat.value < 10 ? stat.value : Math.floor(stat.value / 10) * 10}
+   duration={2}
+ />+

This preserves the “rounded-with-plus” style while avoiding a misleading zero.

♻️ Duplicate comments (1)
frontend/src/app/about/page.tsx (1)

270-276: Repeat of earlier slice-on-possibly-numeric issue.

milestone.year.slice(-2) assumes year is a string. A future data refactor that stores it as a number (2024) will crash this section (year.slice is not a function).

Same concern was raised in the previous review but remains unfixed.

- {milestone.year.slice(-2)}
+ {String(milestone.year).slice(-2)}
🧹 Nitpick comments (1)
frontend/src/app/about/page.tsx (1)

252-257: key generation may still collide.

Using way.slice(0, 32) increases the risk of duplicate keys if the first 32 chars of two list items match. React will silently reuse the DOM node, causing subtle UI bugs.

- <li key={way.slice(0, 32)} ...
+ <li key={way} ...

Each string in getInvolvedContent.ways is already unique and stable, so the full string is sufficient.

📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 547a7c4 and bffec13.

📒 Files selected for processing (1)
  • frontend/src/app/about/page.tsx (7 hunks)
🧰 Additional context used
🧬 Code Graph Analysis (1)
frontend/src/app/about/page.tsx (2)
frontend/src/utils/aboutData.ts (4)
  • missionContent (25-30)
  • keyFeatures (32-52)
  • getInvolvedContent (54-66)
  • projectHistory (68-97)
frontend/src/components/MarkdownWrapper.tsx (1)
  • Markdown (4-17)
🔇 Additional comments (1)
frontend/src/app/about/page.tsx (1)

11-16: Icon choice fixed – looks good.

The previous build-breaking icons (faTimeline, faHandsHelping) have been replaced with free-tier equivalents that exist in @fortawesome/free-solid-svg-icons. 👍

@rishyym0927
Copy link
Contributor Author

@kasya I have made all the necessary changes which were requested

@rishyym0927 rishyym0927 requested a review from kasya June 14, 2025 12:17
kasya
kasya previously approved these changes Jun 14, 2025
Copy link
Collaborator

@kasya kasya left a comment

Choose a reason for hiding this comment

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

This looks good to me!
Let's wait on @arkid15r to review actual content for the page though 👌🏼

@rishyym0927
Copy link
Contributor Author

Hey @arkid15r ! Does the content require any changes?

Copy link
Collaborator

@arkid15r arkid15r left a comment

Choose a reason for hiding this comment

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

This is a good start but requires more work in order to be merged:

Screenshot 2025-06-15 at 10 29 46 AM

The key features font is inconsistent with the page style. I think the roadmap section is what we need. The empty space before key features is too large.

Please also address the following:

@rishyym0927
Copy link
Contributor Author

Hey @arkid15r I have fixed all the requested changes

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

🧹 Nitpick comments (3)
frontend/src/utils/aboutData.ts (2)

16-21: Prefer satisfies for literal-type safety without redundant casts

You already have an explicit annotation (MissionContent) and an as const cast.
as const freezes the literal types, but the explicit annotation immediately widens them back to string, so the benefit is lost.
Using the satisfies operator lets you keep literal inference while still validating against the interface.

-export const missionContent: MissionContent = {
+export const missionContent = {
   mission: 'OWASP Nest is ...',
   whoItsFor: "OWASP Nest is designed for ...",
-} as const
+} as const satisfies MissionContent

96-165: Minor name capitalisation issues (“Typescript”, “PlayWright”)

Small consistency nit: the official branding is “TypeScript” and “Playwright” (lower-case “w”). Helps avoid broken links / icon paths later.

-      Typescript: {
+      TypeScript: {
         icon: '/images/icons/typescript.svg',
         url: 'https://www.typescriptlang.org/',
       },
...
-      PlayWright: {
+      Playwright: {
         icon: '/images/icons/playwright.svg',
         url: 'https://playwright.dev/',
       },
frontend/src/app/about/page.tsx (1)

254-258: Use the item itself, not the array index, as React key

index as the key can cause incorrect reconciliation if the list ever re-orders.
Since every way string is unique, it can act as a stable key.

-              {getInvolvedContent.ways.map((way, index) => (
-                <li key={index} className="flex items-start gap-2">
+              {getInvolvedContent.ways.map((way) => (
+                <li key={way} className="flex items-start gap-2">
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between bffec13 and f8c858b.

📒 Files selected for processing (3)
  • frontend/src/app/about/page.tsx (7 hunks)
  • frontend/src/types/about.ts (1 hunks)
  • frontend/src/utils/aboutData.ts (1 hunks)
✅ Files skipped from review due to trivial changes (1)
  • frontend/src/types/about.ts
🧰 Additional context used
🧬 Code Graph Analysis (2)
frontend/src/utils/aboutData.ts (1)
frontend/src/types/about.ts (6)
  • MissionContent (18-21)
  • KeyFeature (1-4)
  • GetInvolved (12-16)
  • ProjectHistory (6-10)
  • Leaders (23-25)
  • TechnologySection (27-35)
frontend/src/app/about/page.tsx (2)
frontend/src/utils/aboutData.ts (4)
  • missionContent (16-21)
  • keyFeatures (23-43)
  • getInvolvedContent (45-57)
  • projectHistory (59-88)
frontend/src/components/MarkdownWrapper.tsx (1)
  • Markdown (4-17)
🔇 Additional comments (3)
frontend/src/utils/aboutData.ts (1)

90-95: Typed leaders map looks good

The Leaders map aligns with the newly introduced Leaders type and is used downstream for filtering and display. No issues spotted.

frontend/src/app/about/page.tsx (2)

30-37: Clean data import keeps component lean

Good call extracting all static content to utils/aboutData.ts and importing it here—this keeps the page component focused on presentation and data-fetching logic.


111-119: Mission / Audience section renders correctly

Layout and accessibility (semantic headings, readable text colour in dark mode) look solid. No action required.

@rishyym0927
Copy link
Contributor Author

@arkid15r any update?

Copy link
Collaborator

@arkid15r arkid15r left a comment

Choose a reason for hiding this comment

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

Hey @arkid15r I have fixed all the requested changes.

Yes, this requires more attention.

@@ -35,6 +35,78 @@ jest.mock('utils/aboutData', () => ({
'This is a test paragraph about the project.',
'This is another paragraph about the project history.',
],
leaders: {
Copy link
Collaborator

Choose a reason for hiding this comment

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

These look like exact copies of what we have in aboutData.ts. Can we avoid the duplication?

'Leverage AI-powered insights to better understand project relationships and recommendations.',
},
],
getInvolvedContent: {
Copy link
Collaborator

Choose a reason for hiding this comment

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

Was it intended to look like this?

Screenshot 2025-06-16 at 8 38 07 PM

The list item markers are misaligned and the links color isn't the one we normally use.

callToAction:
'To get started, visit the OWASP Nest Repository, explore the Contributing Guidelines, and review the Code of Conduct.',
},
projectHistory: [
Copy link
Collaborator

Choose a reason for hiding this comment

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

This one looks inconsistent w/ the rest of the content too. I don't get your point of having multiple styles on the same page 🤷‍♂️

Screenshot 2025-06-16 at 8 43 06 PM

Copy link
Collaborator

Choose a reason for hiding this comment

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

Same for the white theme

Screenshot 2025-06-16 at 8 45 13 PM

Copy link

@kasya
Copy link
Collaborator

kasya commented Jun 19, 2025

@rishyym0927 do you plan to address these comments? Just checking in if this is still WIP.

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.

Improve /about page
3 participants