@rango-dev/widget-embedded 0.23.1-next.21 → 0.23.1-next.22
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/dist/constants/searchFor.d.ts +7 -0
- package/dist/constants/searchFor.d.ts.map +1 -0
- package/dist/index.js +2 -2
- package/dist/index.js.map +4 -4
- package/dist/pages/SelectSwapItemsPage.d.ts.map +1 -1
- package/dist/store/slices/data.d.ts +3 -1
- package/dist/store/slices/data.d.ts.map +1 -1
- package/dist/utils/common.d.ts +4 -0
- package/dist/utils/common.d.ts.map +1 -1
- package/dist/utils/meta.d.ts +1 -0
- package/dist/utils/meta.d.ts.map +1 -1
- package/dist/utils/wallets.d.ts +1 -1
- package/dist/utils/wallets.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/constants/searchFor.ts +6 -0
- package/src/pages/SelectSwapItemsPage.tsx +2 -7
- package/src/store/slices/data.ts +74 -29
- package/src/utils/common.ts +181 -0
- package/src/utils/meta.ts +21 -0
- package/src/utils/wallets.ts +5 -47
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelectSwapItemsPage.d.ts","sourceRoot":"","sources":["../../src/pages/SelectSwapItemsPage.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAmB,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"SelectSwapItemsPage.d.ts","sourceRoot":"","sources":["../../src/pages/SelectSwapItemsPage.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAaxC,UAAU,SAAS;IACjB,IAAI,EAAE,QAAQ,GAAG,aAAa,CAAC;CAChC;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,SAAS,qBAiGnD"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { ConfigSlice } from './config';
|
|
2
|
+
import type { Balance } from '../../types';
|
|
2
3
|
import type { BlockchainMeta, SwapperMeta, Token } from 'rango-sdk';
|
|
3
4
|
import type { StateCreator } from 'zustand';
|
|
4
5
|
type BlockchainOptions = {
|
|
@@ -8,10 +9,11 @@ type TokenOptions = {
|
|
|
8
9
|
type: 'source' | 'destination';
|
|
9
10
|
blockchain?: string;
|
|
10
11
|
searchFor?: string;
|
|
12
|
+
getBalanceFor?: (token: Token) => Balance | null;
|
|
11
13
|
};
|
|
12
14
|
export type FetchStatus = 'loading' | 'success' | 'failed';
|
|
13
15
|
export interface DataSlice {
|
|
14
|
-
|
|
16
|
+
_blockchainsMapByName: Map<string, BlockchainMeta>;
|
|
15
17
|
_tokens: Token[];
|
|
16
18
|
_popularTokens: Token[];
|
|
17
19
|
_swappers: SwapperMeta[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data.d.ts","sourceRoot":"","sources":["../../../src/store/slices/data.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AACpE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"data.d.ts","sourceRoot":"","sources":["../../../src/store/slices/data.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AACpE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAS5C,KAAK,iBAAiB,GAAG;IACvB,IAAI,CAAC,EAAE,QAAQ,GAAG,aAAa,CAAC;CACjC,CAAC;AAEF,KAAK,YAAY,GAAG;IAClB,IAAI,EAAE,QAAQ,GAAG,aAAa,CAAC;IAE/B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,GAAG,IAAI,CAAC;CAClD,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;AAC3D,MAAM,WAAW,SAAS;IACxB,qBAAqB,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACnD,OAAO,EAAE,KAAK,EAAE,CAAC;IACjB,cAAc,EAAE,KAAK,EAAE,CAAC;IACxB,SAAS,EAAE,WAAW,EAAE,CAAC;IACzB,WAAW,EAAE,WAAW,CAAC;IACzB,WAAW,EAAE,CAAC,OAAO,CAAC,EAAE,iBAAiB,KAAK,cAAc,EAAE,CAAC;IAC/D,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,YAAY,KAAK,KAAK,EAAE,CAAC;IAC5C,QAAQ,EAAE,MAAM,WAAW,EAAE,CAAC;IAC9B,aAAa,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,GAAG,aAAa,KAAK,OAAO,CAAC;IACzE,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAED,eAAO,MAAM,eAAe,EAAE,YAAY,CACxC,SAAS,GAAG,WAAW,EACvB;CAAE,EACF;CAAE,EACF,SAAS,CA4PT,CAAC"}
|
package/dist/utils/common.d.ts
CHANGED
|
@@ -1,7 +1,11 @@
|
|
|
1
|
+
import type { Token } from 'rango-sdk';
|
|
1
2
|
export declare function removeDuplicateFrom<T>(array: T[]): T[];
|
|
2
3
|
export declare function areEqual(array1: (number | string)[], array2: (number | string)[]): boolean;
|
|
3
4
|
export declare function debounce(fn: Function, time: number): (...args: any) => void;
|
|
4
5
|
export declare function containsText(text: string, searchText: string): boolean;
|
|
6
|
+
export declare function exactText(text: string, searchText: string): boolean;
|
|
7
|
+
export declare function startWithText(text: string, searchText: string): boolean;
|
|
5
8
|
export declare const getContainer: () => HTMLElement;
|
|
6
9
|
export declare const getExpanded: () => HTMLElement;
|
|
10
|
+
export declare function compareWithSearchFor(tokenA: Token, tokenB: Token, searchFor?: string): number;
|
|
7
11
|
//# sourceMappingURL=common.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/utils/common.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/utils/common.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAWvC,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAEtD;AAED,wBAAgB,QAAQ,CACtB,MAAM,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,EAC3B,MAAM,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,WAK5B;AAED,wBAAgB,QAAQ,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,aAGvB,GAAG,UAS9B;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAGtE;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAEnE;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAEvE;AAED,eAAO,MAAM,YAAY,mBACyC,CAAC;AAEnE,eAAO,MAAM,WAAW,mBAC8C,CAAC;AAsDvE,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,KAAK,EACb,MAAM,EAAE,KAAK,EACb,SAAS,CAAC,EAAE,MAAM,GACjB,MAAM,CA0GR"}
|
package/dist/utils/meta.d.ts
CHANGED
|
@@ -4,4 +4,5 @@ export declare function getBlockchainShortNameFor(blockchainName: string, blockc
|
|
|
4
4
|
export declare function getSwapperDisplayName(swapperId: string, swappers: SwapperMeta[]): string | undefined;
|
|
5
5
|
export declare function findToken(t: Asset, tokens: Token[]): Token | null;
|
|
6
6
|
export declare function findBlockchain(name: string, blockchains: BlockchainMeta[]): BlockchainMeta | null;
|
|
7
|
+
export declare function isTokenNative(token: Token, blockchain: BlockchainMeta | undefined): boolean;
|
|
7
8
|
//# sourceMappingURL=meta.d.ts.map
|
package/dist/utils/meta.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"meta.d.ts","sourceRoot":"","sources":["../../src/utils/meta.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAI3E,wBAAgB,2BAA2B,CACzC,cAAc,EAAE,MAAM,EACtB,WAAW,EAAE,cAAc,EAAE,GAC5B,MAAM,GAAG,SAAS,CAGpB;AACD,wBAAgB,yBAAyB,CACvC,cAAc,EAAE,MAAM,EACtB,WAAW,EAAE,cAAc,EAAE,GAC5B,MAAM,GAAG,SAAS,CAGpB;AAED,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,WAAW,EAAE,sBAGxB;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,gBAElD;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,yBAEzE"}
|
|
1
|
+
{"version":3,"file":"meta.d.ts","sourceRoot":"","sources":["../../src/utils/meta.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAI3E,wBAAgB,2BAA2B,CACzC,cAAc,EAAE,MAAM,EACtB,WAAW,EAAE,cAAc,EAAE,GAC5B,MAAM,GAAG,SAAS,CAGpB;AACD,wBAAgB,yBAAyB,CACvC,cAAc,EAAE,MAAM,EACtB,WAAW,EAAE,cAAc,EAAE,GAC5B,MAAM,GAAG,SAAS,CAGpB;AAED,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,WAAW,EAAE,sBAGxB;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,gBAElD;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,yBAEzE;AAED,wBAAgB,aAAa,CAC3B,KAAK,EAAE,KAAK,EACZ,UAAU,EAAE,cAAc,GAAG,SAAS,WAiBvC"}
|
package/dist/utils/wallets.d.ts
CHANGED
|
@@ -17,7 +17,7 @@ export declare const getUsdPrice: (blockchain: string, symbol: string, address:
|
|
|
17
17
|
export declare const isExperimentalChain: (blockchains: BlockchainMeta[], wallet: string) => boolean;
|
|
18
18
|
export declare const getKeplrCompatibleConnectedWallets: (selectableWallets: Wallet[]) => WalletType[];
|
|
19
19
|
export declare function formatBalance(balance: Balance | null): Balance | null;
|
|
20
|
-
export declare function
|
|
20
|
+
export declare function compareTokenBalance(token1Balance: Balance | null, token2Balance: Balance | null): number;
|
|
21
21
|
export declare function areTokensEqual(tokenA: Pick<Token, 'blockchain' | 'symbol' | 'address'> | null, tokenB: Pick<Token, 'blockchain' | 'symbol' | 'address'> | null): boolean;
|
|
22
22
|
export declare function sortWalletsBasedOnConnectionState(wallets: ModalWalletInfo[]): ModalWalletInfo[];
|
|
23
23
|
export declare function getConciseAddress(address: string, maxChars?: number, ellipsisLength?: number): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wallets.d.ts","sourceRoot":"","sources":["../../src/utils/wallets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,KAAK,EACV,OAAO,EACP,aAAa,EACb,SAAS,EACT,aAAa,EACb,MAAM,EACP,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAE,UAAU,IAAI,eAAe,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,KAAK,EACV,KAAK,EACL,OAAO,EACP,UAAU,EACV,WAAW,EACX,UAAU,EAEX,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAErE,OAAO,EAAE,WAAW,IAAI,YAAY,EAAE,MAAM,eAAe,CAAC;AAuB5D,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,WAAW,GAAG,YAAY,CAWvE;AAED,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,WAAW,EAC3C,aAAa,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,UAAU,EAC/C,IAAI,EAAE,UAAU,EAAE,EAClB,KAAK,CAAC,EAAE,MAAM,GACb,eAAe,EAAE,CA6BnB;AAED,wBAAgB,6BAA6B,CAC3C,oBAAoB,EAAE,cAAc,EAAE,GACrC,OAAO,EAAE,GAAG,IAAI,CAUlB;AAED,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,UAAU,EAClB,QAAQ,EAAE,MAAM,EAAE,EAClB,cAAc,EAAE,MAAM,EAAE,EACxB,mBAAmB,EAAE,OAAO,EAAE,GAAG,IAAI,EACrC,gBAAgB,EAAE,OAAO,GACxB,MAAM,EAAE,CAkFV;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,YA4B5D;AAID,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,MAAM,EACf,eAAe,EAAE,eAAe,WAOjC;AAED,wBAAgB,cAAc,CAC5B,gBAAgB,EAAE,YAAY,EAC9B,MAAM,EAAE,KAAK,EAAE,GACd,YAAY,EAAE,CAuBhB;AAED,wBAAgB,yBAAyB,CACvC,eAAe,EAAE,eAAe,GAC/B,eAAe,CAEjB;AAED,eAAO,MAAM,uBAAuB,oBAAqB,eAAe,EAAE,WAwCzE,CAAC;AAQF,eAAO,MAAM,WAAW,eACV,MAAM,UACV,MAAM,WACL,MAAM,GAAG,IAAI,aACX,KAAK,EAAE,KACjB,MAAM,GAAG,IAQX,CAAC;AACF,eAAO,MAAM,mBAAmB,gBACjB,cAAc,EAAE,UACrB,MAAM,KACb,OAUF,CAAC;AAEF,eAAO,MAAM,kCAAkC,sBAC1B,MAAM,EAAE,KAC1B,UAAU,EAUZ,CAAC;AAEF,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,GAAG,OAAO,GAAG,IAAI,CAkBrE;
|
|
1
|
+
{"version":3,"file":"wallets.d.ts","sourceRoot":"","sources":["../../src/utils/wallets.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export const MIN_LENGTH_SYMBOL_EXACT_MATCH = 1;
|
|
2
|
+
export const MIN_LENGTH_SYMBOL_START_WITH = 2;
|
|
3
|
+
export const MIN_LENGTH_SYMBOL_CONTAINS = 3;
|
|
4
|
+
export const MIN_LENGTH_TOKEN_NAME_EXACT_MATCH = 3;
|
|
5
|
+
export const MIN_LENGTH_TOKEN_NAME_CONTAINS = 3;
|
|
6
|
+
export const MIN_LENGTH_TOKEN_ADDRESS_CONTAINS = 4;
|
|
@@ -14,7 +14,6 @@ import { useNavigateBack } from '../hooks/useNavigateBack';
|
|
|
14
14
|
import { useAppStore } from '../store/AppStore';
|
|
15
15
|
import { useQuoteStore } from '../store/quote';
|
|
16
16
|
import { useWalletsStore } from '../store/wallets';
|
|
17
|
-
import { sortTokens } from '../utils/wallets';
|
|
18
17
|
|
|
19
18
|
interface PropTypes {
|
|
20
19
|
type: 'source' | 'destination';
|
|
@@ -34,7 +33,6 @@ export function SelectSwapItemsPage(props: PropTypes) {
|
|
|
34
33
|
} = useQuoteStore();
|
|
35
34
|
const getBalanceFor = useWalletsStore.use.getBalanceFor();
|
|
36
35
|
const [searchedFor, setSearchedFor] = useState<string>('');
|
|
37
|
-
const { isTokenPinned } = useAppStore();
|
|
38
36
|
|
|
39
37
|
const selectedBlockchain = type === 'source' ? fromBlockchain : toBlockchain;
|
|
40
38
|
const selectedBlockchainName = selectedBlockchain?.name ?? '';
|
|
@@ -47,12 +45,9 @@ export function SelectSwapItemsPage(props: PropTypes) {
|
|
|
47
45
|
type,
|
|
48
46
|
blockchain: selectedBlockchainName,
|
|
49
47
|
searchFor: searchedFor,
|
|
48
|
+
getBalanceFor: getBalanceFor,
|
|
50
49
|
});
|
|
51
50
|
|
|
52
|
-
const checkIsTokenPinned = (token: Token) => isTokenPinned(token, type);
|
|
53
|
-
|
|
54
|
-
const tokensList = sortTokens(tokens, getBalanceFor, checkIsTokenPinned);
|
|
55
|
-
|
|
56
51
|
const updateBlockchain = (blockchain: BlockchainMeta) => {
|
|
57
52
|
if (type === 'source') {
|
|
58
53
|
setFromBlockchain(blockchain);
|
|
@@ -101,7 +96,7 @@ export function SelectSwapItemsPage(props: PropTypes) {
|
|
|
101
96
|
/>
|
|
102
97
|
<Divider size={16} />
|
|
103
98
|
<TokenList
|
|
104
|
-
list={
|
|
99
|
+
list={tokens}
|
|
105
100
|
selectedBlockchain={selectedBlockchainName}
|
|
106
101
|
searchedFor={searchedFor}
|
|
107
102
|
type={type}
|
package/src/store/slices/data.ts
CHANGED
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
// We keep all the received data from server in this slice
|
|
2
2
|
|
|
3
3
|
import type { ConfigSlice } from './config';
|
|
4
|
+
import type { Balance } from '../../types';
|
|
4
5
|
import type { BlockchainMeta, SwapperMeta, Token } from 'rango-sdk';
|
|
5
6
|
import type { StateCreator } from 'zustand';
|
|
6
7
|
|
|
7
8
|
import { httpService as sdk } from '../../services/httpService';
|
|
8
|
-
import { containsText } from '../../utils/common';
|
|
9
|
+
import { compareWithSearchFor, containsText } from '../../utils/common';
|
|
9
10
|
import { isTokenExcludedInConfig } from '../../utils/configs';
|
|
11
|
+
import { isTokenNative } from '../../utils/meta';
|
|
10
12
|
import { sortLiquiditySourcesByGroupTitle } from '../../utils/settings';
|
|
11
|
-
import { areTokensEqual } from '../../utils/wallets';
|
|
13
|
+
import { areTokensEqual, compareTokenBalance } from '../../utils/wallets';
|
|
12
14
|
|
|
13
15
|
type BlockchainOptions = {
|
|
14
16
|
type?: 'source' | 'destination';
|
|
@@ -19,10 +21,12 @@ type TokenOptions = {
|
|
|
19
21
|
// filter by an specific blockchain
|
|
20
22
|
blockchain?: string;
|
|
21
23
|
searchFor?: string;
|
|
24
|
+
getBalanceFor?: (token: Token) => Balance | null;
|
|
22
25
|
};
|
|
26
|
+
|
|
23
27
|
export type FetchStatus = 'loading' | 'success' | 'failed';
|
|
24
28
|
export interface DataSlice {
|
|
25
|
-
|
|
29
|
+
_blockchainsMapByName: Map<string, BlockchainMeta>;
|
|
26
30
|
_tokens: Token[];
|
|
27
31
|
_popularTokens: Token[];
|
|
28
32
|
_swappers: SwapperMeta[];
|
|
@@ -31,7 +35,6 @@ export interface DataSlice {
|
|
|
31
35
|
tokens: (options?: TokenOptions) => Token[];
|
|
32
36
|
swappers: () => SwapperMeta[];
|
|
33
37
|
isTokenPinned: (token: Token, type: 'source' | 'destination') => boolean;
|
|
34
|
-
|
|
35
38
|
fetch: () => Promise<void>;
|
|
36
39
|
}
|
|
37
40
|
|
|
@@ -42,14 +45,17 @@ export const createDataSlice: StateCreator<
|
|
|
42
45
|
DataSlice
|
|
43
46
|
> = (set, get) => ({
|
|
44
47
|
// State
|
|
45
|
-
|
|
48
|
+
_blockchainsMapByName: new Map<string, BlockchainMeta>(),
|
|
46
49
|
_tokens: [],
|
|
47
50
|
_popularTokens: [],
|
|
48
51
|
_swappers: [],
|
|
49
52
|
fetchStatus: 'loading',
|
|
50
53
|
// Selectors
|
|
51
54
|
blockchains: (options) => {
|
|
52
|
-
const
|
|
55
|
+
const blockchainsMapByName = get()._blockchainsMapByName;
|
|
56
|
+
const blockchainsFromState = Array.from(
|
|
57
|
+
blockchainsMapByName?.values() || []
|
|
58
|
+
);
|
|
53
59
|
|
|
54
60
|
if (!options || !options?.type) {
|
|
55
61
|
return blockchainsFromState;
|
|
@@ -76,6 +82,7 @@ export const createDataSlice: StateCreator<
|
|
|
76
82
|
},
|
|
77
83
|
tokens: (options) => {
|
|
78
84
|
const tokensFromState = get()._tokens;
|
|
85
|
+
const blockchainsMapByName = get()._blockchainsMapByName;
|
|
79
86
|
|
|
80
87
|
if (!options || !options?.type) {
|
|
81
88
|
return tokensFromState;
|
|
@@ -127,29 +134,62 @@ export const createDataSlice: StateCreator<
|
|
|
127
134
|
|
|
128
135
|
return true;
|
|
129
136
|
})
|
|
130
|
-
.sort((
|
|
131
|
-
//
|
|
132
|
-
|
|
133
|
-
|
|
137
|
+
.sort((tokenA, tokenB) => {
|
|
138
|
+
//1. sort by pinned tokens
|
|
139
|
+
const isToken1Pinned = get().isTokenPinned(tokenA, options.type);
|
|
140
|
+
const isToken2Pinned = get().isTokenPinned(tokenB, options.type);
|
|
141
|
+
if (isToken1Pinned !== isToken2Pinned) {
|
|
142
|
+
return isToken1Pinned ? -1 : 1;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
//2. sort by balance
|
|
146
|
+
if (options.getBalanceFor) {
|
|
147
|
+
const token1Balance = options.getBalanceFor(tokenA);
|
|
148
|
+
const token2Balance = options.getBalanceFor(tokenB);
|
|
149
|
+
const balanceCompare = compareTokenBalance(
|
|
150
|
+
token1Balance,
|
|
151
|
+
token2Balance
|
|
152
|
+
);
|
|
153
|
+
if (balanceCompare !== 0) {
|
|
154
|
+
return balanceCompare;
|
|
155
|
+
}
|
|
134
156
|
}
|
|
135
|
-
|
|
136
|
-
|
|
157
|
+
|
|
158
|
+
//3. sort by token popularity
|
|
159
|
+
if (tokenA.isPopular !== tokenB.isPopular) {
|
|
160
|
+
return tokenA.isPopular ? -1 : 1;
|
|
137
161
|
}
|
|
138
162
|
|
|
139
|
-
//
|
|
140
|
-
if (
|
|
141
|
-
|
|
163
|
+
//4. sort by search phrase
|
|
164
|
+
if (options.searchFor) {
|
|
165
|
+
const symbolSearchForCompare = compareWithSearchFor(
|
|
166
|
+
tokenA,
|
|
167
|
+
tokenB,
|
|
168
|
+
options.searchFor
|
|
169
|
+
);
|
|
170
|
+
if (symbolSearchForCompare) {
|
|
171
|
+
return symbolSearchForCompare;
|
|
172
|
+
}
|
|
142
173
|
}
|
|
143
|
-
|
|
144
|
-
|
|
174
|
+
|
|
175
|
+
const blockChainA = blockchainsMapByName.get(tokenA.blockchain);
|
|
176
|
+
const blockChainB = blockchainsMapByName.get(tokenB.blockchain);
|
|
177
|
+
|
|
178
|
+
//5. sort by native token
|
|
179
|
+
const isNativeTokenA = isTokenNative(tokenA, blockChainA);
|
|
180
|
+
const isNativeTokenB = isTokenNative(tokenB, blockChainB);
|
|
181
|
+
if (isNativeTokenA !== isNativeTokenB) {
|
|
182
|
+
return isNativeTokenA ? -1 : 1;
|
|
145
183
|
}
|
|
146
184
|
|
|
147
|
-
//
|
|
148
|
-
if (
|
|
149
|
-
return -1;
|
|
185
|
+
//6. sort by token isSecondary
|
|
186
|
+
if (tokenA.isSecondaryCoin !== tokenB.isSecondaryCoin) {
|
|
187
|
+
return tokenA.isSecondaryCoin ? 1 : -1;
|
|
150
188
|
}
|
|
151
|
-
|
|
152
|
-
|
|
189
|
+
|
|
190
|
+
//7. sort by blockchain order
|
|
191
|
+
if (!!blockChainA && !!blockChainB) {
|
|
192
|
+
return blockChainA.sort - blockChainB.sort;
|
|
153
193
|
}
|
|
154
194
|
|
|
155
195
|
return 0;
|
|
@@ -213,7 +253,11 @@ export const createDataSlice: StateCreator<
|
|
|
213
253
|
});
|
|
214
254
|
|
|
215
255
|
set({ fetchStatus: 'success' });
|
|
216
|
-
const
|
|
256
|
+
const blockchainsMapByName: Map<string, BlockchainMeta> = new Map<
|
|
257
|
+
string,
|
|
258
|
+
BlockchainMeta
|
|
259
|
+
>();
|
|
260
|
+
|
|
217
261
|
const tokens: Token[] = [];
|
|
218
262
|
const popularTokens: Token[] = response.popularTokens;
|
|
219
263
|
const swappers: SwapperMeta[] = response.swappers;
|
|
@@ -226,20 +270,21 @@ export const createDataSlice: StateCreator<
|
|
|
226
270
|
tokens.push(token);
|
|
227
271
|
});
|
|
228
272
|
|
|
229
|
-
response.blockchains.
|
|
273
|
+
const sortedBlockchain = response.blockchains.sort(
|
|
274
|
+
(a, b) => a.sort - b.sort
|
|
275
|
+
);
|
|
276
|
+
|
|
277
|
+
sortedBlockchain.forEach((blockchain) => {
|
|
230
278
|
if (
|
|
231
279
|
blockchain.enabled &&
|
|
232
280
|
blockchainsWithAtLeastOneToken.has(blockchain.name)
|
|
233
281
|
) {
|
|
234
|
-
|
|
282
|
+
blockchainsMapByName.set(blockchain.name, blockchain);
|
|
235
283
|
}
|
|
236
284
|
});
|
|
237
285
|
|
|
238
|
-
// Sort
|
|
239
|
-
blockchains.sort((a, b) => a.sort - b.sort);
|
|
240
|
-
|
|
241
286
|
set({
|
|
242
|
-
|
|
287
|
+
_blockchainsMapByName: blockchainsMapByName,
|
|
243
288
|
_tokens: tokens,
|
|
244
289
|
_popularTokens: popularTokens,
|
|
245
290
|
_swappers: swappers,
|
package/src/utils/common.ts
CHANGED
|
@@ -1,4 +1,13 @@
|
|
|
1
|
+
import type { Token } from 'rango-sdk';
|
|
2
|
+
|
|
1
3
|
import { WIDGET_UI_ID } from '../constants';
|
|
4
|
+
import {
|
|
5
|
+
MIN_LENGTH_SYMBOL_CONTAINS,
|
|
6
|
+
MIN_LENGTH_SYMBOL_START_WITH,
|
|
7
|
+
MIN_LENGTH_TOKEN_ADDRESS_CONTAINS,
|
|
8
|
+
MIN_LENGTH_TOKEN_NAME_CONTAINS,
|
|
9
|
+
MIN_LENGTH_TOKEN_NAME_EXACT_MATCH,
|
|
10
|
+
} from '../constants/searchFor';
|
|
2
11
|
|
|
3
12
|
export function removeDuplicateFrom<T>(array: T[]): T[] {
|
|
4
13
|
return Array.from(new Set(array));
|
|
@@ -32,8 +41,180 @@ export function containsText(text: string, searchText: string): boolean {
|
|
|
32
41
|
return text.toLowerCase().indexOf(searchText.toLowerCase()) > -1;
|
|
33
42
|
}
|
|
34
43
|
|
|
44
|
+
export function exactText(text: string, searchText: string): boolean {
|
|
45
|
+
return text.toLowerCase() === searchText.toLowerCase();
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export function startWithText(text: string, searchText: string): boolean {
|
|
49
|
+
return text.toLowerCase().startsWith(searchText.toLowerCase());
|
|
50
|
+
}
|
|
51
|
+
|
|
35
52
|
export const getContainer = () =>
|
|
36
53
|
document.getElementById(WIDGET_UI_ID.SWAP_BOX_ID) as HTMLElement;
|
|
37
54
|
|
|
38
55
|
export const getExpanded = () =>
|
|
39
56
|
document.getElementById(WIDGET_UI_ID.EXPANDED_BOX_ID) as HTMLElement;
|
|
57
|
+
|
|
58
|
+
function compareExactMatchText(
|
|
59
|
+
searchFor: string,
|
|
60
|
+
textA: string | null,
|
|
61
|
+
textB: string | null
|
|
62
|
+
) {
|
|
63
|
+
const exactMatchA = !!textA && exactText(textA, searchFor);
|
|
64
|
+
const exactMatchB = !!textB && exactText(textB, searchFor);
|
|
65
|
+
if (exactMatchA !== exactMatchB) {
|
|
66
|
+
return exactMatchA ? -1 : 1;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
return 0;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function compareContainsText(
|
|
73
|
+
searchFor: string,
|
|
74
|
+
textA: string | null,
|
|
75
|
+
textB: string | null
|
|
76
|
+
) {
|
|
77
|
+
const textContainsA = !!textA && containsText(textA, searchFor);
|
|
78
|
+
const textContainsB = !!textB && containsText(textB, searchFor);
|
|
79
|
+
if (textContainsA !== textContainsB) {
|
|
80
|
+
return textContainsA ? -1 : 1;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// If both texts contains the searched term, The shorter one has priority
|
|
84
|
+
if (textContainsA && textContainsB && textA?.length !== textB?.length) {
|
|
85
|
+
return textA?.length - textB?.length;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
return 0;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function compareStartWithText(
|
|
92
|
+
searchFor: string,
|
|
93
|
+
textA: string | null,
|
|
94
|
+
textB: string | null
|
|
95
|
+
) {
|
|
96
|
+
const textStartWithA = !!textA && startWithText(textA, searchFor);
|
|
97
|
+
const textStartWithB = !!textB && startWithText(textB, searchFor);
|
|
98
|
+
if (textStartWithA !== textStartWithB) {
|
|
99
|
+
return textStartWithA ? -1 : 1;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// If both texts start with the searched term, The shorter one has priority
|
|
103
|
+
if (textStartWithA && textStartWithB && textA?.length !== textB?.length) {
|
|
104
|
+
return textA?.length - textB?.length;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
return 0;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
export function compareWithSearchFor(
|
|
111
|
+
tokenA: Token,
|
|
112
|
+
tokenB: Token,
|
|
113
|
+
searchFor?: string
|
|
114
|
+
): number {
|
|
115
|
+
if (!searchFor) {
|
|
116
|
+
return 0;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// 1: Check the order to exact match the symbol
|
|
120
|
+
const symbolExactMatchCompare = compareExactMatchText(
|
|
121
|
+
searchFor,
|
|
122
|
+
tokenA.symbol,
|
|
123
|
+
tokenB.symbol
|
|
124
|
+
);
|
|
125
|
+
if (symbolExactMatchCompare) {
|
|
126
|
+
return symbolExactMatchCompare;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// 2: Check the order to exact match the token name
|
|
130
|
+
if (searchFor.length >= MIN_LENGTH_TOKEN_NAME_EXACT_MATCH) {
|
|
131
|
+
const tokenNameExactMatchCompare = compareExactMatchText(
|
|
132
|
+
searchFor,
|
|
133
|
+
tokenA.name,
|
|
134
|
+
tokenB.name
|
|
135
|
+
);
|
|
136
|
+
if (tokenNameExactMatchCompare) {
|
|
137
|
+
return tokenNameExactMatchCompare;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// 3: Check symbol start with searchFor
|
|
142
|
+
if (searchFor.length >= MIN_LENGTH_SYMBOL_START_WITH) {
|
|
143
|
+
const symbolStartWithCompare = compareStartWithText(
|
|
144
|
+
searchFor,
|
|
145
|
+
tokenA.symbol,
|
|
146
|
+
tokenB.symbol
|
|
147
|
+
);
|
|
148
|
+
|
|
149
|
+
if (symbolStartWithCompare) {
|
|
150
|
+
return symbolStartWithCompare;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// 4: Check symbol Contains searchFor
|
|
155
|
+
if (searchFor.length >= MIN_LENGTH_SYMBOL_CONTAINS) {
|
|
156
|
+
const symbolContainsCompare = compareContainsText(
|
|
157
|
+
searchFor,
|
|
158
|
+
tokenA.symbol,
|
|
159
|
+
tokenB.symbol
|
|
160
|
+
);
|
|
161
|
+
|
|
162
|
+
if (symbolContainsCompare) {
|
|
163
|
+
return symbolContainsCompare;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// 5: Check token name start with searchFor
|
|
168
|
+
if (searchFor.length >= MIN_LENGTH_TOKEN_NAME_CONTAINS) {
|
|
169
|
+
const tokenNameStartWithCompare = compareStartWithText(
|
|
170
|
+
searchFor,
|
|
171
|
+
tokenA.name,
|
|
172
|
+
tokenB.name
|
|
173
|
+
);
|
|
174
|
+
|
|
175
|
+
if (tokenNameStartWithCompare) {
|
|
176
|
+
return tokenNameStartWithCompare;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// 6: Check token name Contains searchFor
|
|
181
|
+
if (searchFor.length >= MIN_LENGTH_TOKEN_NAME_CONTAINS) {
|
|
182
|
+
const tokenNameContainsCompare = compareContainsText(
|
|
183
|
+
searchFor,
|
|
184
|
+
tokenA.name,
|
|
185
|
+
tokenB.name
|
|
186
|
+
);
|
|
187
|
+
|
|
188
|
+
if (tokenNameContainsCompare !== 0) {
|
|
189
|
+
return tokenNameContainsCompare;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// 7: Check address start with searchFor
|
|
194
|
+
if (searchFor.length >= MIN_LENGTH_TOKEN_ADDRESS_CONTAINS) {
|
|
195
|
+
const addressStartWithCompare = compareStartWithText(
|
|
196
|
+
searchFor,
|
|
197
|
+
tokenA.address,
|
|
198
|
+
tokenB.address
|
|
199
|
+
);
|
|
200
|
+
|
|
201
|
+
if (addressStartWithCompare) {
|
|
202
|
+
return addressStartWithCompare;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
// 8: Check address Contains searchFor
|
|
207
|
+
if (searchFor.length >= MIN_LENGTH_TOKEN_ADDRESS_CONTAINS) {
|
|
208
|
+
const addressContainCompare = compareContainsText(
|
|
209
|
+
searchFor,
|
|
210
|
+
tokenA.address,
|
|
211
|
+
tokenB.address
|
|
212
|
+
);
|
|
213
|
+
|
|
214
|
+
if (addressContainCompare !== 0) {
|
|
215
|
+
return addressContainCompare;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
return 0;
|
|
220
|
+
}
|
package/src/utils/meta.ts
CHANGED
|
@@ -31,3 +31,24 @@ export function findToken(t: Asset, tokens: Token[]) {
|
|
|
31
31
|
export function findBlockchain(name: string, blockchains: BlockchainMeta[]) {
|
|
32
32
|
return blockchains.find((blockchain) => blockchain.name === name) ?? null;
|
|
33
33
|
}
|
|
34
|
+
|
|
35
|
+
export function isTokenNative(
|
|
36
|
+
token: Token,
|
|
37
|
+
blockchain: BlockchainMeta | undefined
|
|
38
|
+
) {
|
|
39
|
+
if (!blockchain || !token) {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
for (const feeAsset of blockchain.feeAssets) {
|
|
44
|
+
if (
|
|
45
|
+
token?.blockchain === feeAsset?.blockchain &&
|
|
46
|
+
token?.symbol === feeAsset?.symbol &&
|
|
47
|
+
token?.address === feeAsset?.address
|
|
48
|
+
) {
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
return false;
|
|
54
|
+
}
|
package/src/utils/wallets.ts
CHANGED
|
@@ -381,25 +381,18 @@ export function formatBalance(balance: Balance | null): Balance | null {
|
|
|
381
381
|
return formattedBalance;
|
|
382
382
|
}
|
|
383
383
|
|
|
384
|
-
function
|
|
384
|
+
export function compareTokenBalance(
|
|
385
385
|
token1Balance: Balance | null,
|
|
386
386
|
token2Balance: Balance | null
|
|
387
387
|
): number {
|
|
388
|
-
if (token1Balance?.usdValue
|
|
388
|
+
if (token1Balance?.usdValue || token2Balance?.usdValue) {
|
|
389
389
|
return (
|
|
390
|
-
parseFloat(token2Balance
|
|
390
|
+
parseFloat(token2Balance?.usdValue || '0') -
|
|
391
|
+
parseFloat(token1Balance?.usdValue || '0')
|
|
391
392
|
);
|
|
392
393
|
}
|
|
393
394
|
|
|
394
|
-
if (
|
|
395
|
-
return 1;
|
|
396
|
-
}
|
|
397
|
-
|
|
398
|
-
if (token1Balance?.usdValue && !token2Balance?.usdValue) {
|
|
399
|
-
return -1;
|
|
400
|
-
}
|
|
401
|
-
|
|
402
|
-
if (!token1Balance?.usdValue && !token2Balance?.usdValue) {
|
|
395
|
+
if (token1Balance?.amount || token2Balance?.amount) {
|
|
403
396
|
return (
|
|
404
397
|
parseFloat(token2Balance?.amount || '0') -
|
|
405
398
|
parseFloat(token1Balance?.amount || '0')
|
|
@@ -409,41 +402,6 @@ function sortTokensByBalance(
|
|
|
409
402
|
return 0;
|
|
410
403
|
}
|
|
411
404
|
|
|
412
|
-
function sortTokensByPinnedToken(
|
|
413
|
-
token1: Token,
|
|
414
|
-
token2: Token,
|
|
415
|
-
isTokenPinned: (token: Token) => boolean
|
|
416
|
-
): number {
|
|
417
|
-
const isToken1Pinned = isTokenPinned(token1);
|
|
418
|
-
const isToken2Pinned = isTokenPinned(token2);
|
|
419
|
-
|
|
420
|
-
if (isToken1Pinned === isToken2Pinned) {
|
|
421
|
-
return 0;
|
|
422
|
-
}
|
|
423
|
-
if (isToken1Pinned) {
|
|
424
|
-
return -1;
|
|
425
|
-
}
|
|
426
|
-
return 1;
|
|
427
|
-
}
|
|
428
|
-
export function sortTokens(
|
|
429
|
-
tokens: Token[],
|
|
430
|
-
getBalanceFor: (token: Token) => Balance | null,
|
|
431
|
-
isTokenPinned: (token: Token) => boolean
|
|
432
|
-
) {
|
|
433
|
-
tokens.sort((token1, token2) => {
|
|
434
|
-
const token1Balance = getBalanceFor(token1);
|
|
435
|
-
const token2Balance = getBalanceFor(token2);
|
|
436
|
-
// Check pinned tokens
|
|
437
|
-
const isTokenPin = sortTokensByPinnedToken(token1, token2, isTokenPinned);
|
|
438
|
-
|
|
439
|
-
return isTokenPin !== 0
|
|
440
|
-
? isTokenPin
|
|
441
|
-
: sortTokensByBalance(token1Balance, token2Balance);
|
|
442
|
-
});
|
|
443
|
-
|
|
444
|
-
return tokens;
|
|
445
|
-
}
|
|
446
|
-
|
|
447
405
|
export function areTokensEqual(
|
|
448
406
|
tokenA: Pick<Token, 'blockchain' | 'symbol' | 'address'> | null,
|
|
449
407
|
tokenB: Pick<Token, 'blockchain' | 'symbol' | 'address'> | null
|