main
lion 1 month ago
parent f3cf04ad19
commit 4bf9a770c2

@ -951,6 +951,52 @@ async function saveDraftToServer() {
return true
}
/** Laravel ValidationExceptionerrors 为字段 → 字符串数组 */
function firstMessagesFromLaravelErrors(errors: unknown): string[] {
if (errors == null || typeof errors !== 'object' || Array.isArray(errors)) return []
const out: string[] = []
for (const v of Object.values(errors as Record<string, unknown>)) {
if (Array.isArray(v)) {
for (const s of v) {
if (typeof s === 'string' && s.trim()) out.push(s.trim())
}
} else if (typeof v === 'string' && v.trim()) {
out.push(v.trim())
}
}
return out
}
function isGenericLaravelInvalidMessage(message: string): boolean {
const m = message.trim()
return (
m === 'The given data was invalid.' ||
m === 'The given data was invalid' ||
m === '给定的数据无效。' ||
m === '给定的数据无效'
)
}
/** 按接口返回组装选手可见的提交失败说明(优先业务 errors / message再按状态码兜底 */
function submitFailureUserMessage(status: number, body: Record<string, unknown>): string {
const fromFields = firstMessagesFromLaravelErrors(body.errors)
if (fromFields.length > 0) return fromFields[0]
const rawMsg = body.message
if (typeof rawMsg === 'string' && rawMsg.trim()) {
const msg = rawMsg.trim()
if (!isGenericLaravelInvalidMessage(msg)) return msg
}
if (status === 404) return '赛事不存在或未发布,请返回重新进入报名页。'
if (status === 403) return '当前账号无权限提交,请确认登录状态或联系管理员。'
if (status === 409) return '报名状态已变更或发生冲突,请刷新页面后重试。'
if (status === 429) return '请求过于频繁,请稍后再试。'
if (status >= 500) return '服务暂时不可用,请稍后重试。'
if (status === 422) return '提交失败,请填写完整信息。'
return '报名未能提交,请检查网络或稍后重试。'
}
async function submitApplicationToServer() {
const r = await fetch(`${apiBase()}/api/applications/current/submit${competitionQuery()}`, {
method: 'POST',
@ -962,8 +1008,13 @@ async function submitApplicationToServer() {
return false
}
if (!r.ok) {
void r.json().catch(() => ({}))
showNotice('报名未能提交,请检查网络或稍后重试。', '提交失败', 'warning')
let body: Record<string, unknown> = {}
try {
body = (await r.json()) as Record<string, unknown>
} catch {
/* 非 JSON */
}
showNotice(submitFailureUserMessage(r.status, body), '提交失败', 'warning')
return false
}
const d = (await r.json()) as Parameters<typeof applyServerPayload>[0]

Loading…
Cancel
Save