GT2/Ejectable/node_modules/expo-splash-screen/ios/EXSplashScreen/EXSplashScreenService.m

101 lines
4.3 KiB
Objective-C

// Copyright © 2018 650 Industries. All rights reserved.
#import <EXSplashScreen/EXSplashScreenService.h>
#import <EXSplashScreen/EXSplashScreenViewNativeProvider.h>
#import <UMCore/UMDefines.h>
@interface EXSplashScreenService ()
@property (nonatomic, strong) NSMapTable<UIViewController *, EXSplashScreenController *> *splashScreenControllers;
@end
@implementation EXSplashScreenService
UM_REGISTER_SINGLETON_MODULE(SplashScreen);
- (instancetype)init
{
if (self = [super init]) {
_splashScreenControllers = [NSMapTable weakToStrongObjectsMapTable];
}
return self;
}
- (void)showSplashScreenFor:(UIViewController *)viewController
{
id<EXSplashScreenViewProvider> splashScreenViewProvider = [EXSplashScreenViewNativeProvider new];
return [self showSplashScreenFor:viewController
splashScreenViewProvider:splashScreenViewProvider
successCallback:^{}
failureCallback:^(NSString *message){ UMLogWarn(@"%@", message); }];
}
- (void)showSplashScreenFor:(UIViewController *)viewController
splashScreenViewProvider:(id<EXSplashScreenViewProvider>)splashScreenViewProvider
successCallback:(void (^)(void))successCallback
failureCallback:(void (^)(NSString * _Nonnull))failureCallback
{
if ([self.splashScreenControllers objectForKey:viewController]) {
return failureCallback(@"'SplashScreen.show' has already been called for given view controller.");
}
EXSplashScreenController *splashScreenController = [[EXSplashScreenController alloc] initWithViewController:viewController
splashScreenViewProvider:splashScreenViewProvider];
[self.splashScreenControllers setObject:splashScreenController forKey:viewController];
[[self.splashScreenControllers objectForKey:viewController] showWithCallback:successCallback
failureCallback:failureCallback];
}
- (void)preventSplashScreenAutoHideFor:(UIViewController *)viewController
successCallback:(void (^)(BOOL hasEffect))successCallback
failureCallback:(void (^)(NSString * _Nonnull))failureCallback
{
if (![self.splashScreenControllers objectForKey:viewController]) {
return failureCallback(@"No native splash screen registered for given view controller. Call 'SplashScreen.show' for given view controller first.");
}
return [[self.splashScreenControllers objectForKey:viewController] preventAutoHideWithCallback:successCallback
failureCallback:failureCallback];
}
- (void)hideSplashScreenFor:(UIViewController *)viewController
successCallback:(void (^)(BOOL hasEffect))successCallback
failureCallback:(void (^)(NSString * _Nonnull))failureCallback
{
if (![self.splashScreenControllers objectForKey:viewController]) {
return failureCallback(@"No native splash screen registered for given view controller. Call 'SplashScreen.show' for given view controller first.");
}
return [[self.splashScreenControllers objectForKey:viewController] hideWithCallback:successCallback
failureCallback:failureCallback];
}
- (void)onAppContentDidAppear:(UIViewController *)viewController
{
if (![self.splashScreenControllers objectForKey:viewController]) {
UMLogWarn(@"No native splash screen registered for given view controller. Call 'SplashScreen.show' for given view controller first.");
}
[[self.splashScreenControllers objectForKey:viewController] onAppContentDidAppear];
}
- (void)onAppContentWillReload:(UIViewController *)viewController
{
if (![self.splashScreenControllers objectForKey:viewController]) {
UMLogWarn(@"No native splash screen registered for given view controller. Call 'SplashScreen.show' for given view controller first.");
}
[[self.splashScreenControllers objectForKey:viewController] onAppContentWillReload];
}
# pragma mark - UIApplicationDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
UIViewController *rootViewController = [[application keyWindow] rootViewController];
if (rootViewController) {
[self showSplashScreenFor:rootViewController];
}
return YES;
}
@end