diff --git a/packages/rn-tester/js/examples/Appearance/AppearanceExample.js b/packages/rn-tester/js/examples/Appearance/AppearanceExample.js index 9272c6ab6c..e330ae2954 100644 --- a/packages/rn-tester/js/examples/Appearance/AppearanceExample.js +++ b/packages/rn-tester/js/examples/Appearance/AppearanceExample.js @@ -9,47 +9,36 @@ */ import * as React from 'react'; +import {useState, useEffect} from 'react'; import {Appearance, Text, useColorScheme, View} from 'react-native'; 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'; -class ColorSchemeSubscription extends React.Component< - {...}, - {colorScheme: ?string, ...}, -> { - _subscription: ?EventSubscription; +function ColorSchemeSubscription() { + const [colorScheme, setScheme] = useState(Appearance.getColorScheme()); - state: {colorScheme: ?string, ...} = { - colorScheme: Appearance.getColorScheme(), - }; - - componentDidMount() { - this._subscription = Appearance.addChangeListener( + useEffect(() => { + const subscription = Appearance.addChangeListener( (preferences: AppearancePreferences) => { - const {colorScheme} = preferences; - this.setState({colorScheme}); + const {colorScheme: scheme} = preferences; + setScheme(scheme); }, ); - } - componentWillUnmount() { - this._subscription?.remove(); - } + return () => subscription?.remove(); + }, [setScheme]); - render(): React.Node { - return ( - - {theme => { - return ( - - {this.state.colorScheme} - - ); - }} - - ); - } + return ( + + {theme => { + return ( + + {colorScheme} + + ); + }} + + ); } const ThemedContainer = (props: {children: React.Node}) => ( @@ -69,7 +58,7 @@ const ThemedContainer = (props: {children: React.Node}) => ( ); -const ThemedText = (props: {children: React.Node}) => ( +const ThemedText = (props: {children: React.Node | string}) => ( {theme => { return {props.children};