124 lines
3.5 KiB
TypeScript
124 lines
3.5 KiB
TypeScript
import type { LetterTracingMode } from './generators/letter-tracing-generator';
|
||
import type { DebugPublishMeta } from '../../utils/debugPublish';
|
||
import { inferGradeFromAge } from '../../utils/debugPublish';
|
||
|
||
interface ModeDefinition {
|
||
id: LetterTracingMode;
|
||
icon: string;
|
||
title: string;
|
||
subtitle: string;
|
||
difficulty: 1 | 2 | 3 | 4;
|
||
tags: string[];
|
||
sortOrder: number;
|
||
}
|
||
|
||
const MODES = [
|
||
{
|
||
id: 'letter-tracing-single',
|
||
icon: 'start-a',
|
||
title: '默认字帖',
|
||
subtitle: '配图、例句与描红',
|
||
difficulty: 1,
|
||
tags: ['字母描红', '英语启蒙', '看图描红'],
|
||
sortOrder: 42,
|
||
},
|
||
{
|
||
id: 'letter-tracing-upper-lower',
|
||
icon: 'draw-o',
|
||
title: '基础描红',
|
||
subtitle: 'Uppercase / Lowercase 总览',
|
||
difficulty: 1,
|
||
tags: ['字母描红', '英语启蒙', '字母总览'],
|
||
sortOrder: 44,
|
||
},
|
||
{
|
||
id: 'letter-tracing-case-pairing',
|
||
icon: 'font-size',
|
||
title: '大小写对照',
|
||
subtitle: '半组字母左大写右小写',
|
||
difficulty: 1,
|
||
tags: ['字母描红', '英语启蒙', '大小写练习'],
|
||
sortOrder: 45,
|
||
},
|
||
{
|
||
id: 'letter-tracing-two-column',
|
||
icon: 'two-columns',
|
||
title: '两列描红',
|
||
subtitle: '左 A–M、右 N–Z 配对描红',
|
||
difficulty: 1,
|
||
tags: ['字母描红', '英语启蒙', '两列练习'],
|
||
sortOrder: 43,
|
||
},
|
||
{
|
||
id: 'letter-tracing-half',
|
||
icon: 'square-half',
|
||
title: '13字母半表',
|
||
subtitle: '每行一个字母,13 字母半表',
|
||
difficulty: 2,
|
||
tags: ['字母描红', '英语启蒙', '单字母逐行'],
|
||
sortOrder: 47,
|
||
},
|
||
{
|
||
id: 'letter-tracing-three',
|
||
icon: 'ABC-list',
|
||
title: '三字母精练',
|
||
subtitle: '每页聚焦 3 个字母深度书写',
|
||
difficulty: 2,
|
||
tags: ['字母描红', '英语启蒙', '三字母精练'],
|
||
sortOrder: 46,
|
||
},
|
||
{
|
||
id: 'letter-tracing-daily-checkin',
|
||
icon: 'draw-o',
|
||
title: '每日打卡',
|
||
subtitle: '四宫格每日字母打卡练习',
|
||
difficulty: 2,
|
||
tags: ['字母描红', '英语启蒙', '每日打卡'],
|
||
sortOrder: 48,
|
||
},
|
||
] as const satisfies ReadonlyArray<ModeDefinition>;
|
||
|
||
type Mode = (typeof MODES)[number];
|
||
|
||
const MODE_BY_ID = Object.fromEntries(
|
||
MODES.map((m) => [m.id, m]),
|
||
) as Record<string, Mode>;
|
||
|
||
/** 页面渲染用:模式选择器列表 */
|
||
export const LETTER_TRACING_MODE_OPTIONS = MODES;
|
||
|
||
/** 页面 pageInfoLookup 用 */
|
||
export function getModeInfo(id: string) {
|
||
const m = MODE_BY_ID[id];
|
||
return m ? { title: m.title, desc: m.subtitle } : undefined;
|
||
}
|
||
|
||
/** 判断 id 是否有效 */
|
||
export function isValidMode(id: string): boolean {
|
||
return id in MODE_BY_ID;
|
||
}
|
||
|
||
/** 发布用:从当前 mode 生成 DebugPublishMeta */
|
||
export function getPublishMetaByMode(id: string): DebugPublishMeta | null {
|
||
const m = MODE_BY_ID[id];
|
||
if (!m) return null;
|
||
return {
|
||
id: m.id,
|
||
title: m.title,
|
||
subtitle: m.subtitle,
|
||
category: 'english',
|
||
subcategory: 'letter-tracing',
|
||
path: `/englishPages/letterTracing/letterTracing?id=${m.id}`,
|
||
ageMin: 4,
|
||
ageMax: 7,
|
||
grade: inferGradeFromAge(4, 7),
|
||
difficulty: m.difficulty,
|
||
previewImg: '',
|
||
tags: [...m.tags],
|
||
isNew: false,
|
||
isHot: false,
|
||
sortOrder: m.sortOrder,
|
||
status: 'draft',
|
||
};
|
||
}
|