Handle multiple languages
This commit is contained in:
@@ -208,11 +208,10 @@ export const ComposePost = ({
|
|||||||
>(null)
|
>(null)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The language of the post being replied to, if any. We just use the first
|
* The language(s) of the post being replied to.
|
||||||
* language available, for now.
|
|
||||||
*/
|
*/
|
||||||
const [replyToLanguage, setReplyToLanguage] = useState<string | undefined>(
|
const [replyToLanguages, setReplyToLanguages] = useState<string[]>(
|
||||||
replyTo?.langs?.[0],
|
replyTo?.langs || [],
|
||||||
)
|
)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -234,7 +233,7 @@ export const ComposePost = ({
|
|||||||
*/
|
*/
|
||||||
const onSelectLanguage = () => {
|
const onSelectLanguage = () => {
|
||||||
setAcceptedLanguageSuggestion(null)
|
setAcceptedLanguageSuggestion(null)
|
||||||
setReplyToLanguage(undefined)
|
setReplyToLanguages([])
|
||||||
}
|
}
|
||||||
|
|
||||||
const [composerState, composerDispatch] = useReducer(
|
const [composerState, composerDispatch] = useReducer(
|
||||||
@@ -694,7 +693,7 @@ export const ComposePost = ({
|
|||||||
<>
|
<>
|
||||||
<SuggestedLanguage
|
<SuggestedLanguage
|
||||||
text={activePost.richtext.text}
|
text={activePost.richtext.text}
|
||||||
replyToLanguage={replyToLanguage}
|
replyToLanguages={replyToLanguages}
|
||||||
currentLanguages={currentLanguages}
|
currentLanguages={currentLanguages}
|
||||||
onAcceptSuggestedLanguage={setAcceptedLanguageSuggestion}
|
onAcceptSuggestedLanguage={setAcceptedLanguageSuggestion}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -18,17 +18,30 @@ const cancelIdle = globalThis.cancelIdleCallback || clearTimeout
|
|||||||
|
|
||||||
export function SuggestedLanguage({
|
export function SuggestedLanguage({
|
||||||
text,
|
text,
|
||||||
replyToLanguage: replyToLanguageProp,
|
replyToLanguages: replyToLanguagesProp,
|
||||||
currentLanguages,
|
currentLanguages,
|
||||||
onAcceptSuggestedLanguage,
|
onAcceptSuggestedLanguage,
|
||||||
}: {
|
}: {
|
||||||
text: string
|
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[]
|
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
|
onAcceptSuggestedLanguage: (language: string | null) => void
|
||||||
}) {
|
}) {
|
||||||
const langPrefs = useLanguagePrefs()
|
const langPrefs = useLanguagePrefs()
|
||||||
const replyToLanguage = cleanUpLanguage(replyToLanguageProp)
|
const replyToLanguages = replyToLanguagesProp
|
||||||
|
.map(lang => cleanUpLanguage(lang))
|
||||||
|
.filter(Boolean) as string[]
|
||||||
const [hasInteracted, setHasInteracted] = useState(false)
|
const [hasInteracted, setHasInteracted] = useState(false)
|
||||||
const [suggestedLanguage, setSuggestedLanguage] = useState<
|
const [suggestedLanguage, setSuggestedLanguage] = useState<
|
||||||
string | undefined
|
string | undefined
|
||||||
@@ -63,14 +76,15 @@ export function SuggestedLanguage({
|
|||||||
const hasLanguageSuggestion =
|
const hasLanguageSuggestion =
|
||||||
suggestedLanguage && !currentLanguages.includes(suggestedLanguage)
|
suggestedLanguage && !currentLanguages.includes(suggestedLanguage)
|
||||||
/*
|
/*
|
||||||
* We have not detected a different language, and the user has not already
|
* We have not detected a different language, and the user is not already
|
||||||
* selected the language of the post they are replying to.
|
* using or has not already selected one of the languages of the post they
|
||||||
|
* are replying to.
|
||||||
*/
|
*/
|
||||||
const hasSuggestedReplyLanguage =
|
const hasSuggestedReplyLanguage =
|
||||||
!hasInteracted &&
|
!hasInteracted &&
|
||||||
!suggestedLanguage &&
|
!suggestedLanguage &&
|
||||||
replyToLanguage &&
|
replyToLanguages.length &&
|
||||||
!currentLanguages.includes(replyToLanguage)
|
!replyToLanguages.some(l => currentLanguages.includes(l))
|
||||||
|
|
||||||
if (hasLanguageSuggestion) {
|
if (hasLanguageSuggestion) {
|
||||||
const suggestedLanguageName = codeToLanguageName(
|
const suggestedLanguageName = codeToLanguageName(
|
||||||
@@ -94,7 +108,7 @@ export function SuggestedLanguage({
|
|||||||
)
|
)
|
||||||
} else if (hasSuggestedReplyLanguage) {
|
} else if (hasSuggestedReplyLanguage) {
|
||||||
const suggestedLanguageName = codeToLanguageName(
|
const suggestedLanguageName = codeToLanguageName(
|
||||||
replyToLanguage,
|
replyToLanguages[0],
|
||||||
langPrefs.appLanguage,
|
langPrefs.appLanguage,
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -109,7 +123,7 @@ export function SuggestedLanguage({
|
|||||||
</Trans>
|
</Trans>
|
||||||
</RNText>
|
</RNText>
|
||||||
}
|
}
|
||||||
value={replyToLanguage}
|
value={replyToLanguages[0]}
|
||||||
onAccept={onAcceptSuggestedLanguage}
|
onAccept={onAcceptSuggestedLanguage}
|
||||||
/>
|
/>
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user