Fix slow re-renders when toggling content languages (#10128)

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Samuel Newman
2026-04-21 15:16:26 -07:00
committed by GitHub
parent 07344f70fc
commit abe0ca521d
+24 -7
View File
@@ -34,6 +34,23 @@ export function LanguageSettingsScreen({}: Props) {
const langPrefs = useLanguagePrefs()
const setLangPrefs = useLanguagePrefsApi()
// changing langPrefs causes a slow re-render, so we use a local state copy
// and update that first to drive the UI on this screen to keep it snappy
const [contentLanguages, _setContentLanguages] = useState(
langPrefs.contentLanguages,
)
const setContentLanguages = useCallback(
(languages: string[]) => {
_setContentLanguages(languages)
// TODO: try using startTransition/useOptimistic when we switch to New Arch
// Old arch doesn't support concurrent react features so use rAF instead
requestAnimationFrame(() => {
setLangPrefs.setContentLanguages(languages)
})
},
[setLangPrefs],
)
const contentLanguagePrefsControl = useDialogControl()
const onChangePrimaryLanguage = useCallback(
@@ -64,13 +81,13 @@ export function LanguageSettingsScreen({}: Props) {
return [
...new Set([
...recentLanguages,
...langPrefs.contentLanguages,
...contentLanguages,
...langPrefs.primaryLanguage,
]),
]
.map(lang => LANGUAGES.find(l => l.code2 === lang))
.filter(x => !!x)
}, [recentLanguages, langPrefs.contentLanguages, langPrefs.primaryLanguage])
}, [recentLanguages, contentLanguages, langPrefs.primaryLanguage])
return (
<Layout.Screen testID="PreferencesLanguagesScreen">
@@ -167,7 +184,7 @@ export function LanguageSettingsScreen({}: Props) {
</Trans>
</Text>
{langPrefs.contentLanguages.length === 0 && (
{contentLanguages.length === 0 && (
<Admonition type="info">
<Trans>All languages will be shown in your feeds.</Trans>
</Admonition>
@@ -176,8 +193,8 @@ export function LanguageSettingsScreen({}: Props) {
<View style={[a.w_full, web({maxWidth: 400})]}>
<Toggle.Group
label={_(msg`Select content languages`)}
values={langPrefs.contentLanguages}
onChange={setLangPrefs.setContentLanguages}>
values={contentLanguages}
onChange={setContentLanguages}>
<Toggle.PanelGroup>
{possibleLanguages.map((language, index) => {
const name = languageName(language, langPrefs.appLanguage)
@@ -220,9 +237,9 @@ export function LanguageSettingsScreen({}: Props) {
feeds.
</Trans>
}
currentLanguages={langPrefs.contentLanguages}
currentLanguages={contentLanguages}
onSelectLanguages={languages => {
setLangPrefs.setContentLanguages(languages)
setContentLanguages(languages)
setRecentLanguages(recent => [
...new Set([...recent, ...languages]),
])