From 92c7c0d8a1a9054dea4b2e641276c935181684a4 Mon Sep 17 00:00:00 2001 From: activus-d Date: Thu, 9 Jan 2025 06:51:42 +0100 Subject: [PATCH] Add a toggle feature to the 'contributors' section to allow visitors to sort the list of contributors by the number of commits or the lastest commits --- ui/src/index.ts | 1 + .../(components)/contributors-client.tsx | 34 +++++++++- .../open-source/(components)/get-commits.ts | 17 ++++- .../open-source/(sections)/contributors.tsx | 67 ++++++++++++++++++- 4 files changed, 110 insertions(+), 9 deletions(-) diff --git a/ui/src/index.ts b/ui/src/index.ts index eedc35e21..f17f2a41f 100644 --- a/ui/src/index.ts +++ b/ui/src/index.ts @@ -27,3 +27,4 @@ export * from './components/table'; export * from './components/tabs'; export * from './components/tooltip'; export * from './components/typography'; +export * from './components/toggle-group'; diff --git a/website/src/app/[lang]/[region]/(website)/open-source/(components)/contributors-client.tsx b/website/src/app/[lang]/[region]/(website)/open-source/(components)/contributors-client.tsx index cc1db2392..346623cb4 100644 --- a/website/src/app/[lang]/[region]/(website)/open-source/(components)/contributors-client.tsx +++ b/website/src/app/[lang]/[region]/(website)/open-source/(components)/contributors-client.tsx @@ -1,6 +1,7 @@ 'use client'; import { Avatar, AvatarFallback, AvatarImage, Button, Typography } from '@socialincome/ui'; +import { ToggleGroup, ToggleGroupItem } from '@socialincome/ui'; import { useState } from 'react'; type ContributorProp = { @@ -9,6 +10,13 @@ type ContributorProp = { avatarUrl: string; }; +interface Contributor { + id: number; + name: string; + avatarUrl: string; + commits: number; +} + function Contributor({ name, commits, avatarUrl }: ContributorProp) { return (
@@ -29,18 +37,31 @@ function Contributor({ name, commits, avatarUrl }: ContributorProp) { } export function OpenSourceContributorsClient({ - contributors, + contributorsByCommitCount, + contributorsByLatestCommit, heading, totalContributors, }: { - contributors: Array<{ name: string; commits: number; avatarUrl: string; id: number }>; + contributorsByCommitCount: Contributor[]; + contributorsByLatestCommit: Contributor[]; heading: string; totalContributors: number; }) { const [showAllContributors, setShowAllContributors] = useState(false); + const [selectedToggle, setSelectedToggle] = useState("commit count"); + const [contributors, setContributors] = useState(contributorsByCommitCount); const displayedContributors = showAllContributors ? contributors : contributors.slice(0, 16); + const handleToggleChange = (value: string) => { + setSelectedToggle(value); + if (value === "latest commit") { + setContributors(contributorsByLatestCommit); + } else { + setContributors(contributorsByCommitCount); + } + }; + return (
@@ -49,8 +70,15 @@ export function OpenSourceContributorsClient({
+
+ + Commit Count + Latest Commit + +
+
- {displayedContributors.map((contributor) => ( + {displayedContributors.map((contributor: Contributor) => ( (); + totalCommitsData.forEach((commit: GitHubCommit) => { + if (commit.author?.id && commit.commit?.author?.date) { + const contributorId = commit.author.id; + const commitDate = new Date(commit.commit.author.date); + const existingDate = latestCommitDates.get(contributorId); + if (!existingDate || commitDate > existingDate) { + latestCommitDates.set(contributorId, commitDate); + } + } + }); + + // Combine contributors' data with their latest commit dates + const combinedContributors = contributors + .filter((contributor) => latestCommitDates.has(contributor.id)) + .map((contributor) => ({ + id: contributor.id, + name: contributor.name, + avatarUrl: contributor.avatarUrl, + commits: contributor.commits, + latestCommitDate: latestCommitDates.get(contributor.id) || new Date(0), + })); + + const totalContributors = combinedContributors.length; + + const contributorsByCommitCount = [...combinedContributors].sort( + (a: CombinedContributor, b: CombinedContributor) => b.commits - a.commits + ); + + const contributorsByLatestCommit = [...combinedContributors].sort( + (a: CombinedContributor, b: CombinedContributor) => b.latestCommitDate.getTime() - a.latestCommitDate.getTime() + ); return ( - + ); }