Files
2025-11-06 19:23:37 +08:00

224 lines
6.3 KiB
JavaScript

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: ""
});
}
});