-
Notifications
You must be signed in to change notification settings - Fork 25
Expand file tree
/
Copy pathAssetSelect.tsx
More file actions
97 lines (85 loc) · 2.77 KB
/
AssetSelect.tsx
File metadata and controls
97 lines (85 loc) · 2.77 KB
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
90
91
92
93
94
95
96
97
import { AssetInput, AssetInputProps } from "@galacticcouncil/ui/components"
import { useState } from "react"
import { TAssetData } from "@/api/assets"
import { AssetLogo } from "@/components/AssetLogo"
import { useDisplayAssetPrice } from "@/components/AssetPrice"
import { AssetSelectEmptyState } from "@/components/AssetSelect/AssetSelectEmptyState"
import { AssetSelectModal } from "@/components/AssetSelectModal"
import { TAssetWithBalance } from "@/components/AssetSelectModal/AssetSelectModal.utils"
import { useAccountBalances } from "@/states/account"
import { scaleHuman } from "@/utils/formatting"
export type TSelectedAsset = {
id: string
decimals: number
symbol: string
iconId?: string | string[]
}
export type AssetSelectProps = AssetInputProps & {
assets: TAssetData[]
sortedAssets?: TAssetWithBalance[]
selectedAsset: TSelectedAsset | undefined | null
maxBalanceFallback?: string
setSelectedAsset?: (asset: TAssetData) => void
}
export const AssetSelect = ({
assets,
sortedAssets,
selectedAsset,
maxBalance: providedMaxBalance,
maxBalanceFallback,
setSelectedAsset,
...props
}: AssetSelectProps) => {
const [openModal, setOpeModal] = useState(false)
const [displayValue_, { isLoading: displayValueLoading_ }] =
useDisplayAssetPrice(
props.ignoreDisplayValue || props.displayValue
? ""
: (selectedAsset?.id ?? ""),
props.value || "0",
)
const displayValue = props.displayValue ?? displayValue_
const displayValueLoading = props.displayValueLoading ?? displayValueLoading_
const { getTransferableBalance } = useAccountBalances()
const maxBalance = ((): string | undefined => {
if (providedMaxBalance) {
return providedMaxBalance
}
const maxBalance =
!props.ignoreBalance && selectedAsset
? getTransferableBalance(selectedAsset.id)
: undefined
return maxBalance && selectedAsset
? scaleHuman(maxBalance, selectedAsset.decimals)
: maxBalanceFallback
})()
return (
<>
<AssetInput
{...props}
selectedAssetIcon={
selectedAsset ? (
<AssetLogo id={selectedAsset.iconId ?? selectedAsset.id} />
) : undefined
}
symbol={selectedAsset?.symbol}
modalDisabled={!setSelectedAsset}
displayValue={displayValue}
displayValueLoading={displayValueLoading}
maxBalance={maxBalance}
onAsssetBtnClick={
setSelectedAsset ? () => setOpeModal(true) : undefined
}
/>
<AssetSelectModal
open={openModal}
assets={assets}
sortedAssets={sortedAssets}
onOpenChange={setOpeModal}
onSelect={setSelectedAsset}
emptyState={<AssetSelectEmptyState />}
selectedAssetId={selectedAsset?.id}
/>
</>
)
}