diff --git a/app.config.ts b/app.config.ts index 7bf2ad1f..6a93b58a 100644 --- a/app.config.ts +++ b/app.config.ts @@ -8,6 +8,7 @@ export default (): ExpoConfig => ({ name: 'tooot', description: 'tooot for Mastodon', slug: 'tooot', + scheme: 'tooot', version: toootVersion, privacy: 'hidden', assetBundlePatterns: ['assets/*'], diff --git a/src/Screens.tsx b/src/Screens.tsx index 9b6bf5a8..5ea6f42a 100644 --- a/src/Screens.tsx +++ b/src/Screens.tsx @@ -17,12 +17,17 @@ import { updatePreviousTab } from '@utils/slices/contextsSlice' import { updateAccountPreferences } from '@utils/slices/instances/updateAccountPreferences' import { updateConfiguration } from '@utils/slices/instances/updateConfiguration' import { updateFilters } from '@utils/slices/instances/updateFilters' -import { getInstanceActive, getInstances } from '@utils/slices/instancesSlice' +import { + getInstanceActive, + getInstances, + updateInstanceActive +} from '@utils/slices/instancesSlice' import { useTheme } from '@utils/styles/ThemeManager' import { themes } from '@utils/styles/themes' import * as Analytics from 'expo-firebase-analytics' +import * as Linking from 'expo-linking' import { addScreenshotListener } from 'expo-screen-capture' -import React, { useCallback, useEffect, useRef } from 'react' +import React, { useCallback, useEffect, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import { Alert, Platform, StatusBar } from 'react-native' import { useQueryClient } from 'react-query' @@ -144,6 +149,37 @@ const Screens: React.FC = ({ localCorrupt }) => { routeRef.current = currentRoute }, []) + // Deep linking for compose + const [deeplinked, setDeeplinked] = useState(false) + useEffect(() => { + const getUrlAsync = async () => { + setDeeplinked(true) + + const initialUrl = await Linking.parseInitialURLAsync() + + if (initialUrl.path) { + const paths = initialUrl.path.split('/') + + if (paths && paths.length) { + const instanceIndex = instances.findIndex( + instance => paths[0] === `@${instance.account.acct}@${instance.uri}` + ) + if (instanceIndex !== -1 && instanceActive !== instanceIndex) { + dispatch(updateInstanceActive(instances[instanceIndex])) + queryClient.clear() + } + } + } + + if (initialUrl.hostname === 'compose') { + navigationRef.navigate('Screen-Compose') + } + } + if (!deeplinked) { + getUrlAsync() + } + }, [instanceActive, instances, deeplinked]) + return ( <> { onPress: () => { if (notificationIndex !== -1) { dispatch(updateInstanceActive(instances[notificationIndex])) + queryClient.clear() } pushUseNavigate(payloadData.notification_id) } diff --git a/src/utils/push/useRespond.ts b/src/utils/push/useRespond.ts index 4c2dc65e..bd62791c 100644 --- a/src/utils/push/useRespond.ts +++ b/src/utils/push/useRespond.ts @@ -36,6 +36,7 @@ const pushUseRespond = ({ queryClient, instances, dispatch }: Params) => { ) if (notificationIndex !== -1) { dispatch(updateInstanceActive(instances[notificationIndex])) + queryClient.clear() } pushUseNavigate(payloadData.notification_id) }