@technotoil/image-video-editor 0.1.5 → 0.1.7

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.
@@ -86,6 +86,12 @@ function PickScreen({
86
86
  const [albums, setAlbums] = (0, _react.useState)([]);
87
87
  const [loading, setLoading] = (0, _react.useState)(false);
88
88
  const [previewUri, setPreviewUri] = (0, _react.useState)(null);
89
+ // Track if user has scrolled past the main preview
90
+ const [isScrolledPast, setIsScrolledPast] = (0, _react.useState)(false);
91
+ // Only show overlay when user explicitly clicks media while scrolled past preview
92
+ const [showOverlay, setShowOverlay] = (0, _react.useState)(false);
93
+ const flatListRef = (0, _react.useRef)(null);
94
+ const PREVIEW_HEIGHT = _reactNative.Dimensions.get('window').width;
89
95
 
90
96
  // Aspect ratio logic
91
97
  const isRatioLocked = aspectRatio !== 'free';
@@ -101,6 +107,7 @@ function PickScreen({
101
107
  const [cropMode, setCropMode] = (0, _react.useState)(isRatioLocked ? '1:1' : '1:1');
102
108
  const [videoPaused, setVideoPaused] = (0, _react.useState)(false);
103
109
  const scaleAnim = (0, _react.useRef)(new _reactNative.Animated.Value(1)).current;
110
+ const overlayAnim = (0, _react.useRef)(new _reactNative.Animated.Value(0)).current;
104
111
  const [showCustomCamera, setShowCustomCamera] = (0, _react.useState)(false);
105
112
  const [facing, setFacing] = (0, _react.useState)('front');
106
113
  const [flashMode, setFlashMode] = (0, _react.useState)('off');
@@ -243,6 +250,15 @@ function PickScreen({
243
250
  type: 'albumRow'
244
251
  }, ...rows];
245
252
  }, [filtered]);
253
+
254
+ // Show/hide floating overlay with animation
255
+ (0, _react.useEffect)(() => {
256
+ _reactNative.Animated.timing(overlayAnim, {
257
+ toValue: showOverlay ? 1 : 0,
258
+ duration: 200,
259
+ useNativeDriver: true
260
+ }).start();
261
+ }, [showOverlay]);
246
262
  (0, _react.useEffect)(() => {
247
263
  let cancelled = false;
248
264
  setVideoPaused(false);
@@ -298,6 +314,11 @@ function PickScreen({
298
314
  } else {
299
315
  setSelectedMedia(item);
300
316
  }
317
+
318
+ // Show floating overlay only if user is already scrolled past the main preview
319
+ if (isScrolledPast) {
320
+ setShowOverlay(true);
321
+ }
301
322
  _reactNative.Animated.sequence([_reactNative.Animated.timing(scaleAnim, {
302
323
  toValue: 0.97,
303
324
  duration: 80,
@@ -431,7 +452,11 @@ function PickScreen({
431
452
  children: selIdx
432
453
  })
433
454
  }) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
434
- style: styles.emptyBadge
455
+ style: [styles.emptyBadge, selectedItems.length >= maxSelection ? {
456
+ opacity: 0.3,
457
+ backgroundColor: 'rgba(0,0,0,0.3)',
458
+ borderColor: 'rgba(255,255,255,0.5)'
459
+ } : null]
435
460
  })
436
461
  }), item.type === 'video' && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
437
462
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
@@ -514,192 +539,268 @@ function PickScreen({
514
539
  }, album.id))
515
540
  })]
516
541
  })]
