refactor(rn tester app): change appearence example to hooks (#35114)

Summary:
This pull request migrates the appearance example to using React Hooks.

## Changelog
[General] [Changed] - RNTester: Migrate Appearence to hooks

Pull Request resolved: https://github.com/facebook/react-native/pull/35114

Test Plan: The animation works exactly as it did as when it was a class component

Reviewed By: cortinico

Differential Revision: D41531005

Pulled By: cipolleschi

fbshipit-source-id: a864766a3bb58a7f0c2b9c4ed8f731ee84713b26
This commit is contained in:
Marco Fiorito 2022-11-28 04:42:51 -08:00 коммит произвёл Facebook GitHub Bot
Родитель 90871861ce
Коммит 22576fa615
1 изменённых файлов: 21 добавлений и 32 удалений

Просмотреть файл

@ -9,47 +9,36 @@
*/ */
import * as React from 'react'; import * as React from 'react';
import {useState, useEffect} from 'react';
import {Appearance, Text, useColorScheme, View} from 'react-native'; import {Appearance, Text, useColorScheme, View} from 'react-native';
import type {AppearancePreferences} from 'react-native/Libraries/Utilities/NativeAppearance'; import type {AppearancePreferences} from 'react-native/Libraries/Utilities/NativeAppearance';
import type {EventSubscription} from 'react-native/Libraries/vendor/emitter/EventEmitter';
import {RNTesterThemeContext, themes} from '../../components/RNTesterTheme'; import {RNTesterThemeContext, themes} from '../../components/RNTesterTheme';
class ColorSchemeSubscription extends React.Component< function ColorSchemeSubscription() {
{...}, const [colorScheme, setScheme] = useState(Appearance.getColorScheme());
{colorScheme: ?string, ...},
> {
_subscription: ?EventSubscription;
state: {colorScheme: ?string, ...} = { useEffect(() => {
colorScheme: Appearance.getColorScheme(), const subscription = Appearance.addChangeListener(
};
componentDidMount() {
this._subscription = Appearance.addChangeListener(
(preferences: AppearancePreferences) => { (preferences: AppearancePreferences) => {
const {colorScheme} = preferences; const {colorScheme: scheme} = preferences;
this.setState({colorScheme}); setScheme(scheme);
}, },
); );
}
componentWillUnmount() { return () => subscription?.remove();
this._subscription?.remove(); }, [setScheme]);
}
render(): React.Node { return (
return ( <RNTesterThemeContext.Consumer>
<RNTesterThemeContext.Consumer> {theme => {
{theme => { return (
return ( <ThemedContainer>
<ThemedContainer> <ThemedText>{colorScheme}</ThemedText>
<ThemedText>{this.state.colorScheme}</ThemedText> </ThemedContainer>
</ThemedContainer> );
); }}
}} </RNTesterThemeContext.Consumer>
</RNTesterThemeContext.Consumer> );
);
}
} }
const ThemedContainer = (props: {children: React.Node}) => ( const ThemedContainer = (props: {children: React.Node}) => (
@ -69,7 +58,7 @@ const ThemedContainer = (props: {children: React.Node}) => (
</RNTesterThemeContext.Consumer> </RNTesterThemeContext.Consumer>
); );
const ThemedText = (props: {children: React.Node}) => ( const ThemedText = (props: {children: React.Node | string}) => (
<RNTesterThemeContext.Consumer> <RNTesterThemeContext.Consumer>
{theme => { {theme => {
return <Text style={{color: theme.LabelColor}}>{props.children}</Text>; return <Text style={{color: theme.LabelColor}}>{props.children}</Text>;