-
Notifications
You must be signed in to change notification settings - Fork 17
/
Copy pathuseBalance.ts
46 lines (40 loc) · 1.3 KB
/
useBalance.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
import { BalanceData, BalanceFormatterOptions, getBalance, watchBalance } from '@/helpers'
import { useInkathon } from '@/provider'
import { AccountId } from '@polkadot/types/interfaces'
import { useEffect, useState } from 'react'
/**
* Hook that returns the native token balance of the given `address`.
*/
export const useBalance = (
address?: string | AccountId,
watch?: boolean,
formatterOptions?: BalanceFormatterOptions,
): BalanceData => {
const { api } = useInkathon()
const [balanceData, setBalanceData] = useState<BalanceData>({
tokenSymbol: 'Unit',
tokenDecimals: 12,
} satisfies BalanceData)
const [unsubscribes, setUnsubscribes] = useState<(VoidFunction | null)[]>([])
useEffect(() => {
const updateBalanceData = (data: BalanceData) => {
setBalanceData(() => data)
}
if (!api) {
updateBalanceData({} as BalanceData)
return
}
if (watch) {
watchBalance(api, address, updateBalanceData, formatterOptions).then((unsubscribe) => {
setUnsubscribes((prev) => [...prev, unsubscribe])
})
} else {
getBalance(api, address, formatterOptions).then(updateBalanceData)
}
return () => {
unsubscribes.forEach((unsubscribe) => unsubscribe?.())
setUnsubscribes(() => [])
}
}, [api, address])
return balanceData
}