-
Notifications
You must be signed in to change notification settings - Fork 89
/
useGetSurplusFiatValue.ts
89 lines (73 loc) · 3.04 KB
/
useGetSurplusFiatValue.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
import { useEffect, useMemo, useRef, useState } from 'react'
import { Currency, CurrencyAmount } from '@uniswap/sdk-core'
import { Nullish } from 'types'
import { MIN_FIAT_SURPLUS_VALUE, MIN_FIAT_SURPLUS_VALUE_MODAL, MIN_SURPLUS_UNITS } from 'legacy/constants'
import { Order } from 'legacy/state/orders/actions'
import { useUsdAmount } from 'modules/usdAmount'
import { getExecutedSummaryData } from 'utils/getExecutedSummaryData'
import { ParsedOrder } from 'utils/orderUtils/parseOrder'
type Output = {
surplusFiatValue: Nullish<CurrencyAmount<Currency>>
surplusAmount: Nullish<CurrencyAmount<Currency>>
surplusToken: Nullish<Currency>
showFiatValue: boolean
showSurplus: boolean | null
}
export function useGetSurplusData(order: Order | ParsedOrder | undefined): Output {
const [surplusData, setSurplusData] = useState<Output>({
surplusFiatValue: null,
showFiatValue: false,
surplusToken: null,
surplusAmount: null,
showSurplus: null,
})
const { surplusAmount, surplusToken } = useMemo(() => {
const output: { surplusToken?: Currency; surplusAmount?: CurrencyAmount<Currency> } = {}
if (order) {
const summaryData = getExecutedSummaryData(order)
output.surplusAmount = summaryData.surplusAmount
output.surplusToken = summaryData.surplusToken
}
return output
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [JSON.stringify(order)])
const surplusFiatValue = useUsdAmount(surplusAmount).value
const surplusFiatValueRef = useRef(surplusFiatValue)
// Update the surplus amount/token
useEffect(() => {
setSurplusData((surplusData) => ({
...surplusData,
surplusAmount,
surplusToken,
}))
}, [surplusAmount, surplusToken])
// Update the fiat value
// - Updates only once, when we go from not knowing it, to knowing it
// - This prevents flickering effects when the USD price is changing and that makes us change our mind about showing or not showing the surplus modal
useEffect(() => {
if (surplusFiatValueRef.current === null && surplusFiatValue !== null) {
const showFiatValue = Number(surplusFiatValue.toExact()) >= MIN_FIAT_SURPLUS_VALUE
setSurplusData((surplusData) => ({
...surplusData,
surplusFiatValue,
showFiatValue,
showSurplus: shouldShowSurplus(surplusFiatValue, surplusData.surplusAmount),
}))
}
}, [surplusFiatValue])
return surplusData
}
function shouldShowSurplus(
fiatAmount: Nullish<CurrencyAmount<Currency>>,
surplusAmount: Nullish<CurrencyAmount<Currency>>
): boolean | null {
if (fiatAmount) {
// When there's a fiat amount, use that to decide whether to display the modal
return Number(fiatAmount.toFixed(fiatAmount.currency.decimals)) > MIN_FIAT_SURPLUS_VALUE_MODAL
} else if (surplusAmount) {
// If no fiat value, check whether surplus units are > MIN_SURPLUS_UNITS
return Number(surplusAmount.toFixed(surplusAmount.currency.decimals)) > MIN_SURPLUS_UNITS
}
// Otherwise, we don't know whether surplus should, return `null` to indicate that
return null
}