Skip to content

Commit bb1f9a4

Browse files
committed
feat: add hooks and store for tokenSelector
1 parent 2a3893a commit bb1f9a4

File tree

7 files changed

+207
-0
lines changed

7 files changed

+207
-0
lines changed

src/hooks/swap/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export { default as useGetBalances } from './useGetBalances';
2+
export { default as useSearchToken } from './useSearchToken';

src/hooks/swap/useGetBalances.tsx

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
import { Token } from '@/interfaces';
2+
import { useBaseAssetStore } from '@/store/baseAssetsStore';
3+
import { fetchBalance } from '@wagmi/core';
4+
import { useEffect, useState } from 'react';
5+
import { useAccount } from 'wagmi';
6+
7+
//* Returns 2 lists of tokens with their balance
8+
//* tokenList -> whole list
9+
//* fixedTokens -> banner/fav tokens
10+
11+
const useGetBalances = () => {
12+
const { baseAssets: tempBaseAssets } = useBaseAssetStore(state => state);
13+
const baseAssets = tempBaseAssets;
14+
15+
const { address, isConnected, status } = useAccount();
16+
const [tokenList, setTokenList] = useState<Token[]>();
17+
const [fixedTokens, setFixedTokens] = useState<Token[]>();
18+
19+
useEffect(() => {
20+
if (isConnected) {
21+
const getBalances = async () => {
22+
let localList = await Promise.all(
23+
baseAssets.map(async (token: Token) => {
24+
return await fetchBalance({
25+
address: address!,
26+
token: token.address,
27+
})
28+
.then(r => {
29+
token.balance = r.formatted;
30+
token.balanceWei = r.value.toString();
31+
return token;
32+
})
33+
.catch(e => {
34+
token.balance = '0';
35+
return token;
36+
});
37+
})
38+
);
39+
localList = localList
40+
.sort((a, b) => Number(b.balance) - Number(a.balance))
41+
.map(token => {
42+
token.balance = token.balance;
43+
44+
return token;
45+
});
46+
setTokenList(localList);
47+
setFixedTokens(
48+
localList.filter(
49+
token =>
50+
token.symbol === 'USDT'
51+
)
52+
);
53+
};
54+
55+
getBalances();
56+
} else {
57+
let localList = baseAssets;
58+
setTokenList(localList);
59+
setFixedTokens(
60+
baseAssets.filter(
61+
token =>
62+
token.symbol === 'USDT'
63+
)
64+
);
65+
}
66+
}, [status, baseAssets]);
67+
68+
return { tokenList, fixedTokens };
69+
};
70+
71+
export default useGetBalances;

src/hooks/swap/useSearchToken.tsx

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import { Token } from '@/interfaces';
2+
import { useBaseAssetStore } from '@/store/baseAssetsStore';
3+
import { useState, useEffect } from 'react';
4+
5+
//* Applies search functionality to the token lists
6+
//* Returns: filteredTokens<Token[]> and setSearch
7+
8+
const useSearchToken = () => {
9+
const { baseAssets: tempBaseAssets } = useBaseAssetStore(state => state);
10+
const baseAssets = tempBaseAssets;
11+
12+
const [filteredTokens, setFilteredTokens] = useState<Token[]>([]);
13+
const [search, setSearch] = useState('');
14+
15+
useEffect(() => {
16+
let ft = getFilteredTokens(search);
17+
setFilteredTokens(ft);
18+
}, [search]);
19+
const getFilteredTokens = (searchStr: string) => {
20+
let ft = baseAssets.filter(token => {
21+
if (searchStr && searchStr !== '') {
22+
return (
23+
token.address.toLowerCase().includes(searchStr.toLowerCase()) ||
24+
token.symbol.toLowerCase().includes(searchStr.toLowerCase()) ||
25+
token.name.toLowerCase().includes(searchStr.toLowerCase())
26+
);
27+
} else {
28+
return token;
29+
}
30+
});
31+
ft = ft
32+
.sort((a, b) => Number(b.balance) - Number(a.balance))
33+
.map(token => {
34+
token.balance = token.balance;
35+
return token;
36+
});
37+
return ft;
38+
39+
}
40+
return { filteredTokens, search, getFilteredTokens, setSearch };
41+
};
42+
43+
export default useSearchToken;

src/interfaces/Token.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
export interface Token {
2+
price: number | string;
3+
stable: boolean;
4+
address: `0x${string}`;
5+
name: string;
6+
symbol: string;
7+
decimals: number | string;
8+
logoURI: string;
9+
liquidStakedAddress: string;
10+
balance: number | string;
11+
balanceWei?: string;
12+
}

src/interfaces/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export * from './Token';

src/store/baseAssetsStore.ts

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import { CONTRACTS } from '@/config';
2+
import { Token } from '@/interfaces';
3+
import { mapToken } from '@/utils/interfaceMaps';
4+
import axios from 'axios';
5+
import { create } from 'zustand';
6+
import { devtools } from 'zustand/middleware';
7+
8+
interface BaseAssetState {
9+
baseAssets: Token[];
10+
isLoading: boolean;
11+
actions: {
12+
initBaseAssets: () => void;
13+
getBaseAsset: (address: string) => Token | undefined;
14+
setBaseAsset: (token: Token) => void;
15+
};
16+
}
17+
const BASE_URL = process.env.NEXT_PUBLIC_API ?? 'https://localhost:8000';
18+
19+
export const useBaseAssetStore = create<BaseAssetState>()(
20+
devtools((set, get) => ({
21+
baseAssets: [],
22+
isLoading: false,
23+
actions: {
24+
initBaseAssets: async () => {
25+
set({ isLoading: true });
26+
await axios
27+
.get(BASE_URL.concat('/assets'))
28+
.then(response => {
29+
let baseAssets = response.data.data;
30+
baseAssets = mapToken(baseAssets);
31+
32+
set({ baseAssets });
33+
})
34+
.catch(error => console.log(error));
35+
set({ isLoading: false });
36+
},
37+
getBaseAsset: (address: string) => {
38+
const { baseAssets } = get();
39+
return baseAssets.find(
40+
(token: Token) =>
41+
token.address.toLowerCase() === address.toLowerCase()
42+
);
43+
},
44+
setBaseAsset: (token: Token) => {
45+
const { baseAssets } = get();
46+
const index = baseAssets.findIndex(
47+
(t: Token) => t.address.toLowerCase() === token.address.toLowerCase()
48+
);
49+
if (index >= 0) {
50+
baseAssets[index] = token;
51+
console.log('setBaseAsset', token);
52+
set({ baseAssets });
53+
}
54+
},
55+
},
56+
}))
57+
);

src/utils/interfaceMaps.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { Token } from '@/interfaces';
2+
3+
export const mapToken = (token: any): Token | Token[] => {
4+
const mapping = (t: any) =>
5+
<Token>{
6+
address: t.address,
7+
decimals: t.decimals,
8+
name: t.name,
9+
symbol: t.symbol,
10+
logoURI: t.logoURI,
11+
stable: t.stable,
12+
price: t.price,
13+
liquidStakedAddress: t.liquid_staked_address,
14+
balance: 0.0,
15+
};
16+
if (Array.isArray(token)) {
17+
return token.map(x => mapping(x));
18+
} else {
19+
return mapping(token);
20+
}
21+
};

0 commit comments

Comments
 (0)