react-native-video-trim 3.0.10 → 4.1.0

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 (92) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +80 -63
  3. package/VideoTrim.podspec +24 -0
  4. package/android/CMakeLists.txt +24 -0
  5. package/android/build.gradle +82 -49
  6. package/android/gradle.properties +7 -5
  7. package/android/src/main/AndroidManifest.xml +4 -2
  8. package/android/src/main/cpp/cpp-adapter.cpp +6 -0
  9. package/android/src/main/java/com/margelo/nitro/videotrim/VideoTrim.kt +646 -0
  10. package/android/src/main/java/com/margelo/nitro/videotrim/VideoTrimPackage.kt +22 -0
  11. package/android/src/main/java/com/{videotrim → margelo/nitro/videotrim}/enums/ErrorCode.java +1 -1
  12. package/android/src/main/java/com/{videotrim → margelo/nitro/videotrim}/interfaces/IVideoTrimmerView.java +1 -1
  13. package/android/src/main/java/com/{videotrim → margelo/nitro/videotrim}/interfaces/VideoTrimListener.java +6 -5
  14. package/android/src/main/java/com/{videotrim → margelo/nitro/videotrim}/utils/MediaMetadataUtil.java +1 -1
  15. package/android/src/main/java/com/{videotrim → margelo/nitro/videotrim}/utils/StorageUtil.java +3 -1
  16. package/android/src/main/java/com/{videotrim → margelo/nitro/videotrim}/utils/VideoTrimmerUtil.java +51 -41
  17. package/android/src/main/java/com/{videotrim → margelo/nitro/videotrim}/widgets/VideoTrimmerView.java +45 -69
  18. package/ios/AssetLoader.swift +2 -2
  19. package/ios/ErrorCode.swift +2 -2
  20. package/ios/ProgressAlertController.swift +2 -2
  21. package/ios/VideoTrim.swift +52 -835
  22. package/ios/VideoTrimImpl.swift +957 -0
  23. package/ios/VideoTrimmer.swift +2 -3
  24. package/ios/VideoTrimmerThumb.swift +33 -26
  25. package/ios/VideoTrimmerViewController.swift +47 -28
  26. package/lib/module/VideoTrim.nitro.js +4 -0
  27. package/lib/module/VideoTrim.nitro.js.map +1 -0
  28. package/lib/module/index.js +98 -22
  29. package/lib/module/index.js.map +1 -1
  30. package/lib/module/package.json +1 -0
  31. package/lib/typescript/package.json +1 -0
  32. package/lib/typescript/{index.d.ts → src/VideoTrim.nitro.d.ts} +125 -134
  33. package/lib/typescript/src/VideoTrim.nitro.d.ts.map +1 -0
  34. package/lib/typescript/src/index.d.ts +49 -0
  35. package/lib/typescript/src/index.d.ts.map +1 -0
  36. package/nitrogen/generated/android/c++/JEditorConfig.hpp +237 -0
  37. package/nitrogen/generated/android/c++/JFileValidationResult.hpp +61 -0
  38. package/nitrogen/generated/android/c++/JFunc_void.hpp +74 -0
  39. package/nitrogen/generated/android/c++/JFunc_void_std__string_std__unordered_map_std__string__std__string_.hpp +89 -0
  40. package/nitrogen/generated/android/c++/JHybridVideoTrimSpec.cpp +151 -0
  41. package/nitrogen/generated/android/c++/JHybridVideoTrimSpec.hpp +68 -0
  42. package/nitrogen/generated/android/c++/JTrimOptions.hpp +109 -0
  43. package/nitrogen/generated/android/kotlin/com/margelo/nitro/videotrim/EditorConfig.kt +72 -0
  44. package/nitrogen/generated/android/kotlin/com/margelo/nitro/videotrim/FileValidationResult.kt +28 -0
  45. package/nitrogen/generated/android/kotlin/com/margelo/nitro/videotrim/Func_void.kt +80 -0
  46. package/nitrogen/generated/android/kotlin/com/margelo/nitro/videotrim/Func_void_std__string_std__unordered_map_std__string__std__string_.kt +80 -0
  47. package/nitrogen/generated/android/kotlin/com/margelo/nitro/videotrim/HybridVideoTrimSpec.kt +86 -0
  48. package/nitrogen/generated/android/kotlin/com/margelo/nitro/videotrim/TrimOptions.kt +40 -0
  49. package/nitrogen/generated/android/kotlin/com/margelo/nitro/videotrim/videotrimOnLoad.kt +35 -0
  50. package/nitrogen/generated/android/videotrim+autolinking.cmake +78 -0
  51. package/nitrogen/generated/android/videotrim+autolinking.gradle +27 -0
  52. package/nitrogen/generated/android/videotrimOnLoad.cpp +50 -0
  53. package/nitrogen/generated/android/videotrimOnLoad.hpp +25 -0
  54. package/nitrogen/generated/ios/VideoTrim+autolinking.rb +60 -0
  55. package/nitrogen/generated/ios/VideoTrim-Swift-Cxx-Bridge.cpp +96 -0
  56. package/nitrogen/generated/ios/VideoTrim-Swift-Cxx-Bridge.hpp +374 -0
  57. package/nitrogen/generated/ios/VideoTrim-Swift-Cxx-Umbrella.hpp +56 -0
  58. package/nitrogen/generated/ios/VideoTrimAutolinking.mm +33 -0
  59. package/nitrogen/generated/ios/VideoTrimAutolinking.swift +25 -0
  60. package/nitrogen/generated/ios/c++/HybridVideoTrimSpecSwift.cpp +11 -0
  61. package/nitrogen/generated/ios/c++/HybridVideoTrimSpecSwift.hpp +127 -0
  62. package/nitrogen/generated/ios/swift/EditorConfig.swift +541 -0
  63. package/nitrogen/generated/ios/swift/FileValidationResult.swift +57 -0
  64. package/nitrogen/generated/ios/swift/Func_void.swift +46 -0
  65. package/nitrogen/generated/ios/swift/Func_void_FileValidationResult.swift +46 -0
  66. package/nitrogen/generated/ios/swift/Func_void_bool.swift +46 -0
  67. package/nitrogen/generated/ios/swift/Func_void_double.swift +46 -0
  68. package/nitrogen/generated/ios/swift/Func_void_std__exception_ptr.swift +46 -0
  69. package/nitrogen/generated/ios/swift/Func_void_std__string.swift +46 -0
  70. package/nitrogen/generated/ios/swift/Func_void_std__string_std__unordered_map_std__string__std__string_.swift +54 -0
  71. package/nitrogen/generated/ios/swift/Func_void_std__vector_std__string_.swift +46 -0
  72. package/nitrogen/generated/ios/swift/HybridVideoTrimSpec.swift +54 -0
  73. package/nitrogen/generated/ios/swift/HybridVideoTrimSpec_cxx.swift +241 -0
  74. package/nitrogen/generated/ios/swift/TrimOptions.swift +189 -0
  75. package/nitrogen/generated/shared/c++/EditorConfig.hpp +253 -0
  76. package/nitrogen/generated/shared/c++/FileValidationResult.hpp +77 -0
  77. package/nitrogen/generated/shared/c++/HybridVideoTrimSpec.cpp +27 -0
  78. package/nitrogen/generated/shared/c++/HybridVideoTrimSpec.hpp +80 -0
  79. package/nitrogen/generated/shared/c++/TrimOptions.hpp +125 -0
  80. package/package.json +75 -71
  81. package/src/VideoTrim.nitro.ts +263 -0
  82. package/src/index.tsx +120 -257
  83. package/android/src/main/AndroidManifestDeprecated.xml +0 -3
  84. package/android/src/main/java/com/videotrim/VideoTrimModule.java +0 -603
  85. package/android/src/main/java/com/videotrim/VideoTrimPackage.java +0 -28
  86. package/ios/VideoTrim-Bridging-Header.h +0 -2
  87. package/ios/VideoTrim.mm +0 -17
  88. package/ios/VideoTrim.xcodeproj/project.pbxproj +0 -283
  89. package/lib/commonjs/index.js +0 -87
  90. package/lib/commonjs/index.js.map +0 -1
  91. package/lib/typescript/index.d.ts.map +0 -1
  92. package/react-native-video-trim.podspec +0 -43
