home.js 16 KB
/**
 * Created by Cassie on 2018/03/21
 */
import React, { Component } from 'react';
import {
    StyleSheet,
    View,
    Text,
    TouchableOpacity,
    Image,
    TextInput,
    Animated,
    ActivityIndicator,
    NativeModules,
    NativeEventEmitter,
    DeviceEventEmitter,
    Alert,
    Modal,
    Platform,
    BackHandler,
    AsyncStorage,
    ScrollView,StatusBar
} from 'react-native';
import moment from 'moment';

import {width,height,zoomW,zoomH} from '../../utils/getSize';
import {timeChange,xnToast,timeReduce,timePlus,timeEvery,numChange} from '../../utils/utils';
import xnService from "../../service/AppService";
import md5 from 'md5';
import IndexBanner from '../component/IndexBanner'

const nativeBridge = NativeModules.BlueToolManage;
const NativeModule = new NativeEventEmitter(nativeBridge);
const defaultIcon = require('../../img/defaultIcon.png');
const defaultIcon1 = require('../../img/volunteerService.png');
const defaultIcon2 = require('../../img/safeEscort.png');
const defaultIcon3 = require('../../img/myEvents.png');

export default class home extends Component {
    static navigationOptions = ({navigation}) => ({
        title:'首页',
        headerTitle:'平安地铁',
        headerRight:<TouchableOpacity onPress={() => { navigation.navigate('PersonCenter', {})}}>
            <Image source={require('../../img/my.png')} style={{marginRight:16}} resizeMode="contain"
            />
        </TouchableOpacity>,
        tabBarIcon: ({ tintColor }) => (
            <Image
                source={require('../../img/root_home.png')}
                style={[styles.icon, {tintColor: tintColor}]}
            />
        ),
        headerLeft:(
            <View></View>
        )
    });

    constructor(props){
        super(props);
        this.state = {
            adList:[
                {
                    id: 1,
                    count: 0,
                    type: 'CREDIT_PLATFORM',
                    pictureUrl: require('../../img/banner1.png')
                },
                {
                    id: 2,
                    count: 0,
                    type: 'CREDIT_AUTH',
                    pictureUrl: require('../../img/banner2.png')
                },
                {
                    id: 3,
                    count: 0,
                    type: 'CREDIT_INFO',
                    pictureUrl: require('../../img/banner3.png')
                },
            ],
            detailList:[

            ],
            escortsNumber:'0',
            myEvents:'0',
            escortCount:'0'
        };
    };

    componentWillMount(){

    };

    componentDidMount(){

        xnService.findEscortsNumber({pageSize:0}).then((data) => {

            if(data.message){
                xnToast(data.message);
                return;
            }
            if(data.errors.length > 0){
                xnToast(data.errors[0].message);
            }else{
                this.setState({
                    escortsNumber:data.value
                })
            }
        });

        xnService.getUserById({id:global.user.id}).then((data)=>{
            if(data.message){
                xnToast(data.message);
                return;
            }
            if(data.errors.length > 0){
                xnToast(data.errors[0].message);
            }else{

                this.setState({
                    escortCount:data.user.escortCount,
                })
            }
        })

        xnService.getMyEvents({userId:global.user.id}).then((data) => {
            if(data.message){
                xnToast(data.message);
                return;
            }
            if(data.errors.length > 0){
                xnToast(data.errors[0].message);
            }else{
                this.setState({
                    myEvents:data.result.length
                })
            }
        });

        xnService.findPostList({sortColumn:'IS_FORUM_TOP',pageSize:5,pageNumber:1}).then(data=>{
            this.setState({
                loading:false
            });
            if(data.message){
                xnToast(data.message);
                return;
            }
            if(data.errors.length > 0) {
                xnToast(data.errors[0].message);
            }else if(data.result && data.result.length > 0){

                this.setState({
                    detailList:data.result,
                });
            }
        });
    }

