import React, {Component} from 'react'; import Toast from '@remobile/react-native-toast'; import CommonTitleBar from '../views/CommonTitleBar'; import CountEmitter from '../event/CountEmitter'; import StorageUtil from '../utils/StorageUtil'; import LoadingView from '../views/LoadingView'; import MomentMenuView from '../views/MomentMenuView'; import {UIManager} from 'NativeModules'; import ReplyPopWin from '../views/ReplyPopWin'; import Global from '../utils/Global'; import Utils from '../utils/Utils'; import Base64Utils from '../utils/Base64'; import TimeUtils from '../utils/TimeUtil'; import { ART, Dimensions, FlatList, Image, PixelRatio, StyleSheet, Text, TextInput, TouchableOpacity, View } from 'react-native'; const {width} = Dimensions.get('window'); const AVATAR_WIDTH = 80; const HEIGHT = width * 7 / 10; export default class MomentScreen extends Component { constructor(props) { super(props); this.state = { moments: [], avatar: '', showProgress: false, menuPos: {}, menuShow: false, doFavorMomentId: -1, isUpdate: false, isLoadMore: false, hasMoreData: true, showReplyInput: false }; // 分页需要使用的两个参数offset:偏移量, pagesize:一页的大小,pagesize=-1代表获取所有数据 this.offset = 0; this.pagesize = 5; StorageUtil.get('username', (error, object) => { if (!error && object != null) { this.setState({username: object.username}); StorageUtil.get('userInfo-' + object.username, (error, object) => { if (!error && object != null) { this.setState({avatar: object.info.avatar}); } }); } }); } componentWillMount() { CountEmitter.addListener('updateMomentList', () => { // 刷新朋友圈列表 this.setState({isUpdate: true, isLoadMore: false}); this.offset = 0; this.pagesize = 5; this.getMoments(true); }); } componentDidMount() { if (!this.state.isUpdate) { this.setState({isLoadMore: false}); this.getMoments(true); } let replyInput = this.refs.replyInput; if (!Utils.isEmpty(replyInput)) { replyInput.focus(); } } getMoments(useLoading) { if (useLoading) { this.showLoading(); } let url = 'http://app.yubo725.top/moments?offset=' + this.offset + '&pagesize=' + this.pagesize; fetch(url).then((res) => res.json()) .then((json) => { if (useLoading) { this.hideLoading(); } if (json != null) { if (json.code == 1) { let data = json.msg; // 数组 if (data.length == 0) { Toast.showShortCenter('没有更多数据了'); this.setState({hasMoreData: false}); return; } let moments = this.state.moments; if (data != null && data.length > 0) { for (let i = 0; i < data.length; i++) { data[i].key = i + '-' + this.offset; if (this.state.isLoadMore) { moments.push(data[i]); } } } if (this.state.isLoadMore) { this.setState({moments: moments}); } else { this.setState({moments: data}); } } } }).catch((e) => { if (useLoading) { this.hideLoading(); } Toast.showShortCenter(e.toString()); }) } showLoading() { this.setState({showProgress: true}); } hideLoading() { this.setState({showProgress: false}); } renderHeaderView(username, avatar) { return ( {this.state.username} ); } render() { let avatar = require('../../images/avatar.png'); if (!Utils.isEmpty(this.state.avatar)) { avatar = {uri: this.state.avatar}; } return ( this.props.navigation.navigate('PublishMoment')}/> { this.state.showProgress ? ( this.setState({showProgress: false})}/> ) : (null) } this.renderHeaderView(this.state.username, avatar)} data={this.state.moments} renderItem={this.renderItem} onEndReached={() => { this.loadNextPage() }} onEndReachedThreshold={0.2} /> { this.state.showReplyInput ? ( ) : (null) } ); } renderImageRow(arr, start, end) { let images = []; for (let i = start; i < end; i++) { let img = {uri: arr[i]}; images.push( this.props.navigation.navigate('ImageShow', {'images': arr, 'index': i})}> ); } return ( {images} ); } renderImages(pictures) { if (pictures == null || pictures == '') { return null; } let arr = pictures.split('#'); let len = arr.length; let images = []; if (len > 0) { let rowNum = Math.ceil(len / 3); for (let i = 0; i < rowNum; i++) { let start = i * 3; let end = i * 3 + 3; if (end > len) { end = len; } images.push(this.renderImageRow(arr, start, end)); } } return ( {images} ); } loadNextPage = (info) => { if (!this.state.hasMoreData) { return; } this.setState({isLoadMore: true}); Toast.showShortCenter('加载下一页'); this.offset = this.offset + this.pagesize; this.getMoments(false); } renderReplys(item) { let replys = []; let arr = item.item.replys; if (!Utils.isEmpty(arr) && arr.length > 0) { for (let i = 0; i < arr.length; i++) { replys.push({arr[i].username + ":" + Base64Utils.decoder(arr[i].content)}); } } return replys; } isCommentEmpty(item) { if (Utils.isEmpty(item.item.favor_names) && (item.item.replys == null || item.item.replys.length == 0)) { return true; } return false; } renderItem = (item) => { const path = ART.Path(); path.moveTo(10, 10); path.lineTo(20, 0); path.lineTo(30, 10); path.close(); let avatar = require('../../images/avatar.png'); if (!Utils.isEmpty(item.item.avatar)) { avatar = {uri: item.item.avatar}; } return ( {item.item.username} {Base64Utils.decoder(item.item.content)} {this.renderImages(item.item.pictures)} {TimeUtils.getFormattedTime(item.item.time)} this.showMenuView(e, item.item.moment_id, item.item.username, this.doFavorSuccessCallback, this.doCommentCallback)} style={{marginLeft: 10}}> { this.isCommentEmpty(item) ? (null) : ( { Utils.isEmpty(item.item.favor_names) ? (null) : ( {item.item.favor_names} { (item.item.replys == null || item.item.replys.length == 0) ? (null) : ( ) } ) } {this.renderReplys(item)} ) } ); } showMenuView(event, momentId, momentUsername, callback1, callback2) { this.setState({doFavorMomentId: momentId}); this.refs.momentMenuView.showModal(event.nativeEvent.pageX, event.nativeEvent.pageY, momentId, momentUsername, callback1, callback2); } doFavorSuccessCallback = (favorNames) => { let arr = this.state.moments.concat(); if (!Utils.isEmpty(arr)) { for (let i = 0; i < arr.length; i++) { let momentId = arr[i].moment_id; if (momentId == this.state.doFavorMomentId) { arr[i].favor_names = favorNames; } } } this.setState({moments: arr}); } doCommentSuccessCallback = (momentId, data) => { // 评论成功后,刷新列表 let arr = this.state.moments.concat(); if (!Utils.isEmpty(arr)) { for (let i = 0; i < arr.length; i++) { let id = arr[i].moment_id; if (momentId == id) { arr[i].replys = data; break; } } } this.setState({moments: arr}); } doCommentCallback = (momentId, momentUsername) => { this.refs.replyPopWin.showModal(momentId, momentUsername, this.doCommentSuccessCallback); } componentWillUnmount() { CountEmitter.removeListener('updateMomentList', ()=>{}); } } const listItemStyle = StyleSheet.create({ container: { flexDirection: 'row', alignItems: 'flex-start', padding: 10, }, imageContainer: { flexDirection: 'column', marginTop: 6, }, imageCell: { width: 80, height: 80, marginRight: 3, }, avatar: { width: 40, height: 40, }, content: { flex: 1, flexDirection: 'column', marginLeft: 10, }, nameText: { fontSize: 15, color: '#54688D' }, msgText: { fontSize: 15, color: '#000000', marginTop: 2, }, timeContainer: { flex: 1, flexDirection: 'row', alignItems: 'flex-start', marginTop: 10, }, timeText: { flex: 1, fontSize: 12, color: '#999999', }, commentImg: { width: 25, height: 17, }, divider: { flex: 1, height: 1 / PixelRatio.get(), backgroundColor: Global.dividerColor, }, commentContainer: { flex: 1, }, commentContent: { backgroundColor: '#EEEEEE', padding: 6, }, favorContainer: { flexDirection: 'row', alignItems: 'center', }, favorImg: { width: 13, height: 13, marginRight: 5, marginTop: 5, }, commentText: { flex: 1, fontSize: 13, color: '#54688D', marginTop: 2, } }); const styles = StyleSheet.create({ container: { flex: 1, flexDirection: 'column', backgroundColor: '#F8F8F8', }, momentImg: { width: width, height: HEIGHT, marginBottom: 40, }, userNameText: { color: '#FFFFFF', fontSize: 16, fontWeight: 'bold', position: 'absolute', right: 95, top: HEIGHT - 25, }, avatarImg: { width: AVATAR_WIDTH, height: AVATAR_WIDTH, position: 'absolute', right: 10, top: HEIGHT - 45, borderWidth: 2, borderColor: '#FFFFFF' } });