import { copyApiRequestId, getApiErrorMessage, getApiRequestId, getProfileDefaults, updateProfileDefaults } from '../../utils/api' import type { StudentProfileDefaults } from '../../utils/types' const grades = ['初一', '初二', '初三'] const subjects = ['美术', '书法', '音乐', '舞蹈', '语文', '数学', '英语'] const durationPresets = [45, 60, 90, 120] const durationStep = 15 const minimumDuration = 15 const maximumDuration = 360 const initialDefaults: StudentProfileDefaults = { grade: '初一', subject: '数学', lessonDurationMinutes: 60 } type PickerEvent = { detail: { value: string | number } } function normalizeDuration(value: number): number { if (Number.isNaN(value)) return 60 return Math.min(maximumDuration, Math.max(minimumDuration, Math.round(value / durationStep) * durationStep)) } Page({ data: { defaults: initialDefaults, grades, subjects, durationPresets, minimumDuration, maximumDuration, loading: false, saving: false, errorMessage: '', errorRequestId: '' }, onShow() { void this.loadDefaults() }, async loadDefaults(showSuccess = false) { this.setData({ loading: true, errorMessage: '', errorRequestId: '' }) try { const defaults = await getProfileDefaults() this.setData({ defaults: { ...defaults, lessonDurationMinutes: normalizeDuration(defaults.lessonDurationMinutes) } }) if (showSuccess) wx.showToast({ title: '预设已刷新', icon: 'success' }) } catch (error) { this.setData({ errorMessage: getApiErrorMessage(error), errorRequestId: getApiRequestId(error) }) } finally { this.setData({ loading: false }) } }, onReload() { void this.loadDefaults(true) }, copyRequestId() { copyApiRequestId(this.data.errorRequestId) }, onGradeChange(event: PickerEvent) { this.setData({ 'defaults.grade': grades[Number(event.detail.value)] }) }, onSubjectChange(event: PickerEvent) { this.setData({ 'defaults.subject': subjects[Number(event.detail.value)] }) }, decreaseDuration() { this.setData({ 'defaults.lessonDurationMinutes': normalizeDuration( this.data.defaults.lessonDurationMinutes - durationStep ) }) }, increaseDuration() { this.setData({ 'defaults.lessonDurationMinutes': normalizeDuration( this.data.defaults.lessonDurationMinutes + durationStep ) }) }, selectDurationPreset(event: WechatMiniprogram.TouchEvent) { const { value } = event.currentTarget.dataset as { value: number | string } this.setData({ 'defaults.lessonDurationMinutes': normalizeDuration(Number(value)) }) }, async save() { const defaults = { ...this.data.defaults, lessonDurationMinutes: normalizeDuration(this.data.defaults.lessonDurationMinutes) } this.setData({ saving: true }) try { const saved = await updateProfileDefaults(defaults) this.setData({ defaults: saved, errorMessage: '' }) wx.showToast({ title: '预设项已保存', icon: 'success' }) setTimeout(() => wx.navigateBack(), 450) } catch (error) { wx.showToast({ title: getApiErrorMessage(error), icon: 'none' }) } finally { this.setData({ saving: false }) } } })