home.js 11.4 KB
/**
 * Created by Cassie on 2018/03/06
 */
import React, { Component } from 'react';
import {
    StyleSheet,
    View,
    Text,
    TouchableOpacity,
    Image,
    Animated,
    Modal
} from 'react-native';
import ScrollableTabView, { DefaultTabBar } from 'react-native-scrollable-tab-view';

import {height,zoomW,zoomH} from '../utils/getSize';
import {getHeaderHeight,getHeaderPadding,xnBorderWidth} from "../utils/utils";
import HomeList from './homeList'

const back = require('../img/back.png');
const search = require('../img/search.png');
const more = require('../img/more.png');
const post = require('../img/post.png');
const plate = require('../img/plate.png');
const selected = require('../img/selected.png');

export default class Home extends Component {
    static navigationOptions = ({ navigation, screenProps }) => ({
        header:null
    });

    constructor(props) {
        super(props);
        this.state = {
            homeList:[
                {isTop:true,title:'怎么看金蝶投资「纷享销客」5000万美元?',cover:true,video:true,content:'双方都否认了外界“收购”的传言,只是强调,区别于之前的财务投资,金蝶这一轮属于战略投资,“纷享...'},
                {title:'区块链应用 | 微软、超级账本、联合国加入区块链身份项目',video:true,content:'双方都否认了外界“收购”的传言,只是强调,区别于之前的财务投资,金蝶这一轮属于战略投资,“纷享...'},
                {title:'区块链应用 | 微软、超级账本、联合国加入区块链身份项目联合国加入区块链身份项目联合国加入区块链身份项目联合国加入区块链身份项目联合国加入区块链身份项目',content:'本组件继承自PureComponent而非通常的Component,这意味着如果其props在浅比较中是相等的,则不会重新渲染。所以请先检查你的renderItem函数所依赖的props数据(包括data属性以及可能用到的父组件的state),如果是一个引用类型(Object或者数组都是引用类型),则需要先修改其引用地址(比如先复制到一个新的Object或者数组中),然后再修改其值,否则界面很可能不会刷新。'}
            ],
            newList:[
                {isTop:true,title:'怎么看金蝶投资「纷享销客」5000万美元?',cover:true,video:true,content:'双方都否认了外界“收购”的传言,只是强调,区别于之前的财务投资,金蝶这一轮属于战略投资,“纷享...'},
                {title:'区块链应用 | 微软、超级账本、联合国加入区块链身份项目',video:true,content:'双方都否认了外界“收购”的传言,只是强调,区别于之前的财务投资,金蝶这一轮属于战略投资,“纷享...'}
            ],
            hotList:[
                {isTop:true,title:'怎么看金蝶投资「纷享销客」5000万美元?',cover:true,video:true,content:'双方都否认了外界“收购”的传言,只是强调,区别于之前的财务投资,金蝶这一轮属于战略投资,“纷享...'},
                {title:'区块链应用 | 微软、超级账本、联合国加入区块链身份项目联合国加入区块链身份项目联合国加入区块链身份项目联合国加入区块链身份项目联合国加入区块链身份项目',content:'本组件继承自PureComponent而非通常的Component,这意味着如果其props在浅比较中是相等的,则不会重新渲染。所以请先检查你的renderItem函数所依赖的props数据(包括data属性以及可能用到的父组件的state),如果是一个引用类型(Object或者数组都是引用类型),则需要先修改其引用地址(比如先复制到一个新的Object或者数组中),然后再修改其值,否则界面很可能不会刷新。'}
            ],
            right:new Animated.Value(-(228/zoomW)),
            showModal:false
        };
    }

    /*右侧菜单栏显示*/
    showRight(){
        this.setState({
            showModal:true
        });
        Animated.timing(
            this.state.right,
            {toValue:0}
        ).start();
    }
    /*右侧菜单栏关闭*/
    closeRight(){
        this.setState({
            right:new Animated.Value(-(228/zoomW)),
        },function(){
            this.setState({
                showModal:false,
            })
        });
    }

