Files
doodle-mini/miniprogram/pages/index/index.ts
T

180 lines
5.6 KiB
TypeScript

import { WATER_COLORS, PAPER_SIZE } from '../../constants/index';
import TextDrawService from '../../service/textDrawService';
Page({
canvas: null as Canvas | null,
ctx: null as RenderingContext | null,
boxHeight: 0,
boxWidth: 0,
textDrawService: null as TextDrawService | null,
data: {
cardList: [] as Array<{ color: string; word: string }>,
showColorPopup: false,
currentKey: 0,
currentColor: '',
showIntroductionPopup: false,
},
onLoad() {
const hasShowIntroduction =
wx.getStorageSync('hasShowIntroduction') || false;
if (!hasShowIntroduction) {
this.setData({
cardList: [
{ color: '#FF0000', word: '涂' },
{ color: '#00FF00', word: '欢' },
{ color: '#FF7F00', word: '鸦' },
{ color: '#00FFFF', word: '迎' },
{ color: '#FFFF00', word: '丫' },
{ color: '#8A2BE2', word: '你' },
],
showIntroductionPopup: true,
});
}
},
onReady() {
const query = wx.createSelectorQuery();
query
.select('#canvasWrapper')
.boundingClientRect((rect) => {
if (rect) {
const { width, height } = PAPER_SIZE['A4'];
const boxWidth = rect.width;
const boxHeight = boxWidth / (width / height);
this.boxHeight = boxHeight;
this.boxWidth = boxWidth;
this.initCanvas(boxWidth, boxHeight);
}
})
.exec();
},
initCanvas(boxWidth: number, boxHeight: number) {
wx.createSelectorQuery()
.select('#canvasContent')
.fields({
node: true,
size: true,
})
.exec((res) => {
if (res[0] && res[0].node) {
const canvas = res[0].node;
const ctx = canvas.getContext('2d');
if (ctx) {
this.canvas = canvas;
this.ctx = ctx;
// const rect = res[0];
this.textDrawService = new TextDrawService(canvas, ctx);
// textDrawService.draw();
this.setData({ boxWidth, boxHeight });
}
}
});
},
/** 变更cardList 并更新canvas */
drawCanvas(
updatedCardList: Array<{ color: string; word: string }>,
callback: () => void = () => {},
) {
this.setData({ cardList: updatedCardList }, callback);
this.textDrawService?.draw(updatedCardList);
},
tapCard(e: WechatMiniprogram.TouchEvent) {
const { url } = e.currentTarget.dataset;
wx.navigateTo({ url });
},
onConfirmInput(e: WechatMiniprogram.Input) {
const { value } = e.detail;
const characters = value.split('');
const shuffledColors = [...WATER_COLORS.extended24].sort(
() => Math.random() - 0.5,
);
const updatedCardList = characters.map((char, index) => ({
color: shuffledColors[index % shuffledColors.length].hex,
word: char,
}));
this.drawCanvas(updatedCardList);
},
deleteWordCard(e: WechatMiniprogram.CustomEvent) {
const { key, word } = e.detail;
const { cardList } = this.data;
const updatedCardList = cardList.filter((_, index) => index !== key);
this.drawCanvas(updatedCardList, () => {
wx.showToast({
title: `已删除 "${word}"`,
icon: 'none',
duration: 2000,
});
});
},
/** 下载打印 */
exportToPrint() {
console.log('this.canvas:', this.canvas);
if (this.canvas && this.data.cardList.length > 0) {
wx.canvasToTempFilePath({
canvas: this.canvas,
fileType: 'png',
quality: 1,
success: (res) => {
wx.getImageInfo({
src: res.tempFilePath,
success: (res) =>
console.log(
'getImageInfo image size :',
res.width,
res.height,
), // 应输出2480x3508
});
wx.saveImageToPhotosAlbum({
filePath: res.tempFilePath,
success: () => wx.showToast({ title: '保存成功' }),
});
},
});
return;
}
},
onColorTap(e: WechatMiniprogram.CustomEvent) {
const { key, word, color } = e.detail;
this.setData({
showColorPopup: true,
currentKey: key,
currentColor: color,
});
},
onCloseColorPopup() {
this.setData({
showColorPopup: false,
currentKey: 0,
currentColor: '',
});
},
onChangeColor(e: WechatMiniprogram.CustomEvent) {
const { color } = e.detail;
const { currentKey, cardList } = this.data;
cardList[currentKey].color = color;
this.setData({
showColorPopup: false,
cardList,
});
},
onCloseIntroductionPopup() {
this.setData({ showIntroductionPopup: false });
wx.setStorageSync('hasShowIntroduction', true);
},
});