517
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.FlatList, {
518
- data: listData,
519
- extraData: {
520
- selectedMedia,
521
- previewUri,
522
- playableUri,
523
- videoPaused,
524
- cropMode,
525
- isRatioLocked,
526
- activeAlbum,
527
- multiSelect,
528
- selectedItems,
529
- showAlbumPicker,
530
- loading
542
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
543
+ style: {
544
+ flex: 1,
545
+ position: 'relative'
531
546
  },
532
- keyExtractor: item => item.id,
533
- stickyHeaderIndices: [1],
534
- style: styles.libraryList,
535
- contentContainerStyle: styles.grid,
536
- getItemLayout: (data, index) => {
537
- const previewHeight = isRatioLocked && previewAspectRatio ? _reactNative.Dimensions.get('window').width / previewAspectRatio : 420;
538
- const albumRowHeight = 48;
539
- const rowHeight = _reactNative.Dimensions.get('window').width / 4;
540
- if (index === 0) return {
541
- length: previewHeight,
542
- offset: 0,
543
- index
544
- };
545
- if (index === 1) return {
546
- length: albumRowHeight,
547
- offset: previewHeight,
548
- index
549
- };
550
- const offset = previewHeight + albumRowHeight + (index - 2) * rowHeight;
551
- return {
552
- length: rowHeight,
553
- offset,
554
- index
555
- };
556
- },
557
- removeClippedSubviews: false,
558
- windowSize: 11,
559
- ListEmptyComponent: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
560
- style: styles.empty,
561
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
562
- style: styles.emptyText,
563
- children: loading ? 'Loading…' : 'No media found'
564
- })
565
- }),
566
- renderItem: ({
567
- item
568
- }) => {
569
- if (item.type === 'preview') {
570
- const previewStyleHeight = isRatioLocked && previewAspectRatio ? _reactNative.Dimensions.get('window').width / previewAspectRatio : 420;
571
- return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.Animated.View, {
572
- style: [styles.preview, {
573
- transform: [{
574
- scale: scaleAnim
547
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.Animated.View, {
548
+ style: [styles.floatingOverlay, {
549
+ opacity: overlayAnim,
550
+ transform: [{
551
+ translateY: overlayAnim.interpolate({
552
+ inputRange: [0, 1],
553
+ outputRange: [-PREVIEW_HEIGHT, 0]
554
+ })
555
+ }]
556
+ }],
557
+ pointerEvents: isScrolledPast ? 'box-none' : 'none',
558
+ children: [selectedMedia?.type === 'video' ? /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.Pressable, {
559
+ style: styles.previewImage,
560
+ onPress: () => setVideoPaused(v => !v),
561
+ children: [playableUri && isActive ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_VideoPreview.VideoPreview, {
562
+ uri: playableUri,
563
+ paused: videoPaused || !isActive,
564
+ muted: false,
565
+ style: styles.previewImage,
566
+ resizeMode: "cover"
567
+ }) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Image, {
568
+ source: {
569
+ uri: selectedMedia.thumbnailUri || selectedMedia.uri
570
+ },
571
+ style: styles.previewImage,
572
+ resizeMode: "cover"
573
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
574
+ style: styles.previewOverlay,
575
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
576
+ style: styles.playPauseCircle,
577
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Icon.Icon, {
578
+ name: videoPaused ? 'play' : 'pause',
579
+ size: 24,
580
+ color: "#fff"
581
+ })
582
+ })
583
+ })]
584
+ }) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Image, {
585
+ source: {
586
+ uri: previewUri ?? selectedMedia?.uri
587
+ },
588
+ style: [styles.previewImage, cropMode === '1:1' ? styles.squareCrop : styles.originalCrop],
589
+ resizeMode: isRatioLocked ? 'cover' : cropMode === '1:1' ? 'cover' : 'contain'
590
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
591
+ style: styles.previewControls,
592
+ children: [isRatioLocked && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
593
+ style: styles.ratioBadge,
594
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
595
+ style: styles.ratioBadgeText,
596
+ children: aspectRatio
597
+ })
598
+ }), !isRatioLocked && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Pressable, {
599
+ style: styles.cropToggle,
600
+ onPress: () => setCropMode(v => v === '1:1' ? 'original' : '1:1'),
601
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Icon.Icon, {
602
+ name: cropMode === '1:1' ? 'square-outline' : 'expand-outline',
603
+ size: 20,
604
+ color: "#fff"
605
+ })
606
+ })]
607
+ })]
608
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.FlatList, {
609
+ ref: flatListRef,
610
+ data: listData,
611
+ extraData: {
612
+ selectedMedia,
613
+ previewUri,
614
+ playableUri,
615
+ videoPaused,
616
+ cropMode,
617
+ isRatioLocked,
618
+ activeAlbum,
619
+ multiSelect,
620
+ selectedItems,
621
+ showAlbumPicker,
622
+ loading
623
+ },
624
+ keyExtractor: item => item.id,
625
+ stickyHeaderIndices: [1],
626
+ style: styles.libraryList,
627
+ contentContainerStyle: styles.grid,
628
+ onScroll: e => {
629
+ const scrollY = e.nativeEvent.contentOffset.y;
630
+ const scrolledPast = scrollY > PREVIEW_HEIGHT - 10;
631
+ setIsScrolledPast(scrolledPast);
632
+ // When user scrolls back up to see main preview, hide the overlay
633
+ if (!scrolledPast) {
634
+ setShowOverlay(false);
635
+ }
636
+ },
637
+ scrollEventThrottle: 16,
638
+ getItemLayout: (data, index) => {
639
+ const albumRowHeight = 48;
640
+ const rowHeight = _reactNative.Dimensions.get('window').width / 4;
641
+ if (index === 0) return {
642
+ length: PREVIEW_HEIGHT,
643
+ offset: 0,
644
+ index
645
+ };
646
+ if (index === 1) return {
647
+ length: albumRowHeight,
648
+ offset: PREVIEW_HEIGHT,
649
+ index
650
+ };
651
+ const offset = PREVIEW_HEIGHT + albumRowHeight + (index - 2) * rowHeight;
652
+ return {
653
+ length: rowHeight,
654
+ offset,
655
+ index
656
+ };
657
+ },
658
+ removeClippedSubviews: false,
659
+ windowSize: 11,
660
+ ListEmptyComponent: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
661
+ style: styles.empty,
662
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
663
+ style: styles.emptyText,
664
+ children: loading ? 'Loading…' : 'No media found'
665
+ })
666
+ }),
667
+ renderItem: ({
668
+ item
669
+ }) => {
670
+ if (item.type === 'preview') {
671
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.Animated.View, {
672
+ style: [styles.preview, {
673
+ transform: [{
674
+ scale: scaleAnim
675
+ }],
676
+ height: PREVIEW_HEIGHT
575
677
  }],
576
- height: previewStyleHeight
577
- }],
578
- children: [selectedMedia?.type === 'video' ? /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.Pressable, {
579
- style: styles.previewImage,
580
- onPress: () => setVideoPaused(v => !v),
581
- children: [playableUri && isActive ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_VideoPreview.VideoPreview, {
582
- uri: playableUri,
583
- paused: videoPaused || !isActive,
584
- muted: false,
678
+ children: [selectedMedia?.type === 'video' ? /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.Pressable, {
585
679
  style: styles.previewImage,
586
- resizeMode: "cover"
680
+ onPress: () => setVideoPaused(v => !v),
681
+ children: [playableUri && isActive ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_VideoPreview.VideoPreview, {
682
+ uri: playableUri,
683
+ paused: videoPaused || !isActive,
684
+ muted: false,
685
+ style: styles.previewImage,
686
+ resizeMode: "cover"
687
+ }) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Image, {
688
+ source: {
689
+ uri: selectedMedia.thumbnailUri || selectedMedia.uri
690
+ },
691
+ style: styles.previewImage,
692
+ resizeMode: "cover"
693
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
694
+ style: styles.previewOverlay,
695
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
696
+ style: styles.playPauseCircle,
697
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Icon.Icon, {
698
+ name: videoPaused ? 'play' : 'pause',
699
+ size: 24,
700
+ color: "#fff"
701
+ })
702
+ })
703
+ })]
587
704
  }) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Image, {
588
705
  source: {
589
- uri: selectedMedia.thumbnailUri || selectedMedia.uri
706
+ uri: previewUri ?? selectedMedia?.uri
590
707
  },
591
- style: styles.previewImage,
592
- resizeMode: "cover"
593
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
594
- style: styles.previewOverlay,
595
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
596
- style: styles.playPauseCircle,
708
+ style: [styles.previewImage, cropMode === '1:1' ? styles.squareCrop : styles.originalCrop],
709
+ resizeMode: isRatioLocked ? 'cover' : cropMode === '1:1' ? 'cover' : 'contain'
710
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
711
+ style: styles.previewControls,
712
+ children: [isRatioLocked && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
713
+ style: styles.ratioBadge,
714
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
715
+ style: styles.ratioBadgeText,
716
+ children: aspectRatio
717
+ })
718
+ }), !isRatioLocked && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Pressable, {
719
+ style: styles.cropToggle,
720
+ onPress: () => setCropMode(v => v === '1:1' ? 'original' : '1:1'),
597
721
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Icon.Icon, {
598
- name: videoPaused ? 'play' : 'pause',
599
- size: 24,
722
+ name: cropMode === '1:1' ? 'square-outline' : 'expand-outline',
723
+ size: 20,
600
724
  color: "#fff"
601
725
  })
