Add beta application email fields

This commit is contained in:
2026-06-08 18:30:05 +08:00
parent 30536ad15f
commit 4e97e706fd
3 changed files with 18 additions and 6 deletions
+4
View File
@@ -2,6 +2,7 @@ import { serverRequest } from "./serverConnection";
export interface BetaApplicationInput { export interface BetaApplicationInput {
name: string; name: string;
email: string;
phone: string; phone: string;
wechat: string; wechat: string;
industry: string; industry: string;
@@ -16,6 +17,7 @@ export interface BetaApplicationInput {
wantFeature: string[]; wantFeature: string[];
selfStatement: string; selfStatement: string;
signature: string; signature: string;
applicationDate: string;
agreeRules: boolean; agreeRules: boolean;
} }
@@ -72,6 +74,7 @@ function normalizeApplication(raw: unknown): BetaApplicationItem {
userId: readNumberOrNull(item.userId), userId: readNumberOrNull(item.userId),
username: readNullableString(item.username), username: readNullableString(item.username),
name: readString(item.name), name: readString(item.name),
email: readString(item.email),
phone: readString(item.phone), phone: readString(item.phone),
wechat: readString(item.wechat), wechat: readString(item.wechat),
industry: readString(item.industry), industry: readString(item.industry),
@@ -86,6 +89,7 @@ function normalizeApplication(raw: unknown): BetaApplicationItem {
wantFeature: readStringArray(item.wantFeature), wantFeature: readStringArray(item.wantFeature),
selfStatement: readString(item.selfStatement), selfStatement: readString(item.selfStatement),
signature: readString(item.signature), signature: readString(item.signature),
applicationDate: readString(item.applicationDate),
agreeRules: item.agreeRules === true, agreeRules: item.agreeRules === true,
status: normalizeStatus(item.status), status: normalizeStatus(item.status),
inviteCode: readNullableString(item.inviteCode), inviteCode: readNullableString(item.inviteCode),
+12 -6
View File
@@ -10,6 +10,7 @@ interface BetaApplicationModalProps {
/* ── Form state ── */ /* ── Form state ── */
interface BetaFormData { interface BetaFormData {
name: string; name: string;
email: string;
phone: string; phone: string;
wechat: string; wechat: string;
industry: string; industry: string;
@@ -24,11 +25,13 @@ interface BetaFormData {
wantFeature: string[]; wantFeature: string[];
selfStatement: string; selfStatement: string;
signature: string; signature: string;
applicationDate: string;
agreeRules: boolean; agreeRules: boolean;
} }
const INITIAL_FORM: BetaFormData = { const INITIAL_FORM: BetaFormData = {
name: "", name: "",
email: "",
phone: "", phone: "",
wechat: "", wechat: "",
industry: "", industry: "",
@@ -43,6 +46,7 @@ const INITIAL_FORM: BetaFormData = {
wantFeature: [], wantFeature: [],
selfStatement: "", selfStatement: "",
signature: "", signature: "",
applicationDate: "",
agreeRules: false, agreeRules: false,
}; };
@@ -156,10 +160,12 @@ const BetaApplicationModal = ({ open, onClose }: BetaApplicationModalProps) => {
const validate = () => { const validate = () => {
if (!form.name.trim()) return "请填写姓名 / 常用昵称"; if (!form.name.trim()) return "请填写姓名 / 常用昵称";
if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(form.email.trim())) return "请填写用于接收内测码的有效邮箱";
if (!form.phone.trim()) return "请填写联系手机号码"; if (!form.phone.trim()) return "请填写联系手机号码";
if (!form.wechat.trim()) return "请填写微信账号"; if (!form.wechat.trim()) return "请填写微信账号";
if (!form.selfStatement.trim()) return "请填写申请自述"; if (!form.selfStatement.trim()) return "请填写申请自述";
if (!form.signature.trim()) return "请填写申请人确认签字"; if (!form.signature.trim()) return "请填写申请人确认签字";
if (!form.applicationDate.trim()) return "请填写申请日期";
if (!form.agreeRules) return "请先阅读并同意内测规则"; if (!form.agreeRules) return "请先阅读并同意内测规则";
return null; return null;
}; };
@@ -178,6 +184,7 @@ const BetaApplicationModal = ({ open, onClose }: BetaApplicationModalProps) => {
await betaApplicationClient.submit({ await betaApplicationClient.submit({
...form, ...form,
name: form.name.trim(), name: form.name.trim(),
email: form.email.trim(),
phone: form.phone.trim(), phone: form.phone.trim(),
wechat: form.wechat.trim(), wechat: form.wechat.trim(),
industry: form.industry.trim(), industry: form.industry.trim(),
@@ -190,9 +197,10 @@ const BetaApplicationModal = ({ open, onClose }: BetaApplicationModalProps) => {
feedbackWilling: form.feedbackWilling.trim(), feedbackWilling: form.feedbackWilling.trim(),
selfStatement: form.selfStatement.trim(), selfStatement: form.selfStatement.trim(),
signature: form.signature.trim(), signature: form.signature.trim(),
applicationDate: form.applicationDate.trim(),
}); });
setForm(INITIAL_FORM); setForm(INITIAL_FORM);
setMessage({ tone: "success", text: "申请已提交,请留意站内通知。" }); setMessage({ tone: "success", text: "申请已提交,请留意预留邮箱中的审核结果。" });
} catch (error) { } catch (error) {
setMessage({ tone: "error", text: error instanceof Error ? error.message : "提交内测申请失败" }); setMessage({ tone: "error", text: error instanceof Error ? error.message : "提交内测申请失败" });
} finally { } finally {
@@ -229,6 +237,7 @@ const BetaApplicationModal = ({ open, onClose }: BetaApplicationModalProps) => {
<h3 className="beta-doc-section__title"></h3> <h3 className="beta-doc-section__title"></h3>
<div className="beta-doc-grid"> <div className="beta-doc-grid">
<TextField label="姓名 / 常用昵称" value={form.name} onChange={(v) => update("name", v)} /> <TextField label="姓名 / 常用昵称" value={form.name} onChange={(v) => update("name", v)} />
<TextField label="接收内测码邮箱" value={form.email} onChange={(v) => update("email", v)} placeholder="审核通过后内测码将发送到此邮箱" />
<TextField label="联系手机号码" value={form.phone} onChange={(v) => update("phone", v)} /> <TextField label="联系手机号码" value={form.phone} onChange={(v) => update("phone", v)} />
<TextField label="微信账号" value={form.wechat} onChange={(v) => update("wechat", v)} /> <TextField label="微信账号" value={form.wechat} onChange={(v) => update("wechat", v)} />
<TextField label="所在行业 / 职业" value={form.industry} onChange={(v) => update("industry", v)} /> <TextField label="所在行业 / 职业" value={form.industry} onChange={(v) => update("industry", v)} />
@@ -297,7 +306,7 @@ const BetaApplicationModal = ({ open, onClose }: BetaApplicationModalProps) => {
<li> <strong>500 50,000 </strong>使</li> <li> <strong>500 50,000 </strong>使</li>
<li>线</li> <li>线</li>
<li></li> <li></li>
<li> <strong>48 </strong> </li> <li> <strong>48 </strong> </li>
<li>线</li> <li>线</li>
</ol> </ol>
@@ -312,10 +321,7 @@ const BetaApplicationModal = ({ open, onClose }: BetaApplicationModalProps) => {
<div className="beta-doc-grid beta-doc-grid--two"> <div className="beta-doc-grid beta-doc-grid--two">
<TextField label="申请人确认签字" value={form.signature} onChange={(v) => update("signature", v)} placeholder="请签署姓名" /> <TextField label="申请人确认签字" value={form.signature} onChange={(v) => update("signature", v)} placeholder="请签署姓名" />
<div className="beta-text-field"> <TextField label="申请填写日期" value={form.applicationDate} onChange={(v) => update("applicationDate", v)} placeholder="例如:2026年6月8日" />
<span className="beta-text-field__label"></span>
<input type="text" className="beta-text-field__input" value="2026年 月 日" readOnly />
</div>
</div> </div>
</section> </section>
@@ -214,6 +214,7 @@ export default function BetaApplicationsPage({ session, onOpenLogin }: BetaAppli
<h3></h3> <h3></h3>
<div className="beta-admin-field-grid"> <div className="beta-admin-field-grid">
<DetailField label="姓名 / 常用昵称" value={valueOrEmpty(selectedApplication.name)} /> <DetailField label="姓名 / 常用昵称" value={valueOrEmpty(selectedApplication.name)} />
<DetailField label="接收内测码邮箱" value={valueOrEmpty(selectedApplication.email)} />
<DetailField label="联系手机号码" value={valueOrEmpty(selectedApplication.phone)} /> <DetailField label="联系手机号码" value={valueOrEmpty(selectedApplication.phone)} />
<DetailField label="微信账号" value={valueOrEmpty(selectedApplication.wechat)} /> <DetailField label="微信账号" value={valueOrEmpty(selectedApplication.wechat)} />
<DetailField label="所在行业 / 职业" value={valueOrEmpty(selectedApplication.industry)} /> <DetailField label="所在行业 / 职业" value={valueOrEmpty(selectedApplication.industry)} />
@@ -248,6 +249,7 @@ export default function BetaApplicationsPage({ session, onOpenLogin }: BetaAppli
<p className="beta-admin-statement">{selectedApplication.selfStatement || "未填写"}</p> <p className="beta-admin-statement">{selectedApplication.selfStatement || "未填写"}</p>
<div className="beta-admin-field-grid"> <div className="beta-admin-field-grid">
<DetailField label="申请人确认签字" value={valueOrEmpty(selectedApplication.signature)} /> <DetailField label="申请人确认签字" value={valueOrEmpty(selectedApplication.signature)} />
<DetailField label="申请填写日期" value={valueOrEmpty(selectedApplication.applicationDate)} />
<DetailField label="同意规则" value={selectedApplication.agreeRules ? "已同意" : "未同意"} /> <DetailField label="同意规则" value={selectedApplication.agreeRules ? "已同意" : "未同意"} />
<DetailField label="IP" value={valueOrEmpty(selectedApplication.ipAddress)} /> <DetailField label="IP" value={valueOrEmpty(selectedApplication.ipAddress)} />
<DetailField label="客户端" value={valueOrEmpty(selectedApplication.userAgent)} wide /> <DetailField label="客户端" value={valueOrEmpty(selectedApplication.userAgent)} wide />