diff --git a/packages/apps/components/history/History.tsx b/packages/apps/components/history/History.tsx index 46e2d94cb..c7c998273 100644 --- a/packages/apps/components/history/History.tsx +++ b/packages/apps/components/history/History.tsx @@ -1,4 +1,4 @@ -import { SearchOutlined, SyncOutlined } from '@ant-design/icons'; +import { SearchOutlined } from '@ant-design/icons'; import { Badge, Button, Input, message, Table, Tabs } from 'antd'; import { ColumnType } from 'antd/lib/table'; import { format } from 'date-fns'; @@ -7,7 +7,7 @@ import { useQuery } from 'graphql-hooks'; import last from 'lodash/last'; import Image from 'next/image'; import { useRouter } from 'next/router'; -import { useEffect, useMemo, useState } from 'react'; +import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; import { Icon } from 'shared/components/widget/Icon'; import { Logo } from 'shared/components/widget/Logo'; import { DATE_TIME_FORMAT, RecordStatus } from 'shared/config/constant'; @@ -17,6 +17,7 @@ import { convertToDvm, revertAccount } from 'shared/utils/helper/address'; import { gqlName, toMiddleSplitNaming } from 'shared/utils/helper/common'; import { updateStorage } from 'shared/utils/helper/storage'; import { isSS58Address, isValidAddress } from 'shared/utils/helper/validator'; +import { CountdownRefresh } from 'components/widget/CountdownRefresh'; import { Path } from '../../config'; import { HISTORY_RECORDS } from '../../config/gql'; import { useITranslation } from '../../hooks'; @@ -76,6 +77,7 @@ const toSearchableAccount = (account: string | undefined) => { }; export default function History() { + const countdownRefreshRef = useRef(null); const { t } = useITranslation(); const { disconnect } = useApi(); const router = useRouter(); @@ -241,6 +243,11 @@ export default function History() { }, ]; + const handleRefresh = useCallback(() => { + countdownRefreshRef.current?.dispatchEvent(new Event('click')); + refetch({ ...paginator, sender: searchAccount, recipient: searchAccount }); + }, [paginator, searchAccount, refetch]); + return ( <>
@@ -282,14 +289,12 @@ export default function History() {
diff --git a/packages/apps/components/widget/CountdownRefresh.tsx b/packages/apps/components/widget/CountdownRefresh.tsx new file mode 100644 index 000000000..d66a604da --- /dev/null +++ b/packages/apps/components/widget/CountdownRefresh.tsx @@ -0,0 +1,96 @@ +import { forwardRef, useEffect, useRef } from 'react'; + +export const CountdownRefresh = forwardRef void }>( + function RefreshIcon({ isActive, onIteration }, ref) { + const circleRef = useRef(null); + + useEffect(() => { + if (isActive && !circleRef.current?.classList.contains('refresh-countdown')) { + circleRef.current?.classList.add('refresh-countdown'); + } else { + circleRef.current?.getAnimations().at(0)?.cancel(); + circleRef.current?.classList.remove('refresh-countdown'); + } + }, [isActive]); + + return ( + + {/* background */} + + + + + + + + + + + + + + + + ); + } +); diff --git a/packages/apps/styles/index.scss b/packages/apps/styles/index.scss index ae4d0d0a4..75d9c50b2 100644 --- a/packages/apps/styles/index.scss +++ b/packages/apps/styles/index.scss @@ -199,6 +199,21 @@ body { } } +.refresh-countdown { + animation: countdown-dash 9.3s linear infinite; + animation-delay: 0.7s; +} + +@keyframes countdown-dash { + from { + stroke-dashoffset: 0; + } + + to { + stroke-dashoffset: -30; + } +} + @import './loading.scss'; @import './reset.scss'; @import './modal.scss';