import Button from '@components/Button' import Icon from '@components/Icon' import browserPackage from '@helpers/browserPackage' import { useAppsQuery } from '@utils/queryHooks/apps' import { useInstanceQuery } from '@utils/queryHooks/instance' import { getInstances } from '@utils/slices/instancesSlice' import { StyleConstants } from '@utils/styles/constants' import { useTheme } from '@utils/styles/ThemeManager' import * as WebBrowser from 'expo-web-browser' import { debounce } from 'lodash' import React, { RefObject, useCallback, useMemo, useState } from 'react' import { Trans, useTranslation } from 'react-i18next' import { Alert, Image, KeyboardAvoidingView, Platform, TextInput, View } from 'react-native' import { ScrollView } from 'react-native-gesture-handler' import { useSelector } from 'react-redux' import { Placeholder } from 'rn-placeholder' import InstanceAuth from './Instance/Auth' import InstanceInfo from './Instance/Info' import CustomText from './Text' export interface Props { scrollViewRef?: RefObject disableHeaderImage?: boolean goBack?: boolean } const ComponentInstance: React.FC = ({ scrollViewRef, disableHeaderImage, goBack = false }) => { const { t } = useTranslation('componentInstance') const { colors, mode } = useTheme() const instances = useSelector(getInstances, () => true) const [domain, setDomain] = useState() const instanceQuery = useInstanceQuery({ domain, options: { enabled: !!domain, retry: false } }) const appsQuery = useAppsQuery({ domain, options: { enabled: false, retry: false } }) const onChangeText = useCallback( debounce( text => { setDomain(text.replace(/^http(s)?\:\/\//i, '')) appsQuery.remove() }, 1000, { trailing: true } ), [] ) const processUpdate = useCallback(() => { if (domain) { if (instances && instances.filter(instance => instance.url === domain).length) { Alert.alert(t('update.alert.title'), t('update.alert.message'), [ { text: t('common:buttons.cancel'), style: 'cancel' }, { text: t('common:buttons.continue'), onPress: () => { appsQuery.refetch() } } ]) } else { appsQuery.refetch() } } }, [domain]) const requestAuth = useMemo(() => { if ( domain && instanceQuery.data?.uri && appsQuery.data?.client_id && appsQuery.data.client_secret ) { return ( ) } }, [domain, instanceQuery.data, appsQuery.data]) return ( {!disableHeaderImage ? ( ) : null} { if ( text === domain && instanceQuery.isSuccess && instanceQuery.data && instanceQuery.data.uri ) { processUpdate() } }} placeholder={' ' + t('server.textInput.placeholder')} placeholderTextColor={colors.secondary} returnKeyType='go' keyboardAppearance={mode} {...(scrollViewRef && { onFocus: () => setTimeout(() => scrollViewRef.current?.scrollTo({ y: 0, animated: true }), 150) })} autoCorrect={false} spellCheck={false} />