Skip to content

Commit fe51355

Browse files
committed
Calculate remaining time until payout maturity
1 parent 61aae93 commit fe51355

File tree

2 files changed

+57
-9
lines changed

2 files changed

+57
-9
lines changed

Diff for: src/pages/explore/PayoutsPage/components/PayoutsList.tsx

+57-8
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
import type { ApiPromise } from '@polkadot/api'
22
import { WalletAccount } from '@talismn/connect-wallets'
3+
import { useState, useEffect } from 'react'
34
import { Badge, Col } from 'react-bootstrap'
45
import styled from 'styled-components'
56
import { DataHeaderRow, DataRow } from '../../../../components/base'
67
import { FormatBalance } from '../../../../components/FormatBalance'
8+
import { useBlockTime } from '../../../../hooks/useBlockTime'
79
import { Identicon } from '../../components/Identicon'
810

911
const StyledDataRow = styled(DataRow)`
@@ -25,10 +27,57 @@ type PayoutsListProps = {
2527
handleUpdate: () => void
2628
}
2729

28-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
30+
const TimeRemaining = ({ block, latestBlock, api }: { block: number; latestBlock: number | null; api: ApiPromise }) => {
31+
if (!latestBlock)
32+
return (
33+
<Badge pill bg="black" className="me-2 p-2">
34+
Calculating...
35+
</Badge>
36+
)
37+
38+
const blocksLeft = block - latestBlock
39+
const [, time] = useBlockTime(blocksLeft, api)
40+
41+
if (!time)
42+
return (
43+
<Badge pill bg="black" className="me-2 p-2">
44+
Calculating...
45+
</Badge>
46+
)
47+
48+
if (blocksLeft <= 0)
49+
return (
50+
<Badge pill bg="primary" className="me-2 p-2">
51+
Matured
52+
</Badge>
53+
)
54+
55+
return (
56+
<Badge pill bg="secondary" text="black" className="me-2 p-2">
57+
Maturing in {time}
58+
</Badge>
59+
)
60+
}
61+
2962
const PayoutsList = ({ api, members }: PayoutsListProps): JSX.Element => {
30-
// Likely impossible to happen but if it does, better to show a
31-
// clear message than an empty list which may look like a loading state
63+
const [latestBlock, setLatestBlock] = useState<number | null>(null)
64+
65+
useEffect(() => {
66+
const fetchLatestBlock = async () => {
67+
const header = await api.rpc.chain.getHeader()
68+
setLatestBlock(header.number.toNumber())
69+
}
70+
71+
fetchLatestBlock()
72+
const unsub = api.rpc.chain.subscribeNewHeads((header) => {
73+
setLatestBlock(header.number.toNumber())
74+
})
75+
76+
return () => {
77+
unsub.then((u) => u())
78+
}
79+
}, [api])
80+
3281
if (members.length === 0) return <>No members</>
3382

3483
return (
@@ -73,18 +122,18 @@ const PayoutsList = ({ api, members }: PayoutsListProps): JSX.Element => {
73122
</Badge>
74123
)}
75124
{member.hasPayouts && (
76-
<Badge pill bg="primary" className="me-2 p-2">
77-
Maturing in block {member.extendedPayouts.block}
78-
</Badge>
125+
<>
126+
<TimeRemaining block={member.extendedPayouts.block} latestBlock={latestBlock} api={api} />
127+
</>
79128
)}
80129
{member.extendedPayouts.pending == 0 && member.extendedPayouts.paid > 0 && (
81-
<Badge pill bg="secondary" text="black" className="me-2 p-2">
130+
<Badge pill bg="black" className="me-2 p-2">
82131
Paid
83132
</Badge>
84133
)}
85134
{!member.hasPayouts && member.extendedPayouts.paid == 0 && (
86135
<Badge pill bg="black" className="me-2 p-2">
87-
V1
136+
Paid before V2
88137
</Badge>
89138
)}
90139
</Col>

Diff for: src/pages/explore/PayoutsPage/index.tsx

-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import { ApiPromise } from '@polkadot/api'
2-
import { Vec } from '@polkadot/types'
32
import { AccountId32 } from '@polkadot/types/interfaces'
43
import { PalletSocietyPayoutRecord } from '@polkadot/types/lookup'
54
import { useEffect, useState } from 'react'

0 commit comments

Comments
 (0)