import React, { useCallback, useRef, useState } from 'react'; import { View, Text, TouchableOpacity, TextInput, InteractionManager, } from 'react-native'; import ReusableModal, { ReusableModalRef } from '../../UI/ReusableModal'; import Icon from 'react-native-vector-icons/FontAwesome'; import { strings } from '../../../../locales/i18n'; import { createStyles } from './styles'; import { useAppThemeFromContext, mockTheme } from '../../../util/theme'; import UrlAutocomplete from '../../UI/UrlAutocomplete'; import { BROWSER_URL_MODAL_ID } from '../../../constants/test-ids'; import { createNavigationDetails, useParams, } from '../../../util/navigation/navUtils'; import Routes from '../../../constants/navigation/Routes'; import Device from '../../../util/device'; export interface BrowserUrlParams { onUrlInputSubmit: (inputValue: string | undefined) => void; url: string | undefined; } export const createBrowserUrlModalNavDetails = createNavigationDetails(Routes.BROWSER_URL_MODAL); const BrowserUrlModal = () => { const { onUrlInputSubmit, url } = useParams(); const modalRef = useRef(null); const { colors, themeAppearance } = useAppThemeFromContext() || mockTheme; const styles = createStyles(colors); const [autocompleteValue, setAutocompleteValue] = useState< string | undefined >(url); const inputRef = useRef(null); const dismissModal = useCallback( (callback?: () => void) => modalRef?.current?.dismissModal(callback), [], ); /** Clear search input and focus */ const clearSearchInput = useCallback(() => { setAutocompleteValue(undefined); inputRef.current?.focus?.(); }, []); InteractionManager.runAfterInteractions(() => { // Needed to focus the input after modal renders on Android inputRef.current?.focus?.(); // Needed to manually selectTextOnFocus on iOS // https://github.com/facebook/react-native/issues/30585 if (Device.isIos()) { if (inputRef.current && autocompleteValue) { inputRef.current.setNativeProps({ selection: { start: 0, end: autocompleteValue.length }, }); } } }); const triggerClose = useCallback(() => dismissModal(), [dismissModal]); const triggerOnSubmit = useCallback( (val: string) => dismissModal(() => onUrlInputSubmit(val)), [dismissModal, onUrlInputSubmit], ); const renderContent = () => ( <> triggerOnSubmit(autocompleteValue || '')} placeholder={strings('autocomplete.placeholder')} placeholderTextColor={colors.text.muted} returnKeyType="go" style={styles.urlInput} value={autocompleteValue} selectTextOnFocus keyboardAppearance={themeAppearance} autoFocus /> {autocompleteValue ? ( ) : null} {strings('browser.cancel')} ); return ( {renderContent()} ); }; export default React.memo(BrowserUrlModal);