@@ -0,0 +1,125 @@
1
+ ///
2
+ /// TrimOptions.hpp
3
+ /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
4
+ /// https://github.com/mrousavy/nitro
5
+ /// Copyright © 2025 Marc Rousavy @ Margelo
6
+ ///
7
+
8
+ #pragma once
9
+
10
+ #if __has_include(<NitroModules/JSIConverter.hpp>)
11
+ #include <NitroModules/JSIConverter.hpp>
12
+ #else
13
+ #error NitroModules cannot be found! Are you sure you installed NitroModules properly?
14
+ #endif
15
+ #if __has_include(<NitroModules/NitroDefines.hpp>)
16
+ #include <NitroModules/NitroDefines.hpp>
17
+ #else
18
+ #error NitroModules cannot be found! Are you sure you installed NitroModules properly?
19
+ #endif
20
+
21
+
22
+
23
+ #include <string>
24
+
25
+ namespace margelo::nitro::videotrim {
26
+
27
+ /**
28
+ * A struct which can be represented as a JavaScript object (TrimOptions).
29
+ */
30
+ struct TrimOptions {
31
+ public:
32
+ double startTime SWIFT_PRIVATE;
33
+ double endTime SWIFT_PRIVATE;
34
+ bool saveToPhoto SWIFT_PRIVATE;
35
+ std::string type SWIFT_PRIVATE;
36
+ std::string outputExt SWIFT_PRIVATE;
37
+ bool openDocumentsOnFinish SWIFT_PRIVATE;
38
+ bool openShareSheetOnFinish SWIFT_PRIVATE;
39
+ bool removeAfterSavedToPhoto SWIFT_PRIVATE;
40
+ bool removeAfterFailedToSavePhoto SWIFT_PRIVATE;
41
+ bool removeAfterSavedToDocuments SWIFT_PRIVATE;
42
+ bool removeAfterFailedToSaveDocuments SWIFT_PRIVATE;
43
+ bool removeAfterShared SWIFT_PRIVATE;
44
+ bool removeAfterFailedToShare SWIFT_PRIVATE;
45
+ bool enableRotation SWIFT_PRIVATE;
46
+ double rotationAngle SWIFT_PRIVATE;
47
+
48
+ public:
49
+ TrimOptions() = default;
50
+ explicit TrimOptions(double startTime, double endTime, bool saveToPhoto, std::string type, std::string outputExt, bool openDocumentsOnFinish, bool openShareSheetOnFinish, bool removeAfterSavedToPhoto, bool removeAfterFailedToSavePhoto, bool removeAfterSavedToDocuments, bool removeAfterFailedToSaveDocuments, bool removeAfterShared, bool removeAfterFailedToShare, bool enableRotation, double rotationAngle): startTime(startTime), endTime(endTime), saveToPhoto(saveToPhoto), type(type), outputExt(outputExt), openDocumentsOnFinish(openDocumentsOnFinish), openShareSheetOnFinish(openShareSheetOnFinish), removeAfterSavedToPhoto(removeAfterSavedToPhoto), removeAfterFailedToSavePhoto(removeAfterFailedToSavePhoto), removeAfterSavedToDocuments(removeAfterSavedToDocuments), removeAfterFailedToSaveDocuments(removeAfterFailedToSaveDocuments), removeAfterShared(removeAfterShared), removeAfterFailedToShare(removeAfterFailedToShare), enableRotation(enableRotation), rotationAngle(rotationAngle) {}
51
+ };
52
+
53
+ } // namespace margelo::nitro::videotrim
54
+
55
+ namespace margelo::nitro {
56
+
57
+ using namespace margelo::nitro::videotrim;
58
+
59
+ // C++ TrimOptions <> JS TrimOptions (object)
60
+ template <>
61
+ struct JSIConverter<TrimOptions> final {
62
+ static inline TrimOptions fromJSI(jsi::Runtime& runtime, const jsi::Value& arg) {
63
+ jsi::Object obj = arg.asObject(runtime);
64
+ return TrimOptions(
65
+ JSIConverter<double>::fromJSI(runtime, obj.getProperty(runtime, "startTime")),
66
+ JSIConverter<double>::fromJSI(runtime, obj.getProperty(runtime, "endTime")),
67
+ JSIConverter<bool>::fromJSI(runtime, obj.getProperty(runtime, "saveToPhoto")),
68
+ JSIConverter<std::string>::fromJSI(runtime, obj.getProperty(runtime, "type")),
69
+ JSIConverter<std::string>::fromJSI(runtime, obj.getProperty(runtime, "outputExt")),
70
+ JSIConverter<bool>::fromJSI(runtime, obj.getProperty(runtime, "openDocumentsOnFinish")),
71
+ JSIConverter<bool>::fromJSI(runtime, obj.getProperty(runtime, "openShareSheetOnFinish")),
72
+ JSIConverter<bool>::fromJSI(runtime, obj.getProperty(runtime, "removeAfterSavedToPhoto")),
73
+ JSIConverter<bool>::fromJSI(runtime, obj.getProperty(runtime, "removeAfterFailedToSavePhoto")),
74
+ JSIConverter<bool>::fromJSI(runtime, obj.getProperty(runtime, "removeAfterSavedToDocuments")),
75
+ JSIConverter<bool>::fromJSI(runtime, obj.getProperty(runtime, "removeAfterFailedToSaveDocuments")),
76
+ JSIConverter<bool>::fromJSI(runtime, obj.getProperty(runtime, "removeAfterShared")),
77
+ JSIConverter<bool>::fromJSI(runtime, obj.getProperty(runtime, "removeAfterFailedToShare")),
78
+ JSIConverter<bool>::fromJSI(runtime, obj.getProperty(runtime, "enableRotation")),
79
+ JSIConverter<double>::fromJSI(runtime, obj.getProperty(runtime, "rotationAngle"))
80
+ );
81
+ }
82
+ static inline jsi::Value toJSI(jsi::Runtime& runtime, const TrimOptions& arg) {
83
+ jsi::Object obj(runtime);
84
+ obj.setProperty(runtime, "startTime", JSIConverter<double>::toJSI(runtime, arg.startTime));
85
+ obj.setProperty(runtime, "endTime", JSIConverter<double>::toJSI(runtime, arg.endTime));
86
+ obj.setProperty(runtime, "saveToPhoto", JSIConverter<bool>::toJSI(runtime, arg.saveToPhoto));
87
+ obj.setProperty(runtime, "type", JSIConverter<std::string>::toJSI(runtime, arg.type));
88
+ obj.setProperty(runtime, "outputExt", JSIConverter<std::string>::toJSI(runtime, arg.outputExt));
89
+ obj.setProperty(runtime, "openDocumentsOnFinish", JSIConverter<bool>::toJSI(runtime, arg.openDocumentsOnFinish));
90
+ obj.setProperty(runtime, "openShareSheetOnFinish", JSIConverter<bool>::toJSI(runtime, arg.openShareSheetOnFinish));
91
+ obj.setProperty(runtime, "removeAfterSavedToPhoto", JSIConverter<bool>::toJSI(runtime, arg.removeAfterSavedToPhoto));
92
+ obj.setProperty(runtime, "removeAfterFailedToSavePhoto", JSIConverter<bool>::toJSI(runtime, arg.removeAfterFailedToSavePhoto));
93
+ obj.setProperty(runtime, "removeAfterSavedToDocuments", JSIConverter<bool>::toJSI(runtime, arg.removeAfterSavedToDocuments));
94
+ obj.setProperty(runtime, "removeAfterFailedToSaveDocuments", JSIConverter<bool>::toJSI(runtime, arg.removeAfterFailedToSaveDocuments));
95
+ obj.setProperty(runtime, "removeAfterShared", JSIConverter<bool>::toJSI(runtime, arg.removeAfterShared));
96
+ obj.setProperty(runtime, "removeAfterFailedToShare", JSIConverter<bool>::toJSI(runtime, arg.removeAfterFailedToShare));
97
+ obj.setProperty(runtime, "enableRotation", JSIConverter<bool>::toJSI(runtime, arg.enableRotation));
98
+ obj.setProperty(runtime, "rotationAngle", JSIConverter<double>::toJSI(runtime, arg.rotationAngle));
99
+ return obj;
100
+ }
101
+ static inline bool canConvert(jsi::Runtime& runtime, const jsi::Value& value) {
102
+ if (!value.isObject()) {
103
+ return false;
104
+ }
105
+ jsi::Object obj = value.getObject(runtime);
106
+ if (!JSIConverter<double>::canConvert(runtime, obj.getProperty(runtime, "startTime"))) return false;
107
+ if (!JSIConverter<double>::canConvert(runtime, obj.getProperty(runtime, "endTime"))) return false;
108
+ if (!JSIConverter<bool>::canConvert(runtime, obj.getProperty(runtime, "saveToPhoto"))) return false;
109
+ if (!JSIConverter<std::string>::canConvert(runtime, obj.getProperty(runtime, "type"))) return false;
110
+ if (!JSIConverter<std::string>::canConvert(runtime, obj.getProperty(runtime, "outputExt"))) return false;
111
+ if (!JSIConverter<bool>::canConvert(runtime, obj.getProperty(runtime, "openDocumentsOnFinish"))) return false;
112
+ if (!JSIConverter<bool>::canConvert(runtime, obj.getProperty(runtime, "openShareSheetOnFinish"))) return false;
113
+ if (!JSIConverter<bool>::canConvert(runtime, obj.getProperty(runtime, "removeAfterSavedToPhoto"))) return false;
114
+ if (!JSIConverter<bool>::canConvert(runtime, obj.getProperty(runtime, "removeAfterFailedToSavePhoto"))) return false;
115
+ if (!JSIConverter<bool>::canConvert(runtime, obj.getProperty(runtime, "removeAfterSavedToDocuments"))) return false;
116
+ if (!JSIConverter<bool>::canConvert(runtime, obj.getProperty(runtime, "removeAfterFailedToSaveDocuments"))) return false;
117
+ if (!JSIConverter<bool>::canConvert(runtime, obj.getProperty(runtime, "removeAfterShared"))) return false;
118
+ if (!JSIConverter<bool>::canConvert(runtime, obj.getProperty(runtime, "removeAfterFailedToShare"))) return false;
119
+ if (!JSIConverter<bool>::canConvert(runtime, obj.getProperty(runtime, "enableRotation"))) return false;
120
+ if (!JSIConverter<double>::canConvert(runtime, obj.getProperty(runtime, "rotationAngle"))) return false;
121
+ return true;
122
+ }
123
+ };
124
+
125
+ } // namespace margelo::nitro
package/package.json CHANGED
@@ -1,20 +1,26 @@
1
1
  {
2
2
  "name": "react-native-video-trim",
3
- "version": "3.0.10",
3
+ "version": "4.1.0",
4
4
  "description": "Video trimmer for your React Native app",
5
- "main": "lib/commonjs/index",
6
- "module": "lib/module/index",
7
- "types": "lib/typescript/index.d.ts",
8
- "react-native": "src/index",
9
- "source": "src/index",
5
+ "main": "./lib/module/index.js",
6
+ "types": "./lib/typescript/src/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "source": "./src/index.tsx",
10
+ "types": "./lib/typescript/src/index.d.ts",
11
+ "default": "./lib/module/index.js"
12
+ },
13
+ "./package.json": "./package.json"
14
+ },
10
15
  "files": [
11
16
  "src",
12
17
  "lib",
13
18
  "android",
14
19
  "ios",
15
20
  "cpp",
21
+ "nitrogen",
16
22
  "*.podspec",
17
- "!lib/typescript/example",
23
+ "react-native.config.js",
18
24
  "!ios/build",
19
25
  "!android/build",
20
26
  "!android/gradle",
@@ -27,24 +33,25 @@
27
33
  "!**/.*"
28
34
  ],
