Improve logic in composer
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
import {useEffect, useState} from 'react'
|
import {useEffect, useState} from 'react'
|
||||||
import {View} from 'react-native'
|
import {Text as RNText, View} from 'react-native'
|
||||||
import {parseLanguage} from '@atproto/api'
|
import {parseLanguage} from '@atproto/api'
|
||||||
import {msg, Trans} from '@lingui/macro'
|
import {msg, Trans} from '@lingui/macro'
|
||||||
import {useLingui} from '@lingui/react'
|
import {useLingui} from '@lingui/react'
|
||||||
@@ -27,22 +27,20 @@ export function SuggestedLanguage({
|
|||||||
currentLanguages: string[]
|
currentLanguages: string[]
|
||||||
onAcceptSuggestedLanguage: (language: string | null) => void
|
onAcceptSuggestedLanguage: (language: string | null) => void
|
||||||
}) {
|
}) {
|
||||||
|
const langPrefs = useLanguagePrefs()
|
||||||
const replyToLanguage = cleanUpLanguage(replyToLanguageProp)
|
const replyToLanguage = cleanUpLanguage(replyToLanguageProp)
|
||||||
|
const [hasInteracted, setHasInteracted] = useState(false)
|
||||||
const [suggestedLanguage, setSuggestedLanguage] = useState<
|
const [suggestedLanguage, setSuggestedLanguage] = useState<
|
||||||
string | undefined
|
string | undefined
|
||||||
>(text.length === 0 ? replyToLanguage : undefined)
|
>(undefined)
|
||||||
const langPrefs = useLanguagePrefs()
|
|
||||||
const t = useTheme()
|
|
||||||
const {_} = useLingui()
|
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
// For replies, suggest the language of the post being replied to if no text
|
if (text.length > 0 && !hasInteracted) {
|
||||||
// has been typed yet
|
setHasInteracted(true)
|
||||||
if (replyToLanguage && text.length === 0) {
|
|
||||||
setSuggestedLanguage(replyToLanguage)
|
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
}, [text, hasInteracted])
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
const textTrimmed = text.trim()
|
const textTrimmed = text.trim()
|
||||||
|
|
||||||
// Don't run the language model on small posts, the results are likely
|
// Don't run the language model on small posts, the results are likely
|
||||||
@@ -57,52 +55,121 @@ export function SuggestedLanguage({
|
|||||||
})
|
})
|
||||||
|
|
||||||
return () => cancelIdle(idle)
|
return () => cancelIdle(idle)
|
||||||
}, [text, replyToLanguage])
|
}, [text])
|
||||||
|
|
||||||
if (suggestedLanguage && !currentLanguages.includes(suggestedLanguage)) {
|
/*
|
||||||
|
* We've detected a language, and the user hasn't already selected it.
|
||||||
|
*/
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
const hasSuggestedReplyLanguage =
|
||||||
|
!hasInteracted &&
|
||||||
|
!suggestedLanguage &&
|
||||||
|
replyToLanguage &&
|
||||||
|
!currentLanguages.includes(replyToLanguage)
|
||||||
|
|
||||||
|
if (hasLanguageSuggestion) {
|
||||||
const suggestedLanguageName = codeToLanguageName(
|
const suggestedLanguageName = codeToLanguageName(
|
||||||
suggestedLanguage,
|
suggestedLanguage,
|
||||||
langPrefs.appLanguage,
|
langPrefs.appLanguage,
|
||||||
)
|
)
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
<LanguageSuggestionButton
|
||||||
|
label={
|
||||||
|
<RNText>
|
||||||
|
<Trans>
|
||||||
|
Are you writing in{' '}
|
||||||
|
<Text style={[a.font_bold]}>{suggestedLanguageName}</Text>?
|
||||||
|
</Trans>
|
||||||
|
</RNText>
|
||||||
|
}
|
||||||
|
value={suggestedLanguage}
|
||||||
|
onAccept={onAcceptSuggestedLanguage}
|
||||||
|
/>
|
||||||
|
)
|
||||||
|
} else if (hasSuggestedReplyLanguage) {
|
||||||
|
const suggestedLanguageName = codeToLanguageName(
|
||||||
|
replyToLanguage,
|
||||||
|
langPrefs.appLanguage,
|
||||||
|
)
|
||||||
|
|
||||||
|
return (
|
||||||
|
<LanguageSuggestionButton
|
||||||
|
label={
|
||||||
|
<RNText>
|
||||||
|
<Trans>
|
||||||
|
The post you're replying to is written in {suggestedLanguageName}.
|
||||||
|
Would you like to reply in{' '}
|
||||||
|
<Text style={[a.font_bold]}>{suggestedLanguageName}</Text>?
|
||||||
|
</Trans>
|
||||||
|
</RNText>
|
||||||
|
}
|
||||||
|
value={replyToLanguage}
|
||||||
|
onAccept={onAcceptSuggestedLanguage}
|
||||||
|
/>
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function LanguageSuggestionButton({
|
||||||
|
label,
|
||||||
|
value,
|
||||||
|
onAccept,
|
||||||
|
}: {
|
||||||
|
label: React.ReactNode
|
||||||
|
value: string
|
||||||
|
onAccept: (language: string | null) => void
|
||||||
|
}) {
|
||||||
|
const t = useTheme()
|
||||||
|
const {_} = useLingui()
|
||||||
|
|
||||||
|
return (
|
||||||
|
<View style={[a.px_lg, a.py_sm]}>
|
||||||
<View
|
<View
|
||||||
style={[
|
style={[
|
||||||
t.atoms.border_contrast_low,
|
a.gap_md,
|
||||||
a.gap_sm,
|
|
||||||
a.border,
|
a.border,
|
||||||
a.flex_row,
|
a.flex_row,
|
||||||
a.align_center,
|
a.align_center,
|
||||||
a.rounded_sm,
|
a.rounded_sm,
|
||||||
a.px_lg,
|
a.p_md,
|
||||||
a.py_md,
|
a.pl_lg,
|
||||||
a.mx_md,
|
|
||||||
a.my_sm,
|
|
||||||
t.atoms.bg,
|
t.atoms.bg,
|
||||||
|
t.atoms.border_contrast_low,
|
||||||
]}>
|
]}>
|
||||||
<EarthIcon />
|
<EarthIcon />
|
||||||
<Text style={[a.flex_1]}>
|
<View style={[a.flex_1]}>
|
||||||
<Trans>
|
<Text
|
||||||
Are you writing in{' '}
|
style={[
|
||||||
<Text style={[a.font_bold]}>{suggestedLanguageName}</Text>?
|
a.flex_1,
|
||||||
</Trans>
|
a.leading_snug,
|
||||||
</Text>
|
{
|
||||||
|
maxWidth: 400,
|
||||||
|
},
|
||||||
|
]}>
|
||||||
|
{label}
|
||||||
|
</Text>
|
||||||
|
</View>
|
||||||
|
|
||||||
<Button
|
<Button
|
||||||
color="secondary"
|
|
||||||
size="small"
|
size="small"
|
||||||
variant="solid"
|
color="secondary"
|
||||||
onPress={() => onAcceptSuggestedLanguage(suggestedLanguage)}
|
onPress={() => onAccept(value)}
|
||||||
label={_(msg`Change post language to ${suggestedLanguageName}`)}>
|
label={_(msg`Accept this language suggestion`)}>
|
||||||
<ButtonText>
|
<ButtonText>
|
||||||
<Trans>Yes</Trans>
|
<Trans>Yes</Trans>
|
||||||
</ButtonText>
|
</ButtonText>
|
||||||
</Button>
|
</Button>
|
||||||
</View>
|
</View>
|
||||||
)
|
</View>
|
||||||
} else {
|
)
|
||||||
return null
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user