Skip to content

Commit 0d56d26

Browse files
committed
Add token search functionality
1 parent dea32f1 commit 0d56d26

File tree

5 files changed

+65
-11
lines changed

5 files changed

+65
-11
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import Asset from '@/types/Asset';
2+
3+
const ASSETS: Asset[] = [
4+
{ name: 'USD Coin', symbol: 'USDC' },
5+
{ name: 'Penumbra', symbol: 'UM' },
6+
{ name: 'Cosmo', symbol: 'ATOM' },
7+
{ name: 'Ethereum', symbol: 'ETH' },
8+
{ name: 'Osmosis', symbol: 'OSMO' },
9+
];
10+
11+
export default ASSETS;

react-native-expo/components/ProfileScreen/DefaultPaymentTokenScreen/index.tsx

+6-11
Original file line numberDiff line numberDiff line change
@@ -3,35 +3,30 @@ import List from '@/components/List';
33
import ListItem from '@/components/ListItem';
44
import ListItemIconSuffix from '@/components/ListItemIconSuffix';
55
import TextInput from '@/components/TextInput';
6+
import { setSearchText } from '@/store/defaultPaymentTokenScreen';
67
import { useAppDispatch, useAppSelector } from '@/store/hooks';
78
import { setDefaultPaymentToken } from '@/store/secureStore';
8-
import Asset from '@/types/Asset';
99
import { Trans } from '@lingui/react/macro';
1010
import { Sx, Text, View } from 'dripsy';
1111
import { Check } from 'lucide-react-native';
12-
13-
const ASSETS: Asset[] = [
14-
{ name: 'USD Coin', symbol: 'USDC' },
15-
{ name: 'Penumbra', symbol: 'UM' },
16-
{ name: 'Cosmo', symbol: 'ATOM' },
17-
{ name: 'Ethereum', symbol: 'ETH' },
18-
{ name: 'Osmosis', symbol: 'OSMO' },
19-
];
12+
import useFilteredAssets from './useFilteredAssets';
2013

2114
export default function DefaultPaymentTokenScreen() {
2215
const defaultPaymentToken = useAppSelector(state => state.secureStore.defaultPaymentToken);
2316
const dispatch = useAppDispatch();
17+
const searchText = useAppSelector(state => state.defaultPaymentTokenScreen.searchText);
18+
const filteredAssets = useFilteredAssets();
2419

2520
return (
2621
<View sx={sx.root}>
2722
<Text variant='h4'>
2823
<Trans>Default payment token</Trans>
2924
</Text>
3025

31-
<TextInput />
26+
<TextInput value={searchText} onChangeText={text => dispatch(setSearchText(text))} />
3227

3328
<List>
34-
{ASSETS.map(asset => (
29+
{filteredAssets.map(asset => (
3530
<ListItem
3631
key={asset.symbol}
3732
avatar={<AssetIcon />}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { useAppSelector } from '@/store/hooks';
2+
import ASSETS from './assets';
3+
import { useMemo } from 'react';
4+
5+
export default function useFilteredAssets() {
6+
const searchText = useAppSelector(state => state.defaultPaymentTokenScreen.searchText);
7+
8+
const filteredTokens = useMemo(
9+
() =>
10+
ASSETS.filter(asset => {
11+
const searchTextLowerCase = searchText.toLocaleLowerCase();
12+
13+
if (asset.name.toLocaleLowerCase().includes(searchTextLowerCase)) return true;
14+
if (asset.symbol.toLocaleLowerCase().includes(searchTextLowerCase)) return true;
15+
16+
return false;
17+
}),
18+
[searchText],
19+
);
20+
21+
return filteredTokens;
22+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import { createSlice, PayloadAction } from '@reduxjs/toolkit';
2+
3+
/** State specific to `DefaultPaymentTokenScreen`. */
4+
export interface DefaultPaymentTokenScreenState {
5+
searchText: string;
6+
}
7+
8+
const initialState: DefaultPaymentTokenScreenState = {
9+
searchText: '',
10+
};
11+
12+
export const defaultPaymentTokenScreenSlice = createSlice({
13+
name: 'portfolioScreen',
14+
initialState,
15+
reducers: {
16+
setSearchText: (state, action: PayloadAction<string>) => {
17+
state.searchText = action.payload;
18+
},
19+
},
20+
});
21+
22+
export const { setSearchText } = defaultPaymentTokenScreenSlice.actions;
23+
24+
export default defaultPaymentTokenScreenSlice.reducer;

react-native-expo/store/rootReducer.ts

+2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { combineReducers } from '@reduxjs/toolkit';
22

33
import balances from './balances';
4+
import defaultPaymentTokenScreen from './defaultPaymentTokenScreen';
45
import depositFlow from './depositFlow';
56
import portfolioScreen from './portfolioScreen';
67
import secureStore from './secureStore';
@@ -14,6 +15,7 @@ import transactions from './transactions';
1415
*/
1516
const rootReducer = combineReducers({
1617
balances,
18+
defaultPaymentTokenScreen,
1719
depositFlow,
1820
portfolioScreen,
1921
secureStore,

0 commit comments

Comments
 (0)