react-native/RNTester/js/ListViewGridLayoutExample.js
nd-02110114 7a9d86019f Remove var in RNTester (#22017)
Summary:
I removed `var` in RNTester.

- [x] npm run prettier
- [x] npm run flow-check-ios
- [x] npm run flow-check-android

[GENERAL] [ENHANCEMENT] [RNTester] - remove `var`
Pull Request resolved: https://github.com/facebook/react-native/pull/22017

Differential Revision: D12843109

Pulled By: TheSavior

fbshipit-source-id: 936ed5efdcff2e7b85e90ed90c589eb98c60c411
2018-10-30 12:57:29 -07:00

156 lines
3.8 KiB
JavaScript

/**
* 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.
*
* @format
* @flow strict-local
*/
'use strict';
const React = require('react');
const ReactNative = require('react-native');
const {
Image,
ListView,
TouchableHighlight,
StyleSheet,
Text,
View,
} = ReactNative;
const ListViewDataSource = require('ListViewDataSource');
import type {RNTesterProps} from 'RNTesterTypes';
const 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'),
];
type State = {|
dataSource: ListViewDataSource,
|};
class ListViewGridLayoutExample extends React.Component<RNTesterProps, State> {
static title = '<ListView> - Grid Layout';
static description = 'Flexbox grid layout.';
state = {
dataSource: this.getInitialDataSource(),
};
getInitialDataSource() {
const ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2});
return ds.cloneWithRows(this._genRows({}));
}
_pressData: {[key: number]: boolean} = {};
UNSAFE_componentWillMount() {
this._pressData = {};
}
render() {
return (
// ListView wraps ScrollView and so takes on its properties.
// With that in mind you can use the ScrollView's contentContainerStyle prop to style the items.
<ListView
contentContainerStyle={styles.list}
dataSource={this.state.dataSource}
initialListSize={21}
pageSize={3} // should be a multiple of the no. of visible cells per row
scrollRenderAheadDistance={500}
renderRow={this._renderRow}
/>
);
}
_renderRow = (rowData: string, sectionID: number, rowID: number) => {
const rowHash = Math.abs(hashCode(rowData));
const imgSource = THUMB_URLS[rowHash % THUMB_URLS.length];
return (
<TouchableHighlight
onPress={() => this._pressRow(rowID)}
underlayColor="transparent">
<View>
<View style={styles.row}>
<Image style={styles.thumb} source={imgSource} />
<Text style={styles.text}>{rowData}</Text>
</View>
</View>
</TouchableHighlight>
);
};
_genRows(pressData: {[key: number]: boolean}): Array<string> {
const dataBlob = [];
for (let ii = 0; ii < 100; ii++) {
const pressedText = pressData[ii] ? ' (X)' : '';
dataBlob.push('Cell ' + ii + pressedText);
}
return dataBlob;
}
_pressRow = (rowID: number) => {
this._pressData[rowID] = !this._pressData[rowID];
this.setState({
dataSource: this.state.dataSource.cloneWithRows(
this._genRows(this._pressData),
),
});
};
}
/* eslint no-bitwise: 0 */
const hashCode = function(str) {
let hash = 15;
for (let ii = str.length - 1; ii >= 0; ii--) {
hash = (hash << 5) - hash + str.charCodeAt(ii);
}
return hash;
};
const styles = StyleSheet.create({
list: {
justifyContent: 'space-around',
flexDirection: 'row',
flexWrap: 'wrap',
alignItems: 'flex-start',
},
row: {
justifyContent: 'center',
padding: 5,
margin: 3,
width: 100,
height: 100,
backgroundColor: '#F6F6F6',
alignItems: 'center',
borderWidth: 1,
borderRadius: 5,
borderColor: '#CCC',
},
thumb: {
width: 64,
height: 64,
},
text: {
flex: 1,
marginTop: 5,
fontWeight: 'bold',
},
});
module.exports = ListViewGridLayoutExample;