import { differenceInHours, differenceInSeconds, format } from 'date-fns'
import { useCallback } from 'react'
import { NftStatus } from '@/api/hooks/nfts'
import { SvgActionAuction, SvgActionBuyNow, SvgActionClock } from '@/assets/icons'
import { PillGroup } from '@/components/Pill'
import { PillProps } from '@/components/Pill/types'
import { SlotsObject } from '@/components/_video/VideoThumbnail'
import { formatDurationShort } from '@/utils/time'
import { useMsTimestamp } from './useMsTimestamp'
import { EnglishTimerState } from './useNftState'
type UseGetSlotsOpts = {
status?: NftStatus['status']
timerLoading?: boolean
withNftLabel?: boolean
startsAtDate?: Date
auctionPlannedEndDate?: Date
needsSettling?: boolean
hasBuyNowPrice?: boolean
englishTimerState?: EnglishTimerState
}
export const useGetNftSlot = ({
englishTimerState,
timerLoading,
auctionPlannedEndDate,
hasBuyNowPrice,
needsSettling,
startsAtDate,
withNftLabel,
status,
}: UseGetSlotsOpts): SlotsObject['bottomLeft'] => {
const msTimestamp = useMsTimestamp({
shouldStop: timerLoading || englishTimerState === 'expired' || !englishTimerState,
})
const generatePills: () => PillProps[] = useCallback(() => {
const buyNowPill: PillProps = { icon: , variant: 'overlay', title: 'Buy now', withTooltip: true }
switch (status) {
case 'buy-now':
return [buyNowPill]
case 'auction': {
const additionalBuyNowPill = hasBuyNowPrice ? [buyNowPill] : []
if (needsSettling) {
return [
{
icon: ,
label: 'To be settled',
variant: 'overlay',
},
...additionalBuyNowPill,
]
}
if (timerLoading) {
return [
{
icon: ,
label: 'Loading',
variant: 'overlay',
},
...additionalBuyNowPill,
]
}
switch (englishTimerState) {
case 'upcoming': {
const diff = startsAtDate && differenceInSeconds(new Date(), startsAtDate) * -1
const diffTime =
diff && diff < 3600
? `Starts in ${formatDurationShort(diff)}`
: startsAtDate && ` ${format(startsAtDate, 'd MMM')} at ${format(startsAtDate, 'HH:mm')}`
return [
{
icon: ,
label: diffTime,
variant: 'overlay',
},
...additionalBuyNowPill,
]
}
case 'running': {
const diff = auctionPlannedEndDate && differenceInSeconds(auctionPlannedEndDate, new Date())
const lessThanMinute = auctionPlannedEndDate && differenceInSeconds(auctionPlannedEndDate, msTimestamp) < 60
const lessThanHour = auctionPlannedEndDate && differenceInHours(auctionPlannedEndDate, msTimestamp) < 1
return [
{
icon: ,
label: diff ? (lessThanMinute ? '< 1 min' : formatDurationShort(diff, true)) : undefined,
variant: lessThanHour ? 'danger' : 'overlay',
},
...additionalBuyNowPill,
]
}
case 'expired':
return [
{
icon: ,
label: 'Auction ended',
variant: 'overlay',
},
...additionalBuyNowPill,
]
default:
return []
}
}
default:
return []
}
}, [
status,
hasBuyNowPrice,
needsSettling,
timerLoading,
englishTimerState,
startsAtDate,
auctionPlannedEndDate,
msTimestamp,
])
const nftPill: PillProps[] = withNftLabel ? [{ label: 'NFT', variant: 'overlay', title: 'NFT' }] : []
return {
element: ,
}
}