/** * Copyright (c) Facebook, Inc. and its affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #import "RCTAppearance.h" #import #import #import "CoreModulesPlugins.h" using namespace facebook::react; NSString *const RCTAppearanceColorSchemeLight = @"light"; NSString *const RCTAppearanceColorSchemeDark = @"dark"; static NSString *RCTColorSchemePreference(UITraitCollection *traitCollection) { #if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && defined(__IPHONE_13_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_13_0 if (@available(iOS 13.0, *)) { static NSDictionary *appearances; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ appearances = @{ @(UIUserInterfaceStyleLight): RCTAppearanceColorSchemeLight, @(UIUserInterfaceStyleDark): RCTAppearanceColorSchemeDark }; }); traitCollection = traitCollection ?: [UITraitCollection currentTraitCollection]; return appearances[@(traitCollection.userInterfaceStyle)] ?: RCTAppearanceColorSchemeLight; } #endif // Default to light on older OS version - same behavior as Android. return RCTAppearanceColorSchemeLight; } @interface RCTAppearance () @end @implementation RCTAppearance RCT_EXPORT_MODULE(Appearance) + (BOOL)requiresMainQueueSetup { return YES; } - (dispatch_queue_t)methodQueue { return dispatch_get_main_queue(); } - (std::shared_ptr)getTurboModuleWithJsInvoker:(std::shared_ptr)jsInvoker { return std::make_shared(self, jsInvoker); } RCT_EXPORT_SYNCHRONOUS_TYPED_METHOD(NSString *, getColorScheme) { return RCTColorSchemePreference(nil); } - (void)appearanceChanged:(NSNotification *)notification { NSDictionary *userInfo = [notification userInfo]; UITraitCollection *traitCollection = nil; if (userInfo) { traitCollection = userInfo[@"traitCollection"]; } [self sendEventWithName:@"appearanceChanged" body:@{@"colorScheme": RCTColorSchemePreference(traitCollection)}]; } #pragma mark - RCTEventEmitter - (NSArray *)supportedEvents { return @[@"appearanceChanged"]; } - (void)startObserving { if (@available(iOS 13.0, *)) { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appearanceChanged:) name:RCTUserInterfaceStyleDidChangeNotification object:nil]; } } - (void)stopObserving { if (@available(iOS 13.0, *)) { [[NSNotificationCenter defaultCenter] removeObserver:self]; } } @end Class RCTAppearanceCls(void) { return RCTAppearance.class; }