@@ -157,30 +157,54 @@ export const ChallengePhaseInfo: FC<Props> = (props: Props) => {
157157 return formatCurrency ( taskPaymentFromPrizeSets . value , taskPaymentFromPrizeSets . currency )
158158 } , [ taskPaymentFromPrizeSets , formatCurrency ] )
159159
160+ const placementPrizePayment = useMemo (
161+ ( ) => computePlacementPrizePayment ( {
162+ formatCurrency,
163+ isTask,
164+ isTopgearTask,
165+ loginUserId : loginUserInfo ?. userId ,
166+ prizeSets : props . challengeInfo ?. prizeSets ,
167+ variant : props . variant ?? 'active' ,
168+ winners : props . challengeInfo ?. winners ,
169+ } ) ,
170+ [
171+ formatCurrency ,
172+ isTask ,
173+ isTopgearTask ,
174+ loginUserInfo ?. userId ,
175+ props . challengeInfo ?. prizeSets ,
176+ props . challengeInfo ?. winners ,
177+ props . variant ,
178+ ] ,
179+ )
180+
160181 const walletUrl = useMemo (
161182 ( ) => `https://wallet.${ EnvironmentConfig . TC_DOMAIN } ` ,
162183 [ ] ,
163184 )
164185
165186 const formattedNonTaskPayment = useMemo ( ( ) => {
166187 const variant = props . variant ?? 'active'
167- if ( ! shouldShowPayment (
168- variant ,
169- hasPayment ,
170- Boolean ( paymentAmount ) ,
171- isLoadingPayment ,
172- isTopgearTask ,
173- ) ) {
188+ if ( variant !== 'past' || isTopgearTask ) {
174189 return undefined
175190 }
176191
177- return paymentAmount
192+ if ( hasPayment && paymentAmount && ! isLoadingPayment ) {
193+ return paymentAmount
194+ }
195+
196+ if ( ! isLoadingPayment && placementPrizePayment ) {
197+ return placementPrizePayment
198+ }
199+
200+ return undefined
178201 } , [
179202 props . variant ,
180203 hasPayment ,
181204 paymentAmount ,
182205 isLoadingPayment ,
183206 isTopgearTask ,
207+ placementPrizePayment ,
184208 ] )
185209 const {
186210 phaseEndDateString : displayPhaseEndDateString ,
@@ -360,6 +384,51 @@ export const ChallengePhaseInfo: FC<Props> = (props: Props) => {
360384
361385export default ChallengePhaseInfo
362386
387+ interface PlacementPrizePaymentParams {
388+ variant : string
389+ isTask : boolean
390+ isTopgearTask : boolean
391+ prizeSets ?: ChallengeInfo [ 'prizeSets' ]
392+ winners ?: ChallengeInfo [ 'winners' ]
393+ loginUserId ?: number
394+ formatCurrency : ( amount : number | string , currency ?: string ) => string
395+ }
396+
397+ function computePlacementPrizePayment ( config : PlacementPrizePaymentParams ) : string | undefined {
398+ if ( config . variant !== 'past' || config . isTask || config . isTopgearTask ) {
399+ return undefined
400+ }
401+
402+ const placementPrizeSet = config . prizeSets
403+ ?. find ( prizeSet => ( prizeSet ?. type || '' ) . toUpperCase ( ) === 'PLACEMENT' )
404+ const prizes = placementPrizeSet ?. prizes
405+ if ( ! Array . isArray ( prizes ) || ! prizes . length ) {
406+ return undefined
407+ }
408+
409+ const myPlacement = config . loginUserId
410+ ? config . winners
411+ ?. find ( w => Number ( w . userId ) === Number ( config . loginUserId ) )
412+ ?. placement
413+ : undefined
414+
415+ const prize = typeof myPlacement === 'number' && myPlacement > 0
416+ ? prizes [ myPlacement - 1 ]
417+ : prizes [ 0 ]
418+
419+ if ( ! prize || typeof prize . value !== 'number' ) {
420+ return undefined
421+ }
422+
423+ const prizeCurrency = ( prize as any ) ?. type
424+ if ( ( String ( prizeCurrency || '' ) )
425+ . toUpperCase ( ) !== 'POINT' ) {
426+ return undefined
427+ }
428+
429+ return config . formatCurrency ( prize . value , prizeCurrency )
430+ }
431+
363432function createPhaseItems ( config : {
364433 displayPhaseLabel : string
365434 isTask : boolean
@@ -698,19 +767,3 @@ function getChallengeEndDateValue(data: any): string {
698767
699768 return 'N/A'
700769}
701-
702- function shouldShowPayment (
703- variant : string ,
704- hasPayment : boolean ,
705- hasPaymentAmount : boolean ,
706- isLoadingPayment : boolean ,
707- isTopgearTask : boolean ,
708- ) : boolean {
709- return (
710- variant === 'past'
711- && hasPayment
712- && hasPaymentAmount
713- && ! isLoadingPayment
714- && ! isTopgearTask
715- )
716- }
0 commit comments