29
35
  "scripts": {
36
+ "example": "yarn workspace react-native-video-trim-example",
30
37
  "test": "jest",
31
- "typecheck": "tsc --noEmit",
38
+ "typecheck": "tsc",
32
39
  "lint": "eslint \"**/*.{js,ts,tsx}\"",
33
- "prepack": "bob build",
34
- "release": "release-it",
35
- "example": "yarn --cwd example",
36
- "build:android": "cd example/android && ./gradlew assembleDebug --no-daemon --console=plain -PreactNativeArchitectures=arm64-v8a",
37
- "build:ios": "cd example/ios && xcodebuild -workspace VideoTrimExample.xcworkspace -scheme VideoTrimExample -configuration Debug -sdk iphonesimulator CC=clang CPLUSPLUS=clang++ LD=clang LDPLUSPLUS=clang++ GCC_OPTIMIZATION_LEVEL=0 GCC_PRECOMPILE_PREFIX_HEADER=YES ASSETCATALOG_COMPILER_OPTIMIZATION=time DEBUG_INFORMATION_FORMAT=dwarf COMPILER_INDEX_STORE_ENABLE=NO",
38
- "bootstrap": "yarn example && yarn install && yarn example pods",
39
- "clean": "del-cli android/build example/android/build example/android/app/build example/ios/build"
40
+ "clean": "del-cli android/build example/android/build example/android/app/build example/ios/build lib",
41
+ "prepare": "bob build",
42
+ "nitrogen": "nitro-codegen",
43
+ "release": "release-it --only-version"
40
44
  },
