fix(dashboard): save validation feedback, public site light mode, global verify modal (#716)

* fix(dashboard): surface save errors, force public site light mode, global verify modal

- Show snackbar with first validation error when course update fails client-side validation
- Force light mode on public org-site pages; lesson player and dashboard keep theme selector
- Mount VerifyEmailModal in root layout for all authenticated routes; keep trigger=app email guard

Co-authored-by: Rotimi Best <rotimi-best@users.noreply.github.com>

* fix: instructor editor sync, auto-enroll after auth, email verification API

- Initialize instructor form from org fallbacks and batch metadata updates
- Auto-complete course enrollment after login/signup return from enroll page
- Block new org auto-enroll and course enroll until email is verified

Co-authored-by: Rotimi Best <rotimi-best@users.noreply.github.com>

* fix: address PR review on instructor setter, color scheme, auto-enroll

- Use existing setter with batched metadata.instructor updates in InstructorForm
- Allowlist public org-site paths so /lms and /courses/:id keep theme selector
- Auto-enroll logged-in users via Better Auth session; remove sessionStorage flow
- Retry enrollment after email verification without duplicate Join Course clicks

Co-authored-by: Rotimi Best <rotimi-best@users.noreply.github.com>

* fix: allow enrollment without verification; gate dashboard only

- Remove API email verification checks from enroll and auto-enroll flows
- Move VerifyEmailModal to (app) layout so public org-site pages stay usable
- Unverified users can enroll but hit the verification modal in LMS/dashboard

Co-authored-by: Rotimi Best <rotimi-best@users.noreply.github.com>

* fix: address PR feedback on verify modal, routes, instructor form

- Restore currentOrg.id guard on VerifyEmailModal open condition
- InstructorForm imports currentOrg directly instead of prop drilling
- Move public org-site light-mode route patterns to routes constants
- Reset enrollment attempt key on enroll failure to allow retry

Co-authored-by: Rotimi Best <rotimi-best@users.noreply.github.com>

---------

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Rotimi Best <rotimi-best@users.noreply.github.com>
This commit is contained in:
Rotimi Best
2026-07-10 01:55:13 +01:00
committed by GitHub
co-authored by Rotimi Best Cursor Agent
parent 35f5216839
commit be0085f090
10 changed files with 196 additions and 68 deletions
+9 -1
View File
@@ -14,6 +14,7 @@
import { MetaTags } from 'svelte-meta-tags';
import { ModeWatcher } from '@cio/ui/base/dark-mode';
import OrgSiteFavicon from '$features/app/org-site-favicon.svelte';
import { isPublicOrgSitePage } from '$lib/utils/functions/color-scheme';
import '../app.css';
@@ -24,6 +25,7 @@
setUploadLimitsContext(data.uploadLimits);
const metaTags = $derived(merge(data.baseMetaTags, page.data.pageMetaTags));
const forceLightMode = $derived(isPublicOrgSitePage(data.isOrgSite, page.url.pathname));
onMount(() => {
console.log('Layout', data);
@@ -75,7 +77,13 @@
</svelte:head>
<div>
<ModeWatcher />
{#key forceLightMode}
{#if forceLightMode}
<ModeWatcher defaultMode="light" track={false} />
{:else}
<ModeWatcher />
{/if}
{/key}
<MetaTags {...metaTags} />