import Button from '@components/Button' import haptics from '@components/haptics' import Icon from '@components/Icon' import { useNavigation } from '@react-navigation/native' import { useAppsQuery } from '@utils/queryHooks/apps' import { useInstanceQuery } from '@utils/queryHooks/instance' import { QueryKeyTimeline } from '@utils/queryHooks/timeline' import { getLocalInstances, remoteUpdate } from '@utils/slices/instancesSlice' import { StyleConstants } from '@utils/styles/constants' import { useTheme } from '@utils/styles/ThemeManager' import * as Linking from 'expo-linking' import { debounce } from 'lodash' import React, { useCallback, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import { Alert, Image, StyleSheet, Text, TextInput, View } from 'react-native' import { useQueryClient } from 'react-query' import { useDispatch, useSelector } from 'react-redux' import { Placeholder, Fade } from 'rn-placeholder' import analytics from './analytics' import InstanceAuth from './Instance/Auth' import InstanceInfo from './Instance/Info' import { toast } from './toast' export interface Props { type: 'local' | 'remote' disableHeaderImage?: boolean goBack?: boolean } const ComponentInstance: React.FC = ({ type, disableHeaderImage, goBack = false }) => { const { t } = useTranslation('componentInstance') const { theme } = useTheme() const navigation = useNavigation() const localInstances = useSelector(getLocalInstances) const dispatch = useDispatch() const queryClient = useQueryClient() const [instanceDomain, setInstanceDomain] = useState() const instanceQuery = useInstanceQuery({ instanceDomain, checkPublic: type === 'remote', options: { enabled: false, retry: false } }) const appsQuery = useAppsQuery({ instanceDomain, options: { enabled: false, retry: false } }) const onChangeText = useCallback( debounce( text => { setInstanceDomain(text.replace(/^http(s)?\:\/\//i, '')) appsQuery.remove() if (text) { instanceQuery.refetch() } }, 1000, { trailing: true } ), [] ) const processUpdate = useCallback(() => { if (instanceDomain) { switch (type) { case 'local': analytics('instance_local_login') if ( localInstances && localInstances.filter(instance => instance.url === instanceDomain) .length ) { Alert.alert( t('update.local.alert.title'), t('update.local.alert.message'), [ { text: t('update.local.alert.buttons.cancel'), style: 'cancel' }, { text: t('update.local.alert.buttons.continue'), onPress: () => { appsQuery.refetch() } } ] ) } else { appsQuery.refetch() } break case 'remote': analytics('instance_remote_register') haptics('Success') const queryKey: QueryKeyTimeline = [ 'Timeline', { page: 'RemotePublic' } ] dispatch(remoteUpdate(instanceDomain)) queryClient.resetQueries(queryKey) toast({ type: 'success', message: t('update.remote.succeed') }) navigation.goBack() break } } }, [instanceDomain]) const onSubmitEditing = useCallback( ({ nativeEvent: { text } }) => { analytics('instance_textinput_submit', { match: text === instanceDomain }) if ( text === instanceDomain && instanceQuery.isSuccess && instanceQuery.data && instanceQuery.data.uri ) { processUpdate() } }, [instanceDomain, instanceQuery.isSuccess, instanceQuery.data] ) const buttonContent = useMemo(() => { switch (type) { case 'local': return t('server.button.local') case 'remote': return t('server.button.remote') } }, []) const requestAuth = useMemo(() => { if ( instanceDomain && instanceQuery.data?.uri && appsQuery.data?.client_id && appsQuery.data.client_secret ) { return ( ) } }, [instanceDomain, instanceQuery.data, appsQuery.data]) return ( <> {!disableHeaderImage ? ( ) : null}