41
45
  "keywords": [
42
46
  "react-native",
43
47
  "ios",
44
48
  "android"
45
49
  ],
46
- "repository": "https://github.com/maitrungduc1410/react-native-video-trim",
47
- "author": "Mai Trung Duc <maitrungduc1410@gmail.com> (https://github.com/maitrungduc1410)",
50
+ "repository": {
51
+ "type": "git",
52
+ "url": "git+https://github.com/maitrungduc1410/react-native-video-trim.git"
53
+ },
54
+ "author": "Duc Trung Mai <maitrungduc1410@gmail.com> (https://github.com/maitrungduc1410)",
48
55
  "license": "MIT",
49
56
  "bugs": {
50
57
  "url": "https://github.com/maitrungduc1410/react-native-video-trim/issues"
@@ -54,38 +61,41 @@
54
61
  "registry": "https://registry.npmjs.org/"
55
62
  },
56
63
  "devDependencies": {
57
- "@commitlint/config-conventional": "^17.0.2",
58
- "@evilmartians/lefthook": "^1.2.2",
59
- "@react-native-community/eslint-config": "^3.0.2",
60
- "@release-it/conventional-changelog": "^5.0.0",
61
- "@types/jest": "^28.1.2",
62
- "@types/react": "~17.0.21",
63
- "@types/react-native": "0.70.0",
64
- "commitlint": "^17.0.2",
65
- "del-cli": "^5.0.0",
66
- "eslint": "^8.4.1",
67
- "eslint-config-prettier": "^8.5.0",
68
- "eslint-plugin-prettier": "^4.0.0",
69
- "jest": "^28.1.1",
70
- "pod-install": "^0.1.0",
71
- "prettier": "^2.0.5",
72
- "react": "18.2.0",
73
- "react-native": "0.72.3",
74
- "react-native-builder-bob": "^0.20.0",
75
- "release-it": "^15.0.0",
64
+ "@commitlint/config-conventional": "^19.6.0",
65
+ "@eslint/compat": "^1.2.7",
66
+ "@eslint/eslintrc": "^3.3.0",
67
+ "@eslint/js": "^9.22.0",
68
+ "@evilmartians/lefthook": "^1.5.0",
69
+ "@react-native/babel-preset": "0.79.2",
70
+ "@react-native/eslint-config": "^0.78.0",
71
+ "@release-it/conventional-changelog": "^9.0.2",
72
+ "@types/jest": "^29.5.5",
73
+ "@types/react": "^19.0.0",
74
+ "commitlint": "^19.6.1",
75
+ "del-cli": "^5.1.0",
76
+ "eslint": "^9.22.0",
77
+ "eslint-config-prettier": "^10.1.1",
78
+ "eslint-plugin-prettier": "^5.2.3",
79
+ "jest": "^29.7.0",
80
+ "nitro-codegen": "^0.25.2",
81
+ "prettier": "^3.0.3",
82
+ "react": "19.0.0",
83
+ "react-native": "0.79.2",
84
+ "react-native-builder-bob": "^0.40.11",
85
+ "react-native-nitro-modules": "^0.25.2",
86
+ "release-it": "^17.10.0",
76
87
  "turbo": "^1.10.7",
77
- "typescript": "^5.0.2"
78
- },
79
- "resolutions": {
80
- "@types/react": "17.0.21"
88
+ "typescript": "^5.8.3"
81
89
  },
