import {matchSorter} from 'match-sorter'; import React, { ComponentProps, useEffect, useMemo, useRef, useState, } from 'react'; import {Pressable, ScrollView, Text, TextInput, View} from 'react-native'; import Icon from 'react-native-vector-icons/MaterialIcons'; import {AppMenu} from '../components/AppMenu'; import {useInstalledApps} from '../hooks/useInstalledApps'; import {useStableCallback} from '../hooks/useStableCallback'; import {TouchableHighlight} from 'react-native-gesture-handler'; const AppListItem: React.FC> = React.memo( ({app, ...props}) => { return ( {app.label} {app.packageName} ); }, ); export const AppList: React.FC<{active: boolean}> = React.memo(({active}) => { const {apps} = useInstalledApps(); const textInputRef = useRef(null); const [searchText, setSearchText] = useState(''); const focusInput = useStableCallback(() => { if (active) TextInput.State.focusTextInput(textInputRef.current ?? undefined); }); const clearSearchInput = useStableCallback(() => { setSearchText(''); focusInput(); }); const filteredApps = useMemo(() => { if (searchText === '') return apps; return matchSorter(apps, searchText, {keys: ['label', 'packageName']}); }, [apps, searchText]); // Autofocus when active useEffect(() => { active && focusInput(); }, [active, focusInput]); return ( {filteredApps.map((app, index) => ( ))} ); });