/** * The examples provided by Facebook are for non-commercial testing and * evaluation purposes only. * * Facebook reserves all rights not expressly granted. * * 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 NON INFRINGEMENT. IN NO EVENT SHALL * FACEBOOK 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. * * @provides ListViewPagingExample * @flow */ 'use strict'; var React = require('react-native'); var { Image, LayoutAnimation, ListView, StyleSheet, Text, TouchableOpacity, View, } = React; var NativeModules = require('NativeModules'); var { UIManager, } = NativeModules; var PAGE_SIZE = 4; 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; var Thumb = React.createClass({ getInitialState: function() { return {thumbIndex: this._getThumbIdx(), dir: 'row'}; }, componentWillMount: function() { UIManager.setLayoutAnimationEnabledExperimental && UIManager.setLayoutAnimationEnabledExperimental(true); }, _getThumbIdx: function() { return Math.floor(Math.random() * THUMB_URLS.length); }, _onPressThumb: function() { var config = layoutAnimationConfigs[this.state.thumbIndex % layoutAnimationConfigs.length]; LayoutAnimation.configureNext(config); this.setState({ thumbIndex: this._getThumbIdx(), dir: this.state.dir === 'row' ? 'column' : 'row', }); }, render: function() { 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. : } ); } }); var ListViewPagingExample = React.createClass({ statics: { title: ' - Paging', description: 'Floating headers & layout animations.' }, getInitialState: function() { 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; } } return { dataSource: dataSource.cloneWithRowsAndSections(dataBlob, sectionIDs, rowIDs), headerPressCount: 0, }; }, renderRow: function(rowData: string, sectionID: string, rowID: string): ReactElement { return (); }, renderSectionHeader: function(sectionData: string, sectionID: string) { return ( {sectionData} ); }, renderHeader: function() { var headerLikeText = this.state.headerPressCount % 2 ? 1 Like : null; return ( {headerLikeText} Table Header (click me) ); }, renderFooter: function() { return ( console.log('Footer!')} style={styles.text}> Table Footer ); }, render: function() { return ( console.log({visibleRows, changedRows})} renderHeader={this.renderHeader} renderFooter={this.renderFooter} renderSectionHeader={this.renderSectionHeader} renderRow={this.renderRow} initialListSize={10} pageSize={PAGE_SIZE} scrollRenderAheadDistance={2000} /> ); }, _onPressHeader: function() { 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;