82
90
  "peerDependencies": {
83
91
  "react": "*",
84
- "react-native": "*"
85
- },
86
- "engines": {
87
- "node": ">= 16.0.0"
92
+ "react-native": "*",
93
+ "react-native-nitro-modules": "^0.25.2"
88
94
  },
95
+ "workspaces": [
96
+ "example"
97
+ ],
98
+ "packageManager": "yarn@3.6.1",
89
99
  "jest": {
90
100
  "preset": "react-native",
91
101
  "modulePathIgnorePatterns": [
@@ -111,33 +121,12 @@
111
121
  },
112
122
  "plugins": {
113
123
  "@release-it/conventional-changelog": {
114
- "preset": "angular"
115
- }
116
- }
117
- },
118
- "eslintConfig": {
119
- "root": true,
120
- "extends": [
121
- "@react-native-community",
122
- "prettier"
123
- ],
124
- "rules": {
125
- "prettier/prettier": [
126
- "error",
127
- {
128
- "quoteProps": "consistent",
129
- "singleQuote": true,
130
- "tabWidth": 2,
131
- "trailingComma": "es5",
132
- "useTabs": false
124
+ "preset": {
125
+ "name": "angular"
133
126
  }
134
- ]
127
+ }
135
128
  }
136
129
  },
137
- "eslintIgnore": [
138
- "node_modules/",
139
- "lib/"
140
- ],
141
130
  "prettier": {
142
131
  "quoteProps": "consistent",
143
132
  "singleQuote": true,
@@ -149,8 +138,19 @@
149
138
  "source": "src",
150
139
  "output": "lib",
151
140
  "targets": [
152
- "commonjs",
153
- "module",
141
+ [
142
+ "custom",
143
+ {
144
+ "script": "nitrogen",
145
+ "clean": "nitrogen/"
146
+ }
147
+ ],
148
+ [
149
+ "module",
150
+ {
151
+ "esm": true
152
+ }
153
+ ],
154
154
  [
155
155
  "typescript",
156
156
  {
@@ -159,5 +159,9 @@
159
159
  ]
160
160
  ]
161
161
  },
162
- "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e"
162
+ "create-react-native-library": {
163
+ "languages": "kotlin-swift",
164
+ "type": "nitro-module",
165
+ "version": "0.50.3"
166
+ }
163
167
  }
