feat: setup drizzle (#594)

* chore: migration to SvelteKit 2

* stage 1: migrate to svelte 5 and fix rerendering issues

* stage 2: fix more $: reactivity across dashboard

* fix merge conflicts

* chore: migrate code in main to svelte 5

* chore: update preventDefault

* chore: simplify tsconfig and remove unused mobileMenuRef in MobileMenu.svelte

* chore: enforce .ts across dashboard

* rename from classroomio-com to website

* stage-3: Replace carbon icon svelte with lucide icon

* update lock file

* chore: finish icon replacement

* fix: settings and setup page multiple rerender

* stage 3: More icon and rerendering fixes

* feat: setup drizzle and better auth

* fix: onboarding validation error showing translation key #586 (#593)

* fix: onboarding validation error showing translation key #586

* fix: remove debug log for profile update errors

* chore: add a clean command

* fix: remove message from email verification response
This commit is contained in:
Rotimi Best
2025-11-01 15:49:29 +01:00
committed by GitHub
parent 97fb446df5
commit b96d91cd7c
801 changed files with 22279 additions and 10834 deletions
@@ -26,6 +26,6 @@ export const load = async ({ params = { hash: '' } }) => {
};
} catch (error) {
console.error('Error decoding course invite params.hash', error);
throw redirect(307, '/404');
redirect(307, '/404');
}
};
@@ -10,21 +10,18 @@
import type { CurrentOrg } from '$lib/utils/types/org.js';
import { ROLE } from '$lib/utils/constants/roles';
import { profile } from '$lib/utils/store/user';
import {
triggerSendEmail,
NOTIFICATION_NAME
} from '$lib/utils/services/notification/notification';
import { triggerSendEmail, NOTIFICATION_NAME } from '$lib/utils/services/notification/notification';
import { snackbar } from '$lib/components/Snackbar/store.js';
import { capturePosthogEvent } from '$lib/utils/services/posthog';
import { page } from '$app/stores';
export let data;
let { data } = $props();
let supabase = getSupabase();
let loading = false;
let loading = $state(false);
let disableSubmit = false;
let formRef: HTMLFormElement;
let formRef: HTMLFormElement = $state();
async function handleSubmit() {
loading = true;
@@ -34,11 +31,7 @@
return goto(`/signup?redirect=${$page.url?.pathname || ''}`);
}
const { data: courseData, error } = await supabase
.from('course')
.select('group_id')
.eq('id', data.id)
.single();
const { data: courseData, error } = await supabase.from('course').select('group_id').eq('id', data.id).single();
console.log({ courseData });
if (!courseData?.group_id) {
@@ -118,9 +111,8 @@
onMount(async () => {
setTheme(data.currentOrg?.theme || '');
setCurOrg(data.currentOrg as CurrentOrg);
});
$: setCurOrg(data.currentOrg as CurrentOrg);
</script>
<svelte:head>
@@ -31,6 +31,6 @@ export const load = async ({ params = { hash: '' } }) => {
};
} catch (error) {
console.error('Error decoding invite params.hash', error);
throw redirect(307, '/404');
redirect(307, '/404');
}
};
@@ -1,6 +1,5 @@
<script lang="ts">
import { goto } from '$app/navigation';
import { page } from '$app/stores';
import { page } from '$app/state';
import AuthUI from '$lib/components/AuthUI/index.svelte';
import type { Profile } from '$lib/components/Course/components/People/types';
import TextField from '$lib/components/Form/TextField.svelte';
@@ -12,34 +11,31 @@
import { setTheme } from '$lib/utils/functions/theme';
import { t } from '$lib/utils/functions/translations';
import { profile, user } from '$lib/utils/store/user';
import {
authValidation,
getConfirmPasswordError,
getDisableSubmit
} from '$lib/utils/functions/validator';
import { authValidation, getConfirmPasswordError, getDisableSubmit } from '$lib/utils/functions/validator';
import { currentOrg, currentOrgPath } from '$lib/utils/store/org';
import type { CurrentOrg } from '$lib/utils/types/org';
import { onMount } from 'svelte';
import { onMount, untrack } from 'svelte';
import { snackbar } from '$lib/components/Snackbar/store.js';
export let data;
let { data } = $props();
let supabase = getSupabase();
let fields = Object.assign({}, SIGNUP_FIELDS);
let loading = false;
let isLoggingOut = false;
let shouldLogout = false;
let fields = $state(Object.assign({}, SIGNUP_FIELDS));
let loading = $state(false);
let isLoggingOut = $state(false);
let shouldLogout = $state(false);
let errors: {
name?: string;
email?: string;
password?: string;
confirmPassword?: string;
} = {};
} = $state({});
let submitError: string;
let disableSubmit = false;
let formRef: HTMLFormElement;
let submitError: string = $state('');
let formRef: HTMLFormElement | undefined = $state();
const confirmPasswordError = $derived(getConfirmPasswordError(fields));
const disableSubmit = $derived(getDisableSubmit(fields));
async function joinOrg(profileId: string, email: string) {
if (!profileId || !email || !data.invite.currentOrg?.id) return;
@@ -163,23 +159,20 @@
setCurOrg(data.invite.currentOrg as CurrentOrg);
});
$: errors.confirmPassword = getConfirmPasswordError(fields);
$: disableSubmit = getDisableSubmit(fields);
const isLoading = $derived(loading || $user.fetchingUser);
$: autoLogout($profile?.email);
function autoLogout(email?: string) {
$effect(() => {
const email = $profile?.email;
if (!email) return;
if (email !== data.invite.email) {
console.log('logout');
snackbar.error('You are logged in with a different email');
shouldLogout = true;
untrack(() => {
shouldLogout = true;
});
}
}
$: isLoading = loading || $user.fetchingUser;
$: console.log('$profile', $profile);
$: console.log('data.invite', data.invite);
});
</script>
<svelte:head>
@@ -188,7 +181,7 @@
<AuthUI
{supabase}
redirectPathname={$page.url.pathname}
redirectPathname={page.url.pathname}
isLogin={false}
{handleSubmit}
{isLoading}
@@ -248,7 +241,7 @@
className="mb-6"
inputClassName="w-full"
isDisabled={isLoading}
errorMessage={errors.confirmPassword}
errorMessage={confirmPasswordError}
isRequired
/>
{/if}