From 939d90e5b75d2da7c7ebc618d8d395e890e61910 Mon Sep 17 00:00:00 2001 From: Saurabh-2607 Date: Thu, 28 May 2026 12:00:00 +0530 Subject: [PATCH 01/11] feat: revamp member profile page with new layout and components --- frontend/src/app/members/[memberKey]/page.tsx | 161 ++++++------------ frontend/src/components/InfoBlock.tsx | 17 +- frontend/src/components/RepositoryCard.tsx | 4 +- .../components/cards/MemberDetailSidebar.tsx | 100 +++++++++++ .../components/cards/RepositoriesModules.tsx | 2 +- 5 files changed, 159 insertions(+), 125 deletions(-) create mode 100644 frontend/src/components/cards/MemberDetailSidebar.tsx diff --git a/frontend/src/app/members/[memberKey]/page.tsx b/frontend/src/app/members/[memberKey]/page.tsx index 15e69f3ef6..c8e593fce3 100644 --- a/frontend/src/app/members/[memberKey]/page.tsx +++ b/frontend/src/app/members/[memberKey]/page.tsx @@ -1,89 +1,30 @@ 'use client' import { useQuery } from '@apollo/client/react' -import Image from 'next/image' import Link from 'next/link' import { useParams } from 'next/navigation' import React, { useEffect, useMemo } from 'react' -import { FaCodeMerge, FaFolderOpen, FaPersonWalkingArrowRight, FaUserPlus } from 'react-icons/fa6' import { handleAppError, ErrorDisplay } from 'app/global-error' import { GetUserDataDocument } from 'types/__generated__/userQueries.generated' -import { Badge } from 'types/badge' import { User } from 'types/user' -import { formatDate } from 'utils/dateFormatter' -import Badges from 'components/Badges' -import Contributions from 'components/cards/Contributions' -import Contributors from 'components/cards/Contributors' -import Header from 'components/cards/Header' -import IssuesMilestones from 'components/cards/IssuesMilestones' -import Metadata from 'components/cards/Metadata' +import MemberDetailSidebar from 'components/cards/MemberDetailSidebar' import PageWrapper from 'components/cards/PageWrapper' import RepositoriesModules from 'components/cards/RepositoriesModules' -import Summary from 'components/cards/Summary' import ContributionHeatmap from 'components/ContributionHeatmap' +import Milestones from 'components/Milestones' +import RecentIssues from 'components/RecentIssues' +import RecentPullRequests from 'components/RecentPullRequests' +import RecentReleases from 'components/RecentReleases' +import SecondaryCard from 'components/SecondaryCard' import MemberDetailsPageSkeleton from 'components/skeletons/MemberDetailsPageSkeleton' -type DateRange = { startDate: string; endDate: string } - interface UserSummaryProps { user: User | null - contributionData: Record - dateRange: DateRange - hasContributionData: boolean formattedBio: React.ReactNode } -export const UserSummary: React.FC = ({ - user, - contributionData, - dateRange, - hasContributionData, - formattedBio, -}) => ( -
- {user?.name -
-
-
- - @{user?.login} - - {user?.badges && user.badges.length > 0 && ( -
- {user.badges.slice().map((badge: Badge) => ( - - - - ))} -
- )} -
-

{formattedBio}

-
- {hasContributionData && dateRange.startDate && dateRange.endDate && ( -
-
- -
-
- )} -
-
+export const UserSummary: React.FC = ({ user, formattedBio }) => ( + ) const UserDetailsPage: React.FC = () => { @@ -181,56 +122,52 @@ const UserDetailsPage: React.FC = () => { ) } - const userDetails = [ - { label: 'Joined', value: user?.createdAt ? formatDate(user.createdAt) : 'Not available' }, - { label: 'Email', value: user?.email || 'N/A' }, - { label: 'Company', value: user?.company || 'N/A' }, - { label: 'Location', value: user?.location || 'N/A' }, - ] - - const userStats = [ - { icon: FaPersonWalkingArrowRight, value: user?.followersCount || 0, unit: 'Follower' }, - { icon: FaUserPlus, value: user?.followingCount || 0, unit: 'Following' }, - { - icon: FaFolderOpen, - pluralizedName: 'Repositories', - unit: 'Repository', - value: user?.publicRepositoriesCount ?? 0, - }, - { icon: FaCodeMerge, value: user?.contributionsCount || 0, unit: 'Contribution' }, - ] - return ( -
- - - } - /> - - - - +
+
+ + +
+ {hasContributionData && dateRange.startDate && dateRange.endDate && ( + +
+ +
+
+ )} - +
+ +
- +
+
+ +
+
+ +
+
- +
+
+ +
+
+ +
+
+
+
+
) } diff --git a/frontend/src/components/InfoBlock.tsx b/frontend/src/components/InfoBlock.tsx index 281e9777f1..e50f8f057b 100644 --- a/frontend/src/components/InfoBlock.tsx +++ b/frontend/src/components/InfoBlock.tsx @@ -14,7 +14,7 @@ const InfoBlock = ({ value = 0, }: { className?: string - icon: IconType + icon?: IconType label?: string pluralizedName?: string precision?: number @@ -26,15 +26,12 @@ const InfoBlock = ({ const tooltipValue = value ? `${value.toLocaleString()} ${name}` : `No ${name}` return ( -
- -
-
- {label &&
{label}
} - - {formattedValue} - -
+
+ {icon && } +
+ + {formattedValue} +
) diff --git a/frontend/src/components/RepositoryCard.tsx b/frontend/src/components/RepositoryCard.tsx index 03c0b5a661..985ec273b2 100644 --- a/frontend/src/components/RepositoryCard.tsx +++ b/frontend/src/components/RepositoryCard.tsx @@ -11,7 +11,7 @@ import StatusBadge from 'components/StatusBadge' import { TruncatedText } from 'components/TruncatedText' const RepositoryCard: React.FC = ({ - maxInitialDisplay = 4, + maxInitialDisplay = 6, repositories, }) => { const [showAllRepositories, setShowAllRepositories] = useState(false) @@ -25,7 +25,7 @@ const RepositoryCard: React.FC = ({ : repositories.slice(0, maxInitialDisplay) return (
-
+
{displayedRepositories.map((repository) => { return ( { + const details: Detail[] = [ + { label: 'Joined', value: user.createdAt ? formatDate(user.createdAt) : 'Not available' }, + { label: 'Email', value: user.email || 'N/A' }, + { label: 'Company', value: user.company || 'N/A' }, + { label: 'Location', value: user.location || 'N/A' }, + ] + + const stats: Stat[] = [ + { icon: FaPersonWalkingArrowRight, value: user.followersCount || 0, unit: 'Follower' }, + { icon: FaUserPlus, value: user.followingCount || 0, unit: 'Following' }, + { + icon: FaFolderOpen, + pluralizedName: 'Repositories', + unit: 'Repository', + value: user.publicRepositoriesCount ?? 0, + }, + { icon: FaCodeMerge, value: user.contributionsCount || 0, unit: 'Contribution' }, + ] + + return ( +
+
+ {user.name +
+

+ {user.name || user.login} +

+ + @{user.login} + +

{formattedBio}

+
+
+ +
+
+ {details.map((detail) => ( +
+ {detail.label} : + {detail.value} +
+ ))} +
+
+ +
+
+ {stats.map((stat) => ( + + ))} +
+
+
+ ) +} + +export default MemberDetailSidebar diff --git a/frontend/src/components/cards/RepositoriesModules.tsx b/frontend/src/components/cards/RepositoriesModules.tsx index d93bed8d54..9a1c5b7993 100644 --- a/frontend/src/components/cards/RepositoriesModules.tsx +++ b/frontend/src/components/cards/RepositoriesModules.tsx @@ -25,7 +25,7 @@ const RepositoriesModules = ({ <> {repositories.length > 0 && ( }> - + )} {modules && From 3734f7af5a71190e9c81f32ba76c22d19634a31c Mon Sep 17 00:00:00 2001 From: Saurabh-2607 Date: Fri, 29 May 2026 12:00:00 +0530 Subject: [PATCH 02/11] fix: adjust grid classes in ItemCardList, RecentReleases, and Release components; remove Closed from Milestones --- frontend/src/components/ItemCardList.tsx | 4 ++-- frontend/src/components/Milestones.tsx | 4 ---- frontend/src/components/RecentReleases.tsx | 2 +- frontend/src/components/Release.tsx | 2 +- 4 files changed, 4 insertions(+), 8 deletions(-) diff --git a/frontend/src/components/ItemCardList.tsx b/frontend/src/components/ItemCardList.tsx index 1bf4a997dc..93a3c58f4c 100644 --- a/frontend/src/components/ItemCardList.tsx +++ b/frontend/src/components/ItemCardList.tsx @@ -90,7 +90,7 @@ const ItemCardList = ({ {data && data.length > 0 ? (
{data.map((item, index) => { const getItemKey = (i: ItemCardData, idx: number): string => { @@ -107,7 +107,7 @@ const ItemCardList = ({ return (
diff --git a/frontend/src/components/Milestones.tsx b/frontend/src/components/Milestones.tsx index 5d708718f9..0a5d11df1e 100644 --- a/frontend/src/components/Milestones.tsx +++ b/frontend/src/components/Milestones.tsx @@ -43,10 +43,6 @@ const Milestones: React.FC = ({ {item.createdAt ? formatDate(item.createdAt) : 'N/A'}
-
- - {item.closedIssuesCount} closed -
{item.openIssuesCount} open diff --git a/frontend/src/components/RecentReleases.tsx b/frontend/src/components/RecentReleases.tsx index d1c02d6aff..e736b6a8e8 100644 --- a/frontend/src/components/RecentReleases.tsx +++ b/frontend/src/components/RecentReleases.tsx @@ -27,7 +27,7 @@ const RecentReleases: React.FC = ({ > {data && data.length > 0 ? (
{data.map((item) => ( = ({ } return ( -
+
{showAvatar && release?.author && ( From 1db0207638f63dfc0468716f0ab4f2838b575ad7 Mon Sep 17 00:00:00 2001 From: Saurabh-2607 Date: Sat, 30 May 2026 13:09:52 +0530 Subject: [PATCH 03/11] minor fixes --- frontend/src/components/ContributionHeatmap.tsx | 11 +++++++---- frontend/src/components/cards/MemberDetailSidebar.tsx | 8 +++++--- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/frontend/src/components/ContributionHeatmap.tsx b/frontend/src/components/ContributionHeatmap.tsx index 95a7e2338c..f798408b8f 100644 --- a/frontend/src/components/ContributionHeatmap.tsx +++ b/frontend/src/components/ContributionHeatmap.tsx @@ -316,7 +316,7 @@ const ContributionHeatmap: React.FC = ({ )} {/* scroll wrapper for small screens */} -
+
diff --git a/frontend/src/components/cards/MemberDetailSidebar.tsx b/frontend/src/components/cards/MemberDetailSidebar.tsx index f140474661..f347804dfb 100644 --- a/frontend/src/components/cards/MemberDetailSidebar.tsx +++ b/frontend/src/components/cards/MemberDetailSidebar.tsx @@ -46,11 +46,11 @@ const MemberDetailSidebar = ({ user, formattedBio }: MemberDetailSidebarProps) = return (
-
+
{user.name @@ -64,7 +64,9 @@ const MemberDetailSidebar = ({ user, formattedBio }: MemberDetailSidebarProps) = > @{user.login} -

{formattedBio}

+
+ {formattedBio} +
From 5dbe44b56ed4cee68b709662f90784ac19a2bdb4 Mon Sep 17 00:00:00 2001 From: Saurabh-2607 Date: Sat, 30 May 2026 13:15:31 +0530 Subject: [PATCH 04/11] update skeleton --- .../skeletons/MemberDetailsPageSkeleton.tsx | 247 ++++++++---------- 1 file changed, 114 insertions(+), 133 deletions(-) diff --git a/frontend/src/components/skeletons/MemberDetailsPageSkeleton.tsx b/frontend/src/components/skeletons/MemberDetailsPageSkeleton.tsx index 387b295924..2565bfdcfe 100644 --- a/frontend/src/components/skeletons/MemberDetailsPageSkeleton.tsx +++ b/frontend/src/components/skeletons/MemberDetailsPageSkeleton.tsx @@ -4,158 +4,139 @@ import { CardSection, PageWrapper, SectionHeader, - TitleSection, TwoColumnSection, } from 'components/skeletons/sharedSkeletons' const MemberDetailsPageSkeleton: React.FC = () => { return ( - - - {/* User Summary Card - bg-gray-100 like SecondaryCard */} -
-
- {/* Avatar */} -