    /*跳转到详情*/
    toDetail(id){
        // xnService.updateView({id:id}).then((data) => {
        //     if(!data.message && data.errors.length == 0){
                this.props.navigation.navigate('Detail',{id:id})
        //     }
        // })
    };

    renderItem = (item,index) => {
        return (
            <TouchableOpacity activeOpacity={0.8} style={styles.listItem} onPress={() => this.toDetail(item.id)}>
                <View style={styles.itemTop}>
                    {/*<Image source={require('../../img/fire.png')} resizeMode="cover" style={{width:16/zoomW,height:20/zoomH}}/>*/}
                    <Text style={{fontSize:16,fontWeight:'600'}}>{item.title}</Text>
                </View>
                <View style={styles.itemContent}>
                    {item.imgeAttachmentCount == 1  &&  <Image source={{uri:item.attachmentList[0].filePath+'?x-oss-process=image/resize,w_1000'}} style={styles.coverImg} resizeMode="cover" />}
                    {item.imgeAttachmentCount > 1  && <View style={{flexDirection:'row'}}>
                        {item.attachmentList.map((item,index) => this.renderImg(item,index))}
                    </View>}
                    {item.contentText != null && item.contentText.length != 0 && <Text numberOfLines={2} style={styles.contentText}>{item.contentText}</Text>}
                </View>
                <View style={styles.itemBottom}>
                    {/*{numChange(item.postCount)}*/}
                    <Text style={{fontSize:14,color:'#999'}}></Text>
                    <View style={{display:'flex',flexDirection:'row',alignItems:'center'}}>
                        {item.threadUserAvatarUrl && <Image  style={styles.avatar} resizeMode="cover" />}
                        {!item.threadUserAvatarUrl && <Image source={defaultIcon} style={styles.avatar} resizeMode="cover" />}
                        <Text style={{fontSize:14,color:'#999'}}>{item.threadUserName}·{timeChange(Number(item.threadTime))}</Text>
                    </View>
                </View>
            </TouchableOpacity>
        )

    };

    /*渲染图片*/
    renderImg(item,index){
        return (
            <View key={index}>
                {index == 0 && <Image source={{uri:item.filePath+'?x-oss-process=image/resize,w_1000'}} style={styles.moreImg} resizeMode="cover" />}
                {index == 1 && <Image source={{uri:item.filePath+'?x-oss-process=image/resize,w_1000'}} style={[styles.moreImg,{marginLeft:(7/zoomW)}]} resizeMode="cover" />}
                {index == 2 && <Image source={{uri:item.filePath+'?x-oss-process=image/resize,w_1000'}} style={[styles.moreImg,{marginLeft:(7/zoomW)}]} resizeMode="cover" />}
            </View>
        )
    };

