import { DrawerContentScrollView } from '@react-navigation/drawer'; import { NavigationProp, ParamListBase, useIsFocused } from '@react-navigation/native'; import React, { memo, useCallback, useEffect, useMemo, useReducer, useRef } from 'react'; import { FlatList, InteractionManager, LayoutAnimation, StyleSheet, ViewStyle } from 'react-native'; import triggerHapticFeedback, { HapticFeedbackTypes } from '../../blue_modules/hapticFeedback'; import { TWallet } from '../../class/wallets/types'; import { Header } from '../../components/Header'; import { useTheme } from '../../components/themes'; import WalletsCarousel from '../../components/WalletsCarousel'; import loc from '../../loc'; import { useStorage } from '../../hooks/context/useStorage'; enum WalletActionType { SetWallets = 'SET_WALLETS', SelectWallet = 'SELECT_WALLET', SetFocus = 'SET_FOCUS', Navigate = 'NAVIGATE', } interface WalletState { wallets: TWallet[]; isFocused: boolean; } interface SelectWalletAction { type: WalletActionType.SelectWallet; walletID: string; walletType: string; } interface SelectWalletAction { type: WalletActionType.SelectWallet; walletID: string; } interface NavigateAction { type: WalletActionType.Navigate; screen: string; params: { [key: string]: any }; } interface SetFocusAction { type: WalletActionType.SetFocus; isFocused: boolean; } interface SetWalletsAction { type: WalletActionType.SetWallets; wallets: TWallet[]; } interface SelectWalletAction { type: WalletActionType.SelectWallet; walletID: string; } type WalletAction = SetWalletsAction | SelectWalletAction | SetFocusAction | NavigateAction; interface DrawerListProps { navigation: NavigationProp; } const walletReducer = (state: WalletState, action: WalletAction): WalletState => { switch (action.type) { case WalletActionType.SetWallets: { return { ...state, wallets: action.wallets, }; } case WalletActionType.SetFocus: { return { ...state, isFocused: action.isFocused }; } default: return state; } }; const DrawerList: React.FC = memo(({ navigation }) => { const initialState: WalletState = { wallets: [], isFocused: false, }; const [state, dispatch] = useReducer(walletReducer, initialState); const walletsCarousel = useRef>(null); const { wallets, selectedWalletID } = useStorage(); const { colors } = useTheme(); const isFocused = useIsFocused(); const stylesHook = useMemo( () => StyleSheet.create({ root: { backgroundColor: colors.elevated } as ViewStyle, }), [colors.elevated], ); useEffect(() => { LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut); dispatch({ type: WalletActionType.SetWallets, wallets }); dispatch({ type: WalletActionType.SetFocus, isFocused }); }, [wallets, isFocused]); const handleClick = useCallback( (item: TWallet) => { if (item?.getID) { const walletID = item.getID(); const walletType = item.type; LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut); dispatch({ type: WalletActionType.SelectWallet, walletID, walletType }); InteractionManager.runAfterInteractions(() => { navigation.navigate({ name: 'WalletTransactions', params: { walletID, walletType }, }); }); } else { navigation.navigate('AddWalletRoot'); } }, [navigation], ); const handleLongPress = useCallback(() => { if (state.wallets.length > 1) { navigation.navigate('ReorderWallets'); } else { triggerHapticFeedback(HapticFeedbackTypes.NotificationError); } }, [state.wallets.length, navigation]); const onNewWalletPress = useCallback(() => { navigation.navigate('AddWalletRoot'); }, [navigation]); return (
); }); export default DrawerList;