66 lines
1.6 KiB
TypeScript
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
|
|
}
|
|
} |