Refine UX for on-device translation for posts (#9987)

Co-authored-by: Samuel Newman <mozzius@protonmail.com>
Co-authored-by: Eric Bailey <git@esb.lol>
This commit is contained in:
DS Boyce
2026-03-04 18:37:44 -08:00
committed by GitHub
parent 1782a65174
commit afbade6f6f
25 changed files with 1014 additions and 1639 deletions
+61
View File
@@ -0,0 +1,61 @@
import {useCallback} from 'react'
import * as IntentLauncher from 'expo-intent-launcher'
import {useOpenLink} from '#/lib/hooks/useOpenLink'
import {getTranslatorLink} from '#/locale/helpers'
import {IS_ANDROID} from '#/env'
/**
* @deprecated Will always link out to Google Translate. Prefer `useTranslate`.
*/
export function useGoogleTranslate() {
const openLink = useOpenLink()
return useCallback(
async (text: string, targetLangCode: string, sourceLanguage?: string) => {
const translateUrl = getTranslatorLink(
text,
targetLangCode,
sourceLanguage,
)
if (IS_ANDROID) {
try {
// use `getApplicationIconAsync` to determine if the translate app is installed
if (
!(await IntentLauncher.getApplicationIconAsync(
'com.google.android.apps.translate',
))
) {
throw new Error('Translate app not installed')
}
// TODO: this should only be called one at a time, use something like
// RQ's `scope` - otherwise can trigger the browser to open unexpectedly when the call throws -sfn
await IntentLauncher.startActivityAsync(
'android.intent.action.PROCESS_TEXT',
{
type: 'text/plain',
extra: {
'android.intent.extra.PROCESS_TEXT': text,
'android.intent.extra.PROCESS_TEXT_READONLY': true,
},
// note: to skip the intermediate app select, we need to specify a
// `className`. however, this isn't safe to hardcode, we'd need to query the
// package manager for the correct activity. this requires native code, so
// skip for now -sfn
// packageName: 'com.google.android.apps.translate',
// className: 'com.google.android.apps.translate.TranslateActivity',
},
)
} catch (err) {
if (__DEV__) console.error(err)
// most likely means they don't have the translate app
await openLink(translateUrl)
}
} else {
await openLink(translateUrl)
}
},
[openLink],
)
}