import { Component } from 'react' import { View, Text, Button, Image, Swiper, SwiperItem, scrollView, Input, Textarea } from '@tarojs/components' import * as api from '../../../service/index' import tool from '../../../common/tool' import TaroCanvasDrawer from '../../../component/taro-plugin-canvas'; import Taro, { getCurrentInstance } from '@tarojs/taro' import './index.less' export default class collection extends Component { $instance = getCurrentInstance() state = { // consultImg: 'https://video-h5.fyshark.com/1680752646217.png', value: '牛渚江头夜色寒,渡口月华如钩弯。孤帆远影千里外,独钓寂寥万重山。',//绘画描述 changeValue: '',//转义文本 imageList: [ ],//作品列表 tmplIds: [],//订阅列表 qrCodeImg: '', img_size: '1:1', // 绘图配置文件 config: null, interval: null,//画画轮训 intervalText: null,//诗词转义轮训 // 绘制的图片 shareImage: null, // TaroCanvasDrawer 组件状态 canvasStatus: false, isFill: false,//是否画海报 current: 0,//当前选择的作品 draw_status: 2,//2:已完成 lastTime: 0, jumpurl: '',//广告id que_cnt: 0, task_id: 0, repeat: 0,//广告次数 } componentWillMount () { setTimeout(() => { this.getWxCodeImg() }, 1000) } componentDidShow () { this.getWxTemplate() this.getCoinTaskAd() } getCoinTaskAd () { api.getCoinTaskAd().then(res => { if (res.code == 200) { this.setState({ jumpurl: res.data[0].jumpurl,//广告id task_id: res.data[0].id,//任务id repeat: res.data[0].repeat }) } }) } getWxCodeImg () { api.getWxCodeImg({ code_from: 'bill' }).then(res => { this.dataURLtoFile(res.data) }) } //base64转本地路径 dataURLtoFile (dataurl) { let that = this /// 获取到base64Data var base64Data = dataurl; /// 通过微信小程序自带方法将base64转为二进制去除特殊符号,再转回base64 base64Data = Taro.arrayBufferToBase64(Taro.base64ToArrayBuffer(base64Data)); /// 拼接请求头,data格式可以为image/png或者image/jpeg等,看需求 const base64ImgUrl = "data:image/png;base64," + base64Data; const base64ImgData = base64ImgUrl.replace(/^data:image\/\w+;base64,/, ''); const buffer = new ArrayBuffer(base64ImgData.length); const view = new Uint8Array(buffer); for (let i = 0; i < base64ImgData.length; i++) { view[i] = base64ImgData.charCodeAt(i); } const fileStream = Taro.base64ToArrayBuffer(base64ImgData); const filePath = Taro.env.USER_DATA_PATH + '/test.png'; Taro.getFileSystemManager().writeFile({ filePath: filePath, data: fileStream, encoding: 'binary', success: function (res) { console.log('writeFile success:', res, filePath); that.setState({ qrCodeImg: filePath }, () => { }) }, fail: function (res) { console.log('保存失败') } }) /// 刷新数据 return base64ImgUrl; } playVideoAll () { // let lastTime = this.state.lastTime; // let now = new Date().getTime(); // if (now - lastTime < 2000) return // this.setState({ // lastTime: now // }) let params = { jumpurl: this.state.jumpurl, id: this.state.task_id } if (process.env.TARO_ENV == 'tt') { this.playVideoTT(params) } else { this.playVideo(params) } } //抖音激励广告 playVideoTT (item) { const videoAd = tt.createRewardedVideoAd({ adUnitId: item.jumpurl }); Taro.showLoading({ title: '加载中...', }) videoAd.show() videoAd.onError((err) => { Taro.hideLoading() switch (err.errCode) { case 1004: // 无合适的广告 break; default: // 更多请参考错误码文档 } }); try { if (videoAd.closeHandler) { videoAd.offClose(videoAd.closeHandler); console.log("videoAd.offClose卸载成功"); } } catch (e) { console.log("videoAd.offClose 卸载失败"); console.error(e); } videoAd.closeHandler = function (data) { Taro.hideLoading() if (data.isEnded) { api.finishTask({ task_id: item.id }).then(res => { if (res.code == 200) { that.getUserInfo() that.getCoinTaskList() Taro.showToast({ title: '领取点券成功', icon: 'none', duration: 2000 }) } }) } else { Taro.showToast({ title: '领取点券失败', icon: 'none', duration: 2000 }) } } // 监听视频播放完成 videoAd.onClose(videoAd.closeHandler); } //微信激励广告 playVideo (item) { // 在页面中定义激励视频广告 let adUnitId = item.jumpurl // 在页面中定义激励视频广告 let videoAd = null let that = this console.log(videoAd, 'videoAd'); // 在页面onLoad回调事件中创建激励视频广告实例 if (wx.createRewardedVideoAd) { videoAd = wx.createRewardedVideoAd({ adUnitId: adUnitId }) videoAd.onLoad(() => { }) videoAd.onError((err) => { }) try { if (videoAd.closeHandler) { videoAd.offClose(videoAd.closeHandler); console.log("videoAd.offClose卸载成功"); } } catch (e) { console.log("videoAd.offClose 卸载失败"); console.error(e); } videoAd.closeHandler = function (res) { // 用户点击了【关闭广告】按钮 if (res && res.isEnded || res === undefined) { // 正常播放结束,可以下发游戏奖励 api.finishTask({ task_id: item.id }).then(res => { if (res.code == 200) { that.getUserInfo() that.getCoinTaskList() Taro.showToast({ title: '领取点券成功', icon: 'none', duration: 2000 }) } }) } else { //提前关闭小程序 } }; videoAd.onClose(videoAd.closeHandler); } // 用户触发广告后,显示激励视频广告 if (videoAd) { videoAd.show().catch(() => { // 失败重试 videoAd.load() .then(() => videoAd.show()) .catch(err => { Taro.showToast({ title: '暂无广告', icon: 'none', duration: 2000 }) console.log('激励视频 广告显示失败') }) }) } } download () { Taro.showLoading({ title: '加载中...' }) this.downImg() } // 鉴权操作 判断是否有保存到相册的权限 // 有就直接下载 没有就弹窗提示给权限 downImg () { Taro.getSetting({ success: res => { if (!res.authSetting['scope.writePhotosAlbum']) { Taro.authorize({ scope: 'scope.writePhotosAlbum', success: () => { this.doSaveImg() }, fail: () => { this.openConfirm() } }) } else { this.doSaveImg() } } }) } // 生成临时路径 保存图片到手机 doSaveImg () { Taro.hideLoading(); Taro.downloadFile({ url: this.state.imageList[this.state.current].img, success: res => { Taro.saveImageToPhotosAlbum({ filePath: res.tempFilePath, success: () => { Taro.showToast({ title: '已保存到相册', icon: 'success' }) }, fail: () => { Taro.showToast({ title: '保存失败', icon: 'none' }) } }) } }) } // 权限弹窗 openConfirm () { Taro.hideLoading(); Taro.showModal({ content: '检测到您没有打开小程序相册权限,是否取设置打开?', showCancel: true, success: res => { if (res.confirm) { // 打开权限 Taro.openSetting({ success: res => { this.doSaveImg() } }) } } }) } // 调用绘画 => canvasStatus 置为true、同时设置config canvasDrawFunc () { let sizeList = this.state.img_size.split(":") console.log(sizeList, 375 * sizeList[1] / sizeList[0]); let rssConfig = { width: 345, height: 314 * sizeList[1] / sizeList[0] + 69 + 112, backgroundColor: 'rgba(255,255,255,0.1)', debug: false, pixelRatio: 3, blocks: [ { x: 0, y: 0, width: 345, height: 314 * sizeList[1] / sizeList[0] + 69 + 112, paddingLeft: 0, paddingRight: 0, borderWidth: 0, // borderColor: '#ccc', backgroundColor: '#FFFFFF', borderRadius: 0, zIndex: 1, }, ], images: [ { url: 'https://we-spa.oss-cn-shenzhen.aliyuncs.com/total_picture/1679561342726.png', width: 154, height: 21, x: 16, y: 19, borderRadius: 12, zIndex: 8, }, { url: 'https://we-spa.oss-cn-shenzhen.aliyuncs.com/total_picture/1679561346368.png', width: 65, height: 4, x: 261, y: 28, borderRadius: 12, zIndex: 8, }, { url: this.state.imageList[this.state.current].img, width: 314, height: 314 * sizeList[1] / sizeList[0], x: 16, y: 69, borderRadius: 12, zIndex: 11, }, { url: this.state.qrCodeImg, width: 72, height: 72, x: 258, y: 314 * sizeList[1] / sizeList[0] + 69 + 20, borderRadius: 12, zIndex: 12, }, ], texts: [ { x: 20, y: 314 * sizeList[1] / sizeList[0] + 69 + 35, text: this.state.value, fontSize: 14, color: '#000', opacity: 1, fontFamily: 'PingFang SC', baseLine: 'middle', lineHeight: 22, lineNum: 3, textAlign: 'left', width: 200, zIndex: 999, }, ] } console.log('回执'); this.setState({ config: rssConfig, }, () => { this.setState({ isFill: true }) }) Taro.showLoading({ title: '加载中...' }) } // 绘制成功回调函数 (必须实现)=> 接收绘制结果、重置 TaroCanvasDrawer 状态 onCreateSuccess = (result) => { console.log('成功', result); const { tempFilePath, errMsg } = result; Taro.hideLoading(); if (errMsg === 'canvasToTempFilePath:ok') { this.setState({ shareImage: tempFilePath, // 重置 TaroCanvasDrawer 状态,方便下一次调用 isFill: false, config: {} }, () => { Taro.showShareImageMenu({ path: tempFilePath }) }) //画图成功之后打开分享 // Taro.downloadFile({ // url: tempFilePath, // success: (res) => { // console.log('打开分享'); // Taro.showShareImageMenu({ // path: res.tempFilePath // }) // } // }) } else { // 重置 TaroCanvasDrawer 状态,方便下一次调用 this.setState({ isFill: false, config: {} }) Taro.showToast({ icon: 'none', title: errMsg || '出现错误' }); console.log(errMsg); } // 预览 // Taro.previewImage({ // current: tempFilePath, // urls: [tempFilePath] // }) } // 绘制失败回调函数 (必须实现)=> 接收绘制错误信息、重置 TaroCanvasDrawer 状态 onCreateFail = (error) => { console.log('失败'); Taro.hideLoading(); // 重置 TaroCanvasDrawer 状态,方便下一次调用 this.setState({ isFill: false, config: {} }) console.log(error); } openFill () { this.canvasDrawFunc() } getRadomPrompt () { api.getRadomPoetry().then(res => { if (res.code == 200) { this.setState({ value: res.data.prompt, }) document.getElementById('textarea-num').innerHTML = res.data.prompt.length + "/1000"; } }) } deleteDrawText () { setTimeout(() => { this.setState({ value: '' }) document.getElementById('textarea-num').innerHTML = 0 + "/1000"; }, 200) } onInput (e) { var num = e.detail.cursor; document.getElementById('textarea-num').innerHTML = num + "/1000"; } onChangeInput (e) { // var num = e.detail.cursor; // document.getElementById('textarea-change-num').innerHTML = num + "/1000"; } onBlur (e) { console.log('onBlur'); this.setState({ value: e.detail.value }) } onChangeBlur (e) { this.setState({ changeValue: e.detail.value }) } selectModel (item, index) { this.setState({ current: index }) } getWxTemplate () { api.getWxTemplate().then(res => { let tmplIds = [] res.data.forEach(item => { tmplIds.push(item.template_id) }) this.setState({ tmplIds: tmplIds }) }) } //订阅 subscribe (task_id) { let that = this console.log('订阅', this.state.tmplIds); Taro.requestSubscribeMessage({ tmplIds: this.state.tmplIds, success: function (item) { console.log('订阅成功'); if (item.errMsg === 'requestSubscribeMessage:ok') { let keys = Object.keys(item); let tempids = []; keys.forEach(element => { if (item[element] == "accept") { tempids.push(element) } }); console.log(tempids, 'tempidstempids'); let pramas = { task_id: task_id, template_ids: tempids } api.subscribeTemplate(pramas) } Taro.showToast({ title: '已订阅', icon: 'none', duration: 2000 }) }, complete: function (res) { }, fail: function (res) { } }) } aiPoetryDraw () { console.log('画画'); Taro.showLoading({ title: '加载中...' }) if (this.state.draw_status != 2) { Taro.hideLoading() Taro.showToast({ title: `正在绘画中请稍后...`, icon: 'none', }); return } let that = this setTimeout(() => { console.log('画画2'); this.setState({ draw_status: 0 }, () => { api.aiPoetryDraw({ prompt: this.state.value }).then(res => { if (res.code == 200) { if (process.env.TARO_ENV == 'weapp') { this.subscribe(res.data.task_id) } this.getDrawTaskStatus(res.data.task_id) this.getDrawPromptText(res.data.task_id) } else { Taro.hideLoading() if (res.code == 4001) { that.setState({ draw_status: 2 }) Taro.showModal({ title: '您的余额不足', content: '是否前往获取点券?', success: function (res) { if (res.confirm) { Taro.navigateTo({ url: `/moduleA/pages/earnPoints/index` }) } else if (res.cancel) { console.log('用户点击取消') } }, }) } if (res.code == 4002) { that.setState({ draw_status: 2 }) Taro.showModal({ title: '提示', content: res.msg, success: function (item) { if (item.confirm) { if (process.env.TARO_ENV != 'weapp') { that.playVideoTT(res.data) } else { that.playVideo(res.data) } } else if (item.cancel) { console.log('用户点击取消') } } }) } else { Taro.showToast({ icon: 'none', title: res.msg }) } } }) }) }, 1000) } getDrawPromptText (task_id) { console.log('1111'); api.getDrawPromptText({ task_id: task_id }).then(res => { if (res.code == 200) { if (res.data.status == 3) { this.state.intervalText = setInterval(() => { clearInterval(this.state.intervalText) this.getDrawPromptText(task_id) }, 500 * 1) this.setState({ changeValue: res.data.prompt, }) // document.getElementById('textarea-change-num').innerHTML = res.data.prompt.length + "/1000"; } else { this.setState({ changeValue: res.data.prompt, }) // document.getElementById('textarea-change-num').innerHTML = res.data.prompt.length + "/1000"; clearInterval(this.state.intervalText) } } }) } getDrawTaskStatus (task_id) { api.getDrawTaskStatus({ task_id: task_id }).then(res => { Taro.hideLoading(); //定时器不要轻易改,避免造成服务器攻击 if (res.code == 200) { let draw_infos = res.data.draw_infos if (res.data.draw_status != 2) { let params = {} params['img'] = res.data.default_img params['id'] = -1 draw_infos.push(params) } if (res.data.draw_status != 2 && res.data.que_cnt > 1) { this.state.interval = setInterval(() => { clearInterval(this.state.interval) this.getDrawTaskStatus(task_id) }, 1000 * 30) } else if (res.data.draw_status != 2 && res.data.que_cnt <= 1) { clearInterval(this.state.interval) this.state.interval = setInterval(() => { this.getDrawTaskStatus(task_id) }, 1000 * 5) } else { clearInterval(this.state.interval) } this.setState({ imageList: draw_infos, draw_status: res.data.draw_status, que_cnt: res.data.que_cnt, img_size: res.data.draw_data.img_size }) } }) } onShareAppMessage = (res) => { let path = `/pages/index/index?c=${Taro.getStorageSync('user_id')}&s=rightTap` if (process.env.TARO_ENV == 'tt') { path = `/moduleB/pages/comic/index?c=channel_name&s=neibuguazai` } let shareData = { title: tool.shareTitle, path: path, imageUrl: tool.shareImg } return shareData; } changeCurrent (e) { this.setState({ current: e.detail.current }) console.log(e, 'eeee'); } selectModel (item, index) { this.setState({ current: index }) } componentWillUnmount () { //避免服务器攻击 clearInterval(this.state.interval) clearInterval(this.state.intervalText) } render () { return ( 绘画描述 (this.getRadomPrompt())}>使用推荐诗词 (this.deleteDrawText())}>清空