Initial commit: StudyOS platform

This commit is contained in:
renato97
2026-06-08 16:53:18 -03:00
commit b7d1e7319f
39 changed files with 9815 additions and 0 deletions

View 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,
};
}