取名小程序开发
This commit is contained in:
182
NamingAssistant/pages/home/index.js
Normal file
182
NamingAssistant/pages/home/index.js
Normal file
@@ -0,0 +1,182 @@
|
||||
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 : [];
|
||||
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 || ""
|
||||
});
|
||||
return accumulator;
|
||||
}, []);
|
||||
if (!normalizedResults.length) {
|
||||
showToast(messages.GENERATION_FAILED);
|
||||
return;
|
||||
}
|
||||
namingStore.setResults(normalizedResults);
|
||||
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 });
|
||||
});
|
||||
}
|
||||
});
|
||||
Reference in New Issue
Block a user