1
1
import type { ApiPromise } from '@polkadot/api'
2
2
import { WalletAccount } from '@talismn/connect-wallets'
3
+ import { useState , useEffect } from 'react'
3
4
import { Badge , Col } from 'react-bootstrap'
4
5
import styled from 'styled-components'
5
6
import { DataHeaderRow , DataRow } from '../../../../components/base'
6
7
import { FormatBalance } from '../../../../components/FormatBalance'
8
+ import { useBlockTime } from '../../../../hooks/useBlockTime'
7
9
import { Identicon } from '../../components/Identicon'
8
10
9
11
const StyledDataRow = styled ( DataRow ) `
@@ -25,10 +27,57 @@ type PayoutsListProps = {
25
27
handleUpdate : ( ) => void
26
28
}
27
29
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
+
29
62
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
+
32
81
if ( members . length === 0 ) return < > No members</ >
33
82
34
83
return (
@@ -73,18 +122,18 @@ const PayoutsList = ({ api, members }: PayoutsListProps): JSX.Element => {
73
122
</ Badge >
74
123
) }
75
124
{ 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
+ </ >
79
128
) }
80
129
{ 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" >
82
131
Paid
83
132
</ Badge >
84
133
) }
85
134
{ ! member . hasPayouts && member . extendedPayouts . paid == 0 && (
86
135
< Badge pill bg = "black" className = "me-2 p-2" >
87
- V1
136
+ Paid before V2
88
137
</ Badge >
89
138
) }
90
139
</ Col >
0 commit comments