@technotoil/image-video-editor 0.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.
- package/ImageVideoEditor.podspec +21 -0
- package/README.md +136 -0
- package/android/build.gradle +76 -0
- package/android/gradle.properties +5 -0
- package/android/src/main/AndroidManifest.xml +13 -0
- package/android/src/main/java/com/technotoil/image_videoeditor/FrameGrabberModule.kt +67 -0
- package/android/src/main/java/com/technotoil/image_videoeditor/MediaEditorModule.kt +548 -0
- package/android/src/main/java/com/technotoil/image_videoeditor/MediaFileUtils.kt +29 -0
- package/android/src/main/java/com/technotoil/image_videoeditor/MediaLibraryModule.kt +305 -0
- package/android/src/main/java/com/technotoil/image_videoeditor/MediaPackage.kt +26 -0
- package/android/src/main/java/com/technotoil/image_videoeditor/MediaPickerModule.kt +111 -0
- package/android/src/main/java/com/technotoil/image_videoeditor/MediaPlayerModule.kt +34 -0
- package/android/src/main/java/com/technotoil/image_videoeditor/RNCameraViewManager.kt +761 -0
- package/android/src/main/java/com/technotoil/image_videoeditor/RNVideoPreviewManager.kt +317 -0
- package/ios/PrivacyInfo.xcprivacy +38 -0
- package/ios/RNCameraViewManager.m +420 -0
- package/ios/RNFrameGrabber.m +61 -0
- package/ios/RNMediaEditor.m +905 -0
- package/ios/RNMediaLibrary.m +389 -0
- package/ios/RNMediaPicker.m +144 -0
- package/ios/RNMediaPlayer.m +73 -0
- package/ios/RNVideoPreviewManager.m +263 -0
- package/ios/frames/film_vintage.png +0 -0
- package/ios/frames/floral_gold.png +0 -0
- package/ios/frames/minimal_double.png +0 -0
- package/ios/frames/polaroid_white.png +0 -0
- package/ios/frames/watercolor_floral.png +0 -0
- package/lib/module/assets/frames/film_vintage.png +0 -0
- package/lib/module/assets/frames/floral_gold.png +0 -0
- package/lib/module/assets/frames/minimal_double.png +0 -0
- package/lib/module/assets/frames/polaroid_white.png +0 -0
- package/lib/module/assets/frames/watercolor_floral.png +0 -0
- package/lib/module/components/VideoEditor.js +156 -0
- package/lib/module/components/VideoEditor.js.map +1 -0
- package/lib/module/index.js +4 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/native/CameraView.js +104 -0
- package/lib/module/native/CameraView.js.map +1 -0
- package/lib/module/native/FrameGrabber.js +13 -0
- package/lib/module/native/FrameGrabber.js.map +1 -0
- package/lib/module/native/MediaEditor.js +19 -0
- package/lib/module/native/MediaEditor.js.map +1 -0
- package/lib/module/native/MediaLibrary.js +37 -0
- package/lib/module/native/MediaLibrary.js.map +1 -0
- package/lib/module/native/MediaPicker.js +13 -0
- package/lib/module/native/MediaPicker.js.map +1 -0
- package/lib/module/native/MediaPlayer.js +13 -0
- package/lib/module/native/MediaPlayer.js.map +1 -0
- package/lib/module/native/VideoPreview.js +12 -0
- package/lib/module/native/VideoPreview.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/module/screens/CropScreen.js +1211 -0
- package/lib/module/screens/CropScreen.js.map +1 -0
- package/lib/module/screens/EditorScreen.js +5752 -0
- package/lib/module/screens/EditorScreen.js.map +1 -0
- package/lib/module/screens/ExportScreen.js +289 -0
- package/lib/module/screens/ExportScreen.js.map +1 -0
- package/lib/module/screens/GalleryScreen.js +505 -0
- package/lib/module/screens/GalleryScreen.js.map +1 -0
- package/lib/module/screens/PickScreen.js +1195 -0
- package/lib/module/screens/PickScreen.js.map +1 -0
- package/lib/module/types.js +2 -0
- package/lib/module/types.js.map +1 -0
- package/lib/typescript/src/components/VideoEditor.d.ts +13 -0
- package/lib/typescript/src/index.d.ts +2 -0
- package/lib/typescript/src/native/CameraView.d.ts +23 -0
- package/lib/typescript/src/native/FrameGrabber.d.ts +2 -0
- package/lib/typescript/src/native/MediaEditor.d.ts +3 -0
- package/lib/typescript/src/native/MediaLibrary.d.ts +16 -0
- package/lib/typescript/src/native/MediaPicker.d.ts +2 -0
- package/lib/typescript/src/native/MediaPlayer.d.ts +1 -0
- package/lib/typescript/src/native/VideoPreview.d.ts +19 -0
- package/lib/typescript/src/screens/CropScreen.d.ts +9 -0
- package/lib/typescript/src/screens/EditorScreen.d.ts +10 -0
- package/lib/typescript/src/screens/ExportScreen.d.ts +9 -0
- package/lib/typescript/src/screens/GalleryScreen.d.ts +8 -0
- package/lib/typescript/src/screens/PickScreen.d.ts +13 -0
- package/lib/typescript/src/types.d.ts +58 -0
- package/package.json +101 -0
- package/src/assets/frames/film_vintage.png +0 -0
- package/src/assets/frames/floral_gold.png +0 -0
- package/src/assets/frames/minimal_double.png +0 -0
- package/src/assets/frames/polaroid_white.png +0 -0
- package/src/assets/frames/watercolor_floral.png +0 -0
- package/src/components/VideoEditor.tsx +182 -0
- package/src/index.tsx +2 -0
- package/src/native/CameraView.tsx +95 -0
- package/src/native/FrameGrabber.ts +21 -0
- package/src/native/MediaEditor.ts +33 -0
- package/src/native/MediaLibrary.ts +69 -0
- package/src/native/MediaPicker.ts +17 -0
- package/src/native/MediaPlayer.ts +16 -0
- package/src/native/VideoPreview.tsx +20 -0
- package/src/screens/CropScreen.tsx +968 -0
- package/src/screens/EditorScreen.tsx +4517 -0
- package/src/screens/ExportScreen.tsx +282 -0
- package/src/screens/GalleryScreen.tsx +412 -0
- package/src/screens/PickScreen.tsx +1094 -0
- package/src/types.ts +58 -0
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
#import <React/RCTViewManager.h>
|
|
2
|
+
#import <React/RCTConvert.h>
|
|
3
|
+
#import <React/RCTEventEmitter.h>
|
|
4
|
+
#import <AVFoundation/AVFoundation.h>
|
|
5
|
+
|
|
6
|
+
@interface RNVideoPreviewView : UIView
|
|
7
|
+
|
|
8
|
+
@property(nonatomic, strong) AVPlayer *player;
|
|
9
|
+
@property(nonatomic, strong) AVPlayerLayer *playerLayer;
|
|
10
|
+
@property(nonatomic, strong) id timeObserver;
|
|
11
|
+
@property(nonatomic, copy) NSString *uri;
|
|
12
|
+
@property(nonatomic, assign) BOOL paused;
|
|
13
|
+
@property(nonatomic, assign) BOOL muted;
|
|
14
|
+
@property(nonatomic, copy) NSString *resizeMode;
|
|
15
|
+
@property(nonatomic, assign) int trimStartMs;
|
|
16
|
+
@property(nonatomic, assign) int trimEndMs;
|
|
17
|
+
@property(nonatomic, assign) int seekToMs;
|
|
18
|
+
@property(nonatomic, copy) RCTBubblingEventBlock onChange;
|
|
19
|
+
|
|
20
|
+
// internal flag: player item is ready
|
|
21
|
+
@property(nonatomic, assign) BOOL isPlayerReady;
|
|
22
|
+
|
|
23
|
+
@end
|
|
24
|
+
|
|
25
|
+
@implementation RNVideoPreviewView
|
|
26
|
+
|
|
27
|
+
- (instancetype)initWithFrame:(CGRect)frame {
|
|
28
|
+
if (self = [super initWithFrame:frame]) {
|
|
29
|
+
_trimStartMs = 0;
|
|
30
|
+
_trimEndMs = 0;
|
|
31
|
+
_seekToMs = -1;
|
|
32
|
+
_isPlayerReady = NO;
|
|
33
|
+
|
|
34
|
+
self.player = [[AVPlayer alloc] init];
|
|
35
|
+
self.player.actionAtItemEnd = AVPlayerActionAtItemEndNone;
|
|
36
|
+
self.playerLayer = [AVPlayerLayer playerLayerWithPlayer:self.player];
|
|
37
|
+
self.playerLayer.videoGravity = AVLayerVideoGravityResizeAspect;
|
|
38
|
+
[self.layer addSublayer:self.playerLayer];
|
|
39
|
+
|
|
40
|
+
// Loop + trim boundary observer
|
|
41
|
+
[[NSNotificationCenter defaultCenter] addObserver:self
|
|
42
|
+
selector:@selector(playerItemDidEnd:)
|
|
43
|
+
name:AVPlayerItemDidPlayToEndTimeNotification
|
|
44
|
+
object:nil];
|
|
45
|
+
}
|
|
46
|
+
return self;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
- (void)dealloc {
|
|
50
|
+
[[NSNotificationCenter defaultCenter] removeObserver:self];
|
|
51
|
+
[self removePeriodicObserver];
|
|
52
|
+
if (self.player.currentItem) {
|
|
53
|
+
[self.player.currentItem removeObserver:self forKeyPath:@"status"];
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
- (void)layoutSubviews {
|
|
58
|
+
[super layoutSubviews];
|
|
59
|
+
self.playerLayer.frame = self.bounds;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// ─── URI ─────────────────────────────────────────────────────────────────────
|
|
63
|
+
|
|
64
|
+
- (void)setUri:(NSString *)uri {
|
|
65
|
+
NSLog(@"[RNVideoPreview] setUri called with: %@", uri);
|
|
66
|
+
if ([_uri isEqualToString:uri]) return;
|
|
67
|
+
_uri = [uri copy];
|
|
68
|
+
if (!_uri || _uri.length == 0) {
|
|
69
|
+
NSLog(@"[RNVideoPreview] Uri is empty or nil, resetting player");
|
|
70
|
+
if (self.player.currentItem) {
|
|
71
|
+
[self.player.currentItem removeObserver:self forKeyPath:@"status"];
|
|
72
|
+
}
|
|
73
|
+
[self.player replaceCurrentItemWithPlayerItem:nil];
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Remove old KVO
|
|
78
|
+
if (self.player.currentItem) {
|
|
79
|
+
[self.player.currentItem removeObserver:self forKeyPath:@"status"];
|
|
80
|
+
}
|
|
81
|
+
[self removePeriodicObserver];
|
|
82
|
+
_isPlayerReady = NO;
|
|
83
|
+
|
|
84
|
+
NSURL *url = [RCTConvert NSURL:_uri];
|
|
85
|
+
if (!url) {
|
|
86
|
+
NSLog(@"[RNVideoPreview] Failed to convert uri to NSURL: %@", _uri);
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
NSLog(@"[RNVideoPreview] Resolved NSURL: %@, scheme: %@", url, url.scheme);
|
|
90
|
+
|
|
91
|
+
AVPlayerItem *item = [AVPlayerItem playerItemWithURL:url];
|
|
92
|
+
[item addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:nil];
|
|
93
|
+
[self.player replaceCurrentItemWithPlayerItem:item];
|
|
94
|
+
self.player.muted = self.muted;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// ─── KVO: player item status ──────────────────────────────────────────────────
|
|
98
|
+
|
|
99
|
+
- (void)observeValueForKeyPath:(NSString *)keyPath
|
|
100
|
+
ofObject:(id)object
|
|
101
|
+
change:(NSDictionary *)change
|
|
102
|
+
context:(void *)context {
|
|
103
|
+
if ([keyPath isEqualToString:@"status"]) {
|
|
104
|
+
AVPlayerItem *item = (AVPlayerItem *)object;
|
|
105
|
+
if (item.status == AVPlayerItemStatusReadyToPlay) {
|
|
106
|
+
_isPlayerReady = YES;
|
|
107
|
+
NSLog(@"[RNVideoPreview] Player ready, paused=%d trimStart=%d", self.paused, self.trimStartMs);
|
|
108
|
+
|
|
109
|
+
// Seek to trim start first, then play if not paused
|
|
110
|
+
if (self.trimStartMs > 0) {
|
|
111
|
+
CMTime seekTime = CMTimeMakeWithSeconds(self.trimStartMs / 1000.0, NSEC_PER_SEC);
|
|
112
|
+
[self.player seekToTime:seekTime toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero completionHandler:^(BOOL finished) {
|
|
113
|
+
if (!self.paused) {
|
|
114
|
+
[self.player play];
|
|
115
|
+
}
|
|
116
|
+
}];
|
|
117
|
+
} else {
|
|
118
|
+
if (!self.paused) {
|
|
119
|
+
[self.player play];
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
[self startPeriodicObserver];
|
|
124
|
+
} else if (item.status == AVPlayerItemStatusFailed) {
|
|
125
|
+
NSLog(@"[RNVideoPreview] Player item failed: %@. Error description: %@, code: %ld, domain: %@",
|
|
126
|
+
item.error, item.error.localizedDescription, (long)item.error.code, item.error.domain);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// ─── PERIODIC PROGRESS OBSERVER ──────────────────────────────────────────────
|
|
132
|
+
|
|
133
|
+
- (void)startPeriodicObserver {
|
|
134
|
+
[self removePeriodicObserver];
|
|
135
|
+
__weak typeof(self) weakSelf = self;
|
|
136
|
+
CMTime interval = CMTimeMakeWithSeconds(0.1, NSEC_PER_SEC);
|
|
137
|
+
self.timeObserver = [self.player addPeriodicTimeObserverForInterval:interval
|
|
138
|
+
queue:dispatch_get_main_queue()
|
|
139
|
+
usingBlock:^(CMTime time) {
|
|
140
|
+
__strong typeof(weakSelf) strongSelf = weakSelf;
|
|
141
|
+
if (!strongSelf) return;
|
|
142
|
+
|
|
143
|
+
double currentSec = CMTimeGetSeconds(time);
|
|
144
|
+
int currentMs = (int)(currentSec * 1000.0);
|
|
145
|
+
|
|
146
|
+
// Trim boundary enforcement
|
|
147
|
+
if (strongSelf.trimEndMs > 0 && currentMs >= strongSelf.trimEndMs) {
|
|
148
|
+
CMTime trimStart = CMTimeMakeWithSeconds(strongSelf.trimStartMs / 1000.0, NSEC_PER_SEC);
|
|
149
|
+
[strongSelf.player seekToTime:trimStart toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero completionHandler:^(BOOL finished) {
|
|
150
|
+
if (!strongSelf.paused) {
|
|
151
|
+
[strongSelf.player play];
|
|
152
|
+
}
|
|
153
|
+
}];
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// Emit onChange
|
|
158
|
+
if (strongSelf.onChange) {
|
|
159
|
+
strongSelf.onChange(@{ @"currentTimeMs": @(currentMs) });
|
|
160
|
+
}
|
|
161
|
+
}];
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
- (void)removePeriodicObserver {
|
|
165
|
+
if (self.timeObserver) {
|
|
166
|
+
[self.player removeTimeObserver:self.timeObserver];
|
|
167
|
+
self.timeObserver = nil;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// ─── LOOP ─────────────────────────────────────────────────────────────────────
|
|
172
|
+
|
|
173
|
+
- (void)playerItemDidEnd:(NSNotification *)note {
|
|
174
|
+
if (note.object == self.player.currentItem) {
|
|
175
|
+
CMTime seekTime = CMTimeMakeWithSeconds(self.trimStartMs / 1000.0, NSEC_PER_SEC);
|
|
176
|
+
[self.player seekToTime:seekTime toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero completionHandler:^(BOOL finished) {
|
|
177
|
+
if (!self.paused) {
|
|
178
|
+
[self.player play];
|
|
179
|
+
}
|
|
180
|
+
}];
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
// ─── PROPS ────────────────────────────────────────────────────────────────────
|
|
185
|
+
|
|
186
|
+
- (void)setPaused:(BOOL)paused {
|
|
187
|
+
_paused = paused;
|
|
188
|
+
NSLog(@"[RNVideoPreview] setPaused=%d isReady=%d", paused, _isPlayerReady);
|
|
189
|
+
if (paused) {
|
|
190
|
+
[self.player pause];
|
|
191
|
+
} else {
|
|
192
|
+
if (_isPlayerReady) {
|
|
193
|
+
[self.player play];
|
|
194
|
+
}
|
|
195
|
+
// If not ready yet, onPrepared (KVO) will auto-play when ready
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
- (void)setMuted:(BOOL)muted {
|
|
200
|
+
_muted = muted;
|
|
201
|
+
self.player.muted = muted;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
- (void)setResizeMode:(NSString *)resizeMode {
|
|
205
|
+
_resizeMode = [resizeMode copy];
|
|
206
|
+
if ([_resizeMode isEqualToString:@"contain"]) {
|
|
207
|
+
self.playerLayer.videoGravity = AVLayerVideoGravityResizeAspect;
|
|
208
|
+
} else if ([_resizeMode isEqualToString:@"stretch"]) {
|
|
209
|
+
self.playerLayer.videoGravity = AVLayerVideoGravityResize;
|
|
210
|
+
} else {
|
|
211
|
+
self.playerLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
- (void)setTrimStartMs:(int)trimStartMs {
|
|
216
|
+
_trimStartMs = trimStartMs;
|
|
217
|
+
// If current position is before trim start, seek forward
|
|
218
|
+
if (_isPlayerReady) {
|
|
219
|
+
double current = CMTimeGetSeconds(self.player.currentTime) * 1000.0;
|
|
220
|
+
if (current < trimStartMs) {
|
|
221
|
+
CMTime t = CMTimeMakeWithSeconds(trimStartMs / 1000.0, NSEC_PER_SEC);
|
|
222
|
+
[self.player seekToTime:t toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero];
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
- (void)setTrimEndMs:(int)trimEndMs {
|
|
228
|
+
_trimEndMs = trimEndMs;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
- (void)setSeekToMs:(int)seekToMs {
|
|
232
|
+
_seekToMs = seekToMs;
|
|
233
|
+
if (seekToMs >= 0 && _isPlayerReady) {
|
|
234
|
+
CMTime t = CMTimeMakeWithSeconds(seekToMs / 1000.0, NSEC_PER_SEC);
|
|
235
|
+
[self.player seekToTime:t toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero];
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
@end
|
|
240
|
+
|
|
241
|
+
// ─── MANAGER ──────────────────────────────────────────────────────────────────
|
|
242
|
+
|
|
243
|
+
@interface RNVideoPreviewManager : RCTViewManager
|
|
244
|
+
@end
|
|
245
|
+
|
|
246
|
+
@implementation RNVideoPreviewManager
|
|
247
|
+
|
|
248
|
+
RCT_EXPORT_MODULE(RNVideoPreview)
|
|
249
|
+
|
|
250
|
+
- (UIView *)view {
|
|
251
|
+
return [[RNVideoPreviewView alloc] initWithFrame:CGRectZero];
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
RCT_EXPORT_VIEW_PROPERTY(uri, NSString)
|
|
255
|
+
RCT_EXPORT_VIEW_PROPERTY(paused, BOOL)
|
|
256
|
+
RCT_EXPORT_VIEW_PROPERTY(muted, BOOL)
|
|
257
|
+
RCT_EXPORT_VIEW_PROPERTY(resizeMode, NSString)
|
|
258
|
+
RCT_EXPORT_VIEW_PROPERTY(trimStartMs, int)
|
|
259
|
+
RCT_EXPORT_VIEW_PROPERTY(trimEndMs, int)
|
|
260
|
+
RCT_EXPORT_VIEW_PROPERTY(seekToMs, int)
|
|
261
|
+
RCT_EXPORT_VIEW_PROPERTY(onChange, RCTBubblingEventBlock)
|
|
262
|
+
|
|
263
|
+
@end
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import React, { useState } from 'react';
|
|
4
|
+
import { StatusBar, useColorScheme } from 'react-native';
|
|
5
|
+
import { SafeAreaProvider, SafeAreaView } from 'react-native-safe-area-context';
|
|
6
|
+
import { PickScreen } from "../screens/PickScreen.js";
|
|
7
|
+
import { CropScreen } from "../screens/CropScreen.js";
|
|
8
|
+
import { EditorScreen } from "../screens/EditorScreen.js";
|
|
9
|
+
import { ExportScreen } from "../screens/ExportScreen.js";
|
|
10
|
+
import { exportAsset } from "../native/MediaLibrary.js";
|
|
11
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
12
|
+
export default function VideoEditor({
|
|
13
|
+
onClose,
|
|
14
|
+
onFinishExport,
|
|
15
|
+
headerTitle,
|
|
16
|
+
customCancelIcon,
|
|
17
|
+
onCancelPress,
|
|
18
|
+
cameraModes,
|
|
19
|
+
defaultCameraMode,
|
|
20
|
+
musicList
|
|
21
|
+
}) {
|
|
22
|
+
const isDarkMode = useColorScheme() === 'dark';
|
|
23
|
+
const [screen, setScreen] = useState('pick');
|
|
24
|
+
const [items, setItems] = useState([]);
|
|
25
|
+
const [current, setCurrent] = useState(null);
|
|
26
|
+
const [editedMedia, setEditedMedia] = useState({});
|
|
27
|
+
const [originals, setOriginals] = useState({});
|
|
28
|
+
const [selectedCameraMode, setSelectedCameraMode] = useState(defaultCameraMode || 'STORY');
|
|
29
|
+
const ensureExported = async (item, ignoreEdits = false) => {
|
|
30
|
+
if (!ignoreEdits && editedMedia[item.id]) {
|
|
31
|
+
return editedMedia[item.id];
|
|
32
|
+
}
|
|
33
|
+
if (!item.uri.startsWith('ph://') && !item.uri.startsWith('content://')) {
|
|
34
|
+
return item;
|
|
35
|
+
}
|
|
36
|
+
try {
|
|
37
|
+
const fileUri = await exportAsset(item.id);
|
|
38
|
+
return {
|
|
39
|
+
...item,
|
|
40
|
+
uri: fileUri
|
|
41
|
+
};
|
|
42
|
+
} catch (err) {
|
|
43
|
+
console.error('ASSET EXPORT FROM LIBRARY FAILED:', err?.message ?? err);
|
|
44
|
+
return item;
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
return /*#__PURE__*/_jsx(SafeAreaProvider, {
|
|
48
|
+
children: /*#__PURE__*/_jsxs(SafeAreaView, {
|
|
49
|
+
style: {
|
|
50
|
+
flex: 1,
|
|
51
|
+
backgroundColor: '#0b0f1a'
|
|
52
|
+
},
|
|
53
|
+
edges: ['top', 'bottom', 'left', 'right'],
|
|
54
|
+
children: [/*#__PURE__*/_jsx(StatusBar, {
|
|
55
|
+
barStyle: "light-content",
|
|
56
|
+
backgroundColor: "transparent",
|
|
57
|
+
translucent: true
|
|
58
|
+
}), screen === 'pick' && /*#__PURE__*/_jsx(PickScreen, {
|
|
59
|
+
items: items,
|
|
60
|
+
headerTitle: headerTitle,
|
|
61
|
+
customCancelIcon: customCancelIcon,
|
|
62
|
+
onCancelPress: onCancelPress || onClose,
|
|
63
|
+
cameraModes: cameraModes,
|
|
64
|
+
defaultCameraMode: defaultCameraMode,
|
|
65
|
+
onCameraModeChange: mode => {
|
|
66
|
+
setSelectedCameraMode(mode);
|
|
67
|
+
},
|
|
68
|
+
onPicked: picked => {
|
|
69
|
+
// Save originals for "Fresh Start" editing
|
|
70
|
+
const newOriginals = {
|
|
71
|
+
...originals
|
|
72
|
+
};
|
|
73
|
+
picked.forEach(p => {
|
|
74
|
+
if (!newOriginals[p.id]) newOriginals[p.id] = p;
|
|
75
|
+
});
|
|
76
|
+
setOriginals(newOriginals);
|
|
77
|
+
setItems(picked);
|
|
78
|
+
},
|
|
79
|
+
onNext: async picked => {
|
|
80
|
+
if (!picked || picked.length === 0) {
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
const resolvedItems = await Promise.all(picked.map(item => ensureExported(item, false)));
|
|
84
|
+
setItems(resolvedItems);
|
|
85
|
+
setCurrent(resolvedItems[0]);
|
|
86
|
+
setScreen('editor');
|
|
87
|
+
}
|
|
88
|
+
}), screen === 'editor' && current && /*#__PURE__*/_jsx(EditorScreen, {
|
|
89
|
+
items: items,
|
|
90
|
+
initialIndex: Math.max(0, items.findIndex(it => it.id === current.id)),
|
|
91
|
+
onBack: () => {
|
|
92
|
+
setEditedMedia({});
|
|
93
|
+
const restoredItems = items.map(item => originals[item.id] || item);
|
|
94
|
+
setItems(restoredItems);
|
|
95
|
+
if (onClose) {
|
|
96
|
+
onClose();
|
|
97
|
+
} else {
|
|
98
|
+
setScreen('pick');
|
|
99
|
+
}
|
|
100
|
+
},
|
|
101
|
+
onSaved: updatedItems => {
|
|
102
|
+
const newEditedMedia = {
|
|
103
|
+
...editedMedia
|
|
104
|
+
};
|
|
105
|
+
const paths = [];
|
|
106
|
+
updatedItems.forEach(item => {
|
|
107
|
+
newEditedMedia[item.id] = item;
|
|
108
|
+
paths.push(item.uri);
|
|
109
|
+
});
|
|
110
|
+
setEditedMedia(newEditedMedia);
|
|
111
|
+
setItems(updatedItems);
|
|
112
|
+
if (onFinishExport) {
|
|
113
|
+
onFinishExport(newEditedMedia, paths, updatedItems, selectedCameraMode);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// Do not show the export screen, reset to pick screen
|
|
117
|
+
setScreen('pick');
|
|
118
|
+
},
|
|
119
|
+
onOpenCrop: item => {
|
|
120
|
+
setCurrent(item);
|
|
121
|
+
setScreen('crop');
|
|
122
|
+
},
|
|
123
|
+
musicList: musicList
|
|
124
|
+
}), screen === 'crop' && current && /*#__PURE__*/_jsx(CropScreen, {
|
|
125
|
+
item: current,
|
|
126
|
+
onBack: () => setScreen('editor'),
|
|
127
|
+
onSave: (uri, thumbnailUri, durationMs) => {
|
|
128
|
+
const updated = {
|
|
129
|
+
...current,
|
|
130
|
+
uri,
|
|
131
|
+
thumbnailUri: thumbnailUri ?? current.thumbnailUri,
|
|
132
|
+
durationMs: durationMs ?? current.durationMs
|
|
133
|
+
};
|
|
134
|
+
setEditedMedia(prev => ({
|
|
135
|
+
...prev,
|
|
136
|
+
[current.id]: updated
|
|
137
|
+
}));
|
|
138
|
+
setItems(prev => prev.map(it => it.id === current.id ? updated : it));
|
|
139
|
+
setCurrent(updated);
|
|
140
|
+
setScreen('editor');
|
|
141
|
+
}
|
|
142
|
+
}), screen === 'export' && /*#__PURE__*/_jsx(ExportScreen, {
|
|
143
|
+
editedMedia: editedMedia,
|
|
144
|
+
onHome: () => {
|
|
145
|
+
setEditedMedia({});
|
|
146
|
+
setScreen('pick');
|
|
147
|
+
},
|
|
148
|
+
onReEdit: item => {
|
|
149
|
+
setCurrent(item);
|
|
150
|
+
setScreen('editor');
|
|
151
|
+
}
|
|
152
|
+
})]
|
|
153
|
+
})
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=VideoEditor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["React","useState","StatusBar","useColorScheme","SafeAreaProvider","SafeAreaView","PickScreen","CropScreen","EditorScreen","ExportScreen","exportAsset","jsx","_jsx","jsxs","_jsxs","VideoEditor","onClose","onFinishExport","headerTitle","customCancelIcon","onCancelPress","cameraModes","defaultCameraMode","musicList","isDarkMode","screen","setScreen","items","setItems","current","setCurrent","editedMedia","setEditedMedia","originals","setOriginals","selectedCameraMode","setSelectedCameraMode","ensureExported","item","ignoreEdits","id","uri","startsWith","fileUri","err","console","error","message","children","style","flex","backgroundColor","edges","barStyle","translucent","onCameraModeChange","mode","onPicked","picked","newOriginals","forEach","p","onNext","length","resolvedItems","Promise","all","map","initialIndex","Math","max","findIndex","it","onBack","restoredItems","onSaved","updatedItems","newEditedMedia","paths","push","onOpenCrop","onSave","thumbnailUri","durationMs","updated","prev","onHome","onReEdit"],"sourceRoot":"../../../src","sources":["components/VideoEditor.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["default","VideoEditor"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA,SAASA,OAAO,IAAIC,WAAW,QAAQ,6BAA0B","ignoreList":[]}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import React, { forwardRef, useImperativeHandle, useRef, useState } from 'react';
|
|
4
|
+
import { requireNativeComponent } from 'react-native';
|
|
5
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
6
|
+
const NativeCameraView = requireNativeComponent('RNCameraView');
|
|
7
|
+
export const CameraView = /*#__PURE__*/forwardRef(({
|
|
8
|
+
facing,
|
|
9
|
+
flashMode = 'off',
|
|
10
|
+
style
|
|
11
|
+
}, ref) => {
|
|
12
|
+
const [photoTrigger, setPhotoTrigger] = useState('');
|
|
13
|
+
const [recordTrigger, setRecordTrigger] = useState('idle');
|
|
14
|
+
const photoPromiseRef = useRef(null);
|
|
15
|
+
const recordStartPromiseRef = useRef(null);
|
|
16
|
+
const recordStopPromiseRef = useRef(null);
|
|
17
|
+
useImperativeHandle(ref, () => ({
|
|
18
|
+
capturePhoto: () => {
|
|
19
|
+
return new Promise((resolve, reject) => {
|
|
20
|
+
photoPromiseRef.current = {
|
|
21
|
+
resolve,
|
|
22
|
+
reject
|
|
23
|
+
};
|
|
24
|
+
setPhotoTrigger(Date.now().toString());
|
|
25
|
+
});
|
|
26
|
+
},
|
|
27
|
+
startRecording: () => {
|
|
28
|
+
return new Promise((resolve, reject) => {
|
|
29
|
+
recordStartPromiseRef.current = {
|
|
30
|
+
resolve,
|
|
31
|
+
reject
|
|
32
|
+
};
|
|
33
|
+
setRecordTrigger('start');
|
|
34
|
+
});
|
|
35
|
+
},
|
|
36
|
+
stopRecording: () => {
|
|
37
|
+
return new Promise((resolve, reject) => {
|
|
38
|
+
recordStopPromiseRef.current = {
|
|
39
|
+
resolve,
|
|
40
|
+
reject
|
|
41
|
+
};
|
|
42
|
+
setRecordTrigger('stop');
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
}));
|
|
46
|
+
return /*#__PURE__*/_jsx(NativeCameraView, {
|
|
47
|
+
facing: facing,
|
|
48
|
+
flashMode: flashMode,
|
|
49
|
+
style: style,
|
|
50
|
+
photoTrigger: photoTrigger,
|
|
51
|
+
recordTrigger: recordTrigger,
|
|
52
|
+
onPhotoCaptured: e => {
|
|
53
|
+
const {
|
|
54
|
+
uri,
|
|
55
|
+
width,
|
|
56
|
+
height,
|
|
57
|
+
error
|
|
58
|
+
} = e.nativeEvent;
|
|
59
|
+
if (error) {
|
|
60
|
+
photoPromiseRef.current?.reject(new Error(error));
|
|
61
|
+
} else {
|
|
62
|
+
photoPromiseRef.current?.resolve({
|
|
63
|
+
uri,
|
|
64
|
+
width,
|
|
65
|
+
height
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
photoPromiseRef.current = null;
|
|
69
|
+
},
|
|
70
|
+
onRecordStarted: e => {
|
|
71
|
+
const {
|
|
72
|
+
error
|
|
73
|
+
} = e.nativeEvent;
|
|
74
|
+
if (error) {
|
|
75
|
+
recordStartPromiseRef.current?.reject(new Error(error));
|
|
76
|
+
} else {
|
|
77
|
+
recordStartPromiseRef.current?.resolve();
|
|
78
|
+
}
|
|
79
|
+
recordStartPromiseRef.current = null;
|
|
80
|
+
},
|
|
81
|
+
onRecordStopped: e => {
|
|
82
|
+
const {
|
|
83
|
+
uri,
|
|
84
|
+
durationMs,
|
|
85
|
+
width,
|
|
86
|
+
height,
|
|
87
|
+
error
|
|
88
|
+
} = e.nativeEvent;
|
|
89
|
+
if (error) {
|
|
90
|
+
recordStopPromiseRef.current?.reject(new Error(error));
|
|
91
|
+
} else {
|
|
92
|
+
recordStopPromiseRef.current?.resolve({
|
|
93
|
+
uri,
|
|
94
|
+
durationMs,
|
|
95
|
+
width,
|
|
96
|
+
height
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
recordStopPromiseRef.current = null;
|
|
100
|
+
setRecordTrigger('idle');
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
//# sourceMappingURL=CameraView.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["React","forwardRef","useImperativeHandle","useRef","useState","requireNativeComponent","jsx","_jsx","NativeCameraView","CameraView","facing","flashMode","style","ref","photoTrigger","setPhotoTrigger","recordTrigger","setRecordTrigger","photoPromiseRef","recordStartPromiseRef","recordStopPromiseRef","capturePhoto","Promise","resolve","reject","current","Date","now","toString","startRecording","stopRecording","onPhotoCaptured","e","uri","width","height","error","nativeEvent","Error","onRecordStarted","onRecordStopped","durationMs"],"sourceRoot":"../../../src","sources":["native/CameraView.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { NativeModules, Platform } from 'react-native';
|
|
4
|
+
const {
|
|
5
|
+
RNFrameGrabber
|
|
6
|
+
} = NativeModules;
|
|
7
|
+
export async function captureFrame(uri, options) {
|
|
8
|
+
if (!RNFrameGrabber?.captureFrame) {
|
|
9
|
+
throw new Error(`RNFrameGrabber.captureFrame is not available on ${Platform.OS}. Make sure the native module is linked.`);
|
|
10
|
+
}
|
|
11
|
+
return RNFrameGrabber.captureFrame(uri, options);
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=FrameGrabber.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["NativeModules","Platform","RNFrameGrabber","captureFrame","uri","options","Error","OS"],"sourceRoot":"../../../src","sources":["native/FrameGrabber.ts"],"mappings":";;AAAA,SAASA,aAAa,EAAEC,QAAQ,QAAQ,cAAc;AAGtD,MAAM;EAAEC;AAAe,CAAC,GAAGF,aAI1B;AAED,OAAO,eAAeG,YAAYA,CAChCC,GAAW,EACXC,OAA4B,EACX;EACjB,IAAI,CAACH,cAAc,EAAEC,YAAY,EAAE;IACjC,MAAM,IAAIG,KAAK,CACb,mDAAmDL,QAAQ,CAACM,EAAE,0CAChE,CAAC;EACH;EACA,OAAOL,cAAc,CAACC,YAAY,CAACC,GAAG,EAAEC,OAAO,CAAC;AAClD","ignoreList":[]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { NativeModules, Platform } from 'react-native';
|
|
4
|
+
const {
|
|
5
|
+
RNMediaEditor
|
|
6
|
+
} = NativeModules;
|
|
7
|
+
export async function editImage(uri, options) {
|
|
8
|
+
if (!RNMediaEditor?.editImage) {
|
|
9
|
+
throw new Error(`RNMediaEditor.editImage is not available on ${Platform.OS}. Make sure the native module is linked.`);
|
|
10
|
+
}
|
|
11
|
+
return RNMediaEditor.editImage(uri, options);
|
|
12
|
+
}
|
|
13
|
+
export async function trimVideo(uri, options) {
|
|
14
|
+
if (!RNMediaEditor?.trimVideo) {
|
|
15
|
+
throw new Error(`RNMediaEditor.trimVideo is not available on ${Platform.OS}. Make sure the native module is linked.`);
|
|
16
|
+
}
|
|
17
|
+
return RNMediaEditor.trimVideo(uri, options);
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=MediaEditor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["NativeModules","Platform","RNMediaEditor","editImage","uri","options","Error","OS","trimVideo"],"sourceRoot":"../../../src","sources":["native/MediaEditor.ts"],"mappings":";;AAAA,SAASA,aAAa,EAAEC,QAAQ,QAAQ,cAAc;AAGtD,MAAM;EAAEC;AAAc,CAAC,GAAGF,aAKzB;AAED,OAAO,eAAeG,SAASA,CAC7BC,GAAW,EACXC,OAAyB,EACR;EACjB,IAAI,CAACH,aAAa,EAAEC,SAAS,EAAE;IAC7B,MAAM,IAAIG,KAAK,CACb,+CAA+CL,QAAQ,CAACM,EAAE,0CAC5D,CAAC;EACH;EACA,OAAOL,aAAa,CAACC,SAAS,CAACC,GAAG,EAAEC,OAAO,CAAC;AAC9C;AAEA,OAAO,eAAeG,SAASA,CAC7BJ,GAAW,EACXC,OAAyB,EACR;EACjB,IAAI,CAACH,aAAa,EAAEM,SAAS,EAAE;IAC7B,MAAM,IAAIF,KAAK,CACb,+CAA+CL,QAAQ,CAACM,EAAE,0CAC5D,CAAC;EACH;EACA,OAAOL,aAAa,CAACM,SAAS,CAACJ,GAAG,EAAEC,OAAO,CAAC;AAC9C","ignoreList":[]}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { NativeModules, Platform } from 'react-native';
|
|
4
|
+
const {
|
|
5
|
+
RNMediaLibrary
|
|
6
|
+
} = NativeModules;
|
|
7
|
+
export async function requestMediaAccess() {
|
|
8
|
+
if (!RNMediaLibrary?.requestAccess) {
|
|
9
|
+
throw new Error(`RNMediaLibrary is not available on ${Platform.OS}. Make sure the native module is linked.`);
|
|
10
|
+
}
|
|
11
|
+
return RNMediaLibrary.requestAccess();
|
|
12
|
+
}
|
|
13
|
+
export async function listAlbums() {
|
|
14
|
+
if (!RNMediaLibrary?.listAlbums) {
|
|
15
|
+
throw new Error(`RNMediaLibrary.listAlbums is not available on ${Platform.OS}. Make sure the native module is linked.`);
|
|
16
|
+
}
|
|
17
|
+
return RNMediaLibrary.listAlbums();
|
|
18
|
+
}
|
|
19
|
+
export async function listMedia(query) {
|
|
20
|
+
if (!RNMediaLibrary?.listMedia) {
|
|
21
|
+
throw new Error(`RNMediaLibrary.listMedia is not available on ${Platform.OS}. Make sure the native module is linked.`);
|
|
22
|
+
}
|
|
23
|
+
return RNMediaLibrary.listMedia(query);
|
|
24
|
+
}
|
|
25
|
+
export async function exportAsset(localId) {
|
|
26
|
+
if (!RNMediaLibrary?.exportAsset) {
|
|
27
|
+
throw new Error(`RNMediaLibrary.exportAsset is not available on ${Platform.OS}. Make sure the native module is linked.`);
|
|
28
|
+
}
|
|
29
|
+
return RNMediaLibrary.exportAsset(localId);
|
|
30
|
+
}
|
|
31
|
+
export async function saveToGallery(uri, type) {
|
|
32
|
+
if (!RNMediaLibrary?.saveToGallery) {
|
|
33
|
+
throw new Error(`RNMediaLibrary.saveToGallery is not available on ${Platform.OS}. Make sure the native module is linked.`);
|
|
34
|
+
}
|
|
35
|
+
return RNMediaLibrary.saveToGallery(uri, type);
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=MediaLibrary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["NativeModules","Platform","RNMediaLibrary","requestMediaAccess","requestAccess","Error","OS","listAlbums","listMedia","query","exportAsset","localId","saveToGallery","uri","type"],"sourceRoot":"../../../src","sources":["native/MediaLibrary.ts"],"mappings":";;AAAA,SAASA,aAAa,EAAEC,QAAQ,QAAQ,cAAc;AAetD,MAAM;EAAEC;AAAe,CAAC,GAAGF,aAQ1B;AAED,OAAO,eAAeG,kBAAkBA,CAAA,EAAqB;EAC3D,IAAI,CAACD,cAAc,EAAEE,aAAa,EAAE;IAClC,MAAM,IAAIC,KAAK,CACb,sCAAsCJ,QAAQ,CAACK,EAAE,0CACnD,CAAC;EACH;EACA,OAAOJ,cAAc,CAACE,aAAa,CAAC,CAAC;AACvC;AAEA,OAAO,eAAeG,UAAUA,CAAA,EAAqB;EACnD,IAAI,CAACL,cAAc,EAAEK,UAAU,EAAE;IAC/B,MAAM,IAAIF,KAAK,CACb,iDAAiDJ,QAAQ,CAACK,EAAE,0CAC9D,CAAC;EACH;EACA,OAAOJ,cAAc,CAACK,UAAU,CAAC,CAAC;AACpC;AAEA,OAAO,eAAeC,SAASA,CAACC,KAAiB,EAAwB;EACvE,IAAI,CAACP,cAAc,EAAEM,SAAS,EAAE;IAC9B,MAAM,IAAIH,KAAK,CACb,gDAAgDJ,QAAQ,CAACK,EAAE,0CAC7D,CAAC;EACH;EACA,OAAOJ,cAAc,CAACM,SAAS,CAACC,KAAK,CAAC;AACxC;AAEA,OAAO,eAAeC,WAAWA,CAACC,OAAe,EAAmB;EAClE,IAAI,CAACT,cAAc,EAAEQ,WAAW,EAAE;IAChC,MAAM,IAAIL,KAAK,CACb,kDAAkDJ,QAAQ,CAACK,EAAE,0CAC/D,CAAC;EACH;EACA,OAAOJ,cAAc,CAACQ,WAAW,CAACC,OAAO,CAAC;AAC5C;AAEA,OAAO,eAAeC,aAAaA,CAACC,GAAW,EAAEC,IAAY,EAAoB;EAC/E,IAAI,CAACZ,cAAc,EAAEU,aAAa,EAAE;IAClC,MAAM,IAAIP,KAAK,CACb,oDAAoDJ,QAAQ,CAACK,EAAE,0CACjE,CAAC;EACH;EACA,OAAOJ,cAAc,CAACU,aAAa,CAACC,GAAG,EAAEC,IAAI,CAAC;AAChD","ignoreList":[]}
|