/** * Copyright (c) Facebook, Inc. and its affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * * @flow * @format */ 'use strict'; const React = require('react'); const ReactNative = require('react-native'); const { CameraRoll, Image, Slider, StyleSheet, Switch, Text, View, TouchableOpacity, } = ReactNative; const invariant = require('invariant'); const CameraRollView = require('./CameraRollView'); const AssetScaledImageExampleView = require('./AssetScaledImageExample'); import type {PhotoIdentifier, GroupTypes} from 'CameraRoll'; type Props = $ReadOnly<{| navigator?: ?Array< $ReadOnly<{| title: string, component: Class>, backButtonTitle: string, passProps: $ReadOnly<{|asset: PhotoIdentifier|}>, |}>, >, |}>; type State = {| groupTypes: GroupTypes, sliderValue: number, bigImages: boolean, |}; class CameraRollExample extends React.Component { state = { groupTypes: 'SavedPhotos', sliderValue: 1, bigImages: true, }; _cameraRollView: ?React.ElementRef; render() { return ( {(this.state.bigImages ? 'Big' : 'Small') + ' Images'} {'Group Type: ' + this.state.groupTypes} { this._cameraRollView = ref; }} batchSize={20} groupTypes={this.state.groupTypes} renderImage={this._renderImage} /> ); } loadAsset(asset) { if (this.props.navigator) { this.props.navigator.push({ title: 'Camera Roll Image', component: AssetScaledImageExampleView, backButtonTitle: 'Back', passProps: {asset: asset}, }); } } _renderImage = (asset: PhotoIdentifier) => { const imageSize = this.state.bigImages ? 150 : 75; const imageStyle = [styles.image, {width: imageSize, height: imageSize}]; const {location} = asset.node; const locationStr = location ? JSON.stringify(location) : 'Unknown location'; return ( {asset.node.image.uri} {locationStr} {asset.node.group_name} {new Date(asset.node.timestamp).toString()} ); }; _onSliderChange = value => { const options = Object.keys(CameraRoll.GroupTypesOptions); const index = Math.floor(value * options.length * 0.99); const groupTypes = options[index]; if (groupTypes !== this.state.groupTypes) { this.setState({groupTypes: groupTypes}); } }; _onSwitchChange = value => { invariant(this._cameraRollView, 'ref should be set'); this._cameraRollView.rendererChanged(); this.setState({bigImages: value}); }; } const styles = StyleSheet.create({ row: { flexDirection: 'row', flex: 1, }, url: { fontSize: 9, marginBottom: 14, }, image: { margin: 4, }, info: { flex: 1, }, }); exports.title = 'Camera Roll'; exports.description = "Example component that uses CameraRoll to list user's photos"; exports.examples = [ { title: 'Photos', render(): React.Node { return ; }, }, ];