1
1
import { ReactElement , useMemo } from "react" ;
2
2
import Avatar from "@/components/ui/Avatar" ;
3
- import RewardBadge from "@/components/badges/RewardBadge" ;
4
3
import DateManager from "@/utilities/DateManager" ;
5
4
import { useTranslation } from "next-i18next" ;
6
5
import { useRouter } from "next/router" ;
7
6
import { Referral as ReferralType } from "@/types/community" ;
7
+ import Link from "next/link" ;
8
+ import TimeIcon from "@/icons/time.svg" ;
9
+ import RewardBadge from "@/components/badges/RewardBadge" ;
10
+ import { Evaluation , Submission } from "@/types/bounty" ;
8
11
9
12
interface ReferralProps {
10
13
referral : ReferralType ;
@@ -25,54 +28,58 @@ export default function Referral({ referral }: ReferralProps): ReactElement {
25
28
const { t } = useTranslation ( ) ;
26
29
const { locale } = useRouter ( ) ;
27
30
const joinedAt = useMemo ( ( ) => DateManager . fromNow ( referral . created_at , locale ) , [ locale , referral . created_at ] ) ;
28
- const participatedAt = useMemo ( ( ) => ( referral . submission ? DateManager . fromNow ( referral . submission . created_at , locale ) : null ) , [ locale , referral . submission ] ) ;
29
31
const rewardAt = useMemo ( ( ) => ( referral . rewarded ? DateManager . fromNow ( referral . updated_at , locale ) : null ) , [ locale , referral . rewarded , referral . updated_at ] ) ;
32
+ const challengeLink = ( submission : Submission ) => `/communities/${ submission . community . slug } /challenges/${ submission . challenge . id } /submissions/${ submission . id } `
33
+ const status = ( evaluation : Evaluation ) => {
34
+ if ( ! evaluation ) return t ( "referrals.challenge.evaluation.status.pending" )
35
+ return t ( evaluation ?. reward ? "referrals.challenge.evaluation.status.passed" : "referrals.challenge.evaluation.status.failed" )
36
+ }
30
37
38
+ const formatDate = ( date : Date ) => {
39
+ return date ? DateManager . fromNow ( date , locale ) : null
40
+ }
31
41
return (
32
- < div className = "text-sm text-gray-700 bg-gray-50 md:mb-0" >
33
- < div className = "flex p-7 " >
34
- < div className = "" >
42
+ < div className = "text-sm text-gray-700 bg-gray-50 md:mb-0 p-7 " >
43
+ < div className = "w-full " >
44
+ < div className = "flex gap-4 " >
35
45
< Avatar size = "large" user = { referral . user } hideVerificationBadge />
36
- </ div >
37
- < div className = "ml-5" >
38
- < span className = "pb-1 text-lg font-medium leading-loose text-gray-900" > { referral . user ?. displayName } </ span >
39
- < p >
40
- { t ( "referrals.joined" ) } { joinedAt }
46
+ < p className = "grid" >
47
+ < span className = "pb-1 text-lg font-medium leading-loose text-gray-900" > { referral . user ?. displayName } </ span >
48
+ < span className = "text-gray-500" > { t ( "referrals.joined" ) } { joinedAt } </ span >
41
49
</ p >
50
+ </ div >
51
+ < div className = "flex-grow md:ml-19" >
42
52
< div className = "pt-1" >
43
- < ul className = "pb-1 text-sm font-light leading-loose text-gray-700 list" >
44
- { referral . challenge && referral . community && (
45
- < li >
46
- < span className = "ml-5" > { t ( "referrals.challenge-participation" ) } </ span >
47
- < span className = "font-bold" > { referral . community . name } </ span >
48
- < span className = "hidden md:inline-block" > { participatedAt } </ span >
49
- </ li >
50
- ) }
51
-
52
- { referral . submission && referral . submission . metadata && referral . submission . metadata . evaluation && (
53
- < li >
54
- < span className = "ml-5" > { t ( "referrals.submission.evaluation" ) } </ span >
55
- < span className = "font-bold" >
56
- { referral . submission . metadata . evaluation . points } /{ referral . submission . metadata . evaluation . totalPoints }
53
+ < ul className = "pb-1 font-light leading-loose text-gray-700 grid divide-y-2 space-y-4 divide-gray-200" >
54
+ { referral ?. submissions ?. length ? referral . submissions . map ( ( submission ) => (
55
+ < li key = { submission . id } className = "grid md:flex justify-between pt-4 gap-2 md:gap-0" >
56
+ < span className = "grid gap-2" >
57
+ < span >
58
+ { status ( submission . metadata . evaluation ) } < Link href = { challengeLink ( submission ) } className = "font-bold underline text-base- underline-offset-2" > { submission . challenge . name } { t ( "referrals.submission.challenge" ) } </ Link >
59
+ </ span >
60
+ { ! submission ?. metadata ?. evaluation && < span className = "mr-0 flex items-center gap-2.5 leading-none " > < TimeIcon /> { t ( "referrals.challenge.evaluation.pending" ) } </ span > }
57
61
</ span >
58
- { t ( "referrals.submission.points" ) }
59
- < span className = "hidden md:inline-block" > { rewardAt } </ span >
62
+ < span className = "text-gray-500" > { formatDate ( submission . updated_at ) } </ span >
60
63
</ li >
61
- ) }
64
+ )
65
+ ) : < > </ > }
62
66
63
- { referral . rewarded && referral . metadata && referral . metadata . reward && (
64
- < li >
65
- < span className = "ml-5" > { t ( "referrals.reward.text" ) } </ span >
66
- < span className = "font-bold" >
67
- < RewardBadge type = "gray" reward = { referral . metadata . reward } />
67
+ { referral ?. rewarded && referral . metadata && referral . metadata . reward && (
68
+ < li className = "pt-4 grid gap-2 md:gap-0 md:flex md:justify-between" >
69
+ < span className = "grid md:gap-2 md:flex items-center" >
70
+ < span > { t ( "referrals.reward.text" ) } </ span >
71
+ < span className = "font-bold flex justify-start" >
72
+ < RewardBadge type = "gray" reward = { referral . metadata . reward } />
73
+ </ span >
68
74
</ span >
69
- < span className = "hidden md:inline-block" > { rewardAt } </ span >
75
+
76
+ < span className = "text-gray-500" > { rewardAt } </ span >
70
77
</ li >
71
78
) }
72
79
</ ul >
73
80
</ div >
74
- </ div >
75
- </ div >
76
- </ div >
81
+ </ div >
82
+ </ div >
83
+ </ div >
77
84
) ;
78
85
}
0 commit comments