Files
doodle-mini/miniprogram/pinyinPages/pinyinDictation/pinyinDictation.config.ts
T
2026-05-19 18:24:43 +08:00

84 lines
2.4 KiB
TypeScript

import type { DebugPublishMeta } from '../../utils/debugPublish';
import { inferGradeFromAge } from '../../utils/debugPublish';
export type PinyinDictationMode = 'pinyin-tracing' | 'pinyin-dictation';
interface PinyinDictationWorksheetDefinition {
id: PinyinDictationMode;
icon: string;
title: string;
subtitle: string;
ageMin: number;
ageMax: number;
difficulty: 1 | 2 | 3 | 4;
tags: string[];
sortOrder: number;
}
export const PINYIN_DICTATION_WORKSHEET_DEFINITIONS = [
{
id: 'pinyin-tracing',
icon: 'draw-o',
title: '描红练习',
subtitle: '跟着描红学拼音字母',
ageMin: 5,
ageMax: 7,
difficulty: 1,
tags: ['拼音', '描红', '声母', '韵母'],
sortOrder: 50,
},
{
id: 'pinyin-dictation',
icon: 'start-a',
title: '默写练习',
subtitle: '空白格子默写拼音字母',
ageMin: 6,
ageMax: 8,
difficulty: 2,
tags: ['拼音', '默写', '声母', '韵母'],
sortOrder: 51,
},
] as const satisfies ReadonlyArray<PinyinDictationWorksheetDefinition>;
type PinyinDictationWorksheetRow =
(typeof PINYIN_DICTATION_WORKSHEET_DEFINITIONS)[number];
const PINYIN_DICTATION_WORKSHEET_BY_ID = Object.fromEntries(
PINYIN_DICTATION_WORKSHEET_DEFINITIONS.map((m) => [m.id, m]),
) as Record<string, PinyinDictationWorksheetRow>;
export const PINYIN_DICTATION_MODE_OPTIONS =
PINYIN_DICTATION_WORKSHEET_DEFINITIONS;
export function getModeInfo(id: string) {
const m = PINYIN_DICTATION_WORKSHEET_BY_ID[id];
return m ? { title: m.title, desc: m.subtitle } : undefined;
}
export function isValidMode(id: string): boolean {
return id in PINYIN_DICTATION_WORKSHEET_BY_ID;
}
export function getPublishMetaByMode(id: string): DebugPublishMeta | null {
const m = PINYIN_DICTATION_WORKSHEET_BY_ID[id];
if (!m) return null;
return {
id: m.id,
title: m.title,
subtitle: m.subtitle,
category: 'pinyin',
subcategory: 'pinyin-dictation',
path: `/pinyinPages/pinyinDictation/pinyinDictation?id=${m.id}`,
ageMin: m.ageMin,
ageMax: m.ageMax,
grade: inferGradeFromAge(m.ageMin, m.ageMax),
difficulty: m.difficulty,
previewImg: '',
tags: [...m.tags],
isNew: false,
isHot: false,
sortOrder: m.sortOrder,
status: 'draft',
};
}