focus search bar on focus screen

This commit is contained in:
austinried 2021-08-23 09:35:30 +09:00
parent ba22cc7604
commit c6dbe3e583
2 changed files with 43 additions and 13 deletions

View File

@ -1,18 +1,22 @@
import colors from '@app/styles/colors' import colors from '@app/styles/colors'
import font from '@app/styles/font' import font from '@app/styles/font'
import React from 'react' import React from 'react'
import { TextInput as ReactTextInput, StyleSheet, StyleProp, TextStyle, KeyboardTypeOptions } from 'react-native' import { TextInput as ReactTextInput, StyleSheet, KeyboardTypeOptions, StyleProp, TextStyle } from 'react-native'
const TextInput = React.memo<{ const TextInput = React.forwardRef<
style?: StyleProp<TextStyle> ReactTextInput,
value?: string {
placeholder?: string style?: StyleProp<TextStyle>
onChangeText?: (text: string) => void value?: string
onSubmitEditing?: () => void placeholder?: string
keyboardType?: KeyboardTypeOptions onChangeText?: (text: string) => void
}>(({ style, value, placeholder, onChangeText, onSubmitEditing, keyboardType }) => { onSubmitEditing?: () => void
keyboardType?: KeyboardTypeOptions
}
>(({ style, value, placeholder, onChangeText, onSubmitEditing, keyboardType }, ref) => {
return ( return (
<ReactTextInput <ReactTextInput
ref={ref}
style={[style, styles.textInput]} style={[style, styles.textInput]}
placeholder={placeholder} placeholder={placeholder}
placeholderTextColor="grey" placeholderTextColor="grey"

View File

@ -11,10 +11,17 @@ import { useStore } from '@app/state/store'
import { selectTrackPlayer } from '@app/state/trackplayer' import { selectTrackPlayer } from '@app/state/trackplayer'
import colors from '@app/styles/colors' import colors from '@app/styles/colors'
import font from '@app/styles/font' import font from '@app/styles/font'
import { useNavigation } from '@react-navigation/native' import { useFocusEffect, useNavigation } from '@react-navigation/native'
import debounce from 'lodash.debounce' import debounce from 'lodash.debounce'
import React, { useCallback, useMemo, useState } from 'react' import React, { useCallback, useMemo, useRef, useState } from 'react'
import { ActivityIndicator, StatusBar, StyleSheet, View } from 'react-native' import {
ActivityIndicator,
InteractionManager,
StatusBar,
StyleSheet,
TextInput as ReactTextInput,
View,
} from 'react-native'
const SongItem = React.memo<{ item: Song }>(({ item }) => { const SongItem = React.memo<{ item: Song }>(({ item }) => {
const setQueue = useStore(selectTrackPlayer.setQueue) const setQueue = useStore(selectTrackPlayer.setQueue)
@ -82,6 +89,19 @@ const Search = () => {
const [results, setResults] = useState<SearchResults>({ artists: [], albums: [], songs: [] }) const [results, setResults] = useState<SearchResults>({ artists: [], albums: [], songs: [] })
const [refreshing, setRefreshing] = useState(false) const [refreshing, setRefreshing] = useState(false)
const [text, setText] = useState('') const [text, setText] = useState('')
const searchBarRef = useRef<ReactTextInput>(null)
useFocusEffect(
useCallback(() => {
const task = InteractionManager.runAfterInteractions(() => {
setTimeout(() => {
setText('')
searchBarRef.current?.focus()
}, 50)
})
return () => task.cancel()
}, [searchBarRef]),
)
useActiveServerRefresh( useActiveServerRefresh(
useCallback(() => { useCallback(() => {
@ -114,7 +134,13 @@ const Search = () => {
<GradientScrollView style={styles.scroll} contentContainerStyle={styles.scrollContentContainer}> <GradientScrollView style={styles.scroll} contentContainerStyle={styles.scrollContentContainer}>
<View style={styles.content}> <View style={styles.content}>
<View style={styles.inputBar}> <View style={styles.inputBar}>
<TextInput style={styles.textInput} placeholder="Search" value={text} onChangeText={onChangeText} /> <TextInput
ref={searchBarRef}
style={styles.textInput}
placeholder="Search"
value={text}
onChangeText={onChangeText}
/>
<ActivityIndicator <ActivityIndicator
animating={refreshing} animating={refreshing}
size="small" size="small"