From af177b0dad0a738baf88aa3eec90e709ea0aa0e6 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Wed, 1 Oct 2025 18:02:39 -0500 Subject: [PATCH] Handle multiple languages --- src/view/com/composer/Composer.tsx | 11 +++---- .../select-language/SuggestedLanguage.tsx | 32 +++++++++++++------ 2 files changed, 28 insertions(+), 15 deletions(-) diff --git a/src/view/com/composer/Composer.tsx b/src/view/com/composer/Composer.tsx index 3139eb98f8..8cbb2d37ba 100644 --- a/src/view/com/composer/Composer.tsx +++ b/src/view/com/composer/Composer.tsx @@ -208,11 +208,10 @@ export const ComposePost = ({ >(null) /** - * The language of the post being replied to, if any. We just use the first - * language available, for now. + * The language(s) of the post being replied to. */ - const [replyToLanguage, setReplyToLanguage] = useState( - replyTo?.langs?.[0], + const [replyToLanguages, setReplyToLanguages] = useState( + replyTo?.langs || [], ) /** @@ -234,7 +233,7 @@ export const ComposePost = ({ */ const onSelectLanguage = () => { setAcceptedLanguageSuggestion(null) - setReplyToLanguage(undefined) + setReplyToLanguages([]) } const [composerState, composerDispatch] = useReducer( @@ -694,7 +693,7 @@ export const ComposePost = ({ <> diff --git a/src/view/com/composer/select-language/SuggestedLanguage.tsx b/src/view/com/composer/select-language/SuggestedLanguage.tsx index f5619cee99..82e8ebd30b 100644 --- a/src/view/com/composer/select-language/SuggestedLanguage.tsx +++ b/src/view/com/composer/select-language/SuggestedLanguage.tsx @@ -18,17 +18,30 @@ const cancelIdle = globalThis.cancelIdleCallback || clearTimeout export function SuggestedLanguage({ text, - replyToLanguage: replyToLanguageProp, + replyToLanguages: replyToLanguagesProp, currentLanguages, onAcceptSuggestedLanguage, }: { text: string - replyToLanguage?: string + /** + * All languages associated with the post being replied to. + */ + replyToLanguages: string[] + /** + * All languages currently selected for the post being composed. + */ currentLanguages: string[] + /** + * Called when the user accepts a suggested language. We only pass a single + * language here. If the post being replied to has multiple languages, we + * only suggest the first one. + */ onAcceptSuggestedLanguage: (language: string | null) => void }) { const langPrefs = useLanguagePrefs() - const replyToLanguage = cleanUpLanguage(replyToLanguageProp) + const replyToLanguages = replyToLanguagesProp + .map(lang => cleanUpLanguage(lang)) + .filter(Boolean) as string[] const [hasInteracted, setHasInteracted] = useState(false) const [suggestedLanguage, setSuggestedLanguage] = useState< string | undefined @@ -63,14 +76,15 @@ export function SuggestedLanguage({ const hasLanguageSuggestion = suggestedLanguage && !currentLanguages.includes(suggestedLanguage) /* - * We have not detected a different language, and the user has not already - * selected the language of the post they are replying to. + * We have not detected a different language, and the user is not already + * using or has not already selected one of the languages of the post they + * are replying to. */ const hasSuggestedReplyLanguage = !hasInteracted && !suggestedLanguage && - replyToLanguage && - !currentLanguages.includes(replyToLanguage) + replyToLanguages.length && + !replyToLanguages.some(l => currentLanguages.includes(l)) if (hasLanguageSuggestion) { const suggestedLanguageName = codeToLanguageName( @@ -94,7 +108,7 @@ export function SuggestedLanguage({ ) } else if (hasSuggestedReplyLanguage) { const suggestedLanguageName = codeToLanguageName( - replyToLanguage, + replyToLanguages[0], langPrefs.appLanguage, ) @@ -109,7 +123,7 @@ export function SuggestedLanguage({ } - value={replyToLanguage} + value={replyToLanguages[0]} onAccept={onAcceptSuggestedLanguage} /> )