<template>
    <view :style="viewStyle" :class="'custom-class ' + utils.bem('image', { round })" @tap="onClick">
        <image
            v-if="!error"
            :src="src"
            :mode="mode"
            :lazy-load="lazyLoad"
            class="image-class van-image__img"
            :show-menu-by-longpress="showMenuByLongpress"
            @load="onLoad"
            @error="onError"
        />

        <view v-if="loading && showLoading" class="loading-class van-image__loading">
            <slot v-if="useLoadingSlot" name="loading" />
            <van-icon v-else name="photo-o" size="22" />
        </view>
        <view v-if="error && showError" class="error-class van-image__error">
            <slot v-if="useErrorSlot" name="error" />
            <van-icon v-else name="warning-o" size="22" />
        </view>
    </view>
</template>
<script module="utils" lang="wxs" src="@/node_modules/@vant/weapp/dist/wxs/utils.wxs"></script>
<script>
import { addUnit, isDef } from '../common/utils';
import { VantComponent } from '../common/component';
import { button } from '../mixins/button';
import { openType } from '../mixins/open-type';
const FIT_MODE_MAP = {
    none: 'center',
    fill: 'scaleToFill',
    cover: 'aspectFill',
    contain: 'aspectFit',
    widthFix: 'widthFix',
    heightFix: 'heightFix'
};
export default {
    data() {
        return {
            error: false,
            loading: true,
            viewStyle: '',
            mode: ''
        };
    },
    mixins: [button, openType],
    classes: ['custom-class', 'loading-class', 'error-class', 'image-class'],
    props: {
        src: {
            type: String
        },
        round: Boolean,
        width: {
            type: null
        },
        height: {
            type: null
        },
        radius: null,
        lazyLoad: Boolean,
        useErrorSlot: Boolean,
        useLoadingSlot: Boolean,
        showMenuByLongpress: Boolean,
        fit: {
            type: String,
            default: 'fill'
        },
        showError: {
            type: Boolean,
            default: true
        },
        showLoading: {
            type: Boolean,
            default: true
        }
    },
    mounted() {
        this.setMode();
        this.setStyle();
    },
    methods: {
        setMode() {
            this.setData({
                mode: FIT_MODE_MAP[this.fit]
            });
        },
        setStyle() {
            const { width, height, radius } = this;
            let style = '';
            if (isDef(width)) {
                style += `width: ${addUnit(width)};`;
            }
            if (isDef(height)) {
                style += `height: ${addUnit(height)};`;
            }
            if (isDef(radius)) {
                style += 'overflow: hidden;';
                style += `border-radius: ${addUnit(radius)};`;
            }
            this.setData({
                viewStyle: style
            });
        },
        onLoad(event) {
            this.setData({
                loading: false
            });
            this.$emit('load', event.detail);
        },
        onError(event) {
            this.setData({
                loading: false,
                error: true
            });
            this.$emit('error', event.detail);
        },
        onClick(event) {
            this.$emit('click', event.detail);
        }
    },
    watch: {
        src: {
            handler: function () {
                this.setData({
                    error: false,
                    loading: true
                });
            },

            immediate: true
        },

        width: {
            handler: function () {
                const { width, height, radius } = this;
                let style = '';
                if (isDef(width)) {
                    style += `width: ${addUnit(width)};`;
                }
                if (isDef(height)) {
                    style += `height: ${addUnit(height)};`;
                }
                if (isDef(radius)) {
                    style += 'overflow: hidden;';
                    style += `border-radius: ${addUnit(radius)};`;
                }
                this.setData({
                    viewStyle: style
                });
            },

            immediate: true
        },

        height: {
            handler: function () {
                const { width, height, radius } = this;
                let style = '';
                if (isDef(width)) {
                    style += `width: ${addUnit(width)};`;
                }
                if (isDef(height)) {
                    style += `height: ${addUnit(height)};`;
                }
                if (isDef(radius)) {
                    style += 'overflow: hidden;';
                    style += `border-radius: ${addUnit(radius)};`;
                }
                this.setData({
                    viewStyle: style
                });
            },

            immediate: true
        },

        fit: {
            handler: function () {
                this.setData({
                    mode: FIT_MODE_MAP[this.fit]
                });
            },

            immediate: true
        }
    }
};
</script>
<style>
@import './index.css';
</style>
