Skip to content

macos support #849

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 4 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19,402 changes: 19,402 additions & 0 deletions package-lock.json

Large diffs are not rendered by default.

3 changes: 3 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -60,5 +60,8 @@
"prettier": "^3.4.2",
"typescript": "^5.7.3"
},
"devDependencies": {
"@react-native-community/cli": "latest"
},
"packageManager": "yarn@4.6.0"
}
12 changes: 9 additions & 3 deletions packages/document-picker/ios/RNDocumentPicker.mm
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,17 @@
// this header file is generated by Xcode: https://developer.apple.com/documentation/swift/importing-swift-into-objective-c
// if it cannot be found, try cleaning the build folder and Xcode derived data folder

// When using use_frameworks! :linkage => :static in Podfile
#if __has_include(<react_native_document_picker/react_native_document_picker-Swift.h>)
// Import Swift module header with multiple fallback options
#if __has_include("react_native_document_picker-Swift.h")
#import "react_native_document_picker-Swift.h"
#elif __has_include(<react_native_document_picker/react_native_document_picker-Swift.h>)
#import <react_native_document_picker/react_native_document_picker-Swift.h>
#elif __has_include("react-native-document-picker-Swift.h")
#import "react-native-document-picker-Swift.h"
#elif __has_include(<react-native-document-picker/react-native-document-picker-Swift.h>)
#import <react-native-document-picker/react-native-document-picker-Swift.h>
#else
#import "react_native_document_picker-Swift.h"
#warning "Swift bridging header not found. Make sure Swift files are compiled and module is properly configured."
#endif

// for UIModalPresentationStyle conversion
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
//
// react-native-document-picker-umbrella.h
// react-native-document-picker
//
// Created for module compatibility
//

#ifdef __OBJC__
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

#import "RNDocumentPicker.h"
#import "RCTConvert+RNDocumentPicker.h"

#endif

FOUNDATION_EXPORT double react_native_document_pickerVersionNumber;
FOUNDATION_EXPORT const unsigned char react_native_document_pickerVersionString[];
28 changes: 20 additions & 8 deletions packages/document-picker/ios/swift/PickerOptions.swift
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,26 @@ import UIKit
import UniformTypeIdentifiers

