feat: implement knowledge testing system with leaderboard, quiz generation, and PocketBase integration

This commit is contained in:
RaymondVerhoef
2026-05-14 16:53:10 +02:00
parent 42d7209773
commit 74ba5d3dc0
15 changed files with 590 additions and 512 deletions

View File

@@ -9,7 +9,7 @@ import Input from '../components/ui/Input';
import LearningContentViewer from '../components/ui/LearningContentViewer';
import { useApp } from '../store/AppContext';
import { getAssignedTopic, generateLearningContent, getCachedContent, generateCustomTopic } from '../lib/learningService';
import { storage } from '../lib/storage';
import * as db from '../lib/db';
const Leren = () => {
const { state } = useApp();
@@ -39,12 +39,17 @@ const Leren = () => {
useEffect(() => {
if (state.currentUser) {
const assigned = getAssignedTopic(state.currentUser.id, state.weekNumber);
setAssignedTopic(assigned);
setAllTopics(storage.get('kb:topics', []));
const done = storage.get(`user:${state.currentUser.id}:week:${state.weekNumber}:learn_done`, false);
if (done) setWeeklyDone(true);
const load = async () => {
const [assigned, topics, done] = await Promise.all([
getAssignedTopic(state.currentUser.id, state.weekNumber),
db.getTopics(),
db.getLearnDone(state.currentUser.id, state.weekNumber),
]);
setAssignedTopic(assigned);
setAllTopics(topics);
if (done) setWeeklyDone(true);
};
load();
}
}, [state.currentUser, state.weekNumber]);
@@ -97,11 +102,11 @@ const Leren = () => {
}
};
const doComplete = () => {
const doComplete = async () => {
setSessionDone(true);
if (!weeklyDone) {
setWeeklyDone(true);
storage.set(`user:${state.currentUser.id}:week:${state.weekNumber}:learn_done`, true);
await db.setLearnDone(state.currentUser.id, state.weekNumber);
}
};
@@ -114,14 +119,12 @@ const Leren = () => {
doComplete();
};
const handleSubmitFeedback = () => {
const handleSubmitFeedback = async () => {
if (feedbackText.trim()) {
storage.set(`user:${state.currentUser.id}:feedback:${activeTopic.id}`, {
text: feedbackText.trim(),
topicId: activeTopic.id,
week: state.weekNumber,
timestamp: Date.now(),
});
await db.setSetting(
`feedback:${state.currentUser.id}:${activeTopic.id}:${state.weekNumber}`,
feedbackText.trim()
);
}
setShowFeedbackModal(false);
doComplete();