diff --git a/Libraries/Components/Spinner/SpinnerIOS.ios.js b/Libraries/Components/SpinnerIOS/SpinnerIOS.ios.js similarity index 100% rename from Libraries/Components/Spinner/SpinnerIOS.ios.js rename to Libraries/Components/SpinnerIOS/SpinnerIOS.ios.js diff --git a/Libraries/Components/StatusBar/StatusBarIOS.js b/Libraries/Components/StatusBar/StatusBarIOS.ios.js similarity index 100% rename from Libraries/Components/StatusBar/StatusBarIOS.js rename to Libraries/Components/StatusBar/StatusBarIOS.ios.js diff --git a/Libraries/Components/Text/TextStylePropTypes.js b/Libraries/Components/Text/TextStylePropTypes.js index c78042854..0421794d2 100644 --- a/Libraries/Components/Text/TextStylePropTypes.js +++ b/Libraries/Components/Text/TextStylePropTypes.js @@ -15,6 +15,7 @@ var TextStylePropTypes = merge( fontFamily: ReactPropTypes.string, fontSize: ReactPropTypes.number, fontWeight: ReactPropTypes.oneOf(['normal' /*default*/, 'bold']), + fontStyle: ReactPropTypes.oneOf(['normal', 'italic']), lineHeight: ReactPropTypes.number, color: ReactPropTypes.string, containerBackgroundColor: ReactPropTypes.string, diff --git a/ReactKit/Base/RCTCache.h b/ReactKit/Base/RCTCache.h new file mode 100644 index 000000000..75943ae4f --- /dev/null +++ b/ReactKit/Base/RCTCache.h @@ -0,0 +1,22 @@ +// Copyright 2004-present Facebook. All Rights Reserved. + +#import + +@interface RCTCache : NSObject + +- (instancetype)init; // name = @"default" +- (instancetype)initWithName:(NSString *)name; + +@property (nonatomic, assign) NSUInteger maximumDiskSize; // in bytes + +#pragma mark - Retrieval + +- (BOOL)hasDataForKey:(NSString *)key; +- (void)fetchDataForKey:(NSString *)key completionHandler:(void (^)(NSData *data))completionHandler; + +#pragma mark - Insertion + +- (void)setData:(NSData *)data forKey:(NSString *)key; +- (void)removeAllData; + +@end diff --git a/ReactKit/Base/RCTCache.m b/ReactKit/Base/RCTCache.m new file mode 100644 index 000000000..40edaa557 --- /dev/null +++ b/ReactKit/Base/RCTCache.m @@ -0,0 +1,209 @@ +// Copyright 2004-present Facebook. All Rights Reserved. + +#import "RCTCache.h" + +#import +#import + +static NSString *const CacheSubdirectoryName = @"ReactKit"; +static NSString *const KeyExtendedAttributeName = @"com.facebook.ReactKit.RCTCacheManager.Key"; +static dispatch_queue_t Queue; + +#pragma mark - Cache Record - + +@interface RCTCacheRecord : NSObject + +@property (nonatomic, copy) NSUUID *UUID; +@property (nonatomic, copy) NSData *data; + +@end + +@implementation RCTCacheRecord + +@end + +#pragma mark - Cache + +@implementation RCTCache +{ + NSString *_name; + NSFileManager *_fileManager; + NSMutableDictionary *_storage; + NSURL *_cacheDirectoryURL; +} + ++ (void)initialize +{ + if (self == [RCTCache class]) { + Queue = dispatch_queue_create("com.facebook.ReactKit.RCTCache", DISPATCH_QUEUE_SERIAL); + } +} +- (instancetype)init +{ + return [self initWithName:@"default"]; +} + +- (instancetype)initWithName:(NSString *)name +{ + NSParameterAssert(name.length < NAME_MAX); + if ((self = [super init])) { + _name = [name copy]; + _fileManager = [[NSFileManager alloc] init]; + _storage = [NSMutableDictionary dictionary]; + + NSURL *cacheDirectoryURL = [[_fileManager URLsForDirectory:NSCachesDirectory inDomains:NSUserDomainMask] lastObject]; + cacheDirectoryURL = [cacheDirectoryURL URLByAppendingPathComponent:CacheSubdirectoryName isDirectory:YES]; + _cacheDirectoryURL = [cacheDirectoryURL URLByAppendingPathComponent:name isDirectory:YES]; + [_fileManager createDirectoryAtURL:_cacheDirectoryURL withIntermediateDirectories:YES attributes:nil error:NULL]; + + NSArray *fileURLs = [_fileManager contentsOfDirectoryAtURL:_cacheDirectoryURL includingPropertiesForKeys:nil options:NSDirectoryEnumerationSkipsHiddenFiles error:NULL]; + for (NSURL *fileURL in fileURLs) { + NSUUID *uuid = [[NSUUID alloc] initWithUUIDString:fileURL.lastPathComponent]; + if (!uuid) continue; + + NSString *key = [self keyOfItemAtURL:fileURL error:NULL]; + if (!key) { + [_fileManager removeItemAtURL:fileURL error:NULL]; + continue; + } + + RCTCacheRecord *record = [[RCTCacheRecord alloc] init]; + record.UUID = uuid; + _storage[key] = record; + } + } + return self; +} + +- (void)runOnQueue:(dispatch_block_t)block +{ + UIBackgroundTaskIdentifier identifier = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:nil]; + dispatch_async(Queue, ^{ + if (block) block(); + if (identifier != UIBackgroundTaskInvalid) { + [[UIApplication sharedApplication] endBackgroundTask:identifier]; + } + }); +} + +- (BOOL)hasDataForKey:(NSString *)key +{ + return _storage[key] != nil; +} + +- (void)fetchDataForKey:(NSString *)key completionHandler:(void (^)(NSData *))completionHandler +{ + NSParameterAssert(key.length > 0); + NSParameterAssert(completionHandler != nil); + [self runOnQueue:^{ + RCTCacheRecord *record = _storage[key]; + if (record && !record.data) { + record.data = [NSData dataWithContentsOfURL:[_cacheDirectoryURL URLByAppendingPathComponent:record.UUID.UUIDString]]; + } + + dispatch_async(dispatch_get_main_queue(), ^{ + completionHandler(record.data); + }); + }]; +} + +- (void)setData:(NSData *)data forKey:(NSString *)key +{ + NSParameterAssert(key.length > 0); + [self runOnQueue:^{ + RCTCacheRecord *record = _storage[key]; + if (data) { + if (!record) { + record = [[RCTCacheRecord alloc] init]; + record.UUID = [NSUUID UUID]; + _storage[key] = record; + } + + record.data = data; + + NSURL *fileURL = [_cacheDirectoryURL URLByAppendingPathComponent:record.UUID.UUIDString]; + [data writeToURL:fileURL options:NSDataWritingAtomic error:NULL]; + } else if (record) { + [_storage removeObjectForKey:key]; + + NSURL *fileURL = [_cacheDirectoryURL URLByAppendingPathComponent:record.UUID.UUIDString]; + [_fileManager removeItemAtURL:fileURL error:NULL]; + } + }]; +} + +- (void)removeAllData +{ + [self runOnQueue:^{ + [_storage removeAllObjects]; + + NSDirectoryEnumerator *enumerator = [_fileManager enumeratorAtURL:_cacheDirectoryURL includingPropertiesForKeys:nil options:NSDirectoryEnumerationSkipsHiddenFiles errorHandler:nil]; + for (NSURL *fileURL in enumerator) { + [_fileManager removeItemAtURL:fileURL error:NULL]; + } + }]; +} + +#pragma mark - Extended Attributes + +- (NSError *)errorWithPOSIXErrorNumber:(int)errorNumber +{ + NSDictionary *userInfo = @{ + NSLocalizedDescriptionKey: @(strerror(errorNumber)) + }; + return [NSError errorWithDomain:NSPOSIXErrorDomain code:errorNumber userInfo:userInfo]; +} + +- (BOOL)setAttribute:(NSString *)key value:(NSString *)value ofItemAtURL:(NSURL *)fileURL error:(NSError **)error +{ + const char *path = fileURL.fileSystemRepresentation; + + int result; + if (value) { + const char *valueUTF8String = value.UTF8String; + result = setxattr(path, key.UTF8String, valueUTF8String, strlen(valueUTF8String), 0, 0); + } else { + result = removexattr(path, key.UTF8String, 0); + } + + if (result) { + if (error) *error = [self errorWithPOSIXErrorNumber:errno]; + return NO; + } + + return YES; +} + +- (NSString *)attribute:(NSString *)key ofItemAtURL:(NSURL *)fileURL error:(NSError **)error +{ + const char *path = fileURL.fileSystemRepresentation; + const ssize_t length = getxattr(path, key.UTF8String, NULL, 0, 0, 0); + if (length <= 0) { + if (error) *error = [self errorWithPOSIXErrorNumber:errno]; + return nil; + } + + char *buffer = malloc(length); + ssize_t result = getxattr(path, key.UTF8String, buffer, length, 0, 0); + if (result == 0) { + return [[NSString alloc] initWithBytesNoCopy:buffer length:length encoding:NSUTF8StringEncoding freeWhenDone:YES]; + } + + free(buffer); + if (error) *error = [self errorWithPOSIXErrorNumber:errno]; + return nil; +} + +#pragma mark - Extended Attributes - Key + +- (NSString *)keyOfItemAtURL:(NSURL *)fileURL error:(NSError **)error +{ + return [self attribute:KeyExtendedAttributeName ofItemAtURL:fileURL error:error]; +} + +- (BOOL)setKey:(NSString *)key ofItemAtURL:(NSURL *)fileURL error:(NSError **)error +{ + return [self setAttribute:KeyExtendedAttributeName value:key ofItemAtURL:fileURL error:error]; +} + +@end diff --git a/ReactKit/Base/RCTConvert.m b/ReactKit/Base/RCTConvert.m index 89fca31ba..b0b94b748 100644 --- a/ReactKit/Base/RCTConvert.m +++ b/ReactKit/Base/RCTConvert.m @@ -814,7 +814,7 @@ BOOL RCTSetProperty(id target, NSString *keypath, id value) // Special case for numeric encodings, which may be enums if ([value isKindOfClass:[NSString class]] && - [@"iIsSlLqQ" containsString:[encoding substringToIndex:1]]) { + [@"iIsSlLqQ" rangeOfString:[encoding substringToIndex:1]].length) { /** * NOTE: the property names below may seem weird, but it's diff --git a/ReactKit/Base/RCTImageDownloader.m b/ReactKit/Base/RCTImageDownloader.m index 984e6cf6b..8efbe3b50 100644 --- a/ReactKit/Base/RCTImageDownloader.m +++ b/ReactKit/Base/RCTImageDownloader.m @@ -1,11 +1,16 @@ // Copyright 2004-present Facebook. All Rights Reserved. #import "RCTImageDownloader.h" + +#import "RCTCache.h" #import "RCTUtils.h" // TODO: something a bit more sophisticated @implementation RCTImageDownloader +{ + RCTCache *_cache; +} + (instancetype)sharedInstance { @@ -18,18 +23,63 @@ return sharedInstance; } +- (instancetype)init +{ + if ((self = [super init])) { + _cache = [[RCTCache alloc] initWithName:@"RCTImageDownloader"]; + } + return self; +} + +- (NSString *)cacheKeyForURL:(NSURL *)url +{ + return url.absoluteString; +} + +- (id)_downloadDataForURL:(NSURL *)url + block:(RCTDataDownloadBlock)block +{ + NSString *cacheKey = [self cacheKeyForURL:url]; + + __block BOOL cancelled = NO; + __block NSURLSessionDataTask *task = nil; + dispatch_block_t cancel = ^{ + cancelled = YES; + if (task) { + [task cancel]; + task = nil; + } + }; + + if ([_cache hasDataForKey:cacheKey]) { + [_cache fetchDataForKey:cacheKey completionHandler:^(NSData *data) { + if (cancelled) return; + block(data, nil); + }]; + } else { + task = [[NSURLSession sharedSession] dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { + block(data, error); + }]; + + [task resume]; + } + + return [cancel copy]; +} + - (id)downloadDataForURL:(NSURL *)url block:(RCTDataDownloadBlock)block { - NSURLSessionDataTask *task = [[NSURLSession sharedSession] dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { - // Dispatch back to main thread + NSString *cacheKey = [self cacheKeyForURL:url]; + __weak RCTImageDownloader *weakSelf = self; + return [self _downloadDataForURL:url block:^(NSData *data, NSError *error) { + RCTImageDownloader *strongSelf = weakSelf; + [strongSelf->_cache setData:data forKey:cacheKey]; + dispatch_async(dispatch_get_main_queue(), ^{ block(data, error); }); }]; - - [task resume]; - return task; } - (id)downloadImageForURL:(NSURL *)url @@ -37,45 +87,49 @@ scale:(CGFloat)scale block:(RCTImageDownloadBlock)block { - NSURLSessionDataTask *task = [[NSURLSession sharedSession] dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { - - UIImage *image = [UIImage imageWithData:data scale:scale]; - - // TODO: cache compressed image - - CGSize imageSize = size; - if (CGSizeEqualToSize(imageSize, CGSizeZero)) { - imageSize = image.size; + NSString *cacheKey = [self cacheKeyForURL:url]; + __weak RCTImageDownloader *weakSelf = self; + return [self _downloadDataForURL:url block:^(NSData *data, NSError *error) { + if (data) { + UIImage *image = [UIImage imageWithData:data scale:scale]; + + if (image) { + CGSize imageSize = size; + if (CGSizeEqualToSize(imageSize, CGSizeZero)) { + imageSize = image.size; + } + + CGFloat imageScale = scale; + if (imageScale == 0 || imageScale > image.scale) { + imageScale = image.scale; + } + + UIGraphicsBeginImageContextWithOptions(imageSize, NO, imageScale); + [image drawInRect:(CGRect){{0, 0}, imageSize}]; + image = UIGraphicsGetImageFromCurrentImageContext(); + UIGraphicsEndImageContext(); + + RCTImageDownloader *strongSelf = weakSelf; + [strongSelf->_cache setData:UIImagePNGRepresentation(image) forKey:cacheKey]; + } + + dispatch_async(dispatch_get_main_queue(), ^{ + block(image, nil); + }); + } else { + dispatch_async(dispatch_get_main_queue(), ^{ + block(nil, error); + }); } - - CGFloat imageScale = scale; - if (imageScale == 0 || imageScale > image.scale) { - imageScale = image.scale; - } - - if (image) { - // Decompress on background thread - UIGraphicsBeginImageContextWithOptions(imageSize, NO, imageScale); - [image drawInRect:(CGRect){{0, 0}, imageSize}]; - image = UIGraphicsGetImageFromCurrentImageContext(); - UIGraphicsEndImageContext(); - - // TODO: cache decompressed images at each requested size - } - - // Dispatch back to main thread - dispatch_async(dispatch_get_main_queue(), ^{ - block(image, error); - }); }]; - - [task resume]; - return task; } - (void)cancelDownload:(id)downloadToken { - [(NSURLSessionDataTask *)downloadToken cancel]; + if (downloadToken) { + dispatch_block_t block = downloadToken; + block(); + } } @end diff --git a/ReactKit/ReactKit.xcodeproj/project.pbxproj b/ReactKit/ReactKit.xcodeproj/project.pbxproj index 42ca15dd3..3be8f807c 100644 --- a/ReactKit/ReactKit.xcodeproj/project.pbxproj +++ b/ReactKit/ReactKit.xcodeproj/project.pbxproj @@ -41,6 +41,7 @@ 13E067571A70F44B002CDEE1 /* RCTView.m in Sources */ = {isa = PBXBuildFile; fileRef = 13E067501A70F44B002CDEE1 /* RCTView.m */; }; 13E067591A70F44B002CDEE1 /* UIView+ReactKit.m in Sources */ = {isa = PBXBuildFile; fileRef = 13E067541A70F44B002CDEE1 /* UIView+ReactKit.m */; }; 830A229E1A66C68A008503DA /* RCTRootView.m in Sources */ = {isa = PBXBuildFile; fileRef = 830A229D1A66C68A008503DA /* RCTRootView.m */; }; + 830BA4551A8E3BDA00D53203 /* RCTCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 830BA4541A8E3BDA00D53203 /* RCTCache.m */; }; 832348161A77A5AA00B55238 /* Layout.c in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FC71A68125100A75B9A /* Layout.c */; }; 835DD1321A7FDFB600D561F7 /* RCTText.m in Sources */ = {isa = PBXBuildFile; fileRef = 835DD1311A7FDFB600D561F7 /* RCTText.m */; }; 83CBBA511A601E3B00E9B192 /* RCTAssert.m in Sources */ = {isa = PBXBuildFile; fileRef = 83CBBA4B1A601E3B00E9B192 /* RCTAssert.m */; }; @@ -139,6 +140,8 @@ 830213F31A654E0800B993E6 /* RCTBridgeModule.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RCTBridgeModule.h; sourceTree = ""; }; 830A229C1A66C68A008503DA /* RCTRootView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RCTRootView.h; sourceTree = ""; }; 830A229D1A66C68A008503DA /* RCTRootView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RCTRootView.m; sourceTree = ""; }; + 830BA4531A8E3BDA00D53203 /* RCTCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RCTCache.h; sourceTree = ""; }; + 830BA4541A8E3BDA00D53203 /* RCTCache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RCTCache.m; sourceTree = ""; }; 835DD1301A7FDFB600D561F7 /* RCTText.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RCTText.h; sourceTree = ""; }; 835DD1311A7FDFB600D561F7 /* RCTText.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RCTText.m; sourceTree = ""; }; 83BEE46C1A6D19BC00B5863B /* RCTSparseArray.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RCTSparseArray.h; sourceTree = ""; }; @@ -200,18 +203,18 @@ 13B07FE01A69315300A75B9A /* Modules */ = { isa = PBXGroup; children = ( - 13B080271A694C4900A75B9A /* RCTDataManager.h */, - 13B080281A694C4900A75B9A /* RCTDataManager.m */, 13B07FE71A69327A00A75B9A /* RCTAlertManager.h */, 13B07FE81A69327A00A75B9A /* RCTAlertManager.m */, + 13B080271A694C4900A75B9A /* RCTDataManager.h */, + 13B080281A694C4900A75B9A /* RCTDataManager.m */, 13B07FE91A69327A00A75B9A /* RCTExceptionsManager.h */, 13B07FEA1A69327A00A75B9A /* RCTExceptionsManager.m */, + 13723B4E1A82FD3C00F88898 /* RCTStatusBarManager.h */, + 13723B4F1A82FD3C00F88898 /* RCTStatusBarManager.m */, 13B07FED1A69327A00A75B9A /* RCTTiming.h */, 13B07FEE1A69327A00A75B9A /* RCTTiming.m */, 13E067481A70F434002CDEE1 /* RCTUIManager.h */, 13E067491A70F434002CDEE1 /* RCTUIManager.m */, - 13723B4E1A82FD3C00F88898 /* RCTStatusBarManager.h */, - 13723B4F1A82FD3C00F88898 /* RCTStatusBarManager.m */, ); path = Modules; sourceTree = ""; @@ -219,28 +222,6 @@ 13B07FF31A6947C200A75B9A /* Views */ = { isa = PBXGroup; children = ( - 13E067531A70F44B002CDEE1 /* UIView+ReactKit.h */, - 13E067541A70F44B002CDEE1 /* UIView+ReactKit.m */, - 13E0674B1A70F44B002CDEE1 /* RCTShadowView.h */, - 13E0674C1A70F44B002CDEE1 /* RCTShadowView.m */, - 13E0674F1A70F44B002CDEE1 /* RCTView.h */, - 13E067501A70F44B002CDEE1 /* RCTView.m */, - 13E0674D1A70F44B002CDEE1 /* RCTViewManager.h */, - 13E0674E1A70F44B002CDEE1 /* RCTViewManager.m */, - 13B07FF61A6947C200A75B9A /* RCTScrollView.h */, - 13B07FF71A6947C200A75B9A /* RCTScrollView.m */, - 13B07FF81A6947C200A75B9A /* RCTScrollViewManager.h */, - 13B07FF91A6947C200A75B9A /* RCTScrollViewManager.m */, - 13B07FFA1A6947C200A75B9A /* RCTShadowRawText.h */, - 13B07FFB1A6947C200A75B9A /* RCTShadowRawText.m */, - 137029571A6C197000575408 /* RCTRawTextManager.h */, - 137029581A6C197000575408 /* RCTRawTextManager.m */, - 13B07FFC1A6947C200A75B9A /* RCTShadowText.h */, - 13B07FFD1A6947C200A75B9A /* RCTShadowText.m */, - 835DD1301A7FDFB600D561F7 /* RCTText.h */, - 835DD1311A7FDFB600D561F7 /* RCTText.m */, - 13B080021A6947C200A75B9A /* RCTTextManager.h */, - 13B080031A6947C200A75B9A /* RCTTextManager.m */, 13B0800C1A69489C00A75B9A /* RCTNavigator.h */, 13B0800D1A69489C00A75B9A /* RCTNavigator.m */, 13B0800E1A69489C00A75B9A /* RCTNavigatorManager.h */, @@ -249,22 +230,44 @@ 13B080111A69489C00A75B9A /* RCTNavItem.m */, 13B080121A69489C00A75B9A /* RCTNavItemManager.h */, 13B080131A69489C00A75B9A /* RCTNavItemManager.m */, - 13B080141A69489C00A75B9A /* RCTTextField.h */, - 13B080151A69489C00A75B9A /* RCTTextField.m */, - 13B080161A69489C00A75B9A /* RCTTextFieldManager.h */, - 13B080171A69489C00A75B9A /* RCTTextFieldManager.m */, - 13B080181A69489C00A75B9A /* RCTUIActivityIndicatorViewManager.h */, - 13B080191A69489C00A75B9A /* RCTUIActivityIndicatorViewManager.m */, - 13B080231A694A8400A75B9A /* RCTWrapperViewController.h */, - 13B080241A694A8400A75B9A /* RCTWrapperViewController.m */, 1370294E1A6990A100575408 /* RCTNetworkImageView.h */, 1370294F1A6990A100575408 /* RCTNetworkImageView.m */, 1370293F1A698FF000575408 /* RCTNetworkImageViewManager.h */, 137029401A698FF000575408 /* RCTNetworkImageViewManager.m */, + 137029571A6C197000575408 /* RCTRawTextManager.h */, + 137029581A6C197000575408 /* RCTRawTextManager.m */, + 13B07FF61A6947C200A75B9A /* RCTScrollView.h */, + 13B07FF71A6947C200A75B9A /* RCTScrollView.m */, + 13B07FF81A6947C200A75B9A /* RCTScrollViewManager.h */, + 13B07FF91A6947C200A75B9A /* RCTScrollViewManager.m */, + 13B07FFA1A6947C200A75B9A /* RCTShadowRawText.h */, + 13B07FFB1A6947C200A75B9A /* RCTShadowRawText.m */, + 13B07FFC1A6947C200A75B9A /* RCTShadowText.h */, + 13B07FFD1A6947C200A75B9A /* RCTShadowText.m */, + 13E0674B1A70F44B002CDEE1 /* RCTShadowView.h */, + 13E0674C1A70F44B002CDEE1 /* RCTShadowView.m */, 1302F0F91A78550100EBEF02 /* RCTStaticImage.h */, 1302F0FA1A78550100EBEF02 /* RCTStaticImage.m */, 1302F0FB1A78550100EBEF02 /* RCTStaticImageManager.h */, 1302F0FC1A78550100EBEF02 /* RCTStaticImageManager.m */, + 835DD1301A7FDFB600D561F7 /* RCTText.h */, + 835DD1311A7FDFB600D561F7 /* RCTText.m */, + 13B080141A69489C00A75B9A /* RCTTextField.h */, + 13B080151A69489C00A75B9A /* RCTTextField.m */, + 13B080161A69489C00A75B9A /* RCTTextFieldManager.h */, + 13B080171A69489C00A75B9A /* RCTTextFieldManager.m */, + 13B080021A6947C200A75B9A /* RCTTextManager.h */, + 13B080031A6947C200A75B9A /* RCTTextManager.m */, + 13B080181A69489C00A75B9A /* RCTUIActivityIndicatorViewManager.h */, + 13B080191A69489C00A75B9A /* RCTUIActivityIndicatorViewManager.m */, + 13E0674F1A70F44B002CDEE1 /* RCTView.h */, + 13E067501A70F44B002CDEE1 /* RCTView.m */, + 13E0674D1A70F44B002CDEE1 /* RCTViewManager.h */, + 13E0674E1A70F44B002CDEE1 /* RCTViewManager.m */, + 13B080231A694A8400A75B9A /* RCTWrapperViewController.h */, + 13B080241A694A8400A75B9A /* RCTWrapperViewController.m */, + 13E067531A70F44B002CDEE1 /* UIView+ReactKit.h */, + 13E067541A70F44B002CDEE1 /* UIView+ReactKit.m */, ); path = Views; sourceTree = ""; @@ -300,38 +303,40 @@ 83CBBA491A601E3B00E9B192 /* Base */ = { isa = PBXGroup; children = ( + 13DB9D681A8CC58200429C20 /* RCTAnimationType.h */, 83CBBA4A1A601E3B00E9B192 /* RCTAssert.h */, 83CBBA4B1A601E3B00E9B192 /* RCTAssert.m */, - 13A1F71C1A75392D00D3D453 /* RCTKeyCommands.h */, - 13A1F71D1A75392D00D3D453 /* RCTKeyCommands.m */, 83CBBA611A601EB200E9B192 /* RCTAutoInsetsProtocol.h */, 83CBBA5E1A601EAA00E9B192 /* RCTBridge.h */, 83CBBA5F1A601EAA00E9B192 /* RCTBridge.m */, + 830213F31A654E0800B993E6 /* RCTBridgeModule.h */, + 830BA4531A8E3BDA00D53203 /* RCTCache.h */, + 830BA4541A8E3BDA00D53203 /* RCTCache.m */, 83CBBACA1A6023D300E9B192 /* RCTConvert.h */, 83CBBACB1A6023D300E9B192 /* RCTConvert.m */, - 830213F31A654E0800B993E6 /* RCTBridgeModule.h */, - 830A229C1A66C68A008503DA /* RCTRootView.h */, - 830A229D1A66C68A008503DA /* RCTRootView.m */, - 83CBBA4C1A601E3B00E9B192 /* RCTInvalidating.h */, 83CBBA651A601EF300E9B192 /* RCTEventDispatcher.h */, 83CBBA661A601EF300E9B192 /* RCTEventDispatcher.m */, + 137029511A69923600575408 /* RCTImageDownloader.h */, + 137029521A69923600575408 /* RCTImageDownloader.m */, + 83CBBA4C1A601E3B00E9B192 /* RCTInvalidating.h */, 83CBBA631A601ECA00E9B192 /* RCTJavaScriptExecutor.h */, - 83BEE46C1A6D19BC00B5863B /* RCTSparseArray.h */, - 83BEE46D1A6D19BC00B5863B /* RCTSparseArray.m */, + 13A1F71C1A75392D00D3D453 /* RCTKeyCommands.h */, + 13A1F71D1A75392D00D3D453 /* RCTKeyCommands.m */, 83CBBA4D1A601E3B00E9B192 /* RCTLog.h */, 83CBBA4E1A601E3B00E9B192 /* RCTLog.m */, + 13ED13891A80C9D40050A8F9 /* RCTPointerEvents.h */, 83CBBA581A601E9000E9B192 /* RCTRedBox.h */, 83CBBA591A601E9000E9B192 /* RCTRedBox.m */, + 830A229C1A66C68A008503DA /* RCTRootView.h */, + 830A229D1A66C68A008503DA /* RCTRootView.m */, + 13B07FCD1A683B5F00A75B9A /* RCTScrollableProtocol.h */, + 83BEE46C1A6D19BC00B5863B /* RCTSparseArray.h */, + 83BEE46D1A6D19BC00B5863B /* RCTSparseArray.m */, 83CBBA961A6020BB00E9B192 /* RCTTouchHandler.h */, 83CBBA971A6020BB00E9B192 /* RCTTouchHandler.m */, 83CBBA4F1A601E3B00E9B192 /* RCTUtils.h */, 83CBBA501A601E3B00E9B192 /* RCTUtils.m */, 83CBBA621A601EB800E9B192 /* RCTViewNodeProtocol.h */, - 137029511A69923600575408 /* RCTImageDownloader.h */, - 137029521A69923600575408 /* RCTImageDownloader.m */, - 13B07FCD1A683B5F00A75B9A /* RCTScrollableProtocol.h */, - 13ED13891A80C9D40050A8F9 /* RCTPointerEvents.h */, - 13DB9D681A8CC58200429C20 /* RCTAnimationType.h */, ); path = Base; sourceTree = ""; @@ -445,6 +450,7 @@ 13B080081A6947C200A75B9A /* RCTShadowText.m in Sources */, 13E067551A70F44B002CDEE1 /* RCTShadowView.m in Sources */, 13B0801A1A69489C00A75B9A /* RCTNavigator.m in Sources */, + 830BA4551A8E3BDA00D53203 /* RCTCache.m in Sources */, 134FCB3E1A6E7F0800051CC8 /* RCTWebViewExecutor.m in Sources */, 13B0801C1A69489C00A75B9A /* RCTNavItem.m in Sources */, 83CBBA691A601EF300E9B192 /* RCTEventDispatcher.m in Sources */,