const namingStore = require("../../store/namingStore"); const messages = require("../../constants/messages"); const { validateSurname, generateName } = require("../../services/namingService"); const { showRewardedVideoAd } = require("../../utils/adService"); const config = require("../../config/index"); function showToast(title) { if (typeof tt === "undefined" || !tt.showToast) { console.warn("Toast:", title); return; } tt.showToast({ title, icon: "none", duration: 2000 }); } Page({ data: { surname: "", surnameError: "", gender: "male", birthDate: "", birthTime: "", nameLength: "double", isSubmitting: false, quotaRemaining: null }, onLoad() { const { form, quota } = namingStore.getState(); this.setData({ surname: form.surname, gender: form.gender, birthDate: form.birthDate, birthTime: form.birthTime, nameLength: form.nameLength, quotaRemaining: config.maxDailyQuota - quota.count }); }, handleSurnameInput(event) { const value = (event.detail.value || "").trim(); this.setData({ surname: value, surnameError: "" }); namingStore.setForm({ surname: value }); }, handleSurnameBlur() { const surname = this.data.surname; if (!surname) { return; } validateSurname(surname) .then((response) => { if (!response || response.isValid === false) { showToast(messages.INVALID_SURNAME); this.setData({ surname: "", surnameError: messages.INVALID_SURNAME }); namingStore.setForm({ surname: "" }); } else { this.setData({ surnameError: "" }); } }) .catch(() => { showToast(messages.INVALID_SURNAME); this.setData({ surname: "", surnameError: messages.INVALID_SURNAME }); namingStore.setForm({ surname: "" }); }); }, handleGenderChange(event) { const value = event.detail.value; this.setData({ gender: value }); namingStore.setForm({ gender: value }); }, handleBirthDateChange(event) { const value = event.detail.value; this.setData({ birthDate: value }); namingStore.setForm({ birthDate: value }); }, handleBirthTimeChange(event) { const value = event.detail.value; this.setData({ birthTime: value }); namingStore.setForm({ birthTime: value }); }, handleNameLengthChange(event) { const value = event.detail.value; this.setData({ nameLength: value }); namingStore.setForm({ nameLength: value }); }, handleGoFavorites() { if (typeof tt !== "undefined" && tt.navigateTo) { tt.navigateTo({ url: "/pages/favorites/index" }); } }, validateForm() { const { surname, gender, birthDate, nameLength } = this.data; if (!surname || !gender || !birthDate || !nameLength) { showToast(messages.FORM_INCOMPLETE); return false; } if (!namingStore.canGenerateToday()) { showToast(messages.QUOTA_EXCEEDED); return false; } return true; }, updateQuotaState() { const { quota } = namingStore.getState(); this.setData({ quotaRemaining: Math.max(config.maxDailyQuota - quota.count, 0) }); }, handleGenerate() { if (this.data.isSubmitting) { return; } if (!this.validateForm()) { return; } this.setData({ isSubmitting: true }); showRewardedVideoAd() .then(() => this.generateName()) .catch((error) => { if (error && error.code === "ad_not_completed") { showToast(messages.WATCH_AD_TO_CONTINUE); } else { showToast("广告加载失败,请稍后重试"); } this.setData({ isSubmitting: false }); }); }, generateName() { const payload = { surname: this.data.surname, gender: this.data.gender, birthDate: this.data.birthDate, birthTime: this.data.birthTime || "", nameLength: this.data.nameLength }; generateName(payload) .then((response) => { const results = response && Array.isArray(response.results) ? response.results : []; const analysis = response && response.analysis ? response.analysis : null; if (!results.length) { showToast(messages.GENERATION_FAILED); return; } const normalizedResults = results.reduce((accumulator, item) => { const name = item.name || item.Name || ""; if (!name) { return accumulator; } accumulator.push({ name, meaning: item.meaning || item.Meaning || "", elementReason: item.elementReason || item.ElementReason || "" }); return accumulator; }, []); if (!normalizedResults.length) { showToast(messages.GENERATION_FAILED); return; } namingStore.setResults({ results: normalizedResults, analysis }); namingStore.incrementQuota(); this.updateQuotaState(); if (typeof tt !== "undefined" && tt.navigateTo) { tt.navigateTo({ url: "/pages/result/index" }); } }) .catch(() => { showToast(messages.GENERATION_FAILED); }) .finally(() => { this.setData({ isSubmitting: false }); }); } });