feat(ui): refine profile workflows and visual system
This commit is contained in:
@@ -3,6 +3,10 @@ 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: '数学',
|
||||
@@ -10,11 +14,10 @@ const initialDefaults: StudentProfileDefaults = {
|
||||
}
|
||||
|
||||
type PickerEvent = { detail: { value: string | number } }
|
||||
type InputEvent = { detail: { value: string } }
|
||||
|
||||
function normalizeDuration(value: number): number {
|
||||
if (Number.isNaN(value)) return 60
|
||||
return Math.min(360, Math.max(15, Math.round(value / 15) * 15))
|
||||
return Math.min(maximumDuration, Math.max(minimumDuration, Math.round(value / durationStep) * durationStep))
|
||||
}
|
||||
|
||||
Page({
|
||||
@@ -22,6 +25,9 @@ Page({
|
||||
defaults: initialDefaults,
|
||||
grades,
|
||||
subjects,
|
||||
durationPresets,
|
||||
minimumDuration,
|
||||
maximumDuration,
|
||||
loading: false,
|
||||
saving: false,
|
||||
errorMessage: ''
|
||||
@@ -34,7 +40,13 @@ Page({
|
||||
async loadDefaults(showSuccess = false) {
|
||||
this.setData({ loading: true, errorMessage: '' })
|
||||
try {
|
||||
this.setData({ defaults: await getProfileDefaults() })
|
||||
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) })
|
||||
@@ -55,12 +67,25 @@ Page({
|
||||
this.setData({ 'defaults.subject': subjects[Number(event.detail.value)] })
|
||||
},
|
||||
|
||||
onDurationInput(event: InputEvent) {
|
||||
this.setData({ 'defaults.lessonDurationMinutes': normalizeDuration(Number(event.detail.value)) })
|
||||
decreaseDuration() {
|
||||
this.setData({
|
||||
'defaults.lessonDurationMinutes': normalizeDuration(
|
||||
this.data.defaults.lessonDurationMinutes - durationStep
|
||||
)
|
||||
})
|
||||
},
|
||||
|
||||
onDurationChange(event: PickerEvent) {
|
||||
this.setData({ 'defaults.lessonDurationMinutes': normalizeDuration(Number(event.detail.value)) })
|
||||
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() {
|
||||
|
||||
Reference in New Issue
Block a user