602
- })
726
+ })]
603
727
  })]
604
- }) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Image, {
605
- source: {
606
- uri: previewUri ?? selectedMedia?.uri
607
- },
608
- style: [styles.previewImage, cropMode === '1:1' ? styles.squareCrop : styles.originalCrop],
609
- resizeMode: isRatioLocked ? 'cover' : cropMode === '1:1' ? 'cover' : 'contain'
610
- }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
611
- style: styles.previewControls,
612
- children: [isRatioLocked && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
613
- style: styles.ratioBadge,
614
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
615
- style: styles.ratioBadgeText,
616
- children: aspectRatio
617
- })
618
- }), !isRatioLocked && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Pressable, {
619
- style: styles.cropToggle,
620
- onPress: () => setCropMode(v => v === '1:1' ? 'original' : '1:1'),
621
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Icon.Icon, {
622
- name: cropMode === '1:1' ? 'square-outline' : 'expand-outline',
623
- size: 20,
624
- color: "#fff"
625
- })
626
- })]
627
- })]
628
- });
629
- }
630
- if (item.type === 'albumRow') {
631
- return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
632
- style: [styles.albumRow, {
633
- backgroundColor: '#0b0f1a',
634
- zIndex: 999,
635
- elevation: 5
636
- }],
637
- children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.Pressable, {
638
- style: styles.albumSelector,
639
- onPress: () => setShowAlbumPicker(v => !v),
640
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
641
- style: styles.albumTitle,
642
- children: activeAlbum.title
643
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Icon.Icon, {
644
- name: "chevron-down",
645
- size: 16,
646
- color: "#fff",
647
- style: {
648
- marginLeft: 6
649
- }
650
- })]
651
- }), maxSelection > 1 && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
652
- style: {
653
- flexDirection: 'row',
654
- alignItems: 'center',
655
- gap: 8
656
- },
657
- children: [multiSelect && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.Text, {
658
- style: {
659
- color: '#3b82f6',
660
- fontSize: 12,
661
- fontWeight: '700'
662
- },
663
- children: [selectedItems.length, "/", maxSelection]
664
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Pressable, {
665
- style: [styles.multiSelectBtn, multiSelect && styles.multiSelectBtnActive, multiSelect && selectedItems.length === 0 && {
666
- opacity: 0.35
667
- }],
668
- onPress: () => {
669
- if (multiSelect) {
670
- handleNext();
671
- } else {
672
- toggleMultiSelect();
728
+ });
729
+ }
730
+ if (item.type === 'albumRow') {
731
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
732
+ style: [styles.albumRow, {
733
+ backgroundColor: '#0b0f1a',
734
+ zIndex: 999,
735
+ elevation: 5
736
+ }],
737
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.Pressable, {
738
+ style: styles.albumSelector,
739
+ onPress: () => setShowAlbumPicker(v => !v),
740
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
741
+ style: styles.albumTitle,
742
+ children: activeAlbum.title
743
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Icon.Icon, {
744
+ name: "chevron-down",
745
+ size: 16,
746
+ color: "#fff",
747
+ style: {
748
+ marginLeft: 6
673
749
  }
750
+ })]
751
+ }), maxSelection > 1 && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
752
+ style: {
753
+ flexDirection: 'row',
754
+ alignItems: 'center',
755
+ gap: 8
674
756
  },
