From 570b8091119169279c55b79412801883f6d45936 Mon Sep 17 00:00:00 2001 From: Rotimi Best Date: Sat, 8 Nov 2025 04:52:42 +0100 Subject: [PATCH 01/11] chore: debug join course --- .../CourseLandingPage/components/PricingSection.svelte | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/apps/dashboard/src/lib/components/CourseLandingPage/components/PricingSection.svelte b/apps/dashboard/src/lib/components/CourseLandingPage/components/PricingSection.svelte index 61a3d853..b4dd6aa1 100644 --- a/apps/dashboard/src/lib/components/CourseLandingPage/components/PricingSection.svelte +++ b/apps/dashboard/src/lib/components/CourseLandingPage/components/PricingSection.svelte @@ -2,8 +2,11 @@ import get from 'lodash/get'; import PrimaryButton from '$lib/components/PrimaryButton/index.svelte'; import getCurrencyFormatter from '$lib/utils/functions/getCurrencyFormatter'; - import { isCourseFree } from '$lib/utils/functions/course'; - import { getStudentInviteLink } from '$lib/utils/functions/course'; + import { + isCourseFree, + getStudentInviteLink, + calcCourseDiscount + } from '$lib/utils/functions/course'; import { currentOrg, currentOrgDomain } from '$lib/utils/store/org'; import { goto } from '$app/navigation'; import HtmlRender from '$lib/components/HTMLRender/HTMLRender.svelte'; @@ -12,7 +15,6 @@ import { ROLE } from '$lib/utils/constants/roles'; import { capturePosthogEvent } from '$lib/utils/services/posthog'; import { t } from '$lib/utils/functions/translations'; - import { calcCourseDiscount } from '$lib/utils/functions/course'; export let className = ''; export let editMode = false; @@ -35,8 +37,10 @@ course_cost: courseData.cost, course_free: isFree }); + console.log('$currentOrg', $currentOrg); if (isFree) { const link = getStudentInviteLink(courseData, $currentOrg.siteName, $currentOrgDomain); + console.log('link', link); goto(link); } else { openModal = true; From 291e2337006e8f325066a0019b3bfd8ac07fb5eb Mon Sep 17 00:00:00 2001 From: Rotimi Best Date: Sat, 8 Nov 2025 05:02:17 +0100 Subject: [PATCH 02/11] chore: enable auto redirect on layout mount The use case for this is that if a person went from course page to invite page, and isn't authenticated then the user should be redirected to login page with a redirect query param --- apps/dashboard/src/hooks.server.ts | 4 ++-- .../CourseLandingPage/components/PaymentModal.svelte | 6 +++--- apps/dashboard/src/routes/+layout.svelte | 11 +++++++---- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/apps/dashboard/src/hooks.server.ts b/apps/dashboard/src/hooks.server.ts index c83d017c..0af239ff 100644 --- a/apps/dashboard/src/hooks.server.ts +++ b/apps/dashboard/src/hooks.server.ts @@ -1,7 +1,7 @@ import type { Handle } from '@sveltejs/kit'; import { validateUser } from '$lib/utils/services/middlewares'; -const PUBLIC_ROUTES = [ +const PUBLIC_API_ROUTES = [ '/api/completion', 'student_prove_payment', 'teacher_student_buycourse', @@ -11,7 +11,7 @@ const PUBLIC_ROUTES = [ ]; function isPublicRoute(pathname: string) { - return PUBLIC_ROUTES.some((route) => pathname.includes(route)); + return PUBLIC_API_ROUTES.some((route) => pathname.includes(route)); } export const handle: Handle = async ({ event, resolve }) => { diff --git a/apps/dashboard/src/lib/components/CourseLandingPage/components/PaymentModal.svelte b/apps/dashboard/src/lib/components/CourseLandingPage/components/PaymentModal.svelte index 39914e8a..a0682b0d 100644 --- a/apps/dashboard/src/lib/components/CourseLandingPage/components/PaymentModal.svelte +++ b/apps/dashboard/src/lib/components/CourseLandingPage/components/PaymentModal.svelte @@ -20,7 +20,7 @@ email: '' }; - let errors = { + let errors: Record = { fullname: '', email: '' }; @@ -94,7 +94,7 @@ errorMessage={errors.email} /> -
+
-
+
Go to payment
{/if} diff --git a/apps/dashboard/src/routes/+layout.svelte b/apps/dashboard/src/routes/+layout.svelte index ea4bd3ef..7f0bebc2 100644 --- a/apps/dashboard/src/routes/+layout.svelte +++ b/apps/dashboard/src/routes/+layout.svelte @@ -29,6 +29,9 @@ import merge from 'lodash/merge'; import { onMount } from 'svelte'; import { MetaTags } from 'svelte-meta-tags'; + import isPublicRoute from '$lib/utils/functions/routes/isPublicRoute'; + import { isSupabaseTokenInLocalStorage } from '$lib/utils/functions/supabase'; + import { goto } from '$app/navigation'; import '../app.postcss'; @@ -65,10 +68,10 @@ handleResize(); - // if (!isSupabaseTokenInLocalStorage() && !isPublicRoute($page.url?.pathname)) { - // console.log('No auth token and is not a public route, redirect to login', path); - // return goto('/login?redirect=/' + path); - // } + if (!isSupabaseTokenInLocalStorage() && !isPublicRoute($page.url?.pathname)) { + console.log('No auth token and is not a public route, redirect to login', path); + return goto('/login?redirect=/' + path); + } const { data: authListener } = supabase.auth.onAuthStateChange((event, session) => { // Log key events From 7715834566079f40eff0fabfc67f1492cdb488ed Mon Sep 17 00:00:00 2001 From: Rotimi Best Date: Sat, 8 Nov 2025 05:22:38 +0100 Subject: [PATCH 03/11] chore: debug getSubdomain --- apps/dashboard/src/routes/+layout.server.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/apps/dashboard/src/routes/+layout.server.ts b/apps/dashboard/src/routes/+layout.server.ts index aa6b499a..57592b25 100644 --- a/apps/dashboard/src/routes/+layout.server.ts +++ b/apps/dashboard/src/routes/+layout.server.ts @@ -100,11 +100,9 @@ export const load = async ({ url, cookies, request }): Promise => { return response; } - const answer = !!subdomain; - console.log('subdomain', subdomain); - response.isOrgSite = debugMode || answer; + response.isOrgSite = debugMode || !!subdomain; response.orgSiteName = debugMode ? _orgSiteName : subdomain; response.org = (await getCurrentOrg(response.orgSiteName, true)) || null; @@ -174,10 +172,14 @@ function getBaseMetaTags(url: URL) { } function getSubdomain(url: URL) { + console.log('url.host', url); const host = url.host.replace('www.', ''); + console.log('host', host); const parts = host?.split('.'); + console.log('parts', parts); if (host?.endsWith(env.PRIVATE_APP_HOST)) { + console.log('is app host'); return parts?.length >= 3 ? parts[0] : null; } From 3d64e25b899dc61300cd5656f292f6a0030c6caa Mon Sep 17 00:00:00 2001 From: Rotimi Best Date: Sat, 8 Nov 2025 05:34:17 +0100 Subject: [PATCH 04/11] chore: debug lms detection on client side --- apps/dashboard/src/routes/+layout.server.ts | 17 +++++++++-------- apps/dashboard/src/routes/+layout.svelte | 5 +++-- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/apps/dashboard/src/routes/+layout.server.ts b/apps/dashboard/src/routes/+layout.server.ts index 57592b25..42fb6447 100644 --- a/apps/dashboard/src/routes/+layout.server.ts +++ b/apps/dashboard/src/routes/+layout.server.ts @@ -172,15 +172,16 @@ function getBaseMetaTags(url: URL) { } function getSubdomain(url: URL) { - console.log('url.host', url); - const host = url.host.replace('www.', ''); - console.log('host', host); - const parts = host?.split('.'); - console.log('parts', parts); + const host = url.hostname.replace('www.', ''); + const parts = host.split('.'); + const appHost = env.PRIVATE_APP_HOST; - if (host?.endsWith(env.PRIVATE_APP_HOST)) { - console.log('is app host'); - return parts?.length >= 3 ? parts[0] : null; + const appHostParts = appHost.split('.'); + const isAppHost = parts.slice(-appHostParts.length).join('.') === appHost; + + if (isAppHost) { + // Subdomain exists only if extra part(s) before main domain + return parts.length > appHostParts.length ? parts[0] : null; } return null; diff --git a/apps/dashboard/src/routes/+layout.svelte b/apps/dashboard/src/routes/+layout.svelte index 7f0bebc2..b898eea1 100644 --- a/apps/dashboard/src/routes/+layout.svelte +++ b/apps/dashboard/src/routes/+layout.svelte @@ -52,7 +52,8 @@ console.log( 'Welcome to ClassroomIO, we are grateful you chose us.', $page.url.host, - `\nIs student domain: ${data.isOrgSite}` + `\nIs student domain: ${data.isOrgSite}`, + data ); if (browser) { @@ -100,7 +101,7 @@ // } }); - if (data.isOrgSite && data.org && !$currentOrg.siteName) { + if (data.isOrgSite && data.org && $currentOrg.siteName !== data.org.siteName) { $globalStore.orgSiteName = data.orgSiteName; $globalStore.isOrgSite = data.isOrgSite; From 9e4609dc7f27f7e219439a9b53cf896423ccec3a Mon Sep 17 00:00:00 2001 From: Rotimi Best Date: Sat, 8 Nov 2025 05:51:09 +0100 Subject: [PATCH 05/11] fix: redirect to login if no session on invite page --- apps/dashboard/src/routes/invite/s/[hash]/+page.svelte | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/apps/dashboard/src/routes/invite/s/[hash]/+page.svelte b/apps/dashboard/src/routes/invite/s/[hash]/+page.svelte index e6bb12a5..31aa4543 100644 --- a/apps/dashboard/src/routes/invite/s/[hash]/+page.svelte +++ b/apps/dashboard/src/routes/invite/s/[hash]/+page.svelte @@ -117,6 +117,14 @@ } onMount(async () => { + // check if user has session, if not redirect to sign up with redirect back to this page + const { + data: { session } + } = await supabase.auth.getSession(); + if (!session) { + return goto(`/login?redirect=${$page.url?.pathname || ''}`); + } + setTheme(data.currentOrg?.theme || ''); }); From 0f433cfa93238b49bec609f5f5d05dc2ce42220d Mon Sep 17 00:00:00 2001 From: Rotimi Best Date: Sat, 8 Nov 2025 06:11:44 +0100 Subject: [PATCH 06/11] chore: debug enrollment on lms --- apps/dashboard/src/lib/components/Navigation/app.svelte | 7 ++++--- apps/dashboard/src/routes/+layout.svelte | 1 + 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/apps/dashboard/src/lib/components/Navigation/app.svelte b/apps/dashboard/src/lib/components/Navigation/app.svelte index f36e08cc..8bf4cf30 100644 --- a/apps/dashboard/src/lib/components/Navigation/app.svelte +++ b/apps/dashboard/src/lib/components/Navigation/app.svelte @@ -33,6 +33,7 @@ } } + $: console.log('$globalStore in app.svelte', $globalStore); $: coursesPath = $globalStore.isOrgSite ? '/lms/mylearning' : isCoursePage @@ -41,7 +42,7 @@