Compare commits

..

2 Commits

Author SHA1 Message Date
Corbin Crutchley
bc4271a9ed refactor: initial work to support arbitrary file storage 2020-12-30 12:28:02 -08:00
Corbin Crutchley
29fe8091fc WIP: Initial work on adding a createFolder native method 2020-12-30 12:27:24 -08:00
3 changed files with 90 additions and 22 deletions

View File

@ -28,7 +28,5 @@ import {selectDirectory} from 'react-native-immersive-bars';
// ...
selectDirectory().then((path) => {
console.log(`The path is ${path}`);
});
selectDirectory((path) => console.log(`The path is ${path}`));
```

View File

@ -7,4 +7,9 @@ RCT_EXTERN_METHOD(pickFolder:
(RCTPromiseResolveBlock)resolve
rejecter:(RCTPromiseRejectBlock)reject)
RCT_EXTERN_METHOD(createFolder:
(NSString *)path
folderName:(NSString *)folderName
)
@end

View File

@ -6,42 +6,107 @@ class DirectoryPicker: NSObject, UIDocumentPickerDelegate {
var resolve: RCTPromiseResolveBlock? = nil;
var reject: RCTPromiseRejectBlock? = nil;
func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) {
let paths = urls.map({ $0.path })
resolve!(paths)
let url = urls[0]
// Start accessing a security-scoped resource.
guard url.startAccessingSecurityScopedResource() else {
// Handle the failure here.
return
}
// Make sure you release the security-scoped resource when you are done.
defer { url.stopAccessingSecurityScopedResource() }
do {
let bookmarkData = try url.bookmarkData(options: .minimalBookmark, includingResourceValuesForKeys: nil, relativeTo: nil)
let filename = getDocumentsDirectory().appendingPathComponent("test")
try bookmarkData.write(to: filename)
resolve!("")
} catch {
reject!(error.localizedDescription, error.localizedDescription, error)
}
}
func documentPickerWasCancelled(_ controller: UIDocumentPickerViewController) {
resolve!(nil);
}
@objc(pickFolder:rejecter:)
public func pickFolder(_ resolve: @escaping RCTPromiseResolveBlock, rejecter reject:@escaping RCTPromiseRejectBlock) -> Void {
self.resolve = resolve;
self.reject = reject;
DispatchQueue.main.async {
let documentPicker =
UIDocumentPickerViewController(documentTypes: [kUTTypeFolder as String],
in: .open)
documentPicker.delegate = self
UIDocumentPickerViewController(documentTypes: [kUTTypeFolder as String],
in: .open)
documentPicker.delegate = self
self.topMostViewController()?.present(documentPicker, animated: true, completion: nil)
}
}
@objc
fileprivate func topMostViewController() -> UIViewController? {
var ret: UIViewController? = UIApplication.shared.keyWindow?.rootViewController
repeat {
if let presented = ret?.presentedViewController {
ret = presented
} else {
break
}
} while(true)
return ret
}
var ret: UIViewController? = UIApplication.shared.keyWindow?.rootViewController
repeat {
if let presented = ret?.presentedViewController {
ret = presented
} else {
break
}
} while(true)
return ret
}
@objc
func getDocumentsDirectory() -> URL {
let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
return paths[0]
}
@objc
static func requiresMainQueueSetup() -> Bool {
return true
}
@objc(createFolder:folderName:)
public func createFolder(_ path: String, folderName: String) {
var url: URL? = nil
do {
let filename = getDocumentsDirectory().appendingPathComponent("test")
let bookmarkData = try Data(contentsOf: filename)
var isStale = false
url = try URL(resolvingBookmarkData: bookmarkData, bookmarkDataIsStale: &isStale)
} catch {
print(error.localizedDescription)
return
}
// let url = URL(fileURLWithPath: path);
// let needTo = url.startAccessingSecurityScopedResource()
guard url!.startAccessingSecurityScopedResource() else {
// Handle the failure here.
print("THERE WAS A FAILURE HERE")
return
}
defer { url!.stopAccessingSecurityScopedResource() }
let fileManager = FileManager.default
let filePath = url!.appendingPathComponent("\(folderName)")
do {
try fileManager.createDirectory(atPath: filePath.path, withIntermediateDirectories: true, attributes: nil)
} catch {
print(error.localizedDescription)
}
//
// if needTo {
// url.stopAccessingSecurityScopedResource()
// print("I am done")
// }
}
}