Spaces:
Running
Running
import React, { useState, useEffect } from "react"; | |
import { GetServerSidePropsContext } from "next"; | |
import { OpenSourceHeatmapProps } from "../../types/heatmap"; | |
import { generateCalendarData } from "../../utils/calendar"; | |
import Heatmap from "../../components/Heatmap"; | |
import { fetchOrganizationData, fetchAuthorData } from "../../utils/authors"; | |
const DEFAULT_COLOR = "#FF9D00"; | |
const OpenSourceHeatmap: React.FC<OpenSourceHeatmapProps> = ({ | |
calendarData, | |
providers, | |
}) => { | |
const [isLoading, setIsLoading] = useState(true); | |
useEffect(() => { | |
if (calendarData && Object.keys(calendarData).length > 0) { | |
setIsLoading(false); | |
} | |
}, [calendarData]); | |
return ( | |
<div className="w-full max-w-screen-lg mx-auto p-4"> | |
{isLoading ? ( | |
<p className="text-center">Loading...</p> | |
) : ( | |
<div> | |
{Object.entries(providers) | |
.sort( | |
([keyA], [keyB]) => | |
calendarData[keyB].reduce((sum, day) => sum + day.count, 0) - | |
calendarData[keyA].reduce((sum, day) => sum + day.count, 0) | |
) | |
.map(([providerName, { color, fullName, avatarUrl }]) => ( | |
<Heatmap | |
key={providerName} | |
data={calendarData[providerName]} | |
color={color} | |
providerName={providerName} | |
fullName={fullName ?? providerName} | |
avatarUrl={avatarUrl ?? ''} | |
authorId={providerName} | |
/> | |
))} | |
</div> | |
)} | |
</div> | |
); | |
}; | |
export async function getServerSideProps(context: GetServerSidePropsContext) { | |
const { author, color } = context.query; | |
const authorColor = color || DEFAULT_COLOR; | |
try { | |
const { fullName, avatarUrl } = await fetchOrganizationData([author as string]); | |
const providers = { | |
[author as string]: { | |
color: authorColor as string, | |
authors: [author as string], | |
fullName, | |
avatarUrl, | |
}, | |
}; | |
const flatData = await fetchAuthorData(author as string); | |
const calendarData = generateCalendarData(flatData, [providers[author as string]]); | |
return { | |
props: { | |
calendarData, | |
color: authorColor, | |
providers, | |
}, | |
}; | |
} catch (error) { | |
console.error("Error fetching data:", error); | |
return { | |
props: { | |
calendarData: {}, | |
color: authorColor, | |
providers: { | |
[author as string]: { | |
color: authorColor as string, | |
authors: [author as string], | |
fullName: author, | |
avatarUrl: null, | |
}, | |
}, | |
}, | |
}; | |
} | |
} | |
export default OpenSourceHeatmap; |