diff --git a/fastlane/metadata/en-US/release_notes.txt b/fastlane/metadata/en-US/release_notes.txt index da253fd48..862623d26 100644 --- a/fastlane/metadata/en-US/release_notes.txt +++ b/fastlane/metadata/en-US/release_notes.txt @@ -1,2 +1 @@ Enjoy toooting! This version includes following improvements and fixes: -- Added Belarusian language \ No newline at end of file diff --git a/fastlane/metadata/zh-Hans/release_notes.txt b/fastlane/metadata/zh-Hans/release_notes.txt index 81692af79..d9488dcd6 100644 --- a/fastlane/metadata/zh-Hans/release_notes.txt +++ b/fastlane/metadata/zh-Hans/release_notes.txt @@ -1,2 +1 @@ toooting愉快!此版本包括以下改进和修复: -- 新增白俄罗斯语 \ No newline at end of file diff --git a/package.json b/package.json index a8e87ab30..3efbe8d8d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "tooot", - "version": "4.9.1", + "version": "4.9.2", "description": "tooot for Mastodon", "author": "xmflsct ", "license": "GPL-3.0-or-later", diff --git a/src/screens/index.tsx b/src/screens/index.tsx index d79488ac1..9632fc180 100644 --- a/src/screens/index.tsx +++ b/src/screens/index.tsx @@ -7,6 +7,7 @@ import ScreenAnnouncements from '@screens/Announcements' import ScreenCompose from '@screens/Compose' import ScreenImagesViewer from '@screens/ImageViewer' import ScreenTabs from '@screens/Tabs' +import { useLinking } from '@utils/linking' import navigationRef from '@utils/navigation/navigationRef' import { RootStackParamList } from '@utils/navigation/navigators' import pushUseConnect from '@utils/push/useConnect' @@ -78,32 +79,8 @@ const Screens: React.FC = () => { } } - // 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.length) { - if (accountActive && !accounts?.includes(accountActive)) { - setAccount(accountActive) - } - } - } - - if (initialUrl.hostname === 'compose') { - navigationRef.navigate('Screen-Compose') - } - } - if (!deeplinked) { - getUrlAsync() - } - }, [accounts, accountActive, deeplinked]) + // Deep linking + useLinking() // Share Extension const handleShare = ( diff --git a/src/utils/linking/index.ts b/src/utils/linking/index.ts new file mode 100644 index 000000000..8d39898b6 --- /dev/null +++ b/src/utils/linking/index.ts @@ -0,0 +1,41 @@ +import openLink from '@components/openLink' +import navigationRef from '@utils/navigation/navigationRef' +import { getReadableAccounts, setAccount } from '@utils/storage/actions' +import * as Linking from 'expo-linking' +import { useEffect } from 'react' + +// /compose OR /compose/@username@example.com + +export const useLinking = () => { + const parseLink = async (link: string) => { + const parsed = Linking.parse(link) + + switch (parsed.scheme) { + case 'tooot': + if (parsed.hostname === 'compose') { + if (parsed.path?.length) { + const accounts = getReadableAccounts() + const foundNotActiveAccount = accounts.find( + account => account.acct === parsed.path && !account.active + ) + if (foundNotActiveAccount) { + await setAccount(foundNotActiveAccount.key) + } + } + navigationRef.navigate('Screen-Compose') + } + break + case 'https': + case 'http': + await openLink(link) + break + } + } + + useEffect(() => { + Linking.getInitialURL().then(parseLink) + + const listener = Linking.addEventListener('url', ({ url }) => parseLink(url)) + return () => listener.remove() + }, []) +}