109 lines
3.0 KiB
TypeScript
109 lines
3.0 KiB
TypeScript
import { getApiErrorMessage, 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: ''
|
|
},
|
|
|
|
onShow() {
|
|
void this.loadDefaults()
|
|
},
|
|
|
|
async loadDefaults(showSuccess = false) {
|
|
this.setData({ loading: true, errorMessage: '' })
|
|
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) })
|
|
} finally {
|
|
this.setData({ loading: false })
|
|
}
|
|
},
|
|
|
|
onReload() {
|
|
void this.loadDefaults(true)
|
|
},
|
|
|
|
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 })
|
|
}
|
|
}
|
|
})
|