import { ArrowForwardIos, Check } from '@mui/icons-material' import { useEffect, useState } from 'react' import { useForm } from 'react-hook-form' import { useTranslation } from 'react-i18next' import TimeAgo from 'react-timeago' import { HugeDecimal } from '@dao-dao/math' import { StatelessDaoRewardDistributionInfoModalProps } from '@dao-dao/types' import { expirationToDate, formatDateTimeTz, getHumanReadableRewardDistributionLabel, humanReadableExpiration, validatePositive, validateRequired, } from '@dao-dao/utils' import { useTranslatedTimeDeltaFormatter } from '../../hooks' import { Button } from '../buttons' import { InputErrorMessage, InputLabel, NumericInput } from '../inputs' import { Modal } from '../modals' import { TokenAmountDisplay } from '../token' import { Tooltip, TooltipInfoIcon } from '../tooltip' export const DaoRewardDistributionInfoModal = ({ distribution, onClose, onFund, funding, remaining, visible, }: StatelessDaoRewardDistributionInfoModalProps) => { const { t } = useTranslation() const [showingDistribute, setShowingDistribute] = useState(false) const [funded, setFunded] = useState(false) useEffect(() => { if (!funded) { return } const timeout = setTimeout(() => { setFunded(false) }, 3000) return () => clearTimeout(timeout) }, [funded]) const { register, setValue, getValues, watch, formState: { errors }, } = useForm<{ amount: string }>({ defaultValues: { amount: '1', }, }) const amount = watch('amount') const hugeAmount = HugeDecimal.fromHumanReadable( amount, distribution?.token.decimals ?? 0 ) const timeAgoFormatter = useTranslatedTimeDeltaFormatter({ words: false }) const linearDistributionIsBlockBased = !!distribution && 'linear' in distribution.active_epoch.emission_rate && 'at_height' in distribution.active_epoch.ends_at return (

{t('title.addFunds')}

{t('info.distributeToDaoMembersFromWallet')}

) : ( ) } header={{ supertitle: distribution ? t('title.rewardDistribution') : undefined, title: distribution ? getHumanReadableRewardDistributionLabel(t, distribution) : t('title.rewardDistribution'), imageUrl: distribution?.token.imageUrl || undefined, }} onClose={() => { onClose() // Wait for the modal to close before hiding this to prevent flickering. setTimeout(() => setShowingDistribute(false), 500) }} titleClassName="!title-text" visible={visible} >
{distribution ? (

{'paused' in distribution.active_epoch.emission_rate ? t('title.paused') : !remaining.loading && !remaining.errored && !remaining.updating && remaining.data.isZero() ? t('title.completed') : t('title.live')}

{!('paused' in distribution.active_epoch.emission_rate) && ( )}
) : (

...

)}
{distribution && ('linear' in distribution.active_epoch.emission_rate ? ( <> {!remaining.errored && (
)} {/* If expires at some point, show the time remaining. */} {!('never' in distribution.active_epoch.ends_at) && (
{distribution ? (

{linearDistributionIsBlockBased ? ( t('title.blockHeightValue', { height: 'at_height' in distribution.active_epoch.ends_at && distribution.active_epoch.ends_at.at_height.toLocaleString(), }) ) : ( )}

) : (

...

)}
)}
{distribution ? (

{humanReadableExpiration( t, formatDateTimeTz, distribution.active_epoch.started_at, t('info.na') )}

) : (

...

)}
) : (
))}
) }