Initial commit: StudyOS platform
This commit is contained in:
74
client/src/hooks/useProgress.js
Normal file
74
client/src/hooks/useProgress.js
Normal file
@@ -0,0 +1,74 @@
|
||||
import { useState, useCallback, useEffect } from 'react';
|
||||
import { getProgress, updateProgress, resetProgressTopic } from '../lib/api';
|
||||
|
||||
function calcPercentage(row) {
|
||||
if (!row || row.exercises_done === 0) return 0;
|
||||
return Math.round((row.exercises_correct / row.exercises_done) * 100);
|
||||
}
|
||||
|
||||
export default function useProgress() {
|
||||
const [progress, setProgress] = useState([]);
|
||||
const [error, setError] = useState(null);
|
||||
|
||||
const refresh = useCallback(async () => {
|
||||
try {
|
||||
const rows = await getProgress();
|
||||
setProgress(
|
||||
rows.map((r) => ({
|
||||
...r,
|
||||
percentage: calcPercentage(r),
|
||||
}))
|
||||
);
|
||||
setError(null);
|
||||
} catch (err) {
|
||||
console.error('[useProgress] refresh error:', err.message);
|
||||
setError(err.message);
|
||||
}
|
||||
}, []);
|
||||
|
||||
useEffect(() => {
|
||||
refresh();
|
||||
}, [refresh]);
|
||||
|
||||
const updateExercise = useCallback(
|
||||
async (topic, correct) => {
|
||||
try {
|
||||
const row = await updateProgress(topic, correct);
|
||||
setProgress((prev) => {
|
||||
const idx = prev.findIndex((p) => p.topic === topic);
|
||||
const enriched = { ...row, percentage: calcPercentage(row) };
|
||||
if (idx >= 0) {
|
||||
const next = [...prev];
|
||||
next[idx] = enriched;
|
||||
return next;
|
||||
}
|
||||
return [...prev, enriched];
|
||||
});
|
||||
setError(null);
|
||||
} catch (err) {
|
||||
console.error('[useProgress] update error:', err.message);
|
||||
setError(err.message);
|
||||
}
|
||||
},
|
||||
[]
|
||||
);
|
||||
|
||||
const resetTopic = useCallback(async (topic) => {
|
||||
try {
|
||||
await resetProgressTopic(topic);
|
||||
setProgress((prev) => prev.filter((p) => p.topic !== topic));
|
||||
setError(null);
|
||||
} catch (err) {
|
||||
console.error('[useProgress] reset error:', err.message);
|
||||
setError(err.message);
|
||||
}
|
||||
}, []);
|
||||
|
||||
return {
|
||||
progress,
|
||||
error,
|
||||
refresh,
|
||||
updateExercise,
|
||||
resetTopic,
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user