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"); const LOADING_MESSAGES = [ "AI 正在推演八字,请稍候...", "结合天干地支,为您筛选契合佳名...", "耐心等待,吉名正在汇聚灵感..." ]; 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, isLoading: false, loadingMessage: "" }, 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) => { const isValid = response ? response.isValid !== false : true; const message = response && response.message ? response.message : messages.INVALID_SURNAME; if (!isValid) { showToast(message); this.setData({ surname: "", surnameError: message }); 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.hideLoadingOverlay(); 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 }; this.showLoadingOverlay(); return 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((error) => { const message = error && error.data && error.data.message; if (message === "CONTENT_RISK") { showToast(messages.CONTENT_RISK); } else if (message === "INVALID_SURNAME") { showToast(messages.INVALID_SURNAME); } else { showToast(messages.GENERATION_FAILED); } }) .finally(() => { this.hideLoadingOverlay(); this.setData({ isSubmitting: false }); }); }, showLoadingOverlay() { const hint = LOADING_MESSAGES[Math.floor(Math.random() * LOADING_MESSAGES.length)]; this.setData({ isLoading: true, loadingMessage: hint }); }, hideLoadingOverlay() { if (!this.data.isLoading) { return; } this.setData({ isLoading: false, loadingMessage: "" }); } });