127700081SBartłomiej Bukowski#import <React/RCTImageSource.h>
227700081SBartłomiej Bukowski#import <React/RCTImageView.h>
327700081SBartłomiej Bukowski#import <UMCore/UMDefines.h>
427700081SBartłomiej Bukowski
527700081SBartłomiej Bukowski#import "EXKernel.h"
6*4d7a9b36SBartłomiej Bukowski#import "EXManagedAppSplashScreenConfiguration.h"
7*4d7a9b36SBartłomiej Bukowski#import "EXManagedAppSplashScreenConfigurationBuilder.h"
8*4d7a9b36SBartłomiej Bukowski#import "EXManagedAppSplashScreenViewProvider.h"
927700081SBartłomiej Bukowski#import "EXReactAppManager.h"
1027700081SBartłomiej Bukowski
1127700081SBartłomiej Bukowski@interface EXManagedAppSplashScreenViewProvider ()
1227700081SBartłomiej Bukowski
1327700081SBartłomiej Bukowski@property (nonatomic, weak) UIView *splashScreenView;
14*4d7a9b36SBartłomiej Bukowski@property (nonatomic, strong) EXManagedAppSplashScreenConfiguration *configuration;
1527700081SBartłomiej Bukowski@property (nonatomic, strong, nullable) RCTImageView *splashImageView;
1627700081SBartłomiej Bukowski
1727700081SBartłomiej Bukowski@end
1827700081SBartłomiej Bukowski
1927700081SBartłomiej Bukowski@implementation EXManagedAppSplashScreenViewProvider
2027700081SBartłomiej Bukowski
2127700081SBartłomiej Bukowski- (instancetype)initWithManifest:(NSDictionary *)manifest
2227700081SBartłomiej Bukowski{
2327700081SBartłomiej Bukowski  if (self = [super init]) {
2427700081SBartłomiej Bukowski    _configuration = [EXManagedAppSplashScreenConfigurationBuilder parseManifest:manifest];
2527700081SBartłomiej Bukowski  }
2627700081SBartłomiej Bukowski  return self;
2727700081SBartłomiej Bukowski}
2827700081SBartłomiej Bukowski
2927700081SBartłomiej Bukowski- (void)updateSplashScreenViewWithManifest:(NSDictionary *)manifest
3027700081SBartłomiej Bukowski{
3127700081SBartłomiej Bukowski  _configuration = [EXManagedAppSplashScreenConfigurationBuilder parseManifest:manifest];
3227700081SBartłomiej Bukowski  if (_splashScreenView) {
3327700081SBartłomiej Bukowski    [self configureSplashScreenView:_splashScreenView];
3427700081SBartłomiej Bukowski  }
3527700081SBartłomiej Bukowski}
3627700081SBartłomiej Bukowski
3727700081SBartłomiej Bukowski- (UIView *)createSplashScreenView
3827700081SBartłomiej Bukowski{
3927700081SBartłomiej Bukowski  UIView *splashScreenView = [UIView new];
4027700081SBartłomiej Bukowski  [self configureSplashScreenView:splashScreenView];
4127700081SBartłomiej Bukowski  _splashScreenView = splashScreenView;
4227700081SBartłomiej Bukowski  return splashScreenView;
4327700081SBartłomiej Bukowski}
4427700081SBartłomiej Bukowski
4527700081SBartłomiej Bukowski- (void)configureSplashScreenView:(UIView *)splashScreenView
4627700081SBartłomiej Bukowski{
4727700081SBartłomiej Bukowski  UM_WEAKIFY(self);
4827700081SBartłomiej Bukowski  dispatch_async(dispatch_get_main_queue(), ^{
4927700081SBartłomiej Bukowski    UM_ENSURE_STRONGIFY(self);
5027700081SBartłomiej Bukowski    splashScreenView.backgroundColor = self.configuration.backgroundColor;
5127700081SBartłomiej Bukowski
5227700081SBartłomiej Bukowski    if (self.configuration.imageUrl) {
5327700081SBartłomiej Bukowski      EXKernelAppRecord *homeAppRecord = [EXKernel sharedInstance].appRegistry.homeAppRecord;
5427700081SBartłomiej Bukowski
5527700081SBartłomiej Bukowski      if (homeAppRecord.appManager.reactBridge) {
5627700081SBartłomiej Bukowski        // remove old splashImageView
5727700081SBartłomiej Bukowski        if (self.splashImageView) {
5827700081SBartłomiej Bukowski          [self.splashImageView removeFromSuperview];
5927700081SBartłomiej Bukowski        }
6027700081SBartłomiej Bukowski
6127700081SBartłomiej Bukowski        RCTImageSource *imageSource = [RCTConvert RCTImageSource:@{ @"uri": self.configuration.imageUrl }];
6227700081SBartłomiej Bukowski
63*4d7a9b36SBartłomiej Bukowski        // splash image loading is taking some time that, what can result in no image visually presented during loading phase
64*4d7a9b36SBartłomiej Bukowski        // despite the fact the RCTImageView is mounted in the view hierarchy
6527700081SBartłomiej Bukowski        self.splashImageView = [[RCTImageView alloc] initWithBridge:homeAppRecord.appManager.reactBridge];
6627700081SBartłomiej Bukowski        self.splashImageView.frame = splashScreenView.bounds;
6727700081SBartłomiej Bukowski        self.splashImageView.imageSources = @[imageSource];
68*4d7a9b36SBartłomiej Bukowski        self.splashImageView.resizeMode = self.configuration.imageResizeMode == EXSplashScreenImageResizeModeCover ? RCTResizeModeCover : RCTResizeModeContain;
6927700081SBartłomiej Bukowski        [splashScreenView addSubview:self.splashImageView];
7027700081SBartłomiej Bukowski      }
7127700081SBartłomiej Bukowski    }
7227700081SBartłomiej Bukowski  });
7327700081SBartłomiej Bukowski}
7427700081SBartłomiej Bukowski
7527700081SBartłomiej Bukowski@end
7627700081SBartłomiej Bukowski
77