11import { PieChart , Pie , Cell , ResponsiveContainer , Tooltip } from "recharts" ;
22import { Code2 } from "lucide-react" ;
3- import { useGitHubStats } from "../../hooks/useGitHubStats" ;
3+ import { useGitHubStats , type GitHubLanguage } from "../../hooks/useGitHubStats" ;
44
55interface ProgrammingLanguagesPieProps {
6- username : string ;
6+ username ? : string | null ;
77 className ?: string ;
8+ languages ?: GitHubLanguage [ ] ;
9+ loading ?: boolean ;
810}
911
1012// Balanced teal/green theme colors - not too bright, not too dark
@@ -17,14 +19,28 @@ const COLORS = [
1719 "#10b981" , // emerald-500
1820] ;
1921
20- export function ProgrammingLanguagesPie ( { username, className = "" } : ProgrammingLanguagesPieProps ) {
21- const { data : githubData } = useGitHubStats ( username ) ;
22+ export function ProgrammingLanguagesPie ( {
23+ username,
24+ className = "" ,
25+ languages : providedLanguages ,
26+ loading : forcedLoading ,
27+ } : ProgrammingLanguagesPieProps ) {
28+ const shouldFetch = ! providedLanguages && ! ! username ;
29+ const { data : githubData , loading } = useGitHubStats ( shouldFetch ? ( username ?? null ) : null ) ;
30+ const languages = providedLanguages ?? githubData ?. languages ?? [ ] ;
31+ const isLoading = typeof forcedLoading === "boolean" ? forcedLoading : ( shouldFetch ? loading : false ) ;
32+ const hasLanguages = languages . length > 0 ;
33+ const chartData = hasLanguages
34+ ? languages . slice ( 0 , 6 ) . map ( lang => ( {
35+ name : lang . name ,
36+ value : parseFloat ( lang . percentage . replace ( '%' , '' ) ) ,
37+ percentage : lang . percentage ,
38+ } ) )
39+ : [ ] ;
2240
23- const chartData = githubData ?. languages ?. slice ( 0 , 6 ) . map ( lang => ( {
24- name : lang . name ,
25- value : parseFloat ( lang . percentage . replace ( '%' , '' ) ) ,
26- percentage : lang . percentage ,
27- } ) ) || [ ] ;
41+ if ( ! isLoading && ! hasLanguages ) {
42+ return null ;
43+ }
2844
2945 const CustomTooltip = ( { active, payload } : { active ?: boolean ; payload ?: Array < { payload : { name : string ; percentage : string } } > } ) => {
3046 if ( active && payload && payload . length ) {
@@ -48,14 +64,14 @@ export function ProgrammingLanguagesPie({ username, className = "" }: Programmin
4864 < div className = "flex items-center gap-2 mb-4" >
4965 < Code2 size = { 14 } className = "text-gray-600 dark:text-gray-400" />
5066 < h4 className = "text-sm font-medium text-gray-900 dark:text-white" > Language Distribution</ h4 >
51- { githubData ?. languages && (
67+ { hasLanguages && (
5268 < span className = "text-xs text-gray-500 dark:text-gray-400 ml-auto" >
53- Top { Math . min ( 6 , githubData . languages . length ) }
69+ Top { Math . min ( 6 , languages . length ) }
5470 </ span >
5571 ) }
5672 </ div >
5773
58- { githubData ?. languages && githubData . languages . length > 0 ? (
74+ { hasLanguages ? (
5975 < div className = "space-y-4" >
6076 { /* Compact Chart */ }
6177 < div className = "h-32 flex items-center justify-center" >
0 commit comments