ImageSlider.js 4.36 KB
'use strict';

import React from 'react';
import ReactNative from 'react-native';
import Swiper from 'react-native-swiper';
import YH_Image from '../../../common/components/YH_Image';
import Immutable, {Map} from 'immutable';
import RecyclerSwiper from '../../../common/recycler-swiper/recyclerswiper'

const {
    View,
    Image,
    TouchableOpacity,
    StyleSheet,
    Dimensions,
    Platform,
} = ReactNative;

const YH_Swiper = (Platform.OS === 'ios') ? Swiper : RecyclerSwiper;


export default class ImageSlider extends React.Component {

    constructor(props) {
        super (props);

        this.dot = <View
            style={{
                backgroundColor:'rgba(237, 237, 237, 0.5)',
                width: 5,
                height: 5,
                borderRadius: 2.5,
                marginLeft: 3,
                marginRight: 3,
                marginTop: (Platform.OS === 'ios')?3:1,
                marginBottom: 0,
            }}
        />;
        this.activeDot = <View
            style={{
                backgroundColor:'white',
                width: 5,
                height: 5,
                borderRadius: 2.5,
                marginLeft: 3,
                marginRight: 3,
                marginTop: 3,
                marginBottom: 0,
            }}
        />;
    }

    shouldComponentUpdate(nextProps){
        if (Immutable.is(nextProps.resource, this.props.resource) 
            && nextProps.sliderWidth == this.props.sliderWidth 
            && nextProps.sliderHeight == this.props.sliderHeight) {
            return false;
        } else {
            return true;
        }
    }

    render() {

        let {resource, sliderWidth, sliderHeight} = this.props;
        if (!resource || resource.size == 0) {
            return null;
        }

        let data = this.props.resource.toJS();

        if (data.length == 1) {
            let url = YH_Image.getSlicedUrl(data[0].src, sliderWidth, sliderHeight, 2);
            return (
                <TouchableOpacity
                    activeOpacity={1}
                    style={{width: sliderWidth, height: sliderHeight}}
                    onPress={() => {
                        this.props.onPressSlideItem && this.props.onPressSlideItem(data[0].url, 0);
                    }}
                >
                    <YH_Image
                        url={url}
                        style={{ width: sliderWidth, height: sliderHeight}}
                    />
                </TouchableOpacity>
            );
        } else {
            return (
                <YH_Swiper
                    showsButtons={false}
                    loop={true}
                    autoplay={true}
                    autoplayTimeout={3}
                    dot={this.dot}
                    activeDot={(Platform.OS === 'ios') ? this.activeDot : null}
                    width={sliderWidth}
                    height={sliderHeight}
                    paginationStyle={{
                        backgroundColor: 'rgba(68, 68, 68, 0.2)',
                        bottom: 10,
                        height: 10,
                        width: data.length * 12,
                        borderRadius: 5,
                        marginLeft: (sliderWidth - data.length * 12)/2,
                        paddingBottom: 3,
                    }}
                >
                    {data.map((item, i) => {
                        let url = YH_Image.getSlicedUrl(item.src, sliderWidth, sliderHeight, 2);
                        return (
                            <TouchableOpacity
                                key={i}
                                activeOpacity={1}
                                onPress={() => {
                                    this.props.onPressSlideItem && this.props.onPressSlideItem(item.url, i);
                                }}
                                onPressIn={() => {
                                    this.props.onChildScrollToPreventRefresh && this.props.onChildScrollToPreventRefresh();
                                }}
                            >
                                <YH_Image
                                    url={url}
                                    style={{width: sliderWidth, height: sliderHeight}}
                                />
                            </TouchableOpacity>
                        );
                    })}
                </YH_Swiper>
            );
        }
    }
}