675
- disabled: multiSelect && selectedItems.length === 0,
676
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
677
- style: [styles.multiSelectText, multiSelect && styles.multiSelectTextActive],
678
- children: multiSelect ? 'Done' : 'Select multiple'
679
- })
757
+ children: [multiSelect && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.Text, {
758
+ style: {
759
+ color: '#3b82f6',
760
+ fontSize: 12,
761
+ fontWeight: '700'
762
+ },
763
+ children: [selectedItems.length, "/", maxSelection]
764
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Pressable, {
765
+ style: [styles.multiSelectBtn, multiSelect && styles.multiSelectBtnActive, multiSelect && selectedItems.length === 0 && {
766
+ opacity: 0.35
767
+ }],
768
+ onPress: () => {
769
+ if (multiSelect) {
770
+ handleNext();
771
+ } else {
772
+ toggleMultiSelect();
773
+ }
774
+ },
775
+ disabled: multiSelect && selectedItems.length === 0,
776
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
777
+ style: [styles.multiSelectText, multiSelect && styles.multiSelectTextActive],
778
+ children: multiSelect ? 'Done' : 'Select multiple'
779
+ })
780
+ })]
680
781
  })]
681
- })]
782
+ });
783
+ }
784
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
785
+ style: {
786
+ flexDirection: 'row'
787
+ },
788
+ children: item.items.map(mediaItem => renderThumb({
789
+ item: mediaItem
790
+ }))
682
791
  });