    render(){
        return (
            <View style={styles.background}>
                <StatusBar barStyle={'default'}/>
                <ScrollView
                    style={styles.container}
                    alwaysBounceVertical={false}
                    alwaysBounceHorizontal={false}
                >
                    <IndexBanner data={this.state.adList} navigation={this.props.navigation}/>
                    {/*报表信息*/}
                    <View style={styles.record}>
                        {/*志愿服务*/}
                        <View style={styles.bgImg}>
                            <Image source={defaultIcon1} style={{width:'100%',height:'100%',position:'absolute', top:0, left:0}} resizeMode="contain" />
                            <View style={{flex:1,justifyContent:'space-around',alignItems:'center',paddingBottom:2,paddingTop:2}}>
                                <View style={{width:110/zoomW,paddingLeft:7/zoomW,flexDirection:'row',alignItems:'center',justifyContent:'flex-start'}}>
                                    <Image source={require('../../img/volunteerServiceIcon.png')} style={{width:14/zoomW,height:14/zoomW}}/>
                                    <Text style={{backgroundColor:'transparent',fontSize:14,marginLeft:2/zoomW,color:'white'}}>志愿服务</Text>
                                </View>
                                <Text style={{backgroundColor:'transparent',fontSize:18,color:'white'}}>{this.state.escortCount}<Text style={{fontSize:12}}> </Text></Text>
                                <Text style={{backgroundColor:'transparent',fontSize:14,color:'white'}}>安全护行次数</Text>
                            </View>
                        </View>
                        {/*安全护航员*/}
                        <TouchableOpacity activeOpacity={0.8} onPress={()=>{this.props.navigation.navigate('SafeEscort')}}>

                            <View style={[styles.bgImg,{marginLeft:7.5/zoomW}]}>
                                <Image source={defaultIcon2} style={{width:'100%',height:'100%',position:'absolute', top:0, left:0}} resizeMode="contain" />
                                <View style={{flex:1,justifyContent:'space-around',alignItems:'center'}}>
                                    <View style={{width:110/zoomW,paddingLeft:7/zoomW,flexDirection:'row',alignItems:'center',justifyContent:'flex-start'}}>
                                        <Image source={require('../../img/safeEscortIcon.png')} style={{width:14/zoomW,height:14/zoomW}}/>
                                        <Text style={{backgroundColor:'transparent',fontSize:14,marginLeft:2/zoomW,color:'white'}}>安全护航员</Text>
                                    </View>
                                    <Text style={{backgroundColor:'transparent',fontSize:18,color:'white'}}>{this.state.escortsNumber}<Text style={{fontSize:12}}> </Text></Text>
                                    <Text style={{backgroundColor:'transparent',fontSize:14,color:'white'}}>本车护航员</Text>
                                </View>
                            </View>
                        </TouchableOpacity>

                        {/*我的事件*/}
                        <TouchableOpacity activeOpacity={0.8} onPress={()=>{this.props.navigation.navigate('MyEvents')}}>
                            <View style={[styles.bgImg,{marginLeft:7.5/zoomW}]}>
                                <Image source={defaultIcon3} style={{width:'100%',height:'100%',position:'absolute', top:0, left:0}} resizeMode="contain" />
                                <View style={{flex:1,justifyContent:'space-around',alignItems:'center'}}>
                                    <View style={{width:110/zoomW,paddingLeft:7/zoomW,flexDirection:'row',alignItems:'center',justifyContent:'flex-start'}}>
                                        <Image source={require('../../img/myEventsIcon.png')} style={{width:14/zoomW,height:14/zoomW}}/>
                                        <Text style={{backgroundColor:'transparent',fontSize:14,marginLeft:2/zoomW,color:'white'}}>我的事件</Text>
                                    </View>
                                    <Text style={{backgroundColor:'transparent',fontSize:18,color:'white'}}>{this.state.myEvents}<Text style={{fontSize:12}}> </Text></Text>
                                    <Text style={{backgroundColor:'transparent',fontSize:14,color:'white'}}>已上报</Text>
                                </View>
                            </View>
                        </TouchableOpacity>


                    </View>
                    {/*我是一条分割线*/}
                    <View style={{flexDirection:'row',height:45/zoomH,alignItems:'center',justifyContent:'center',paddingLeft:16/zoomW,paddingRight:16/zoomW}}>
                        <View style={{flex:1,height:1/zoomH,backgroundColor:'#d4d4d4'}}></View>
                        <Text style={{marginLeft:19/zoomW,marginRight:19/zoomW,color:'#b8b8b8',fontSize:12}}>公益社区</Text>
                        <View style={{flex:1,height:1/zoomH,backgroundColor:'#d4d4d4'}}></View>
                    </View>
                    {/*社区列表*/}
                    {this.state.detailList.map((v, i) => this.renderItem(v, i))}
                    {/*{this.state.detailList && this.state.detailList.length ==0 && this.noResult()}*/}
                </ScrollView>
            </View>
        );
    }
}

