The auto-enroll effect re-fired because completeEnrollment reset
enrollmentAttemptKey in finally after each run. That re-triggered enroll
API calls and sendVerificationEmail on every tick for unverified users.
Track enrollmentSucceeded and send verification email at most once.
Co-authored-by: Rotimi Best <rotimi-best@users.noreply.github.com>
Remove the global z-150 mobile sheet stacking from Sidebar.Root so LMS
and org sidebars keep the default sheet layer. Course sidebar opts in via
mobileOverlayClass and its existing z-150 class.
Co-authored-by: Rotimi Best <rotimi-best@users.noreply.github.com>
Restore lesson/exercise page header z-100 stacking and fix the overlap
by lifting the mobile sidebar sheet and overlay to z-150, matching the
desktop course sidebar.
Co-authored-by: Rotimi Best <rotimi-best@users.noreply.github.com>
Remove the z-100 override on sticky lesson/exercise page headers so they
stack below the mobile sidebar sheet (z-50). Also make the lesson page
header sticky to match the exercise page.
Co-authored-by: Rotimi Best <rotimi-best@users.noreply.github.com>
Resolve the tenant org from the verification link callback URL (custom
domain, tenant subdomain, or ?org=) and apply org logo, theme color, from
name, and subject. Falls back to ClassroomIO branding on the main app.
Co-authored-by: Rotimi Best <rotimi-best@users.noreply.github.com>
After email login, auto-enroll was redirecting to /lms or the admin
/courses/:id/lessons route. Unverified users cannot use the LMS yet
(VerifyEmailModal on app routes), which felt like a permission error.
Enroll without verification, but stay on the enroll page with a verify
prompt instead of redirecting until email is confirmed. Also fix custom
domain org lookup to use hostname without backend port.
Co-authored-by: Rotimi Best <rotimi-best@users.noreply.github.com>