/** * 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. * * @providesModule ListViewPagingExample * @flow */ 'use strict'; var React = require('react'); var ReactNative = require('react-native'); var { Image, LayoutAnimation, ListView, StyleSheet, Text, TouchableOpacity, View, } = ReactNative; var NativeModules = require('NativeModules'); var { UIManager, } = NativeModules; var THUMB_URLS = [ require('./Thumbnails/like.png'), require('./Thumbnails/dislike.png'), require('./Thumbnails/call.png'), require('./Thumbnails/fist.png'), require('./Thumbnails/bandaged.png'), require('./Thumbnails/flowers.png'), require('./Thumbnails/heart.png'), require('./Thumbnails/liking.png'), require('./Thumbnails/party.png'), require('./Thumbnails/poke.png'), require('./Thumbnails/superlike.png'), require('./Thumbnails/victory.png'), ]; var NUM_SECTIONS = 100; var NUM_ROWS_PER_SECTION = 10; class Thumb extends React.Component<{}, $FlowFixMeState> { UNSAFE_componentWillMount() { UIManager.setLayoutAnimationEnabledExperimental && UIManager.setLayoutAnimationEnabledExperimental(true); } _getThumbIdx = () => { return Math.floor(Math.random() * THUMB_URLS.length); }; _onPressThumb = () => { var config = layoutAnimationConfigs[this.state.thumbIndex % layoutAnimationConfigs.length]; LayoutAnimation.configureNext(config); this.setState({ thumbIndex: this._getThumbIdx(), dir: this.state.dir === 'row' ? 'column' : 'row', }); }; state = {thumbIndex: this._getThumbIdx(), dir: 'row'}; render() { return ( {this.state.dir === 'column' ? Oooo, look at this new text! So awesome it may just be crazy. Let me keep typing here so it wraps at least one line. : } ); } } class ListViewPagingExample extends React.Component<$FlowFixMeProps, *> { static title = ' - Paging'; static description = 'Floating headers & layout animations.'; // $FlowFixMe found when converting React.createClass to ES6 constructor(props) { super(props); var getSectionData = (dataBlob, sectionID) => { return dataBlob[sectionID]; }; var getRowData = (dataBlob, sectionID, rowID) => { return dataBlob[rowID]; }; var dataSource = new ListView.DataSource({ getRowData: getRowData, getSectionHeaderData: getSectionData, rowHasChanged: (row1, row2) => row1 !== row2, sectionHeaderHasChanged: (s1, s2) => s1 !== s2, }); var dataBlob = {}; var sectionIDs = []; var rowIDs = []; for (var ii = 0; ii < NUM_SECTIONS; ii++) { var sectionName = 'Section ' + ii; sectionIDs.push(sectionName); dataBlob[sectionName] = sectionName; rowIDs[ii] = []; for (var jj = 0; jj < NUM_ROWS_PER_SECTION; jj++) { var rowName = 'S' + ii + ', R' + jj; rowIDs[ii].push(rowName); dataBlob[rowName] = rowName; } } this.state = { dataSource: dataSource.cloneWithRowsAndSections(dataBlob, sectionIDs, rowIDs), headerPressCount: 0, }; } renderRow = (rowData: string, sectionID: string, rowID: string): React.Element => { return (); }; renderSectionHeader = (sectionData: string, sectionID: string) => { return ( {sectionData} ); }; renderHeader = () => { var headerLikeText = this.state.headerPressCount % 2 ? 1 Like : null; return ( {headerLikeText} Table Header (click me) ); }; renderFooter = () => { return ( console.log('Footer!')} style={styles.text}> Table Footer ); }; render() { return ( console.log({visibleRows, changedRows})} renderHeader={this.renderHeader} renderFooter={this.renderFooter} renderSectionHeader={this.renderSectionHeader} renderRow={this.renderRow} initialListSize={10} pageSize={4} scrollRenderAheadDistance={500} stickySectionHeadersEnabled /> ); } _onPressHeader = () => { var config = layoutAnimationConfigs[Math.floor(this.state.headerPressCount / 2) % layoutAnimationConfigs.length]; LayoutAnimation.configureNext(config); this.setState({headerPressCount: this.state.headerPressCount + 1}); }; } var styles = StyleSheet.create({ listview: { backgroundColor: '#B0C4DE', }, header: { height: 40, justifyContent: 'center', alignItems: 'center', backgroundColor: '#3B5998', flexDirection: 'row', }, text: { color: 'white', paddingHorizontal: 8, }, rowText: { color: '#888888', }, thumbText: { fontSize: 20, color: '#888888', }, buttonContents: { flexDirection: 'row', justifyContent: 'center', alignItems: 'center', marginHorizontal: 5, marginVertical: 3, padding: 5, backgroundColor: '#EAEAEA', borderRadius: 3, paddingVertical: 10, }, img: { width: 64, height: 64, marginHorizontal: 10, backgroundColor: 'transparent', }, section: { flexDirection: 'column', justifyContent: 'center', alignItems: 'flex-start', padding: 6, backgroundColor: '#5890ff', }, }); var animations = { layout: { spring: { duration: 750, create: { duration: 300, type: LayoutAnimation.Types.easeInEaseOut, property: LayoutAnimation.Properties.opacity, }, update: { type: LayoutAnimation.Types.spring, springDamping: 0.4, }, }, easeInEaseOut: { duration: 300, create: { type: LayoutAnimation.Types.easeInEaseOut, property: LayoutAnimation.Properties.scaleXY, }, update: { delay: 100, type: LayoutAnimation.Types.easeInEaseOut, }, }, }, }; var layoutAnimationConfigs = [ animations.layout.spring, animations.layout.easeInEaseOut, ]; module.exports = ListViewPagingExample;