#import "RNNReactComponentRegistry.h" @interface RNNReactComponentRegistry () { id _creator; NSMapTable* _componentStore; } @end @implementation RNNReactComponentRegistry - (instancetype)initWithCreator:(id)creator { self = [super init]; _creator = creator; _componentStore = [NSMapTable new]; return self; } - (RNNReactButtonView *)createComponentIfNotExists:(RNNComponentOptions *)component parentComponentId:(NSString *)parentComponentId componentType:(RNNComponentType)componentType reactViewReadyBlock:(RNNReactViewReadyCompletionBlock)reactViewReadyBlock { RNNReactView* reactView = [self findComponent:component.componentId.get parentComponentId:parentComponentId]; if (!reactView) { reactView = [_creator createRootView:component.name.get rootViewId:component.componentId.get ofType:componentType reactViewReadyBlock:reactViewReadyBlock]; [self storeComponent:reactView componentId:component.componentId.get parentComponentId:parentComponentId]; } else if (reactViewReadyBlock) { reactViewReadyBlock(); } return (RNNReactButtonView *)reactView; } - (RNNReactView *)findComponent:(NSString *)componentId parentComponentId:(NSString *)parentComponentId { NSMapTable* parentComponentDict = [self componentsForParentId:parentComponentId]; return [parentComponentDict objectForKey:componentId]; } - (void)storeComponent:(RNNReactView *)component componentId:(NSString *)componentId parentComponentId:(NSString *)parentComponentId { NSMapTable* parentComponentDict = [self componentsForParentId:parentComponentId]; [parentComponentDict setObject:component forKey:componentId]; } - (NSMapTable *)componentsForParentId:(NSString *)parentComponentId { if (![_componentStore objectForKey:parentComponentId]) { [_componentStore setObject:[NSMapTable weakToStrongObjectsMapTable] forKey:parentComponentId];; } return [_componentStore objectForKey:parentComponentId];; } - (void)clearComponentsForParentId:(NSString *)parentComponentId { [_componentStore removeObjectForKey:parentComponentId];; } - (void)removeComponent:(NSString *)componentId { if ([_componentStore objectForKey:componentId]) { [_componentStore removeObjectForKey:componentId]; } } - (void)removeChildComponent:(NSString *)childId { NSMapTable* parent; NSEnumerator *enumerator = _componentStore.objectEnumerator; while ((parent = enumerator.nextObject)) { if ([parent objectForKey:childId]) { [parent removeObjectForKey:childId]; return; } } } - (void)clear { [_componentStore removeAllObjects]; } @end