feat: manual cert gating, chat layout overhaul, and video player UX fixes
- Certificate: Hardcode approval gate — completely removed the auto-issue path; `certRequiresApproval()` now strictly returns `true`, ignoring DB configuration. - Certificate: Quiz completion now queues a pending record and triggers a "Pending approval" notification instead of falsely confirming issuance. - Certificate: Public endpoints now enforce a guard on `status=issued`; frontend strips the auto-issue side effect and claim button (issuance restricted to admins). - Chats tab: Refactor layout into a full-width centered banner above two equal-height side-by-side panels (`grid-cols-1 lg:grid-cols-2`), utilizing `max-h` and `overflow-y-auto` to eliminate whitespace bleed. - Video player: Fix settings flyout prematurely closing on mouse movement (removed `setSettingsOpen` from `poke`); add a click-outside listener via `mousedown`. - Video player: Deduplicate controls — the speed pill now directly cycles playback speed, leaving the gear icon as the single entry point for settings (eliminating overlapping popovers). - Video player: Implement full-bleed theater mode using the `-mx-[50vw] w-screen` technique, keeping the progress strip constrained to `max-w-5xl` below.
This commit is contained in:
@@ -158,9 +158,10 @@ func (s *Server) handleQuizSubmit(w http.ResponseWriter, r *http.Request) {
|
||||
return
|
||||
}
|
||||
if cert, created, cerr := s.issueCertificateIfEligible(r.Context(), activeUser); cerr == nil && created && cert != nil {
|
||||
observability.Activity("certificate.issued", "user_id", u.ID, "public_id", cert.PublicID)
|
||||
_ = s.notify.Notify(r.Context(), u.ID, "progress", "certificate_issued",
|
||||
"گواهینامه آماده است", "دوره را به پایان رساندید. گواهینامه دیجیتال شما صادر شد.", "/c/"+cert.PublicID, nil)
|
||||
observability.Activity("certificate.pending", "user_id", u.ID)
|
||||
_ = s.notify.Notify(r.Context(), u.ID, "progress", "certificate_pending",
|
||||
"درخواست گواهینامه ثبت شد", "دوره را با موفقیت به پایان رساندید. درخواست گواهینامه شما ثبت شد و پس از تأیید مدیریت صادر خواهد شد.", "/profile", nil)
|
||||
_ = cert // pending; no publicId yet
|
||||
}
|
||||
s.notifyQuizPassed(u.ID, lesson.Title, id, activeUser.StreakCurrent)
|
||||
_ = s.notifyUnlockedLessons(u.ID, id)
|
||||
|
||||
Reference in New Issue
Block a user