1 | import { EventEmitter, UnavailabilityError } from '@unimodules/core';
|
2 | import { Platform } from 'react-native';
|
3 | import { PermissionStatus } from 'unimodules-permissions-interface';
|
4 | import MediaLibrary from './ExponentMediaLibrary';
|
5 | const eventEmitter = new EventEmitter(MediaLibrary);
|
6 | export { PermissionStatus };
|
7 | function arrayize(item) {
|
8 | if (Array.isArray(item)) {
|
9 | return item;
|
10 | }
|
11 | return item ? [item] : [];
|
12 | }
|
13 | function getId(ref) {
|
14 | if (typeof ref === 'string') {
|
15 | return ref;
|
16 | }
|
17 | return ref ? ref.id : undefined;
|
18 | }
|
19 | function checkAssetIds(assetIds) {
|
20 | if (assetIds.some(id => !id || typeof id !== 'string')) {
|
21 | throw new Error('Asset ID must be a string!');
|
22 | }
|
23 | }
|
24 | function checkAlbumIds(albumIds) {
|
25 | if (albumIds.some(id => !id || typeof id !== 'string')) {
|
26 | throw new Error('Album ID must be a string!');
|
27 | }
|
28 | }
|
29 | function checkMediaType(mediaType) {
|
30 | if (Object.values(MediaType).indexOf(mediaType) === -1) {
|
31 | throw new Error(`Invalid mediaType: ${mediaType}`);
|
32 | }
|
33 | }
|
34 | function checkSortBy(sortBy) {
|
35 | if (Array.isArray(sortBy)) {
|
36 | checkSortByKey(sortBy[0]);
|
37 | if (typeof sortBy[1] !== 'boolean') {
|
38 | throw new Error('Invalid sortBy array argument. Second item must be a boolean!');
|
39 | }
|
40 | }
|
41 | else {
|
42 | checkSortByKey(sortBy);
|
43 | }
|
44 | }
|
45 | function checkSortByKey(sortBy) {
|
46 | if (Object.values(SortBy).indexOf(sortBy) === -1) {
|
47 | throw new Error(`Invalid sortBy key: ${sortBy}`);
|
48 | }
|
49 | }
|
50 | function dateToNumber(value) {
|
51 | return value instanceof Date ? value.getTime() : value;
|
52 | }
|
53 |
|
54 | export const MediaType = MediaLibrary.MediaType;
|
55 | export const SortBy = MediaLibrary.SortBy;
|
56 | export async function requestPermissionsAsync() {
|
57 | if (!MediaLibrary.requestPermissionsAsync) {
|
58 | throw new UnavailabilityError('MediaLibrary', 'requestPermissionsAsync');
|
59 | }
|
60 | return await MediaLibrary.requestPermissionsAsync();
|
61 | }
|
62 | export async function getPermissionsAsync() {
|
63 | if (!MediaLibrary.getPermissionsAsync) {
|
64 | throw new UnavailabilityError('MediaLibrary', 'getPermissionsAsync');
|
65 | }
|
66 | return await MediaLibrary.getPermissionsAsync();
|
67 | }
|
68 | export async function createAssetAsync(localUri) {
|
69 | if (!MediaLibrary.createAssetAsync) {
|
70 | throw new UnavailabilityError('MediaLibrary', 'createAssetAsync');
|
71 | }
|
72 | if (!localUri || typeof localUri !== 'string') {
|
73 | throw new Error('Invalid argument "localUri". It must be a string!');
|
74 | }
|
75 | const asset = await MediaLibrary.createAssetAsync(localUri);
|
76 | if (Array.isArray(asset)) {
|
77 |
|
78 | return asset[0];
|
79 | }
|
80 | return asset;
|
81 | }
|
82 | export async function saveToLibraryAsync(localUri) {
|
83 | if (!MediaLibrary.saveToLibraryAsync) {
|
84 | throw new UnavailabilityError('MediaLibrary', 'saveToLibraryAsync');
|
85 | }
|
86 | return await MediaLibrary.saveToLibraryAsync(localUri);
|
87 | }
|
88 | export async function addAssetsToAlbumAsync(assets, album, copy = true) {
|
89 | if (!MediaLibrary.addAssetsToAlbumAsync) {
|
90 | throw new UnavailabilityError('MediaLibrary', 'addAssetsToAlbumAsync');
|
91 | }
|
92 | const assetIds = arrayize(assets).map(getId);
|
93 | const albumId = getId(album);
|
94 | checkAssetIds(assetIds);
|
95 | if (!albumId || typeof albumId !== 'string') {
|
96 | throw new Error('Invalid album ID. It must be a string!');
|
97 | }
|
98 | if (Platform.OS === 'ios') {
|
99 | return await MediaLibrary.addAssetsToAlbumAsync(assetIds, albumId);
|
100 | }
|
101 | return await MediaLibrary.addAssetsToAlbumAsync(assetIds, albumId, !!copy);
|
102 | }
|
103 | export async function removeAssetsFromAlbumAsync(assets, album) {
|
104 | if (!MediaLibrary.removeAssetsFromAlbumAsync) {
|
105 | throw new UnavailabilityError('MediaLibrary', 'removeAssetsFromAlbumAsync');
|
106 | }
|
107 | const assetIds = arrayize(assets).map(getId);
|
108 | const albumId = getId(album);
|
109 | checkAssetIds(assetIds);
|
110 | return await MediaLibrary.removeAssetsFromAlbumAsync(assetIds, albumId);
|
111 | }
|
112 | export async function deleteAssetsAsync(assets) {
|
113 | if (!MediaLibrary.deleteAssetsAsync) {
|
114 | throw new UnavailabilityError('MediaLibrary', 'deleteAssetsAsync');
|
115 | }
|
116 | const assetIds = arrayize(assets).map(getId);
|
117 | checkAssetIds(assetIds);
|
118 | return await MediaLibrary.deleteAssetsAsync(assetIds);
|
119 | }
|
120 | export async function getAssetInfoAsync(asset) {
|
121 | if (!MediaLibrary.getAssetInfoAsync) {
|
122 | throw new UnavailabilityError('MediaLibrary', 'getAssetInfoAsync');
|
123 | }
|
124 | const assetId = getId(asset);
|
125 | checkAssetIds([assetId]);
|
126 | const assetInfo = await MediaLibrary.getAssetInfoAsync(assetId);
|
127 | if (Array.isArray(assetInfo)) {
|
128 |
|
129 | return assetInfo[0];
|
130 | }
|
131 | return assetInfo;
|
132 | }
|
133 | export async function getAlbumsAsync({ includeSmartAlbums = false } = {}) {
|
134 | if (!MediaLibrary.getAlbumsAsync) {
|
135 | throw new UnavailabilityError('MediaLibrary', 'getAlbumsAsync');
|
136 | }
|
137 | return await MediaLibrary.getAlbumsAsync({ includeSmartAlbums });
|
138 | }
|
139 | export async function getAlbumAsync(title) {
|
140 | if (!MediaLibrary.getAlbumAsync) {
|
141 | throw new UnavailabilityError('MediaLibrary', 'getAlbumAsync');
|
142 | }
|
143 | if (typeof title !== 'string') {
|
144 | throw new Error('Album title must be a string!');
|
145 | }
|
146 | return await MediaLibrary.getAlbumAsync(title);
|
147 | }
|
148 | export async function createAlbumAsync(albumName, asset, copyAsset = true) {
|
149 | if (!MediaLibrary.createAlbumAsync) {
|
150 | throw new UnavailabilityError('MediaLibrary', 'createAlbumAsync');
|
151 | }
|
152 | const assetId = getId(asset);
|
153 | if (Platform.OS === 'android' && (typeof assetId !== 'string' || assetId.length === 0)) {
|
154 |
|
155 | throw new Error('MediaLibrary.createAlbumAsync must be called with an asset on Android.');
|
156 | }
|
157 | if (!albumName || typeof albumName !== 'string') {
|
158 | throw new Error('Invalid argument "albumName". It must be a string!');
|
159 | }
|
160 | if (assetId != null && typeof assetId !== 'string') {
|
161 | throw new Error('Asset ID must be a string!');
|
162 | }
|
163 | if (Platform.OS === 'ios') {
|
164 | return await MediaLibrary.createAlbumAsync(albumName, assetId);
|
165 | }
|
166 | return await MediaLibrary.createAlbumAsync(albumName, assetId, !!copyAsset);
|
167 | }
|
168 | export async function deleteAlbumsAsync(albums, assetRemove = false) {
|
169 | if (!MediaLibrary.deleteAlbumsAsync) {
|
170 | throw new UnavailabilityError('MediaLibrary', 'deleteAlbumsAsync');
|
171 | }
|
172 | const albumIds = arrayize(albums).map(getId);
|
173 | checkAlbumIds(albumIds);
|
174 | if (Platform.OS === 'android') {
|
175 | return await MediaLibrary.deleteAlbumsAsync(albumIds);
|
176 | }
|
177 | return await MediaLibrary.deleteAlbumsAsync(albumIds, !!assetRemove);
|
178 | }
|
179 | export async function getAssetsAsync(assetsOptions = {}) {
|
180 | if (!MediaLibrary.getAssetsAsync) {
|
181 | throw new UnavailabilityError('MediaLibrary', 'getAssetsAsync');
|
182 | }
|
183 | const { first, after, album, sortBy, mediaType, createdAfter, createdBefore } = assetsOptions;
|
184 | const options = {
|
185 | first: first == null ? 20 : first,
|
186 | after: getId(after),
|
187 | album: getId(album),
|
188 | sortBy: arrayize(sortBy),
|
189 | mediaType: arrayize(mediaType || [MediaType.photo]),
|
190 | createdAfter: dateToNumber(createdAfter),
|
191 | createdBefore: dateToNumber(createdBefore),
|
192 | };
|
193 | if (first != null && typeof options.first !== 'number') {
|
194 | throw new Error('Option "first" must be a number!');
|
195 | }
|
196 | if (after != null && typeof options.after !== 'string') {
|
197 | throw new Error('Option "after" must be a string!');
|
198 | }
|
199 | if (album != null && typeof options.album !== 'string') {
|
200 | throw new Error('Option "album" must be a string!');
|
201 | }
|
202 | options.sortBy.forEach(checkSortBy);
|
203 | options.mediaType.forEach(checkMediaType);
|
204 | return await MediaLibrary.getAssetsAsync(options);
|
205 | }
|
206 | export function addListener(listener) {
|
207 | const subscription = eventEmitter.addListener(MediaLibrary.CHANGE_LISTENER_NAME, listener);
|
208 | return subscription;
|
209 | }
|
210 | export function removeSubscription(subscription) {
|
211 | subscription.remove();
|
212 | }
|
213 | export function removeAllListeners() {
|
214 | eventEmitter.removeAllListeners(MediaLibrary.CHANGE_LISTENER_NAME);
|
215 | }
|
216 |
|
217 | export async function getMomentsAsync() {
|
218 | if (!MediaLibrary.getMomentsAsync) {
|
219 | throw new UnavailabilityError('MediaLibrary', 'getMomentsAsync');
|
220 | }
|
221 | return await MediaLibrary.getMomentsAsync();
|
222 | }
|
223 |
|
\ | No newline at end of file |