2015-03-11 02:11:28 +00:00
|
|
|
/**
|
2015-03-23 22:07:33 +00:00
|
|
|
* Copyright (c) 2015-present, Facebook, Inc.
|
|
|
|
* All rights reserved.
|
|
|
|
*
|
|
|
|
* This source code is licensed under the BSD-style license found in the
|
|
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
2015-03-11 02:11:28 +00:00
|
|
|
*
|
|
|
|
* @providesModule CameraRoll
|
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';
|
|
|
|
|
2017-06-12 22:59:06 +00:00
|
|
|
const PropTypes = require('prop-types');
|
|
|
|
const {checkPropTypes} = PropTypes;
|
2017-05-05 04:38:12 +00:00
|
|
|
const RCTCameraRollManager = require('NativeModules').CameraRollManager;
|
|
|
|
|
|
|
|
const createStrictShapeTypeChecker = require('createStrictShapeTypeChecker');
|
|
|
|
const invariant = require('fbjs/lib/invariant');
|
|
|
|
|
|
|
|
const GROUP_TYPES_OPTIONS = {
|
|
|
|
Album: 'Album',
|
|
|
|
All: 'All',
|
|
|
|
Event: 'Event',
|
|
|
|
Faces: 'Faces',
|
|
|
|
Library: 'Library',
|
|
|
|
PhotoStream: 'PhotoStream',
|
|
|
|
SavedPhotos: 'SavedPhotos', // default
|
|
|
|
};
|
|
|
|
|
|
|
|
const ASSET_TYPE_OPTIONS = {
|
|
|
|
All: 'All',
|
|
|
|
Videos: 'Videos',
|
|
|
|
Photos: 'Photos',
|
|
|
|
};
|
2015-03-11 02:11:28 +00:00
|
|
|
|
2017-12-07 16:22:47 +00:00
|
|
|
type GetPhotosParams = {
|
|
|
|
first: number,
|
|
|
|
after?: string,
|
|
|
|
groupTypes?: $Keys<typeof GROUP_TYPES_OPTIONS>,
|
|
|
|
groupName?: string,
|
|
|
|
assetType?: $Keys<typeof ASSET_TYPE_OPTIONS>,
|
|
|
|
mimeTypes?: Array<string>,
|
|
|
|
};
|
|
|
|
|
2015-03-11 02:11:28 +00:00
|
|
|
/**
|
|
|
|
* Shape of the param arg for the `getPhotos` function.
|
|
|
|
*/
|
2017-05-05 04:38:12 +00:00
|
|
|
const getPhotosParamChecker = createStrictShapeTypeChecker({
|
2015-03-11 02:11:28 +00:00
|
|
|
/**
|
|
|
|
* The number of photos wanted in reverse order of the photo application
|
|
|
|
* (i.e. most recent first for SavedPhotos).
|
|
|
|
*/
|
2017-03-22 22:58:29 +00:00
|
|
|
first: PropTypes.number.isRequired,
|
2015-03-11 02:11:28 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* A cursor that matches `page_info { end_cursor }` returned from a previous
|
|
|
|
* call to `getPhotos`
|
|
|
|
*/
|
2017-03-22 22:58:29 +00:00
|
|
|
after: PropTypes.string,
|
2015-03-11 02:11:28 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Specifies which group types to filter the results to.
|
|
|
|
*/
|
2017-05-05 04:38:12 +00:00
|
|
|
groupTypes: PropTypes.oneOf(Object.keys(GROUP_TYPES_OPTIONS)),
|
2015-03-11 02:11:28 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Specifies filter on group names, like 'Recent Photos' or custom album
|
|
|
|
* titles.
|
|
|
|
*/
|
2017-03-22 22:58:29 +00:00
|
|
|
groupName: PropTypes.string,
|
2015-06-01 22:46:06 +00:00
|
|
|
|
|
|
|
/**
|
2017-12-07 01:25:06 +00:00
|
|
|
* Specifies filter on asset type
|
|
|
|
*/
|
2017-05-05 04:38:12 +00:00
|
|
|
assetType: PropTypes.oneOf(Object.keys(ASSET_TYPE_OPTIONS)),
|
2015-06-17 19:21:07 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Filter by mimetype (e.g. image/jpeg).
|
|
|
|
*/
|
2017-03-22 22:58:29 +00:00
|
|
|
mimeTypes: PropTypes.arrayOf(PropTypes.string),
|
2015-03-11 02:11:28 +00:00
|
|
|
});
|
|
|
|
|
2017-12-07 16:22:47 +00:00
|
|
|
type GetPhotosReturn = Promise<{
|
|
|
|
edges: Array<{
|
|
|
|
node: {
|
|
|
|
type: string,
|
|
|
|
group_name: string,
|
|
|
|
image: {
|
|
|
|
uri: string,
|
|
|
|
height: number,
|
|
|
|
width: number,
|
|
|
|
isStored?: boolean,
|
|
|
|
playableDuration: number,
|
|
|
|
},
|
|
|
|
timestamp: number,
|
|
|
|
location?: {
|
|
|
|
latitude?: number,
|
|
|
|
longitude?: number,
|
|
|
|
altitude?: number,
|
|
|
|
heading?: number,
|
|
|
|
speed?: number,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}>,
|
|
|
|
page_info: {
|
|
|
|
has_next_page: boolean,
|
|
|
|
start_cursor?: string,
|
|
|
|
end_cursor?: string,
|
|
|
|
},
|
|
|
|
}>;
|
|
|
|
|
2015-03-11 02:11:28 +00:00
|
|
|
/**
|
|
|
|
* Shape of the return value of the `getPhotos` function.
|
|
|
|
*/
|
2017-05-05 04:38:12 +00:00
|
|
|
const getPhotosReturnChecker = createStrictShapeTypeChecker({
|
2017-03-05 03:29:24 +00:00
|
|
|
// $FlowFixMe(>=0.41.0)
|
2017-05-05 04:38:12 +00:00
|
|
|
edges: PropTypes.arrayOf(
|
|
|
|
createStrictShapeTypeChecker({
|
|
|
|
node: createStrictShapeTypeChecker({
|
|
|
|
type: PropTypes.string.isRequired,
|
|
|
|
group_name: PropTypes.string.isRequired,
|
|
|
|
image: createStrictShapeTypeChecker({
|
|
|
|
uri: PropTypes.string.isRequired,
|
|
|
|
height: PropTypes.number.isRequired,
|
|
|
|
width: PropTypes.number.isRequired,
|
|
|
|
isStored: PropTypes.bool,
|
2017-08-15 18:36:44 +00:00
|
|
|
playableDuration: PropTypes.number.isRequired,
|
2017-05-05 04:38:12 +00:00
|
|
|
}).isRequired,
|
|
|
|
timestamp: PropTypes.number.isRequired,
|
|
|
|
location: createStrictShapeTypeChecker({
|
|
|
|
latitude: PropTypes.number,
|
|
|
|
longitude: PropTypes.number,
|
|
|
|
altitude: PropTypes.number,
|
|
|
|
heading: PropTypes.number,
|
|
|
|
speed: PropTypes.number,
|
|
|
|
}),
|
2015-03-11 02:11:28 +00:00
|
|
|
}).isRequired,
|
2017-05-05 04:38:12 +00:00
|
|
|
}),
|
|
|
|
).isRequired,
|
2015-03-11 02:11:28 +00:00
|
|
|
page_info: createStrictShapeTypeChecker({
|
2017-03-22 22:58:29 +00:00
|
|
|
has_next_page: PropTypes.bool.isRequired,
|
|
|
|
start_cursor: PropTypes.string,
|
|
|
|
end_cursor: PropTypes.string,
|
2015-03-11 02:11:28 +00:00
|
|
|
}).isRequired,
|
|
|
|
});
|
|
|
|
|
2015-07-27 16:22:51 +00:00
|
|
|
/**
|
|
|
|
* `CameraRoll` provides access to the local camera roll / gallery.
|
2016-09-02 04:29:46 +00:00
|
|
|
* Before using this you must link the `RCTCameraRoll` library.
|
2017-01-31 20:07:15 +00:00
|
|
|
* You can refer to [Linking](docs/linking-libraries-ios.html) for help.
|
2016-12-23 01:08:49 +00:00
|
|
|
*
|
|
|
|
* ### Permissions
|
|
|
|
* The user's permission is required in order to access the Camera Roll on devices running iOS 10 or later.
|
2017-05-03 17:15:35 +00:00
|
|
|
* Add the `NSPhotoLibraryUsageDescription` key in your `Info.plist` with a string that describes how your
|
|
|
|
* app will use this data. This key will appear as `Privacy - Photo Library Usage Description` in Xcode.
|
2016-12-23 01:08:49 +00:00
|
|
|
*
|
2015-07-27 16:22:51 +00:00
|
|
|
*/
|
2015-03-11 02:11:28 +00:00
|
|
|
class CameraRoll {
|
2017-05-05 04:38:12 +00:00
|
|
|
static GroupTypesOptions: Object = GROUP_TYPES_OPTIONS;
|
|
|
|
static AssetTypeOptions: Object = 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
|
|
|
);
|
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
|
|
|
return this.saveToCameraRoll(tag, 'photo');
|
|
|
|
}
|
|
|
|
|
2017-11-29 20:07:49 +00:00
|
|
|
static deletePhotos(photos: Array<string>) {
|
|
|
|
return RCTCameraRollManager.deletePhotos(photos);
|
|
|
|
}
|
|
|
|
|
2015-03-11 02:11:28 +00:00
|
|
|
/**
|
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
|
|
|
* Saves the photo or video to the camera roll / gallery.
|
2015-07-27 16:22:51 +00:00
|
|
|
*
|
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
|
|
|
* On Android, the tag must be a local image or video URI, such as `"file:///sdcard/img.png"`.
|
2015-07-27 16:22:51 +00:00
|
|
|
*
|
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
|
|
|
* On iOS, the tag can be any image URI (including local, remote asset-library and base64 data URIs)
|
|
|
|
* or a local video file URI (remote or data URIs are not supported for saving video at this time).
|
2015-07-27 16:22:51 +00:00
|
|
|
*
|
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
|
|
|
* If the tag has a file extension of .mov or .mp4, it will be inferred as a video. Otherwise
|
|
|
|
* it will be treated as a photo. To override the automatic choice, you can pass an optional
|
|
|
|
* `type` parameter that must be one of 'photo' or 'video'.
|
2015-03-11 02:11:28 +00:00
|
|
|
*
|
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
|
|
|
* Returns a Promise which will resolve with the new URI.
|
2015-03-11 02:11:28 +00:00
|
|
|
*/
|
2017-05-05 04:38:12 +00:00
|
|
|
static saveToCameraRoll(
|
|
|
|
tag: string,
|
|
|
|
type?: 'photo' | 'video',
|
2017-09-12 16:59:36 +00:00
|
|
|
): Promise<string> {
|
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(
|
|
|
|
type === 'photo' || type === 'video' || type === undefined,
|
2017-12-07 16:22:47 +00:00
|
|
|
`The second argument to saveToCameraRoll must be 'photo' or 'video'. You passed ${type ||
|
|
|
|
'unknown'}`,
|
2015-03-11 02:11:28 +00:00
|
|
|
);
|
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
|
|
|
|
|
|
|
let mediaType = 'photo';
|
|
|
|
if (type) {
|
|
|
|
mediaType = type;
|
|
|
|
} else if (['mov', 'mp4'].indexOf(tag.split('.').slice(-1)[0]) >= 0) {
|
|
|
|
mediaType = 'video';
|
2016-01-21 16:07:01 +00:00
|
|
|
}
|
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
|
|
|
|
|
|
|
return RCTCameraRollManager.saveToCameraRoll(tag, mediaType);
|
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
|
|
|
*
|
2017-02-24 00:40:25 +00:00
|
|
|
* Expects a params object of the following shape:
|
2016-01-21 16:07:01 +00:00
|
|
|
*
|
2017-02-24 00:40:25 +00:00
|
|
|
* - `first` : {number} : The number of photos wanted in reverse order of the photo application (i.e. most recent first for SavedPhotos).
|
|
|
|
* - `after` : {string} : A cursor that matches `page_info { end_cursor }` returned from a previous call to `getPhotos`.
|
|
|
|
* - `groupTypes` : {string} : Specifies which group types to filter the results to. Valid values are:
|
|
|
|
* - `Album`
|
|
|
|
* - `All`
|
|
|
|
* - `Event`
|
|
|
|
* - `Faces`
|
|
|
|
* - `Library`
|
|
|
|
* - `PhotoStream`
|
|
|
|
* - `SavedPhotos` // default
|
|
|
|
* - `groupName` : {string} : Specifies filter on group names, like 'Recent Photos' or custom album titles.
|
|
|
|
* - `assetType` : {string} : Specifies filter on asset type. Valid values are:
|
|
|
|
* - `All`
|
|
|
|
* - `Videos`
|
|
|
|
* - `Photos` // default
|
|
|
|
* - `mimeTypes` : {string} : Filter by mimetype (e.g. image/jpeg).
|
|
|
|
*
|
|
|
|
* Returns a Promise which when resolved will be of the following shape:
|
|
|
|
*
|
|
|
|
* - `edges` : {Array<node>} An array of node objects
|
|
|
|
* - `node`: {object} An object with the following shape:
|
|
|
|
* - `type`: {string}
|
|
|
|
* - `group_name`: {string}
|
|
|
|
* - `image`: {object} : An object with the following shape:
|
|
|
|
* - `uri`: {string}
|
|
|
|
* - `height`: {number}
|
|
|
|
* - `width`: {number}
|
|
|
|
* - `isStored`: {boolean}
|
|
|
|
* - `timestamp`: {number}
|
|
|
|
* - `location`: {object} : An object with the following shape:
|
|
|
|
* - `latitude`: {number}
|
|
|
|
* - `longitude`: {number}
|
|
|
|
* - `altitude`: {number}
|
|
|
|
* - `heading`: {number}
|
|
|
|
* - `speed`: {number}
|
|
|
|
* - `page_info` : {object} : An object with the following shape:
|
|
|
|
* - `has_next_page`: {boolean}
|
2017-11-20 01:39:38 +00:00
|
|
|
* - `start_cursor`: {string}
|
|
|
|
* - `end_cursor`: {string}
|
2017-09-01 18:29:08 +00:00
|
|
|
*
|
|
|
|
* Loading images:
|
|
|
|
* ```
|
|
|
|
* _handleButtonPress = () => {
|
|
|
|
* CameraRoll.getPhotos({
|
|
|
|
* first: 20,
|
|
|
|
* assetType: 'All',
|
|
|
|
* })
|
|
|
|
* .then(r => {
|
|
|
|
* this.setState({ photos: r.edges });
|
|
|
|
* })
|
|
|
|
* .catch((err) => {
|
|
|
|
* //Error Loading Images
|
|
|
|
* });
|
|
|
|
* };
|
|
|
|
* render() {
|
|
|
|
* return (
|
|
|
|
* <View>
|
|
|
|
* <Button title="Load Images" onPress={this._handleButtonPress} />
|
|
|
|
* <ScrollView>
|
|
|
|
* {this.state.photos.map((p, i) => {
|
|
|
|
* return (
|
|
|
|
* <Image
|
|
|
|
* key={i}
|
|
|
|
* style={{
|
|
|
|
* width: 300,
|
|
|
|
* height: 100,
|
|
|
|
* }}
|
|
|
|
* source={{ uri: p.node.image.uri }}
|
|
|
|
* />
|
|
|
|
* );
|
|
|
|
* })}
|
|
|
|
* </ScrollView>
|
|
|
|
* </View>
|
|
|
|
* );
|
|
|
|
* }
|
|
|
|
* ```
|
2015-03-11 02:11:28 +00:00
|
|
|
*/
|
2017-12-07 16:22:47 +00:00
|
|
|
static getPhotos(params: GetPhotosParams): GetPhotosReturn {
|
2015-03-11 02:11:28 +00:00
|
|
|
if (__DEV__) {
|
2017-05-05 04:38:12 +00:00
|
|
|
checkPropTypes(
|
|
|
|
{params: getPhotosParamChecker},
|
|
|
|
{params},
|
|
|
|
'params',
|
|
|
|
'CameraRoll.getPhotos',
|
|
|
|
);
|
2015-03-11 02:11:28 +00:00
|
|
|
}
|
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];
|
|
|
|
if (__DEV__) {
|
2016-03-18 17:20:07 +00:00
|
|
|
const callback = arguments[1];
|
2017-05-05 04:38:12 +00:00
|
|
|
successCallback = response => {
|
2017-03-22 22:58:29 +00:00
|
|
|
checkPropTypes(
|
|
|
|
{response: getPhotosReturnChecker},
|
2016-01-21 16:07:01 +00:00
|
|
|
{response},
|
|
|
|
'response',
|
2017-05-05 04:38:12 +00:00
|
|
|
'CameraRoll.getPhotos callback',
|
2016-01-21 16:07:01 +00:00
|
|
|
);
|
|
|
|
callback(response);
|
|
|
|
};
|
|
|
|
}
|
2017-05-05 04:38:12 +00:00
|
|
|
const errorCallback = arguments[2] || (() => {});
|
|
|
|
RCTCameraRollManager.getPhotos(params).then(
|
|
|
|
successCallback,
|
|
|
|
errorCallback,
|
|
|
|
);
|
2015-03-11 02:11:28 +00:00
|
|
|
}
|
2016-01-21 16:07:01 +00:00
|
|
|
// TODO: Add the __DEV__ check back in to verify the Promise result
|
|
|
|
return RCTCameraRollManager.getPhotos(params);
|
2015-03-11 02:11:28 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
module.exports = CameraRoll;
|