@lifi/widget 3.16.1 → 3.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -0
- package/dist/esm/components/ActiveTransactions/ActiveTransactionItem.js +2 -2
- package/dist/esm/components/ActiveTransactions/ActiveTransactionItem.js.map +1 -1
- package/dist/esm/components/SelectChainAndToken.js +2 -1
- package/dist/esm/components/SelectChainAndToken.js.map +1 -1
- package/dist/esm/components/Step/Step.js +1 -1
- package/dist/esm/components/Step/Step.js.map +1 -1
- package/dist/esm/components/Timer/RouteTimer.d.ts +4 -0
- package/dist/esm/components/Timer/RouteTimer.js +14 -0
- package/dist/esm/components/Timer/RouteTimer.js.map +1 -0
- package/dist/esm/components/Timer/StepTimer.js +56 -0
- package/dist/esm/components/Timer/StepTimer.js.map +1 -0
- package/dist/esm/components/Timer/TimerContent.d.ts +2 -0
- package/dist/esm/components/Timer/TimerContent.js +18 -0
- package/dist/esm/components/Timer/TimerContent.js.map +1 -0
- package/dist/esm/config/version.d.ts +1 -1
- package/dist/esm/config/version.js +1 -1
- package/dist/esm/hooks/timer/useStopwatch.d.ts +16 -0
- package/dist/esm/hooks/timer/useStopwatch.js +41 -0
- package/dist/esm/hooks/timer/useStopwatch.js.map +1 -0
- package/dist/esm/hooks/timer/utils.d.ts +1 -0
- package/dist/esm/hooks/timer/utils.js +9 -0
- package/dist/esm/hooks/timer/utils.js.map +1 -1
- package/dist/esm/hooks/useListHeight.d.ts +12 -0
- package/dist/esm/{pages/SelectTokenPage/useTokenListHeight.js → hooks/useListHeight.js} +12 -12
- package/dist/esm/hooks/useListHeight.js.map +1 -0
- package/dist/esm/hooks/useRoutes.js +3 -1
- package/dist/esm/hooks/useRoutes.js.map +1 -1
- package/dist/esm/hooks/useSettingMonitor.d.ts +3 -1
- package/dist/esm/hooks/useSettingMonitor.js +6 -2
- package/dist/esm/hooks/useSettingMonitor.js.map +1 -1
- package/dist/esm/i18n/en.json +2 -1
- package/dist/esm/pages/SelectTokenPage/SelectTokenPage.js +3 -3
- package/dist/esm/pages/SelectTokenPage/SelectTokenPage.js.map +1 -1
- package/dist/esm/pages/SettingsPage/SlippageSettings/SlippageSettings.js +24 -17
- package/dist/esm/pages/SettingsPage/SlippageSettings/SlippageSettings.js.map +1 -1
- package/dist/esm/pages/TransactionHistoryPage/TransactionHistoryPage.d.ts +1 -0
- package/dist/esm/pages/TransactionHistoryPage/TransactionHistoryPage.js +18 -10
- package/dist/esm/pages/TransactionHistoryPage/TransactionHistoryPage.js.map +1 -1
- package/dist/esm/stores/settings/useSettingsStore.d.ts +1 -1
- package/dist/esm/stores/settings/useSettingsStore.js +1 -1
- package/dist/esm/stores/settings/useSettingsStore.js.map +1 -1
- package/dist/esm/types/widget.d.ts +3 -2
- package/dist/esm/types/widget.js +1 -0
- package/dist/esm/types/widget.js.map +1 -1
- package/package.json +1 -1
- package/src/components/ActiveTransactions/ActiveTransactionItem.tsx +2 -2
- package/src/components/SelectChainAndToken.tsx +2 -1
- package/src/components/Step/Step.tsx +1 -1
- package/src/components/Timer/RouteTimer.tsx +22 -0
- package/src/components/Timer/StepTimer.tsx +84 -0
- package/src/components/Timer/TimerContent.tsx +35 -0
- package/src/config/version.ts +1 -1
- package/src/hooks/timer/useStopwatch.ts +65 -0
- package/src/hooks/timer/utils.ts +10 -0
- package/src/{pages/SelectTokenPage/useTokenListHeight.ts → hooks/useListHeight.ts} +16 -16
- package/src/hooks/useRoutes.ts +3 -1
- package/src/hooks/useSettingMonitor.ts +11 -2
- package/src/i18n/en.json +2 -1
- package/src/pages/SelectTokenPage/SelectTokenPage.tsx +3 -3
- package/src/pages/SettingsPage/SlippageSettings/SlippageSettings.tsx +38 -26
- package/src/pages/TransactionHistoryPage/TransactionHistoryPage.tsx +48 -31
- package/src/stores/settings/useSettingsStore.ts +1 -1
- package/src/types/widget.ts +2 -1
- package/dist/esm/components/Step/StepTimer.js +0 -86
- package/dist/esm/components/Step/StepTimer.js.map +0 -1
- package/dist/esm/pages/SelectTokenPage/useTokenListHeight.d.ts +0 -12
- package/dist/esm/pages/SelectTokenPage/useTokenListHeight.js.map +0 -1
- package/src/components/Step/StepTimer.tsx +0 -137
- /package/dist/esm/components/{Step → Timer}/StepTimer.d.ts +0 -0
|
@@ -33,7 +33,14 @@ export const useSettingMonitor = () => {
|
|
|
33
33
|
: slippage !== defaultConfigurableSettings.slippage
|
|
34
34
|
|
|
35
35
|
const isSlippageOutsideRecommendedLimits =
|
|
36
|
-
isSlippageChanged && Number(slippage) > 1
|
|
36
|
+
isSlippageChanged && slippage && Number(slippage) > 1
|
|
37
|
+
|
|
38
|
+
const isSlippageUnderRecommendedLimits =
|
|
39
|
+
isSlippageChanged && slippage && Number(slippage) < 0.1
|
|
40
|
+
|
|
41
|
+
const isSlippageNotRecommended = Boolean(
|
|
42
|
+
isSlippageOutsideRecommendedLimits || isSlippageUnderRecommendedLimits
|
|
43
|
+
)
|
|
37
44
|
|
|
38
45
|
const isRoutePriorityChanged = config.routePriority
|
|
39
46
|
? routePriority !== config.routePriority
|
|
@@ -51,7 +58,7 @@ export const useSettingMonitor = () => {
|
|
|
51
58
|
isRoutePriorityChanged ||
|
|
52
59
|
isGasPriceChanged
|
|
53
60
|
|
|
54
|
-
const isRouteSettingsWithWarnings =
|
|
61
|
+
const isRouteSettingsWithWarnings = isSlippageNotRecommended
|
|
55
62
|
|
|
56
63
|
const reset = () => {
|
|
57
64
|
if (tools) {
|
|
@@ -68,7 +75,9 @@ export const useSettingMonitor = () => {
|
|
|
68
75
|
isBridgesChanged,
|
|
69
76
|
isExchangesChanged,
|
|
70
77
|
isSlippageChanged,
|
|
78
|
+
isSlippageNotRecommended,
|
|
71
79
|
isSlippageOutsideRecommendedLimits,
|
|
80
|
+
isSlippageUnderRecommendedLimits,
|
|
72
81
|
isRoutePriorityChanged,
|
|
73
82
|
isGasPriceChanged,
|
|
74
83
|
isCustomRouteSettings,
|
package/src/i18n/en.json
CHANGED
|
@@ -128,7 +128,8 @@
|
|
|
128
128
|
"insufficientGas": "You don't have enough gas to complete the transaction. You need to add at least:",
|
|
129
129
|
"rateChanged": "The exchange rate has changed. By continuing the transaction, you'll accept the new rate.",
|
|
130
130
|
"resetSettings": "This will reset your route priority, slippage, gas price, enabled bridges and exchanges.",
|
|
131
|
-
"slippageOutsideRecommendedLimits": "High slippage tolerance may result in unfavorable trade caused by front-running."
|
|
131
|
+
"slippageOutsideRecommendedLimits": "High slippage tolerance may result in unfavorable trade caused by front-running.",
|
|
132
|
+
"slippageUnderRecommendedLimits": "Low slippage tolerance may cause transaction delays or failures."
|
|
132
133
|
},
|
|
133
134
|
"title": {
|
|
134
135
|
"deleteActiveTransactions": "Delete all active transactions?",
|
|
@@ -6,20 +6,20 @@ import { ChainSelect } from '../../components/ChainSelect/ChainSelect.js'
|
|
|
6
6
|
import { FullPageContainer } from '../../components/FullPageContainer.js'
|
|
7
7
|
import { TokenList } from '../../components/TokenList/TokenList.js'
|
|
8
8
|
import { useHeader } from '../../hooks/useHeader.js'
|
|
9
|
+
import { useListHeight } from '../../hooks/useListHeight.js'
|
|
9
10
|
import { useNavigateBack } from '../../hooks/useNavigateBack.js'
|
|
10
11
|
import { useScrollableOverflowHidden } from '../../hooks/useScrollableContainer.js'
|
|
11
12
|
import { useSwapOnly } from '../../hooks/useSwapOnly.js'
|
|
12
13
|
import { useWidgetConfig } from '../../providers/WidgetProvider/WidgetProvider.js'
|
|
13
14
|
import type { FormTypeProps } from '../../stores/form/types.js'
|
|
14
15
|
import { SearchTokenInput } from './SearchTokenInput.js'
|
|
15
|
-
import { useTokenListHeight } from './useTokenListHeight.js'
|
|
16
16
|
|
|
17
17
|
export const SelectTokenPage: FC<FormTypeProps> = ({ formType }) => {
|
|
18
18
|
useScrollableOverflowHidden()
|
|
19
19
|
const { navigateBack } = useNavigateBack()
|
|
20
20
|
const headerRef = useRef<HTMLElement>(null)
|
|
21
21
|
const listParentRef = useRef<HTMLUListElement | null>(null)
|
|
22
|
-
const {
|
|
22
|
+
const { listHeight, minListHeight } = useListHeight({
|
|
23
23
|
listParentRef,
|
|
24
24
|
headerRef,
|
|
25
25
|
})
|
|
@@ -64,7 +64,7 @@ export const SelectTokenPage: FC<FormTypeProps> = ({ formType }) => {
|
|
|
64
64
|
>
|
|
65
65
|
<TokenList
|
|
66
66
|
parentRef={listParentRef}
|
|
67
|
-
height={
|
|
67
|
+
height={listHeight}
|
|
68
68
|
onClick={navigateBack}
|
|
69
69
|
formType={formType}
|
|
70
70
|
/>
|
|
@@ -17,22 +17,30 @@ import {
|
|
|
17
17
|
SlippageLimitsWarningContainer,
|
|
18
18
|
} from './SlippageSettings.style.js'
|
|
19
19
|
|
|
20
|
+
const DEFAULT_CUSTOM_INPUT_VALUE = '0.5'
|
|
21
|
+
|
|
20
22
|
export const SlippageSettings: React.FC = () => {
|
|
21
23
|
const { t } = useTranslation()
|
|
22
|
-
const {
|
|
23
|
-
|
|
24
|
+
const {
|
|
25
|
+
isSlippageNotRecommended,
|
|
26
|
+
isSlippageUnderRecommendedLimits,
|
|
27
|
+
isSlippageOutsideRecommendedLimits,
|
|
28
|
+
isSlippageChanged,
|
|
29
|
+
} = useSettingMonitor()
|
|
24
30
|
const { slippage } = useSettings(['slippage'])
|
|
25
31
|
const { setValue } = useSettingsActions()
|
|
26
32
|
const defaultValue = useRef(slippage)
|
|
27
33
|
const [focused, setFocused] = useState<'input' | 'button'>()
|
|
28
34
|
|
|
29
35
|
const customInputValue =
|
|
30
|
-
!slippage || slippage === defaultSlippage
|
|
36
|
+
!slippage || slippage === defaultSlippage
|
|
37
|
+
? DEFAULT_CUSTOM_INPUT_VALUE
|
|
38
|
+
: slippage
|
|
31
39
|
|
|
32
40
|
const [inputValue, setInputValue] = useState(customInputValue)
|
|
33
41
|
|
|
34
42
|
const handleDefaultClick = () => {
|
|
35
|
-
setValue('slippage',
|
|
43
|
+
setValue('slippage', defaultSlippage)
|
|
36
44
|
}
|
|
37
45
|
|
|
38
46
|
const debouncedSetValue = useMemo(() => debounce(setValue, 500), [setValue])
|
|
@@ -41,43 +49,49 @@ export const SlippageSettings: React.FC = () => {
|
|
|
41
49
|
(event) => {
|
|
42
50
|
const { value } = event.target
|
|
43
51
|
|
|
44
|
-
|
|
52
|
+
const formattedValue = formatSlippage(value, defaultValue.current, true)
|
|
45
53
|
|
|
54
|
+
setInputValue(formattedValue)
|
|
46
55
|
debouncedSetValue(
|
|
47
56
|
'slippage',
|
|
48
|
-
|
|
57
|
+
formattedValue.length ? formattedValue : defaultSlippage
|
|
49
58
|
)
|
|
50
59
|
},
|
|
51
60
|
[debouncedSetValue]
|
|
52
61
|
)
|
|
53
62
|
|
|
54
|
-
const
|
|
55
|
-
setFocused(
|
|
63
|
+
const handleInputFocus: FocusEventHandler<HTMLInputElement> = (event) => {
|
|
64
|
+
setFocused('input')
|
|
56
65
|
|
|
57
66
|
const { value } = event.target
|
|
58
67
|
|
|
59
|
-
const formattedValue = formatSlippage(
|
|
60
|
-
|
|
61
|
-
defaultValue.current
|
|
62
|
-
)
|
|
63
|
-
setInputValue(formattedValue === defaultSlippage ? '' : formattedValue)
|
|
68
|
+
const formattedValue = formatSlippage(value, defaultValue.current)
|
|
69
|
+
setInputValue(formattedValue)
|
|
64
70
|
|
|
65
|
-
setValue(
|
|
71
|
+
setValue(
|
|
72
|
+
'slippage',
|
|
73
|
+
formattedValue.length ? formattedValue : defaultSlippage
|
|
74
|
+
)
|
|
66
75
|
}
|
|
67
76
|
|
|
68
|
-
const badgeColor =
|
|
77
|
+
const badgeColor = isSlippageNotRecommended
|
|
69
78
|
? 'warning'
|
|
70
79
|
: isSlippageChanged
|
|
71
80
|
? 'info'
|
|
72
81
|
: undefined
|
|
73
82
|
|
|
83
|
+
const slippageWarningText = isSlippageOutsideRecommendedLimits
|
|
84
|
+
? t('warning.message.slippageOutsideRecommendedLimits')
|
|
85
|
+
: isSlippageUnderRecommendedLimits
|
|
86
|
+
? t('warning.message.slippageUnderRecommendedLimits')
|
|
87
|
+
: ''
|
|
88
|
+
|
|
74
89
|
return (
|
|
75
90
|
<SettingCardExpandable
|
|
76
91
|
value={
|
|
77
|
-
<BadgedValue
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
>{`${slippage}%`}</BadgedValue>
|
|
92
|
+
<BadgedValue badgeColor={badgeColor} showBadge={!!badgeColor}>
|
|
93
|
+
{slippage ? `${slippage}%` : t('button.auto')}
|
|
94
|
+
</BadgedValue>
|
|
81
95
|
}
|
|
82
96
|
icon={<Percent />}
|
|
83
97
|
title={t('settings.slippage')}
|
|
@@ -99,7 +113,7 @@ export const SlippageSettings: React.FC = () => {
|
|
|
99
113
|
onClick={handleDefaultClick}
|
|
100
114
|
disableRipple
|
|
101
115
|
>
|
|
102
|
-
{
|
|
116
|
+
{t('button.auto')}
|
|
103
117
|
</SlippageDefaultButton>
|
|
104
118
|
<SlippageCustomInput
|
|
105
119
|
selected={defaultSlippage !== slippage && focused !== 'button'}
|
|
@@ -108,15 +122,13 @@ export const SlippageSettings: React.FC = () => {
|
|
|
108
122
|
inputMode: 'decimal',
|
|
109
123
|
}}
|
|
110
124
|
onChange={handleInputUpdate}
|
|
111
|
-
onFocus={
|
|
112
|
-
setFocused('input')
|
|
113
|
-
}}
|
|
114
|
-
onBlur={handleInputBlur}
|
|
125
|
+
onFocus={handleInputFocus}
|
|
115
126
|
value={inputValue}
|
|
116
127
|
autoComplete="off"
|
|
128
|
+
onBlur={() => setFocused(undefined)}
|
|
117
129
|
/>
|
|
118
130
|
</SettingsFieldSet>
|
|
119
|
-
{
|
|
131
|
+
{isSlippageNotRecommended && (
|
|
120
132
|
<SlippageLimitsWarningContainer>
|
|
121
133
|
<WarningRounded color="warning" />
|
|
122
134
|
<Typography
|
|
@@ -125,7 +137,7 @@ export const SlippageSettings: React.FC = () => {
|
|
|
125
137
|
fontWeight: 400,
|
|
126
138
|
}}
|
|
127
139
|
>
|
|
128
|
-
{
|
|
140
|
+
{slippageWarningText}
|
|
129
141
|
</Typography>
|
|
130
142
|
</SlippageLimitsWarningContainer>
|
|
131
143
|
)}
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import type { FullStatusData } from '@lifi/sdk'
|
|
2
|
-
import { List } from '@mui/material'
|
|
2
|
+
import { Box, List } from '@mui/material'
|
|
3
3
|
import { useVirtualizer } from '@tanstack/react-virtual'
|
|
4
|
+
import type React from 'react'
|
|
4
5
|
import { useRef } from 'react'
|
|
5
6
|
import { useTranslation } from 'react-i18next'
|
|
6
7
|
import { PageContainer } from '../../components/PageContainer.js'
|
|
7
8
|
import { useHeader } from '../../hooks/useHeader.js'
|
|
8
9
|
import { useTransactionHistory } from '../../hooks/useTransactionHistory.js'
|
|
10
|
+
|
|
11
|
+
import { useListHeight } from '../../hooks/useListHeight.js'
|
|
9
12
|
import { TransactionHistoryEmpty } from './TransactionHistoryEmpty.js'
|
|
10
13
|
import { TransactionHistoryItem } from './TransactionHistoryItem.js'
|
|
11
14
|
import { TransactionHistoryItemSkeleton } from './TransactionHistorySkeleton.js'
|
|
@@ -19,9 +22,13 @@ export const TransactionHistoryPage: React.FC = () => {
|
|
|
19
22
|
const { t } = useTranslation()
|
|
20
23
|
useHeader(t('header.transactionHistory'))
|
|
21
24
|
|
|
25
|
+
const { listHeight } = useListHeight({
|
|
26
|
+
listParentRef: parentRef,
|
|
27
|
+
})
|
|
28
|
+
|
|
22
29
|
const { getVirtualItems, getTotalSize } = useVirtualizer({
|
|
23
30
|
count: transactions.length,
|
|
24
|
-
overscan:
|
|
31
|
+
overscan: 5,
|
|
25
32
|
paddingEnd: 12,
|
|
26
33
|
getScrollElement: () => parentRef.current,
|
|
27
34
|
estimateSize: () => 186,
|
|
@@ -35,36 +42,46 @@ export const TransactionHistoryPage: React.FC = () => {
|
|
|
35
42
|
|
|
36
43
|
return (
|
|
37
44
|
<PageContainer
|
|
38
|
-
|
|
39
|
-
style={{
|
|
45
|
+
disableGutters
|
|
46
|
+
style={{ minHeight: minTransactionListHeight }}
|
|
40
47
|
>
|
|
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
|
-
|
|
48
|
+
<Box
|
|
49
|
+
ref={parentRef}
|
|
50
|
+
style={{
|
|
51
|
+
height: listHeight,
|
|
52
|
+
}}
|
|
53
|
+
sx={{
|
|
54
|
+
overflow: 'auto',
|
|
55
|
+
paddingX: 3,
|
|
56
|
+
}}
|
|
57
|
+
>
|
|
58
|
+
{isLoading ? (
|
|
59
|
+
<List disablePadding>
|
|
60
|
+
{Array.from({ length: 3 }).map((_, index) => (
|
|
61
|
+
<TransactionHistoryItemSkeleton key={index} />
|
|
62
|
+
))}
|
|
63
|
+
</List>
|
|
64
|
+
) : (
|
|
65
|
+
<List
|
|
66
|
+
style={{
|
|
67
|
+
height: getTotalSize(),
|
|
68
|
+
position: 'relative',
|
|
69
|
+
}}
|
|
70
|
+
disablePadding
|
|
71
|
+
>
|
|
72
|
+
{getVirtualItems().map((item) => {
|
|
73
|
+
const transaction = transactions[item.index]
|
|
74
|
+
return (
|
|
75
|
+
<TransactionHistoryItem
|
|
76
|
+
key={item.key}
|
|
77
|
+
start={item.start}
|
|
78
|
+
transaction={transaction}
|
|
79
|
+
/>
|
|
80
|
+
)
|
|
81
|
+
})}
|
|
82
|
+
</List>
|
|
83
|
+
)}
|
|
84
|
+
</Box>
|
|
68
85
|
</PageContainer>
|
|
69
86
|
)
|
|
70
87
|
}
|
|
@@ -5,7 +5,7 @@ import type { SettingsProps, SettingsState } from './types.js'
|
|
|
5
5
|
import { SettingsToolTypes } from './types.js'
|
|
6
6
|
import { getStateValues } from './utils/getStateValues.js'
|
|
7
7
|
|
|
8
|
-
export const defaultSlippage =
|
|
8
|
+
export const defaultSlippage = undefined
|
|
9
9
|
|
|
10
10
|
export const defaultConfigurableSettings: Pick<
|
|
11
11
|
SettingsState,
|
package/src/types/widget.ts
CHANGED
|
@@ -94,6 +94,7 @@ export enum HiddenUI {
|
|
|
94
94
|
ToToken = 'toToken',
|
|
95
95
|
WalletMenu = 'walletMenu',
|
|
96
96
|
IntegratorStepDetails = 'integratorStepDetails',
|
|
97
|
+
ReverseTokensButton = 'reverseTokensButton',
|
|
97
98
|
}
|
|
98
99
|
export type HiddenUIType = `${HiddenUI}`
|
|
99
100
|
|
|
@@ -144,7 +145,7 @@ export interface CalculateFeeParams {
|
|
|
144
145
|
toAddress?: string
|
|
145
146
|
fromAmount?: bigint
|
|
146
147
|
toAmount?: bigint
|
|
147
|
-
slippage
|
|
148
|
+
slippage?: number
|
|
148
149
|
}
|
|
149
150
|
|
|
150
151
|
export interface WidgetFeeConfig {
|
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { AccessTimeFilled } from '@mui/icons-material';
|
|
3
|
-
import { Box, Tooltip } from '@mui/material';
|
|
4
|
-
import { useEffect, useState } from 'react';
|
|
5
|
-
import { useTranslation } from 'react-i18next';
|
|
6
|
-
import { useTimer } from '../../hooks/timer/useTimer.js';
|
|
7
|
-
import { IconTypography } from '../IconTypography.js';
|
|
8
|
-
const getExecutionProcess = (step) => step.execution?.process.findLast((process) => process.type === 'SWAP' ||
|
|
9
|
-
process.type === 'CROSS_CHAIN' ||
|
|
10
|
-
process.type === 'RECEIVING_CHAIN');
|
|
11
|
-
const getExpiryTimestamp = (step) => new Date((getExecutionProcess(step)?.startedAt ?? Date.now()) +
|
|
12
|
-
step.estimate.executionDuration * 1000);
|
|
13
|
-
export const StepTimer = ({ step, hideInProgress }) => {
|
|
14
|
-
const { t, i18n } = useTranslation();
|
|
15
|
-
const [isExpired, setExpired] = useState(false);
|
|
16
|
-
const [isExecutionStarted, setExecutionStarted] = useState(() => !!getExecutionProcess(step));
|
|
17
|
-
const [expiryTimestamp, setExpiryTimestamp] = useState(() => getExpiryTimestamp(step));
|
|
18
|
-
const { seconds, minutes, isRunning, pause, resume, restart } = useTimer({
|
|
19
|
-
autoStart: false,
|
|
20
|
-
expiryTimestamp,
|
|
21
|
-
onExpire: () => setExpired(true),
|
|
22
|
-
});
|
|
23
|
-
useEffect(() => {
|
|
24
|
-
const executionProcess = getExecutionProcess(step);
|
|
25
|
-
if (!executionProcess) {
|
|
26
|
-
return;
|
|
27
|
-
}
|
|
28
|
-
const shouldRestart = executionProcess.status === 'FAILED';
|
|
29
|
-
const shouldPause = executionProcess.status === 'ACTION_REQUIRED';
|
|
30
|
-
const shouldStart = executionProcess.status === 'STARTED' ||
|
|
31
|
-
executionProcess.status === 'PENDING';
|
|
32
|
-
const shouldResume = executionProcess.status === 'PENDING';
|
|
33
|
-
if (isExecutionStarted && shouldRestart) {
|
|
34
|
-
setExecutionStarted(false);
|
|
35
|
-
setExpired(false);
|
|
36
|
-
return;
|
|
37
|
-
}
|
|
38
|
-
if (isExecutionStarted && isExpired) {
|
|
39
|
-
return;
|
|
40
|
-
}
|
|
41
|
-
if (!isExecutionStarted && shouldStart) {
|
|
42
|
-
const expiryTimestamp = getExpiryTimestamp(step);
|
|
43
|
-
setExecutionStarted(true);
|
|
44
|
-
setExpired(false);
|
|
45
|
-
setExpiryTimestamp(expiryTimestamp);
|
|
46
|
-
restart(expiryTimestamp);
|
|
47
|
-
return;
|
|
48
|
-
}
|
|
49
|
-
if (isRunning && shouldPause) {
|
|
50
|
-
pause();
|
|
51
|
-
}
|
|
52
|
-
else if (!isRunning && shouldResume) {
|
|
53
|
-
resume();
|
|
54
|
-
}
|
|
55
|
-
}, [isExecutionStarted, isExpired, isRunning, pause, restart, resume, step]);
|
|
56
|
-
if (!isExecutionStarted) {
|
|
57
|
-
const showSeconds = step.estimate.executionDuration < 60;
|
|
58
|
-
const duration = showSeconds
|
|
59
|
-
? Math.floor(step.estimate.executionDuration)
|
|
60
|
-
: Math.floor(step.estimate.executionDuration / 60);
|
|
61
|
-
return (_jsx(StepTimerContent, { children: duration.toLocaleString(i18n.language, {
|
|
62
|
-
style: 'unit',
|
|
63
|
-
unit: showSeconds ? 'second' : 'minute',
|
|
64
|
-
unitDisplay: 'narrow',
|
|
65
|
-
}) }));
|
|
66
|
-
}
|
|
67
|
-
const isTimerExpired = isExpired || (!minutes && !seconds);
|
|
68
|
-
if (step.execution?.status === 'DONE' ||
|
|
69
|
-
step.execution?.status === 'FAILED' ||
|
|
70
|
-
(isTimerExpired && hideInProgress)) {
|
|
71
|
-
return null;
|
|
72
|
-
}
|
|
73
|
-
return isTimerExpired ? (t('main.inProgress')) : (_jsx(StepTimerContent, { children: `${minutes}:${seconds < 10 ? `0${seconds}` : seconds}` }));
|
|
74
|
-
};
|
|
75
|
-
const StepTimerContent = ({ children }) => {
|
|
76
|
-
const { t } = useTranslation();
|
|
77
|
-
return (_jsx(Tooltip, { title: t('tooltip.estimatedTime'), sx: { cursor: 'help' }, children: _jsxs(Box, { component: "span", sx: {
|
|
78
|
-
display: 'flex',
|
|
79
|
-
alignItems: 'center',
|
|
80
|
-
height: 14,
|
|
81
|
-
}, children: [_jsx(IconTypography, { as: "span", sx: { marginRight: 0.5, fontSize: 16 }, children: _jsx(AccessTimeFilled, { fontSize: "inherit" }) }), _jsx(Box, { component: "span", sx: {
|
|
82
|
-
fontVariantNumeric: 'tabular-nums',
|
|
83
|
-
cursor: 'help',
|
|
84
|
-
}, children: children })] }) }));
|
|
85
|
-
};
|
|
86
|
-
//# sourceMappingURL=StepTimer.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"StepTimer.js","sourceRoot":"","sources":["../../../../src/components/Step/StepTimer.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import type { MutableRefObject } from 'react';
|
|
2
|
-
interface UseContentHeightProps {
|
|
3
|
-
listParentRef: MutableRefObject<HTMLUListElement | null>;
|
|
4
|
-
headerRef: MutableRefObject<HTMLElement | null>;
|
|
5
|
-
}
|
|
6
|
-
export declare const minTokenListHeight = 360;
|
|
7
|
-
export declare const minMobileTokenListHeight = 160;
|
|
8
|
-
export declare const useTokenListHeight: ({ listParentRef, headerRef, }: UseContentHeightProps) => {
|
|
9
|
-
minListHeight: number;
|
|
10
|
-
tokenListHeight: number;
|
|
11
|
-
};
|
|
12
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useTokenListHeight.js","sourceRoot":"","sources":["../../../../src/pages/SelectTokenPage/useTokenListHeight.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
import type { LiFiStepExtended } from '@lifi/sdk'
|
|
2
|
-
import { AccessTimeFilled } from '@mui/icons-material'
|
|
3
|
-
import { Box, Tooltip } from '@mui/material'
|
|
4
|
-
import { type FC, type PropsWithChildren, useEffect, useState } from 'react'
|
|
5
|
-
import { useTranslation } from 'react-i18next'
|
|
6
|
-
import { useTimer } from '../../hooks/timer/useTimer.js'
|
|
7
|
-
import { IconTypography } from '../IconTypography.js'
|
|
8
|
-
|
|
9
|
-
const getExecutionProcess = (step: LiFiStepExtended) =>
|
|
10
|
-
step.execution?.process.findLast(
|
|
11
|
-
(process) =>
|
|
12
|
-
process.type === 'SWAP' ||
|
|
13
|
-
process.type === 'CROSS_CHAIN' ||
|
|
14
|
-
process.type === 'RECEIVING_CHAIN'
|
|
15
|
-
)
|
|
16
|
-
|
|
17
|
-
const getExpiryTimestamp = (step: LiFiStepExtended) =>
|
|
18
|
-
new Date(
|
|
19
|
-
(getExecutionProcess(step)?.startedAt ?? Date.now()) +
|
|
20
|
-
step.estimate.executionDuration * 1000
|
|
21
|
-
)
|
|
22
|
-
|
|
23
|
-
export const StepTimer: React.FC<{
|
|
24
|
-
step: LiFiStepExtended
|
|
25
|
-
hideInProgress?: boolean
|
|
26
|
-
}> = ({ step, hideInProgress }) => {
|
|
27
|
-
const { t, i18n } = useTranslation()
|
|
28
|
-
const [isExpired, setExpired] = useState(false)
|
|
29
|
-
const [isExecutionStarted, setExecutionStarted] = useState(
|
|
30
|
-
() => !!getExecutionProcess(step)
|
|
31
|
-
)
|
|
32
|
-
const [expiryTimestamp, setExpiryTimestamp] = useState(() =>
|
|
33
|
-
getExpiryTimestamp(step)
|
|
34
|
-
)
|
|
35
|
-
const { seconds, minutes, isRunning, pause, resume, restart } = useTimer({
|
|
36
|
-
autoStart: false,
|
|
37
|
-
expiryTimestamp,
|
|
38
|
-
onExpire: () => setExpired(true),
|
|
39
|
-
})
|
|
40
|
-
|
|
41
|
-
useEffect(() => {
|
|
42
|
-
const executionProcess = getExecutionProcess(step)
|
|
43
|
-
if (!executionProcess) {
|
|
44
|
-
return
|
|
45
|
-
}
|
|
46
|
-
const shouldRestart = executionProcess.status === 'FAILED'
|
|
47
|
-
const shouldPause = executionProcess.status === 'ACTION_REQUIRED'
|
|
48
|
-
const shouldStart =
|
|
49
|
-
executionProcess.status === 'STARTED' ||
|
|
50
|
-
executionProcess.status === 'PENDING'
|
|
51
|
-
const shouldResume = executionProcess.status === 'PENDING'
|
|
52
|
-
if (isExecutionStarted && shouldRestart) {
|
|
53
|
-
setExecutionStarted(false)
|
|
54
|
-
setExpired(false)
|
|
55
|
-
return
|
|
56
|
-
}
|
|
57
|
-
if (isExecutionStarted && isExpired) {
|
|
58
|
-
return
|
|
59
|
-
}
|
|
60
|
-
if (!isExecutionStarted && shouldStart) {
|
|
61
|
-
const expiryTimestamp = getExpiryTimestamp(step)
|
|
62
|
-
setExecutionStarted(true)
|
|
63
|
-
setExpired(false)
|
|
64
|
-
setExpiryTimestamp(expiryTimestamp)
|
|
65
|
-
restart(expiryTimestamp)
|
|
66
|
-
return
|
|
67
|
-
}
|
|
68
|
-
if (isRunning && shouldPause) {
|
|
69
|
-
pause()
|
|
70
|
-
} else if (!isRunning && shouldResume) {
|
|
71
|
-
resume()
|
|
72
|
-
}
|
|
73
|
-
}, [isExecutionStarted, isExpired, isRunning, pause, restart, resume, step])
|
|
74
|
-
|
|
75
|
-
if (!isExecutionStarted) {
|
|
76
|
-
const showSeconds = step.estimate.executionDuration < 60
|
|
77
|
-
const duration = showSeconds
|
|
78
|
-
? Math.floor(step.estimate.executionDuration)
|
|
79
|
-
: Math.floor(step.estimate.executionDuration / 60)
|
|
80
|
-
return (
|
|
81
|
-
<StepTimerContent>
|
|
82
|
-
{duration.toLocaleString(i18n.language, {
|
|
83
|
-
style: 'unit',
|
|
84
|
-
unit: showSeconds ? 'second' : 'minute',
|
|
85
|
-
unitDisplay: 'narrow',
|
|
86
|
-
})}
|
|
87
|
-
</StepTimerContent>
|
|
88
|
-
)
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
const isTimerExpired = isExpired || (!minutes && !seconds)
|
|
92
|
-
|
|
93
|
-
if (
|
|
94
|
-
step.execution?.status === 'DONE' ||
|
|
95
|
-
step.execution?.status === 'FAILED' ||
|
|
96
|
-
(isTimerExpired && hideInProgress)
|
|
97
|
-
) {
|
|
98
|
-
return null
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
return isTimerExpired ? (
|
|
102
|
-
t('main.inProgress')
|
|
103
|
-
) : (
|
|
104
|
-
<StepTimerContent>
|
|
105
|
-
{`${minutes}:${seconds < 10 ? `0${seconds}` : seconds}`}
|
|
106
|
-
</StepTimerContent>
|
|
107
|
-
)
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
const StepTimerContent: FC<PropsWithChildren> = ({ children }) => {
|
|
111
|
-
const { t } = useTranslation()
|
|
112
|
-
return (
|
|
113
|
-
<Tooltip title={t('tooltip.estimatedTime')} sx={{ cursor: 'help' }}>
|
|
114
|
-
<Box
|
|
115
|
-
component="span"
|
|
116
|
-
sx={{
|
|
117
|
-
display: 'flex',
|
|
118
|
-
alignItems: 'center',
|
|
119
|
-
height: 14,
|
|
120
|
-
}}
|
|
121
|
-
>
|
|
122
|
-
<IconTypography as="span" sx={{ marginRight: 0.5, fontSize: 16 }}>
|
|
123
|
-
<AccessTimeFilled fontSize="inherit" />
|
|
124
|
-
</IconTypography>
|
|
125
|
-
<Box
|
|
126
|
-
component="span"
|
|
127
|
-
sx={{
|
|
128
|
-
fontVariantNumeric: 'tabular-nums',
|
|
129
|
-
cursor: 'help',
|
|
130
|
-
}}
|
|
131
|
-
>
|
|
132
|
-
{children}
|
|
133
|
-
</Box>
|
|
134
|
-
</Box>
|
|
135
|
-
</Tooltip>
|
|
136
|
-
)
|
|
137
|
-
}
|
|
File without changes
|