progress.ts - 儿童模式进度管理
概述
管理儿童学习模式的用户进度,使用 localStorage 本地存储学习数据。
数据模型
LevelProgress
interface LevelProgress {
completed: boolean; // 是否完成
stars: number; // 获得星星数 (0-3)
completedAt?: string; // 完成时间 ISO 字符串
}
KidsProgress
interface KidsProgress {
levels: Record<string, LevelProgress>; // 各关卡进度
currentLevel?: string; // 当前关卡 slug
totalStars: number; // 总星星数
}
存储键
| 键 | 用途 |
|---|---|
kids-progress | 存储关卡进度和星星数 |
kids-component-state | 存储关卡内组件状态 |
kids-section-completion | 存储章节完成状态 |
核心函数
进度管理
getProgress
export function getProgress(): KidsProgress
从 localStorage 获取用户进度。
saveProgress
export function saveProgress(progress: KidsProgress): void
保存用户进度到 localStorage。
completeLevel
export function completeLevel(slug: string, stars: number): KidsProgress
标记关卡为完成状态。
- 只在新星星数更高时更新
- 自动设置下一关为当前关卡
- 更新总星星数
参数:
slug: 关卡标识符stars: 获得的星星数 (0-3)
查询函数
isLevelUnlocked
export function isLevelUnlocked(slug: string): boolean
检查关卡是否已解锁。
- 第一关始终解锁
- 其他关卡需要前一关完成
getLevelProgress
export function getLevelProgress(slug: string): LevelProgress | undefined
获取指定关卡的进度信息。
getCompletedLevelsCount
export function getCompletedLevelsCount(): number
获取已完成关卡数量。
getTotalStars
export function getTotalStars(): number
获取获得的总星星数。
重置功能
resetProgress
export function resetProgress(): void
清除所有进度数据(保留组件状态)。
clearAllProgress
export function clearAllProgress(): void
清除所有进度数据,包括组件状态和章节完成状态。
组件状态管理
用于保存关卡内交互组件的状态。
getComponentState
export function getComponentState<T>(levelSlug: string, componentId: string): T | null
获取组件状态。
saveComponentState
export function saveComponentState<T>(levelSlug: string, componentId: string, data: T): void
保存组件状态。
clearComponentState
export function clearComponentState(levelSlug: string): void
清除指定关卡的所有组件状态。
章节完成跟踪
isSectionCompleted
export function isSectionCompleted(levelSlug: string, sectionIndex: number): boolean
检查章节的某个部分是否已完成。
markSectionCompleted
export function markSectionCompleted(levelSlug: string, sectionIndex: number): void
标记章节部分为已完成。
clearSectionCompletion
export function clearSectionCompletion(levelSlug: string): void
清除指定关卡的章节完成状态。
hasCompletedInteraction
export function hasCompletedInteraction(levelSlug: string, componentIdPrefix?: string): boolean
检查关卡中是否有任何交互组件已完成。
使用示例
"use client";
import {
completeLevel,
isLevelUnlocked,
getTotalStars,
saveComponentState,
getComponentState
} from '@/lib/kids/progress';
// 完成关卡并获得星星
const progress = completeLevel('1-1-meet-promi', 3);
// 检查关卡是否解锁
const canPlay = isLevelUnlocked('1-2-first-words');
// 获取总星星
const stars = getTotalStars();
// 保存组件状态
saveComponentState('1-1-meet-promi', 'quiz-1', { answer: 'A', completed: true });
// 读取组件状态
const state = getComponentState('1-1-meet-promi', 'quiz-1');
安全说明
- 所有函数都检查
typeof window以确保在浏览器环境执行 - 使用 try-catch 处理 localStorage 异常
- SSR 安全,在服务端返回默认值