Banner.js 3.3 KB
'use strict';

import React from 'react';
import ReactNative from 'react-native';
import Swiper from 'react-native-swiper';
import ImmutablePropTypes from 'react-immutable-proptypes';
import SlicedImage from './SlicedImage';
import Platform from 'react-native';
const {
    View,
    Image,
    TouchableOpacity,
    StyleSheet,
    Dimensions,
} = ReactNative;

export default class Banner extends React.Component {

    static propTypes = {
        data: ImmutablePropTypes.listOf(
            ImmutablePropTypes.contains({
                src: React.PropTypes.string.isRequired,
                url: React.PropTypes.string.isRequired,
            })
        ),
        duration: React.PropTypes.number,
        width: React.PropTypes.number.isRequired,
        height: React.PropTypes.number.isRequired,
        onPress: React.PropTypes.func,
    };

    constructor(props) {
        super (props);

        this.dot = <View
            style={{
                backgroundColor:'rgba(0,0,0,.2)',
                width: 6,
                height: 6,
                borderRadius: 3,
                marginLeft: 3,
                marginRight: 3,
                marginTop: 3,
                marginBottom: 3,
            }}
        />;
        this.activeDot = <View
            style={{
                backgroundColor:'white',
                width: 6,
                height: 6,
                borderRadius: 3,
                marginLeft: 3,
                marginRight: 3,
                marginTop: 3,
                marginBottom: 3,
            }}
        />;
    }

    render() {
        let width = this.props.width;
        let height = this.props.height;
        let data = this.props.data.toArray();

        if (data.length == 1) {
            let item = data[0];
            return (
                <TouchableOpacity
                    activeOpacity={1}
                    onPress={() => {
                        this.props.onPress && this.props.onPress(item.get('url'), 0);
                    }}
                >
                    <SlicedImage source={{uri: item.get('src')}} style={{width, height}}/>
                </TouchableOpacity>
            );
        } else {
            return (
                <Swiper
                    style={styles.banner}
                    showsButtons={false}
                    loop={true}
                    autoplay={true}
                    autoplayTimeout={this.props.duration}
                    paginationStyle={{bottom: 8}}
                    dot={this.dot}
                    activeDot={this.activeDot}
                    height={height}
                >
                    {data.map((item, i) => {
                        return (
                            <TouchableOpacity
                                key={i}
                                activeOpacity={1}
                                onPress={() => {
                                    this.props.onPress && this.props.onPress(item.get('url'), i);
                                }}
                            >
                                <SlicedImage source={{uri: item.get('src')}} style={{width, height}}/>
                            </TouchableOpacity>
                        );
                    })}
                </Swiper>
            );
        }
    }
}

let styles = StyleSheet.create({
    banner: {

    },
});