@@ -4,18 +4,7 @@ import { useMemo, useState } from "react";
44import { CompareForm } from "../components/compare-form" ;
55import { ResultDashboard } from "../components/result-dashboard" ;
66import { DashboardSkeleton } from "../components/skeletons" ;
7-
8-
9- type UserResult = {
10- username : string ;
11- repoScore : number ;
12- prScore : number ;
13- contributionScore : number ;
14- finalScore : number ;
15- topRepos : { name ?: string ; stars ?: number ; score ?: number } [ ] ;
16- topPullRequests : { repo ?: string ; stars ?: number ; score ?: number } [ ] ;
17- insights ?: string [ ] ;
18- } ;
7+ import { UserResult } from "@/types/user-result" ;
198
209type ApiResponse = {
2110 success : boolean ;
@@ -26,9 +15,10 @@ type ApiResponse = {
2615export default function HomePage ( ) {
2716 const [ loading , setLoading ] = useState ( false ) ;
2817 const [ error , setError ] = useState < string | null > ( null ) ;
29- const [ data , setData ] = useState < { user1 : UserResult ; user2 : UserResult } | null > (
30- null
31- ) ;
18+ const [ data , setData ] = useState < {
19+ user1 : UserResult ;
20+ user2 : UserResult ;
21+ } | null > ( null ) ;
3222
3323 const handleCompare = async ( u1 : string , u2 : string ) => {
3424 setLoading ( true ) ;
@@ -43,7 +33,19 @@ export default function HomePage() {
4333 if ( ! body . success || ! body . users || body . users . length < 2 ) {
4434 throw new Error ( body . error || "Comparison failed" ) ;
4535 }
46- setData ( { user1 : body . users [ 0 ] , user2 : body . users [ 1 ] } ) ;
36+ if ( body . users [ 0 ] . finalScore > body . users [ 1 ] . finalScore ) {
37+ setData ( {
38+ user1 : { ...body . users [ 0 ] , isWinner : true } ,
39+ user2 : body . users [ 1 ] ,
40+ } ) ;
41+ } else if ( body . users [ 1 ] . finalScore > body . users [ 0 ] . finalScore ) {
42+ setData ( {
43+ user1 : body . users [ 0 ] ,
44+ user2 : { ...body . users [ 1 ] , isWinner : true } ,
45+ } ) ;
46+ } else {
47+ setData ( { user1 : body . users [ 0 ] , user2 : body . users [ 1 ] } ) ;
48+ }
4749 } catch ( err : any ) {
4850 setError ( err . message || "Failed to fetch" ) ;
4951 } finally {
@@ -53,27 +55,37 @@ export default function HomePage() {
5355
5456 const skeleton = useMemo ( ( ) => < DashboardSkeleton /> , [ ] ) ;
5557
58+ const reset = ( ) => {
59+ setData ( null ) ;
60+ setError ( null ) ;
61+ } ;
62+ const swapUsers = ( ) => {
63+ if ( ! data ) return ;
64+ setData ( ( d ) => ( { user1 : d ! . user2 , user2 : d ! . user1 } ) ) ;
65+ console . log ( "Swapped users" , data ) ;
66+ } ;
5667 return (
5768 < main className = "min-h-screen" >
58- < div className = "max-w-6xl mx-auto px-4 py-10 space-y-6" >
59- < div className = "flex items-center justify-between gap-4" >
60- < div className = "flex items-center gap-3" >
61- < div >
62- < p className = "text-sm text-slate-500" > GitHub Developer Compare</ p >
63- < h1 className = "text-3xl font-semibold text-slate-900" >
64- Compare two developers
65- </ h1 >
66- </ div >
69+ { " " }
70+ < header className = "sticky top-0 z-50 w-full border-b bg-background/95 backdrop-blur supports-[backdrop-filter]:bg-background/60" >
71+ < div className = "container flex h-16 max-w-7xl items-center justify-between m-auto px-4" >
72+ < div className = "flex items-center gap-2 font-bold text-xl" >
73+ < span className = "bg-gradient-to-r from-primary to-primary/60 bg-clip-text text-transparent" >
74+ DevImpact
75+ </ span >
6776 </ div >
68-
77+
6978 </ div >
79+ </ header >
80+ < div className = "max-w-6xl mx-auto px-4 py-10 space-y-6" >
81+ < CompareForm
82+ onSubmit = { handleCompare }
83+ loading = { loading }
84+ reset = { reset }
85+ swapUsers = { swapUsers }
86+ data = { data }
87+ />
7088
71-
72- < CompareForm
73- onSubmit = { handleCompare }
74- loading = { loading }
75- />
76-
7789 { loading && skeleton }
7890 { error && (
7991 < div className = "card p-4 text-sm text-red-600 bg-red-50 border border-red-100" >
0 commit comments