dramaling-vocab-learning/frontend/hooks/learn/useProgressTracker.ts

66 lines
1.6 KiB
TypeScript

import { useState } from 'react'
// 分數狀態接口
interface Score {
correct: number
total: number
}
// 進度追蹤狀態接口
interface ProgressTrackerState {
score: Score
showTaskListModal: boolean
}
// Hook返回接口
interface UseProgressTrackerReturn extends ProgressTrackerState {
updateScore: (isCorrect: boolean) => void
resetScore: () => void
setShowTaskListModal: (show: boolean) => void
getAccuracyPercentage: () => number
getProgressPercentage: (completed: number, total: number) => number
}
export const useProgressTracker = (): UseProgressTrackerReturn => {
// 進度追蹤狀態
const [score, setScore] = useState<Score>({ correct: 0, total: 0 })
const [showTaskListModal, setShowTaskListModal] = useState(false)
// 更新分數
const updateScore = (isCorrect: boolean): void => {
setScore(prev => ({
correct: isCorrect ? prev.correct + 1 : prev.correct,
total: prev.total + 1
}))
}
// 重置分數
const resetScore = (): void => {
setScore({ correct: 0, total: 0 })
}
// 獲取準確率百分比
const getAccuracyPercentage = (): number => {
if (score.total === 0) return 0
return Math.round((score.correct / score.total) * 100)
}
// 獲取進度百分比
const getProgressPercentage = (completed: number, total: number): number => {
if (total === 0) return 0
return Math.round((completed / total) * 100)
}
return {
// 狀態
score,
showTaskListModal,
// 操作函數
updateScore,
resetScore,
setShowTaskListModal,
getAccuracyPercentage,
getProgressPercentage
}
}