UNPKG

8.59 kBJavaScriptView Raw
1import { EventEmitter, UnavailabilityError } from '@unimodules/core';
2import { Platform } from 'react-native';
3import { PermissionStatus } from 'unimodules-permissions-interface';
4import MediaLibrary from './ExponentMediaLibrary';
5const eventEmitter = new EventEmitter(MediaLibrary);
6export { PermissionStatus };
7function arrayize(item) {
8 if (Array.isArray(item)) {
9 return item;
10 }
11 return item ? [item] : [];
12}
13function getId(ref) {
14 if (typeof ref === 'string') {
15 return ref;
16 }
17 return ref ? ref.id : undefined;
18}
19function checkAssetIds(assetIds) {
20 if (assetIds.some(id => !id || typeof id !== 'string')) {
21 throw new Error('Asset ID must be a string!');
22 }
23}
24function checkAlbumIds(albumIds) {
25 if (albumIds.some(id => !id || typeof id !== 'string')) {
26 throw new Error('Album ID must be a string!');
27 }
28}
29function checkMediaType(mediaType) {
30 if (Object.values(MediaType).indexOf(mediaType) === -1) {
31 throw new Error(`Invalid mediaType: ${mediaType}`);
32 }
33}
34function 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}
45function checkSortByKey(sortBy) {
46 if (Object.values(SortBy).indexOf(sortBy) === -1) {
47 throw new Error(`Invalid sortBy key: ${sortBy}`);
48 }
49}
50function dateToNumber(value) {
51 return value instanceof Date ? value.getTime() : value;
52}
53// export constants
54export const MediaType = MediaLibrary.MediaType;
55export const SortBy = MediaLibrary.SortBy;
56export async function requestPermissionsAsync() {
57 if (!MediaLibrary.requestPermissionsAsync) {
58 throw new UnavailabilityError('MediaLibrary', 'requestPermissionsAsync');
59 }
60 return await MediaLibrary.requestPermissionsAsync();
61}
62export async function getPermissionsAsync() {
63 if (!MediaLibrary.getPermissionsAsync) {
64 throw new UnavailabilityError('MediaLibrary', 'getPermissionsAsync');
65 }
66 return await MediaLibrary.getPermissionsAsync();
67}
68export 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 // Android returns an array with asset, we need to pick the first item
78 return asset[0];
79 }
80 return asset;
81}
82export async function saveToLibraryAsync(localUri) {
83 if (!MediaLibrary.saveToLibraryAsync) {
84 throw new UnavailabilityError('MediaLibrary', 'saveToLibraryAsync');
85 }
86 return await MediaLibrary.saveToLibraryAsync(localUri);
87}
88export 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}
103export 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}
112export 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}
120export 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 // Android returns an array with asset info, we need to pick the first item
129 return assetInfo[0];
130 }
131 return assetInfo;
132}
133export async function getAlbumsAsync({ includeSmartAlbums = false } = {}) {
134 if (!MediaLibrary.getAlbumsAsync) {
135 throw new UnavailabilityError('MediaLibrary', 'getAlbumsAsync');
136 }
137 return await MediaLibrary.getAlbumsAsync({ includeSmartAlbums });
138}
139export 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}
148export 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 // it's not possible to create empty album on Android, so initial asset must be provided
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}
168export 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}
179export 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}
206export function addListener(listener) {
207 const subscription = eventEmitter.addListener(MediaLibrary.CHANGE_LISTENER_NAME, listener);
208 return subscription;
209}
210export function removeSubscription(subscription) {
211 subscription.remove();
212}
213export function removeAllListeners() {
214 eventEmitter.removeAllListeners(MediaLibrary.CHANGE_LISTENER_NAME);
215}
216// iOS only
217export async function getMomentsAsync() {
218 if (!MediaLibrary.getMomentsAsync) {
219 throw new UnavailabilityError('MediaLibrary', 'getMomentsAsync');
220 }
221 return await MediaLibrary.getMomentsAsync();
222}
223//# sourceMappingURL=MediaLibrary.js.map
\No newline at end of file