feat: enhance signup logic by integrating organization data handling and improving conditional checks for signup restrictions

This commit is contained in:
Rotimi Best
2026-03-11 17:15:07 +01:00
parent fd11bdd4b0
commit aae6e00b2f
@@ -17,6 +17,7 @@
import { goto } from '$app/navigation'; import { goto } from '$app/navigation';
import { resolve } from '$app/paths'; import { resolve } from '$app/paths';
let { data } = $props();
let fields = $state(Object.assign({}, SIGNUP_FIELDS)); let fields = $state(Object.assign({}, SIGNUP_FIELDS));
let loading = $state(false); let loading = $state(false);
let errors: { let errors: {
@@ -30,22 +31,28 @@
const redirectUrl = $derived(page.url.searchParams.get('redirect')); const redirectUrl = $derived(page.url.searchParams.get('redirect'));
const inviteToken = $derived(page.url.searchParams.get('invite_token')); const inviteToken = $derived(page.url.searchParams.get('invite_token'));
// Use org from store or layout data (layout data ensures org is available on self-hosted before store is set)
const org = $derived($currentOrg?.id ? $currentOrg : (data.org ?? $currentOrg));
$effect(() => {
console.log('data', data);
console.log('org', org);
});
// Invite context: allow signup when invite_token present or redirect contains invite info // Invite context: allow signup when invite_token present or redirect contains invite info
const hasInviteContext = $derived( const hasInviteContext = $derived(
!!inviteToken || (!!redirectUrl && (redirectUrl.includes('/invite/t/') || redirectUrl.includes('invite_token'))) !!inviteToken || (!!redirectUrl && (redirectUrl.includes('/invite/t/') || redirectUrl.includes('invite_token')))
); );
const inviteOnly = $derived(!!$currentOrg?.settings?.signup?.inviteOnly); const inviteOnly = $derived(!!org?.settings?.signup?.inviteOnly);
const signupRestricted = $derived( const signupRestricted = $derived($globalStore.isOrgSite && (org.disableSignup || (inviteOnly && !hasInviteContext)));
$globalStore.isOrgSite && ($currentOrg.disableSignup || (inviteOnly && !hasInviteContext))
);
// Hide Google Auth if disabled for org // Hide Google Auth if disabled for org
const hideGoogleAuth = $derived(!!($globalStore.isOrgSite && $currentOrg.disableGoogleAuth)); const hideGoogleAuth = $derived(!!($globalStore.isOrgSite && org.disableGoogleAuth));
// Check if signup is disabled // Check if signup is disabled
onMount(() => { onMount(() => {
if ($globalStore.isOrgSite && $currentOrg.disableSignup) { if ($globalStore.isOrgSite && org.disableSignup) {
goto(resolve('/login?error=signup_disabled', {})); goto(resolve('/login?error=signup_disabled', {}));
} }
}); });
@@ -68,6 +75,9 @@
loading = true; loading = true;
const name = fields.email.split('@')[0]; const name = fields.email.split('@')[0];
// Use org from store or layout data; required for self-hosted when orgs exist
const orgId = org?.id;
const { error } = await authClient.signUp.email( const { error } = await authClient.signUp.email(
{ {
email: fields.email, email: fields.email,
@@ -76,7 +86,7 @@
}, },
{ {
fetchOptions: { fetchOptions: {
headers: $globalStore.isOrgSite && $currentOrg?.id ? { 'cio-org-id': $currentOrg.id } : {} headers: { 'cio-org-id': orgId }
}, },
onSuccess: (ctx) => { onSuccess: (ctx) => {
console.log('Signup successful'); console.log('Signup successful');
@@ -135,7 +145,7 @@
{$t('login.signup_disabled.title')} {$t('login.signup_disabled.title')}
</h2> </h2>
<p class="ui:mt-2 ui:text-sm ui:text-amber-700 ui:dark:text-amber-300"> <p class="ui:mt-2 ui:text-sm ui:text-amber-700 ui:dark:text-amber-300">
{$currentOrg.disableSignupMessage || {org.disableSignupMessage ||
(inviteOnly (inviteOnly
? $t('login.signup_disabled.invite_only_message') ? $t('login.signup_disabled.invite_only_message')
: $t('settings.auth.login.signup_disabled_error'))} : $t('settings.auth.login.signup_disabled_error'))}