import { Box, Center, Flex, Grid } from '@chakra-ui/react'; import { useRouter } from 'next/router'; import React from 'react'; import { route } from 'nextjs/routes'; import useApiQuery from 'lib/api/useApiQuery'; import { useMultichainContext } from 'lib/contexts/multichain'; import dayjs from 'lib/date/dayjs'; import throwOnResourceLoadError from 'lib/errors/throwOnResourceLoadError'; import getQueryParamString from 'lib/router/getQueryParamString'; import { Button } from 'toolkit/chakra/button'; import { Heading } from 'toolkit/chakra/heading'; import { Image } from 'toolkit/chakra/image'; import { Link } from 'toolkit/chakra/link'; import { ContentLoader } from 'toolkit/components/loaders/ContentLoader'; import { TruncatedText } from 'toolkit/components/truncation/TruncatedText'; import { downloadBlob } from 'toolkit/utils/file'; import BlockCountdownTimer from 'ui/blockCountdown/BlockCountdownTimer'; import createGoogleCalendarLink from 'ui/blockCountdown/createGoogleCalendarLink'; import createIcsFileBlob from 'ui/blockCountdown/createIcsFileBlob'; import ChainIcon from 'ui/shared/externalChains/ChainIcon'; import IconSvg from 'ui/shared/IconSvg'; import StatsWidget from 'ui/shared/stats/StatsWidget'; import Time from 'ui/shared/time/Time'; import CapybaraRunner from '../games/CapybaraRunner'; type Props = { hideCapybaraRunner?: boolean; }; const BlockCountdown = ({ hideCapybaraRunner }: Props) => { const multichainContext = useMultichainContext(); const router = useRouter(); const height = getQueryParamString(router.query.height); const { data, isPending, isError, error } = useApiQuery('general:block_countdown', { queryParams: { module: 'block', action: 'getblockcountdown', blockno: height, }, }); const handleAddToAppleCalClick = React.useCallback(() => { if (!data?.result?.EstimateTimeInSec) { return; } const fileBlob = createIcsFileBlob({ blockHeight: height, date: dayjs().add(Number(data.result.EstimateTimeInSec), 's'), multichainContext }); downloadBlob(fileBlob, `Block #${ height } creation event.ics`); }, [ data?.result?.EstimateTimeInSec, height, multichainContext ]); const handleTimerFinish = React.useCallback(() => { window.location.assign(route({ pathname: '/block/[height_or_hash]', query: { height_or_hash: height } }, multichainContext)); }, [ height, multichainContext ]); React.useEffect(() => { if (!isError && !isPending && !data.result) { handleTimerFinish(); } }, [ data?.result, handleTimerFinish, isError, isPending ]); if (isError) { throwOnResourceLoadError({ isError, error, resource: 'general:block_countdown' }); } if (isPending || !data?.result) { return