2015-03-11 02:11:28 +00:00
|
|
|
/**
|
2018-09-11 22:27:47 +00:00
|
|
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
2015-03-23 22:07:33 +00:00
|
|
|
*
|
2018-02-17 02:24:55 +00:00
|
|
|
* This source code is licensed under the MIT license found in the
|
|
|
|
* LICENSE file in the root directory of this source tree.
|
2015-03-11 02:11:28 +00:00
|
|
|
*
|
2015-03-25 22:36:50 +00:00
|
|
|
* @flow
|
2017-05-05 04:38:12 +00:00
|
|
|
* @format
|
2015-03-11 02:11:28 +00:00
|
|
|
*/
|
|
|
|
'use strict';
|
2019-08-14 19:00:20 +00:00
|
|
|
import {Platform} from 'react-native';
|
2019-03-03 12:12:30 +00:00
|
|
|
import RNCCameraRoll from './nativeInterface';
|
2019-03-03 12:46:47 +00:00
|
|
|
|
2019-03-03 06:39:57 +00:00
|
|
|
const invariant = require('fbjs/lib/invariant');
|
2017-05-05 04:38:12 +00:00
|
|
|
|
|
|
|
const GROUP_TYPES_OPTIONS = {
|
|
|
|
Album: 'Album',
|
2019-04-01 20:56:44 +00:00
|
|
|
All: 'All', // default
|
2017-05-05 04:38:12 +00:00
|
|
|
Event: 'Event',
|
|
|
|
Faces: 'Faces',
|
|
|
|
Library: 'Library',
|
|
|
|
PhotoStream: 'PhotoStream',
|
2019-04-01 20:56:44 +00:00
|
|
|
SavedPhotos: 'SavedPhotos',
|
2017-05-05 04:38:12 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
const ASSET_TYPE_OPTIONS = {
|
|
|
|
All: 'All',
|
|
|
|
Videos: 'Videos',
|
|
|
|
Photos: 'Photos',
|
|
|
|
};
|
2015-03-11 02:11:28 +00:00
|
|
|
|
2018-10-18 19:26:27 +00:00
|
|
|
export type GroupTypes = $Keys<typeof GROUP_TYPES_OPTIONS>;
|
|
|
|
|
2015-03-11 02:11:28 +00:00
|
|
|
/**
|
|
|
|
* Shape of the param arg for the `getPhotos` function.
|
|
|
|
*/
|
2019-03-03 12:12:30 +00:00
|
|
|
export type GetPhotosParams = {
|
2015-03-11 02:11:28 +00:00
|
|
|
/**
|
|
|
|
* The number of photos wanted in reverse order of the photo application
|
2019-04-01 20:56:44 +00:00
|
|
|
* (i.e. most recent first).
|
2015-03-11 02:11:28 +00:00
|
|
|
*/
|
2019-03-03 12:12:30 +00:00
|
|
|
first: number,
|
2015-03-11 02:11:28 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* A cursor that matches `page_info { end_cursor }` returned from a previous
|
|
|
|
* call to `getPhotos`
|
|
|
|
*/
|
2019-03-03 12:12:30 +00:00
|
|
|
after?: string,
|
2015-03-11 02:11:28 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Specifies which group types to filter the results to.
|
|
|
|
*/
|
2019-03-03 12:12:30 +00:00
|
|
|
groupTypes?: GroupTypes,
|
2015-03-11 02:11:28 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Specifies filter on group names, like 'Recent Photos' or custom album
|
|
|
|
* titles.
|
|
|
|
*/
|
2019-03-03 12:12:30 +00:00
|
|
|
groupName?: string,
|
2015-06-01 22:46:06 +00:00
|
|
|
|
|
|
|
/**
|
2017-12-07 01:25:06 +00:00
|
|
|
* Specifies filter on asset type
|
|
|
|
*/
|
2019-03-03 12:12:30 +00:00
|
|
|
assetType?: $Keys<typeof ASSET_TYPE_OPTIONS>,
|
2015-06-17 19:21:07 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Filter by mimetype (e.g. image/jpeg).
|
|
|
|
*/
|
2019-03-03 12:12:30 +00:00
|
|
|
mimeTypes?: Array<string>,
|
|
|
|
};
|
2015-03-11 02:11:28 +00:00
|
|
|
|
2018-10-18 19:26:27 +00:00
|
|
|
export type PhotoIdentifier = {
|
|
|
|
node: {
|
|
|
|
type: string,
|
|
|
|
group_name: string,
|
|
|
|
image: {
|
2018-10-18 19:26:27 +00:00
|
|
|
filename: string,
|
2018-10-18 19:26:27 +00:00
|
|
|
uri: string,
|
|
|
|
height: number,
|
|
|
|
width: number,
|
|
|
|
isStored?: boolean,
|
|
|
|
playableDuration: number,
|
2017-12-07 16:22:47 +00:00
|
|
|
},
|
2018-10-18 19:26:27 +00:00
|
|
|
timestamp: number,
|
|
|
|
location?: {
|
|
|
|
latitude?: number,
|
|
|
|
longitude?: number,
|
|
|
|
altitude?: number,
|
|
|
|
heading?: number,
|
|
|
|
speed?: number,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
};
|
|
|
|
|
|
|
|
export type PhotoIdentifiersPage = {
|
|
|
|
edges: Array<PhotoIdentifier>,
|
2017-12-07 16:22:47 +00:00
|
|
|
page_info: {
|
|
|
|
has_next_page: boolean,
|
|
|
|
start_cursor?: string,
|
|
|
|
end_cursor?: string,
|
|
|
|
},
|
2018-10-18 19:26:27 +00:00
|
|
|
};
|
2019-08-14 19:00:20 +00:00
|
|
|
export type SaveToCameraRollOptions = {
|
|
|
|
type?: 'photo' | 'video' | 'auto',
|
|
|
|
album?: string,
|
|
|
|
};
|
2015-07-27 16:22:51 +00:00
|
|
|
/**
|
2018-01-30 00:10:49 +00:00
|
|
|
* `CameraRoll` provides access to the local camera roll or photo library.
|
2016-12-23 01:08:49 +00:00
|
|
|
*
|
2018-01-30 00:10:49 +00:00
|
|
|
* See https://facebook.github.io/react-native/docs/cameraroll.html
|
2015-07-27 16:22:51 +00:00
|
|
|
*/
|
2015-03-11 02:11:28 +00:00
|
|
|
class CameraRoll {
|
2018-10-18 19:26:27 +00:00
|
|
|
static GroupTypesOptions = GROUP_TYPES_OPTIONS;
|
|
|
|
static AssetTypeOptions = ASSET_TYPE_OPTIONS;
|
Allow CameraRoll to export videos
Summary:
This PR adds the ability to export videos to the CameraRoll on both Android and iOS (previously only photos were possible, at least on iOS). The API has changed as follows:
```
// old
saveImageWithTag(tag: string): Promise<string>
// new
saveToCameraRoll(tag: string, type?: 'photo' | 'video'): Promise<string>
```
if no `type` parameter is passed, `video` is inferred if the tag ends with ".mov" or ".mp4", otherwise `photo` is assumed.
I've left in the `saveImageWithTag` method for now with a deprecation warning.
**Test plan (required)**
I created the following very simple app to test exporting photos and videos to the CameraRoll, and ran it on both iOS and Android. The functionality works as intended on both platforms.
```js
// index.js
/**
* Sample React Native App
* https://github.com/facebook/react-native
* flow
*/
import React, { Component } from 'react';
import {
AppRegistry,
StyleSheet,
Text,
View,
CameraRoll,
} from 'react-native';
import FS fro
Closes https://github.com/facebook/react-native/pull/7988
Differential Revision: D3401251
Pulled By: nicklockwood
fbshipit-source-id: af3fc24e6fa5b84ac377e9173f3709c6f9795f20
2016-06-07 23:37:48 +00:00
|
|
|
|
2017-06-07 05:23:49 +00:00
|
|
|
/**
|
|
|
|
* `CameraRoll.saveImageWithTag()` is deprecated. Use `CameraRoll.saveToCameraRoll()` instead.
|
|
|
|
*/
|
2017-09-12 16:59:36 +00:00
|
|
|
static saveImageWithTag(tag: string): Promise<string> {
|
2017-05-05 04:38:12 +00:00
|
|
|
console.warn(
|
2017-06-07 05:23:49 +00:00
|
|
|
'`CameraRoll.saveImageWithTag()` is deprecated. Use `CameraRoll.saveToCameraRoll()` instead.',
|
2017-05-05 04:38:12 +00:00
|
|
|
);
|
2019-08-14 19:31:43 +00:00
|
|
|
return this.saveToCameraRoll(tag, 'photo');
|
Allow CameraRoll to export videos
Summary:
This PR adds the ability to export videos to the CameraRoll on both Android and iOS (previously only photos were possible, at least on iOS). The API has changed as follows:
```
// old
saveImageWithTag(tag: string): Promise<string>
// new
saveToCameraRoll(tag: string, type?: 'photo' | 'video'): Promise<string>
```
if no `type` parameter is passed, `video` is inferred if the tag ends with ".mov" or ".mp4", otherwise `photo` is assumed.
I've left in the `saveImageWithTag` method for now with a deprecation warning.
**Test plan (required)**
I created the following very simple app to test exporting photos and videos to the CameraRoll, and ran it on both iOS and Android. The functionality works as intended on both platforms.
```js
// index.js
/**
* Sample React Native App
* https://github.com/facebook/react-native
* flow
*/
import React, { Component } from 'react';
import {
AppRegistry,
StyleSheet,
Text,
View,
CameraRoll,
} from 'react-native';
import FS fro
Closes https://github.com/facebook/react-native/pull/7988
Differential Revision: D3401251
Pulled By: nicklockwood
fbshipit-source-id: af3fc24e6fa5b84ac377e9173f3709c6f9795f20
2016-06-07 23:37:48 +00:00
|
|
|
}
|
|
|
|
|
2019-11-07 13:13:24 +00:00
|
|
|
/**
|
|
|
|
* On iOS: requests deletion of a set of photos from the camera roll.
|
|
|
|
* On Android: Deletes a set of photos from the camera roll.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
static deletePhotos(photoUris: Array<string>) {
|
|
|
|
return RNCCameraRoll.deletePhotos(photoUris);
|
2017-11-29 20:07:49 +00:00
|
|
|
}
|
|
|
|
|
2015-03-11 02:11:28 +00:00
|
|
|
/**
|
2018-01-30 00:10:49 +00:00
|
|
|
* Saves the photo or video to the camera roll or photo library.
|
2015-03-11 02:11:28 +00:00
|
|
|
*
|
|
|
|
*/
|
2019-08-14 19:00:20 +00:00
|
|
|
static save(
|
2017-05-05 04:38:12 +00:00
|
|
|
tag: string,
|
2019-08-14 19:00:20 +00:00
|
|
|
options: SaveToCameraRollOptions = {},
|
2017-09-12 16:59:36 +00:00
|
|
|
): Promise<string> {
|
2019-08-14 19:00:20 +00:00
|
|
|
let {type = 'auto', album = ''} = options;
|
2015-03-11 02:11:28 +00:00
|
|
|
invariant(
|
|
|
|
typeof tag === 'string',
|
2017-05-05 04:38:12 +00:00
|
|
|
'CameraRoll.saveToCameraRoll must be a valid string.',
|
Allow CameraRoll to export videos
Summary:
This PR adds the ability to export videos to the CameraRoll on both Android and iOS (previously only photos were possible, at least on iOS). The API has changed as follows:
```
// old
saveImageWithTag(tag: string): Promise<string>
// new
saveToCameraRoll(tag: string, type?: 'photo' | 'video'): Promise<string>
```
if no `type` parameter is passed, `video` is inferred if the tag ends with ".mov" or ".mp4", otherwise `photo` is assumed.
I've left in the `saveImageWithTag` method for now with a deprecation warning.
**Test plan (required)**
I created the following very simple app to test exporting photos and videos to the CameraRoll, and ran it on both iOS and Android. The functionality works as intended on both platforms.
```js
// index.js
/**
* Sample React Native App
* https://github.com/facebook/react-native
* flow
*/
import React, { Component } from 'react';
import {
AppRegistry,
StyleSheet,
Text,
View,
CameraRoll,
} from 'react-native';
import FS fro
Closes https://github.com/facebook/react-native/pull/7988
Differential Revision: D3401251
Pulled By: nicklockwood
fbshipit-source-id: af3fc24e6fa5b84ac377e9173f3709c6f9795f20
2016-06-07 23:37:48 +00:00
|
|
|
);
|
|
|
|
invariant(
|
2019-08-14 19:00:20 +00:00
|
|
|
options.type === 'photo' ||
|
|
|
|
options.type === 'video' ||
|
|
|
|
options.type === 'auto' ||
|
|
|
|
options.type === undefined,
|
|
|
|
`The second argument to saveToCameraRoll must be 'photo' or 'video' or 'auto'. You passed ${type ||
|
2019-05-13 19:20:11 +00:00
|
|
|
'unknown'}`,
|
2015-03-11 02:11:28 +00:00
|
|
|
);
|
2019-08-14 19:00:20 +00:00
|
|
|
if (type === 'auto') {
|
|
|
|
if (['mov', 'mp4'].indexOf(tag.split('.').slice(-1)[0]) >= 0) {
|
|
|
|
type = 'video';
|
|
|
|
} else {
|
|
|
|
type = 'photo';
|
|
|
|
}
|
2016-01-21 16:07:01 +00:00
|
|
|
}
|
2019-08-14 19:00:20 +00:00
|
|
|
return RNCCameraRoll.saveToCameraRoll(tag, {type, album});
|
|
|
|
}
|
2019-08-14 19:31:43 +00:00
|
|
|
static saveToCameraRoll(
|
|
|
|
tag: string,
|
|
|
|
type?: 'photo' | 'video' | 'auto',
|
|
|
|
): Promise<string> {
|
|
|
|
return CameraRoll.save(tag, {type});
|
2015-03-11 02:11:28 +00:00
|
|
|
}
|
|
|
|
/**
|
2016-01-31 01:10:14 +00:00
|
|
|
* Returns a Promise with photo identifier objects from the local camera
|
|
|
|
* roll of the device matching shape defined by `getPhotosReturnChecker`.
|
2016-01-21 16:07:01 +00:00
|
|
|
*
|
2018-01-30 00:10:49 +00:00
|
|
|
* See https://facebook.github.io/react-native/docs/cameraroll.html#getphotos
|
2015-03-11 02:11:28 +00:00
|
|
|
*/
|
2018-10-18 19:26:27 +00:00
|
|
|
static getPhotos(params: GetPhotosParams): Promise<PhotoIdentifiersPage> {
|
2019-03-03 12:46:47 +00:00
|
|
|
if (!params.assetType) {
|
|
|
|
params.assetType = ASSET_TYPE_OPTIONS.All;
|
|
|
|
}
|
2019-08-14 19:00:20 +00:00
|
|
|
if (!params.groupTypes && Platform.OS !== 'android') {
|
2019-04-01 20:56:44 +00:00
|
|
|
params.groupTypes = GROUP_TYPES_OPTIONS.All;
|
|
|
|
}
|
2016-01-21 16:07:01 +00:00
|
|
|
if (arguments.length > 1) {
|
2017-05-05 04:38:12 +00:00
|
|
|
console.warn(
|
|
|
|
'CameraRoll.getPhotos(tag, success, error) is deprecated. Use the returned Promise instead',
|
|
|
|
);
|
2016-01-21 16:07:01 +00:00
|
|
|
let successCallback = arguments[1];
|
2017-05-05 04:38:12 +00:00
|
|
|
const errorCallback = arguments[2] || (() => {});
|
2019-03-03 06:39:57 +00:00
|
|
|
RNCCameraRoll.getPhotos(params).then(successCallback, errorCallback);
|
2015-03-11 02:11:28 +00:00
|
|
|
}
|
2019-03-03 06:39:57 +00:00
|
|
|
return RNCCameraRoll.getPhotos(params);
|
2015-03-11 02:11:28 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
module.exports = CameraRoll;
|