expo-media-library
Version:
Provides access to user's media library.
162 lines (145 loc) • 6.48 kB
text/typescript
import { createPermissionHook } from 'expo';
import { UnavailabilityError, type EventSubscription } from 'expo-modules-core';
import { Platform } from 'react-native';
import ExpoMediaLibraryNext from './ExpoMediaLibraryNext';
import type {
GranularPermission,
MediaLibraryAssetsChangeEvent,
PermissionResponse,
} from './MediaLibraryNext.types';
import { MediaSubtype } from './types/MediaSubtype';
import type { MediaTypeFilter } from './types/MediaTypeFilter';
export * from './MediaLibraryNext.types';
export class Query extends ExpoMediaLibraryNext.Query {}
export class Asset extends ExpoMediaLibraryNext.Asset {
// @hidden
getMediaSubtypes(): Promise<MediaSubtype[]> {
if (Platform.OS !== 'ios') {
throw new UnavailabilityError('MediaLibrary', 'getMediaSubtypes is only available on iOS');
}
return super.getMediaSubtypes();
}
// @hidden
getLivePhotoVideoUri(): Promise<string | null> {
if (Platform.OS !== 'ios') {
throw new UnavailabilityError(
'MediaLibrary',
'getLivePhotoVideoUri is only available on iOS'
);
}
return super.getLivePhotoVideoUri();
}
// @hidden
getIsInCloud(): Promise<boolean> {
if (Platform.OS !== 'ios') {
throw new UnavailabilityError('MediaLibrary', 'getIsInCloud is only available on iOS');
}
return super.getIsInCloud();
}
// @hidden
getOrientation(): Promise<number | null> {
if (Platform.OS !== 'ios') {
throw new UnavailabilityError('MediaLibrary', 'getOrientation is only available on iOS');
}
return super.getOrientation();
}
}
export class Album extends ExpoMediaLibraryNext.Album {}
/**
* Asks the user to grant permissions for accessing media in user's media library.
* @param writeOnly - Whether to request write-only access without read permissions. Defaults to `false`.
* @param granularPermissions - A list of [`GranularPermission`](#granularpermission) values. This parameter has an
* effect only on Android 13 and newer. By default, `expo-media-library` will ask for all possible permissions.
*
* > When using granular permissions with a custom config plugin configuration, make sure that all the requested permissions are included in the plugin.
* @return A promise that fulfils with [`PermissionResponse`](#permissionresponse) object.
*/
export async function requestPermissionsAsync(
writeOnly: boolean = false,
granularPermissions?: GranularPermission[]
): Promise<PermissionResponse> {
if (!ExpoMediaLibraryNext.requestPermissionsAsync) {
throw new UnavailabilityError('MediaLibrary', 'requestPermissionsAsync');
}
if (Platform.OS === 'android') {
return await ExpoMediaLibraryNext.requestPermissionsAsync(writeOnly, granularPermissions);
}
return await ExpoMediaLibraryNext.requestPermissionsAsync(writeOnly);
}
/**
* Checks user's permissions for accessing media library.
* @param writeOnly - Whether to check write-only access without read permissions. Defaults to `false`.
* @param granularPermissions - A list of [`GranularPermission`](#granularpermission) values. This parameter has
* an effect only on Android 13 and newer. By default, `expo-media-library` will ask for all possible permissions.
* @return A promise that fulfils with [`PermissionResponse`](#permissionresponse) object.
*/
export async function getPermissionsAsync(
writeOnly: boolean = false,
granularPermissions?: GranularPermission[]
): Promise<PermissionResponse> {
if (!ExpoMediaLibraryNext.getPermissionsAsync) {
throw new UnavailabilityError('MediaLibrary', 'getPermissionsAsync');
}
if (Platform.OS === 'android') {
return await ExpoMediaLibraryNext.getPermissionsAsync(writeOnly, granularPermissions);
}
return await ExpoMediaLibraryNext.getPermissionsAsync(writeOnly);
}
/**
* Check or request permissions to access the media library.
* This uses both `requestPermissionsAsync` and `getPermissionsAsync` to interact with the permissions.
*
* @example
* ```ts
* const [permissionResponse, requestPermission] = MediaLibrary.usePermissions({
* writeOnly: true,
* granularPermissions: ['photo'],
* });
* ```
*/
export const usePermissions = createPermissionHook<
PermissionResponse,
{ writeOnly?: boolean; granularPermissions?: GranularPermission[] }
>({
getMethod: (options) => getPermissionsAsync(options?.writeOnly, options?.granularPermissions),
requestMethod: (options) =>
requestPermissionsAsync(options?.writeOnly, options?.granularPermissions),
});
export type { EventSubscription } from 'expo-modules-core';
/**
* Allows the user to update the assets that your app has access to.
* The system modal is only displayed if the user originally allowed only `limited` access to their
* media library, otherwise this method is a no-op.
* @param mediaTypes Limits the type(s) of media that the user will be granting access to. By default, a list that shows both photos and videos is presented.
*
* @return A promise that either rejects if the method is unavailable, or resolves to `void`.
* > __Note:__ This method doesn't inform you if the user changes which assets your app has access to.
* That information is only exposed by iOS, and to obtain it, you need to subscribe for updates to the user's media library using [`addListener()`](#medialibraryaddlistenerlistener).
* If `hasIncrementalChanges` is `false`, the user changed their permissions.
*
* @platform android 14+
* @platform ios
*/
export async function presentPermissionsPicker(mediaTypes?: MediaTypeFilter[]): Promise<void> {
return await ExpoMediaLibraryNext.presentPermissionsPicker(mediaTypes);
}
/**
* Subscribes for updates in user's media library.
* @param listener A callback that is fired when any assets have been inserted or deleted from the
* library. On Android it's invoked with an empty object. On iOS it's invoked with
* [`MediaLibraryAssetsChangeEvent`](#medialibraryassetschangeevent) object.
* @return An [`EventSubscription`](#eventsubscription) object that you can call `remove()` on when
* you would like to unsubscribe the listener.
*/
export function addListener(
listener: (event: MediaLibraryAssetsChangeEvent) => void
): EventSubscription {
return ExpoMediaLibraryNext.addListener('mediaLibraryDidChange', listener);
}
/**
* Removes all listeners.
*/
export function removeAllListeners(): void {
ExpoMediaLibraryNext.removeAllListeners('mediaLibraryDidChange');
}
export * from './legacyWarnings';