<template>
    <view class="content">
        <view class="cropper-wrapper" :style="{ height: cropperOpt.height + 'px' }">
            <canvas
                class="cropper"
                :disable-scroll="true"
                @touchstart="touchStart"
                @touchmove="touchMove"
                @touchend="touchEnd"
                :style="{ width: cropperOpt.width, height: cropperOpt.height, backgroundColor: 'rgba(0, 0, 0, 0.8)' }"
                canvas-id="cropper"
                id="cropper"
            ></canvas>
            <canvas
                class="cropper"
                :disable-scroll="true"
                :style="{
                    position: 'fixed',
                    top: `-${cropperOpt.width * cropperOpt.pixelRatio}px`,
                    left: `-${cropperOpt.height * cropperOpt.pixelRatio}px`,
                    width: `${cropperOpt.width * cropperOpt.pixelRatio}px`,
                    height: `${cropperOpt.height * cropperOpt.pixelRatio}`
                }"
                canvas-id="targetId"
                id="targetId"
            ></canvas>
        </view>
        <view class="cropper-buttons safe-area-padding" :style="{ height: bottomNavHeight + 'px' }">
            <!-- #ifdef H5 -->
            <view class="upload" @tap="uploadTap">选择图片</view>
            <!-- #endif -->
            <!-- #ifndef H5 -->
            <view class="upload" @tap="uploadTap">重新选择</view>
            <!-- #endif -->
            <view class="getCropperImage" @tap="getCropperImage(false)">确定</view>
        </view>
    </view>
</template>

