search.js 6.93 KB
/**
 * Created by Cassie on 2018/03/06
 */
import React, { Component } from 'react';
import {
    StyleSheet,
    View,
    Text,
    TouchableOpacity,
    Image,
    TextInput,
    StatusBar,
    ActivityIndicator,
    FlatList
} from 'react-native';

import {zoomW,zoomH} from '../../utils/getSize';
import {getHeaderPadding,xnToast,numChange,getHeaderHeight} from "../../utils/utils";
import AppService from "../../service/AppService";

const defaultIcon = require('../../img/defaultIcon.png');
const noSearch = require('../../img/noSearch.png');

export default class Search extends Component {
    static navigationOptions = ({ navigation, screenProps })=>({
        title:null,
        headerStyle:{
            elevation:0, // 去掉阴影
            paddingTop:getHeaderPadding(),
            height:getHeaderHeight(),
            backgroundColor:'#fff',
        },
        headerLeft:(<View style={styles.rightTop}>
            <TextInput underlineColorAndroid="transparent" returnKeyType="search" autoFocus={true} placeholder="请搜索帖子标题" style={styles.inputBox} onChangeText={(text) => {navigation.state.params.setKey(text)}} onSubmitEditing={() => {navigation.state.params.search()}}/>
            <TouchableOpacity style={styles.rightIcon} onPress={navigation.state.params?navigation.state.params.back:null}>
                <Text style={{fontSize:16,color:'#666'}}>取消</Text>
            </TouchableOpacity>
        </View>),
        headerRight:null
    });

    constructor(props) {
        super(props);
        this.state = {
            loading:false,
            noResult:false
        };
    };

    componentDidMount(){
        //设置头部
        this.props.navigation.setParams({
            back:()=>{
                this.props.navigation.goBack();
            },
            setKey:(text)=>{
                this.setState({
                    title:text
                })
            },
            search:()=>{
                if(!this.state.title || this.state.title.length == 0){
                    xnToast('请输入帖子标题进行搜索~');
                    return;
                }
                this.setState({
                    loading:true
                });
                AppService.findPostList({title:this.state.title}).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.length == 0){
                            this.setState({
                                noResult:true
                            })
                        }
                        this.setState({
                            list:data.result
                        })
                    }
                })
            }
        });
    };
    /* 渲染列表*/
    keyExtractor = (item,index) => index;
    renderList = ({item,index}) => (
        <TouchableOpacity style={styles.listItem} onPress={() => this.toDetail(item.id)}>
            <View style={styles.itemTop}>
                <Text numberOfLines={2} style={[styles.itemTitle,{width:(345/zoomW)}]}>{item.title}</Text>
            </View>
            <View style={styles.itemContent}>
                {item.contentText.length != 0 && !item.cover && !item.video && <Text numberOfLines={2} style={styles.contentText}>{item.contentText}</Text>}
            </View>
            <View style={styles.itemBottom}>
                <Text style={{fontSize:14,color:'#999'}}>{numChange(item.postCount)}回复</Text>
                <View style={{display:'flex',flexDirection:'row',alignItems:'center'}}>
                    {item.threadUserAvatarUrl && <Image source={{uri:item.threadUserAvatarUrl}} style={styles.avatar} resizeMode="cover" />}
                    {!item.threadUserAvatarUrl && <Image source={defaultIcon} style={styles.avatar} resizeMode="cover" />}
                    <Text style={{fontSize:14,color:'#999'}}>{item.threadUserName}·{item.boardName}</Text>
                </View>
            </View>
        </TouchableOpacity>
    );
    /*跳转到详情*/
    toDetail(id){
        // AppService.updateView({id:id}).then((data) => {
        //     if(!data.message && data.errors.length == 0){
                this.props.navigation.navigate('Detail',{id:id})
        //     }
        // })
    };

    render() {
        return (
            <View style={styles.background}>
                <StatusBar barStyle="dark-content" />
                {this.state.list && <FlatList keyExtractor={this.keyExtractor} data={this.state.list} renderItem={this.renderList} />}
                {this.state.noResult && <View style={{width:'100%',height:'100%',display:'flex',alignItems:'center',justifyContent:'center'}}>
                    <Image source={noSearch} style={{marginBottom:(12/zoomH)}} resizeMode="cover" />
                    <Text style={{fontSize:14,color:'#999'}}>没有搜索结果~</Text>
                    <View style={{width:'100%',height:(100/zoomH),backgroundColor:'rgba(0,0,0,0)'}} />
                </View>}
                {this.state.loading && <View style={styles.loadingBg}>
                    <ActivityIndicator size="large" />
                </View>}
            </View>
        );
    }
}

const styles = StyleSheet.create({
    background:{
        width:'100%',
        height:'100%',
        backgroundColor:'#f2f2f2'
    },
    rightTop:{
        display:'flex',
        flexDirection:'row',
        paddingLeft:(15/zoomW)
    },
    inputBox:{
        width:(310/zoomW),
        height:(28/zoomH),
        backgroundColor:'#eeeff3',
        borderRadius:3,
        padding:0,
        paddingLeft:(5/zoomW),
        paddingRight:(5/zoomW)
    },
    rightIcon:{
        width:(40/zoomW),
        display:'flex',
        justifyContent:'center',
        alignItems:'center'
    },
    listItem:{
        minHeight:(110/zoomH),
        maxHeight:(318/zoomH),
        backgroundColor:'#fff',
        marginBottom:(8/zoomH),
        padding:(15/zoomH),
    },
    itemTitle:{
        color:'#000',
        fontSize:16,
        fontWeight:'600'
    },
    moreImg:{
        width:(112/zoomW),
        height:(112/zoomW)
    },
    itemContent:{
        display:'flex',
        flexDirection:'row',
        marginTop:(15/zoomH),
        marginBottom:(15/zoomH)
    },
    contentText:{
        fontSize:14,
        color:'#666'
    },
    itemBottom:{
        display:'flex',
        flexDirection:'row',
        justifyContent:'space-between'
    },
    avatar:{
        width:(20/zoomW),
        height:(20/zoomW),
        borderRadius:(10/zoomW),
        marginRight:(6/zoomW)
    },
    loadingBg:{
        width:'100%',
        height:'100%',
        position:'absolute',
        display:'flex',
        alignItems:'center',
        justifyContent:'center'
    }
});