@hortemo/expo-photos 2.0.0 → 4.0.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/README.md +1 -0
- package/build/ExpoPhotos.types.d.ts +11 -2
- package/build/ExpoPhotos.types.d.ts.map +1 -1
- package/build/ExpoPhotos.types.js.map +1 -1
- package/build/ExpoPhotosModule.d.ts +3 -2
- package/build/ExpoPhotosModule.d.ts.map +1 -1
- package/build/ExpoPhotosModule.js.map +1 -1
- package/build/PHImageSource.d.ts +3 -3
- package/build/PHImageSource.d.ts.map +1 -1
- package/build/PHImageSource.js +9 -14
- package/build/PHImageSource.js.map +1 -1
- package/ios/ExpoPhotosImageLoader.swift +11 -7
- package/ios/ExpoPhotosModule.swift +47 -18
- package/package.json +1 -1
- package/src/ExpoPhotos.types.ts +14 -2
- package/src/ExpoPhotosModule.ts +3 -1
- package/src/PHImageSource.tsx +18 -23
package/README.md
CHANGED
|
@@ -14,6 +14,7 @@ npm install @hortemo/expo-photos
|
|
|
14
14
|
- `requestImage(options: RequestImageOptions): Promise<void>`
|
|
15
15
|
- `requestVideo(options: RequestVideoOptions): Promise<void>`
|
|
16
16
|
- `pickAssets(options: PickAssetsOptions): Promise<PHAsset[]>`
|
|
17
|
+
- `authorizationStatus(accessLevel: PHAccessLevel): Promise<PHAuthorizationStatus>`
|
|
17
18
|
- `requestAuthorization(accessLevel: PHAccessLevel): Promise<PHAuthorizationStatus>`
|
|
18
19
|
- `presentLimitedLibraryPicker(): Promise<void>`
|
|
19
20
|
- `createPHImageSource(options: PHImageSourceOptions): ImageSourcePropType | undefined`
|
|
@@ -4,6 +4,8 @@ export interface PHAsset {
|
|
|
4
4
|
mediaType: PHAssetMediaType;
|
|
5
5
|
mediaSubtypes: PHAssetMediaSubtype;
|
|
6
6
|
duration: number;
|
|
7
|
+
pixelWidth: number;
|
|
8
|
+
pixelHeight: number;
|
|
7
9
|
}
|
|
8
10
|
export declare enum PHAuthorizationStatus {
|
|
9
11
|
notDetermined = 0,
|
|
@@ -48,6 +50,8 @@ export interface CGSize {
|
|
|
48
50
|
width: number;
|
|
49
51
|
height: number;
|
|
50
52
|
}
|
|
53
|
+
export type PHImageManagerMaximumSize = "PHImageManagerMaximumSize";
|
|
54
|
+
export type RequestImageTargetSize = CGSize | PHImageManagerMaximumSize;
|
|
51
55
|
export declare enum PHImageRequestOptionsResizeMode {
|
|
52
56
|
None = 0,
|
|
53
57
|
Fast = 1,
|
|
@@ -149,11 +153,16 @@ export interface AVAssetExportSessionOptions {
|
|
|
149
153
|
}
|
|
150
154
|
export interface RequestImageOptions extends PHImageRequestOptions, SDImageCoderOptions {
|
|
151
155
|
localIdentifier: string;
|
|
152
|
-
targetSize:
|
|
156
|
+
targetSize: RequestImageTargetSize;
|
|
153
157
|
contentMode: PHImageContentMode;
|
|
154
|
-
outputURL
|
|
158
|
+
outputURL?: string;
|
|
155
159
|
timeout?: number;
|
|
156
160
|
}
|
|
161
|
+
export interface RequestImageResult {
|
|
162
|
+
size: CGSize;
|
|
163
|
+
scale: number;
|
|
164
|
+
imageOrientation: number;
|
|
165
|
+
}
|
|
157
166
|
export interface RequestVideoOptions extends PHVideoRequestOptions, AVAssetExportSessionOptions {
|
|
158
167
|
localIdentifier: string;
|
|
159
168
|
exportPreset: AVAssetExportPreset;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExpoPhotos.types.d.ts","sourceRoot":"","sources":["../src/ExpoPhotos.types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,OAAO;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,gBAAgB,CAAC;IAC5B,aAAa,EAAE,mBAAmB,CAAC;IACnC,QAAQ,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"ExpoPhotos.types.d.ts","sourceRoot":"","sources":["../src/ExpoPhotos.types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExpoPhotos.types.js","sourceRoot":"","sources":["../src/ExpoPhotos.types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ExpoPhotos.types.js","sourceRoot":"","sources":["../src/ExpoPhotos.types.ts"],"names":[],"mappings":"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","sourcesContent":["export interface PHAsset {\n localIdentifier: string;\n creationDate: number;\n mediaType: PHAssetMediaType;\n mediaSubtypes: PHAssetMediaSubtype;\n duration: number;\n pixelWidth: number;\n pixelHeight: number;\n}\n\nexport enum PHAuthorizationStatus {\n notDetermined = 0,\n restricted = 1,\n denied = 2,\n authorized = 3,\n limited = 4,\n}\n\nexport enum PHAccessLevel {\n addOnly = 1,\n readWrite = 2,\n}\n\nexport enum PHAssetMediaType {\n Unknown = 0,\n Image = 1,\n Video = 2,\n Audio = 3,\n}\n\nexport enum PHAssetMediaSubtype {\n None = 0,\n PhotoPanorama = 1 << 0,\n PhotoHDR = 1 << 1,\n PhotoScreenshot = 1 << 2,\n PhotoLive = 1 << 3,\n PhotoDepthEffect = 1 << 4,\n VideoStreamed = 1 << 16,\n VideoHighFrameRate = 1 << 17,\n VideoTimelapse = 1 << 18,\n VideoCinematic = 1 << 19,\n}\n\nexport interface NSSortDescriptor {\n key: string;\n ascending: boolean;\n}\n\nexport interface PHFetchOptions {\n predicate?: string;\n fetchLimit?: number;\n sortDescriptors?: NSSortDescriptor[];\n}\n\nexport type FetchAssetsOptions = PHFetchOptions;\n\nexport interface CGSize {\n width: number;\n height: number;\n}\n\nexport type PHImageManagerMaximumSize = \"PHImageManagerMaximumSize\";\n\nexport type RequestImageTargetSize = CGSize | PHImageManagerMaximumSize;\n\nexport enum PHImageRequestOptionsResizeMode {\n None = 0,\n Fast = 1,\n Exact = 2,\n}\n\nexport enum PHImageRequestOptionsDeliveryMode {\n Opportunistic = 0,\n HighQualityFormat = 1,\n FastFormat = 2,\n}\n\nexport enum PHImageContentMode {\n aspectFit = 0,\n aspectFill = 1,\n}\n\nexport interface PHImageRequestOptions {\n isNetworkAccessAllowed?: boolean;\n resizeMode?: PHImageRequestOptionsResizeMode;\n deliveryMode?: PHImageRequestOptionsDeliveryMode;\n}\n\nexport interface SDImageCoderOptions {\n encodeCompressionQuality?: number;\n encodeMaxFileSize?: number;\n}\n\nexport enum PHVideoRequestOptionsDeliveryMode {\n Automatic = 0,\n HighQualityFormat = 1,\n MediumQualityFormat = 2,\n FastFormat = 3,\n}\n\nexport interface PHVideoRequestOptions {\n isNetworkAccessAllowed?: boolean;\n deliveryMode?: PHVideoRequestOptionsDeliveryMode;\n}\n\nexport interface CMTimeRange {\n start: number;\n duration: number;\n}\n\nexport enum AVFileType {\n ac3 = \"public.ac3-audio\",\n aifc = \"public.aifc-audio\",\n aiff = \"public.aiff-audio\",\n AHAP = \"com.apple.itt\",\n amr = \"org.3gpp.adaptive-multi-rate-audio\",\n appleiTT = \"com.apple.itt\",\n au = \"public.au-audio\",\n avci = \"public.avci\",\n caf = \"com.apple.coreaudio-format\",\n dng = \"com.adobe.raw-image\",\n eac3 = \"public.eac3-audio\",\n heic = \"public.heic\",\n heif = \"public.heif\",\n jpg = \"public.jpeg\",\n m4a = \"com.apple.m4a-audio\",\n m4v = \"com.apple.m4v-video\",\n mobile3GPP = \"public.3gpp\",\n mobile3GPP2 = \"public.3gpp2\",\n mov = \"com.apple.quicktime-movie\",\n mp3 = \"public.mp3\",\n mp4 = \"public.mpeg-4\",\n SCC = \"com.scenarist.cc\",\n tif = \"public.tiff\",\n wav = \"com.microsoft.waveform-audio\",\n}\n\nexport enum AVAssetExportPreset {\n LowQuality = \"AVAssetExportPresetLowQuality\",\n MediumQuality = \"AVAssetExportPresetMediumQuality\",\n HighestQuality = \"AVAssetExportPresetHighestQuality\",\n HEVCHighestQuality = \"AVAssetExportPresetHEVCHighestQuality\",\n HEVCHighestQualityWithAlpha = \"AVAssetExportPresetHEVCHighestQualityWithAlpha\",\n AVC640x480 = \"AVAssetExportPreset640x480\",\n AVC960x540 = \"AVAssetExportPreset960x540\",\n AVC1280x720 = \"AVAssetExportPreset1280x720\",\n AVC1920x1080 = \"AVAssetExportPreset1920x1080\",\n AVC3840x2160 = \"AVAssetExportPreset3840x2160\",\n HEVC1920x1080 = \"AVAssetExportPresetHEVC1920x1080\",\n HEVC3840x2160 = \"AVAssetExportPresetHEVC3840x2160\",\n HEVC1920x1080WithAlpha = \"AVAssetExportPresetHEVC1920x1080WithAlpha\",\n HEVC3840x2160WithAlpha = \"AVAssetExportPresetHEVC3840x2160WithAlpha\",\n HEVC7680x4320 = \"AVAssetExportPresetHEVC7680x4320\",\n MVHEVC960x960 = \"AVAssetExportPresetMVHEVC960x960\",\n MVHEVC1440x1440 = \"AVAssetExportPresetMVHEVC1440x1440\",\n AppleM4V480pSD = \"AVAssetExportPresetAppleM4V480pSD\",\n AppleM4V720pHD = \"AVAssetExportPresetAppleM4V720pHD\",\n AppleM4V1080pHD = \"AVAssetExportPresetAppleM4V1080pHD\",\n AppleM4ViPod = \"AVAssetExportPresetAppleM4ViPod\",\n AppleM4VAppleTV = \"AVAssetExportPresetAppleM4VAppleTV\",\n AppleM4VCellular = \"AVAssetExportPresetAppleM4VCellular\",\n AppleM4VWiFi = \"AVAssetExportPresetAppleM4VWiFi\",\n AppleProRes422LPCM = \"AVAssetExportPresetAppleProRes422LPCM\",\n AppleProRes4444LPCM = \"AVAssetExportPresetAppleProRes4444LPCM\",\n Passthrough = \"AVAssetExportPresetPassthrough\",\n AppleM4A = \"AVAssetExportPresetAppleM4A\",\n}\n\nexport interface AVAssetExportSessionOptions {\n outputURL: string;\n outputFileType?: AVFileType;\n fileLengthLimit?: number;\n timeRange?: CMTimeRange;\n}\n\nexport interface RequestImageOptions\n extends PHImageRequestOptions,\n SDImageCoderOptions {\n localIdentifier: string;\n targetSize: RequestImageTargetSize;\n contentMode: PHImageContentMode;\n outputURL?: string;\n timeout?: number;\n}\n\nexport interface RequestImageResult {\n size: CGSize;\n scale: number;\n imageOrientation: number;\n}\n\nexport interface RequestVideoOptions\n extends PHVideoRequestOptions,\n AVAssetExportSessionOptions {\n localIdentifier: string;\n exportPreset: AVAssetExportPreset;\n timeout?: number;\n}\n\nexport enum PHPickerFilter {\n images = \"images\",\n videos = \"videos\",\n any = \"any\",\n}\n\nexport interface PickAssetsOptions {\n filter?: PHPickerFilter;\n selectionLimit?: number;\n}\n"]}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { NativeModule } from "expo-modules-core";
|
|
2
|
-
import type { FetchAssetsOptions, PHAuthorizationStatus, PHAccessLevel, PHAsset, PickAssetsOptions, RequestImageOptions, RequestVideoOptions } from "./ExpoPhotos.types";
|
|
2
|
+
import type { FetchAssetsOptions, PHAuthorizationStatus, PHAccessLevel, PHAsset, PickAssetsOptions, RequestImageOptions, RequestVideoOptions, RequestImageResult } from "./ExpoPhotos.types";
|
|
3
3
|
export declare class ExpoPhotosModule extends NativeModule {
|
|
4
4
|
fetchAssets(options: FetchAssetsOptions): Promise<PHAsset[]>;
|
|
5
|
-
requestImage(options: RequestImageOptions): Promise<
|
|
5
|
+
requestImage(options: RequestImageOptions): Promise<RequestImageResult>;
|
|
6
6
|
requestVideo(options: RequestVideoOptions): Promise<void>;
|
|
7
7
|
pickAssets(options: PickAssetsOptions): Promise<PHAsset[]>;
|
|
8
|
+
authorizationStatus(accessLevel: PHAccessLevel): Promise<PHAuthorizationStatus>;
|
|
8
9
|
requestAuthorization(accessLevel: PHAccessLevel): Promise<PHAuthorizationStatus>;
|
|
9
10
|
presentLimitedLibraryPicker(): Promise<void>;
|
|
10
11
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExpoPhotosModule.d.ts","sourceRoot":"","sources":["../src/ExpoPhotosModule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAuB,MAAM,mBAAmB,CAAC;AACtE,OAAO,KAAK,EACV,kBAAkB,EAClB,qBAAqB,EACrB,aAAa,EACb,OAAO,EACP,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,
|
|
1
|
+
{"version":3,"file":"ExpoPhotosModule.d.ts","sourceRoot":"","sources":["../src/ExpoPhotosModule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAuB,MAAM,mBAAmB,CAAC;AACtE,OAAO,KAAK,EACV,kBAAkB,EAClB,qBAAqB,EACrB,aAAa,EACb,OAAO,EACP,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,EACnB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,YAAY;IACxD,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAC5D,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IACvE,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IACzD,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAC1D,mBAAmB,CAAC,WAAW,EAAE,aAAa,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAC/E,oBAAoB,CAAC,WAAW,EAAE,aAAa,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAChF,2BAA2B,IAAI,OAAO,CAAC,IAAI,CAAC;CAC7C;;AAED,wBAAmE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExpoPhotosModule.js","sourceRoot":"","sources":["../src/ExpoPhotosModule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"ExpoPhotosModule.js","sourceRoot":"","sources":["../src/ExpoPhotosModule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAsBtE,eAAe,mBAAmB,CAAmB,YAAY,CAAC,CAAC","sourcesContent":["import { NativeModule, requireNativeModule } from \"expo-modules-core\";\nimport type {\n FetchAssetsOptions,\n PHAuthorizationStatus,\n PHAccessLevel,\n PHAsset,\n PickAssetsOptions,\n RequestImageOptions,\n RequestVideoOptions,\n RequestImageResult,\n} from \"./ExpoPhotos.types\";\n\nexport declare class ExpoPhotosModule extends NativeModule {\n fetchAssets(options: FetchAssetsOptions): Promise<PHAsset[]>;\n requestImage(options: RequestImageOptions): Promise<RequestImageResult>;\n requestVideo(options: RequestVideoOptions): Promise<void>;\n pickAssets(options: PickAssetsOptions): Promise<PHAsset[]>;\n authorizationStatus(accessLevel: PHAccessLevel): Promise<PHAuthorizationStatus>;\n requestAuthorization(accessLevel: PHAccessLevel): Promise<PHAuthorizationStatus>;\n presentLimitedLibraryPicker(): Promise<void>;\n}\n\nexport default requireNativeModule<ExpoPhotosModule>(\"ExpoPhotos\");\n"]}
|
package/build/PHImageSource.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import type { ImageSourcePropType } from "react-native";
|
|
2
|
-
import {
|
|
2
|
+
import { PHImageContentMode, PHImageRequestOptionsDeliveryMode, PHImageRequestOptionsResizeMode, RequestImageTargetSize } from "./ExpoPhotos.types";
|
|
3
3
|
export interface PHImageSourceOptions {
|
|
4
4
|
localIdentifier: string;
|
|
5
|
-
targetSize?:
|
|
5
|
+
targetSize?: RequestImageTargetSize;
|
|
6
6
|
resizeMode?: PHImageRequestOptionsResizeMode;
|
|
7
7
|
deliveryMode?: PHImageRequestOptionsDeliveryMode;
|
|
8
8
|
contentMode?: PHImageContentMode;
|
|
@@ -28,5 +28,5 @@ export interface PHImageSourceOptions {
|
|
|
28
28
|
* />
|
|
29
29
|
* ```
|
|
30
30
|
*/
|
|
31
|
-
export declare function createPHImageSource(options: PHImageSourceOptions): ImageSourcePropType
|
|
31
|
+
export declare function createPHImageSource(options: PHImageSourceOptions): ImageSourcePropType;
|
|
32
32
|
//# sourceMappingURL=PHImageSource.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PHImageSource.d.ts","sourceRoot":"","sources":["../src/PHImageSource.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"PHImageSource.d.ts","sourceRoot":"","sources":["../src/PHImageSource.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EACL,kBAAkB,EAClB,iCAAiC,EACjC,+BAA+B,EAC/B,sBAAsB,EACvB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,WAAW,oBAAoB;IACnC,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,sBAAsB,CAAC;IACpC,UAAU,CAAC,EAAE,+BAA+B,CAAC;IAC7C,YAAY,CAAC,EAAE,iCAAiC,CAAC;IACjD,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAClC;AAwBD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,oBAAoB,GAC5B,mBAAmB,CAwBrB"}
|
package/build/PHImageSource.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { PHImageContentMode, PHImageRequestOptionsDeliveryMode, PHImageRequestOptionsResizeMode, } from "./ExpoPhotos.types";
|
|
2
1
|
const buildQueryString = (params) => {
|
|
3
2
|
const entries = Object.entries(params).filter(([, value]) => value !== undefined);
|
|
4
3
|
if (entries.length === 0) {
|
|
@@ -30,21 +29,17 @@ const buildQueryString = (params) => {
|
|
|
30
29
|
* ```
|
|
31
30
|
*/
|
|
32
31
|
export function createPHImageSource(options) {
|
|
33
|
-
const { localIdentifier } = options;
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
const { targetSize, resizeMode = PHImageRequestOptionsResizeMode.Fast, deliveryMode = PHImageRequestOptionsDeliveryMode.Opportunistic, contentMode = PHImageContentMode.aspectFill, isNetworkAccessAllowed = true, } = options;
|
|
38
|
-
const targetSizeValue = targetSize
|
|
39
|
-
? `${targetSize.width}x${targetSize.height}`
|
|
40
|
-
: undefined;
|
|
32
|
+
const { localIdentifier, resizeMode, deliveryMode, contentMode, isNetworkAccessAllowed, } = options;
|
|
33
|
+
const targetSize = options.targetSize && typeof options.targetSize === "object"
|
|
34
|
+
? `${options.targetSize.width}x${options.targetSize.height}`
|
|
35
|
+
: options.targetSize;
|
|
41
36
|
const query = buildQueryString({
|
|
42
37
|
localIdentifier,
|
|
43
|
-
targetSize
|
|
44
|
-
resizeMode
|
|
45
|
-
deliveryMode
|
|
46
|
-
contentMode
|
|
47
|
-
isNetworkAccessAllowed
|
|
38
|
+
targetSize,
|
|
39
|
+
resizeMode,
|
|
40
|
+
deliveryMode,
|
|
41
|
+
contentMode,
|
|
42
|
+
isNetworkAccessAllowed,
|
|
48
43
|
});
|
|
49
44
|
return { uri: `expo-photos://${query}` };
|
|
50
45
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PHImageSource.js","sourceRoot":"","sources":["../src/PHImageSource.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"PHImageSource.js","sourceRoot":"","sources":["../src/PHImageSource.tsx"],"names":[],"mappings":"AAiBA,MAAM,gBAAgB,GAAG,CACvB,MAA6D,EACrD,EAAE;IACV,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,CAC3C,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,CACnC,CAAC;IAEF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,CACL,GAAG;QACH,OAAO;aACJ,GAAG,CACF,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CACf,GAAG,kBAAkB,CAAC,GAAG,CAAC,IAAI,kBAAkB,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,CAClE;aACA,IAAI,CAAC,GAAG,CAAC,CACb,CAAC;AACJ,CAAC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,mBAAmB,CACjC,OAA6B;IAE7B,MAAM,EACJ,eAAe,EACf,UAAU,EACV,YAAY,EACZ,WAAW,EACX,sBAAsB,GACvB,GAAG,OAAO,CAAC;IAEZ,MAAM,UAAU,GACd,OAAO,CAAC,UAAU,IAAI,OAAO,OAAO,CAAC,UAAU,KAAK,QAAQ;QAC1D,CAAC,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,KAAK,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,EAAE;QAC5D,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC;IAEzB,MAAM,KAAK,GAAG,gBAAgB,CAAC;QAC7B,eAAe;QACf,UAAU;QACV,UAAU;QACV,YAAY;QACZ,WAAW;QACX,sBAAsB;KACvB,CAAC,CAAC;IAEH,OAAO,EAAE,GAAG,EAAE,iBAAiB,KAAK,EAAE,EAAE,CAAC;AAC3C,CAAC","sourcesContent":["import type { ImageSourcePropType } from \"react-native\";\nimport {\n PHImageContentMode,\n PHImageRequestOptionsDeliveryMode,\n PHImageRequestOptionsResizeMode,\n RequestImageTargetSize,\n} from \"./ExpoPhotos.types\";\n\nexport interface PHImageSourceOptions {\n localIdentifier: string;\n targetSize?: RequestImageTargetSize;\n resizeMode?: PHImageRequestOptionsResizeMode;\n deliveryMode?: PHImageRequestOptionsDeliveryMode;\n contentMode?: PHImageContentMode;\n isNetworkAccessAllowed?: boolean;\n}\n\nconst buildQueryString = (\n params: Record<string, string | number | boolean | undefined>\n): string => {\n const entries = Object.entries(params).filter(\n ([, value]) => value !== undefined\n );\n\n if (entries.length === 0) {\n return \"\";\n }\n\n return (\n \"?\" +\n entries\n .map(\n ([key, value]) =>\n `${encodeURIComponent(key)}=${encodeURIComponent(value ?? \"\")}`\n )\n .join(\"&\")\n );\n};\n\n/**\n * Creates a source object for React Native's Image component from a Photos library asset identifier.\n *\n * @param options - Configuration for image source, including the local identifier\n * @returns A source object that can be used with the Image component's `source` prop, or undefined if no identifier is provided\n *\n * @example\n * ```tsx\n * import { Image } from 'react-native';\n * import { createPHImageSource } from '@hortemo/expo-photos';\n *\n * <Image\n * source={createPHImageSource({\n * localIdentifier: asset.localIdentifier,\n * targetSize: { width: 200, height: 200 },\n * contentMode: PHImageContentMode.aspectFill,\n * })}\n * />\n * ```\n */\nexport function createPHImageSource(\n options: PHImageSourceOptions\n): ImageSourcePropType {\n const {\n localIdentifier,\n resizeMode,\n deliveryMode,\n contentMode,\n isNetworkAccessAllowed,\n } = options;\n\n const targetSize =\n options.targetSize && typeof options.targetSize === \"object\"\n ? `${options.targetSize.width}x${options.targetSize.height}`\n : options.targetSize;\n\n const query = buildQueryString({\n localIdentifier,\n targetSize,\n resizeMode,\n deliveryMode,\n contentMode,\n isNetworkAccessAllowed,\n });\n\n return { uri: `expo-photos://${query}` };\n}\n"]}
|
|
@@ -74,14 +74,18 @@ class ExpoPhotosImageLoader: NSObject, RCTBridgeModule, RCTImageURLLoader {
|
|
|
74
74
|
var targetSize = size.applying(CGAffineTransform(scaleX: scale, y: scale))
|
|
75
75
|
|
|
76
76
|
if let targetSizeString = queryParams["targetSize"] {
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
77
|
+
if targetSizeString.caseInsensitiveCompare("PHImageManagerMaximumSize") == .orderedSame {
|
|
78
|
+
targetSize = PHImageManagerMaximumSize
|
|
79
|
+
} else {
|
|
80
|
+
let components = targetSizeString.lowercased().components(separatedBy: "x")
|
|
81
|
+
guard components.count == 2,
|
|
82
|
+
let width = Double(components[0]),
|
|
83
|
+
let height = Double(components[1]) else {
|
|
84
|
+
completionHandler(RCTErrorWithMessage("Invalid targetSize format. Expected WIDTHxHEIGHT or PHImageManagerMaximumSize."), nil)
|
|
85
|
+
return {}
|
|
86
|
+
}
|
|
87
|
+
targetSize = CGSize(width: width, height: height)
|
|
83
88
|
}
|
|
84
|
-
targetSize = CGSize(width: width, height: height)
|
|
85
89
|
}
|
|
86
90
|
|
|
87
91
|
if let deliveryModeString = queryParams["deliveryMode"] {
|
|
@@ -13,7 +13,7 @@ struct FetchAssetsOptions: Record {
|
|
|
13
13
|
|
|
14
14
|
struct RequestImageOptions: Record {
|
|
15
15
|
@Field var localIdentifier: String?
|
|
16
|
-
@Field var targetSize:
|
|
16
|
+
@Field var targetSize: TargetSize?
|
|
17
17
|
@Field var contentMode: PHImageContentMode?
|
|
18
18
|
@Field var isNetworkAccessAllowed: Bool?
|
|
19
19
|
@Field var deliveryMode: PHImageRequestOptionsDeliveryMode?
|
|
@@ -87,17 +87,20 @@ public class ExpoPhotos: Module {
|
|
|
87
87
|
return assets
|
|
88
88
|
}
|
|
89
89
|
|
|
90
|
+
AsyncFunction("authorizationStatus") { (accessLevel: PHAccessLevel) -> Int in
|
|
91
|
+
return PHPhotoLibrary.authorizationStatus(for: accessLevel).rawValue
|
|
92
|
+
}
|
|
93
|
+
|
|
90
94
|
AsyncFunction("requestAuthorization") { (accessLevel: PHAccessLevel) async throws -> Int in
|
|
91
95
|
let status = await PHPhotoLibrary.requestAuthorization(for: accessLevel)
|
|
92
96
|
return status.rawValue
|
|
93
97
|
}
|
|
94
98
|
|
|
95
|
-
AsyncFunction("requestImage") { (options: RequestImageOptions) async throws ->
|
|
99
|
+
AsyncFunction("requestImage") { (options: RequestImageOptions) async throws -> [String: Any] in
|
|
96
100
|
guard
|
|
97
101
|
let localIdentifier = options.localIdentifier,
|
|
98
|
-
let targetSize = options.targetSize,
|
|
99
|
-
let contentMode = options.contentMode
|
|
100
|
-
let outputURL = options.outputURL
|
|
102
|
+
let targetSize = options.targetSize?.value,
|
|
103
|
+
let contentMode = options.contentMode
|
|
101
104
|
else {
|
|
102
105
|
throw ExpoPhotosError.mandatoryFieldMissing
|
|
103
106
|
}
|
|
@@ -145,24 +148,35 @@ public class ExpoPhotos: Module {
|
|
|
145
148
|
}
|
|
146
149
|
}
|
|
147
150
|
|
|
148
|
-
|
|
151
|
+
if let outputURL = options.outputURL {
|
|
152
|
+
var imageCoderOptions: [SDImageCoderOption: Any] = [:]
|
|
149
153
|
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
154
|
+
if let encodeCompressionQuality = options.encodeCompressionQuality {
|
|
155
|
+
imageCoderOptions[.encodeCompressionQuality] = encodeCompressionQuality
|
|
156
|
+
}
|
|
153
157
|
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
158
|
+
if let encodeMaxFileSize = options.encodeMaxFileSize {
|
|
159
|
+
imageCoderOptions[.encodeMaxFileSize] = encodeMaxFileSize
|
|
160
|
+
}
|
|
157
161
|
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
162
|
+
guard
|
|
163
|
+
let data = SDImageWebPCoder.shared.encodedData(
|
|
164
|
+
with: image, format: .webP, options: imageCoderOptions)
|
|
165
|
+
else {
|
|
166
|
+
throw ExpoPhotosError.couldNotEncodeImage
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
try data.write(to: outputURL)
|
|
163
170
|
}
|
|
164
171
|
|
|
165
|
-
|
|
172
|
+
return [
|
|
173
|
+
"size": [
|
|
174
|
+
"width": image.size.width,
|
|
175
|
+
"height": image.size.height,
|
|
176
|
+
],
|
|
177
|
+
"scale": image.scale,
|
|
178
|
+
"imageOrientation": image.imageOrientation.rawValue,
|
|
179
|
+
]
|
|
166
180
|
}
|
|
167
181
|
|
|
168
182
|
AsyncFunction("requestVideo") { (options: RequestVideoOptions) async throws -> Void in
|
|
@@ -348,6 +362,8 @@ extension PHAsset {
|
|
|
348
362
|
"mediaType": mediaType.rawValue,
|
|
349
363
|
"mediaSubtypes": mediaSubtypes.rawValue,
|
|
350
364
|
"duration": duration.toJS(),
|
|
365
|
+
"pixelWidth": pixelWidth,
|
|
366
|
+
"pixelHeight": pixelHeight,
|
|
351
367
|
]
|
|
352
368
|
}
|
|
353
369
|
}
|
|
@@ -393,6 +409,19 @@ extension CMTimeRange: @retroactive Convertible {
|
|
|
393
409
|
}
|
|
394
410
|
}
|
|
395
411
|
|
|
412
|
+
struct TargetSize: Convertible {
|
|
413
|
+
let value: CGSize
|
|
414
|
+
|
|
415
|
+
static func convert(from value: Any?, appContext: AppContext) throws -> TargetSize {
|
|
416
|
+
if let sentinel = value as? String, sentinel == "PHImageManagerMaximumSize" {
|
|
417
|
+
return TargetSize(value: PHImageManagerMaximumSize)
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
let size = try CGSize.convert(from: value, appContext: appContext)
|
|
421
|
+
return TargetSize(value: size)
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
|
|
396
425
|
extension Convertible where Self: RawRepresentable, Self.RawValue == Int {
|
|
397
426
|
public static func convert(from value: Any?, appContext: AppContext) throws -> Self {
|
|
398
427
|
guard
|
package/package.json
CHANGED
package/src/ExpoPhotos.types.ts
CHANGED
|
@@ -4,6 +4,8 @@ export interface PHAsset {
|
|
|
4
4
|
mediaType: PHAssetMediaType;
|
|
5
5
|
mediaSubtypes: PHAssetMediaSubtype;
|
|
6
6
|
duration: number;
|
|
7
|
+
pixelWidth: number;
|
|
8
|
+
pixelHeight: number;
|
|
7
9
|
}
|
|
8
10
|
|
|
9
11
|
export enum PHAuthorizationStatus {
|
|
@@ -57,6 +59,10 @@ export interface CGSize {
|
|
|
57
59
|
height: number;
|
|
58
60
|
}
|
|
59
61
|
|
|
62
|
+
export type PHImageManagerMaximumSize = "PHImageManagerMaximumSize";
|
|
63
|
+
|
|
64
|
+
export type RequestImageTargetSize = CGSize | PHImageManagerMaximumSize;
|
|
65
|
+
|
|
60
66
|
export enum PHImageRequestOptionsResizeMode {
|
|
61
67
|
None = 0,
|
|
62
68
|
Fast = 1,
|
|
@@ -171,12 +177,18 @@ export interface RequestImageOptions
|
|
|
171
177
|
extends PHImageRequestOptions,
|
|
172
178
|
SDImageCoderOptions {
|
|
173
179
|
localIdentifier: string;
|
|
174
|
-
targetSize:
|
|
180
|
+
targetSize: RequestImageTargetSize;
|
|
175
181
|
contentMode: PHImageContentMode;
|
|
176
|
-
outputURL
|
|
182
|
+
outputURL?: string;
|
|
177
183
|
timeout?: number;
|
|
178
184
|
}
|
|
179
185
|
|
|
186
|
+
export interface RequestImageResult {
|
|
187
|
+
size: CGSize;
|
|
188
|
+
scale: number;
|
|
189
|
+
imageOrientation: number;
|
|
190
|
+
}
|
|
191
|
+
|
|
180
192
|
export interface RequestVideoOptions
|
|
181
193
|
extends PHVideoRequestOptions,
|
|
182
194
|
AVAssetExportSessionOptions {
|
package/src/ExpoPhotosModule.ts
CHANGED
|
@@ -7,13 +7,15 @@ import type {
|
|
|
7
7
|
PickAssetsOptions,
|
|
8
8
|
RequestImageOptions,
|
|
9
9
|
RequestVideoOptions,
|
|
10
|
+
RequestImageResult,
|
|
10
11
|
} from "./ExpoPhotos.types";
|
|
11
12
|
|
|
12
13
|
export declare class ExpoPhotosModule extends NativeModule {
|
|
13
14
|
fetchAssets(options: FetchAssetsOptions): Promise<PHAsset[]>;
|
|
14
|
-
requestImage(options: RequestImageOptions): Promise<
|
|
15
|
+
requestImage(options: RequestImageOptions): Promise<RequestImageResult>;
|
|
15
16
|
requestVideo(options: RequestVideoOptions): Promise<void>;
|
|
16
17
|
pickAssets(options: PickAssetsOptions): Promise<PHAsset[]>;
|
|
18
|
+
authorizationStatus(accessLevel: PHAccessLevel): Promise<PHAuthorizationStatus>;
|
|
17
19
|
requestAuthorization(accessLevel: PHAccessLevel): Promise<PHAuthorizationStatus>;
|
|
18
20
|
presentLimitedLibraryPicker(): Promise<void>;
|
|
19
21
|
}
|
package/src/PHImageSource.tsx
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import type { ImageSourcePropType } from "react-native";
|
|
2
2
|
import {
|
|
3
|
-
CGSize,
|
|
4
3
|
PHImageContentMode,
|
|
5
4
|
PHImageRequestOptionsDeliveryMode,
|
|
6
5
|
PHImageRequestOptionsResizeMode,
|
|
6
|
+
RequestImageTargetSize,
|
|
7
7
|
} from "./ExpoPhotos.types";
|
|
8
8
|
|
|
9
9
|
export interface PHImageSourceOptions {
|
|
10
10
|
localIdentifier: string;
|
|
11
|
-
targetSize?:
|
|
11
|
+
targetSize?: RequestImageTargetSize;
|
|
12
12
|
resizeMode?: PHImageRequestOptionsResizeMode;
|
|
13
13
|
deliveryMode?: PHImageRequestOptionsDeliveryMode;
|
|
14
14
|
contentMode?: PHImageContentMode;
|
|
@@ -16,7 +16,7 @@ export interface PHImageSourceOptions {
|
|
|
16
16
|
}
|
|
17
17
|
|
|
18
18
|
const buildQueryString = (
|
|
19
|
-
params: Record<string, string | undefined>
|
|
19
|
+
params: Record<string, string | number | boolean | undefined>
|
|
20
20
|
): string => {
|
|
21
21
|
const entries = Object.entries(params).filter(
|
|
22
22
|
([, value]) => value !== undefined
|
|
@@ -59,32 +59,27 @@ const buildQueryString = (
|
|
|
59
59
|
*/
|
|
60
60
|
export function createPHImageSource(
|
|
61
61
|
options: PHImageSourceOptions
|
|
62
|
-
): ImageSourcePropType
|
|
63
|
-
const { localIdentifier } = options;
|
|
64
|
-
|
|
65
|
-
if (!localIdentifier) {
|
|
66
|
-
return undefined;
|
|
67
|
-
}
|
|
68
|
-
|
|
62
|
+
): ImageSourcePropType {
|
|
69
63
|
const {
|
|
70
|
-
|
|
71
|
-
resizeMode
|
|
72
|
-
deliveryMode
|
|
73
|
-
contentMode
|
|
74
|
-
isNetworkAccessAllowed
|
|
64
|
+
localIdentifier,
|
|
65
|
+
resizeMode,
|
|
66
|
+
deliveryMode,
|
|
67
|
+
contentMode,
|
|
68
|
+
isNetworkAccessAllowed,
|
|
75
69
|
} = options;
|
|
76
70
|
|
|
77
|
-
const
|
|
78
|
-
|
|
79
|
-
|
|
71
|
+
const targetSize =
|
|
72
|
+
options.targetSize && typeof options.targetSize === "object"
|
|
73
|
+
? `${options.targetSize.width}x${options.targetSize.height}`
|
|
74
|
+
: options.targetSize;
|
|
80
75
|
|
|
81
76
|
const query = buildQueryString({
|
|
82
77
|
localIdentifier,
|
|
83
|
-
targetSize
|
|
84
|
-
resizeMode
|
|
85
|
-
deliveryMode
|
|
86
|
-
contentMode
|
|
87
|
-
isNetworkAccessAllowed
|
|
78
|
+
targetSize,
|
|
79
|
+
resizeMode,
|
|
80
|
+
deliveryMode,
|
|
81
|
+
contentMode,
|
|
82
|
+
isNetworkAccessAllowed,
|
|
88
83
|
});
|
|
89
84
|
|
|
90
85
|
return { uri: `expo-photos://${query}` };
|