This commit is contained in:
Yamozha
2021-04-02 02:24:13 +03:00
parent c23950b545
commit 7256d79e2c
31493 changed files with 3036630 additions and 0 deletions

View File

@ -0,0 +1,21 @@
// Copyright 2018-present 650 Industries. All rights reserved.
#import <Foundation/Foundation.h>
#import <React/RCTBridgeModule.h>
#import <UMCore/UMModuleRegistryProvider.h>
// An "adapter" over module registry, for given RCTBridge and NSString
// is able to provide an array of exported RCTBridgeModules. Override
// it and use in your AppDelegate to export different bridge modules
// for different experiences.
@interface UMModuleRegistryAdapter : NSObject
@property (nonatomic, readonly) UMModuleRegistryProvider *moduleRegistryProvider;
- (instancetype)initWithModuleRegistryProvider:(UMModuleRegistryProvider *)moduleRegistryProvider;
- (NSArray<id<RCTBridgeModule>> *)extraModulesForModuleRegistry:(UMModuleRegistry *)moduleRegistry;
- (NSArray<id<RCTBridgeModule>> *)extraModulesForBridge:(RCTBridge *)bridge;
@end

View File

@ -0,0 +1,70 @@
// Copyright 2018-present 650 Industries. All rights reserved.
#import <UMReactNativeAdapter/UMNativeModulesProxy.h>
#import <UMReactNativeAdapter/UMViewManagerAdapter.h>
#import <UMReactNativeAdapter/UMModuleRegistryAdapter.h>
#import <UMReactNativeAdapter/UMViewManagerAdapterClassesRegistry.h>
#import <UMReactNativeAdapter/UMModuleRegistryHolderReactModule.h>
@interface UMModuleRegistryAdapter ()
@property (nonatomic, strong) UMModuleRegistryProvider *moduleRegistryProvider;
@property (nonatomic, strong) UMViewManagerAdapterClassesRegistry *viewManagersClassesRegistry;
@end
@implementation UMModuleRegistryAdapter
- (instancetype)initWithModuleRegistryProvider:(UMModuleRegistryProvider *)moduleRegistryProvider
{
if (self = [super init]) {
_moduleRegistryProvider = moduleRegistryProvider;
_viewManagersClassesRegistry = [[UMViewManagerAdapterClassesRegistry alloc] init];
}
return self;
}
- (NSArray<id<RCTBridgeModule>> *)extraModulesForBridge:(RCTBridge *)bridge
{
return [self extraModulesForModuleRegistry:[_moduleRegistryProvider moduleRegistry]];
}
- (NSArray<id<RCTBridgeModule>> *)extraModulesForModuleRegistry:(UMModuleRegistry *)moduleRegistry
{
NSMutableArray<id<RCTBridgeModule>> *extraModules = [NSMutableArray array];
UMNativeModulesProxy *nativeModulesProxy = [[UMNativeModulesProxy alloc] initWithModuleRegistry:moduleRegistry];
[extraModules addObject:nativeModulesProxy];
for (UMViewManager *viewManager in [moduleRegistry getAllViewManagers]) {
Class viewManagerAdapterClass = [_viewManagersClassesRegistry viewManagerAdapterClassForViewManager:viewManager];
[extraModules addObject:[[viewManagerAdapterClass alloc] initWithViewManager:viewManager]];
}
// Silence React Native warning `Base module "%s" does not exist`
// occurring when view manager class is subclassing another class
// that is not RCTViewManager (in our case all the view manager adapters
// subclass UMViewManagerAdapter, so RN expects to find UMViewManagerAdapter
// exported.
[extraModules addObject:[[UMViewManagerAdapter alloc] init]];
// It is possible that among internal modules there are some RCTBridgeModules --
// let's add them to extraModules here.
for (id<UMInternalModule> module in [moduleRegistry getAllInternalModules]) {
if ([module conformsToProtocol:@protocol(RCTBridgeModule)]) {
id<RCTBridgeModule> reactBridgeModule = (id<RCTBridgeModule>)module;
[extraModules addObject:reactBridgeModule];
}
}
// Adding the way to access the module registry from RCTBridgeModules.
[extraModules addObject:[[UMModuleRegistryHolderReactModule alloc] initWithModuleRegistry:moduleRegistry]];
// One could add some modules to the Module Registry after creating it.
// Here is our last call for finalizing initialization.
[moduleRegistry initialize];
return extraModules;
}
@end

