hot记录

/**
 * 热门发现
 */
'use strict';

import React, { Component } from 'react';
import {
  Modal,
  TouchableOpacity,
  ListView,
  StyleSheet,
  Text,
  View,
  ActivityIndicator,
  RefreshControl,
  InteractionManager
} from 'react-native';

import Login from '../user/login';
import Icon from '../svg/icon';
import PostShow from '../post/PostShow';
import StatusBar from '../components/StatusBar';
import ListItem from '../components/ListItem';
import styles from '../styles/common';
import routes from '../../routes';
import * as Storage from '../common/Storage';

import { hotListArticles } from '../actions/hotActions';
import { userFromSync, userToken } from '../actions/userActions';

let cacheResults = {
  dataBlob : [],
  skip     : 0,
  limit    : 4,
}

class Hot extends Component {
  constructor(props) {
    super(props);

    this.state = {
      checkItem    : '',
      checkIndex   : '',
      isFavorite   : false,
      animationType: 'none',
      modalVisible : false,
      transparent  : true,
      dataSource   : new ListView.DataSource({
        rowHasChanged  : (row1, row2) => row1 !== row2
      }),
      loaded       : true,
      isNull       : false,
      isMore       : false,
      isRefreshing : false,
    }

    this._favorite = this._favorite.bind(this);
    this._postToFriend = this._postToFriend.bind(this);
  }

  getArticles(skip, limit, isNew) {
    var url = routes.hot
    Storage.getToken()
      .then((token) => {
        if (token != '') {
        fetch(url, {
          method: 'POST',
          headers: {
            'Accept': 'application/json',
            'Content-Type': 'application/json',
            'Authorization': `JWT ${token}`,
          },
          body: JSON.stringify({
            skip: skip,
            limit: limit,
          })
          })
          .then((response) => response.json())
          .then((responseJson) => {
            if (responseJson.articles.length == 0 && skip == 0) {
              this.setState({
                isNull : true
              })
            } else if (responseJson.articles.length == 0 && skip != 0){
              this.setState({
                isMore : true
              })
            } else {
              if (isNew) {
                let datas = [...responseJson.articles];
                cacheResults.dataBlob = datas;
                var skilNext = skip + 5;

                this.setState({
                  dataSource: this.state.dataSource.cloneWithRows(datas),
                  loaded : false,
                  skip   : skilNext,
                  isRefreshing: false
                })
              } else {
                let datas = [...cacheResults.dataBlob];
                datas.push(...responseJson.articles);
                cacheResults.dataBlob = datas;
                var skilNext = this.state.skip + 5;

                this.setState({
                  dataSource: this.state.dataSource.cloneWithRows(datas),
                  loaded : false,
                  skip   : skilNext,
                  isRefreshing: false
                })
              }
            }
          })
          .catch((error) => {
            console.error(error);
          });
        } else {
          this._loginPush();
        }
      })
  }
  
  componentWillMount() {
    const { navigator, route } = this.props;
    route.title = "发现";
  }

  componentDidMount() {
    //从缓存加载数据到对应的state
    const { dispatch } = this.props;
    // Storage.getUser()
    //   .then((user) => {
    //     dispatch(userFromSync(user));
    //   });
    //获取发现数据
    InteractionManager.runAfterInteractions(() => {
      const { dispatch, userReducer } = this.props;
      Storage.getToken()
      .then((token) => {
        dispatch(userToken(token));
        dispatch(hotListArticles(token, cacheResults.skip, cacheResults.limit));
      });
    });
    //this.getArticles(this.state.skip, this.state.limit)
  }

  _renderEndReached() {
    const { hotReducer, userReducer, dispatch } = this.props;
    if (hotReducer.loaded) {
      return;
    }
    
    dispatch(hotListArticles(userReducer.token, hotReducer.skip + 5, hotReducer.limit))
  }

  // 下拉刷新
  _onRefresh() {
    this.setState({isRefreshing: true});
    //服务器获取新的数据
    this.getArticles(0, 4, true)
  }

  _renderFooter(isNull, isMore) {
    if (isNull) {
      return (
        <View style={styles.nullBoxForLine}>
          <Text style={styles.nullBoxTextForLine}>~ 快去发现吧 ~</Text>
        </View>
      );
    } else if(isMore){
      return (
        <View style={styles.nullBoxForLine}>
          <Text style={styles.nullBoxTextForLine}>~ 没有更多了喔 ~</Text>
        </View>
      );
    } else {
      return (
        <View style={styles.loadingMore}>
          <ActivityIndicator style={styles.loadIcon}/>
          <Text>正在加载...</Text>
        </View>
      );
    }
  }

  // 跳转到登录页面
  _loginPush() {
    const { navigator } = this.props;
    if (navigator) {
      navigator.push({
        name     : 'login',
        component: Login,
      })
    }
  }
 
  // 跳转到 postshow
  _showPost(rowData) {
    const { navigator } = this.props;
    if (navigator) {
      navigator.push({
        name     : 'postshow',
        component: PostShow,
        params   : {
          data: rowData,
          user: this.props.user
        }
      })
    }
  }

  // 显示/隐藏modal
  _setModalVisible(visible) {
    this.setState({modalVisible: visible});
  };

  // 选中item
  _checkItem(item) {
    this.setState({checkItem : item});
    this.setState({isFavorite : item.isfavorite});
  };

  _checkIndex(index) {
    this.setState({checkIndex : index});
  }

  // 列表单元格
  _renderItem(rowData, sectionID, rowID) {
    return (
      <ListItem item={rowData} index={rowID} showPost= {this._showPost.bind(this)}
       modal= {this._setModalVisible.bind(this)} checkitem={this._checkItem.bind(this)} 
       checkindex = {this._checkIndex.bind(this)} navigator={this.props.navigator}
      />
    );
  }
  
