@lifi/widget 3.36.0-beta.0 → 3.36.1
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 +19 -0
- package/dist/esm/components/SelectChainAndToken.js +3 -2
- package/dist/esm/components/SelectChainAndToken.js.map +1 -1
- package/dist/esm/config/version.d.ts +1 -1
- package/dist/esm/config/version.js +1 -1
- package/dist/esm/config/version.js.map +1 -1
- package/dist/esm/utils/format.d.ts +9 -0
- package/dist/esm/utils/format.js +29 -10
- package/dist/esm/utils/format.js.map +1 -1
- package/dist/esm/utils/format.test.d.ts +1 -0
- package/dist/esm/utils/format.test.js +47 -0
- package/dist/esm/utils/format.test.js.map +1 -0
- package/package.json +3 -3
- package/package.json.tmp +4 -4
- package/src/components/SelectChainAndToken.tsx +3 -3
- package/src/config/version.ts +1 -1
- package/src/utils/format.test.ts +53 -0
- package/src/utils/format.ts +36 -9
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,25 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
|
|
4
4
|
|
|
5
|
+
### [3.36.1](https://github.com/lifinance/widget/compare/v3.36.0...v3.36.1) (2025-12-04)
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
### Bug Fixes
|
|
9
|
+
|
|
10
|
+
* limit decimals in formatInputAmount ([#601](https://github.com/lifinance/widget/issues/601)) ([02dd64d](https://github.com/lifinance/widget/commit/02dd64d0379906d98b7df36ece9e2b2bfc3e0876))
|
|
11
|
+
|
|
12
|
+
## [3.36.0](https://github.com/lifinance/widget/compare/v3.35.1...v3.36.0) (2025-12-03)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
### Features
|
|
16
|
+
|
|
17
|
+
* fix peer dependencies and update license ([#617](https://github.com/lifinance/widget/issues/617)) ([7ac2171](https://github.com/lifinance/widget/commit/7ac21711375642e18e2b487c1245f7bb920e97ba))
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
### Bug Fixes
|
|
21
|
+
|
|
22
|
+
* refactor hidden ui token logic ([#618](https://github.com/lifinance/widget/issues/618)) ([9d6a41e](https://github.com/lifinance/widget/commit/9d6a41ea35f99d20d5dbf2831766ffbdf1953ec4))
|
|
23
|
+
|
|
5
24
|
### [3.35.1](https://github.com/lifinance/widget/compare/v3.35.0...v3.35.1) (2025-12-01)
|
|
6
25
|
|
|
7
26
|
|
|
@@ -10,20 +10,21 @@ export const SelectChainAndToken = (props) => {
|
|
|
10
10
|
const prefersNarrowView = useMediaQuery((theme) => theme.breakpoints.down('sm'));
|
|
11
11
|
const { disabledUI, hiddenUI, subvariant } = useWidgetConfig();
|
|
12
12
|
const [fromChain, toChain, fromToken, toToken] = useFieldValues('fromChain', 'toChain', 'fromToken', 'toToken');
|
|
13
|
-
const hiddenFromToken = hiddenUI?.includes(HiddenUI.FromToken);
|
|
14
13
|
const hiddenReverse = subvariant === 'refuel' ||
|
|
15
14
|
disabledUI?.includes(DisabledUI.FromToken) ||
|
|
16
15
|
disabledUI?.includes(DisabledUI.ToToken) ||
|
|
17
16
|
hiddenUI?.includes(HiddenUI.FromToken) ||
|
|
18
17
|
hiddenUI?.includes(HiddenUI.ToToken) ||
|
|
19
18
|
hiddenUI?.includes(HiddenUI.ReverseTokensButton);
|
|
19
|
+
const hiddenFromToken = hiddenUI?.includes(HiddenUI.FromToken);
|
|
20
20
|
const hiddenToToken = subvariant === 'custom' || hiddenUI?.includes(HiddenUI.ToToken);
|
|
21
21
|
const isCompact = !!fromChain &&
|
|
22
22
|
!!toChain &&
|
|
23
23
|
!!fromToken &&
|
|
24
24
|
!!toToken &&
|
|
25
25
|
!prefersNarrowView &&
|
|
26
|
-
!hiddenToToken
|
|
26
|
+
!hiddenToToken &&
|
|
27
|
+
!hiddenFromToken;
|
|
27
28
|
return (_jsxs(Box, { sx: { display: 'flex', flexDirection: isCompact ? 'row' : 'column' }, ...props, children: [!hiddenFromToken ? (_jsx(SelectTokenButton, { formType: "from", compact: isCompact, hiddenReverse: hiddenReverse })) : null, !hiddenToToken && !hiddenFromToken ? (!hiddenReverse ? (_jsx(ReverseTokensButton, { vertical: !isCompact })) : (_jsx(ReverseTokensButtonEmpty, {}))) : null, !hiddenToToken ? (_jsx(SelectTokenButton, { formType: "to", compact: isCompact, hiddenReverse: hiddenReverse })) : null] }));
|
|
28
29
|
};
|
|
29
30
|
//# sourceMappingURL=SelectChainAndToken.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelectChainAndToken.js","sourceRoot":"","sources":["../../../src/components/SelectChainAndToken.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0DAA0D,CAAA;AAC9F,OAAO,EAAE,iBAAiB,EAAE,MAAM,sDAAsD,CAAA;AACxF,OAAO,EAAE,eAAe,EAAE,MAAM,+CAA+C,CAAA;AAC/E,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAA;AACjE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,oDAAoD,CAAA;AAE7F,MAAM,CAAC,MAAM,mBAAmB,GAAuB,CAAC,KAAK,EAAE,EAAE;IAC/D,MAAM,iBAAiB,GAAG,aAAa,CAAC,CAAC,KAAY,EAAE,EAAE,CACvD,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAC7B,CAAA;IACD,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,eAAe,EAAE,CAAA;IAE9D,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,GAAG,cAAc,CAC7D,WAAW,EACX,SAAS,EACT,WAAW,EACX,SAAS,CACV,CAAA;IAED,MAAM,
|
|
1
|
+
{"version":3,"file":"SelectChainAndToken.js","sourceRoot":"","sources":["../../../src/components/SelectChainAndToken.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0DAA0D,CAAA;AAC9F,OAAO,EAAE,iBAAiB,EAAE,MAAM,sDAAsD,CAAA;AACxF,OAAO,EAAE,eAAe,EAAE,MAAM,+CAA+C,CAAA;AAC/E,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAA;AACjE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,oDAAoD,CAAA;AAE7F,MAAM,CAAC,MAAM,mBAAmB,GAAuB,CAAC,KAAK,EAAE,EAAE;IAC/D,MAAM,iBAAiB,GAAG,aAAa,CAAC,CAAC,KAAY,EAAE,EAAE,CACvD,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAC7B,CAAA;IACD,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,eAAe,EAAE,CAAA;IAE9D,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,GAAG,cAAc,CAC7D,WAAW,EACX,SAAS,EACT,WAAW,EACX,SAAS,CACV,CAAA;IAED,MAAM,aAAa,GACjB,UAAU,KAAK,QAAQ;QACvB,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC;QAC1C,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC;QACxC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC;QACtC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC;QACpC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAA;IAElD,MAAM,eAAe,GAAG,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAA;IAC9D,MAAM,aAAa,GACjB,UAAU,KAAK,QAAQ,IAAI,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;IAEjE,MAAM,SAAS,GACb,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,OAAO;QACT,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,OAAO;QACT,CAAC,iBAAiB;QAClB,CAAC,aAAa;QACd,CAAC,eAAe,CAAA;IAElB,OAAO,CACL,MAAC,GAAG,IACF,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE,KAChE,KAAK,aAER,CAAC,eAAe,CAAC,CAAC,CAAC,CAClB,KAAC,iBAAiB,IAChB,QAAQ,EAAC,MAAM,EACf,OAAO,EAAE,SAAS,EAClB,aAAa,EAAE,aAAa,GAC5B,CACH,CAAC,CAAC,CAAC,IAAI,EACP,CAAC,aAAa,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CACpC,CAAC,aAAa,CAAC,CAAC,CAAC,CACf,KAAC,mBAAmB,IAAC,QAAQ,EAAE,CAAC,SAAS,GAAI,CAC9C,CAAC,CAAC,CAAC,CACF,KAAC,wBAAwB,KAAG,CAC7B,CACF,CAAC,CAAC,CAAC,IAAI,EACP,CAAC,aAAa,CAAC,CAAC,CAAC,CAChB,KAAC,iBAAiB,IAChB,QAAQ,EAAC,IAAI,EACb,OAAO,EAAE,SAAS,EAClB,aAAa,EAAE,aAAa,GAC5B,CACH,CAAC,CAAC,CAAC,IAAI,IACJ,CACP,CAAA;AACH,CAAC,CAAA"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export declare const name = "@lifi/widget";
|
|
2
|
-
export declare const version = "3.36.
|
|
2
|
+
export declare const version = "3.36.1";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../../src/config/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,IAAI,GAAG,cAAc,CAAA;AAClC,MAAM,CAAC,MAAM,OAAO,GAAG,
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../../src/config/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,IAAI,GAAG,cAAc,CAAA;AAClC,MAAM,CAAC,MAAM,OAAO,GAAG,QAAQ,CAAA"}
|
|
@@ -5,6 +5,15 @@
|
|
|
5
5
|
*/
|
|
6
6
|
export declare function formatTokenAmount(amount: bigint | undefined, decimals: number): string;
|
|
7
7
|
export declare function formatSlippage(slippage?: string, defaultValue?: string, returnInitial?: boolean): string;
|
|
8
|
+
/**
|
|
9
|
+
* Formats a user input amount string, normalizing it and optionally limiting decimal places.
|
|
10
|
+
* @param amount - The amount string to format (e.g., '123.45', '1,23', '0..')
|
|
11
|
+
* @param decimals - Maximum number of decimal places to allow. If null, no limit is applied.
|
|
12
|
+
* @param returnInitial - If true, preserves the input format during typing (e.g., keeps trailing dots,
|
|
13
|
+
* preserves leading zeros, keeps negative signs). If false (default), cleans up the
|
|
14
|
+
* format on blur (removes leading/trailing zeros, removes negative signs).
|
|
15
|
+
* @returns The formatted amount string, or empty string for invalid input.
|
|
16
|
+
*/
|
|
8
17
|
export declare function formatInputAmount(amount: string, decimals?: number | null, returnInitial?: boolean): string;
|
|
9
18
|
export declare function formatTokenPrice(amount?: string | bigint, price?: string, decimals?: number): number;
|
|
10
19
|
/**
|
package/dist/esm/utils/format.js
CHANGED
|
@@ -34,34 +34,53 @@ export function formatSlippage(slippage = '', defaultValue = '', returnInitial =
|
|
|
34
34
|
}
|
|
35
35
|
return parsedSlippage.toString();
|
|
36
36
|
}
|
|
37
|
+
/**
|
|
38
|
+
* Formats a user input amount string, normalizing it and optionally limiting decimal places.
|
|
39
|
+
* @param amount - The amount string to format (e.g., '123.45', '1,23', '0..')
|
|
40
|
+
* @param decimals - Maximum number of decimal places to allow. If null, no limit is applied.
|
|
41
|
+
* @param returnInitial - If true, preserves the input format during typing (e.g., keeps trailing dots,
|
|
42
|
+
* preserves leading zeros, keeps negative signs). If false (default), cleans up the
|
|
43
|
+
* format on blur (removes leading/trailing zeros, removes negative signs).
|
|
44
|
+
* @returns The formatted amount string, or empty string for invalid input.
|
|
45
|
+
*/
|
|
37
46
|
export function formatInputAmount(amount, decimals = null, returnInitial = false) {
|
|
38
47
|
if (!amount) {
|
|
39
48
|
return amount;
|
|
40
49
|
}
|
|
50
|
+
// Replace commas with dots
|
|
41
51
|
let formattedAmount = amount.trim().replaceAll(',', '.');
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
52
|
+
// Keep only the first dot, remove all subsequent dots
|
|
53
|
+
const dotIndex = formattedAmount.indexOf('.');
|
|
54
|
+
if (dotIndex !== -1) {
|
|
55
|
+
formattedAmount = `${formattedAmount.slice(0, dotIndex + 1)}${formattedAmount.slice(dotIndex + 1).replaceAll('.', '')}`;
|
|
56
|
+
}
|
|
57
|
+
// If the amount starts with a dot, prepend 0
|
|
58
|
+
if ((!returnInitial && formattedAmount.startsWith('.')) ||
|
|
59
|
+
formattedAmount === '.') {
|
|
45
60
|
formattedAmount = `0${formattedAmount}`;
|
|
46
61
|
}
|
|
62
|
+
// Parse the valid part of the amount
|
|
47
63
|
const parsedAmount = Number.parseFloat(formattedAmount);
|
|
48
64
|
if (Number.isNaN(Number(formattedAmount)) && !Number.isNaN(parsedAmount)) {
|
|
49
|
-
|
|
65
|
+
formattedAmount = parsedAmount.toString();
|
|
50
66
|
}
|
|
51
67
|
if (Number.isNaN(Math.abs(Number(formattedAmount)))) {
|
|
52
68
|
return '';
|
|
53
69
|
}
|
|
54
|
-
|
|
55
|
-
return formattedAmount;
|
|
56
|
-
}
|
|
57
|
-
else if (formattedAmount.startsWith('.')) {
|
|
58
|
-
formattedAmount = `0${formattedAmount}`;
|
|
59
|
-
}
|
|
70
|
+
// Split and limit decimals
|
|
60
71
|
let [integer, fraction = ''] = formattedAmount.split('.');
|
|
61
72
|
if (decimals !== null && fraction.length > decimals) {
|
|
62
73
|
fraction = fraction.slice(0, decimals);
|
|
63
74
|
}
|
|
75
|
+
if (returnInitial) {
|
|
76
|
+
if (!fraction) {
|
|
77
|
+
return formattedAmount;
|
|
78
|
+
}
|
|
79
|
+
return `${integer}${fraction ? `.${fraction}` : ''}`;
|
|
80
|
+
}
|
|
81
|
+
// Remove leading zeros and minus sign
|
|
64
82
|
integer = integer.replace(/^0+|-/, '');
|
|
83
|
+
// Remove trailing zeros
|
|
65
84
|
fraction = fraction.replace(/(0+)$/, '');
|
|
66
85
|
return `${integer || (fraction ? '0' : '')}${fraction ? `.${fraction}` : ''}`;
|
|
67
86
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../../src/utils/format.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,MAAM,CAAA;AAElC;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAC/B,MAA0B,EAC1B,QAAgB;IAEhB,MAAM,eAAe,GAAG,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAA;IACpE,MAAM,YAAY,GAAG,MAAM,CAAC,UAAU,CAAC,eAAe,CAAC,CAAA;IACvD,IAAI,CAAC,YAAY,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC;QAC3D,OAAO,GAAG,CAAA;IACZ,CAAC;IAED,OAAO,eAAe,CAAA;AACxB,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,QAAQ,GAAG,EAAE,EACb,YAAY,GAAG,EAAE,EACjB,aAAa,GAAG,KAAK;IAErB,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,QAAQ,CAAA;IACjB,CAAC;IACD,MAAM,cAAc,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAA;IAClD,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC;QACpE,OAAO,cAAc,CAAC,QAAQ,EAAE,CAAA;IAClC,CAAC;IACD,IAAI,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC;QACjC,OAAO,YAAY,CAAA;IACrB,CAAC;IACD,IAAI,cAAc,IAAI,GAAG,EAAE,CAAC;QAC1B,OAAO,KAAK,CAAA;IACd,CAAC;IACD,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,QAAQ,EAAE,CAAA;IAC5C,CAAC;IACD,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,QAAQ,CAAA;IACjB,CAAC;IACD,OAAO,cAAc,CAAC,QAAQ,EAAE,CAAA;AAClC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,MAAc,EACd,WAA0B,IAAI,EAC9B,aAAa,GAAG,KAAK;IAErB,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,MAAM,CAAA;IACf,CAAC;
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../../src/utils/format.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { formatInputAmount } from './format.js';
|
|
3
|
+
describe('formatInputAmount', () => {
|
|
4
|
+
it('should handle empty input', () => {
|
|
5
|
+
expect(formatInputAmount('')).toBe('');
|
|
6
|
+
});
|
|
7
|
+
it('should handle whitespace input', () => {
|
|
8
|
+
expect(formatInputAmount(' ')).toBe('');
|
|
9
|
+
});
|
|
10
|
+
it('should limit decimals', () => {
|
|
11
|
+
expect(formatInputAmount('123.456789', 2, true)).toBe('123.45');
|
|
12
|
+
expect(formatInputAmount('123.456789', 2, false)).toBe('123.45');
|
|
13
|
+
});
|
|
14
|
+
it('should handle leading and trailing zeros', () => {
|
|
15
|
+
expect(formatInputAmount('00123', 2, true)).toBe('00123');
|
|
16
|
+
expect(formatInputAmount('00123', 2, false)).toBe('123');
|
|
17
|
+
expect(formatInputAmount('123.45000', 6, true)).toBe('123.45000');
|
|
18
|
+
expect(formatInputAmount('123.45000', 6, false)).toBe('123.45');
|
|
19
|
+
});
|
|
20
|
+
it('should handle invalid input', () => {
|
|
21
|
+
expect(formatInputAmount('abc')).toBe('');
|
|
22
|
+
expect(formatInputAmount('-')).toBe('');
|
|
23
|
+
expect(formatInputAmount('123.456789abc', 2, true)).toBe('123.45');
|
|
24
|
+
expect(formatInputAmount('123.456789abc', 2, false)).toBe('123.45');
|
|
25
|
+
});
|
|
26
|
+
it('should normalize input (trim, commas, multiple dots)', () => {
|
|
27
|
+
expect(formatInputAmount(' 1,23 ', null, true)).toBe('1.23');
|
|
28
|
+
expect(formatInputAmount(' 1,23 ', null, false)).toBe('1.23');
|
|
29
|
+
expect(formatInputAmount('1.2.3', null, true)).toBe('1.23');
|
|
30
|
+
expect(formatInputAmount('1.2.3', null, false)).toBe('1.23');
|
|
31
|
+
expect(formatInputAmount('..5', null, true)).toBe('.5');
|
|
32
|
+
expect(formatInputAmount('..5', null, false)).toBe('0.5');
|
|
33
|
+
});
|
|
34
|
+
it('should handle zero input', () => {
|
|
35
|
+
expect(formatInputAmount('0', null, true)).toBe('0');
|
|
36
|
+
expect(formatInputAmount('00', null, true)).toBe('00');
|
|
37
|
+
expect(formatInputAmount('0.00', 2, true)).toBe('0.00');
|
|
38
|
+
expect(formatInputAmount('.0', 2, true)).toBe('.0');
|
|
39
|
+
expect(formatInputAmount('0..', 2, true)).toBe('0.');
|
|
40
|
+
expect(formatInputAmount('0', null, false)).toBe('');
|
|
41
|
+
expect(formatInputAmount('00', null, false)).toBe('');
|
|
42
|
+
expect(formatInputAmount('0.00', 2, false)).toBe('');
|
|
43
|
+
expect(formatInputAmount('.0', 2, false)).toBe('');
|
|
44
|
+
expect(formatInputAmount('0..', 2, false)).toBe('');
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
//# sourceMappingURL=format.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.test.js","sourceRoot":"","sources":["../../../src/utils/format.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lifi/widget",
|
|
3
|
-
"version": "3.36.
|
|
3
|
+
"version": "3.36.1",
|
|
4
4
|
"description": "LI.FI Widget for cross-chain bridging and swapping. It will drive your multi-chain strategy and attract new users from everywhere.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/esm/index.js",
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
"@bigmi/core": "^0.6.3",
|
|
35
35
|
"@emotion/react": "^11.14.0",
|
|
36
36
|
"@emotion/styled": "^11.14.1",
|
|
37
|
-
"@lifi/sdk": "^3.13.
|
|
37
|
+
"@lifi/sdk": "^3.13.7",
|
|
38
38
|
"@mui/icons-material": "^7.3.6",
|
|
39
39
|
"@mui/material": "^7.3.6",
|
|
40
40
|
"@mui/system": "^7.3.6",
|
|
@@ -52,7 +52,7 @@
|
|
|
52
52
|
"react-transition-group": "^4.4.5",
|
|
53
53
|
"viem": "^2.41.2",
|
|
54
54
|
"zustand": "^5.0.9",
|
|
55
|
-
"@lifi/wallet-management": "^3.20.
|
|
55
|
+
"@lifi/wallet-management": "^3.20.1"
|
|
56
56
|
},
|
|
57
57
|
"peerDependencies": {
|
|
58
58
|
"@bigmi/react": ">=0.6.0",
|
package/package.json.tmp
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lifi/widget",
|
|
3
|
-
"version": "3.36.
|
|
3
|
+
"version": "3.36.1",
|
|
4
4
|
"description": "LI.FI Widget for cross-chain bridging and swapping. It will drive your multi-chain strategy and attract new users from everywhere.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./src/index.ts",
|
|
@@ -53,7 +53,7 @@
|
|
|
53
53
|
"@bigmi/core": "^0.6.3",
|
|
54
54
|
"@emotion/react": "^11.14.0",
|
|
55
55
|
"@emotion/styled": "^11.14.1",
|
|
56
|
-
"@lifi/sdk": "^3.13.
|
|
56
|
+
"@lifi/sdk": "^3.13.7",
|
|
57
57
|
"@lifi/wallet-management": "workspace:^",
|
|
58
58
|
"@mui/icons-material": "^7.3.6",
|
|
59
59
|
"@mui/material": "^7.3.6",
|
|
@@ -77,8 +77,8 @@
|
|
|
77
77
|
"@types/react-transition-group": "^4.4.12",
|
|
78
78
|
"cpy-cli": "^6.0.0",
|
|
79
79
|
"madge": "^8.0.0",
|
|
80
|
-
"react": "^19.2.
|
|
81
|
-
"react-dom": "^19.2.
|
|
80
|
+
"react": "^19.2.1",
|
|
81
|
+
"react-dom": "^19.2.1",
|
|
82
82
|
"typescript": "^5.9.3",
|
|
83
83
|
"vitest": "^4.0.15"
|
|
84
84
|
},
|
|
@@ -20,8 +20,6 @@ export const SelectChainAndToken: React.FC<BoxProps> = (props) => {
|
|
|
20
20
|
'toToken'
|
|
21
21
|
)
|
|
22
22
|
|
|
23
|
-
const hiddenFromToken = hiddenUI?.includes(HiddenUI.FromToken)
|
|
24
|
-
|
|
25
23
|
const hiddenReverse =
|
|
26
24
|
subvariant === 'refuel' ||
|
|
27
25
|
disabledUI?.includes(DisabledUI.FromToken) ||
|
|
@@ -30,6 +28,7 @@ export const SelectChainAndToken: React.FC<BoxProps> = (props) => {
|
|
|
30
28
|
hiddenUI?.includes(HiddenUI.ToToken) ||
|
|
31
29
|
hiddenUI?.includes(HiddenUI.ReverseTokensButton)
|
|
32
30
|
|
|
31
|
+
const hiddenFromToken = hiddenUI?.includes(HiddenUI.FromToken)
|
|
33
32
|
const hiddenToToken =
|
|
34
33
|
subvariant === 'custom' || hiddenUI?.includes(HiddenUI.ToToken)
|
|
35
34
|
|
|
@@ -39,7 +38,8 @@ export const SelectChainAndToken: React.FC<BoxProps> = (props) => {
|
|
|
39
38
|
!!fromToken &&
|
|
40
39
|
!!toToken &&
|
|
41
40
|
!prefersNarrowView &&
|
|
42
|
-
!hiddenToToken
|
|
41
|
+
!hiddenToToken &&
|
|
42
|
+
!hiddenFromToken
|
|
43
43
|
|
|
44
44
|
return (
|
|
45
45
|
<Box
|
package/src/config/version.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export const name = '@lifi/widget'
|
|
2
|
-
export const version = '3.36.
|
|
2
|
+
export const version = '3.36.1'
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest'
|
|
2
|
+
import { formatInputAmount } from './format.js'
|
|
3
|
+
|
|
4
|
+
describe('formatInputAmount', () => {
|
|
5
|
+
it('should handle empty input', () => {
|
|
6
|
+
expect(formatInputAmount('')).toBe('')
|
|
7
|
+
})
|
|
8
|
+
|
|
9
|
+
it('should handle whitespace input', () => {
|
|
10
|
+
expect(formatInputAmount(' ')).toBe('')
|
|
11
|
+
})
|
|
12
|
+
|
|
13
|
+
it('should limit decimals', () => {
|
|
14
|
+
expect(formatInputAmount('123.456789', 2, true)).toBe('123.45')
|
|
15
|
+
expect(formatInputAmount('123.456789', 2, false)).toBe('123.45')
|
|
16
|
+
})
|
|
17
|
+
|
|
18
|
+
it('should handle leading and trailing zeros', () => {
|
|
19
|
+
expect(formatInputAmount('00123', 2, true)).toBe('00123')
|
|
20
|
+
expect(formatInputAmount('00123', 2, false)).toBe('123')
|
|
21
|
+
expect(formatInputAmount('123.45000', 6, true)).toBe('123.45000')
|
|
22
|
+
expect(formatInputAmount('123.45000', 6, false)).toBe('123.45')
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
it('should handle invalid input', () => {
|
|
26
|
+
expect(formatInputAmount('abc')).toBe('')
|
|
27
|
+
expect(formatInputAmount('-')).toBe('')
|
|
28
|
+
expect(formatInputAmount('123.456789abc', 2, true)).toBe('123.45')
|
|
29
|
+
expect(formatInputAmount('123.456789abc', 2, false)).toBe('123.45')
|
|
30
|
+
})
|
|
31
|
+
|
|
32
|
+
it('should normalize input (trim, commas, multiple dots)', () => {
|
|
33
|
+
expect(formatInputAmount(' 1,23 ', null, true)).toBe('1.23')
|
|
34
|
+
expect(formatInputAmount(' 1,23 ', null, false)).toBe('1.23')
|
|
35
|
+
expect(formatInputAmount('1.2.3', null, true)).toBe('1.23')
|
|
36
|
+
expect(formatInputAmount('1.2.3', null, false)).toBe('1.23')
|
|
37
|
+
expect(formatInputAmount('..5', null, true)).toBe('.5')
|
|
38
|
+
expect(formatInputAmount('..5', null, false)).toBe('0.5')
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
it('should handle zero input', () => {
|
|
42
|
+
expect(formatInputAmount('0', null, true)).toBe('0')
|
|
43
|
+
expect(formatInputAmount('00', null, true)).toBe('00')
|
|
44
|
+
expect(formatInputAmount('0.00', 2, true)).toBe('0.00')
|
|
45
|
+
expect(formatInputAmount('.0', 2, true)).toBe('.0')
|
|
46
|
+
expect(formatInputAmount('0..', 2, true)).toBe('0.')
|
|
47
|
+
expect(formatInputAmount('0', null, false)).toBe('')
|
|
48
|
+
expect(formatInputAmount('00', null, false)).toBe('')
|
|
49
|
+
expect(formatInputAmount('0.00', 2, false)).toBe('')
|
|
50
|
+
expect(formatInputAmount('.0', 2, false)).toBe('')
|
|
51
|
+
expect(formatInputAmount('0..', 2, false)).toBe('')
|
|
52
|
+
})
|
|
53
|
+
})
|
package/src/utils/format.ts
CHANGED
|
@@ -45,6 +45,15 @@ export function formatSlippage(
|
|
|
45
45
|
return parsedSlippage.toString()
|
|
46
46
|
}
|
|
47
47
|
|
|
48
|
+
/**
|
|
49
|
+
* Formats a user input amount string, normalizing it and optionally limiting decimal places.
|
|
50
|
+
* @param amount - The amount string to format (e.g., '123.45', '1,23', '0..')
|
|
51
|
+
* @param decimals - Maximum number of decimal places to allow. If null, no limit is applied.
|
|
52
|
+
* @param returnInitial - If true, preserves the input format during typing (e.g., keeps trailing dots,
|
|
53
|
+
* preserves leading zeros, keeps negative signs). If false (default), cleans up the
|
|
54
|
+
* format on blur (removes leading/trailing zeros, removes negative signs).
|
|
55
|
+
* @returns The formatted amount string, or empty string for invalid input.
|
|
56
|
+
*/
|
|
48
57
|
export function formatInputAmount(
|
|
49
58
|
amount: string,
|
|
50
59
|
decimals: number | null = null,
|
|
@@ -53,31 +62,49 @@ export function formatInputAmount(
|
|
|
53
62
|
if (!amount) {
|
|
54
63
|
return amount
|
|
55
64
|
}
|
|
65
|
+
|
|
66
|
+
// Replace commas with dots
|
|
56
67
|
let formattedAmount = amount.trim().replaceAll(',', '.')
|
|
68
|
+
|
|
69
|
+
// Keep only the first dot, remove all subsequent dots
|
|
70
|
+
const dotIndex = formattedAmount.indexOf('.')
|
|
71
|
+
if (dotIndex !== -1) {
|
|
72
|
+
formattedAmount = `${formattedAmount.slice(0, dotIndex + 1)}${formattedAmount.slice(dotIndex + 1).replaceAll('.', '')}`
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// If the amount starts with a dot, prepend 0
|
|
57
76
|
if (
|
|
58
|
-
returnInitial &&
|
|
59
|
-
formattedAmount
|
|
60
|
-
!Number.parseFloat(formattedAmount)
|
|
77
|
+
(!returnInitial && formattedAmount.startsWith('.')) ||
|
|
78
|
+
formattedAmount === '.'
|
|
61
79
|
) {
|
|
62
80
|
formattedAmount = `0${formattedAmount}`
|
|
63
81
|
}
|
|
82
|
+
|
|
83
|
+
// Parse the valid part of the amount
|
|
64
84
|
const parsedAmount = Number.parseFloat(formattedAmount)
|
|
65
85
|
if (Number.isNaN(Number(formattedAmount)) && !Number.isNaN(parsedAmount)) {
|
|
66
|
-
|
|
86
|
+
formattedAmount = parsedAmount.toString()
|
|
67
87
|
}
|
|
68
88
|
if (Number.isNaN(Math.abs(Number(formattedAmount)))) {
|
|
69
89
|
return ''
|
|
70
90
|
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
} else if (formattedAmount.startsWith('.')) {
|
|
74
|
-
formattedAmount = `0${formattedAmount}`
|
|
75
|
-
}
|
|
91
|
+
|
|
92
|
+
// Split and limit decimals
|
|
76
93
|
let [integer, fraction = ''] = formattedAmount.split('.')
|
|
77
94
|
if (decimals !== null && fraction.length > decimals) {
|
|
78
95
|
fraction = fraction.slice(0, decimals)
|
|
79
96
|
}
|
|
97
|
+
|
|
98
|
+
if (returnInitial) {
|
|
99
|
+
if (!fraction) {
|
|
100
|
+
return formattedAmount
|
|
101
|
+
}
|
|
102
|
+
return `${integer}${fraction ? `.${fraction}` : ''}`
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// Remove leading zeros and minus sign
|
|
80
106
|
integer = integer.replace(/^0+|-/, '')
|
|
107
|
+
// Remove trailing zeros
|
|
81
108
|
fraction = fraction.replace(/(0+)$/, '')
|
|
82
109
|
|
|
83
110
|
return `${integer || (fraction ? '0' : '')}${fraction ? `.${fraction}` : ''}`
|