manifold/web/hooks/use-has-created-contract-today.ts
Ian Philips 59830579a9
Set timeout to reset the free market banner (#367)
* wip - trigger recheck when past time

* wip - trigger recheck when past time

* Reset logic

* Interval=>timeout
2022-06-01 07:54:48 -06:00

67 lines
2.0 KiB
TypeScript

import { listContracts } from 'web/lib/firebase/contracts'
import { useEffect, useState } from 'react'
import { User } from 'common/user'
import dayjs from 'dayjs'
import utc from 'dayjs/plugin/utc'
dayjs.extend(utc)
export function getUtcFreeMarketResetTime(options: { previousTime: boolean }) {
const { previousTime } = options
const localTimeNow = new Date()
const utc4pmToday = dayjs()
.utc()
.set('hour', 16)
.set('minute', 0)
.set('second', 0)
.set('millisecond', 0)
// if it's after 4pm UTC today
if (localTimeNow.getTime() > utc4pmToday.valueOf()) {
return previousTime
? // Return it as it is
utc4pmToday.valueOf()
: // Or add 24 hours to get the next 4pm UTC time:
utc4pmToday.valueOf() + 24 * 60 * 60 * 1000
}
// 4pm UTC today is coming up
return previousTime
? // Subtract 24 hours to get the previous 4pm UTC time:
utc4pmToday.valueOf() - 24 * 60 * 60 * 1000
: // Return it as it is
utc4pmToday.valueOf()
}
export const useHasCreatedContractToday = (user: User | null | undefined) => {
const [hasCreatedContractToday, setHasCreatedContractToday] = useState<
boolean | 'loading'
>('loading')
useEffect(() => {
const nextUtcResetTime = getUtcFreeMarketResetTime({ previousTime: false })
setHasCreatedContractToday('loading')
async function listUserContractsForToday() {
const previousResetTime = getUtcFreeMarketResetTime({
previousTime: true,
})
if (!user) return
const contracts = await listContracts(user.id)
const todayContracts = contracts.filter(
(contract) => contract.createdTime > previousResetTime
)
setHasCreatedContractToday(todayContracts.length > 0)
}
const timeoutUntilNextFreeMarket = setTimeout(() => {
setHasCreatedContractToday(false)
}, nextUtcResetTime - Date.now())
listUserContractsForToday()
return () => clearTimeout(timeoutUntilNextFreeMarket)
}, [user])
return hasCreatedContractToday
}