expo-simple-gallery 0.2.1 → 0.3.1
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/build/ExpoSimpleGallery.types.d.ts +1 -0
- package/build/ExpoSimpleGallery.types.d.ts.map +1 -1
- package/build/ExpoSimpleGallery.types.js.map +1 -1
- package/build/ExpoSimpleGalleryModal.d.ts +1 -1
- package/build/ExpoSimpleGalleryModal.d.ts.map +1 -1
- package/build/ExpoSimpleGalleryModal.js +3 -3
- package/build/ExpoSimpleGalleryModal.js.map +1 -1
- package/build/ExpoSimpleGalleryModal.types.d.ts +2 -0
- package/build/ExpoSimpleGalleryModal.types.d.ts.map +1 -1
- package/build/ExpoSimpleGalleryModal.types.js.map +1 -1
- package/build/ExpoSimpleGalleryView.d.ts +1 -0
- package/build/ExpoSimpleGalleryView.d.ts.map +1 -1
- package/build/ExpoSimpleGalleryView.js +4 -3
- package/build/ExpoSimpleGalleryView.js.map +1 -1
- package/ios/GalleryImageViewerModule.swift +122 -11
- package/ios/GalleryImageViewerView.swift +51 -19
- package/ios/SwiftUIGalleryViewer/LivePhotoView.swift +30 -0
- package/ios/SwiftUIGalleryViewer/PageMediaView.swift +351 -0
- package/ios/SwiftUIGalleryViewer/SwiftUIGalleryHostView.swift +91 -0
- package/ios/SwiftUIGalleryViewer/SwiftUIGalleryView.swift +44 -0
- package/ios/SwiftUIGalleryViewer/VerticalPanGestureRecognizer.swift +103 -0
- package/ios/SwiftUIGalleryViewer/VideoPlayerView.swift +67 -0
- package/package.json +7 -2
- package/src/ExpoSimpleGallery.types.ts +2 -0
- package/src/ExpoSimpleGalleryModal.tsx +22 -4
- package/src/ExpoSimpleGalleryModal.types.ts +2 -0
- package/src/ExpoSimpleGalleryView.tsx +45 -22
|
@@ -60,6 +60,7 @@ export type ExpoSimpleGalleryViewProps = ViewProps & {
|
|
|
60
60
|
initiallySelected?: (string | undefined)[];
|
|
61
61
|
showMediaTypeIcon?: boolean;
|
|
62
62
|
debugLabels?: boolean;
|
|
63
|
+
viewer?: 'UIKit' | 'SwiftUI';
|
|
63
64
|
} & ExpoSimpleGalleryModuleEvents;
|
|
64
65
|
export interface ExpoSimpleGalleryMethods {
|
|
65
66
|
centerOnIndex: (index: number) => Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExpoSimpleGallery.types.d.ts","sourceRoot":"","sources":["../src/ExpoSimpleGallery.types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"ExpoSimpleGallery.types.d.ts","sourceRoot":"","sources":["../src/ExpoSimpleGallery.types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExpoSimpleGallery.types.js","sourceRoot":"","sources":["../src/ExpoSimpleGallery.types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ExpoSimpleGallery.types.js","sourceRoot":"","sources":["../src/ExpoSimpleGallery.types.ts"],"names":[],"mappings":"AAoIA,MAAM,UAAU,aAAa,CAAI,KAAc;IAC7C,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAI,KAAQ;IAC9C,OAAO,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,CAAC;AAC/C,CAAC","sourcesContent":["import type { ComponentType } from 'react';\nimport type { NativeSyntheticEvent, ViewProps, ViewStyle } from 'react-native';\nimport type { SFSymbol } from './SfSymbol.types';\n\nexport type GalleryItem = {\n uri: string;\n index: number;\n};\n\nexport type OnPreviewMenuOptionSelectedPayload = {\n uri: string;\n index: number;\n optionIndex: number;\n};\n\nexport type ExpoSimpleGalleryModuleEvents = {\n onSelectionChange?: (\n event: NativeSyntheticEvent<{ selected: string[] }>\n ) => void;\n onThumbnailPress?: (event: NativeSyntheticEvent<GalleryItem>) => void;\n onThumbnailLongPress?: (event: NativeSyntheticEvent<GalleryItem>) => void;\n onOverlayPreloadRequested?: (\n event: NativeSyntheticEvent<{ range: [number, number] }>\n ) => void;\n onSectionHeadersVisible?: (\n event: NativeSyntheticEvent<{ sections: number[] }>\n ) => void;\n onPreviewMenuOptionSelected?: (\n event: NativeSyntheticEvent<OnPreviewMenuOptionSelectedPayload>\n ) => void;\n};\n\nexport type ThumbnailOverlayComponentProps = {\n uri: string;\n index: number;\n selected: boolean;\n};\nexport type ThumbnailOverlayComponent =\n ComponentType<ThumbnailOverlayComponentProps>;\n\nexport type SectionHeaderComponentProps = {\n index: number;\n};\nexport type SectionHeaderComponent = ComponentType<SectionHeaderComponentProps>;\n\nexport type ThumbnailPressAction = 'select' | 'open' | 'preview' | 'none';\n\nexport type FullscreenViewOverlayComponentProps = {\n uri: string;\n index: number;\n selected: boolean;\n toggleSelection: (selected?: boolean) => void;\n};\nexport type FullscreenViewOverlayComponent =\n ComponentType<FullscreenViewOverlayComponentProps>;\n\nexport type ExpoSimpleGalleryViewProps = ViewProps & {\n assets: string[] | string[][];\n columnsCount?: number;\n\n thumbnailStyle?: Pick<\n ViewStyle,\n 'aspectRatio' | 'borderRadius' | 'borderWidth' | 'borderColor'\n >;\n thumbnailOverlayComponent?: ThumbnailOverlayComponent;\n\n thumbnailPressAction?: 'select' | 'open' | 'none';\n thumbnailLongPressAction?: 'select' | 'open' | 'preview' | 'none';\n thumbnailPanAction?: 'select' | 'none';\n\n fullscreenViewOverlayComponent?: FullscreenViewOverlayComponent;\n fullscreenViewOverlayStyle?: ViewStyle;\n\n sectionHeaderComponent?: SectionHeaderComponent;\n sectionHeaderStyle?: Pick<ViewStyle, 'height'>;\n\n contentContainerStyle?: Pick<\n ViewStyle,\n | 'padding'\n | 'paddingHorizontal'\n | 'paddingVertical'\n | 'paddingTop'\n | 'paddingBottom'\n | 'paddingLeft'\n | 'paddingRight'\n | 'gap'\n >;\n\n children?: never;\n\n contextMenuOptions?: UIAction[];\n\n initiallySelected?: (string | undefined)[];\n\n showMediaTypeIcon?: boolean;\n\n debugLabels?: boolean;\n\n viewer?: 'UIKit' | 'SwiftUI';\n} & ExpoSimpleGalleryModuleEvents;\n\nexport interface ExpoSimpleGalleryMethods {\n centerOnIndex: (index: number) => Promise<void>;\n setSelected: (uris: string[]) => Promise<void>;\n setThumbnailPressAction: (\n action: ExpoSimpleGalleryViewProps['thumbnailPressAction']\n ) => Promise<void>;\n setThumbnailLongPressAction: (\n action: ExpoSimpleGalleryViewProps['thumbnailLongPressAction']\n ) => Promise<void>;\n setThumbnailPanAction: (\n action: ExpoSimpleGalleryViewProps['thumbnailPanAction']\n ) => Promise<void>;\n setContextMenuOptions: (options: UIAction[]) => void;\n openImageViewer: (index: number) => void;\n closeImageViewer: () => void;\n}\n\ntype UIMenuElementAttribute = 'disabled' | 'destructive' | 'hidden';\ntype UIMenuElementState = 'on' | 'off' | 'mixed';\n\nexport type UIAction = {\n title: string;\n /**\n * @see https://developer.apple.com/sf-symbols/\n */\n sfSymbol?: SFSymbol;\n action?: (item: GalleryItem) => void;\n attributes?: UIMenuElementAttribute[];\n state?: UIMenuElementState;\n};\n\nexport function isNestedArray<T>(value: unknown): value is T[][] {\n return Array.isArray(value) && Array.isArray(value[0]);\n}\n\nexport function isNotNullOrUndefined<T>(value: T): value is NonNullable<T> {\n return value !== null && value !== undefined;\n}\n"]}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import type { GalleryModalProps } from './ExpoSimpleGalleryModal.types';
|
|
2
|
-
export declare function GalleryModal({ visible, uris, initialIndex, onClose, overlayComponent: OverlayComponent, selectedUris, style, toggleSelection, }: GalleryModalProps): import("react").JSX.Element;
|
|
2
|
+
export declare function GalleryModal({ visible, uris, initialIndex, onClose, overlayComponent: OverlayComponent, selectedUris, style, toggleSelection, viewer, }: GalleryModalProps): import("react").JSX.Element;
|
|
3
3
|
//# sourceMappingURL=ExpoSimpleGalleryModal.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExpoSimpleGalleryModal.d.ts","sourceRoot":"","sources":["../src/ExpoSimpleGalleryModal.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ExpoSimpleGalleryModal.d.ts","sourceRoot":"","sources":["../src/ExpoSimpleGalleryModal.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EACV,iBAAiB,EAElB,MAAM,gCAAgC,CAAC;AAKxC,wBAAgB,YAAY,CAAC,EAC3B,OAAO,EACP,IAAI,EACJ,YAAgB,EAChB,OAAO,EACP,gBAAgB,EAAE,gBAAgB,EAClC,YAAY,EACZ,KAAK,EACL,eAAe,EACf,MAAgB,GACjB,EAAE,iBAAiB,+BA4DnB"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { requireNativeViewManager } from 'expo-modules-core';
|
|
2
2
|
import { useCallback, useMemo, useState } from 'react';
|
|
3
|
-
import { Modal, StyleSheet, View } from 'react-native';
|
|
3
|
+
import { Modal, StyleSheet, View, } from 'react-native';
|
|
4
4
|
const GalleryViewer = requireNativeViewManager('GalleryImageViewer');
|
|
5
|
-
export function GalleryModal({ visible, uris, initialIndex = 0, onClose, overlayComponent: OverlayComponent, selectedUris, style, toggleSelection, }) {
|
|
5
|
+
export function GalleryModal({ visible, uris, initialIndex = 0, onClose, overlayComponent: OverlayComponent, selectedUris, style, toggleSelection, viewer = 'UIKit', }) {
|
|
6
6
|
const [currentIndex, setCurrentIndex] = useState(initialIndex);
|
|
7
7
|
const [currentUri, setCurrentUri] = useState(uris[initialIndex] || '');
|
|
8
8
|
const selected = useMemo(() => selectedUris.has(currentUri), [selectedUris, currentUri]);
|
|
@@ -19,7 +19,7 @@ export function GalleryModal({ visible, uris, initialIndex = 0, onClose, overlay
|
|
|
19
19
|
}, [currentUri, toggleSelection]);
|
|
20
20
|
return (<Modal visible={visible} transparent={true} animationType="fade" onRequestClose={onClose}>
|
|
21
21
|
<View style={[styles.container, style]}>
|
|
22
|
-
<GalleryViewer style={styles.viewer} imageData={{ uris, startIndex: initialIndex }} onPageChange={handlePageChange} onDismissAttempt={handleDismissAttempt}/>
|
|
22
|
+
<GalleryViewer style={styles.viewer} imageData={{ uris, startIndex: initialIndex }} onPageChange={handlePageChange} onDismissAttempt={handleDismissAttempt} viewer={viewer}/>
|
|
23
23
|
|
|
24
24
|
{OverlayComponent && (<View style={styles.overlayContainer} pointerEvents="box-none">
|
|
25
25
|
<OverlayComponent index={currentIndex} uri={currentUri} selected={selected} toggleSelection={handleSelectionToggle}/>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExpoSimpleGalleryModal.js","sourceRoot":"","sources":["../src/ExpoSimpleGalleryModal.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAsB,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC3E,OAAO,
|
|
1
|
+
{"version":3,"file":"ExpoSimpleGalleryModal.js","sourceRoot":"","sources":["../src/ExpoSimpleGalleryModal.tsx"],"names":[],"mappings":"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","sourcesContent":["import { requireNativeViewManager } from 'expo-modules-core';\nimport { type ComponentType, useCallback, useMemo, useState } from 'react';\nimport {\n Modal,\n type NativeSyntheticEvent,\n StyleSheet,\n View,\n} from 'react-native';\nimport type { GalleryItem } from './ExpoSimpleGallery.types';\nimport type {\n GalleryModalProps,\n GalleryViewerProps,\n} from './ExpoSimpleGalleryModal.types';\n\nconst GalleryViewer: ComponentType<GalleryViewerProps> =\n requireNativeViewManager('GalleryImageViewer');\n\nexport function GalleryModal({\n visible,\n uris,\n initialIndex = 0,\n onClose,\n overlayComponent: OverlayComponent,\n selectedUris,\n style,\n toggleSelection,\n viewer = 'UIKit',\n}: GalleryModalProps) {\n const [currentIndex, setCurrentIndex] = useState(initialIndex);\n const [currentUri, setCurrentUri] = useState(uris[initialIndex] || '');\n const selected = useMemo(\n () => selectedUris.has(currentUri),\n [selectedUris, currentUri]\n );\n\n const handlePageChange = useCallback(\n (event: NativeSyntheticEvent<{ index: number; uri: string }>) => {\n const { index, uri } = event.nativeEvent;\n setCurrentIndex(index);\n setCurrentUri(uri);\n },\n []\n );\n\n const handleDismissAttempt = useCallback(\n (event: NativeSyntheticEvent<GalleryItem>) => {\n onClose(event);\n },\n [onClose]\n );\n\n const handleSelectionToggle = useCallback(\n (selected?: boolean) => {\n toggleSelection(currentUri, selected);\n },\n [currentUri, toggleSelection]\n );\n\n return (\n <Modal\n visible={visible}\n transparent={true}\n animationType=\"fade\"\n onRequestClose={onClose}\n >\n <View style={[styles.container, style]}>\n <GalleryViewer\n style={styles.viewer}\n imageData={{ uris, startIndex: initialIndex }}\n onPageChange={handlePageChange}\n onDismissAttempt={handleDismissAttempt}\n viewer={viewer}\n />\n\n {OverlayComponent && (\n <View style={styles.overlayContainer} pointerEvents=\"box-none\">\n <OverlayComponent\n index={currentIndex}\n uri={currentUri}\n selected={selected}\n toggleSelection={handleSelectionToggle}\n />\n </View>\n )}\n </View>\n </Modal>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n backgroundColor: 'black',\n },\n viewer: {\n flex: 1,\n },\n overlayContainer: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n },\n});\n"]}
|
|
@@ -9,6 +9,7 @@ export type GalleryViewerProps = {
|
|
|
9
9
|
onImageLoaded?: (event: NativeSyntheticEvent<GalleryItem>) => void;
|
|
10
10
|
onDismissAttempt?: (event: NativeSyntheticEvent<GalleryItem>) => void;
|
|
11
11
|
style?: StyleProp<ViewStyle>;
|
|
12
|
+
viewer: 'UIKit' | 'SwiftUI';
|
|
12
13
|
};
|
|
13
14
|
export type GalleryModalProps = {
|
|
14
15
|
visible: boolean;
|
|
@@ -19,5 +20,6 @@ export type GalleryModalProps = {
|
|
|
19
20
|
selectedUris: Set<string>;
|
|
20
21
|
style?: StyleProp<ViewStyle>;
|
|
21
22
|
toggleSelection: (uri: string, selected?: boolean) => void;
|
|
23
|
+
viewer: 'UIKit' | 'SwiftUI';
|
|
22
24
|
};
|
|
23
25
|
//# sourceMappingURL=ExpoSimpleGalleryModal.types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExpoSimpleGalleryModal.types.d.ts","sourceRoot":"","sources":["../src/ExpoSimpleGalleryModal.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC/E,OAAO,KAAK,EACV,8BAA8B,EAC9B,WAAW,EACZ,MAAM,2BAA2B,CAAC;AAEnC,MAAM,MAAM,kBAAkB,GAAG;IAC/B,SAAS,EAAE;QACT,IAAI,EAAE,MAAM,EAAE,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,oBAAoB,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC;IAClE,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,oBAAoB,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC;IACnE,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,oBAAoB,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC;IACtE,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"ExpoSimpleGalleryModal.types.d.ts","sourceRoot":"","sources":["../src/ExpoSimpleGalleryModal.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC/E,OAAO,KAAK,EACV,8BAA8B,EAC9B,WAAW,EACZ,MAAM,2BAA2B,CAAC;AAEnC,MAAM,MAAM,kBAAkB,GAAG;IAC/B,SAAS,EAAE;QACT,IAAI,EAAE,MAAM,EAAE,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,oBAAoB,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC;IAClE,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,oBAAoB,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC;IACnE,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,oBAAoB,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC;IACtE,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B,MAAM,EAAE,OAAO,GAAG,SAAS,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,CAAC,KAAK,EAAE,oBAAoB,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC;IAC5D,gBAAgB,CAAC,EAAE,8BAA8B,CAAC;IAClD,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC1B,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B,eAAe,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAC3D,MAAM,EAAE,OAAO,GAAG,SAAS,CAAC;CAC7B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExpoSimpleGalleryModal.types.js","sourceRoot":"","sources":["../src/ExpoSimpleGalleryModal.types.ts"],"names":[],"mappings":"","sourcesContent":["import type { NativeSyntheticEvent, StyleProp, ViewStyle } from 'react-native';\nimport type {\n FullscreenViewOverlayComponent,\n GalleryItem,\n} from './ExpoSimpleGallery.types';\n\nexport type GalleryViewerProps = {\n imageData: {\n uris: string[];\n startIndex: number;\n };\n onPageChange?: (event: NativeSyntheticEvent<GalleryItem>) => void;\n onImageLoaded?: (event: NativeSyntheticEvent<GalleryItem>) => void;\n onDismissAttempt?: (event: NativeSyntheticEvent<GalleryItem>) => void;\n style?: StyleProp<ViewStyle>;\n};\n\nexport type GalleryModalProps = {\n visible: boolean;\n uris: string[];\n initialIndex: number;\n onClose: (event: NativeSyntheticEvent<GalleryItem>) => void;\n overlayComponent?: FullscreenViewOverlayComponent;\n selectedUris: Set<string>;\n style?: StyleProp<ViewStyle>;\n toggleSelection: (uri: string, selected?: boolean) => void;\n};\n"]}
|
|
1
|
+
{"version":3,"file":"ExpoSimpleGalleryModal.types.js","sourceRoot":"","sources":["../src/ExpoSimpleGalleryModal.types.ts"],"names":[],"mappings":"","sourcesContent":["import type { NativeSyntheticEvent, StyleProp, ViewStyle } from 'react-native';\nimport type {\n FullscreenViewOverlayComponent,\n GalleryItem,\n} from './ExpoSimpleGallery.types';\n\nexport type GalleryViewerProps = {\n imageData: {\n uris: string[];\n startIndex: number;\n };\n onPageChange?: (event: NativeSyntheticEvent<GalleryItem>) => void;\n onImageLoaded?: (event: NativeSyntheticEvent<GalleryItem>) => void;\n onDismissAttempt?: (event: NativeSyntheticEvent<GalleryItem>) => void;\n style?: StyleProp<ViewStyle>;\n viewer: 'UIKit' | 'SwiftUI';\n};\n\nexport type GalleryModalProps = {\n visible: boolean;\n uris: string[];\n initialIndex: number;\n onClose: (event: NativeSyntheticEvent<GalleryItem>) => void;\n overlayComponent?: FullscreenViewOverlayComponent;\n selectedUris: Set<string>;\n style?: StyleProp<ViewStyle>;\n toggleSelection: (uri: string, selected?: boolean) => void;\n viewer: 'UIKit' | 'SwiftUI';\n};\n"]}
|
|
@@ -18,6 +18,7 @@ declare const _default: import("react").ForwardRefExoticComponent<import("react-
|
|
|
18
18
|
initiallySelected?: (string | undefined)[];
|
|
19
19
|
showMediaTypeIcon?: boolean;
|
|
20
20
|
debugLabels?: boolean;
|
|
21
|
+
viewer?: "UIKit" | "SwiftUI";
|
|
21
22
|
} & import("./ExpoSimpleGallery.types").ExpoSimpleGalleryModuleEvents & RefAttributes<ExpoSimpleGalleryMethods>>;
|
|
22
23
|
export default _default;
|
|
23
24
|
//# sourceMappingURL=ExpoSimpleGalleryView.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExpoSimpleGalleryView.d.ts","sourceRoot":"","sources":["../src/ExpoSimpleGalleryView.tsx"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"ExpoSimpleGalleryView.d.ts","sourceRoot":"","sources":["../src/ExpoSimpleGalleryView.tsx"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,aAAa,EASnB,MAAM,OAAO,CAAC;AAOf,OAAO,EACL,KAAK,wBAAwB,EAI7B,KAAK,QAAQ,EAGd,MAAM,2BAA2B,CAAC;;;;;;;;;;;;;;;;;;;;;AAanC,wBAmRE"}
|
|
@@ -8,7 +8,7 @@ import { MemoizedThumbnailOverlayComponent } from './components/MemoizedThumbnai
|
|
|
8
8
|
const NativeView = requireNativeViewManager('ExpoSimpleGallery');
|
|
9
9
|
const NativeViewMemoized = memo(NativeView);
|
|
10
10
|
const OVERLAYS_BUFFER = 10;
|
|
11
|
-
export default forwardRef(function ExpoSimpleGalleryView({ thumbnailOverlayComponent: ThumbnailOverlayComponent, fullscreenViewOverlayComponent: FullscreenOverlayComponent = () => null, sectionHeaderComponent: SectionHeaderComponent, sectionHeaderStyle, assets, thumbnailStyle, onSelectionChange, onOverlayPreloadRequested, onSectionHeadersVisible, debugLabels = false, onThumbnailPress, fullscreenViewOverlayStyle, onPreviewMenuOptionSelected, contextMenuOptions, initiallySelected, ...props }, forwardedRef) {
|
|
11
|
+
export default forwardRef(function ExpoSimpleGalleryView({ thumbnailOverlayComponent: ThumbnailOverlayComponent, fullscreenViewOverlayComponent: FullscreenOverlayComponent = () => null, sectionHeaderComponent: SectionHeaderComponent, sectionHeaderStyle, assets, thumbnailStyle, onSelectionChange, onOverlayPreloadRequested, onSectionHeadersVisible, debugLabels = false, onThumbnailPress, fullscreenViewOverlayStyle, onPreviewMenuOptionSelected, contextMenuOptions, initiallySelected, viewer = 'UIKit', ...props }, forwardedRef) {
|
|
12
12
|
const { width } = useWindowDimensions();
|
|
13
13
|
const { thumbnailWidth, thumbnailHeight, thumbnailStyleProcessed } = useThumbnailDimensions({
|
|
14
14
|
thumbnailStyle,
|
|
@@ -139,7 +139,7 @@ export default forwardRef(function ExpoSimpleGalleryView({ thumbnailOverlayCompo
|
|
|
139
139
|
{/* @ts-expect-error type of children is intentionally set to never | undefined */}
|
|
140
140
|
{children}
|
|
141
141
|
</NativeViewMemoized>
|
|
142
|
-
<GalleryModal visible={modalVisible} uris={assets.flat()} initialIndex={initialIndex} onClose={handleModalClose} selectedUris={selectedUris} overlayComponent={FullscreenOverlayComponent} style={fullscreenViewOverlayStyle} toggleSelection={handleToggleSelection}/>
|
|
142
|
+
<GalleryModal visible={modalVisible} uris={assets.flat()} initialIndex={initialIndex} onClose={handleModalClose} selectedUris={selectedUris} overlayComponent={FullscreenOverlayComponent} style={fullscreenViewOverlayStyle} toggleSelection={handleToggleSelection} viewer={viewer}/>
|
|
143
143
|
</>);
|
|
144
144
|
});
|
|
145
145
|
function useThumbnailDimensions({ thumbnailStyle, contentContainerStyle, columnsCount = 2, }) {
|
|
@@ -166,7 +166,8 @@ function useThumbnailDimensions({ thumbnailStyle, contentContainerStyle, columns
|
|
|
166
166
|
contentContainerStyle?.paddingHorizontal ??
|
|
167
167
|
contentContainerStyle?.padding ??
|
|
168
168
|
0;
|
|
169
|
-
const padding = Number.parseFloat(paddingLeft) +
|
|
169
|
+
const padding = Number.parseFloat(paddingLeft) +
|
|
170
|
+
Number.parseFloat(paddingRight);
|
|
170
171
|
const thumbnailWidth = (width - padding - (columnsCount - 1) * thumbnailsSpacing) / columnsCount;
|
|
171
172
|
const thumbnailHeight = thumbnailWidth / thumbnailAspectRatio;
|
|
172
173
|
return { thumbnailWidth, thumbnailHeight };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExpoSimpleGalleryView.js","sourceRoot":"","sources":["../src/ExpoSimpleGalleryView.tsx"],"names":[],"mappings":"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","sourcesContent":["import { requireNativeViewManager } from 'expo-modules-core';\nimport {\n type ComponentType,\n forwardRef,\n memo,\n type RefAttributes,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport {\n type ColorValue,\n type NativeSyntheticEvent,\n processColor,\n useWindowDimensions,\n} from 'react-native';\nimport {\n type ExpoSimpleGalleryMethods,\n type ExpoSimpleGalleryViewProps,\n type GalleryItem,\n isNestedArray,\n isNotNullOrUndefined,\n type OnPreviewMenuOptionSelectedPayload,\n type UIAction,\n} from './ExpoSimpleGallery.types';\nimport { GalleryModal } from './ExpoSimpleGalleryModal';\nimport { MemoizedSectionHeader } from './components/MemoizedSectionHeader';\nimport { MemoizedThumbnailOverlayComponent } from './components/MemoizedThumbnailOverlayComponent';\n\nconst NativeView: ComponentType<\n ExpoSimpleGalleryViewProps & RefAttributes<ExpoSimpleGalleryMethods>\n> = requireNativeViewManager('ExpoSimpleGallery');\n\nconst NativeViewMemoized = memo(NativeView);\n\nconst OVERLAYS_BUFFER = 10;\n\nexport default forwardRef<ExpoSimpleGalleryMethods, ExpoSimpleGalleryViewProps>(\n function ExpoSimpleGalleryView(\n {\n thumbnailOverlayComponent: ThumbnailOverlayComponent,\n fullscreenViewOverlayComponent: FullscreenOverlayComponent = () => null,\n sectionHeaderComponent: SectionHeaderComponent,\n sectionHeaderStyle,\n assets,\n thumbnailStyle,\n onSelectionChange,\n onOverlayPreloadRequested,\n onSectionHeadersVisible,\n debugLabels = false,\n onThumbnailPress,\n fullscreenViewOverlayStyle,\n onPreviewMenuOptionSelected,\n contextMenuOptions,\n initiallySelected,\n ...props\n }: ExpoSimpleGalleryViewProps,\n forwardedRef\n ) {\n const { width } = useWindowDimensions();\n const { thumbnailWidth, thumbnailHeight, thumbnailStyleProcessed } = useThumbnailDimensions({\n thumbnailStyle,\n contentContainerStyle: props.contentContainerStyle,\n columnsCount: props.columnsCount,\n });\n\n const openImageViewer = useCallback((index: number) => {\n setInitialIndex(index);\n setModalVisible(true);\n }, []);\n\n const thumbnailPressActionRef = useRef(props.thumbnailPressAction);\n useEffect(() => {\n thumbnailPressActionRef.current = props.thumbnailPressAction;\n }, [props.thumbnailPressAction]);\n\n const internalRef = useRef<ExpoSimpleGalleryMethods>(null);\n useImperativeHandle(forwardedRef, () => ({\n centerOnIndex: async (index: number) => {\n internalRef.current?.centerOnIndex(index);\n },\n setSelected: async (uris: string[]) => {\n internalRef.current?.setSelected(uris);\n },\n setThumbnailPressAction: async (\n action: ExpoSimpleGalleryViewProps['thumbnailPressAction']\n ) => {\n thumbnailPressActionRef.current = action;\n internalRef.current?.setThumbnailPressAction(action);\n },\n setThumbnailLongPressAction: async (\n action: ExpoSimpleGalleryViewProps['thumbnailLongPressAction']\n ) => {\n internalRef.current?.setThumbnailLongPressAction(action);\n },\n setThumbnailPanAction: async (action: ExpoSimpleGalleryViewProps['thumbnailPanAction']) => {\n internalRef.current?.setThumbnailPanAction(action);\n },\n setContextMenuOptions: async (options: UIAction[]) => {\n internalRef.current?.setContextMenuOptions(options);\n },\n openImageViewer,\n closeImageViewer: () => {\n setModalVisible(false);\n },\n }));\n\n const [modalVisible, setModalVisible] = useState(false);\n const [initialIndex, setInitialIndex] = useState(0);\n\n const [selectedUris, setSelectedUris] = useState<Set<string>>(new Set());\n\n const [visibleRange, setVisibleRange] = useState<[number, number]>([0, 0]);\n const visibleRangeMin = useMemo(() => visibleRange[0], [visibleRange]);\n const visibleRangeMax = useMemo(() => visibleRange[1], [visibleRange]);\n\n const [visibleHeaders, setVisibleHeaders] = useState<number[]>([0]);\n const visibleHeadersRangeMin = useMemo(() => Math.min(...visibleHeaders), [visibleHeaders]);\n const visibleHeadersRangeMax = useMemo(() => Math.max(...visibleHeaders), [visibleHeaders]);\n\n const handleSelectionChange = useCallback(\n (event: NativeSyntheticEvent<{ selected: string[] }>) => {\n setSelectedUris(new Set(event.nativeEvent.selected));\n onSelectionChange?.(event);\n },\n [onSelectionChange]\n );\n\n const handleOverlayPreloadRequest = useCallback(\n (event: NativeSyntheticEvent<{ range: [number, number] }>) => {\n const [start, end] = event.nativeEvent.range;\n setVisibleRange([start, end]);\n onOverlayPreloadRequested?.(event);\n },\n [onOverlayPreloadRequested]\n );\n\n const handleSectionHeadersVisible = useCallback(\n (event: NativeSyntheticEvent<{ sections: number[] }>) => {\n setVisibleHeaders(event.nativeEvent.sections);\n onSectionHeadersVisible?.(event);\n },\n [onSectionHeadersVisible]\n );\n\n const handleThumbnailPress = useCallback(\n (event: NativeSyntheticEvent<GalleryItem>) => {\n if (thumbnailPressActionRef.current === 'open') {\n openImageViewer(event.nativeEvent.index);\n }\n onThumbnailPress?.(event);\n },\n [onThumbnailPress, openImageViewer]\n );\n\n const handleModalClose = useCallback((event: NativeSyntheticEvent<GalleryItem>) => {\n const index = event.nativeEvent.index;\n setModalVisible(false);\n internalRef.current?.centerOnIndex(index);\n }, []);\n\n const thumbnailOverlays = useMemo(\n () =>\n assets.flat().map((uri, index) =>\n ThumbnailOverlayComponent ? (\n <MemoizedThumbnailOverlayComponent\n // biome-ignore lint/suspicious/noArrayIndexKey: we need to force re-render on order change\n key={`${uri}-${index}`}\n OverlayComponent={ThumbnailOverlayComponent}\n uri={uri}\n index={index}\n width={thumbnailWidth}\n height={thumbnailHeight}\n selected={selectedUris.has(uri)}\n debugLabels={debugLabels}\n isNull={\n !(\n index >= visibleRangeMin - OVERLAYS_BUFFER &&\n index <= visibleRangeMax + OVERLAYS_BUFFER\n )\n }\n // isNull={false}\n />\n ) : null\n ),\n [\n assets,\n ThumbnailOverlayComponent,\n thumbnailWidth,\n thumbnailHeight,\n selectedUris,\n visibleRangeMin,\n visibleRangeMax,\n debugLabels,\n ]\n );\n\n const sectionHeaders = useMemo(() => {\n if (!SectionHeaderComponent || !isNestedArray(assets)) return null;\n return assets.map((group, index) => (\n <MemoizedSectionHeader\n key={JSON.stringify(group)}\n SectionHeader={SectionHeaderComponent}\n index={index}\n width={width}\n height={Number.parseFloat((sectionHeaderStyle?.height ?? 0).toString())}\n debugLabels={debugLabels}\n isNull={\n !(\n index >= visibleHeadersRangeMin - OVERLAYS_BUFFER &&\n index <= visibleHeadersRangeMax + OVERLAYS_BUFFER\n )\n }\n />\n ));\n }, [\n SectionHeaderComponent,\n assets,\n sectionHeaderStyle?.height,\n debugLabels,\n width,\n visibleHeadersRangeMin,\n visibleHeadersRangeMax,\n ]);\n\n const children = useMemo(\n () => [sectionHeaders, thumbnailOverlays],\n [sectionHeaders, thumbnailOverlays]\n );\n\n const handlePreviewMenuOptionSelected = useCallback(\n (event: NativeSyntheticEvent<OnPreviewMenuOptionSelectedPayload>) => {\n const action = contextMenuOptions?.[event.nativeEvent.optionIndex]?.action;\n action?.({\n uri: event.nativeEvent.uri,\n index: event.nativeEvent.index,\n });\n },\n [contextMenuOptions]\n );\n\n const handleToggleSelection = useCallback(\n (uri: string, selected?: boolean) => {\n const shouldSetSelected = selected === undefined ? !selectedUris.has(uri) : selected;\n const newSet = new Set(selectedUris);\n if (shouldSetSelected) {\n newSet.add(uri);\n } else {\n newSet.delete(uri);\n }\n internalRef.current?.setSelected([...newSet]);\n },\n [selectedUris]\n );\n\n return (\n <>\n <NativeViewMemoized\n // key={assets.length}\n {...props}\n thumbnailStyle={thumbnailStyleProcessed}\n sectionHeaderStyle={sectionHeaderStyle}\n assets={assets}\n onSelectionChange={handleSelectionChange}\n onOverlayPreloadRequested={handleOverlayPreloadRequest}\n onSectionHeadersVisible={handleSectionHeadersVisible}\n onThumbnailPress={handleThumbnailPress}\n onPreviewMenuOptionSelected={handlePreviewMenuOptionSelected}\n contextMenuOptions={contextMenuOptions}\n onLayout={() => {\n if (initiallySelected) {\n internalRef.current?.setSelected(initiallySelected?.filter(isNotNullOrUndefined));\n }\n }}\n ref={internalRef}\n >\n {/* @ts-expect-error type of children is intentionally set to never | undefined */}\n {children}\n </NativeViewMemoized>\n <GalleryModal\n visible={modalVisible}\n uris={assets.flat()}\n initialIndex={initialIndex}\n onClose={handleModalClose}\n selectedUris={selectedUris}\n overlayComponent={FullscreenOverlayComponent}\n style={fullscreenViewOverlayStyle}\n toggleSelection={handleToggleSelection}\n />\n </>\n );\n }\n);\n\nfunction useThumbnailDimensions({\n thumbnailStyle,\n contentContainerStyle,\n columnsCount = 2,\n}: {\n thumbnailStyle: ExpoSimpleGalleryViewProps['thumbnailStyle'];\n contentContainerStyle: ExpoSimpleGalleryViewProps['contentContainerStyle'];\n columnsCount?: number;\n}) {\n const { width } = useWindowDimensions();\n const thumbnailStyleProcessed = useMemo(() => {\n if (!thumbnailStyle?.borderColor) return thumbnailStyle;\n const { borderColor } = thumbnailStyle;\n return {\n ...thumbnailStyle,\n borderColor: (processColor(borderColor) as ColorValue) ?? undefined,\n };\n }, [thumbnailStyle]);\n const { thumbnailWidth, thumbnailHeight } = useMemo(() => {\n const thumbnailAspectRatio =\n Number.parseFloat((thumbnailStyleProcessed?.aspectRatio as string) ?? '') || 1;\n\n const thumbnailsSpacing = contentContainerStyle?.gap\n ? Number.parseInt(contentContainerStyle?.gap.toString())\n : 0;\n const paddingLeft =\n contentContainerStyle?.paddingLeft ??\n contentContainerStyle?.paddingHorizontal ??\n contentContainerStyle?.padding ??\n 0;\n const paddingRight =\n contentContainerStyle?.paddingRight ??\n contentContainerStyle?.paddingHorizontal ??\n contentContainerStyle?.padding ??\n 0;\n const padding =\n Number.parseFloat(paddingLeft as string) + Number.parseFloat(paddingRight as string);\n const thumbnailWidth =\n (width - padding - (columnsCount - 1) * thumbnailsSpacing) / columnsCount;\n const thumbnailHeight = thumbnailWidth / thumbnailAspectRatio;\n return { thumbnailWidth, thumbnailHeight };\n }, [width, thumbnailStyleProcessed, columnsCount, contentContainerStyle]);\n return { thumbnailWidth, thumbnailHeight, thumbnailStyleProcessed };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ExpoSimpleGalleryView.js","sourceRoot":"","sources":["../src/ExpoSimpleGalleryView.tsx"],"names":[],"mappings":"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","sourcesContent":["import { requireNativeViewManager } from 'expo-modules-core';\nimport {\n type ComponentType,\n type RefAttributes,\n forwardRef,\n memo,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport {\n type ColorValue,\n type NativeSyntheticEvent,\n processColor,\n useWindowDimensions,\n} from 'react-native';\nimport {\n type ExpoSimpleGalleryMethods,\n type ExpoSimpleGalleryViewProps,\n type GalleryItem,\n type OnPreviewMenuOptionSelectedPayload,\n type UIAction,\n isNestedArray,\n isNotNullOrUndefined,\n} from './ExpoSimpleGallery.types';\nimport { GalleryModal } from './ExpoSimpleGalleryModal';\nimport { MemoizedSectionHeader } from './components/MemoizedSectionHeader';\nimport { MemoizedThumbnailOverlayComponent } from './components/MemoizedThumbnailOverlayComponent';\n\nconst NativeView: ComponentType<\n ExpoSimpleGalleryViewProps & RefAttributes<ExpoSimpleGalleryMethods>\n> = requireNativeViewManager('ExpoSimpleGallery');\n\nconst NativeViewMemoized = memo(NativeView);\n\nconst OVERLAYS_BUFFER = 10;\n\nexport default forwardRef<ExpoSimpleGalleryMethods, ExpoSimpleGalleryViewProps>(\n function ExpoSimpleGalleryView(\n {\n thumbnailOverlayComponent: ThumbnailOverlayComponent,\n fullscreenViewOverlayComponent: FullscreenOverlayComponent = () => null,\n sectionHeaderComponent: SectionHeaderComponent,\n sectionHeaderStyle,\n assets,\n thumbnailStyle,\n onSelectionChange,\n onOverlayPreloadRequested,\n onSectionHeadersVisible,\n debugLabels = false,\n onThumbnailPress,\n fullscreenViewOverlayStyle,\n onPreviewMenuOptionSelected,\n contextMenuOptions,\n initiallySelected,\n viewer = 'UIKit',\n ...props\n }: ExpoSimpleGalleryViewProps,\n forwardedRef\n ) {\n const { width } = useWindowDimensions();\n const { thumbnailWidth, thumbnailHeight, thumbnailStyleProcessed } =\n useThumbnailDimensions({\n thumbnailStyle,\n contentContainerStyle: props.contentContainerStyle,\n columnsCount: props.columnsCount,\n });\n\n const openImageViewer = useCallback((index: number) => {\n setInitialIndex(index);\n setModalVisible(true);\n }, []);\n\n const thumbnailPressActionRef = useRef(props.thumbnailPressAction);\n useEffect(() => {\n thumbnailPressActionRef.current = props.thumbnailPressAction;\n }, [props.thumbnailPressAction]);\n\n const internalRef = useRef<ExpoSimpleGalleryMethods>(null);\n useImperativeHandle(forwardedRef, () => ({\n centerOnIndex: async (index: number) => {\n internalRef.current?.centerOnIndex(index);\n },\n setSelected: async (uris: string[]) => {\n internalRef.current?.setSelected(uris);\n },\n setThumbnailPressAction: async (\n action: ExpoSimpleGalleryViewProps['thumbnailPressAction']\n ) => {\n thumbnailPressActionRef.current = action;\n internalRef.current?.setThumbnailPressAction(action);\n },\n setThumbnailLongPressAction: async (\n action: ExpoSimpleGalleryViewProps['thumbnailLongPressAction']\n ) => {\n internalRef.current?.setThumbnailLongPressAction(action);\n },\n setThumbnailPanAction: async (\n action: ExpoSimpleGalleryViewProps['thumbnailPanAction']\n ) => {\n internalRef.current?.setThumbnailPanAction(action);\n },\n setContextMenuOptions: async (options: UIAction[]) => {\n internalRef.current?.setContextMenuOptions(options);\n },\n openImageViewer,\n closeImageViewer: () => {\n setModalVisible(false);\n },\n }));\n\n const [modalVisible, setModalVisible] = useState(false);\n const [initialIndex, setInitialIndex] = useState(0);\n\n const [selectedUris, setSelectedUris] = useState<Set<string>>(new Set());\n\n const [visibleRange, setVisibleRange] = useState<[number, number]>([0, 0]);\n const visibleRangeMin = useMemo(() => visibleRange[0], [visibleRange]);\n const visibleRangeMax = useMemo(() => visibleRange[1], [visibleRange]);\n\n const [visibleHeaders, setVisibleHeaders] = useState<number[]>([0]);\n const visibleHeadersRangeMin = useMemo(\n () => Math.min(...visibleHeaders),\n [visibleHeaders]\n );\n const visibleHeadersRangeMax = useMemo(\n () => Math.max(...visibleHeaders),\n [visibleHeaders]\n );\n\n const handleSelectionChange = useCallback(\n (event: NativeSyntheticEvent<{ selected: string[] }>) => {\n setSelectedUris(new Set(event.nativeEvent.selected));\n onSelectionChange?.(event);\n },\n [onSelectionChange]\n );\n\n const handleOverlayPreloadRequest = useCallback(\n (event: NativeSyntheticEvent<{ range: [number, number] }>) => {\n const [start, end] = event.nativeEvent.range;\n setVisibleRange([start, end]);\n onOverlayPreloadRequested?.(event);\n },\n [onOverlayPreloadRequested]\n );\n\n const handleSectionHeadersVisible = useCallback(\n (event: NativeSyntheticEvent<{ sections: number[] }>) => {\n setVisibleHeaders(event.nativeEvent.sections);\n onSectionHeadersVisible?.(event);\n },\n [onSectionHeadersVisible]\n );\n\n const handleThumbnailPress = useCallback(\n (event: NativeSyntheticEvent<GalleryItem>) => {\n if (thumbnailPressActionRef.current === 'open') {\n openImageViewer(event.nativeEvent.index);\n }\n onThumbnailPress?.(event);\n },\n [onThumbnailPress, openImageViewer]\n );\n\n const handleModalClose = useCallback(\n (event: NativeSyntheticEvent<GalleryItem>) => {\n const index = event.nativeEvent.index;\n setModalVisible(false);\n internalRef.current?.centerOnIndex(index);\n },\n []\n );\n\n const thumbnailOverlays = useMemo(\n () =>\n assets.flat().map((uri, index) =>\n ThumbnailOverlayComponent ? (\n <MemoizedThumbnailOverlayComponent\n // biome-ignore lint/suspicious/noArrayIndexKey: we need to force re-render on order change\n key={`${uri}-${index}`}\n OverlayComponent={ThumbnailOverlayComponent}\n uri={uri}\n index={index}\n width={thumbnailWidth}\n height={thumbnailHeight}\n selected={selectedUris.has(uri)}\n debugLabels={debugLabels}\n isNull={\n !(\n index >= visibleRangeMin - OVERLAYS_BUFFER &&\n index <= visibleRangeMax + OVERLAYS_BUFFER\n )\n }\n // isNull={false}\n />\n ) : null\n ),\n [\n assets,\n ThumbnailOverlayComponent,\n thumbnailWidth,\n thumbnailHeight,\n selectedUris,\n visibleRangeMin,\n visibleRangeMax,\n debugLabels,\n ]\n );\n\n const sectionHeaders = useMemo(() => {\n if (!SectionHeaderComponent || !isNestedArray(assets)) return null;\n return assets.map((group, index) => (\n <MemoizedSectionHeader\n key={JSON.stringify(group)}\n SectionHeader={SectionHeaderComponent}\n index={index}\n width={width}\n height={Number.parseFloat(\n (sectionHeaderStyle?.height ?? 0).toString()\n )}\n debugLabels={debugLabels}\n isNull={\n !(\n index >= visibleHeadersRangeMin - OVERLAYS_BUFFER &&\n index <= visibleHeadersRangeMax + OVERLAYS_BUFFER\n )\n }\n />\n ));\n }, [\n SectionHeaderComponent,\n assets,\n sectionHeaderStyle?.height,\n debugLabels,\n width,\n visibleHeadersRangeMin,\n visibleHeadersRangeMax,\n ]);\n\n const children = useMemo(\n () => [sectionHeaders, thumbnailOverlays],\n [sectionHeaders, thumbnailOverlays]\n );\n\n const handlePreviewMenuOptionSelected = useCallback(\n (event: NativeSyntheticEvent<OnPreviewMenuOptionSelectedPayload>) => {\n const action =\n contextMenuOptions?.[event.nativeEvent.optionIndex]?.action;\n action?.({\n uri: event.nativeEvent.uri,\n index: event.nativeEvent.index,\n });\n },\n [contextMenuOptions]\n );\n\n const handleToggleSelection = useCallback(\n (uri: string, selected?: boolean) => {\n const shouldSetSelected =\n selected === undefined ? !selectedUris.has(uri) : selected;\n const newSet = new Set(selectedUris);\n if (shouldSetSelected) {\n newSet.add(uri);\n } else {\n newSet.delete(uri);\n }\n internalRef.current?.setSelected([...newSet]);\n },\n [selectedUris]\n );\n\n return (\n <>\n <NativeViewMemoized\n // key={assets.length}\n {...props}\n thumbnailStyle={thumbnailStyleProcessed}\n sectionHeaderStyle={sectionHeaderStyle}\n assets={assets}\n onSelectionChange={handleSelectionChange}\n onOverlayPreloadRequested={handleOverlayPreloadRequest}\n onSectionHeadersVisible={handleSectionHeadersVisible}\n onThumbnailPress={handleThumbnailPress}\n onPreviewMenuOptionSelected={handlePreviewMenuOptionSelected}\n contextMenuOptions={contextMenuOptions}\n onLayout={() => {\n if (initiallySelected) {\n internalRef.current?.setSelected(\n initiallySelected?.filter(isNotNullOrUndefined)\n );\n }\n }}\n ref={internalRef}\n >\n {/* @ts-expect-error type of children is intentionally set to never | undefined */}\n {children}\n </NativeViewMemoized>\n <GalleryModal\n visible={modalVisible}\n uris={assets.flat()}\n initialIndex={initialIndex}\n onClose={handleModalClose}\n selectedUris={selectedUris}\n overlayComponent={FullscreenOverlayComponent}\n style={fullscreenViewOverlayStyle}\n toggleSelection={handleToggleSelection}\n viewer={viewer}\n />\n </>\n );\n }\n);\n\nfunction useThumbnailDimensions({\n thumbnailStyle,\n contentContainerStyle,\n columnsCount = 2,\n}: {\n thumbnailStyle: ExpoSimpleGalleryViewProps['thumbnailStyle'];\n contentContainerStyle: ExpoSimpleGalleryViewProps['contentContainerStyle'];\n columnsCount?: number;\n}) {\n const { width } = useWindowDimensions();\n const thumbnailStyleProcessed = useMemo(() => {\n if (!thumbnailStyle?.borderColor) return thumbnailStyle;\n const { borderColor } = thumbnailStyle;\n return {\n ...thumbnailStyle,\n borderColor: (processColor(borderColor) as ColorValue) ?? undefined,\n };\n }, [thumbnailStyle]);\n const { thumbnailWidth, thumbnailHeight } = useMemo(() => {\n const thumbnailAspectRatio =\n Number.parseFloat(\n (thumbnailStyleProcessed?.aspectRatio as string) ?? ''\n ) || 1;\n\n const thumbnailsSpacing = contentContainerStyle?.gap\n ? Number.parseInt(contentContainerStyle?.gap.toString())\n : 0;\n const paddingLeft =\n contentContainerStyle?.paddingLeft ??\n contentContainerStyle?.paddingHorizontal ??\n contentContainerStyle?.padding ??\n 0;\n const paddingRight =\n contentContainerStyle?.paddingRight ??\n contentContainerStyle?.paddingHorizontal ??\n contentContainerStyle?.padding ??\n 0;\n const padding =\n Number.parseFloat(paddingLeft as string) +\n Number.parseFloat(paddingRight as string);\n const thumbnailWidth =\n (width - padding - (columnsCount - 1) * thumbnailsSpacing) / columnsCount;\n const thumbnailHeight = thumbnailWidth / thumbnailAspectRatio;\n return { thumbnailWidth, thumbnailHeight };\n }, [width, thumbnailStyleProcessed, columnsCount, contentContainerStyle]);\n return { thumbnailWidth, thumbnailHeight, thumbnailStyleProcessed };\n}\n"]}
|
|
@@ -1,24 +1,135 @@
|
|
|
1
1
|
import ExpoModulesCore
|
|
2
2
|
|
|
3
3
|
public class GalleryImageViewerModule: Module {
|
|
4
|
-
private var uris: [String] = []
|
|
5
|
-
|
|
6
4
|
public func definition() -> ModuleDefinition {
|
|
7
5
|
Name("GalleryImageViewer")
|
|
8
|
-
|
|
6
|
+
|
|
7
|
+
View(GalleryViewerContainer.self) {
|
|
9
8
|
Events("onPageChange", "onImageLoaded", "onDismissAttempt")
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
}
|
|
9
|
+
|
|
10
|
+
Prop("imageData") { (view: GalleryViewerContainer, assets: [String: Any]) in
|
|
11
|
+
let uris = assets["uris"] as? [String] ?? []
|
|
12
|
+
let startIndex = assets["startIndex"] as? Int ?? 0
|
|
13
|
+
view.setImageData(uris: uris, startIndex: startIndex)
|
|
16
14
|
}
|
|
17
|
-
|
|
15
|
+
|
|
16
|
+
Prop("goToPage") { (view: GalleryViewerContainer, index: Int?) in
|
|
18
17
|
if let index = index {
|
|
19
|
-
view.
|
|
18
|
+
view.goToPage(index)
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
Prop("viewer") { (view: GalleryViewerContainer, viewerType: String?) in
|
|
23
|
+
if let viewerType = viewerType {
|
|
24
|
+
view.setViewerType(viewerType)
|
|
20
25
|
}
|
|
21
26
|
}
|
|
22
27
|
}
|
|
23
28
|
}
|
|
24
29
|
}
|
|
30
|
+
|
|
31
|
+
protocol ViewerProtocol: UIView {
|
|
32
|
+
func setImageData(uris: [String], startIndex: Int)
|
|
33
|
+
func goToPage(_ index: Int)
|
|
34
|
+
var onPageChange: EventDispatcher { get set }
|
|
35
|
+
var onImageLoaded: EventDispatcher { get set }
|
|
36
|
+
var onDismissAttempt: EventDispatcher { get set }
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
enum ViewerType: Equatable {
|
|
40
|
+
case uikit
|
|
41
|
+
case swiftui
|
|
42
|
+
|
|
43
|
+
static func from(string: String) -> ViewerType {
|
|
44
|
+
switch string.lowercased() {
|
|
45
|
+
case "swiftui":
|
|
46
|
+
return .swiftui
|
|
47
|
+
case "uikit":
|
|
48
|
+
return .uikit
|
|
49
|
+
default:
|
|
50
|
+
return .uikit
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
func createViewer() -> ViewerProtocol {
|
|
55
|
+
switch self {
|
|
56
|
+
case .uikit:
|
|
57
|
+
return GalleryImageViewerView()
|
|
58
|
+
case .swiftui:
|
|
59
|
+
return SwiftUIGalleryHostView()
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/// Container view that can switch between UIKit and SwiftUI gallery viewers
|
|
65
|
+
final class GalleryViewerContainer: ExpoView {
|
|
66
|
+
// Events exposed to JS
|
|
67
|
+
let onPageChange = EventDispatcher()
|
|
68
|
+
let onImageLoaded = EventDispatcher()
|
|
69
|
+
let onDismissAttempt = EventDispatcher()
|
|
70
|
+
|
|
71
|
+
private var currentViewer: ViewerProtocol?
|
|
72
|
+
private var viewerType: ViewerType = .uikit
|
|
73
|
+
|
|
74
|
+
// Store the data to reapply when switching viewers
|
|
75
|
+
private var currentUris: [String] = []
|
|
76
|
+
private var currentStartIndex: Int = 0
|
|
77
|
+
|
|
78
|
+
required init(appContext: AppContext? = nil) {
|
|
79
|
+
super.init(appContext: appContext)
|
|
80
|
+
setupViewer()
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
func setViewerType(_ viewerTypeString: String) {
|
|
84
|
+
print("Setting viewer type to \(viewerTypeString)")
|
|
85
|
+
let newViewerType = ViewerType.from(string: viewerTypeString)
|
|
86
|
+
print("New viewer type: \(newViewerType)")
|
|
87
|
+
|
|
88
|
+
// Only switch if the type is different
|
|
89
|
+
guard newViewerType != viewerType else { return }
|
|
90
|
+
|
|
91
|
+
viewerType = newViewerType
|
|
92
|
+
|
|
93
|
+
// Remove old viewer
|
|
94
|
+
if let oldViewer = currentViewer {
|
|
95
|
+
oldViewer.removeFromSuperview()
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// Create and setup new viewer
|
|
99
|
+
setupViewer()
|
|
100
|
+
|
|
101
|
+
// Reapply current data if any
|
|
102
|
+
if !currentUris.isEmpty {
|
|
103
|
+
currentViewer?.setImageData(uris: currentUris, startIndex: currentStartIndex)
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
private func setupViewer() {
|
|
108
|
+
let newViewer = viewerType.createViewer()
|
|
109
|
+
|
|
110
|
+
// Add as subview
|
|
111
|
+
addSubview(newViewer)
|
|
112
|
+
newViewer.translatesAutoresizingMaskIntoConstraints = false
|
|
113
|
+
NSLayoutConstraint.activate([
|
|
114
|
+
newViewer.topAnchor.constraint(equalTo: topAnchor),
|
|
115
|
+
newViewer.bottomAnchor.constraint(equalTo: bottomAnchor),
|
|
116
|
+
newViewer.leadingAnchor.constraint(equalTo: leadingAnchor),
|
|
117
|
+
newViewer.trailingAnchor.constraint(equalTo: trailingAnchor),
|
|
118
|
+
])
|
|
119
|
+
|
|
120
|
+
currentViewer = newViewer
|
|
121
|
+
currentViewer?.onPageChange = onPageChange
|
|
122
|
+
currentViewer?.onImageLoaded = onImageLoaded
|
|
123
|
+
currentViewer?.onDismissAttempt = onDismissAttempt
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
func setImageData(uris: [String], startIndex: Int) {
|
|
127
|
+
currentUris = uris
|
|
128
|
+
currentStartIndex = startIndex
|
|
129
|
+
currentViewer?.setImageData(uris: uris, startIndex: startIndex)
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
func goToPage(_ index: Int) {
|
|
133
|
+
currentViewer?.goToPage(index)
|
|
134
|
+
}
|
|
135
|
+
}
|
|
@@ -11,9 +11,9 @@ class GalleryImageViewerView: ExpoView {
|
|
|
11
11
|
var uris: [String] = []
|
|
12
12
|
var currentIndex: Int = 0
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
14
|
+
var onPageChange = EventDispatcher()
|
|
15
|
+
var onImageLoaded = EventDispatcher()
|
|
16
|
+
var onDismissAttempt = EventDispatcher()
|
|
17
17
|
|
|
18
18
|
private var mediaTypeCache = [String: MediaType]() // Cache the media type for each URI
|
|
19
19
|
private var loadedLivePhotos = [String: PHLivePhoto]() // Cache for loaded live photos
|
|
@@ -75,7 +75,8 @@ class GalleryImageViewerView: ExpoView {
|
|
|
75
75
|
|
|
76
76
|
// For videos, properly clean up player items
|
|
77
77
|
for (_, playerItem) in loadedPlayerItems {
|
|
78
|
-
NotificationCenter.default.removeObserver(
|
|
78
|
+
NotificationCenter.default.removeObserver(
|
|
79
|
+
self, name: .AVPlayerItemDidPlayToEndTime, object: playerItem)
|
|
79
80
|
}
|
|
80
81
|
loadedPlayerItems.removeAll()
|
|
81
82
|
|
|
@@ -95,7 +96,8 @@ class GalleryImageViewerView: ExpoView {
|
|
|
95
96
|
if hasHighQuality {
|
|
96
97
|
let viewController = ImagePageViewController()
|
|
97
98
|
viewController.delegate = self
|
|
98
|
-
viewController.configure(
|
|
99
|
+
viewController.configure(
|
|
100
|
+
with: uri, index: index, imageCache: imageCache, hasHighQuality: true)
|
|
99
101
|
completion(viewController)
|
|
100
102
|
return
|
|
101
103
|
}
|
|
@@ -111,7 +113,8 @@ class GalleryImageViewerView: ExpoView {
|
|
|
111
113
|
// Fall back to image view controller for errors
|
|
112
114
|
let viewController = ImagePageViewController()
|
|
113
115
|
viewController.delegate = self
|
|
114
|
-
viewController.configure(
|
|
116
|
+
viewController.configure(
|
|
117
|
+
with: uri, index: index, imageCache: self.imageCache, hasHighQuality: false)
|
|
115
118
|
completion(viewController)
|
|
116
119
|
return
|
|
117
120
|
}
|
|
@@ -129,7 +132,8 @@ class GalleryImageViewerView: ExpoView {
|
|
|
129
132
|
// Fall back to image view controller if we couldn't determine media type
|
|
130
133
|
let viewController = ImagePageViewController()
|
|
131
134
|
viewController.delegate = self
|
|
132
|
-
viewController.configure(
|
|
135
|
+
viewController.configure(
|
|
136
|
+
with: uri, index: index, imageCache: self.imageCache, hasHighQuality: false)
|
|
133
137
|
completion(viewController)
|
|
134
138
|
}
|
|
135
139
|
}
|
|
@@ -148,7 +152,8 @@ class GalleryImageViewerView: ExpoView {
|
|
|
148
152
|
stopActiveMediaPlayback()
|
|
149
153
|
|
|
150
154
|
let uri = uris[index]
|
|
151
|
-
let direction: UIPageViewController.NavigationDirection =
|
|
155
|
+
let direction: UIPageViewController.NavigationDirection =
|
|
156
|
+
index > currentIndex ? .forward : .reverse
|
|
152
157
|
|
|
153
158
|
let viewController = createAppropriateViewController(for: uri, at: index)
|
|
154
159
|
|
|
@@ -306,7 +311,9 @@ extension GalleryImageViewerView: UIPageViewControllerDataSource {
|
|
|
306
311
|
viewController.delegate = self
|
|
307
312
|
activeMediaViewController = viewController // Track the new active controller
|
|
308
313
|
return viewController
|
|
309
|
-
} else if mediaType == .video,
|
|
314
|
+
} else if mediaType == .video,
|
|
315
|
+
let playerItem = loadedPlayerItems[uri]?.copy() as? AVPlayerItem
|
|
316
|
+
{
|
|
310
317
|
let viewController = VideoViewController()
|
|
311
318
|
viewController.configure(with: playerItem, uri: uri, index: index)
|
|
312
319
|
viewController.delegate = self
|
|
@@ -320,7 +327,8 @@ extension GalleryImageViewerView: UIPageViewControllerDataSource {
|
|
|
320
327
|
let hasHighQuality = highQualityLoadedURIs.contains(uri)
|
|
321
328
|
let viewController = ImagePageViewController()
|
|
322
329
|
viewController.delegate = self
|
|
323
|
-
viewController.configure(
|
|
330
|
+
viewController.configure(
|
|
331
|
+
with: uri, index: index, imageCache: imageCache, hasHighQuality: hasHighQuality)
|
|
324
332
|
|
|
325
333
|
// Immediately start the media detection and loading process
|
|
326
334
|
loadMediaForPageAndReplace(uri: uri, index: index, currentViewController: viewController)
|
|
@@ -328,7 +336,9 @@ extension GalleryImageViewerView: UIPageViewControllerDataSource {
|
|
|
328
336
|
return viewController
|
|
329
337
|
}
|
|
330
338
|
|
|
331
|
-
private func loadMediaForPageAndReplace(
|
|
339
|
+
private func loadMediaForPageAndReplace(
|
|
340
|
+
uri: String, index: Int, currentViewController: UIViewController
|
|
341
|
+
) {
|
|
332
342
|
// Skip if we already know this is a regular image
|
|
333
343
|
if let mediaType = mediaTypeCache[uri], mediaType == .image {
|
|
334
344
|
return
|
|
@@ -357,7 +367,8 @@ extension GalleryImageViewerView: UIPageViewControllerDataSource {
|
|
|
357
367
|
DispatchQueue.global(qos: .userInitiated).async { [weak self] in
|
|
358
368
|
guard let self = self else { return }
|
|
359
369
|
|
|
360
|
-
imageLoader.loadMedia(from: uri) {
|
|
370
|
+
imageLoader.loadMedia(from: uri) {
|
|
371
|
+
[weak self, weak currentViewController] mediaResult, error in
|
|
361
372
|
guard
|
|
362
373
|
let self = self,
|
|
363
374
|
let mediaResult = mediaResult,
|
|
@@ -474,7 +485,9 @@ extension GalleryImageViewerView: UIPageViewControllerDataSource {
|
|
|
474
485
|
}
|
|
475
486
|
|
|
476
487
|
// Load the media type and content in the background if needed
|
|
477
|
-
private func loadMediaTypeIfNeeded(
|
|
488
|
+
private func loadMediaTypeIfNeeded(
|
|
489
|
+
for uri: String, at index: Int, currentViewController: UIViewController
|
|
490
|
+
) {
|
|
478
491
|
// Skip if we already know the media type
|
|
479
492
|
if mediaTypeCache[uri] != nil {
|
|
480
493
|
return
|
|
@@ -495,7 +508,8 @@ extension GalleryImageViewerView: UIPageViewControllerDataSource {
|
|
|
495
508
|
if mediaType == .image { return }
|
|
496
509
|
|
|
497
510
|
// For other media types, continue loading the full content
|
|
498
|
-
imageLoader.loadMedia(from: uri) {
|
|
511
|
+
imageLoader.loadMedia(from: uri) {
|
|
512
|
+
[weak self, weak currentViewController] mediaResult, error in
|
|
499
513
|
guard let self = self,
|
|
500
514
|
let currentViewController = currentViewController,
|
|
501
515
|
currentViewController.isViewLoaded
|
|
@@ -577,7 +591,9 @@ extension GalleryImageViewerView: UIPageViewControllerDelegate {
|
|
|
577
591
|
}
|
|
578
592
|
|
|
579
593
|
// Update the active media controller reference
|
|
580
|
-
if currentViewController is VideoViewController
|
|
594
|
+
if currentViewController is VideoViewController
|
|
595
|
+
|| currentViewController is LivePhotoViewController
|
|
596
|
+
{
|
|
581
597
|
activeMediaViewController = currentViewController
|
|
582
598
|
}
|
|
583
599
|
|
|
@@ -587,7 +603,8 @@ extension GalleryImageViewerView: UIPageViewControllerDelegate {
|
|
|
587
603
|
onPageChange(["index": currentIndex, "uri": uri])
|
|
588
604
|
|
|
589
605
|
// Now use our improved method to load the media if needed
|
|
590
|
-
loadMediaForPageAndReplace(
|
|
606
|
+
loadMediaForPageAndReplace(
|
|
607
|
+
uri: uri, index: index, currentViewController: currentViewController)
|
|
591
608
|
}
|
|
592
609
|
}
|
|
593
610
|
|
|
@@ -615,7 +632,9 @@ extension GalleryImageViewerView: MediaViewControllerDelegate {
|
|
|
615
632
|
|
|
616
633
|
// MARK: - ImagePageViewControllerDelegate
|
|
617
634
|
extension GalleryImageViewerView: ImagePageViewControllerDelegate {
|
|
618
|
-
func imagePageViewController(
|
|
635
|
+
func imagePageViewController(
|
|
636
|
+
_ controller: ImagePageViewController, didLoadHighQualityImage uri: String
|
|
637
|
+
) {
|
|
619
638
|
highQualityLoadedURIs.insert(uri)
|
|
620
639
|
onImageLoaded(["uri": uri, "index": controller.index])
|
|
621
640
|
}
|
|
@@ -624,7 +643,9 @@ extension GalleryImageViewerView: ImagePageViewControllerDelegate {
|
|
|
624
643
|
extension GalleryImageViewerView: UIScrollViewDelegate {
|
|
625
644
|
// Add method to initialize page view controller
|
|
626
645
|
private func setupPageViewControllerGestures() {
|
|
627
|
-
if let scrollView = pageViewController.view.subviews.first(where: { $0 is UIScrollView })
|
|
646
|
+
if let scrollView = pageViewController.view.subviews.first(where: { $0 is UIScrollView })
|
|
647
|
+
as? UIScrollView
|
|
648
|
+
{
|
|
628
649
|
scrollView.delegate = self
|
|
629
650
|
}
|
|
630
651
|
}
|
|
@@ -632,6 +653,17 @@ extension GalleryImageViewerView: UIScrollViewDelegate {
|
|
|
632
653
|
// Detect when the page view controller's scroll view begins dragging
|
|
633
654
|
func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
|
|
634
655
|
// Notify all live photo view controllers that page swiping has begun
|
|
635
|
-
NotificationCenter.default.post(
|
|
656
|
+
NotificationCenter.default.post(
|
|
657
|
+
name: Notification.Name("PageControllerWillScroll"), object: nil)
|
|
658
|
+
}
|
|
659
|
+
}
|
|
660
|
+
|
|
661
|
+
extension GalleryImageViewerView: ViewerProtocol {
|
|
662
|
+
func setImageData(uris: [String], startIndex: Int) {
|
|
663
|
+
loadImages(uris: uris, startIndex: startIndex)
|
|
664
|
+
}
|
|
665
|
+
|
|
666
|
+
func goToPage(_ index: Int) {
|
|
667
|
+
goToPageWithIndex(index)
|
|
636
668
|
}
|
|
637
669
|
}
|