@onekeyfe/react-native-photo-library 0.0.0-stage → 3.0.166

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +27 -2
  3. package/ReactNativePhotoLibrary.podspec +36 -0
  4. package/android/CMakeLists.txt +24 -0
  5. package/android/build.gradle +132 -0
  6. package/android/gradle.properties +4 -0
  7. package/android/src/main/AndroidManifest.xml +1 -0
  8. package/android/src/main/cpp/cpp-adapter.cpp +6 -0
  9. package/android/src/main/java/com/margelo/nitro/reactnativephotolibrary/ImagePhotoLibrary.kt +207 -0
  10. package/android/src/main/java/com/margelo/nitro/reactnativephotolibrary/PhotoLibraryException.kt +12 -0
  11. package/android/src/main/java/com/margelo/nitro/reactnativephotolibrary/ReactNativePhotoLibrary.kt +11 -0
  12. package/android/src/main/java/com/margelo/nitro/reactnativephotolibrary/ReactNativePhotoLibraryPackage.kt +22 -0
  13. package/docs/SPEC.md +108 -0
  14. package/ios/ImagePhotoLibrary.swift +80 -0
  15. package/ios/PhotoLibraryError.swift +11 -0
  16. package/ios/ReactNativePhotoLibrary.swift +15 -0
  17. package/ios/tests/ImagePhotoLibraryTests.swift +44 -0
  18. package/lib/module/ReactNativePhotoLibrary.nitro.js +4 -0
  19. package/lib/module/ReactNativePhotoLibrary.nitro.js.map +1 -0
  20. package/lib/module/index.js +52 -0
  21. package/lib/module/index.js.map +1 -0
  22. package/lib/module/package.json +1 -0
  23. package/lib/typescript/package.json +1 -0
  24. package/lib/typescript/src/ReactNativePhotoLibrary.nitro.d.ts +15 -0
  25. package/lib/typescript/src/ReactNativePhotoLibrary.nitro.d.ts.map +1 -0
  26. package/lib/typescript/src/index.d.ts +18 -0
  27. package/lib/typescript/src/index.d.ts.map +1 -0
  28. package/nitro.json +17 -0
  29. package/nitrogen/generated/android/c++/JHybridReactNativePhotoLibrarySpec.cpp +105 -0
  30. package/nitrogen/generated/android/c++/JHybridReactNativePhotoLibrarySpec.hpp +65 -0
  31. package/nitrogen/generated/android/c++/JPhotoSavePermission.hpp +62 -0
  32. package/nitrogen/generated/android/c++/JPhotoSavePermissionStatus.hpp +61 -0
  33. package/nitrogen/generated/android/kotlin/com/margelo/nitro/reactnativephotolibrary/HybridReactNativePhotoLibrarySpec.kt +65 -0
  34. package/nitrogen/generated/android/kotlin/com/margelo/nitro/reactnativephotolibrary/PhotoSavePermission.kt +56 -0
  35. package/nitrogen/generated/android/kotlin/com/margelo/nitro/reactnativephotolibrary/PhotoSavePermissionStatus.kt +24 -0
  36. package/nitrogen/generated/android/kotlin/com/margelo/nitro/reactnativephotolibrary/reactnativephotolibraryOnLoad.kt +35 -0
  37. package/nitrogen/generated/android/reactnativephotolibrary+autolinking.cmake +81 -0
  38. package/nitrogen/generated/android/reactnativephotolibrary+autolinking.gradle +27 -0
  39. package/nitrogen/generated/android/reactnativephotolibraryOnLoad.cpp +54 -0
  40. package/nitrogen/generated/android/reactnativephotolibraryOnLoad.hpp +34 -0
  41. package/nitrogen/generated/ios/ReactNativePhotoLibrary+autolinking.rb +62 -0
  42. package/nitrogen/generated/ios/ReactNativePhotoLibrary-Swift-Cxx-Bridge.cpp +57 -0
  43. package/nitrogen/generated/ios/ReactNativePhotoLibrary-Swift-Cxx-Bridge.hpp +159 -0
  44. package/nitrogen/generated/ios/ReactNativePhotoLibrary-Swift-Cxx-Umbrella.hpp +51 -0
  45. package/nitrogen/generated/ios/ReactNativePhotoLibraryAutolinking.mm +33 -0
  46. package/nitrogen/generated/ios/ReactNativePhotoLibraryAutolinking.swift +26 -0
  47. package/nitrogen/generated/ios/c++/HybridReactNativePhotoLibrarySpecSwift.cpp +11 -0
  48. package/nitrogen/generated/ios/c++/HybridReactNativePhotoLibrarySpecSwift.hpp +104 -0
  49. package/nitrogen/generated/ios/swift/Func_void.swift +46 -0
  50. package/nitrogen/generated/ios/swift/Func_void_PhotoSavePermission.swift +46 -0
  51. package/nitrogen/generated/ios/swift/Func_void_std__exception_ptr.swift +46 -0
  52. package/nitrogen/generated/ios/swift/HybridReactNativePhotoLibrarySpec.swift +57 -0
  53. package/nitrogen/generated/ios/swift/HybridReactNativePhotoLibrarySpec_cxx.swift +183 -0
  54. package/nitrogen/generated/ios/swift/PhotoSavePermission.swift +34 -0
  55. package/nitrogen/generated/ios/swift/PhotoSavePermissionStatus.swift +44 -0
  56. package/nitrogen/generated/shared/c++/HybridReactNativePhotoLibrarySpec.cpp +23 -0
  57. package/nitrogen/generated/shared/c++/HybridReactNativePhotoLibrarySpec.hpp +67 -0
  58. package/nitrogen/generated/shared/c++/PhotoSavePermission.hpp +88 -0
  59. package/nitrogen/generated/shared/c++/PhotoSavePermissionStatus.hpp +80 -0
  60. package/package.json +171 -4
  61. package/src/ReactNativePhotoLibrary.nitro.ts +15 -0
  62. package/src/index.tsx +79 -0
