From 377c2f5d88210c988ae7a5ef92f3f67ff40c003c Mon Sep 17 00:00:00 2001 From: Jesse Watts-Russell Date: Fri, 3 May 2024 22:15:29 -0700 Subject: [PATCH] Allow custom override to utilize KeyWindow for default fallback colorScheme (#44383) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/44383 This diff allows the default fallback style to be grabbed from KeyWindow. Previously with the TraitCollections being passed in from overridden views it was not getting the accurate system fallback. We need this for Twilight, which is adopting a Light/Dark mode toggle. Previously when setColorScheme was getting called it would modify overrideUserInterfaceStyle and that would serve as the "default fallback" for future setColorScheme calls. setColorScheme shouldn't be setting the defaults, it should be setting the user-session theme preference. Changelog: [Internal] [Changed] - Added option for treating the KeyWindows's userInterfaceStyle as the source of truth for the system's dark/light mode. Differential Revision: D56868862 fbshipit-source-id: 229894947baed65ef15cece5bece120e8497462f --- .../react-native/React/CoreModules/RCTAppearance.h | 1 + .../react-native/React/CoreModules/RCTAppearance.mm | 11 +++++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/packages/react-native/React/CoreModules/RCTAppearance.h b/packages/react-native/React/CoreModules/RCTAppearance.h index 9909ca9e741..177ac433a12 100644 --- a/packages/react-native/React/CoreModules/RCTAppearance.h +++ b/packages/react-native/React/CoreModules/RCTAppearance.h @@ -13,6 +13,7 @@ RCT_EXTERN void RCTEnableAppearancePreference(BOOL enabled); RCT_EXTERN void RCTOverrideAppearancePreference(NSString *const); +RCT_EXTERN void RCTUseKeyWindowForSystemStyle(BOOL useMainScreen); RCT_EXTERN NSString *RCTCurrentOverrideAppearancePreference(); RCT_EXTERN NSString *RCTColorSchemePreference(UITraitCollection *traitCollection); diff --git a/packages/react-native/React/CoreModules/RCTAppearance.mm b/packages/react-native/React/CoreModules/RCTAppearance.mm index 2ad68a58946..4f7350faad7 100644 --- a/packages/react-native/React/CoreModules/RCTAppearance.mm +++ b/packages/react-native/React/CoreModules/RCTAppearance.mm @@ -31,6 +31,12 @@ void RCTOverrideAppearancePreference(NSString *const colorSchemeOverride) sColorSchemeOverride = colorSchemeOverride; } +static BOOL sUseKeyWindowForSystemStyle = NO; +void RCTUseKeyWindowForSystemStyle(BOOL useMainScreen) +{ + sUseKeyWindowForSystemStyle = useMainScreen; +} + NSString *RCTCurrentOverrideAppearancePreference() { return sColorSchemeOverride; @@ -56,8 +62,9 @@ NSString *RCTColorSchemePreference(UITraitCollection *traitCollection) // Return the default if the app doesn't allow different color schemes. return RCTAppearanceColorSchemeLight; } - - return appearances[@(traitCollection.userInterfaceStyle)] ?: RCTAppearanceColorSchemeLight; + UIUserInterfaceStyle systemStyle = sUseKeyWindowForSystemStyle ? RCTKeyWindow().traitCollection.userInterfaceStyle + : traitCollection.userInterfaceStyle; + return appearances[@(systemStyle)] ?: RCTAppearanceColorSchemeLight; } @interface RCTAppearance ()