View File

@ -0,0 +1,12 @@
// Copyright 2018-present 650 Industries. All rights reserved.
#import <Foundation/Foundation.h>
#import <UMCore/UMModuleRegistry.h>
#import <React/RCTBridgeModule.h>
@interface UMModuleRegistryHolderReactModule : NSObject <RCTBridgeModule>
- (instancetype)initWithModuleRegistry:(UMModuleRegistry *)moduleRegistry;
- (UMModuleRegistry *)moduleRegistry;
@end

View File

@ -0,0 +1,30 @@
// Copyright 2018-present 650 Industries. All rights reserved.
#import <UMReactNativeAdapter/UMModuleRegistryHolderReactModule.h>
@interface UMModuleRegistryHolderReactModule ()
@property (nonatomic, weak) UMModuleRegistry *moduleRegistry;
@end
@implementation UMModuleRegistryHolderReactModule
- (instancetype)initWithModuleRegistry:(UMModuleRegistry *)moduleRegistry
{
if (self = [super init]) {
_moduleRegistry = moduleRegistry;
}
return self;
}
- (UMModuleRegistry *)moduleRegistry
{
return _moduleRegistry;
}
+ (NSString *)moduleName {
return nil;
}
@end

View File

@ -0,0 +1,15 @@
// Copyright 2018-present 650 Industries. All rights reserved.
#import <React/RCTViewManager.h>
#import <UMCore/UMViewManager.h>
// A registry for view manager adapter classes.
// As we have to create subclasses of UMViewManagerAdapters
// at runtime to be able to respond with proper + (NSString *)moduleName
// to React, let's cache these classes and not create them twice.
@interface UMViewManagerAdapterClassesRegistry : NSObject
- (Class)viewManagerAdapterClassForViewManager:(UMViewManager *)viewManager;
@end

View File

@ -0,0 +1,57 @@
// Copyright 2018-present 650 Industries. All rights reserved.
#import <UMReactNativeAdapter/UMViewManagerAdapterClassesRegistry.h>
#import <UMReactNativeAdapter/UMViewManagerAdapter.h>
#import <objc/runtime.h>
static const NSString *viewManagerAdapterModuleNamePrefix = @"ViewManagerAdapter_";
static IMP directEventBlockImplementation = nil;
static dispatch_once_t directEventBlockImplementationOnceToken;
@interface UMViewManagerAdapterClassesRegistry ()
@property (nonatomic, strong) NSMutableDictionary<Class, Class> *viewManagerAdaptersClasses;
@end
@implementation UMViewManagerAdapterClassesRegistry
- (instancetype)init
{
if (self = [super init]) {
_viewManagerAdaptersClasses = [NSMutableDictionary dictionary];
}
return self;
}
- (Class)viewManagerAdapterClassForViewManager:(UMViewManager *)viewManager
{
Class viewManagerClass = [viewManager class];
if (_viewManagerAdaptersClasses[viewManagerClass] == nil) {
_viewManagerAdaptersClasses[(id <NSCopying>)viewManagerClass] = [self _createViewManagerAdapterClassForViewManager:viewManager];
}
return _viewManagerAdaptersClasses[viewManagerClass];
}
- (Class)_createViewManagerAdapterClassForViewManager:(UMViewManager *)viewManager
{
const char *viewManagerClassName = [[viewManagerAdapterModuleNamePrefix stringByAppendingString:[viewManager viewName]] UTF8String];
Class viewManagerAdapterClass = objc_allocateClassPair([UMViewManagerAdapter class], viewManagerClassName, 0);
[self _ensureDirectEventBlockImplementationIsPresent];
for (NSString *eventName in [viewManager supportedEvents]) {
class_addMethod(object_getClass(viewManagerAdapterClass), NSSelectorFromString([@"propConfig_" stringByAppendingString:eventName]), directEventBlockImplementation, "@@:");
}
return viewManagerAdapterClass;
}
- (void)_ensureDirectEventBlockImplementationIsPresent
{
dispatch_once(&directEventBlockImplementationOnceToken, ^{
directEventBlockImplementation = imp_implementationWithBlock(^{
return @[@"RCTDirectEventBlock"];
});
});
}
@end