@@ -7,14 +7,18 @@ import styled from 'styled-components/macro'
7
7
import { useDataloader } from '../bootstrap/dataloader'
8
8
import { useDrizzle } from '../temp/drizzle-react-hooks'
9
9
10
+ const loadingPieChartData = [ { tooltip : 'Loading...' , value : 1 } ]
11
+ const StyledDiv = styled . div `
12
+ display: flex;
13
+ `
10
14
const StyledAmountSpan = styled . span `
11
15
font-weight: bold;
12
16
`
13
17
const StyledTitleSpan = styled . span `
14
18
font-style: italic;
15
19
`
16
20
const PNKStatsListCard = ( ) => {
17
- const { cacheCall, drizzleState } = useDrizzle ( )
21
+ const { cacheCall, drizzle , drizzleState, useCacheEvents } = useDrizzle ( )
18
22
const load = useDataloader ( )
19
23
const subcourtIDs = cacheCall (
20
24
'KlerosLiquid' ,
@@ -38,28 +42,104 @@ const PNKStatsListCard = () => {
38
42
}
39
43
return subcourt
40
44
} )
41
- const loading = ! subcourts || subcourts . some ( s => s . stake === undefined )
45
+ const loadingSubcourts =
46
+ ! subcourts || subcourts . some ( s => s . stake === undefined )
47
+ const draws = useCacheEvents (
48
+ 'KlerosLiquid' ,
49
+ 'Draw' ,
50
+ useMemo (
51
+ ( ) => ( {
52
+ filter : { _address : drizzleState . accounts [ 0 ] } ,
53
+ fromBlock : 0
54
+ } ) ,
55
+ [ drizzleState . accounts [ 0 ] ]
56
+ )
57
+ )
58
+ const disputes = draws
59
+ ? draws . reduce (
60
+ ( acc , d ) => {
61
+ if ( acc . atStakePerVoteByID [ d . returnValues . _disputeID ] === undefined ) {
62
+ acc . atStakePerVoteByID [ d . returnValues . _disputeID ] = null
63
+ const dispute = cacheCall (
64
+ 'KlerosLiquid' ,
65
+ 'disputes' ,
66
+ d . returnValues . _disputeID
67
+ )
68
+ const dispute2 = cacheCall (
69
+ 'KlerosLiquid' ,
70
+ 'getDispute' ,
71
+ d . returnValues . _disputeID
72
+ )
73
+ if ( dispute && dispute2 ) {
74
+ if ( ! dispute . period !== '4' ) {
75
+ acc . atStakePerVoteByID [
76
+ d . returnValues . _disputeID
77
+ ] = drizzle . web3 . utils . toBN (
78
+ dispute2 . jurorAtStake [ dispute2 . jurorAtStake . length - 1 ]
79
+ )
80
+ acc . atStakeByID [
81
+ d . returnValues . _disputeID
82
+ ] = drizzle . web3 . utils . toBN ( 0 )
83
+ }
84
+ } else acc . loading = true
85
+ }
86
+ if ( acc . atStakePerVoteByID [ d . returnValues . _disputeID ] !== null )
87
+ acc . atStakeByID [ d . returnValues . _disputeID ] = acc . atStakeByID [
88
+ d . returnValues . _disputeID
89
+ ] . add ( acc . atStakePerVoteByID [ d . returnValues . _disputeID ] )
90
+ return acc
91
+ } ,
92
+ {
93
+ atStakeByID : { } ,
94
+ atStakePerVoteByID : { } ,
95
+ loading : false
96
+ }
97
+ )
98
+ : { loading : true }
42
99
return (
43
- < TitledListCard loading = { loading } prefix = "PNK" title = "Stats" >
44
- { ! loading && (
45
- < PieChart
46
- data = { useMemo (
47
- ( ) =>
48
- subcourts . map ( s => ( {
49
- tooltip : (
50
- < Spin spinning = { s . name === undefined } >
51
- < StyledAmountSpan >
52
- < ETHAmount amount = { s . stake } /> PNK
53
- </ StyledAmountSpan >
54
- < StyledTitleSpan > - { s . name || '...' } </ StyledTitleSpan >
55
- </ Spin >
56
- ) ,
57
- value : Number ( s . stake )
58
- } ) ) ,
59
- [ ...subcourts . map ( s => s . stake ) , ...subcourts . map ( s => s . name ) ]
60
- ) }
61
- />
62
- ) }
100
+ < TitledListCard prefix = "PNK" title = "Stats" >
101
+ < StyledDiv >
102
+ < Spin spinning = { loadingSubcourts } >
103
+ < PieChart
104
+ data = {
105
+ loadingSubcourts
106
+ ? loadingPieChartData
107
+ : subcourts . map ( s => ( {
108
+ tooltip : (
109
+ < Spin spinning = { s . name === undefined } >
110
+ < StyledAmountSpan >
111
+ < ETHAmount amount = { s . stake } /> PNK
112
+ </ StyledAmountSpan >
113
+ < StyledTitleSpan > - { s . name || '...' } </ StyledTitleSpan >
114
+ </ Spin >
115
+ ) ,
116
+ value : Number ( s . stake )
117
+ } ) )
118
+ }
119
+ title = "Staked Tokens"
120
+ />
121
+ </ Spin >
122
+ < Spin spinning = { disputes . loading } >
123
+ < PieChart
124
+ data = {
125
+ disputes . loading
126
+ ? loadingPieChartData
127
+ : Object . entries ( disputes . atStakeByID ) . map ( s => ( {
128
+ tooltip : (
129
+ < >
130
+ < StyledAmountSpan >
131
+ < ETHAmount amount = { s [ 1 ] } /> PNK
132
+ </ StyledAmountSpan >
133
+ < StyledTitleSpan > - Case { s [ 0 ] } </ StyledTitleSpan >
134
+ </ >
135
+ ) ,
136
+ value : Number ( s [ 1 ] )
137
+ } ) )
138
+ }
139
+ title = "Locked Tokens"
140
+ />
141
+ </ Spin >
142
+ </ StyledDiv >
63
143
</ TitledListCard >
64
144
)
65
145
}
0 commit comments