Files
mattermost-mobile/native_modules/RNDocumentPicker.m
2018-05-11 18:05:49 -03:00

101 lines
3.3 KiB
Objective-C

#import "RNDocumentPicker.h"
#if __has_include(<React/RCTConvert.h>)
#import <React/RCTConvert.h>
#import <React/RCTBridge.h>
#else // back compatibility for RN version < 0.40
#import "RCTConvert.h"
#import "RCTBridge.h"
#endif
#define IDIOM UI_USER_INTERFACE_IDIOM()
#define IPAD UIUserInterfaceIdiomPad
@interface RNDocumentPicker () <UIDocumentPickerDelegate>
@end
@implementation RNDocumentPicker {
NSMutableArray *composeViews;
NSMutableArray *composeCallbacks;
}
@synthesize bridge = _bridge;
- (instancetype)init
{
if ((self = [super init])) {
composeCallbacks = [[NSMutableArray alloc] init];
composeViews = [[NSMutableArray alloc] init];
}
return self;
}
- (dispatch_queue_t)methodQueue
{
return dispatch_get_main_queue();
}
RCT_EXPORT_MODULE()
RCT_EXPORT_METHOD(show:(NSDictionary *)options
callback:(RCTResponseSenderBlock)callback) {
NSArray *allowedUTIs = [RCTConvert NSArray:options[@"filetype"]];
UIDocumentPickerViewController *documentPicker = [[UIDocumentPickerViewController alloc] initWithDocumentTypes:(NSArray *)allowedUTIs inMode:UIDocumentPickerModeImport];
[composeCallbacks addObject:callback];
documentPicker.delegate = self;
documentPicker.modalPresentationStyle = UIModalPresentationFormSheet;
UIViewController *rootViewController = [[[[UIApplication sharedApplication]delegate] window] rootViewController];
while (rootViewController.modalViewController) {
rootViewController = rootViewController.modalViewController;
}
if ( IDIOM == IPAD ) {
NSNumber *top = [RCTConvert NSNumber:options[@"top"]];
NSNumber *left = [RCTConvert NSNumber:options[@"left"]];
[documentPicker.popoverPresentationController setSourceRect: CGRectMake([left floatValue], [top floatValue], 0, 0)];
[documentPicker.popoverPresentationController setSourceView: rootViewController.view];
}
[rootViewController presentViewController:documentPicker animated:YES completion:nil];
}
- (void)documentPicker:(UIDocumentPickerViewController *)controller didPickDocumentAtURL:(NSURL *)url {
if (controller.documentPickerMode == UIDocumentPickerModeImport) {
RCTResponseSenderBlock callback = [composeCallbacks lastObject];
[composeCallbacks removeLastObject];
[url startAccessingSecurityScopedResource];
NSFileCoordinator *coordinator = [[NSFileCoordinator alloc] init];
__block NSError *error;
[coordinator coordinateReadingItemAtURL:url options:NSFileCoordinatorReadingResolvesSymbolicLink error:&error byAccessor:^(NSURL *newURL) {
NSMutableDictionary* result = [NSMutableDictionary dictionary];
[result setValue:newURL.absoluteString forKey:@"uri"];
[result setValue:[newURL lastPathComponent] forKey:@"fileName"];
NSError *attributesError = nil;
NSDictionary *fileAttributes = [[NSFileManager defaultManager] attributesOfItemAtPath:newURL.path error:&attributesError];
if(!attributesError) {
[result setValue:[fileAttributes objectForKey:NSFileSize] forKey:@"fileSize"];
} else {
NSLog(@"%@", attributesError);
}
callback(@[[NSNull null], result]);
}];
[url stopAccessingSecurityScopedResource];
}
}
@end