@objc public class PickerOptions: NSObject {
let allowedTypes: Array<UTType>
let mode: String // "import" or "open"
let allowMultiSelection: Bool
let transitionStyle: UIModalTransitionStyle
let presentationStyle: UIModalPresentationStyle
let initialDirectoryUrl: URL?
let shouldShowFileExtensions: Bool
let requestLongTermAccess: Bool
@objc public var allowedTypes: Array<UTType>
@objc public var mode: String // "import" or "open"
@objc public var allowMultiSelection: Bool
@objc public var transitionStyle: UIModalTransitionStyle
@objc public var presentationStyle: UIModalPresentationStyle
@objc public var initialDirectoryUrl: URL?
@objc public var shouldShowFileExtensions: Bool
@objc public var requestLongTermAccess: Bool

@objc public override init() {
allowedTypes = []
mode = "import"
allowMultiSelection = false
transitionStyle = .coverVertical
presentationStyle = .fullScreen
initialDirectoryUrl = nil
shouldShowFileExtensions = true
requestLongTermAccess = false
super.init()
}

@objc public init(types: Array<String>, mode: String = "import", initialDirectoryUrl: String? = nil, allowMultiSelection: Bool, shouldShowFileExtensions: Bool, transitionStyle: UIModalTransitionStyle = .coverVertical, presentationStyle: UIModalPresentationStyle = .fullScreen, requestLongTermAccess: Bool = false) {
// TODO check if types were valid
Expand Down
28 changes: 22 additions & 6 deletions packages/document-picker/ios/swift/SaverOptions.swift
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,28 @@ import UIKit
import UniformTypeIdentifiers

@objc public class SaverOptions: NSObject {
let transitionStyle: UIModalTransitionStyle
let presentationStyle: UIModalPresentationStyle
let initialDirectoryUrl: URL?
let sourceUrls: [URL]
let shouldShowFileExtensions: Bool
let asCopy: Bool
@objc public var transitionStyle: UIModalTransitionStyle
@objc public var presentationStyle: UIModalPresentationStyle
@objc public var initialDirectoryUrl: URL?
@objc public var sourceUrls: [URL]
@objc public var shouldShowFileExtensions: Bool
@objc public var asCopy: Bool
@objc public var fileName: String?
@objc public var data: String?
@objc public var uri: String?

@objc public override init() {
transitionStyle = .coverVertical
presentationStyle = .fullScreen
initialDirectoryUrl = nil
sourceUrls = []
shouldShowFileExtensions = true
asCopy = true
fileName = nil
data = nil
uri = nil
super.init()
}

@objc public init(sourceUrlStrings: [String], asCopy: Bool, initialDirectoryUrl: String? = nil, shouldShowFileExtensions: Bool, transitionStyle: UIModalTransitionStyle = .coverVertical, presentationStyle: UIModalPresentationStyle = .fullScreen) {
self.sourceUrls = sourceUrlStrings.map({ it in
Expand Down
14 changes: 14 additions & 0 deletions packages/document-picker/macos/RCTConvert+RNDocumentPicker.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
// LICENSE: see License.md in the package root

#import <React/RCTConvert.h>

// Forward declarations for Swift classes
@class PickerOptions;
@class SaverOptions;

@interface RCTConvert (RNDocumentPicker)

+ (PickerOptions *)PickerOptions:(id)json;
+ (SaverOptions *)SaverOptions:(id)json;

@end
80 changes: 80 additions & 0 deletions packages/document-picker/macos/RCTConvert+RNDocumentPicker.mm
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
// LICENSE: see License.md in the package root

#import "RCTConvert+RNDocumentPicker.h"
#import <UniformTypeIdentifiers/UniformTypeIdentifiers.h>

// Import Swift module header with multiple fallback options
#if __has_include("react_native_document_picker-Swift.h")
#import "react_native_document_picker-Swift.h"
#elif __has_include(<react_native_document_picker/react_native_document_picker-Swift.h>)
#import <react_native_document_picker/react_native_document_picker-Swift.h>
#elif __has_include("react-native-document-picker-Swift.h")
#import "react-native-document-picker-Swift.h"
#elif __has_include(<react-native-document-picker/react-native-document-picker-Swift.h>)
#import <react-native-document-picker/react-native-document-picker-Swift.h>
#else
#warning "Swift bridging header not found. Make sure Swift files are compiled and module is properly configured."
#endif

@implementation RCTConvert (RNDocumentPicker)

+ (PickerOptions *)PickerOptions:(id)json
{
NSDictionary *options = [RCTConvert NSDictionary:json];
PickerOptions *pickerOptions = [[PickerOptions alloc] init];

// Set default values
pickerOptions.allowMultiSelection = NO;
pickerOptions.mode = @"open";
pickerOptions.copyTo = @"cachesDirectory";

if (options[@"allowMultiSelection"]) {
pickerOptions.allowMultiSelection = [RCTConvert BOOL:options[@"allowMultiSelection"]];
}

if (options[@"mode"]) {
pickerOptions.mode = [RCTConvert NSString:options[@"mode"]];
}

if (options[@"copyTo"]) {
pickerOptions.copyTo = [RCTConvert NSString:options[@"copyTo"]];
}

if (options[@"type"]) {
NSArray *types = [RCTConvert NSArray:options[@"type"]];
NSMutableArray<UTType *> *utTypes = [[NSMutableArray alloc] init];

for (NSString *typeString in types) {
UTType *utType = [UTType typeWithIdentifier:typeString];
if (utType) {
[utTypes addObject:utType];
}
}

pickerOptions.allowedTypes = [utTypes copy];
}

return pickerOptions;
}

+ (SaverOptions *)SaverOptions:(id)json
{
NSDictionary *options = [RCTConvert NSDictionary:json];
SaverOptions *saverOptions = [[SaverOptions alloc] init];

if (options[@"fileName"]) {
saverOptions.fileName = [RCTConvert NSString:options[@"fileName"]];
}

if (options[@"data"]) {
saverOptions.data = [RCTConvert NSString:options[@"data"]];
}

if (options[@"uri"]) {
saverOptions.uri = [RCTConvert NSString:options[@"uri"]];
}

return saverOptions;
}

@end
19 changes: 19 additions & 0 deletions packages/document-picker/macos/RNDocumentPicker.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
// LICENSE: see License.md in the package root


#ifdef RCT_NEW_ARCH_ENABLED
#import <rndocumentpickerCGen/rndocumentpickerCGen.h>
#else
#import <React/RCTBridgeModule.h>
#endif

@interface RNDocumentPicker : NSObject <
#ifdef RCT_NEW_ARCH_ENABLED
NativeDocumentPickerSpec
#else
RCTBridgeModule
#endif
>


@end
115 changes: 115 additions & 0 deletions packages/document-picker/macos/RNDocumentPicker.mm
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
// LICENSE: see License.md in the package root


#import "RNDocumentPicker.h"

#import "RCTConvert+RNDocumentPicker.h"
// this header file is generated by Xcode: https://developer.apple.com/documentation/swift/importing-swift-into-objective-c
// if it cannot be found, try cleaning the build folder and Xcode derived data folder

// Import Swift module header with multiple fallback options
#if __has_include("react_native_document_picker-Swift.h")
#import "react_native_document_picker-Swift.h"
#elif __has_include(<react_native_document_picker/react_native_document_picker-Swift.h>)
#import <react_native_document_picker/react_native_document_picker-Swift.h>
#elif __has_include("react-native-document-picker-Swift.h")
#import "react-native-document-picker-Swift.h"
#elif __has_include(<react-native-document-picker/react-native-document-picker-Swift.h>)
#import <react-native-document-picker/react-native-document-picker-Swift.h>
#else
#warning "Swift bridging header not found. Make sure Swift files are compiled and module is properly configured."
#endif

@interface RNDocumentPicker ()
@end

@implementation RNDocumentPicker {
DocPicker *docPicker;
DocSaver *docSaver;
}

- (instancetype)init {
if ((self = [super init])) {
docPicker = [DocPicker new];
docSaver = [DocSaver new];
}
return self;
}

+ (BOOL)requiresMainQueueSetup {
return NO;
}

RCT_EXPORT_MODULE()

RCT_EXPORT_METHOD(pick:
(NSDictionary *) options
resolve:
(RCTPromiseResolveBlock) resolve
reject:
(RCTPromiseRejectBlock) reject)
{
PickerOptions *pickerOptions = [RCTConvert PickerOptions:options];
[docPicker presentWithOptions:pickerOptions resolve:resolve reject:reject];
}

RCT_EXPORT_METHOD(pickDirectory:
(NSDictionary *) options
resolve:
(RCTPromiseResolveBlock) resolve
reject:
(RCTPromiseRejectBlock) reject)
{
PickerOptions *pickerOptions = [RCTConvert PickerOptions:options];
pickerOptions.isDirectoryPicker = YES;
[docPicker presentWithOptions:pickerOptions resolve:resolve reject:reject];
}

RCT_EXPORT_METHOD(saveDocument:
(NSDictionary *) options
resolve:
(RCTPromiseResolveBlock) resolve
reject:
(RCTPromiseRejectBlock) reject)
{
SaverOptions *saverOptions = [RCTConvert SaverOptions:options];
[docSaver presentWithOptions:saverOptions resolve:resolve reject:reject];
}

RCT_EXPORT_METHOD(releaseSecurityScopedResource:
(NSString *) uri
resolve:
(RCTPromiseResolveBlock) resolve
reject:
(RCTPromiseRejectBlock) reject)
{
NSURL *url = [NSURL URLWithString:uri];
if (url == nil) {
reject(@"INVALID_URI", @"Invalid URI provided", nil);
return;
}

[url stopAccessingSecurityScopedResource];
resolve(@(YES));
}

RCT_EXPORT_METHOD(isKnownType:
(NSString *) type
resolve:
(RCTPromiseResolveBlock) resolve
reject:
(RCTPromiseRejectBlock) reject)
{
BOOL isKnown = [IsKnownTypeImpl isKnownType:type];
resolve(@(isKnown));
}

#ifdef RCT_NEW_ARCH_ENABLED
- (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:
(const facebook::react::ObjCTurboModule::InitParams &)params
{
return std::make_shared<facebook::react::NativeDocumentPickerSpecJSI>(params);
}
#endif

@end
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
//
// react-native-document-picker-umbrella.h
// react-native-document-picker
//
// Created for module compatibility
//

#ifdef __OBJC__
#import <Foundation/Foundation.h>
#import <Cocoa/Cocoa.h>

#import "RNDocumentPicker.h"
#import "RCTConvert+RNDocumentPicker.h"

#endif

FOUNDATION_EXPORT double react_native_document_pickerVersionNumber;
FOUNDATION_EXPORT const unsigned char react_native_document_pickerVersionString[];
Loading