feat(assistant): Ф2 онбординг-тур + проактив «продолжи урок»
Ф2: коачмарк-тур новичка по разделам (сайдбар + сам помощник), офер на дашборде пока не пройден/не закрыт, повтор из приветствия и Assistant.tour(). activeLesson: контекст-эндпоинт отдаёт начатый незавершённый урок (как «продолжить чтение»), добавлено проактивное правило «Продолжи …» → /course. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -85,6 +85,22 @@ function pendingHomework(uid) {
|
||||
} catch (e) { return { overdue: null, dueSoon: null }; }
|
||||
}
|
||||
|
||||
function activeLesson(uid, role) {
|
||||
// Начатый, но не завершённый урок (как «продолжить чтение» на дашборде).
|
||||
try {
|
||||
const pub = role === 'student' ? 'AND l.is_published = 1 AND c.is_published = 1' : '';
|
||||
const row = db.prepare(`
|
||||
SELECT l.id AS lessonId, l.title AS lessonTitle, l.course_id AS courseId, c.title AS courseTitle
|
||||
FROM lesson_progress lp
|
||||
JOIN lessons l ON lp.lesson_id = l.id
|
||||
JOIN courses c ON l.course_id = c.id
|
||||
WHERE lp.user_id = ? AND lp.completed = 0 ${pub}
|
||||
ORDER BY lp.updated_at DESC LIMIT 1
|
||||
`).get(uid);
|
||||
return row || null;
|
||||
} catch (e) { return null; }
|
||||
}
|
||||
|
||||
/* ── GET /api/assistant/context ───────────────────────────────────────── */
|
||||
function getContext(req, res) {
|
||||
const uid = req.user.id;
|
||||
@@ -97,10 +113,11 @@ function getContext(req, res) {
|
||||
} catch (e) { /* table may be missing on a legacy instance */ }
|
||||
|
||||
res.json({
|
||||
enabled: u ? u.assistant_enabled !== 0 : true,
|
||||
enabled: u ? u.assistant_enabled !== 0 : true,
|
||||
seen,
|
||||
dueCards: dueCardsCount(uid),
|
||||
homework: pendingHomework(uid),
|
||||
dueCards: dueCardsCount(uid),
|
||||
homework: pendingHomework(uid),
|
||||
activeLesson: activeLesson(uid, req.user.role),
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user