@@ -0,0 +1,263 @@
1
+ import type { HybridObject } from 'react-native-nitro-modules';
2
+
3
+ export interface BaseOptions {
4
+ /**
5
+ * Save the output file to Photos Library. Only video is supported. Note that you have to make sure you have permission to save to Photos Library.
6
+ * @default false
7
+ */
8
+ saveToPhoto: boolean;
9
+ /**
10
+ * Type of the file to edit. If video file, recommend to use `video`. If audio file, recommend to use `audio`.
11
+ * @default "video"
12
+ */
13
+ type: string;
14
+ /**
15
+ * Output file extension. If video file, recommend to use `mp4` or `mov`. If audio file, recommend to use `wav` or `m4a`.
16
+ * @default "mp4"
17
+ * @example "mp4", "mov", "wav", "m4a", "3gp", "avi", "mkv", "flv", "wmv", "webm"
18
+ */
19
+ outputExt: string;
20
+ /**
21
+ * Whether to open Documents app after finish editing
22
+ * @default false
23
+ */
24
+ openDocumentsOnFinish: boolean;
25
+ /**
26
+ * Whether to open Share Sheet after finish editing
27
+ * @default false
28
+ */
29
+ openShareSheetOnFinish: boolean;
30
+ /**
31
+ * Remove the file after saved to Photos Library
32
+ * @default false
33
+ */
34
+ removeAfterSavedToPhoto: boolean;
35
+ /**
36
+ * Remove the file after failed to save to Photos Library
37
+ * @default false
38
+ */
39
+ removeAfterFailedToSavePhoto: boolean;
40
+ /**
41
+ * Remove the file after saved to Documents app
42
+ * @default false
43
+ */
44
+ removeAfterSavedToDocuments: boolean;
45
+ /**
46
+ * Remove the file after failed to save to Documents app
47
+ * @default false
48
+ */
49
+ removeAfterFailedToSaveDocuments: boolean;
50
+ /**
51
+ * Remove the file after shared to other apps. Currently only support iOS, on Android there's no way to detect if the file is shared or not.
52
+ * @default false
53
+ */
54
+ removeAfterShared: boolean;
55
+ /**
56
+ * Remove the file after failed to share to other apps. Currently only support iOS, on Android there's no way to detect if the file is shared or not.
57
+ * @default false
58
+ */
59
+ removeAfterFailedToShare: boolean;
60
+ /**
61
+ * Enable rotation
62
+ * @default false
63
+ */
64
+ enableRotation: boolean;
65
+ /**
66
+ * Rotation angle in degrees
67
+ * @default 0
68
+ */
69
+ rotationAngle: number;
70
+ }
71
+
72
+ export interface EditorConfig extends BaseOptions {
73
+ /**
74
+ * Enable haptic feedback
75
+ * @default true
76
+ */
77
+ enableHapticFeedback: boolean;
78
+ maxDuration: number;
79
+ /**
80
+ * Minimum duration for trimmer
81
+ * @default 1000
82
+ */
83
+ minDuration: number;
84
+ /**
85
+ * Cancel button text
86
+ * @default "Cancel"
87
+ */
88
+ cancelButtonText: string;
89
+ /**
90
+ * Save button text
91
+ * @default "Save"
92
+ */
93
+ saveButtonText: string;
94
+ /**
95
+ * Enable cancel dialog
96
+ * @default true
97
+ */
98
+ enableCancelDialog: boolean;
99
+ /**
100
+ * Cancel dialog title
101
+ * @default "Warning!"
102
+ */
103
+ cancelDialogTitle: string;
104
+ /**
105
+ * Cancel dialog message
106
+ * @default "Are you sure want to cancel?"
107
+ */
108
+ cancelDialogMessage: string;
109
+ /**
110
+ * Cancel dialog cancel text
111
+ * @default "Close"
112
+ */
113
+ cancelDialogCancelText: string;
114
+ /**
115
+ * Cancel dialog confirm text
116
+ * @default "Proceed"
117
+ */
118
+ cancelDialogConfirmText: string;
119
+ /**
120
+ * Enable save dialog
121
+ * @default true
122
+ */
123
+ enableSaveDialog: boolean;
124
+ /**
125
+ * Save dialog title
126
+ * @default "Confirmation!"
127
+ */
128
+ saveDialogTitle: string;
129
+ /**
130
+ * Save dialog message
131
+ * @default "Are you sure want to save?"
132
+ */
133
+ saveDialogMessage: string;
134
+ /**
135
+ * Save dialog cancel text
136
+ * @default "Close"
137
+ */
138
+ saveDialogCancelText: string;
139
+ /**
140
+ * Save dialog confirm text
141
+ * @default "Proceed"
142
+ */
143
+ saveDialogConfirmText: string;
144
+ /**
145
+ * Trimming text
146
+ * @default "Trimming video..."
147
+ */
148
+ trimmingText: string;
149
+ /**
150
+ * By default, on iOS the editor will be presented as a modal. If you want to present it as a full screen modal, set this to `true`.
151
+ * @default false
152
+ */
153
+ fullScreenModalIOS: boolean;
154
+ /**
155
+ * Whether to enable autoplay on load
156
+ */
157
+ autoplay: boolean;
158
+ /**
159
+ * Jump to position on load in milliseconds
160
+ * @default `undefined` (beginning of the video)
161
+ */
162
+ jumpToPositionOnLoad: number;
163
+ /**
164
+ * Whether to close the editor when finish editing
165
+ * @default true
166
+ */
167
+ closeWhenFinish: boolean;
168
+ /**
169
+ * Enable cancel trimming
170
+ * @default true
171
+ */
172
+ enableCancelTrimming: boolean;
173
+ /**
174
+ * Cancel trimming button text
175
+ * @default "Cancel"
176
+ */
177
+ cancelTrimmingButtonText: string;
178
+ /**
179
+ * Enable cancel trimming dialog
180
+ * @default true
181
+ */
182
+ enableCancelTrimmingDialog: boolean;
183
+ /**
184
+ * Cancel trimming dialog title
185
+ * @default "Warning!"
186
+ */
187
+ cancelTrimmingDialogTitle: string;
188
+ /**
189
+ * Cancel trimming dialog message
190
+ * @default "Are you sure want to cancel trimming?"
191
+ */
192
+ cancelTrimmingDialogMessage: string;
193
+ /**
194
+ * Cancel trimming dialog cancel text
195
+ * @default "Close"
196
+ */
197
+ cancelTrimmingDialogCancelText: string;
198
+ /**
199
+ * Cancel trimming dialog confirm text
200
+ * @default "Proceed"
201
+ */
202
+ cancelTrimmingDialogConfirmText: string;
203
+ /**
204
+ * Header text
205
+ */
206
+ headerText: string;
207
+ /**
208
+ * Header text size
209
+ * @default 16
210
+ */
211
+ headerTextSize: number;
212
+ /**
213
+ * Header text color
214
+ * @default white
215
+ */
216
+ headerTextColor: number;
217
+ /**
218
+ * Alert on fail to load media
219
+ * @default true
220
+ */
221
+ alertOnFailToLoad: boolean;
222
+ /**
223
+ * Alert on fail to load media title
224
+ * @default "Error"
225
+ */
226
+ alertOnFailTitle: string;
227
+ /**
228
+ * Alert on fail to load media message
229
+ * @default "Fail to load media. Possibly invalid file or no network connection"
230
+ */
231
+ alertOnFailMessage: string;
232
+ /**
233
+ * Alert on fail to load media close text
234
+ * @default "Close"
235
+ */
236
+ alertOnFailCloseText: string;
237
+ }
238
+
239
+ export interface TrimOptions extends BaseOptions {
240
+ startTime: number; // in milliseconds
241
+ endTime: number; // in milliseconds
242
+ }
243
+
244
+ export interface FileValidationResult {
245
+ isValid: boolean;
246
+ fileType: string;
247
+ duration: number;
248
+ }
249
+
250
+ export interface VideoTrim
251
+ extends HybridObject<{ ios: 'swift'; android: 'kotlin' }> {
252
+ showEditor(
253
+ filePath: string,
254
+ config: EditorConfig,
255
+ onEvent: (eventName: string, payload: Record<string, string>) => void // currently nitro modules will fail if there are 2 optional callbacks, to make if work, we need to pass the onEvent as the last parameter
256
+ ): void;
257
+ listFiles(): Promise<string[]>;
258
+ cleanFiles(): Promise<number>;
259
+ deleteFile(filePath: string): Promise<boolean>;
260
+ closeEditor(onComplete: () => void): void;
261
+ isValidFile(url: string): Promise<FileValidationResult>;
262
+ trim(url: string, options: TrimOptions): Promise<string>;
263
+ }