  _renderSectionHeader(sectionData, sectionID) {
    return (
      <View style={styles.spaceBox}>
      </View>
    );
  }

  // 收藏功能
  _favorite(item) {
    if (item) {
      if (item.isfavorite) {
        this._favoriteRemove(item.favorite);
      } else {
        this._favoriteCreate(item.target_id, item.author_id._id);
      }
    }
  }

  // 创建收藏
  _favoriteCreate(postid, authorid){
    var createurl = routes.favoriteCreate;
    AsyncStorage.getItem('jwt', (err, token) => {
      fetch(createurl, {
        method: 'POST',
        headers: {
          'Accept': 'application/json',
          'Content-Type': 'application/json',
          'Authorization': `JWT ${token}`,
        },
        body: JSON.stringify({
          postid: postid,
          authorid: authorid,
        })
        })
        .then((response) => response.json())
        .then((responseJson) => {
          // 修改本地缓存数据
          cacheResults.dataBlob[this.state.checkIndex].isfavorite = true;
          cacheResults.dataBlob[this.state.checkIndex].favorite = responseJson;
          this.setState({
            checkIndex: '',
            isFavorite: true,
            dataSource: this.state.dataSource.cloneWithRows(cacheResults.dataBlob),
          })
          this._setModalVisible(false)
        })
        .catch((error) => {
          console.error(error);
        });
    });
  }
  // 取消收藏
  _favoriteRemove(favorite){

    var removeurl = routes.favoriteRemove + favorite._id;
    AsyncStorage.getItem('jwt', (err, token) => {
      fetch(removeurl,{
        method: 'POST',
        headers: {
          'Accept': 'application/json',
          'Authorization': `JWT ${token}`,
        }
      })
      .then((response) => response.json())
      .then((responseJson) => {
        if (responseJson == 1) {
          // 修改本地缓存数据
          cacheResults.dataBlob[this.state.checkIndex].isfavorite = false;
          cacheResults.dataBlob[this.state.checkIndex].favorite = '';
          this.setState({
            checkIndex: '',
            isFavorite: false,
            dataSource: this.state.dataSource.cloneWithRows(cacheResults.dataBlob),
          })
          this._setModalVisible(false)
        }
      })
      .catch((error) => {
        console.error(error);
      })
      .done();
    });
  }

  // 转发到动态
  _postToFriend(item) {
    var url = routes.postToFriend + item.target_id + '/user/' + this.state.user._id;
    AsyncStorage.getItem('jwt', (err, token) => {
      fetch(url,{
        method: 'POST',
        headers: {
          'Accept': 'application/json',
          'Authorization': `JWT ${token}`,
        }
      })
      .then((response) => response.json())
      .then((responseJson) => {
        if (responseJson) {
          this._setModalVisible(false)
          setTimeout(function(){
            alert('转发成功!')
          }, 1000)
        }
      })
      .catch((error) => {
        console.error(error);
      })
      .done();
    });
  }

  render() {
    let modalBackgroundStyle = {
      backgroundColor: this.state.transparent ? 'rgba(0, 0, 0, 0.5)' : '#f5fcff',
    };
    let innerContainerTransparentStyle = this.state.transparent
      ? {backgroundColor: '#fff'}
      : null;

    const { hotReducer } = this.props;

    return (
      <View style={styles.container}>
        <StatusBar/>
        <View style={styles.header}>
          <Text style={styles.headerTitle} numberOfLines={1}>发现</Text>
        </View>
        <ListView
          initialListSize = {1}
          enableEmptySections = {true}
          pageSize = {5}
          onEndReached = {this._renderEndReached.bind(this)}
          onEndReachedThreshold = {20}
          dataSource = {this.state.dataSource.cloneWithRows(hotReducer.dataBlob)} 
          refreshControl = {
            <RefreshControl
              refreshing = {this.state.isRefreshing}
              onRefresh = {this._onRefresh.bind(this)}
            />
          }
          renderFooter = {this._renderFooter.bind(this, this.state.isNull, this.state.isMore)}
          renderRow = {this._renderItem.bind(this)}
          style = {styles.listview}
        />
        <Modal
          animationType={this.state.animationType}
          transparent={this.state.transparent}
          visible={this.state.modalVisible}
          onRequestClose={() => this._setModalVisible(false)}
          >
          <View style={[styles.modalContainer, modalBackgroundStyle]}>
            <View style={[styles.modalInnerContainer, innerContainerTransparentStyle]}>
              <TouchableOpacity onPress={ () => this._postToFriend(this.state.checkItem)}>
                <View style={styles.itemBox}>
                  <Text style={styles.itemText}>转发</Text>
                </View>
              </TouchableOpacity>
              <TouchableOpacity onPress={ () => this._favorite(this.state.checkItem)}>
                <View style={styles.itemBox}>
                  <Text style={styles.itemText}>{this.state.isFavorite ? '取消收藏' : '收藏'}</Text>
                </View>
              </TouchableOpacity>
              <TouchableOpacity onPress={this._setModalVisible.bind(this,false) }>
                <View style={[styles.itemBox,{height:60,borderTopWidth:10,borderTopColor:'#F8F8F8'}]}>
                  <Text style={[styles.itemText]}>取消</Text>
                </View>
              </TouchableOpacity>
            </View>
          </View>
        </Modal>
      </View>
    );
  }
}

module.exports = Hot;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,616评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,020评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,078评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,040评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,154评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,265评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,298评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,072评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,491评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,795评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,970评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,654评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,272评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,985评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,815评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,852评论 2 351

推荐阅读更多精彩内容