    render() {
        return (
            <View style={styles.background}>
                <View style={styles.topBar}>
                    <TouchableOpacity style={styles.leftIcon}>
                        <Image source={back} style={styles.backIcon} resizeMode="contain" />
                        <Text style={{color:'#fff',fontSize:16}}>犀牛</Text>
                    </TouchableOpacity>
                    <View style={styles.title}>
                        <Text style={{fontSize:18,color:'#fff',fontWeight:'600'}}>放牛娃</Text>
                    </View>
                    <View style={styles.rightTop}>
                        <TouchableOpacity style={styles.rightIcon}>
                            <Image source={search} style={styles.searchIcon} resizeMode="contain" />
                        </TouchableOpacity>
                        <TouchableOpacity style={styles.rightIcon} onPress={() => this.showRight()}>
                            <Image source={more} style={styles.moreIcon} resizeMode="contain" />
                        </TouchableOpacity>
                    </View>
                </View>
                <ScrollableTabView renderTabBar={() => <DefaultTabBar style={styles.tabStyle}/>}
                    tabBarUnderlineStyle={styles.tabBarLine}
                    tabBarActiveTextColor="#fff"
                    tabBarInactiveTextColor="#fff"
                >
                    <HomeList tabLabel='首页' homeList={this.state.homeList} navigation={this.props.navigation} />
                    <HomeList tabLabel='最新' newList={this.state.newList} navigation={this.props.navigation} />
                    <HomeList tabLabel='最热' hotList={this.state.hotList} navigation={this.props.navigation} />
                </ScrollableTabView>
                <Modal animationType={'none'} transparent={true} visible={this.state.showModal} onRequestClose={() => {}}>
                    <View style={styles.modalBg}>
                        <TouchableOpacity style={{flex:1}} onPress={() => this.closeRight()}>
                            <Animated.View style={[styles.rightMenu,{right:this.state.right}]}>
                                <TouchableOpacity activeOpacity={0.5} style={styles.post}>
                                    <View style={{flex:1}}>
                                        <Image source={post} style={styles.menuTip} resizeMode="contain" />
                                    </View>
                                    <View style={{flex:5}}>
                                        <Text style={{color:'#000',fontSize:16}}>发帖</Text>
                                    </View>
                                </TouchableOpacity>
                                <View style={styles.platBox}>
                                    <View style={{flex:1}}>
                                        <Image source={plate} style={[styles.menuTip,{marginTop:(14/zoomH)}]} resizeMode="contain" />
                                    </View>
                                    <View style={{flex:5}}>
                                        <TouchableOpacity activeOpacity={0.5} style={styles.plateItem}>
                                            <Text style={{color:'#000',fontSize:16}}>板块</Text>
                                        </TouchableOpacity>
                                        <TouchableOpacity activeOpacity={0.5} style={styles.plateItem}>
                                            <Text style={{color:'#000',fontSize:16}}>灌水区</Text>
                                            <Image source={selected} resizeMode="contain" />
                                        </TouchableOpacity>
                                        <TouchableOpacity activeOpacity={0.5} style={styles.plateItem}>
                                            <Text style={{color:'#000',fontSize:16}}>公司黑板报</Text>
                                        </TouchableOpacity>
                                        <TouchableOpacity activeOpacity={0.5} style={styles.plateItem}>
                                            <Text style={{color:'#000',fontSize:16}}>业界资讯</Text>
                                        </TouchableOpacity>
                                        <TouchableOpacity activeOpacity={0.5} style={styles.plateItem}>
                                            <Text style={{color:'#000',fontSize:16}}>新人报道</Text>
                                        </TouchableOpacity>
                                    </View>
                                </View>
                            </Animated.View>
                        </TouchableOpacity>
                    </View>
                </Modal>
            </View>
        );
    }
}

const styles = StyleSheet.create({
    topBar:{
        paddingTop:getHeaderPadding(),
        height:getHeaderHeight(),
        backgroundColor:'#1c1c20',
        display:'flex',
        flexDirection:'row'
    },
    leftIcon:{
        flex:1,
        height:'100%',
        display:'flex',
        flexDirection:'row',
        alignItems:'center'
    },
    title:{
        flex:2.5,
        height:'100%',
        display:'flex',
        justifyContent:'center',
        alignItems:'center'
    },
    backIcon:{
        width:(10/zoomW),
        height:(18/zoomH),
        marginLeft:(10/zoomW),
        marginRight:(5/zoomW)
    },
    rightTop:{
        flex:1,
        display:'flex',
        flexDirection:'row',
        justifyContent:'center',
        alignItems:'center'
    },
    rightIcon:{
        height:'100%',
        width:(34/zoomW),
        display:'flex',
        justifyContent:'center',
        alignItems:'flex-end'
    },
    searchIcon:{
        width:(20/zoomW),
        height:(20/zoomW)
    },
    moreIcon:{
        width:(20/zoomW),
        height:(20/zoomW)
    },
    background:{
        width:'100%',
        height:'100%',
        backgroundColor:'#fff'
    },
    tabStyle:{
        height:(34/zoomH),
        backgroundColor:'#1c1c20'
    },
    tabBarLine:{
        width:(20/zoomW),
        backgroundColor:'#fff',
        height:3,
        borderRadius:8,
        left:'16.66%',
        marginLeft:-(10/zoomW)
    },
    modalBg:{
        width:'100%',
        height:'100%',
        backgroundColor:'rgba(0,0,0,.5)'
    },
    rightMenu:{
        width:(228/zoomW),
        height:height,
        backgroundColor:'#fff',
        position:'absolute',
        right:0,
        paddingLeft:(20/zoomW)
    },
    post:{
        width:'100%',
        height:(90/zoomH),
        borderBottomWidth:xnBorderWidth(),
        borderBottomColor:'#eee',
        borderStyle:'solid',
        display:'flex',
        flexDirection:'row',
        alignItems:'center'
    },
    menuTip:{
        width:(20/zoomW),
        height:(20/zoomW),
        marginRight:(10/zoomW),
    },
    platBox:{
        width:'100%',
        display:'flex',
        flexDirection:'row'
    },
    plateItem:{
        width:'100%',
        paddingTop:(14/zoomH),
        paddingBottom:(14/zoomH),
        display:'flex',
        flexDirection:'row',
        alignItems:'center',
        justifyContent:'space-between',
        paddingRight:(22/zoomW)
    }
});