Spaces:
Sleeping
Sleeping
| """ | |
| firebase_quiz_hooks.py | |
| ---------------------- | |
| 答題記錄已移至 dt_callbacks.py 直接處理。 | |
| 這裡只保留解法展開和 AI 提示的記錄。 | |
| """ | |
| from __future__ import annotations | |
| from dash import callback, Input, Output, State, ALL, no_update, ctx, dcc | |
| def create_dummy_stores(): | |
| return [dcc.Store(id="_fq-log", data={})] | |
| def record_solution(n_clicks_list, ids, student_id, pathname): | |
| if not student_id: | |
| return no_update | |
| trigger = ctx.triggered_id | |
| if not trigger or not isinstance(trigger, dict): | |
| return no_update | |
| key = trigger.get("key", "") | |
| unit = (pathname or "").strip("/").replace("/", "_") or "unknown" | |
| for i, pid in enumerate(ids): | |
| if isinstance(pid, dict) and pid.get("key") == key: | |
| if (n_clicks_list[i] or 0) == 1: | |
| try: | |
| from firebase_progress import log_solution_viewed | |
| log_solution_viewed(student_id, unit, key) | |
| except Exception as e: | |
| print(f"[Firebase] log_solution_viewed 失敗:{e}") | |
| break | |
| return no_update | |
| def record_hint(fill_clicks, choice_clicks, fill_ids, choice_ids, student_id, pathname): | |
| if not student_id: | |
| return no_update | |
| trigger = ctx.triggered_id | |
| if not trigger or not isinstance(trigger, dict): | |
| return no_update | |
| qid = trigger.get("qid", "") | |
| qtype = trigger.get("type", "") | |
| if not qid or "hint" not in qtype: | |
| return no_update | |
| unit = (pathname or "").strip("/").replace("/", "_") or "unknown" | |
| ids = fill_ids if qtype == "quiz-hint" else choice_ids | |
| clicks = fill_clicks if qtype == "quiz-hint" else choice_clicks | |
| for i, pid in enumerate(ids): | |
| if isinstance(pid, dict) and pid.get("qid") == qid: | |
| if (clicks[i] or 0) == 1: | |
| try: | |
| from firebase_progress import log_hint_used | |
| log_hint_used(student_id, unit, qid) | |
| except Exception as e: | |
| print(f"[Firebase] log_hint_used 失敗:{e}") | |
| break | |
| return no_update | |