import Button from '@components/Button' import Icon from '@components/Icon' 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, { useCallback, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import { Alert, Image, KeyboardAvoidingView, Platform, StyleSheet, Text, TextInput, View } from 'react-native' import { useSelector } from 'react-redux' import { Placeholder } from 'rn-placeholder' import analytics from './analytics' import InstanceAuth from './Instance/Auth' import InstanceInfo from './Instance/Info' export interface Props { disableHeaderImage?: boolean goBack?: boolean } const ComponentInstance: React.FC = ({ disableHeaderImage, goBack = false }) => { const { t } = useTranslation('componentInstance') const { mode, theme } = 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) { analytics('instance_login') if ( instances && instances.filter(instance => instance.url === domain).length ) { Alert.alert(t('update.alert.title'), t('update.alert.message'), [ { text: t('update.alert.buttons.cancel'), style: 'cancel' }, { text: t('update.alert.buttons.continue'), onPress: () => { appsQuery.refetch() } } ]) } else { appsQuery.refetch() } } }, [domain]) const onSubmitEditing = useCallback( ({ nativeEvent: { text } }) => { analytics('instance_textinput_submit', { match: text === domain }) if ( text === domain && instanceQuery.isSuccess && instanceQuery.data && instanceQuery.data.uri ) { processUpdate() } }, [domain, instanceQuery.isSuccess, instanceQuery.data] ) 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}