<script>
import WeCropper from './weCropper.js';
export default {
    props: {
        // 裁剪矩形框的样式,其中可包含的属性为lineWidth-边框宽度(单位rpx),color: 边框颜色,
        // mask-遮罩颜色,一般设置为一个rgba的透明度,如"rgba(0, 0, 0, 0.35)"
        boundStyle: {
            type: Object,
            default() {
                return {
                    lineWidth: 4,
                    borderColor: 'rgb(245, 245, 245)',
                    mask: 'rgba(0, 0, 0, 0.35)'
                };
            }
        }
        // // 裁剪框宽度,单位rpx
        // rectWidth: {
        //     type: [String, Number],
        //     default: 400
        // },
        // // 裁剪框高度,单位rpx
        // rectHeight: {
        //     type: [String, Number],
        //     default: 400
        // },
        // // 输出图片宽度,单位rpx
        // destWidth: {
        //     type: [String, Number],
        //     default: 400
        // },
        // // 输出图片高度,单位rpx
        // destHeight: {
        //     type: [String, Number],
        //     default: 400
        // },
        // // 输出的图片类型,如果发现裁剪的图片很大,可能是因为设置为了"png",改成"jpg"即可
        // fileType: {
        //     type: String,
        //     default: 'jpg',
        // },
        // // 生成的图片质量
        // // H5上无效,目前不考虑使用此参数
        // quality: {
        //     type: [Number, String],
        //     default: 1
        // }
    },
    data() {
        return {
            // 底部导航的高度
            bottomNavHeight: 50,
            originWidth: 200,
            width: 0,
            height: 0,
            cropperOpt: {
                id: 'cropper',
                targetId: 'targetCropper',
                pixelRatio: 1,
                width: 0,
                height: 0,
                scale: 2.5,
                zoom: 8,
                cut: {
                    x: (this.width - this.originWidth) / 2,
                    y: (this.height - this.originWidth) / 2,
                    width: this.originWidth,
                    height: this.originWidth
                },
                boundStyle: {
                    lineWidth: uni.upx2px(this.boundStyle.lineWidth),
                    mask: this.boundStyle.mask,
                    color: this.boundStyle.borderColor
                }
            },
            // 裁剪框和输出图片的尺寸,高度默认等于宽度
            // 输出图片宽度,单位px
            destWidth: 200,
            // 裁剪框宽度,单位px
            rectWidth: 200,
            // 输出的图片类型,如果'png'类型发现裁剪的图片太大,改成"jpg"即可
            fileType: 'jpg',
            src: '', // 选择的图片路径,用于在点击确定时,判断是否选择了图片
        };
    },
    onLoad(option) {
        let rectInfo = uni.getSystemInfoSync();
        this.width = rectInfo.windowWidth;
        this.height = rectInfo.windowHeight - this.bottomNavHeight;
        this.cropperOpt.width = this.width;
        this.cropperOpt.height = this.height;
        this.cropperOpt.pixelRatio = rectInfo.pixelRatio;

        if (option.destWidth) this.destWidth = option.destWidth;
        if (option.rectWidth) {
            let rectWidth = Number(option.rectWidth);
            this.cropperOpt.cut = {
                x: (this.width - rectWidth) / 2,
                y: (this.height - rectWidth) / 2,
                width: rectWidth,
                height: rectWidth
            };
        }
        this.rectWidth = option.rectWidth;
        if (option.fileType) this.fileType = option.fileType;
        // 初始化
        this.cropper = new WeCropper(this.cropperOpt)
            .on('ready', ctx => {
                // wecropper is ready for work!
            })
            .on('beforeImageLoad', ctx => {
                // before picture loaded, i can do something
            })
            .on('imageLoad', ctx => {
                // picture loaded
            })
            .on('beforeDraw', (ctx, instance) => {
                // before canvas draw,i can do something
            });
        // 设置导航栏样式,以免用户在page.json中没有设置为黑色背景
        uni.setNavigationBarColor({
            frontColor: '#ffffff',
            backgroundColor: '#000000'
        });
        uni.chooseImage({
            count: 1, // 默认9
            sizeType: ['compressed'], // 可以指定是原图还是压缩图,默认二者都有
            sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
            success: res => {
                this.src = res.tempFilePaths[0];
                //  获取裁剪图片资源后,给data添加src属性及其值
                this.cropper.pushOrign(this.src);
            }
        });
    },
    methods: {
        touchStart(e) {
            this.cropper.touchStart(e);
        },
        touchMove(e) {
            this.cropper.touchMove(e);
        },
        touchEnd(e) {
            this.cropper.touchEnd(e);
        },
        getCropperImage(isPre = false) {
            if(!this.src) return this.$u.toast('请先选择图片再裁剪');

            let cropper_opt = {
                destHeight: Number(this.destWidth), // uni.canvasToTempFilePath要求这些参数为数值
                destWidth: Number(this.destWidth),
                fileType: this.fileType
            };
            this.cropper.getCropperImage(cropper_opt, (path, err) => {
                if (err) {
                    uni.showModal({
                        title: '温馨提示',
                        content: err.message
                    });
                } else {
                    if (isPre) {
                        uni.previewImage({
                            current: '', // 当前显示图片的 http 链接
                            urls: [path] // 需要预览的图片 http 链接列表
                        });
                    } else {
                        uni.$emit('uAvatarCropper', path);
                        this.$u.route({
                            type: 'back'
                        });
                    }
                }
            });
        },
        uploadTap() {
            const self = this;
            uni.chooseImage({
                count: 1, // 默认9
                sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有
                sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
                success: (res) => {
                    self.src = res.tempFilePaths[0];
                    //  获取裁剪图片资源后,给data添加src属性及其值

                    self.cropper.pushOrign(this.src);
                }
            });
        }
    }
};
</script>

<style scoped lang="scss">
@import '../../libs/css/style.components.scss';

.content {
    background: rgba(255, 255, 255, 1);
}

.cropper {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    z-index: 11;
}

.cropper-buttons {
    background-color: #000000;
    color: #eee;
}

.cropper-wrapper {
    position: relative;
    @include vue-flex;
    flex-direction: row;
    justify-content: space-between;
    align-items: center;
    width: 100%;
    background-color: #000;
}

.cropper-buttons {
    width: 100vw;
    @include vue-flex;
    flex-direction: row;
    justify-content: space-between;
    align-items: center;
    position: fixed;
    bottom: 0;
    left: 0;
    font-size: 28rpx;
}

.cropper-buttons .upload,
.cropper-buttons .getCropperImage {
    width: 50%;
    text-align: center;
}

.cropper-buttons .upload {
    text-align: left;
    padding-left: 50rpx;
}

.cropper-buttons .getCropperImage {
    text-align: right;
    padding-right: 50rpx;
}
</style>