const styles = StyleSheet.create({
    background:{
        flex:1,
        backgroundColor:'#f6f6f6',
        display:'flex',
        alignItems:'center',

    },
    container: {
        flex: 1,
    },
    record:{
        width:width,
        height:90/zoomH,
        backgroundColor:'white',
        marginTop:10,
        flexDirection:'row',
        alignItems:'center',
        justifyContent:'center'
    },
    listItem:{
        minHeight:(110/zoomH),
        backgroundColor:'#fff',
        marginBottom:(8/zoomH),
        padding:(15/zoomH),
    },
    itemContent:{
        marginTop:(15/zoomH),
        marginBottom:(15/zoomH)
    },
    itemBottom:{
        display:'flex',
        flexDirection:'row',
        justifyContent:'space-between'
    },
    moreImg:{
        width:(110/zoomW),
        height:(110/zoomW),
        backgroundColor:'#eee'
    },
    coverImg:{
        width:(345/zoomW),
        height:(193/zoomH),
        backgroundColor:'#eee'
    },
    contentText:{
        marginTop:10/zoomH,
        fontSize:14,
        color:'#666'
    },
    avatar:{
        width:(20/zoomW),
        height:(20/zoomW),
        borderRadius:(10/zoomW),
        marginRight:(6/zoomW)
    },
    itemTop:{
        justifyContent:'flex-start',
        flexDirection:'row',
        alignItems:'center'
    },
    bgImg:{
        width:110/zoomW,
        height:70/zoomH,

    },
    icon:{
        width:24,
        height:23
    }
});


// {/*<Image style={{width:110/zoomW,height:70/zoomH,backgroundColor:'red',borderRadius:4}}>*/}
// {/*<View style={{flex:1,justifyContent:'space-around',alignItems:'center'}}>*/}
// {/*<View style={{width:110/zoomW,paddingLeft:7/zoomW,flexDirection:'row',alignItems:'center',justifyContent:'flex-start'}}>*/}
// {/*<Image style={{width:14/zoomW,height:14/zoomW,backgroundColor:'green'}}></Image>*/}
// {/*<Text style={{fontSize:12,marginLeft:2/zoomW,color:'white'}}>志愿服务</Text>*/}
// {/*</View>*/}
// {/*<Text style={{fontSize:18,color:'white'}}>10<Text style={{fontSize:12}}> 件</Text></Text>*/}
// {/*<Text style={{fontSize:13,color:'white'}}>报名成功</Text>*/}
// {/*</View>*/}
// {/*</Image>*/}
// {/*<Image style={{marginLeft:7.5/zoomW,width:110/zoomW,height:70/zoomH,backgroundColor:'red',borderRadius:4}}>*/}
//     {/*<View style={{flex:1,justifyContent:'space-around',alignItems:'center'}}>*/}
//         {/*<View style={{width:110/zoomW,paddingLeft:7/zoomW,flexDirection:'row',alignItems:'center',justifyContent:'flex-start'}}>*/}
//             {/*<Image style={{width:14/zoomW,height:14/zoomW,backgroundColor:'green'}}></Image>*/}
//             {/*<Text style={{fontSize:12,marginLeft:2/zoomW,color:'white'}}>安全护航员</Text>*/}
//         {/*</View>*/}
//         {/*<Text style={{fontSize:18,color:'white'}}>39<Text style={{fontSize:12}}> 人</Text></Text>*/}
//         {/*<Text style={{fontSize:13,color:'white'}}>本车护航员</Text>*/}
//     {/*</View>*/}
// {/*</Image>*/}
//
// <Image style={{marginLeft:7.5/zoomW,width:110/zoomW,height:70/zoomH,backgroundColor:'red',borderRadius:4}}>
//     <View style={{flex:1,justifyContent:'space-around',alignItems:'center'}}>
//         <View style={{width:110/zoomW,paddingLeft:7/zoomW,flexDirection:'row',alignItems:'center',justifyContent:'flex-start'}}>
//             <Image style={{width:14/zoomW,height:14/zoomW,backgroundColor:'green'}}></Image>
//             <Text style={{fontSize:12,marginLeft:2/zoomW,color:'white'}}>我的事件</Text>
//         </View>
//         <Text style={{fontSize:18,color:'white'}}>22<Text style={{fontSize:12}}> 件</Text></Text>
//         <Text style={{fontSize:13,color:'white'}}>已上报</Text>
//     </View>
// </Image>