@@ -0,0 +1,80 @@
1
+ import NitroModules
2
+ import Photos
3
+ import ImageIO
4
+ import UniformTypeIdentifiers
5
+
6
+ enum ImagePhotoLibrary {
7
+ private static let saveQueue = DispatchQueue(label: "onekey.image-photo-library.save", qos: .userInitiated)
8
+
9
+ static func permission() -> PhotoSavePermission {
10
+ return permission(for: PHPhotoLibrary.authorizationStatus(for: .addOnly))
11
+ }
12
+
13
+ static func permission(for status: PHAuthorizationStatus) -> PhotoSavePermission {
14
+ switch status {
15
+ case .authorized, .limited:
16
+ return PhotoSavePermission(status: .granted, canAskAgain: true)
17
+ case .notDetermined:
18
+ return PhotoSavePermission(status: .undetermined, canAskAgain: true)
19
+ case .denied, .restricted:
20
+ return PhotoSavePermission(status: .denied, canAskAgain: false)
21
+ @unknown default:
22
+ return PhotoSavePermission(status: .denied, canAskAgain: false)
23
+ }
24
+ }
25
+
26
+ static func requestPermission() -> Promise<PhotoSavePermission> {
27
+ let promise = Promise<PhotoSavePermission>()
28
+ DispatchQueue.main.async {
29
+ PHPhotoLibrary.requestAuthorization(for: .addOnly) { _ in
30
+ promise.resolve(withResult: permission())
31
+ }
32
+ }
33
+ return promise
34
+ }
35
+
36
+ static func fileURL(_ path: String) -> URL? {
37
+ if path.hasPrefix("/") { return URL(fileURLWithPath: path) }
38
+ guard path.hasPrefix("file://"), let url = URL(string: path), url.isFileURL,
39
+ url.host == nil || url.host == "" || url.host == "localhost" else { return nil }
40
+ return url
41
+ }
42
+
43
+ static func validateImage(at url: URL) throws {
44
+ let values = try? url.resourceValues(forKeys: [.fileSizeKey, .isRegularFileKey])
45
+ let size = values?.fileSize ?? 0
46
+ guard values?.isRegularFile == true, size > 0, size <= 64 * 1024 * 1024,
47
+ let source = CGImageSourceCreateWithURL(url as CFURL, [kCGImageSourceShouldCache: false] as CFDictionary),
48
+ let identifier = CGImageSourceGetType(source),
49
+ let type = UTType(identifier as String), type.conforms(to: .image),
50
+ let properties = CGImageSourceCopyPropertiesAtIndex(source, 0, nil) as? [CFString: Any],
51
+ let width = (properties[kCGImagePropertyPixelWidth] as? NSNumber)?.intValue,
52
+ let height = (properties[kCGImagePropertyPixelHeight] as? NSNumber)?.intValue,
53
+ width > 0, height > 0 else { throw PhotoLibraryError.noImageData }
54
+ }
55
+
56
+ static func save(path: String) -> Promise<Void> {
57
+ let promise = Promise<Void>()
58
+ saveQueue.async {
59
+ do {
60
+ guard permission().status == .granted else {
61
+ throw PhotoLibraryError.noLibraryPermission
62
+ }
63
+ guard let url = fileURL(path) else {
64
+ throw PhotoLibraryError.noImageData
65
+ }
66
+ try validateImage(at: url)
67
+ // Add a resource only. Never enumerate assets or read back the result.
68
+ try PHPhotoLibrary.shared().performChangesAndWait {
69
+ PHAssetCreationRequest.forAsset().addResource(with: .photo, fileURL: url, options: nil)
70
+ }
71
+ promise.resolve(withResult: ())
72
+ } catch let error as PhotoLibraryError {
73
+ promise.reject(withError: error)
74
+ } catch {
75
+ promise.reject(withError: PhotoLibraryError.cannotSaveImage)
76
+ }
77
+ }
78
+ return promise
79
+ }
80
+ }
@@ -0,0 +1,11 @@
1
+ import Foundation
2
+
3
+ struct PhotoLibraryError: Error, CustomStringConvertible {
4
+ let code: String
5
+ let message: String
6
+ var description: String { "\(code): \(message)" }
7
+
8
+ static let noImageData = PhotoLibraryError(code: "E_NO_IMAGE_DATA_FOUND", message: "Cannot find image data")
9
+ static let noLibraryPermission = PhotoLibraryError(code: "E_NO_LIBRARY_PERMISSION", message: "Adding photos is not authorized")
10
+ static let cannotSaveImage = PhotoLibraryError(code: "E_CANNOT_SAVE_IMAGE", message: "Cannot save image")
11
+ }
@@ -0,0 +1,15 @@
1
+ import NitroModules
2
+
3
+ class ReactNativePhotoLibrary: HybridReactNativePhotoLibrarySpec {
4
+ func getSavePermission() throws -> Promise<PhotoSavePermission> {
5
+ return Promise.parallel { ImagePhotoLibrary.permission() }
6
+ }
7
+
8
+ func requestSavePermission() throws -> Promise<PhotoSavePermission> {
9
+ return ImagePhotoLibrary.requestPermission()
10
+ }
11
+
12
+ func saveToLibrary(path: String) throws -> Promise<Void> {
13
+ return ImagePhotoLibrary.save(path: path)
14
+ }
15
+ }
@@ -0,0 +1,44 @@
1
+ import Photos
2
+ import UIKit
3
+ import XCTest
4
+
5
+ @testable import ReactNativePhotoLibrary
6
+
7
+ final class ImagePhotoLibraryTests: XCTestCase {
8
+ func testSaveAuthorizationDoesNotTreatDenialAsRequestable() {
9
+ XCTAssertEqual(ImagePhotoLibrary.permission(for: .notDetermined).status, .undetermined)
10
+ XCTAssertTrue(ImagePhotoLibrary.permission(for: .notDetermined).canAskAgain)
11
+ XCTAssertEqual(ImagePhotoLibrary.permission(for: .authorized).status, .granted)
12
+ for status in [PHAuthorizationStatus.denied, .restricted] {
13
+ let permission = ImagePhotoLibrary.permission(for: status)
14
+ XCTAssertEqual(permission.status, .denied)
15
+ XCTAssertFalse(permission.canAskAgain)
16
+ }
17
+ }
18
+
19
+ func testSaveInputValidationRejectsMissingNonImageAndOversizedFiles() throws {
20
+ let url = FileManager.default.temporaryDirectory.appendingPathComponent(UUID().uuidString)
21
+ defer { try? FileManager.default.removeItem(at: url) }
22
+ XCTAssertThrowsError(try ImagePhotoLibrary.validateImage(at: url))
23
+ try Data("not an image".utf8).write(to: url)
24
+ XCTAssertThrowsError(try ImagePhotoLibrary.validateImage(at: url))
25
+ let handle = try FileHandle(forWritingTo: url)
26
+ try handle.truncate(atOffset: 64 * 1024 * 1024 + 1)
27
+ try handle.close()
28
+ XCTAssertThrowsError(try ImagePhotoLibrary.validateImage(at: url))
29
+ }
30
+
31
+ func testSaveInputValidationAcceptsPNGAndRejectsRemoteURIs() throws {
32
+ let url = FileManager.default.temporaryDirectory.appendingPathComponent(UUID().uuidString + ".png")
33
+ defer { try? FileManager.default.removeItem(at: url) }
34
+ let data = UIGraphicsImageRenderer(size: CGSize(width: 8, height: 8)).pngData { context in
35
+ UIColor.red.setFill()
36
+ context.fill(CGRect(x: 0, y: 0, width: 8, height: 8))
37
+ }
38
+ try data.write(to: url)
39
+ XCTAssertNoThrow(try ImagePhotoLibrary.validateImage(at: url))
40
+ XCTAssertEqual(ImagePhotoLibrary.fileURL(url.absoluteString), url)
41
+ XCTAssertNil(ImagePhotoLibrary.fileURL("https://example.com/image.png"))
42
+ XCTAssertNil(ImagePhotoLibrary.fileURL("file://remote/path/image.png"))
43
+ }
44
+ }
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+
3
+ export {};
4
+ //# sourceMappingURL=ReactNativePhotoLibrary.nitro.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sourceRoot":"../../src","sources":["ReactNativePhotoLibrary.nitro.ts"],"mappings":"","ignoreList":[]}
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+
3
+ import { NitroModules } from 'react-native-nitro-modules';
4
+ let hybridObject;
5
+ function native() {
6
+ if (!hybridObject) {
7
+ hybridObject = NitroModules.createHybridObject('ReactNativePhotoLibrary');
8
+ }
9
+ return hybridObject;
10
+ }
11
+ const ERROR_CODES = ['E_NO_LIBRARY_PERMISSION', 'E_NO_IMAGE_DATA_FOUND', 'E_CANNOT_SAVE_IMAGE', 'E_PERMISSION_IN_PROGRESS', 'E_ACTIVITY_DOES_NOT_EXIST'];
12
+ export class PhotoLibraryError extends Error {
13
+ constructor(code, message) {
14
+ super(message);
15
+ this.name = 'PhotoLibraryError';
16
+ this.code = code;
17
+ }
18
+ }
19
+ function toError(error) {
20
+ if (error instanceof PhotoLibraryError) return error;
21
+ const message = error instanceof Error ? error.message : String(error);
22
+ const match = /\b(E_[A-Z_]+): (.*)/.exec(message);
23
+ const code = ERROR_CODES.find(value => value === match?.[1]);
24
+ return new PhotoLibraryError(code ?? 'E_UNKNOWN', code ? match?.[2]?.trim() ?? '' : 'Photo library operation failed');
25
+ }
26
+ export async function getSavePermission() {
27
+ try {
28
+ return await native().getSavePermission();
29
+ } catch (error) {
30
+ throw toError(error);
31
+ }
32
+ }
33
+ export async function requestSavePermission() {
34
+ try {
35
+ return await native().requestSavePermission();
36
+ } catch (error) {
37
+ throw toError(error);
38
+ }
39
+ }
40
+ export async function saveToLibrary(path) {
41
+ try {
42
+ await native().saveToLibrary(path);
43
+ } catch (error) {
44
+ throw toError(error);
45
+ }
46
+ }
47
+ export default {
48
+ getSavePermission,
49
+ requestSavePermission,
50
+ saveToLibrary
51
+ };
52
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["NitroModules","hybridObject","native","createHybridObject","ERROR_CODES","PhotoLibraryError","Error","constructor","code","message","name","toError","error","String","match","exec","find","value","trim","getSavePermission","requestSavePermission","saveToLibrary","path"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA,SAASA,YAAY,QAAQ,4BAA4B;AAYzD,IAAIC,YAAiD;AAErD,SAASC,MAAMA,CAAA,EAA4B;EACzC,IAAI,CAACD,YAAY,EAAE;IACjBA,YAAY,GAAGD,YAAY,CAACG,kBAAkB,CAC5C,yBACF,CAAC;EACH;EACA,OAAOF,YAAY;AACrB;AAEA,MAAMG,WAAW,GAAG,CAClB,yBAAyB,EACzB,uBAAuB,EACvB,qBAAqB,EACrB,0BAA0B,EAC1B,2BAA2B,CACnB;AAIV,OAAO,MAAMC,iBAAiB,SAASC,KAAK,CAAC;EAG3CC,WAAWA,CAACC,IAA2B,EAAEC,OAAe,EAAE;IACxD,KAAK,CAACA,OAAO,CAAC;IACd,IAAI,CAACC,IAAI,GAAG,mBAAmB;IAC/B,IAAI,CAACF,IAAI,GAAGA,IAAI;EAClB;AACF;AAEA,SAASG,OAAOA,CAACC,KAAc,EAAqB;EAClD,IAAIA,KAAK,YAAYP,iBAAiB,EAAE,OAAOO,KAAK;EACpD,MAAMH,OAAO,GAAGG,KAAK,YAAYN,KAAK,GAAGM,KAAK,CAACH,OAAO,GAAGI,MAAM,CAACD,KAAK,CAAC;EACtE,MAAME,KAAK,GAAG,qBAAqB,CAACC,IAAI,CAACN,OAAO,CAAC;EACjD,MAAMD,IAAI,GAAGJ,WAAW,CAACY,IAAI,CAAEC,KAAK,IAAKA,KAAK,KAAKH,KAAK,GAAG,CAAC,CAAC,CAAC;EAC9D,OAAO,IAAIT,iBAAiB,CAC1BG,IAAI,IAAI,WAAW,EACnBA,IAAI,GAAGM,KAAK,GAAG,CAAC,CAAC,EAAEI,IAAI,CAAC,CAAC,IAAI,EAAE,GAAG,gCACpC,CAAC;AACH;AAEA,OAAO,eAAeC,iBAAiBA,CAAA,EAAiC;EACtE,IAAI;IACF,OAAO,MAAMjB,MAAM,CAAC,CAAC,CAACiB,iBAAiB,CAAC,CAAC;EAC3C,CAAC,CAAC,OAAOP,KAAK,EAAE;IACd,MAAMD,OAAO,CAACC,KAAK,CAAC;EACtB;AACF;AAEA,OAAO,eAAeQ,qBAAqBA,CAAA,EAAiC;EAC1E,IAAI;IACF,OAAO,MAAMlB,MAAM,CAAC,CAAC,CAACkB,qBAAqB,CAAC,CAAC;EAC/C,CAAC,CAAC,OAAOR,KAAK,EAAE;IACd,MAAMD,OAAO,CAACC,KAAK,CAAC;EACtB;AACF;AAEA,OAAO,eAAeS,aAAaA,CAACC,IAAY,EAAiB;EAC/D,IAAI;IACF,MAAMpB,MAAM,CAAC,CAAC,CAACmB,aAAa,CAACC,IAAI,CAAC;EACpC,CAAC,CAAC,OAAOV,KAAK,EAAE;IACd,MAAMD,OAAO,CAACC,KAAK,CAAC;EACtB;AACF;AAEA,eAAe;EAAEO,iBAAiB;EAAEC,qBAAqB;EAAEC;AAAc,CAAC","ignoreList":[]}
@@ -0,0 +1 @@
1
+ {"type":"module"}
@@ -0,0 +1 @@
1
+ {"type":"module"}
@@ -0,0 +1,15 @@
1
+ import type { HybridObject } from 'react-native-nitro-modules';
2
+ export type PhotoSavePermissionStatus = 'granted' | 'denied' | 'undetermined';
3
+ export interface PhotoSavePermission {
4
+ status: PhotoSavePermissionStatus;
5
+ canAskAgain: boolean;
6
+ }
7
+ export interface ReactNativePhotoLibrary extends HybridObject<{
8
+ ios: 'swift';
9
+ android: 'kotlin';
10
+ }> {
11
+ getSavePermission(): Promise<PhotoSavePermission>;
12
+ requestSavePermission(): Promise<PhotoSavePermission>;
13
+ saveToLibrary(path: string): Promise<void>;
14
+ }
15
+ //# sourceMappingURL=ReactNativePhotoLibrary.nitro.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReactNativePhotoLibrary.nitro.d.ts","sourceRoot":"","sources":["../../../src/ReactNativePhotoLibrary.nitro.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE/D,MAAM,MAAM,yBAAyB,GAAG,SAAS,GAAG,QAAQ,GAAG,cAAc,CAAC;AAE9E,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,yBAAyB,CAAC;IAClC,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,uBACf,SAAQ,YAAY,CAAC;IAAE,GAAG,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,QAAQ,CAAA;CAAE,CAAC;IACzD,iBAAiB,IAAI,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAClD,qBAAqB,IAAI,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACtD,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5C"}
@@ -0,0 +1,18 @@
1
+ import type { PhotoSavePermission } from './ReactNativePhotoLibrary.nitro';
2
+ export type { PhotoSavePermission, PhotoSavePermissionStatus, } from './ReactNativePhotoLibrary.nitro';
3
+ declare const ERROR_CODES: readonly ["E_NO_LIBRARY_PERMISSION", "E_NO_IMAGE_DATA_FOUND", "E_CANNOT_SAVE_IMAGE", "E_PERMISSION_IN_PROGRESS", "E_ACTIVITY_DOES_NOT_EXIST"];
4
+ export type PhotoLibraryErrorCode = (typeof ERROR_CODES)[number] | 'E_UNKNOWN';
5
+ export declare class PhotoLibraryError extends Error {
6
+ readonly code: PhotoLibraryErrorCode;
7
+ constructor(code: PhotoLibraryErrorCode, message: string);
8
+ }
9
+ export declare function getSavePermission(): Promise<PhotoSavePermission>;
10
+ export declare function requestSavePermission(): Promise<PhotoSavePermission>;
11
+ export declare function saveToLibrary(path: string): Promise<void>;
12
+ declare const _default: {
13
+ getSavePermission: typeof getSavePermission;
14
+ requestSavePermission: typeof requestSavePermission;
15
+ saveToLibrary: typeof saveToLibrary;
16
+ };
17
+ export default _default;
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,mBAAmB,EAEpB,MAAM,iCAAiC,CAAC;AAEzC,YAAY,EACV,mBAAmB,EACnB,yBAAyB,GAC1B,MAAM,iCAAiC,CAAC;AAazC,QAAA,MAAM,WAAW,+IAMP,CAAC;AAEX,MAAM,MAAM,qBAAqB,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,GAAG,WAAW,CAAC;AAE/E,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,QAAQ,CAAC,IAAI,EAAE,qBAAqB,CAAC;gBAEzB,IAAI,EAAE,qBAAqB,EAAE,OAAO,EAAE,MAAM;CAKzD;AAaD,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,mBAAmB,CAAC,CAMtE;AAED,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,mBAAmB,CAAC,CAM1E;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAM/D;;;;;;AAED,wBAA2E"}
package/nitro.json ADDED
@@ -0,0 +1,17 @@
1
+ {
2
+ "cxxNamespace": ["reactnativephotolibrary"],
3
+ "ios": {
4
+ "iosModuleName": "ReactNativePhotoLibrary"
5
+ },
6
+ "android": {
7
+ "androidNamespace": ["reactnativephotolibrary"],
8
+ "androidCxxLibName": "reactnativephotolibrary"
9
+ },
10
+ "autolinking": {
11
+ "ReactNativePhotoLibrary": {
12
+ "swift": "ReactNativePhotoLibrary",
13
+ "kotlin": "ReactNativePhotoLibrary"
14
+ }
15
+ },
16
+ "ignorePaths": ["node_modules"]
17
+ }
@@ -0,0 +1,105 @@
1
+ ///
2
+ /// JHybridReactNativePhotoLibrarySpec.cpp
3
+ /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
4
+ /// https://github.com/mrousavy/nitro
5
+ /// Copyright © Marc Rousavy @ Margelo
6
+ ///
7
+
8
+ #include "JHybridReactNativePhotoLibrarySpec.hpp"
9
+
10
+ // Forward declaration of `PhotoSavePermission` to properly resolve imports.
11
+ namespace margelo::nitro::reactnativephotolibrary { struct PhotoSavePermission; }
12
+ // Forward declaration of `PhotoSavePermissionStatus` to properly resolve imports.
13
+ namespace margelo::nitro::reactnativephotolibrary { enum class PhotoSavePermissionStatus; }
14
+
15
+ #include "PhotoSavePermission.hpp"
16
+ #include <NitroModules/Promise.hpp>
17
+ #include <NitroModules/JPromise.hpp>
18
+ #include "JPhotoSavePermission.hpp"
19
+ #include "PhotoSavePermissionStatus.hpp"
20
+ #include "JPhotoSavePermissionStatus.hpp"
21
+ #include <NitroModules/JUnit.hpp>
22
+ #include <string>
23
+
24
+ namespace margelo::nitro::reactnativephotolibrary {
25
+
26
+ std::shared_ptr<JHybridReactNativePhotoLibrarySpec> JHybridReactNativePhotoLibrarySpec::JavaPart::getJHybridReactNativePhotoLibrarySpec() {
27
+ auto hybridObject = JHybridObject::JavaPart::getJHybridObject();
28
+ auto castHybridObject = std::dynamic_pointer_cast<JHybridReactNativePhotoLibrarySpec>(hybridObject);
29
+ if (castHybridObject == nullptr) [[unlikely]] {
30
+ throw std::runtime_error("Failed to downcast JHybridObject to JHybridReactNativePhotoLibrarySpec!");
31
+ }
32
+ return castHybridObject;
33
+ }
34
+
35
+ jni::local_ref<JHybridReactNativePhotoLibrarySpec::CxxPart::jhybriddata> JHybridReactNativePhotoLibrarySpec::CxxPart::initHybrid(jni::alias_ref<jhybridobject> jThis) {
36
+ return makeCxxInstance(jThis);
37
+ }
38
+
39
+ std::shared_ptr<JHybridObject> JHybridReactNativePhotoLibrarySpec::CxxPart::createHybridObject(const jni::local_ref<JHybridObject::JavaPart>& javaPart) {
40
+ auto castJavaPart = jni::dynamic_ref_cast<JHybridReactNativePhotoLibrarySpec::JavaPart>(javaPart);
41
+ if (castJavaPart == nullptr) [[unlikely]] {
42
+ throw std::runtime_error("Failed to cast JHybridObject::JavaPart to JHybridReactNativePhotoLibrarySpec::JavaPart!");
43
+ }
44
+ return std::make_shared<JHybridReactNativePhotoLibrarySpec>(castJavaPart);
45
+ }
46
+
47
+ void JHybridReactNativePhotoLibrarySpec::CxxPart::registerNatives() {
48
+ registerHybrid({
49
+ makeNativeMethod("initHybrid", JHybridReactNativePhotoLibrarySpec::CxxPart::initHybrid),
50
+ });
51
+ }
52
+
53
+ // Properties
54
+
55
+
56
+ // Methods
57
+ std::shared_ptr<Promise<PhotoSavePermission>> JHybridReactNativePhotoLibrarySpec::getSavePermission() {
58
+ static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JPromise::javaobject>()>("getSavePermission");
59
+ auto __result = method(_javaPart);
60
+ return [&]() {
61
+ auto __promise = Promise<PhotoSavePermission>::create();
62
+ __result->cthis()->addOnResolvedListener([=](const jni::alias_ref<jni::JObject>& __boxedResult) {
63
+ auto __result = jni::static_ref_cast<JPhotoSavePermission>(__boxedResult);
64
+ __promise->resolve(__result->toCpp());
65
+ });
66
+ __result->cthis()->addOnRejectedListener([=](const jni::alias_ref<jni::JThrowable>& __throwable) {
67
+ jni::JniException __jniError(__throwable);
68
+ __promise->reject(std::make_exception_ptr(__jniError));
69
+ });
70
+ return __promise;
71
+ }();
72
+ }
73
+ std::shared_ptr<Promise<PhotoSavePermission>> JHybridReactNativePhotoLibrarySpec::requestSavePermission() {
74
+ static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JPromise::javaobject>()>("requestSavePermission");
75
+ auto __result = method(_javaPart);
76
+ return [&]() {
77
+ auto __promise = Promise<PhotoSavePermission>::create();
78
+ __result->cthis()->addOnResolvedListener([=](const jni::alias_ref<jni::JObject>& __boxedResult) {
79
+ auto __result = jni::static_ref_cast<JPhotoSavePermission>(__boxedResult);
80
+ __promise->resolve(__result->toCpp());
81
+ });
82
+ __result->cthis()->addOnRejectedListener([=](const jni::alias_ref<jni::JThrowable>& __throwable) {
83
+ jni::JniException __jniError(__throwable);
84
+ __promise->reject(std::make_exception_ptr(__jniError));
85
+ });
86
+ return __promise;
87
+ }();
88
+ }
89
+ std::shared_ptr<Promise<void>> JHybridReactNativePhotoLibrarySpec::saveToLibrary(const std::string& path) {
90
+ static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JPromise::javaobject>(jni::alias_ref<jni::JString> /* path */)>("saveToLibrary");
91
+ auto __result = method(_javaPart, jni::make_jstring(path));
92
+ return [&]() {
93
+ auto __promise = Promise<void>::create();
94
+ __result->cthis()->addOnResolvedListener([=](const jni::alias_ref<jni::JObject>& /* unit */) {
95
+ __promise->resolve();
96
+ });
97
+ __result->cthis()->addOnRejectedListener([=](const jni::alias_ref<jni::JThrowable>& __throwable) {
98
+ jni::JniException __jniError(__throwable);
99
+ __promise->reject(std::make_exception_ptr(__jniError));
100
+ });
101
+ return __promise;
102
+ }();
103
+ }
104
+
105
+ } // namespace margelo::nitro::reactnativephotolibrary
@@ -0,0 +1,65 @@
1
+ ///
2
+ /// HybridReactNativePhotoLibrarySpec.hpp
3
+ /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
4
+ /// https://github.com/mrousavy/nitro
5
+ /// Copyright © Marc Rousavy @ Margelo
6
+ ///
7
+
8
+ #pragma once
9
+
10
+ #include <NitroModules/JHybridObject.hpp>
11
+ #include <fbjni/fbjni.h>
12
+ #include "HybridReactNativePhotoLibrarySpec.hpp"
13
+
14
+
15
+
16
+
17
+ namespace margelo::nitro::reactnativephotolibrary {
18
+
19
+ using namespace facebook;
20
+
21
+ class JHybridReactNativePhotoLibrarySpec: public virtual HybridReactNativePhotoLibrarySpec, public virtual JHybridObject {
22
+ public:
23
+ struct JavaPart: public jni::JavaClass<JavaPart, JHybridObject::JavaPart> {
24
+ static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/reactnativephotolibrary/HybridReactNativePhotoLibrarySpec;";
25
+ std::shared_ptr<JHybridReactNativePhotoLibrarySpec> getJHybridReactNativePhotoLibrarySpec();
26
+ };
27
+ struct CxxPart: public jni::HybridClass<CxxPart, JHybridObject::CxxPart> {
28
+ static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/reactnativephotolibrary/HybridReactNativePhotoLibrarySpec$CxxPart;";
29
+ static jni::local_ref<jhybriddata> initHybrid(jni::alias_ref<jhybridobject> jThis);
30
+ static void registerNatives();
31
+ using HybridBase::HybridBase;
32
+ protected:
33
+ std::shared_ptr<JHybridObject> createHybridObject(const jni::local_ref<JHybridObject::JavaPart>& javaPart) override;
34
+ };
35
+
36
+ public:
37
+ explicit JHybridReactNativePhotoLibrarySpec(const jni::local_ref<JHybridReactNativePhotoLibrarySpec::JavaPart>& javaPart):
38
+ HybridObject(HybridReactNativePhotoLibrarySpec::TAG),
39
+ JHybridObject(javaPart),
40
+ _javaPart(jni::make_global(javaPart)) {}
41
+ ~JHybridReactNativePhotoLibrarySpec() override {
42
+ // Hermes GC can destroy JS objects on a non-JNI Thread.
43
+ jni::ThreadScope::WithClassLoader([&] { _javaPart.reset(); });
44
+ }
45
+
46
+ public:
47
+ inline const jni::global_ref<JHybridReactNativePhotoLibrarySpec::JavaPart>& getJavaPart() const noexcept {
48
+ return _javaPart;
49
+ }
50
+
51
+ public:
52
+ // Properties
53
+
54
+
55
+ public:
56
+ // Methods
57
+ std::shared_ptr<Promise<PhotoSavePermission>> getSavePermission() override;
58
+ std::shared_ptr<Promise<PhotoSavePermission>> requestSavePermission() override;
59
+ std::shared_ptr<Promise<void>> saveToLibrary(const std::string& path) override;
60
+
61
+ private:
62
+ jni::global_ref<JHybridReactNativePhotoLibrarySpec::JavaPart> _javaPart;
63
+ };
64
+
65
+ } // namespace margelo::nitro::reactnativephotolibrary
@@ -0,0 +1,62 @@
1
+ ///
2
+ /// JPhotoSavePermission.hpp
3
+ /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
4
+ /// https://github.com/mrousavy/nitro
5
+ /// Copyright © Marc Rousavy @ Margelo
6
+ ///
7
+
8
+ #pragma once
9
+
10
+ #include <fbjni/fbjni.h>
11
+ #include "PhotoSavePermission.hpp"
12
+
13
+ #include "JPhotoSavePermissionStatus.hpp"
14
+ #include "PhotoSavePermissionStatus.hpp"
15
+
16
+ namespace margelo::nitro::reactnativephotolibrary {
17
+
18
+ using namespace facebook;
19
+
20
+ /**
21
+ * The C++ JNI bridge between the C++ struct "PhotoSavePermission" and the Kotlin data class "PhotoSavePermission".
22
+ */
23
+ struct JPhotoSavePermission final: public jni::JavaClass<JPhotoSavePermission> {
24
+ public:
25
+ static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/reactnativephotolibrary/PhotoSavePermission;";
26
+
27
+ public:
28
+ /**
29
+ * Convert this Java/Kotlin-based struct to the C++ struct PhotoSavePermission by copying all values to C++.
30
+ */
31
+ [[maybe_unused]]
32
+ [[nodiscard]]
33
+ PhotoSavePermission toCpp() const {
34
+ static const auto clazz = javaClassStatic();
35
+ static const auto fieldStatus = clazz->getField<JPhotoSavePermissionStatus>("status");
36
+ jni::local_ref<JPhotoSavePermissionStatus> status = this->getFieldValue(fieldStatus);
37
+ static const auto fieldCanAskAgain = clazz->getField<jboolean>("canAskAgain");
38
+ jboolean canAskAgain = this->getFieldValue(fieldCanAskAgain);
39
+ return PhotoSavePermission(
40
+ status->toCpp(),
41
+ static_cast<bool>(canAskAgain)
42
+ );
43
+ }
44
+
45
+ public:
46
+ /**
47
+ * Create a Java/Kotlin-based struct by copying all values from the given C++ struct to Java.
48
+ */
49
+ [[maybe_unused]]
50
+ static jni::local_ref<JPhotoSavePermission::javaobject> fromCpp(const PhotoSavePermission& value) {
51
+ using JSignature = JPhotoSavePermission(jni::alias_ref<JPhotoSavePermissionStatus>, jboolean);
52
+ static const auto clazz = javaClassStatic();
53
+ static const auto create = clazz->getStaticMethod<JSignature>("fromCpp");
54
+ return create(
55
+ clazz,
56
+ JPhotoSavePermissionStatus::fromCpp(value.status),
57
+ value.canAskAgain
58
+ );
59
+ }
60
+ };
61
+
62
+ } // namespace margelo::nitro::reactnativephotolibrary
@@ -0,0 +1,61 @@
1
+ ///
2
+ /// JPhotoSavePermissionStatus.hpp
3
+ /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
4
+ /// https://github.com/mrousavy/nitro
5
+ /// Copyright © Marc Rousavy @ Margelo
6
+ ///
7
+
8
+ #pragma once
9
+
10
+ #include <fbjni/fbjni.h>
11
+ #include "PhotoSavePermissionStatus.hpp"
12
+
13
+ namespace margelo::nitro::reactnativephotolibrary {
14
+
15
+ using namespace facebook;
16
+
17
+ /**
18
+ * The C++ JNI bridge between the C++ enum "PhotoSavePermissionStatus" and the Kotlin enum "PhotoSavePermissionStatus".
19
+ */
20
+ struct JPhotoSavePermissionStatus final: public jni::JavaClass<JPhotoSavePermissionStatus> {
21
+ public:
22
+ static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/reactnativephotolibrary/PhotoSavePermissionStatus;";
23
+
24
+ public:
25
+ /**
26
+ * Convert this Java/Kotlin-based enum to the C++ enum PhotoSavePermissionStatus.
27
+ */
28
+ [[maybe_unused]]
29
+ [[nodiscard]]
30
+ PhotoSavePermissionStatus toCpp() const {
31
+ static const auto clazz = javaClassStatic();
32
+ static const auto fieldOrdinal = clazz->getField<int>("value");
33
+ int ordinal = this->getFieldValue(fieldOrdinal);
34
+ return static_cast<PhotoSavePermissionStatus>(ordinal);
35
+ }
36
+
37
+ public:
38
+ /**
39
+ * Create a Java/Kotlin-based enum with the given C++ enum's value.
40
+ */
41
+ [[maybe_unused]]
42
+ static jni::alias_ref<JPhotoSavePermissionStatus> fromCpp(PhotoSavePermissionStatus value) {
43
+ static const auto clazz = javaClassStatic();
44
+ switch (value) {
45
+ case PhotoSavePermissionStatus::GRANTED:
46
+ static const auto fieldGRANTED = clazz->getStaticField<JPhotoSavePermissionStatus>("GRANTED");
47
+ return clazz->getStaticFieldValue(fieldGRANTED);
48
+ case PhotoSavePermissionStatus::DENIED:
49
+ static const auto fieldDENIED = clazz->getStaticField<JPhotoSavePermissionStatus>("DENIED");
50
+ return clazz->getStaticFieldValue(fieldDENIED);
51
+ case PhotoSavePermissionStatus::UNDETERMINED:
52
+ static const auto fieldUNDETERMINED = clazz->getStaticField<JPhotoSavePermissionStatus>("UNDETERMINED");
53
+ return clazz->getStaticFieldValue(fieldUNDETERMINED);
54
+ default:
55
+ std::string stringValue = std::to_string(static_cast<int>(value));
56
+ throw std::invalid_argument("Invalid enum value (" + stringValue + "!");
57
+ }
58
+ }
59
+ };
60
+
61
+ } // namespace margelo::nitro::reactnativephotolibrary
@@ -0,0 +1,65 @@
1
+ ///
2
+ /// HybridReactNativePhotoLibrarySpec.kt
3
+ /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
4
+ /// https://github.com/mrousavy/nitro
5
+ /// Copyright © Marc Rousavy @ Margelo
6
+ ///
7
+
8
+ package com.margelo.nitro.reactnativephotolibrary
9
+
10
+ import androidx.annotation.Keep
11
+ import com.facebook.jni.HybridData
12
+ import com.facebook.proguard.annotations.DoNotStrip
13
+ import dalvik.annotation.optimization.FastNative
14
+ import com.margelo.nitro.core.Promise
15
+ import com.margelo.nitro.core.HybridObject
16
+
17
+ /**
18
+ * A Kotlin class representing the ReactNativePhotoLibrary HybridObject.
19
+ * Implement this abstract class to create Kotlin-based instances of ReactNativePhotoLibrary.
20
+ */
21
+ @DoNotStrip
22
+ @Keep
23
+ @Suppress(
24
+ "KotlinJniMissingFunction", "unused",
25
+ "RedundantSuppression", "RedundantUnitReturnType", "SimpleRedundantLet",
26
+ "LocalVariableName", "PropertyName", "PrivatePropertyName", "FunctionName"
27
+ )
28
+ abstract class HybridReactNativePhotoLibrarySpec: HybridObject() {
29
+ // Properties
30
+
31
+
32
+ // Methods
33
+ @DoNotStrip
34
+ @Keep
35
+ abstract fun getSavePermission(): Promise<PhotoSavePermission>
36
+
37
+ @DoNotStrip
38
+ @Keep
39
+ abstract fun requestSavePermission(): Promise<PhotoSavePermission>
40
+
41
+ @DoNotStrip
42
+ @Keep
43
+ abstract fun saveToLibrary(path: String): Promise<Unit>
44
+
45
+ // Default implementation of `HybridObject.toString()`
46
+ override fun toString(): String {
47
+ return "[HybridObject ReactNativePhotoLibrary]"
48
+ }
49
+
50
+ // C++ backing class
51
+ @DoNotStrip
52
+ @Keep
53
+ protected open class CxxPart(javaPart: HybridReactNativePhotoLibrarySpec): HybridObject.CxxPart(javaPart) {
54
+ // C++ JHybridReactNativePhotoLibrarySpec::CxxPart::initHybrid(...)
55
+ @FastNative
56
+ external override fun initHybrid(): HybridData
57
+ }
58
+ override fun createCxxPart(): CxxPart {
59
+ return CxxPart(this)
60
+ }
61
+
62
+ companion object {
63
+ protected const val TAG = "HybridReactNativePhotoLibrarySpec"
64
+ }
65
+ }