683
792
  }
684
- return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
685
- style: {
686
- flexDirection: 'row'
687
- },
688
- children: item.items.map(mediaItem => renderThumb({
689
- item: mediaItem
690
- }))
691
- });
692
- }
693
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
694
- style: styles.tabBar,
695
- children: mediaTabs.filter(t => mediaType === 'any' || mediaType === 'photo' && t !== 'VIDEO' || mediaType === 'video' && t !== 'PHOTO').map(t => /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Pressable, {
696
- onPress: () => setTab(t),
697
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
698
- style: [styles.tab, tab === t && styles.tabActive],
699
- children: t
700
- })
701
- }, t))
702
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Modal, {
793
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
794
+ style: styles.tabBar,
795
+ children: mediaTabs.filter(t => mediaType === 'any' || mediaType === 'photo' && t !== 'VIDEO' || mediaType === 'video' && t !== 'PHOTO').map(t => /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Pressable, {
796
+ onPress: () => setTab(t),
797
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
798
+ style: [styles.tab, tab === t && styles.tabActive],
799
+ children: t
800
+ })
801
+ }, t))
802
+ })]
803
+ }), " ", /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Modal, {
703
804
  visible: showCustomCamera,
704
805
  animationType: "slide",
705
806
  transparent: false,
@@ -937,10 +1038,21 @@ const styles = _reactNative.StyleSheet.create({
937
1038
  },
938
1039
  preview: {
939
1040
  width: '100%',
940
- height: 420,
941
1041
  backgroundColor: '#0f172a',
942
1042
  overflow: 'hidden'
943
1043
  },
1044
+ floatingOverlay: {
1045
+ position: 'absolute',
1046
+ top: 0,
1047
+ left: 0,
1048
+ right: 0,
1049
+ zIndex: 100,
1050
+ elevation: 20,
1051
+ backgroundColor: '#0f172a',
1052
+ overflow: 'hidden',
1053
+ width: '100%',
1054
+ height: _reactNative.Dimensions.get('window').width
1055
+ },
944
1056
  previewImage: {
945
1057
  width: '100%',
946
1058
  height: '100%',