@react-native-ohos/camera-roll
Version:
React Native Camera Roll for iOS & Android
123 lines (113 loc) • 3.71 kB
text/typescript
/**
* MIT License
*
* Copyright (C) 2025 Huawei Device Co., Ltd.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
/* eslint-disable @typescript-eslint/ban-types */
// we use Object type because methods on the native side use NSDictionary and ReadableMap
// and we want to stay compatible with those
import {TurboModuleRegistry, TurboModule} from 'react-native';
import type {Double} from 'react-native/Libraries/Types/CodegenTypes';
export type PhotoThumbnail = {
thumbnailBase64: string;
};
export type AlbumType = 'All' | 'Album' | 'SmartAlbum';
export type AlbumSubType =
| 'AlbumRegular'
| 'AlbumSyncedEvent'
| 'AlbumSyncedFaces'
| 'AlbumSyncedAlbum'
| 'AlbumImported'
| 'AlbumMyPhotoStream'
| 'AlbumCloudShared'
| 'Unknown';
type Album = {
id: string;
title: string;
count: number;
type: AlbumType;
subtype?: AlbumSubType;
};
type SubTypes =
| 'PhotoPanorama'
| 'PhotoHDR'
| 'PhotoScreenshot'
| 'PhotoLive'
| 'PhotoDepthEffect'
| 'VideoStreamed'
| 'VideoHighFrameRate'
| 'VideoTimelapse';
type SourceType = 'UserLibrary' | 'CloudShared';
type PhotoIdentifier = {
node: {
id: string;
type: string;
subTypes: SubTypes;
sourceType: SourceType;
group_name: string[];
image: {
filename: string | null;
filepath: string | null;
extension: string | null;
uri: string;
height: number;
width: number;
fileSize: number | null;
playableDuration: number;
orientation: number | null;
};
timestamp: number;
modificationTimestamp: number;
location: {
latitude?: number;
longitude?: number;
altitude?: number;
heading?: number;
speed?: number;
} | null;
};
};
type PhotoIdentifiersPage = {
edges: Array<PhotoIdentifier>;
page_info: {
has_next_page: boolean;
start_cursor?: string;
end_cursor?: string;
};
limited?: boolean;
};
export interface Spec extends TurboModule {
saveToCameraRoll(uri: string, options: Object): Promise<PhotoIdentifier>;
getPhotos(params: Object): Promise<PhotoIdentifiersPage>;
getAlbums(params: Object): Promise<Album[]>;
deletePhotos(photoUris: Array<string>): Promise<void>;
getPhotoByInternalID(
internalID: string,
options: Object,
): Promise<PhotoIdentifier>;
getPhotoThumbnail(
internalID: string,
options: Object,
): Promise<PhotoThumbnail>;
addListener(eventName: string): void;
removeListeners(count: Double): void;
}
export default TurboModuleRegistry.getEnforcing<Spec>('RNCCameraRoll');