import Button from '@components/Button' import haptics from '@components/haptics' import Icon from '@components/Icon' import { useNavigation } from '@react-navigation/native' import hookApps from '@utils/queryHooks/apps' import hookInstance from '@utils/queryHooks/instance' import { QueryKeyTimeline } from '@utils/queryHooks/timeline' import { getLocalInstances, InstanceLocal, remoteUpdate } from '@utils/slices/instancesSlice' import { StyleConstants } from '@utils/styles/constants' import { useTheme } from '@utils/styles/ThemeManager' import { debounce } from 'lodash' import React, { useCallback, useEffect, 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 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 navigation = useNavigation() const dispatch = useDispatch() const queryClient = useQueryClient() const { t } = useTranslation('meRoot') const { theme } = useTheme() const [instanceDomain, setInstanceDomain] = useState() const [appData, setApplicationData] = useState() const localInstances = useSelector(getLocalInstances) const instanceQuery = hookInstance({ instanceDomain, options: { enabled: false, retry: false } }) const applicationQuery = hookApps({ instanceDomain, options: { enabled: false, retry: false } }) useEffect(() => { if ( applicationQuery.data?.client_id.length && applicationQuery.data?.client_secret.length ) { setApplicationData({ clientId: applicationQuery.data.client_id, clientSecret: applicationQuery.data.client_secret }) } }, [applicationQuery.data?.client_id]) const onChangeText = useCallback( debounce( text => { setInstanceDomain(text.replace(/^http(s)?\:\/\//i, '')) setApplicationData(undefined) }, 1000, { trailing: true } ), [] ) useEffect(() => { if (instanceDomain) { instanceQuery.refetch() } }, [instanceDomain]) const processUpdate = useCallback(() => { if (instanceDomain) { switch (type) { case 'local': if ( localInstances && localInstances.filter(instance => instance.url === instanceDomain) .length ) { Alert.alert( '域名已存在', '可以登录同个域名的另外一个账户,现有账户🈚️用', [ { text: '取消', style: 'cancel' }, { text: '继续', onPress: () => { applicationQuery.refetch() } } ] ) } else { applicationQuery.refetch() } break case 'remote': haptics('Success') const queryKey: QueryKeyTimeline = [ 'Timeline', { page: 'RemotePublic' } ] dispatch(remoteUpdate(instanceDomain)) queryClient.resetQueries(queryKey) toast({ type: 'success', message: '重置成功' }) navigation.navigate('Screen-Public', { screen: 'Screen-Public-Root' }) break } } }, [instanceDomain]) const onSubmitEditing = useCallback( ({ nativeEvent: { text } }) => { if ( text === instanceDomain && instanceQuery.isSuccess && instanceQuery.data && instanceQuery.data.uri ) { processUpdate() } else { setInstanceDomain(text) setApplicationData(undefined) } }, [instanceDomain, instanceQuery.isSuccess, instanceQuery.data] ) const buttonContent = useMemo(() => { switch (type) { case 'local': return t('content.login.button') case 'remote': return '登记' } }, []) return ( <> {!disableHeaderImage ? ( ) : null}