Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .changeset/nice-loops-fail.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
---
'@clerk/localizations': minor
'@clerk/clerk-js': minor
'@clerk/shared': minor
---

Display message in `TaskChooseOrganization` when user is not allowed to create organizations
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
import { useClerk, useSession, useUser } from '@clerk/shared/react';
import { useState } from 'react';
import { type ComponentType, useState } from 'react';

import { useSignOutContext, withCoreSessionSwitchGuard } from '@/ui/contexts';
import { descriptors, Flex, Flow, localizationKeys, Spinner } from '@/ui/customizables';
import { Card } from '@/ui/elements/Card';
import { withCardStateProvider } from '@/ui/elements/contexts';
import { Header } from '@/ui/elements/Header';
import { useMultipleSessions } from '@/ui/hooks/useMultipleSessions';
import { useOrganizationListInView } from '@/ui/hooks/useOrganizationListInView';

Expand All@@ -13,24 +14,10 @@ import { ChooseOrganizationScreen } from './ChooseOrganizationScreen';
import { CreateOrganizationScreen } from './CreateOrganizationScreen';

const TaskChooseOrganizationInternal = () => {
const { signOut } = useClerk();
const { user } = useUser();
const { session } = useSession();
const { userMemberships, userSuggestions, userInvitations } = useOrganizationListInView();
const { otherSessions } = useMultipleSessions({ user });
const { navigateAfterSignOut, navigateAfterMultiSessionSingleSignOutUrl } = useSignOutContext();

const handleSignOut = () => {
if (otherSessions.length === 0) {
return signOut(navigateAfterSignOut);
}

return signOut(navigateAfterMultiSessionSingleSignOutUrl, { sessionId: session?.id });
};

const isLoading = userMemberships?.isLoading || userInvitations?.isLoading || userSuggestions?.isLoading;
const hasExistingResources = !!(userMemberships?.count || userInvitations?.count || userSuggestions?.count);
const identifier = user?.primaryEmailAddress?.emailAddress ?? user?.username;

return (
<Flow.Root flow='taskChooseOrganization'>
Expand DownExpand Up@@ -58,34 +45,56 @@ const TaskChooseOrganizationInternal = () => {
)}
</Card.Content>

<Card.Footer>
<Card.Action
elementId='signOut'
gap={2}
justify='center'
sx={() => ({ width: '100%' })}
>
{identifier && (
<Card.ActionText
truncate
localizationKey={localizationKeys('taskChooseOrganization.signOut.actionText', {
identifier,
})}
/>
)}
<Card.ActionLink
sx={() => ({ flexShrink: 0 })}
onClick={handleSignOut}
localizationKey={localizationKeys('taskChooseOrganization.signOut.actionLink')}
/>
</Card.Action>
</Card.Footer>
<TaskChooseOrganizationCardFooter />
</Card.Root>
</Flow.Part>
</Flow.Root>
);
};

const TaskChooseOrganizationCardFooter = () => {
const { signOut } = useClerk();
const { user } = useUser();
const { session } = useSession();
const { otherSessions } = useMultipleSessions({ user });
const { navigateAfterSignOut, navigateAfterMultiSessionSingleSignOutUrl } = useSignOutContext();

const handleSignOut = () => {
if (otherSessions.length === 0) {
return signOut(navigateAfterSignOut);
}

return signOut(navigateAfterMultiSessionSingleSignOutUrl, { sessionId: session?.id });
};

const identifier = user?.primaryEmailAddress?.emailAddress ?? user?.username;

return (
<Card.Footer>
<Card.Action
elementId='signOut'
gap={2}
justify='center'
sx={() => ({ width: '100%' })}
>
{identifier && (
<Card.ActionText
truncate
localizationKey={localizationKeys('taskChooseOrganization.signOut.actionText', {
identifier,
})}
/>
)}
<Card.ActionLink
sx={() => ({ flexShrink: 0 })}
onClick={handleSignOut}
localizationKey={localizationKeys('taskChooseOrganization.signOut.actionLink')}
/>
</Card.Action>
</Card.Footer>
);
};

type TaskChooseOrganizationFlowsProps = {
initialFlow: 'create' | 'choose';
};
Expand All@@ -104,6 +113,44 @@ const TaskChooseOrganizationFlows = withCardStateProvider((props: TaskChooseOrga
return <ChooseOrganizationScreen onCreateOrganizationClick={() => setCurrentFlow('create')} />;
});

export const withOrganizationCreationEnabledGuard = <T extends object>(Component: ComponentType<T>) => {
return (props: T) => {
const { user } = useUser();

if (!user?.createOrganizationEnabled) {
return <OrganizationCreationDisabledScreen />;
}

return <Component {...props} />;
};
};

function OrganizationCreationDisabledScreen() {
return (
<Flow.Root flow='taskChooseOrganization'>
<Flow.Part part='organizationCreationDisabled'>
<Card.Root>
<Card.Content>
<Header.Root showLogo>
<Header.Title
localizationKey={localizationKeys('taskChooseOrganization.organizationCreationDisabled.title')}
/>
<Header.Subtitle
localizationKey={localizationKeys('taskChooseOrganization.organizationCreationDisabled.subtitle')}
/>
</Header.Root>
</Card.Content>

<TaskChooseOrganizationCardFooter />
</Card.Root>
</Flow.Part>
</Flow.Root>
);
}

export const TaskChooseOrganization = withCoreSessionSwitchGuard(
withTaskGuard(withCardStateProvider(TaskChooseOrganizationInternal), 'choose-organization'),
withTaskGuard(
withCardStateProvider(withOrganizationCreationEnabledGuard(TaskChooseOrganizationInternal)),
'choose-organization',
),
);
1 change: 1 addition & 0 deletions packages/clerk-js/src/ui/elements/contexts/index.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -128,6 +128,7 @@ export type FlowMetadata = {
| 'complete'
| 'accountSwitcher'
| 'chooseOrganization'
| 'organizationCreationDisabled'
| 'enterpriseConnections'
| 'chooseWallet';
};
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/ar-SA.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -867,6 +867,10 @@ export const arSA: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'يجب أن تنتمي إلى منظمة',
subtitle: 'تواصل مع مسؤول منظمتك للحصول على دعوة.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/be-BY.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -875,6 +875,10 @@ export const beBY: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Вы павінны належаць да арганізацыі',
subtitle: 'Звярніцеся да адміністратара вашай арганізацыі для атрымання запрашэння.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/bg-BG.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -871,6 +871,10 @@ export const bgBG: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Трябва да принадлежите към организация',
subtitle: 'Свържете се с администратора на вашата организация за покана.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/bn-IN.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -875,6 +875,10 @@ export const bnIN: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'আপনাকে অবশ্যই একটি সংগঠনের অন্তর্ভুক্ত হতে হবে',
subtitle: 'আমন্ত্রণের জন্য আপনার সংগঠনের প্রশাসকের সাথে যোগাযোগ করুন।',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/ca-ES.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -870,6 +870,10 @@ export const caES: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Heu de pertànyer a una organització',
subtitle: "Contacteu amb l'administrador de la vostra organització per obtenir una invitació.",
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/cs-CZ.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -881,6 +881,10 @@ export const csCZ: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Musíte patřit do organizace',
subtitle: 'Kontaktujte administrátora vaší organizace pro pozvánku.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/da-DK.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -868,6 +868,10 @@ export const daDK: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Du skal tilhøre en organisation',
subtitle: 'Kontakt din organisationsadministrator for en invitation.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/de-DE.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -885,6 +885,10 @@ export const deDE: LocalizationResource = {
subtitle: 'Geben Sie Ihre Organisationsdetails ein, um fortzufahren',
title: 'Organisation einrichten',
},
organizationCreationDisabled: {
title: 'Sie müssen einer Organisation angehören',
subtitle: 'Kontaktieren Sie Ihren Organisationsadministrator für eine Einladung.',
},
signOut: {
actionLink: 'Abmelden',
actionText: 'Angemeldet als {{identifier}}',
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/el-GR.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -872,6 +872,10 @@ export const elGR: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Πρέπει να ανήκετε σε έναν οργανισμό',
subtitle: 'Επικοινωνήστε με τον διαχειριστή του οργανισμού σας για πρόσκληση.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/en-GB.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -872,6 +872,10 @@ export const enGB: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'You must belong to an organisation',
subtitle: 'Contact your organisation admin for an invitation.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/en-US.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -869,6 +869,10 @@ export const enUS: LocalizationResource = {
subtitle: 'Enter your organization details to continue',
title: 'Setup your organization',
},
organizationCreationDisabled: {
title: 'You must belong to an organization',
subtitle: 'Contact your organization admin for an invitation.',
},
signOut: {
actionLink: 'Sign out',
actionText: 'Signed in as {{identifier}}',
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/es-CR.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -877,6 +877,10 @@ export const esCR: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Debe pertenecer a una organización',
subtitle: 'Contacte al administrador de su organización para obtener una invitación.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/es-ES.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -871,6 +871,10 @@ export const esES: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Debe pertenecer a una organización',
subtitle: 'Contacte al administrador de su organización para obtener una invitación.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/es-MX.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -878,6 +878,10 @@ export const esMX: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Debe pertenecer a una organización',
subtitle: 'Contacte al administrador de su organización para obtener una invitación.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/es-UY.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -877,6 +877,10 @@ export const esUY: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Debés pertenecer a una organización',
subtitle: 'Contactá al administrador de tu organización para obtener una invitación.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/fa-IR.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -881,6 +881,10 @@ export const faIR: LocalizationResource = {
subtitle: 'سازمان جدیدی برای شروع کار ایجاد کنید',
title: 'ایجاد سازمان جدید',
},
organizationCreationDisabled: {
title: 'شما باید عضو یک سازمان باشید',
subtitle: 'برای دریافت دعوتنامه با مدیر سازمان خود تماس بگیرید.',
},
signOut: {
actionLink: 'خروج از همه حساب‌ها',
actionText: 'می‌خواهید خارج شوید؟',
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/fi-FI.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -871,6 +871,10 @@ export const fiFI: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Sinun täytyy kuulua organisaatioon',
subtitle: 'Ota yhteyttä organisaatiosi ylläpitäjään saadaksesi kutsun.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/fr-FR.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -886,6 +886,10 @@ export const frFR: LocalizationResource = {
subtitle: 'Entrez les détails de votre organisation pour continuer',
title: 'Configurer votre organisation',
},
organizationCreationDisabled: {
title: 'Vous devez appartenir à une organisation',
subtitle: "Contactez l'administrateur de votre organisation pour obtenir une invitation.",
},
signOut: {
actionLink: 'Se déconnecter',
actionText: 'Connecté en tant que {{identifier}}',
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/he-IL.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -861,6 +861,10 @@ export const heIL: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'עליך להשתייך לארגון',
subtitle: 'פנה למנהל הארגון שלך לקבלת הזמנה.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/hi-IN.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -875,6 +875,10 @@ export const hiIN: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'आपको किसी संगठन से संबंधित होना चाहिए',
subtitle: 'आमंत्रण के लिए अपने संगठन के व्यवस्थापक से संपर्क करें।',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
feat(clerk-js,shared): Show message in `TaskChooseOrganization` on org creation disabled by LauraBeatris · Pull Request #7502 · clerk/javascript · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .changeset/nice-loops-fail.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
---
'@clerk/localizations': minor
'@clerk/clerk-js': minor
'@clerk/shared': minor
---

Display message in `TaskChooseOrganization` when user is not allowed to create organizations
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
import { useClerk, useSession, useUser } from '@clerk/shared/react';
import { useState } from 'react';
import { type ComponentType, useState } from 'react';

import { useSignOutContext, withCoreSessionSwitchGuard } from '@/ui/contexts';
import { descriptors, Flex, Flow, localizationKeys, Spinner } from '@/ui/customizables';
import { Card } from '@/ui/elements/Card';
import { withCardStateProvider } from '@/ui/elements/contexts';
import { Header } from '@/ui/elements/Header';
import { useMultipleSessions } from '@/ui/hooks/useMultipleSessions';
import { useOrganizationListInView } from '@/ui/hooks/useOrganizationListInView';

Expand All@@ -13,24 +14,10 @@ import { ChooseOrganizationScreen } from './ChooseOrganizationScreen';
import { CreateOrganizationScreen } from './CreateOrganizationScreen';

const TaskChooseOrganizationInternal = () => {
const { signOut } = useClerk();
const { user } = useUser();
const { session } = useSession();
const { userMemberships, userSuggestions, userInvitations } = useOrganizationListInView();
const { otherSessions } = useMultipleSessions({ user });
const { navigateAfterSignOut, navigateAfterMultiSessionSingleSignOutUrl } = useSignOutContext();

const handleSignOut = () => {
if (otherSessions.length === 0) {
return signOut(navigateAfterSignOut);
}

return signOut(navigateAfterMultiSessionSingleSignOutUrl, { sessionId: session?.id });
};

const isLoading = userMemberships?.isLoading || userInvitations?.isLoading || userSuggestions?.isLoading;
const hasExistingResources = !!(userMemberships?.count || userInvitations?.count || userSuggestions?.count);
const identifier = user?.primaryEmailAddress?.emailAddress ?? user?.username;

return (
<Flow.Root flow='taskChooseOrganization'>
Expand DownExpand Up@@ -58,34 +45,56 @@ const TaskChooseOrganizationInternal = () => {
)}
</Card.Content>

<Card.Footer>
<Card.Action
elementId='signOut'
gap={2}
justify='center'
sx={() => ({ width: '100%' })}
>
{identifier && (
<Card.ActionText
truncate
localizationKey={localizationKeys('taskChooseOrganization.signOut.actionText', {
identifier,
})}
/>
)}
<Card.ActionLink
sx={() => ({ flexShrink: 0 })}
onClick={handleSignOut}
localizationKey={localizationKeys('taskChooseOrganization.signOut.actionLink')}
/>
</Card.Action>
</Card.Footer>
<TaskChooseOrganizationCardFooter />
</Card.Root>
</Flow.Part>
</Flow.Root>
);
};

const TaskChooseOrganizationCardFooter = () => {
const { signOut } = useClerk();
const { user } = useUser();
const { session } = useSession();
const { otherSessions } = useMultipleSessions({ user });
const { navigateAfterSignOut, navigateAfterMultiSessionSingleSignOutUrl } = useSignOutContext();

const handleSignOut = () => {
if (otherSessions.length === 0) {
return signOut(navigateAfterSignOut);
}

return signOut(navigateAfterMultiSessionSingleSignOutUrl, { sessionId: session?.id });
};

const identifier = user?.primaryEmailAddress?.emailAddress ?? user?.username;

return (
<Card.Footer>
<Card.Action
elementId='signOut'
gap={2}
justify='center'
sx={() => ({ width: '100%' })}
>
{identifier && (
<Card.ActionText
truncate
localizationKey={localizationKeys('taskChooseOrganization.signOut.actionText', {
identifier,
})}
/>
)}
<Card.ActionLink
sx={() => ({ flexShrink: 0 })}
onClick={handleSignOut}
localizationKey={localizationKeys('taskChooseOrganization.signOut.actionLink')}
/>
</Card.Action>
</Card.Footer>
);
};

type TaskChooseOrganizationFlowsProps = {
initialFlow: 'create' | 'choose';
};
Expand All@@ -104,6 +113,44 @@ const TaskChooseOrganizationFlows = withCardStateProvider((props: TaskChooseOrga
return <ChooseOrganizationScreen onCreateOrganizationClick={() => setCurrentFlow('create')} />;
});

export const withOrganizationCreationEnabledGuard = <T extends object>(Component: ComponentType<T>) => {
return (props: T) => {
const { user } = useUser();

if (!user?.createOrganizationEnabled) {
return <OrganizationCreationDisabledScreen />;
}

return <Component {...props} />;
};
};

function OrganizationCreationDisabledScreen() {
return (
<Flow.Root flow='taskChooseOrganization'>
<Flow.Part part='organizationCreationDisabled'>
<Card.Root>
<Card.Content>
<Header.Root showLogo>
<Header.Title
localizationKey={localizationKeys('taskChooseOrganization.organizationCreationDisabled.title')}
/>
<Header.Subtitle
localizationKey={localizationKeys('taskChooseOrganization.organizationCreationDisabled.subtitle')}
/>
</Header.Root>
</Card.Content>

<TaskChooseOrganizationCardFooter />
</Card.Root>
</Flow.Part>
</Flow.Root>
);
}

export const TaskChooseOrganization = withCoreSessionSwitchGuard(
withTaskGuard(withCardStateProvider(TaskChooseOrganizationInternal), 'choose-organization'),
withTaskGuard(
withCardStateProvider(withOrganizationCreationEnabledGuard(TaskChooseOrganizationInternal)),
'choose-organization',
),
);
1 change: 1 addition & 0 deletions packages/clerk-js/src/ui/elements/contexts/index.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -128,6 +128,7 @@ export type FlowMetadata = {
| 'complete'
| 'accountSwitcher'
| 'chooseOrganization'
| 'organizationCreationDisabled'
| 'enterpriseConnections'
| 'chooseWallet';
};
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/ar-SA.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -867,6 +867,10 @@ export const arSA: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'يجب أن تنتمي إلى منظمة',
subtitle: 'تواصل مع مسؤول منظمتك للحصول على دعوة.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/be-BY.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -875,6 +875,10 @@ export const beBY: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Вы павінны належаць да арганізацыі',
subtitle: 'Звярніцеся да адміністратара вашай арганізацыі для атрымання запрашэння.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/bg-BG.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -871,6 +871,10 @@ export const bgBG: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Трябва да принадлежите към организация',
subtitle: 'Свържете се с администратора на вашата организация за покана.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/bn-IN.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -875,6 +875,10 @@ export const bnIN: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'আপনাকে অবশ্যই একটি সংগঠনের অন্তর্ভুক্ত হতে হবে',
subtitle: 'আমন্ত্রণের জন্য আপনার সংগঠনের প্রশাসকের সাথে যোগাযোগ করুন।',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/ca-ES.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -870,6 +870,10 @@ export const caES: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Heu de pertànyer a una organització',
subtitle: "Contacteu amb l'administrador de la vostra organització per obtenir una invitació.",
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/cs-CZ.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -881,6 +881,10 @@ export const csCZ: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Musíte patřit do organizace',
subtitle: 'Kontaktujte administrátora vaší organizace pro pozvánku.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/da-DK.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -868,6 +868,10 @@ export const daDK: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Du skal tilhøre en organisation',
subtitle: 'Kontakt din organisationsadministrator for en invitation.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/de-DE.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -885,6 +885,10 @@ export const deDE: LocalizationResource = {
subtitle: 'Geben Sie Ihre Organisationsdetails ein, um fortzufahren',
title: 'Organisation einrichten',
},
organizationCreationDisabled: {
title: 'Sie müssen einer Organisation angehören',
subtitle: 'Kontaktieren Sie Ihren Organisationsadministrator für eine Einladung.',
},
signOut: {
actionLink: 'Abmelden',
actionText: 'Angemeldet als {{identifier}}',
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/el-GR.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -872,6 +872,10 @@ export const elGR: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Πρέπει να ανήκετε σε έναν οργανισμό',
subtitle: 'Επικοινωνήστε με τον διαχειριστή του οργανισμού σας για πρόσκληση.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/en-GB.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -872,6 +872,10 @@ export const enGB: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'You must belong to an organisation',
subtitle: 'Contact your organisation admin for an invitation.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/en-US.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -869,6 +869,10 @@ export const enUS: LocalizationResource = {
subtitle: 'Enter your organization details to continue',
title: 'Setup your organization',
},
organizationCreationDisabled: {
title: 'You must belong to an organization',
subtitle: 'Contact your organization admin for an invitation.',
},
signOut: {
actionLink: 'Sign out',
actionText: 'Signed in as {{identifier}}',
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/es-CR.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -877,6 +877,10 @@ export const esCR: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Debe pertenecer a una organización',
subtitle: 'Contacte al administrador de su organización para obtener una invitación.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/es-ES.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -871,6 +871,10 @@ export const esES: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Debe pertenecer a una organización',
subtitle: 'Contacte al administrador de su organización para obtener una invitación.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/es-MX.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -878,6 +878,10 @@ export const esMX: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Debe pertenecer a una organización',
subtitle: 'Contacte al administrador de su organización para obtener una invitación.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/es-UY.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -877,6 +877,10 @@ export const esUY: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Debés pertenecer a una organización',
subtitle: 'Contactá al administrador de tu organización para obtener una invitación.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/fa-IR.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -881,6 +881,10 @@ export const faIR: LocalizationResource = {
subtitle: 'سازمان جدیدی برای شروع کار ایجاد کنید',
title: 'ایجاد سازمان جدید',
},
organizationCreationDisabled: {
title: 'شما باید عضو یک سازمان باشید',
subtitle: 'برای دریافت دعوتنامه با مدیر سازمان خود تماس بگیرید.',
},
signOut: {
actionLink: 'خروج از همه حساب‌ها',
actionText: 'می‌خواهید خارج شوید؟',
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/fi-FI.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -871,6 +871,10 @@ export const fiFI: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Sinun täytyy kuulua organisaatioon',
subtitle: 'Ota yhteyttä organisaatiosi ylläpitäjään saadaksesi kutsun.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/fr-FR.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -886,6 +886,10 @@ export const frFR: LocalizationResource = {
subtitle: 'Entrez les détails de votre organisation pour continuer',
title: 'Configurer votre organisation',
},
organizationCreationDisabled: {
title: 'Vous devez appartenir à une organisation',
subtitle: "Contactez l'administrateur de votre organisation pour obtenir une invitation.",
},
signOut: {
actionLink: 'Se déconnecter',
actionText: 'Connecté en tant que {{identifier}}',
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/he-IL.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -861,6 +861,10 @@ export const heIL: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'עליך להשתייך לארגון',
subtitle: 'פנה למנהל הארגון שלך לקבלת הזמנה.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/hi-IN.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -875,6 +875,10 @@ export const hiIN: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'आपको किसी संगठन से संबंधित होना चाहिए',
subtitle: 'आमंत्रण के लिए अपने संगठन के व्यवस्थापक से संपर्क करें।',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' feat(clerk-js,shared): Show message in `TaskChooseOrganization` on org creation disabled by LauraBeatris · Pull Request #7502 · clerk/javascript · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .changeset/nice-loops-fail.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
---
'@clerk/localizations': minor
'@clerk/clerk-js': minor
'@clerk/shared': minor
---

Display message in `TaskChooseOrganization` when user is not allowed to create organizations
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
import { useClerk, useSession, useUser } from '@clerk/shared/react';
import { useState } from 'react';
import { type ComponentType, useState } from 'react';

import { useSignOutContext, withCoreSessionSwitchGuard } from '@/ui/contexts';
import { descriptors, Flex, Flow, localizationKeys, Spinner } from '@/ui/customizables';
import { Card } from '@/ui/elements/Card';
import { withCardStateProvider } from '@/ui/elements/contexts';
import { Header } from '@/ui/elements/Header';
import { useMultipleSessions } from '@/ui/hooks/useMultipleSessions';
import { useOrganizationListInView } from '@/ui/hooks/useOrganizationListInView';

Expand All@@ -13,24 +14,10 @@ import { ChooseOrganizationScreen } from './ChooseOrganizationScreen';
import { CreateOrganizationScreen } from './CreateOrganizationScreen';

const TaskChooseOrganizationInternal = () => {
const { signOut } = useClerk();
const { user } = useUser();
const { session } = useSession();
const { userMemberships, userSuggestions, userInvitations } = useOrganizationListInView();
const { otherSessions } = useMultipleSessions({ user });
const { navigateAfterSignOut, navigateAfterMultiSessionSingleSignOutUrl } = useSignOutContext();

const handleSignOut = () => {
if (otherSessions.length === 0) {
return signOut(navigateAfterSignOut);
}

return signOut(navigateAfterMultiSessionSingleSignOutUrl, { sessionId: session?.id });
};

const isLoading = userMemberships?.isLoading || userInvitations?.isLoading || userSuggestions?.isLoading;
const hasExistingResources = !!(userMemberships?.count || userInvitations?.count || userSuggestions?.count);
const identifier = user?.primaryEmailAddress?.emailAddress ?? user?.username;

return (
<Flow.Root flow='taskChooseOrganization'>
Expand DownExpand Up@@ -58,34 +45,56 @@ const TaskChooseOrganizationInternal = () => {
)}
</Card.Content>

<Card.Footer>
<Card.Action
elementId='signOut'
gap={2}
justify='center'
sx={() => ({ width: '100%' })}
>
{identifier && (
<Card.ActionText
truncate
localizationKey={localizationKeys('taskChooseOrganization.signOut.actionText', {
identifier,
})}
/>
)}
<Card.ActionLink
sx={() => ({ flexShrink: 0 })}
onClick={handleSignOut}
localizationKey={localizationKeys('taskChooseOrganization.signOut.actionLink')}
/>
</Card.Action>
</Card.Footer>
<TaskChooseOrganizationCardFooter />
</Card.Root>
</Flow.Part>
</Flow.Root>
);
};

const TaskChooseOrganizationCardFooter = () => {
const { signOut } = useClerk();
const { user } = useUser();
const { session } = useSession();
const { otherSessions } = useMultipleSessions({ user });
const { navigateAfterSignOut, navigateAfterMultiSessionSingleSignOutUrl } = useSignOutContext();

const handleSignOut = () => {
if (otherSessions.length === 0) {
return signOut(navigateAfterSignOut);
}

return signOut(navigateAfterMultiSessionSingleSignOutUrl, { sessionId: session?.id });
};

const identifier = user?.primaryEmailAddress?.emailAddress ?? user?.username;

return (
<Card.Footer>
<Card.Action
elementId='signOut'
gap={2}
justify='center'
sx={() => ({ width: '100%' })}
>
{identifier && (
<Card.ActionText
truncate
localizationKey={localizationKeys('taskChooseOrganization.signOut.actionText', {
identifier,
})}
/>
)}
<Card.ActionLink
sx={() => ({ flexShrink: 0 })}
onClick={handleSignOut}
localizationKey={localizationKeys('taskChooseOrganization.signOut.actionLink')}
/>
</Card.Action>
</Card.Footer>
);
};

type TaskChooseOrganizationFlowsProps = {
initialFlow: 'create' | 'choose';
};
Expand All@@ -104,6 +113,44 @@ const TaskChooseOrganizationFlows = withCardStateProvider((props: TaskChooseOrga
return <ChooseOrganizationScreen onCreateOrganizationClick={() => setCurrentFlow('create')} />;
});

export const withOrganizationCreationEnabledGuard = <T extends object>(Component: ComponentType<T>) => {
return (props: T) => {
const { user } = useUser();

if (!user?.createOrganizationEnabled) {
return <OrganizationCreationDisabledScreen />;
}

return <Component {...props} />;
};
};

function OrganizationCreationDisabledScreen() {
return (
<Flow.Root flow='taskChooseOrganization'>
<Flow.Part part='organizationCreationDisabled'>
<Card.Root>
<Card.Content>
<Header.Root showLogo>
<Header.Title
localizationKey={localizationKeys('taskChooseOrganization.organizationCreationDisabled.title')}
/>
<Header.Subtitle
localizationKey={localizationKeys('taskChooseOrganization.organizationCreationDisabled.subtitle')}
/>
</Header.Root>
</Card.Content>

<TaskChooseOrganizationCardFooter />
</Card.Root>
</Flow.Part>
</Flow.Root>
);
}

export const TaskChooseOrganization = withCoreSessionSwitchGuard(
withTaskGuard(withCardStateProvider(TaskChooseOrganizationInternal), 'choose-organization'),
withTaskGuard(
withCardStateProvider(withOrganizationCreationEnabledGuard(TaskChooseOrganizationInternal)),
'choose-organization',
),
);
1 change: 1 addition & 0 deletions packages/clerk-js/src/ui/elements/contexts/index.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -128,6 +128,7 @@ export type FlowMetadata = {
| 'complete'
| 'accountSwitcher'
| 'chooseOrganization'
| 'organizationCreationDisabled'
| 'enterpriseConnections'
| 'chooseWallet';
};
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/ar-SA.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -867,6 +867,10 @@ export const arSA: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'يجب أن تنتمي إلى منظمة',
subtitle: 'تواصل مع مسؤول منظمتك للحصول على دعوة.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/be-BY.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -875,6 +875,10 @@ export const beBY: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Вы павінны належаць да арганізацыі',
subtitle: 'Звярніцеся да адміністратара вашай арганізацыі для атрымання запрашэння.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/bg-BG.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -871,6 +871,10 @@ export const bgBG: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Трябва да принадлежите към организация',
subtitle: 'Свържете се с администратора на вашата организация за покана.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/bn-IN.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -875,6 +875,10 @@ export const bnIN: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'আপনাকে অবশ্যই একটি সংগঠনের অন্তর্ভুক্ত হতে হবে',
subtitle: 'আমন্ত্রণের জন্য আপনার সংগঠনের প্রশাসকের সাথে যোগাযোগ করুন।',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/ca-ES.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -870,6 +870,10 @@ export const caES: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Heu de pertànyer a una organització',
subtitle: "Contacteu amb l'administrador de la vostra organització per obtenir una invitació.",
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/cs-CZ.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -881,6 +881,10 @@ export const csCZ: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Musíte patřit do organizace',
subtitle: 'Kontaktujte administrátora vaší organizace pro pozvánku.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/da-DK.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -868,6 +868,10 @@ export const daDK: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Du skal tilhøre en organisation',
subtitle: 'Kontakt din organisationsadministrator for en invitation.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/de-DE.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -885,6 +885,10 @@ export const deDE: LocalizationResource = {
subtitle: 'Geben Sie Ihre Organisationsdetails ein, um fortzufahren',
title: 'Organisation einrichten',
},
organizationCreationDisabled: {
title: 'Sie müssen einer Organisation angehören',
subtitle: 'Kontaktieren Sie Ihren Organisationsadministrator für eine Einladung.',
},
signOut: {
actionLink: 'Abmelden',
actionText: 'Angemeldet als {{identifier}}',
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/el-GR.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -872,6 +872,10 @@ export const elGR: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Πρέπει να ανήκετε σε έναν οργανισμό',
subtitle: 'Επικοινωνήστε με τον διαχειριστή του οργανισμού σας για πρόσκληση.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/en-GB.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -872,6 +872,10 @@ export const enGB: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'You must belong to an organisation',
subtitle: 'Contact your organisation admin for an invitation.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/en-US.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -869,6 +869,10 @@ export const enUS: LocalizationResource = {
subtitle: 'Enter your organization details to continue',
title: 'Setup your organization',
},
organizationCreationDisabled: {
title: 'You must belong to an organization',
subtitle: 'Contact your organization admin for an invitation.',
},
signOut: {
actionLink: 'Sign out',
actionText: 'Signed in as {{identifier}}',
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/es-CR.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -877,6 +877,10 @@ export const esCR: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Debe pertenecer a una organización',
subtitle: 'Contacte al administrador de su organización para obtener una invitación.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/es-ES.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -871,6 +871,10 @@ export const esES: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Debe pertenecer a una organización',
subtitle: 'Contacte al administrador de su organización para obtener una invitación.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/es-MX.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -878,6 +878,10 @@ export const esMX: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Debe pertenecer a una organización',
subtitle: 'Contacte al administrador de su organización para obtener una invitación.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/es-UY.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -877,6 +877,10 @@ export const esUY: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Debés pertenecer a una organización',
subtitle: 'Contactá al administrador de tu organización para obtener una invitación.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/fa-IR.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -881,6 +881,10 @@ export const faIR: LocalizationResource = {
subtitle: 'سازمان جدیدی برای شروع کار ایجاد کنید',
title: 'ایجاد سازمان جدید',
},
organizationCreationDisabled: {
title: 'شما باید عضو یک سازمان باشید',
subtitle: 'برای دریافت دعوتنامه با مدیر سازمان خود تماس بگیرید.',
},
signOut: {
actionLink: 'خروج از همه حساب‌ها',
actionText: 'می‌خواهید خارج شوید؟',
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/fi-FI.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -871,6 +871,10 @@ export const fiFI: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Sinun täytyy kuulua organisaatioon',
subtitle: 'Ota yhteyttä organisaatiosi ylläpitäjään saadaksesi kutsun.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/fr-FR.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -886,6 +886,10 @@ export const frFR: LocalizationResource = {
subtitle: 'Entrez les détails de votre organisation pour continuer',
title: 'Configurer votre organisation',
},
organizationCreationDisabled: {
title: 'Vous devez appartenir à une organisation',
subtitle: "Contactez l'administrateur de votre organisation pour obtenir une invitation.",
},
signOut: {
actionLink: 'Se déconnecter',
actionText: 'Connecté en tant que {{identifier}}',
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/he-IL.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -861,6 +861,10 @@ export const heIL: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'עליך להשתייך לארגון',
subtitle: 'פנה למנהל הארגון שלך לקבלת הזמנה.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/hi-IN.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -875,6 +875,10 @@ export const hiIN: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'आपको किसी संगठन से संबंधित होना चाहिए',
subtitle: 'आमंत्रण के लिए अपने संगठन के व्यवस्थापक से संपर्क करें।',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' feat(clerk-js,shared): Show message in `TaskChooseOrganization` on org creation disabled by LauraBeatris · Pull Request #7502 · clerk/javascript · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .changeset/nice-loops-fail.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
---
'@clerk/localizations': minor
'@clerk/clerk-js': minor
'@clerk/shared': minor
---

Display message in `TaskChooseOrganization` when user is not allowed to create organizations
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
import { useClerk, useSession, useUser } from '@clerk/shared/react';
import { useState } from 'react';
import { type ComponentType, useState } from 'react';

import { useSignOutContext, withCoreSessionSwitchGuard } from '@/ui/contexts';
import { descriptors, Flex, Flow, localizationKeys, Spinner } from '@/ui/customizables';
import { Card } from '@/ui/elements/Card';
import { withCardStateProvider } from '@/ui/elements/contexts';
import { Header } from '@/ui/elements/Header';
import { useMultipleSessions } from '@/ui/hooks/useMultipleSessions';
import { useOrganizationListInView } from '@/ui/hooks/useOrganizationListInView';

Expand All@@ -13,24 +14,10 @@ import { ChooseOrganizationScreen } from './ChooseOrganizationScreen';
import { CreateOrganizationScreen } from './CreateOrganizationScreen';

const TaskChooseOrganizationInternal = () => {
const { signOut } = useClerk();
const { user } = useUser();
const { session } = useSession();
const { userMemberships, userSuggestions, userInvitations } = useOrganizationListInView();
const { otherSessions } = useMultipleSessions({ user });
const { navigateAfterSignOut, navigateAfterMultiSessionSingleSignOutUrl } = useSignOutContext();

const handleSignOut = () => {
if (otherSessions.length === 0) {
return signOut(navigateAfterSignOut);
}

return signOut(navigateAfterMultiSessionSingleSignOutUrl, { sessionId: session?.id });
};

const isLoading = userMemberships?.isLoading || userInvitations?.isLoading || userSuggestions?.isLoading;
const hasExistingResources = !!(userMemberships?.count || userInvitations?.count || userSuggestions?.count);
const identifier = user?.primaryEmailAddress?.emailAddress ?? user?.username;

return (
<Flow.Root flow='taskChooseOrganization'>
Expand DownExpand Up@@ -58,34 +45,56 @@ const TaskChooseOrganizationInternal = () => {
)}
</Card.Content>

<Card.Footer>
<Card.Action
elementId='signOut'
gap={2}
justify='center'
sx={() => ({ width: '100%' })}
>
{identifier && (
<Card.ActionText
truncate
localizationKey={localizationKeys('taskChooseOrganization.signOut.actionText', {
identifier,
})}
/>
)}
<Card.ActionLink
sx={() => ({ flexShrink: 0 })}
onClick={handleSignOut}
localizationKey={localizationKeys('taskChooseOrganization.signOut.actionLink')}
/>
</Card.Action>
</Card.Footer>
<TaskChooseOrganizationCardFooter />
</Card.Root>
</Flow.Part>
</Flow.Root>
);
};

const TaskChooseOrganizationCardFooter = () => {
const { signOut } = useClerk();
const { user } = useUser();
const { session } = useSession();
const { otherSessions } = useMultipleSessions({ user });
const { navigateAfterSignOut, navigateAfterMultiSessionSingleSignOutUrl } = useSignOutContext();

const handleSignOut = () => {
if (otherSessions.length === 0) {
return signOut(navigateAfterSignOut);
}

return signOut(navigateAfterMultiSessionSingleSignOutUrl, { sessionId: session?.id });
};

const identifier = user?.primaryEmailAddress?.emailAddress ?? user?.username;

return (
<Card.Footer>
<Card.Action
elementId='signOut'
gap={2}
justify='center'
sx={() => ({ width: '100%' })}
>
{identifier && (
<Card.ActionText
truncate
localizationKey={localizationKeys('taskChooseOrganization.signOut.actionText', {
identifier,
})}
/>
)}
<Card.ActionLink
sx={() => ({ flexShrink: 0 })}
onClick={handleSignOut}
localizationKey={localizationKeys('taskChooseOrganization.signOut.actionLink')}
/>
</Card.Action>
</Card.Footer>
);
};

type TaskChooseOrganizationFlowsProps = {
initialFlow: 'create' | 'choose';
};
Expand All@@ -104,6 +113,44 @@ const TaskChooseOrganizationFlows = withCardStateProvider((props: TaskChooseOrga
return <ChooseOrganizationScreen onCreateOrganizationClick={() => setCurrentFlow('create')} />;
});

export const withOrganizationCreationEnabledGuard = <T extends object>(Component: ComponentType<T>) => {
return (props: T) => {
const { user } = useUser();

if (!user?.createOrganizationEnabled) {
return <OrganizationCreationDisabledScreen />;
}

return <Component {...props} />;
};
};

function OrganizationCreationDisabledScreen() {
return (
<Flow.Root flow='taskChooseOrganization'>
<Flow.Part part='organizationCreationDisabled'>
<Card.Root>
<Card.Content>
<Header.Root showLogo>
<Header.Title
localizationKey={localizationKeys('taskChooseOrganization.organizationCreationDisabled.title')}
/>
<Header.Subtitle
localizationKey={localizationKeys('taskChooseOrganization.organizationCreationDisabled.subtitle')}
/>
</Header.Root>
</Card.Content>

<TaskChooseOrganizationCardFooter />
</Card.Root>
</Flow.Part>
</Flow.Root>
);
}

export const TaskChooseOrganization = withCoreSessionSwitchGuard(
withTaskGuard(withCardStateProvider(TaskChooseOrganizationInternal), 'choose-organization'),
withTaskGuard(
withCardStateProvider(withOrganizationCreationEnabledGuard(TaskChooseOrganizationInternal)),
'choose-organization',
),
);
1 change: 1 addition & 0 deletions packages/clerk-js/src/ui/elements/contexts/index.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -128,6 +128,7 @@ export type FlowMetadata = {
| 'complete'
| 'accountSwitcher'
| 'chooseOrganization'
| 'organizationCreationDisabled'
| 'enterpriseConnections'
| 'chooseWallet';
};
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/ar-SA.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -867,6 +867,10 @@ export const arSA: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'يجب أن تنتمي إلى منظمة',
subtitle: 'تواصل مع مسؤول منظمتك للحصول على دعوة.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/be-BY.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -875,6 +875,10 @@ export const beBY: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Вы павінны належаць да арганізацыі',
subtitle: 'Звярніцеся да адміністратара вашай арганізацыі для атрымання запрашэння.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/bg-BG.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -871,6 +871,10 @@ export const bgBG: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Трябва да принадлежите към организация',
subtitle: 'Свържете се с администратора на вашата организация за покана.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/bn-IN.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -875,6 +875,10 @@ export const bnIN: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'আপনাকে অবশ্যই একটি সংগঠনের অন্তর্ভুক্ত হতে হবে',
subtitle: 'আমন্ত্রণের জন্য আপনার সংগঠনের প্রশাসকের সাথে যোগাযোগ করুন।',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/ca-ES.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -870,6 +870,10 @@ export const caES: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Heu de pertànyer a una organització',
subtitle: "Contacteu amb l'administrador de la vostra organització per obtenir una invitació.",
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/cs-CZ.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -881,6 +881,10 @@ export const csCZ: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Musíte patřit do organizace',
subtitle: 'Kontaktujte administrátora vaší organizace pro pozvánku.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/da-DK.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -868,6 +868,10 @@ export const daDK: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Du skal tilhøre en organisation',
subtitle: 'Kontakt din organisationsadministrator for en invitation.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/de-DE.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -885,6 +885,10 @@ export const deDE: LocalizationResource = {
subtitle: 'Geben Sie Ihre Organisationsdetails ein, um fortzufahren',
title: 'Organisation einrichten',
},
organizationCreationDisabled: {
title: 'Sie müssen einer Organisation angehören',
subtitle: 'Kontaktieren Sie Ihren Organisationsadministrator für eine Einladung.',
},
signOut: {
actionLink: 'Abmelden',
actionText: 'Angemeldet als {{identifier}}',
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/el-GR.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -872,6 +872,10 @@ export const elGR: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Πρέπει να ανήκετε σε έναν οργανισμό',
subtitle: 'Επικοινωνήστε με τον διαχειριστή του οργανισμού σας για πρόσκληση.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/en-GB.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -872,6 +872,10 @@ export const enGB: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'You must belong to an organisation',
subtitle: 'Contact your organisation admin for an invitation.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/en-US.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -869,6 +869,10 @@ export const enUS: LocalizationResource = {
subtitle: 'Enter your organization details to continue',
title: 'Setup your organization',
},
organizationCreationDisabled: {
title: 'You must belong to an organization',
subtitle: 'Contact your organization admin for an invitation.',
},
signOut: {
actionLink: 'Sign out',
actionText: 'Signed in as {{identifier}}',
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/es-CR.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -877,6 +877,10 @@ export const esCR: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Debe pertenecer a una organización',
subtitle: 'Contacte al administrador de su organización para obtener una invitación.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/es-ES.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -871,6 +871,10 @@ export const esES: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Debe pertenecer a una organización',
subtitle: 'Contacte al administrador de su organización para obtener una invitación.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/es-MX.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -878,6 +878,10 @@ export const esMX: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Debe pertenecer a una organización',
subtitle: 'Contacte al administrador de su organización para obtener una invitación.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/es-UY.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -877,6 +877,10 @@ export const esUY: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Debés pertenecer a una organización',
subtitle: 'Contactá al administrador de tu organización para obtener una invitación.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/fa-IR.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -881,6 +881,10 @@ export const faIR: LocalizationResource = {
subtitle: 'سازمان جدیدی برای شروع کار ایجاد کنید',
title: 'ایجاد سازمان جدید',
},
organizationCreationDisabled: {
title: 'شما باید عضو یک سازمان باشید',
subtitle: 'برای دریافت دعوتنامه با مدیر سازمان خود تماس بگیرید.',
},
signOut: {
actionLink: 'خروج از همه حساب‌ها',
actionText: 'می‌خواهید خارج شوید؟',
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/fi-FI.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -871,6 +871,10 @@ export const fiFI: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Sinun täytyy kuulua organisaatioon',
subtitle: 'Ota yhteyttä organisaatiosi ylläpitäjään saadaksesi kutsun.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/fr-FR.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -886,6 +886,10 @@ export const frFR: LocalizationResource = {
subtitle: 'Entrez les détails de votre organisation pour continuer',
title: 'Configurer votre organisation',
},
organizationCreationDisabled: {
title: 'Vous devez appartenir à une organisation',
subtitle: "Contactez l'administrateur de votre organisation pour obtenir une invitation.",
},
signOut: {
actionLink: 'Se déconnecter',
actionText: 'Connecté en tant que {{identifier}}',
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/he-IL.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -861,6 +861,10 @@ export const heIL: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'עליך להשתייך לארגון',
subtitle: 'פנה למנהל הארגון שלך לקבלת הזמנה.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/hi-IN.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -875,6 +875,10 @@ export const hiIN: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'आपको किसी संगठन से संबंधित होना चाहिए',
subtitle: 'आमंत्रण के लिए अपने संगठन के व्यवस्थापक से संपर्क करें।',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' feat(clerk-js,shared): Show message in `TaskChooseOrganization` on org creation disabled by LauraBeatris · Pull Request #7502 · clerk/javascript · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .changeset/nice-loops-fail.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
---
'@clerk/localizations': minor
'@clerk/clerk-js': minor
'@clerk/shared': minor
---

Display message in `TaskChooseOrganization` when user is not allowed to create organizations
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
import { useClerk, useSession, useUser } from '@clerk/shared/react';
import { useState } from 'react';
import { type ComponentType, useState } from 'react';

import { useSignOutContext, withCoreSessionSwitchGuard } from '@/ui/contexts';
import { descriptors, Flex, Flow, localizationKeys, Spinner } from '@/ui/customizables';
import { Card } from '@/ui/elements/Card';
import { withCardStateProvider } from '@/ui/elements/contexts';
import { Header } from '@/ui/elements/Header';
import { useMultipleSessions } from '@/ui/hooks/useMultipleSessions';
import { useOrganizationListInView } from '@/ui/hooks/useOrganizationListInView';

Expand All@@ -13,24 +14,10 @@ import { ChooseOrganizationScreen } from './ChooseOrganizationScreen';
import { CreateOrganizationScreen } from './CreateOrganizationScreen';

const TaskChooseOrganizationInternal = () => {
const { signOut } = useClerk();
const { user } = useUser();
const { session } = useSession();
const { userMemberships, userSuggestions, userInvitations } = useOrganizationListInView();
const { otherSessions } = useMultipleSessions({ user });
const { navigateAfterSignOut, navigateAfterMultiSessionSingleSignOutUrl } = useSignOutContext();

const handleSignOut = () => {
if (otherSessions.length === 0) {
return signOut(navigateAfterSignOut);
}

return signOut(navigateAfterMultiSessionSingleSignOutUrl, { sessionId: session?.id });
};

const isLoading = userMemberships?.isLoading || userInvitations?.isLoading || userSuggestions?.isLoading;
const hasExistingResources = !!(userMemberships?.count || userInvitations?.count || userSuggestions?.count);
const identifier = user?.primaryEmailAddress?.emailAddress ?? user?.username;

return (
<Flow.Root flow='taskChooseOrganization'>
Expand DownExpand Up@@ -58,34 +45,56 @@ const TaskChooseOrganizationInternal = () => {
)}
</Card.Content>

<Card.Footer>
<Card.Action
elementId='signOut'
gap={2}
justify='center'
sx={() => ({ width: '100%' })}
>
{identifier && (
<Card.ActionText
truncate
localizationKey={localizationKeys('taskChooseOrganization.signOut.actionText', {
identifier,
})}
/>
)}
<Card.ActionLink
sx={() => ({ flexShrink: 0 })}
onClick={handleSignOut}
localizationKey={localizationKeys('taskChooseOrganization.signOut.actionLink')}
/>
</Card.Action>
</Card.Footer>
<TaskChooseOrganizationCardFooter />
</Card.Root>
</Flow.Part>
</Flow.Root>
);
};

const TaskChooseOrganizationCardFooter = () => {
const { signOut } = useClerk();
const { user } = useUser();
const { session } = useSession();
const { otherSessions } = useMultipleSessions({ user });
const { navigateAfterSignOut, navigateAfterMultiSessionSingleSignOutUrl } = useSignOutContext();

const handleSignOut = () => {
if (otherSessions.length === 0) {
return signOut(navigateAfterSignOut);
}

return signOut(navigateAfterMultiSessionSingleSignOutUrl, { sessionId: session?.id });
};

const identifier = user?.primaryEmailAddress?.emailAddress ?? user?.username;

return (
<Card.Footer>
<Card.Action
elementId='signOut'
gap={2}
justify='center'
sx={() => ({ width: '100%' })}
>
{identifier && (
<Card.ActionText
truncate
localizationKey={localizationKeys('taskChooseOrganization.signOut.actionText', {
identifier,
})}
/>
)}
<Card.ActionLink
sx={() => ({ flexShrink: 0 })}
onClick={handleSignOut}
localizationKey={localizationKeys('taskChooseOrganization.signOut.actionLink')}
/>
</Card.Action>
</Card.Footer>
);
};

type TaskChooseOrganizationFlowsProps = {
initialFlow: 'create' | 'choose';
};
Expand All@@ -104,6 +113,44 @@ const TaskChooseOrganizationFlows = withCardStateProvider((props: TaskChooseOrga
return <ChooseOrganizationScreen onCreateOrganizationClick={() => setCurrentFlow('create')} />;
});

export const withOrganizationCreationEnabledGuard = <T extends object>(Component: ComponentType<T>) => {
return (props: T) => {
const { user } = useUser();

if (!user?.createOrganizationEnabled) {
return <OrganizationCreationDisabledScreen />;
}

return <Component {...props} />;
};
};

function OrganizationCreationDisabledScreen() {
return (
<Flow.Root flow='taskChooseOrganization'>
<Flow.Part part='organizationCreationDisabled'>
<Card.Root>
<Card.Content>
<Header.Root showLogo>
<Header.Title
localizationKey={localizationKeys('taskChooseOrganization.organizationCreationDisabled.title')}
/>
<Header.Subtitle
localizationKey={localizationKeys('taskChooseOrganization.organizationCreationDisabled.subtitle')}
/>
</Header.Root>
</Card.Content>

<TaskChooseOrganizationCardFooter />
</Card.Root>
</Flow.Part>
</Flow.Root>
);
}

export const TaskChooseOrganization = withCoreSessionSwitchGuard(
withTaskGuard(withCardStateProvider(TaskChooseOrganizationInternal), 'choose-organization'),
withTaskGuard(
withCardStateProvider(withOrganizationCreationEnabledGuard(TaskChooseOrganizationInternal)),
'choose-organization',
),
);
1 change: 1 addition & 0 deletions packages/clerk-js/src/ui/elements/contexts/index.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -128,6 +128,7 @@ export type FlowMetadata = {
| 'complete'
| 'accountSwitcher'
| 'chooseOrganization'
| 'organizationCreationDisabled'
| 'enterpriseConnections'
| 'chooseWallet';
};
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/ar-SA.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -867,6 +867,10 @@ export const arSA: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'يجب أن تنتمي إلى منظمة',
subtitle: 'تواصل مع مسؤول منظمتك للحصول على دعوة.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/be-BY.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -875,6 +875,10 @@ export const beBY: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Вы павінны належаць да арганізацыі',
subtitle: 'Звярніцеся да адміністратара вашай арганізацыі для атрымання запрашэння.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/bg-BG.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -871,6 +871,10 @@ export const bgBG: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Трябва да принадлежите към организация',
subtitle: 'Свържете се с администратора на вашата организация за покана.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/bn-IN.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -875,6 +875,10 @@ export const bnIN: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'আপনাকে অবশ্যই একটি সংগঠনের অন্তর্ভুক্ত হতে হবে',
subtitle: 'আমন্ত্রণের জন্য আপনার সংগঠনের প্রশাসকের সাথে যোগাযোগ করুন।',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/ca-ES.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -870,6 +870,10 @@ export const caES: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Heu de pertànyer a una organització',
subtitle: "Contacteu amb l'administrador de la vostra organització per obtenir una invitació.",
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/cs-CZ.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -881,6 +881,10 @@ export const csCZ: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Musíte patřit do organizace',
subtitle: 'Kontaktujte administrátora vaší organizace pro pozvánku.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/da-DK.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -868,6 +868,10 @@ export const daDK: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Du skal tilhøre en organisation',
subtitle: 'Kontakt din organisationsadministrator for en invitation.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/de-DE.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -885,6 +885,10 @@ export const deDE: LocalizationResource = {
subtitle: 'Geben Sie Ihre Organisationsdetails ein, um fortzufahren',
title: 'Organisation einrichten',
},
organizationCreationDisabled: {
title: 'Sie müssen einer Organisation angehören',
subtitle: 'Kontaktieren Sie Ihren Organisationsadministrator für eine Einladung.',
},
signOut: {
actionLink: 'Abmelden',
actionText: 'Angemeldet als {{identifier}}',
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/el-GR.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -872,6 +872,10 @@ export const elGR: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Πρέπει να ανήκετε σε έναν οργανισμό',
subtitle: 'Επικοινωνήστε με τον διαχειριστή του οργανισμού σας για πρόσκληση.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/en-GB.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -872,6 +872,10 @@ export const enGB: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'You must belong to an organisation',
subtitle: 'Contact your organisation admin for an invitation.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/en-US.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -869,6 +869,10 @@ export const enUS: LocalizationResource = {
subtitle: 'Enter your organization details to continue',
title: 'Setup your organization',
},
organizationCreationDisabled: {
title: 'You must belong to an organization',
subtitle: 'Contact your organization admin for an invitation.',
},
signOut: {
actionLink: 'Sign out',
actionText: 'Signed in as {{identifier}}',
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/es-CR.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -877,6 +877,10 @@ export const esCR: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Debe pertenecer a una organización',
subtitle: 'Contacte al administrador de su organización para obtener una invitación.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/es-ES.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -871,6 +871,10 @@ export const esES: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Debe pertenecer a una organización',
subtitle: 'Contacte al administrador de su organización para obtener una invitación.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/es-MX.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -878,6 +878,10 @@ export const esMX: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Debe pertenecer a una organización',
subtitle: 'Contacte al administrador de su organización para obtener una invitación.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/es-UY.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -877,6 +877,10 @@ export const esUY: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Debés pertenecer a una organización',
subtitle: 'Contactá al administrador de tu organización para obtener una invitación.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/fa-IR.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -881,6 +881,10 @@ export const faIR: LocalizationResource = {
subtitle: 'سازمان جدیدی برای شروع کار ایجاد کنید',
title: 'ایجاد سازمان جدید',
},
organizationCreationDisabled: {
title: 'شما باید عضو یک سازمان باشید',
subtitle: 'برای دریافت دعوتنامه با مدیر سازمان خود تماس بگیرید.',
},
signOut: {
actionLink: 'خروج از همه حساب‌ها',
actionText: 'می‌خواهید خارج شوید؟',
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/fi-FI.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -871,6 +871,10 @@ export const fiFI: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Sinun täytyy kuulua organisaatioon',
subtitle: 'Ota yhteyttä organisaatiosi ylläpitäjään saadaksesi kutsun.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/fr-FR.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -886,6 +886,10 @@ export const frFR: LocalizationResource = {
subtitle: 'Entrez les détails de votre organisation pour continuer',
title: 'Configurer votre organisation',
},
organizationCreationDisabled: {
title: 'Vous devez appartenir à une organisation',
subtitle: "Contactez l'administrateur de votre organisation pour obtenir une invitation.",
},
signOut: {
actionLink: 'Se déconnecter',
actionText: 'Connecté en tant que {{identifier}}',
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/he-IL.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -861,6 +861,10 @@ export const heIL: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'עליך להשתייך לארגון',
subtitle: 'פנה למנהל הארגון שלך לקבלת הזמנה.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/hi-IN.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -875,6 +875,10 @@ export const hiIN: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'आपको किसी संगठन से संबंधित होना चाहिए',
subtitle: 'आमंत्रण के लिए अपने संगठन के व्यवस्थापक से संपर्क करें।',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' feat(clerk-js,shared): Show message in `TaskChooseOrganization` on org creation disabled by LauraBeatris · Pull Request #7502 · clerk/javascript · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .changeset/nice-loops-fail.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
---
'@clerk/localizations': minor
'@clerk/clerk-js': minor
'@clerk/shared': minor
---

Display message in `TaskChooseOrganization` when user is not allowed to create organizations
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
import { useClerk, useSession, useUser } from '@clerk/shared/react';
import { useState } from 'react';
import { type ComponentType, useState } from 'react';

import { useSignOutContext, withCoreSessionSwitchGuard } from '@/ui/contexts';
import { descriptors, Flex, Flow, localizationKeys, Spinner } from '@/ui/customizables';
import { Card } from '@/ui/elements/Card';
import { withCardStateProvider } from '@/ui/elements/contexts';
import { Header } from '@/ui/elements/Header';
import { useMultipleSessions } from '@/ui/hooks/useMultipleSessions';
import { useOrganizationListInView } from '@/ui/hooks/useOrganizationListInView';

Expand All@@ -13,24 +14,10 @@ import { ChooseOrganizationScreen } from './ChooseOrganizationScreen';
import { CreateOrganizationScreen } from './CreateOrganizationScreen';

const TaskChooseOrganizationInternal = () => {
const { signOut } = useClerk();
const { user } = useUser();
const { session } = useSession();
const { userMemberships, userSuggestions, userInvitations } = useOrganizationListInView();
const { otherSessions } = useMultipleSessions({ user });
const { navigateAfterSignOut, navigateAfterMultiSessionSingleSignOutUrl } = useSignOutContext();

const handleSignOut = () => {
if (otherSessions.length === 0) {
return signOut(navigateAfterSignOut);
}

return signOut(navigateAfterMultiSessionSingleSignOutUrl, { sessionId: session?.id });
};

const isLoading = userMemberships?.isLoading || userInvitations?.isLoading || userSuggestions?.isLoading;
const hasExistingResources = !!(userMemberships?.count || userInvitations?.count || userSuggestions?.count);
const identifier = user?.primaryEmailAddress?.emailAddress ?? user?.username;

return (
<Flow.Root flow='taskChooseOrganization'>
Expand DownExpand Up@@ -58,34 +45,56 @@ const TaskChooseOrganizationInternal = () => {
)}
</Card.Content>

<Card.Footer>
<Card.Action
elementId='signOut'
gap={2}
justify='center'
sx={() => ({ width: '100%' })}
>
{identifier && (
<Card.ActionText
truncate
localizationKey={localizationKeys('taskChooseOrganization.signOut.actionText', {
identifier,
})}
/>
)}
<Card.ActionLink
sx={() => ({ flexShrink: 0 })}
onClick={handleSignOut}
localizationKey={localizationKeys('taskChooseOrganization.signOut.actionLink')}
/>
</Card.Action>
</Card.Footer>
<TaskChooseOrganizationCardFooter />
</Card.Root>
</Flow.Part>
</Flow.Root>
);
};

const TaskChooseOrganizationCardFooter = () => {
const { signOut } = useClerk();
const { user } = useUser();
const { session } = useSession();
const { otherSessions } = useMultipleSessions({ user });
const { navigateAfterSignOut, navigateAfterMultiSessionSingleSignOutUrl } = useSignOutContext();

const handleSignOut = () => {
if (otherSessions.length === 0) {
return signOut(navigateAfterSignOut);
}

return signOut(navigateAfterMultiSessionSingleSignOutUrl, { sessionId: session?.id });
};

const identifier = user?.primaryEmailAddress?.emailAddress ?? user?.username;

return (
<Card.Footer>
<Card.Action
elementId='signOut'
gap={2}
justify='center'
sx={() => ({ width: '100%' })}
>
{identifier && (
<Card.ActionText
truncate
localizationKey={localizationKeys('taskChooseOrganization.signOut.actionText', {
identifier,
})}
/>
)}
<Card.ActionLink
sx={() => ({ flexShrink: 0 })}
onClick={handleSignOut}
localizationKey={localizationKeys('taskChooseOrganization.signOut.actionLink')}
/>
</Card.Action>
</Card.Footer>
);
};

type TaskChooseOrganizationFlowsProps = {
initialFlow: 'create' | 'choose';
};
Expand All@@ -104,6 +113,44 @@ const TaskChooseOrganizationFlows = withCardStateProvider((props: TaskChooseOrga
return <ChooseOrganizationScreen onCreateOrganizationClick={() => setCurrentFlow('create')} />;
});

export const withOrganizationCreationEnabledGuard = <T extends object>(Component: ComponentType<T>) => {
return (props: T) => {
const { user } = useUser();

if (!user?.createOrganizationEnabled) {
return <OrganizationCreationDisabledScreen />;
}

return <Component {...props} />;
};
};

function OrganizationCreationDisabledScreen() {
return (
<Flow.Root flow='taskChooseOrganization'>
<Flow.Part part='organizationCreationDisabled'>
<Card.Root>
<Card.Content>
<Header.Root showLogo>
<Header.Title
localizationKey={localizationKeys('taskChooseOrganization.organizationCreationDisabled.title')}
/>
<Header.Subtitle
localizationKey={localizationKeys('taskChooseOrganization.organizationCreationDisabled.subtitle')}
/>
</Header.Root>
</Card.Content>

<TaskChooseOrganizationCardFooter />
</Card.Root>
</Flow.Part>
</Flow.Root>
);
}

export const TaskChooseOrganization = withCoreSessionSwitchGuard(
withTaskGuard(withCardStateProvider(TaskChooseOrganizationInternal), 'choose-organization'),
withTaskGuard(
withCardStateProvider(withOrganizationCreationEnabledGuard(TaskChooseOrganizationInternal)),
'choose-organization',
),
);
1 change: 1 addition & 0 deletions packages/clerk-js/src/ui/elements/contexts/index.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -128,6 +128,7 @@ export type FlowMetadata = {
| 'complete'
| 'accountSwitcher'
| 'chooseOrganization'
| 'organizationCreationDisabled'
| 'enterpriseConnections'
| 'chooseWallet';
};
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/ar-SA.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -867,6 +867,10 @@ export const arSA: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'يجب أن تنتمي إلى منظمة',
subtitle: 'تواصل مع مسؤول منظمتك للحصول على دعوة.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/be-BY.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -875,6 +875,10 @@ export const beBY: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Вы павінны належаць да арганізацыі',
subtitle: 'Звярніцеся да адміністратара вашай арганізацыі для атрымання запрашэння.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/bg-BG.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -871,6 +871,10 @@ export const bgBG: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Трябва да принадлежите към организация',
subtitle: 'Свържете се с администратора на вашата организация за покана.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/bn-IN.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -875,6 +875,10 @@ export const bnIN: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'আপনাকে অবশ্যই একটি সংগঠনের অন্তর্ভুক্ত হতে হবে',
subtitle: 'আমন্ত্রণের জন্য আপনার সংগঠনের প্রশাসকের সাথে যোগাযোগ করুন।',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/ca-ES.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -870,6 +870,10 @@ export const caES: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Heu de pertànyer a una organització',
subtitle: "Contacteu amb l'administrador de la vostra organització per obtenir una invitació.",
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/cs-CZ.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -881,6 +881,10 @@ export const csCZ: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Musíte patřit do organizace',
subtitle: 'Kontaktujte administrátora vaší organizace pro pozvánku.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/da-DK.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -868,6 +868,10 @@ export const daDK: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Du skal tilhøre en organisation',
subtitle: 'Kontakt din organisationsadministrator for en invitation.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/de-DE.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -885,6 +885,10 @@ export const deDE: LocalizationResource = {
subtitle: 'Geben Sie Ihre Organisationsdetails ein, um fortzufahren',
title: 'Organisation einrichten',
},
organizationCreationDisabled: {
title: 'Sie müssen einer Organisation angehören',
subtitle: 'Kontaktieren Sie Ihren Organisationsadministrator für eine Einladung.',
},
signOut: {
actionLink: 'Abmelden',
actionText: 'Angemeldet als {{identifier}}',
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/el-GR.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -872,6 +872,10 @@ export const elGR: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Πρέπει να ανήκετε σε έναν οργανισμό',
subtitle: 'Επικοινωνήστε με τον διαχειριστή του οργανισμού σας για πρόσκληση.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/en-GB.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -872,6 +872,10 @@ export const enGB: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'You must belong to an organisation',
subtitle: 'Contact your organisation admin for an invitation.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/en-US.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -869,6 +869,10 @@ export const enUS: LocalizationResource = {
subtitle: 'Enter your organization details to continue',
title: 'Setup your organization',
},
organizationCreationDisabled: {
title: 'You must belong to an organization',
subtitle: 'Contact your organization admin for an invitation.',
},
signOut: {
actionLink: 'Sign out',
actionText: 'Signed in as {{identifier}}',
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/es-CR.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -877,6 +877,10 @@ export const esCR: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Debe pertenecer a una organización',
subtitle: 'Contacte al administrador de su organización para obtener una invitación.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/es-ES.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -871,6 +871,10 @@ export const esES: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Debe pertenecer a una organización',
subtitle: 'Contacte al administrador de su organización para obtener una invitación.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/es-MX.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -878,6 +878,10 @@ export const esMX: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Debe pertenecer a una organización',
subtitle: 'Contacte al administrador de su organización para obtener una invitación.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/es-UY.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -877,6 +877,10 @@ export const esUY: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Debés pertenecer a una organización',
subtitle: 'Contactá al administrador de tu organización para obtener una invitación.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/fa-IR.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -881,6 +881,10 @@ export const faIR: LocalizationResource = {
subtitle: 'سازمان جدیدی برای شروع کار ایجاد کنید',
title: 'ایجاد سازمان جدید',
},
organizationCreationDisabled: {
title: 'شما باید عضو یک سازمان باشید',
subtitle: 'برای دریافت دعوتنامه با مدیر سازمان خود تماس بگیرید.',
},
signOut: {
actionLink: 'خروج از همه حساب‌ها',
actionText: 'می‌خواهید خارج شوید؟',
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/fi-FI.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -871,6 +871,10 @@ export const fiFI: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Sinun täytyy kuulua organisaatioon',
subtitle: 'Ota yhteyttä organisaatiosi ylläpitäjään saadaksesi kutsun.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/fr-FR.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -886,6 +886,10 @@ export const frFR: LocalizationResource = {
subtitle: 'Entrez les détails de votre organisation pour continuer',
title: 'Configurer votre organisation',
},
organizationCreationDisabled: {
title: 'Vous devez appartenir à une organisation',
subtitle: "Contactez l'administrateur de votre organisation pour obtenir une invitation.",
},
signOut: {
actionLink: 'Se déconnecter',
actionText: 'Connecté en tant que {{identifier}}',
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/he-IL.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -861,6 +861,10 @@ export const heIL: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'עליך להשתייך לארגון',
subtitle: 'פנה למנהל הארגון שלך לקבלת הזמנה.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/hi-IN.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -875,6 +875,10 @@ export const hiIN: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'आपको किसी संगठन से संबंधित होना चाहिए',
subtitle: 'आमंत्रण के लिए अपने संगठन के व्यवस्थापक से संपर्क करें।',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' feat(clerk-js,shared): Show message in `TaskChooseOrganization` on org creation disabled by LauraBeatris · Pull Request #7502 · clerk/javascript · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .changeset/nice-loops-fail.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
---
'@clerk/localizations': minor
'@clerk/clerk-js': minor
'@clerk/shared': minor
---

Display message in `TaskChooseOrganization` when user is not allowed to create organizations
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
import { useClerk, useSession, useUser } from '@clerk/shared/react';
import { useState } from 'react';
import { type ComponentType, useState } from 'react';

import { useSignOutContext, withCoreSessionSwitchGuard } from '@/ui/contexts';
import { descriptors, Flex, Flow, localizationKeys, Spinner } from '@/ui/customizables';
import { Card } from '@/ui/elements/Card';
import { withCardStateProvider } from '@/ui/elements/contexts';
import { Header } from '@/ui/elements/Header';
import { useMultipleSessions } from '@/ui/hooks/useMultipleSessions';
import { useOrganizationListInView } from '@/ui/hooks/useOrganizationListInView';

Expand All@@ -13,24 +14,10 @@ import { ChooseOrganizationScreen } from './ChooseOrganizationScreen';
import { CreateOrganizationScreen } from './CreateOrganizationScreen';

const TaskChooseOrganizationInternal = () => {
const { signOut } = useClerk();
const { user } = useUser();
const { session } = useSession();
const { userMemberships, userSuggestions, userInvitations } = useOrganizationListInView();
const { otherSessions } = useMultipleSessions({ user });
const { navigateAfterSignOut, navigateAfterMultiSessionSingleSignOutUrl } = useSignOutContext();

const handleSignOut = () => {
if (otherSessions.length === 0) {
return signOut(navigateAfterSignOut);
}

return signOut(navigateAfterMultiSessionSingleSignOutUrl, { sessionId: session?.id });
};

const isLoading = userMemberships?.isLoading || userInvitations?.isLoading || userSuggestions?.isLoading;
const hasExistingResources = !!(userMemberships?.count || userInvitations?.count || userSuggestions?.count);
const identifier = user?.primaryEmailAddress?.emailAddress ?? user?.username;

return (
<Flow.Root flow='taskChooseOrganization'>
Expand DownExpand Up@@ -58,34 +45,56 @@ const TaskChooseOrganizationInternal = () => {
)}
</Card.Content>

<Card.Footer>
<Card.Action
elementId='signOut'
gap={2}
justify='center'
sx={() => ({ width: '100%' })}
>
{identifier && (
<Card.ActionText
truncate
localizationKey={localizationKeys('taskChooseOrganization.signOut.actionText', {
identifier,
})}
/>
)}
<Card.ActionLink
sx={() => ({ flexShrink: 0 })}
onClick={handleSignOut}
localizationKey={localizationKeys('taskChooseOrganization.signOut.actionLink')}
/>
</Card.Action>
</Card.Footer>
<TaskChooseOrganizationCardFooter />
</Card.Root>
</Flow.Part>
</Flow.Root>
);
};

const TaskChooseOrganizationCardFooter = () => {
const { signOut } = useClerk();
const { user } = useUser();
const { session } = useSession();
const { otherSessions } = useMultipleSessions({ user });
const { navigateAfterSignOut, navigateAfterMultiSessionSingleSignOutUrl } = useSignOutContext();

const handleSignOut = () => {
if (otherSessions.length === 0) {
return signOut(navigateAfterSignOut);
}

return signOut(navigateAfterMultiSessionSingleSignOutUrl, { sessionId: session?.id });
};

const identifier = user?.primaryEmailAddress?.emailAddress ?? user?.username;

return (
<Card.Footer>
<Card.Action
elementId='signOut'
gap={2}
justify='center'
sx={() => ({ width: '100%' })}
>
{identifier && (
<Card.ActionText
truncate
localizationKey={localizationKeys('taskChooseOrganization.signOut.actionText', {
identifier,
})}
/>
)}
<Card.ActionLink
sx={() => ({ flexShrink: 0 })}
onClick={handleSignOut}
localizationKey={localizationKeys('taskChooseOrganization.signOut.actionLink')}
/>
</Card.Action>
</Card.Footer>
);
};

type TaskChooseOrganizationFlowsProps = {
initialFlow: 'create' | 'choose';
};
Expand All@@ -104,6 +113,44 @@ const TaskChooseOrganizationFlows = withCardStateProvider((props: TaskChooseOrga
return <ChooseOrganizationScreen onCreateOrganizationClick={() => setCurrentFlow('create')} />;
});

export const withOrganizationCreationEnabledGuard = <T extends object>(Component: ComponentType<T>) => {
return (props: T) => {
const { user } = useUser();

if (!user?.createOrganizationEnabled) {
return <OrganizationCreationDisabledScreen />;
}

return <Component {...props} />;
};
};

function OrganizationCreationDisabledScreen() {
return (
<Flow.Root flow='taskChooseOrganization'>
<Flow.Part part='organizationCreationDisabled'>
<Card.Root>
<Card.Content>
<Header.Root showLogo>
<Header.Title
localizationKey={localizationKeys('taskChooseOrganization.organizationCreationDisabled.title')}
/>
<Header.Subtitle
localizationKey={localizationKeys('taskChooseOrganization.organizationCreationDisabled.subtitle')}
/>
</Header.Root>
</Card.Content>

<TaskChooseOrganizationCardFooter />
</Card.Root>
</Flow.Part>
</Flow.Root>
);
}

export const TaskChooseOrganization = withCoreSessionSwitchGuard(
withTaskGuard(withCardStateProvider(TaskChooseOrganizationInternal), 'choose-organization'),
withTaskGuard(
withCardStateProvider(withOrganizationCreationEnabledGuard(TaskChooseOrganizationInternal)),
'choose-organization',
),
);
1 change: 1 addition & 0 deletions packages/clerk-js/src/ui/elements/contexts/index.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -128,6 +128,7 @@ export type FlowMetadata = {
| 'complete'
| 'accountSwitcher'
| 'chooseOrganization'
| 'organizationCreationDisabled'
| 'enterpriseConnections'
| 'chooseWallet';
};
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/ar-SA.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -867,6 +867,10 @@ export const arSA: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'يجب أن تنتمي إلى منظمة',
subtitle: 'تواصل مع مسؤول منظمتك للحصول على دعوة.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/be-BY.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -875,6 +875,10 @@ export const beBY: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Вы павінны належаць да арганізацыі',
subtitle: 'Звярніцеся да адміністратара вашай арганізацыі для атрымання запрашэння.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/bg-BG.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -871,6 +871,10 @@ export const bgBG: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Трябва да принадлежите към организация',
subtitle: 'Свържете се с администратора на вашата организация за покана.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/bn-IN.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -875,6 +875,10 @@ export const bnIN: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'আপনাকে অবশ্যই একটি সংগঠনের অন্তর্ভুক্ত হতে হবে',
subtitle: 'আমন্ত্রণের জন্য আপনার সংগঠনের প্রশাসকের সাথে যোগাযোগ করুন।',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/ca-ES.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -870,6 +870,10 @@ export const caES: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Heu de pertànyer a una organització',
subtitle: "Contacteu amb l'administrador de la vostra organització per obtenir una invitació.",
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/cs-CZ.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -881,6 +881,10 @@ export const csCZ: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Musíte patřit do organizace',
subtitle: 'Kontaktujte administrátora vaší organizace pro pozvánku.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/da-DK.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -868,6 +868,10 @@ export const daDK: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Du skal tilhøre en organisation',
subtitle: 'Kontakt din organisationsadministrator for en invitation.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/de-DE.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -885,6 +885,10 @@ export const deDE: LocalizationResource = {
subtitle: 'Geben Sie Ihre Organisationsdetails ein, um fortzufahren',
title: 'Organisation einrichten',
},
organizationCreationDisabled: {
title: 'Sie müssen einer Organisation angehören',
subtitle: 'Kontaktieren Sie Ihren Organisationsadministrator für eine Einladung.',
},
signOut: {
actionLink: 'Abmelden',
actionText: 'Angemeldet als {{identifier}}',
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/el-GR.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -872,6 +872,10 @@ export const elGR: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Πρέπει να ανήκετε σε έναν οργανισμό',
subtitle: 'Επικοινωνήστε με τον διαχειριστή του οργανισμού σας για πρόσκληση.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/en-GB.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -872,6 +872,10 @@ export const enGB: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'You must belong to an organisation',
subtitle: 'Contact your organisation admin for an invitation.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/en-US.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -869,6 +869,10 @@ export const enUS: LocalizationResource = {
subtitle: 'Enter your organization details to continue',
title: 'Setup your organization',
},
organizationCreationDisabled: {
title: 'You must belong to an organization',
subtitle: 'Contact your organization admin for an invitation.',
},
signOut: {
actionLink: 'Sign out',
actionText: 'Signed in as {{identifier}}',
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/es-CR.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -877,6 +877,10 @@ export const esCR: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Debe pertenecer a una organización',
subtitle: 'Contacte al administrador de su organización para obtener una invitación.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/es-ES.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -871,6 +871,10 @@ export const esES: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Debe pertenecer a una organización',
subtitle: 'Contacte al administrador de su organización para obtener una invitación.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/es-MX.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -878,6 +878,10 @@ export const esMX: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Debe pertenecer a una organización',
subtitle: 'Contacte al administrador de su organización para obtener una invitación.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/es-UY.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -877,6 +877,10 @@ export const esUY: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Debés pertenecer a una organización',
subtitle: 'Contactá al administrador de tu organización para obtener una invitación.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/fa-IR.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -881,6 +881,10 @@ export const faIR: LocalizationResource = {
subtitle: 'سازمان جدیدی برای شروع کار ایجاد کنید',
title: 'ایجاد سازمان جدید',
},
organizationCreationDisabled: {
title: 'شما باید عضو یک سازمان باشید',
subtitle: 'برای دریافت دعوتنامه با مدیر سازمان خود تماس بگیرید.',
},
signOut: {
actionLink: 'خروج از همه حساب‌ها',
actionText: 'می‌خواهید خارج شوید؟',
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/fi-FI.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -871,6 +871,10 @@ export const fiFI: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Sinun täytyy kuulua organisaatioon',
subtitle: 'Ota yhteyttä organisaatiosi ylläpitäjään saadaksesi kutsun.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/fr-FR.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -886,6 +886,10 @@ export const frFR: LocalizationResource = {
subtitle: 'Entrez les détails de votre organisation pour continuer',
title: 'Configurer votre organisation',
},
organizationCreationDisabled: {
title: 'Vous devez appartenir à une organisation',
subtitle: "Contactez l'administrateur de votre organisation pour obtenir une invitation.",
},
signOut: {
actionLink: 'Se déconnecter',
actionText: 'Connecté en tant que {{identifier}}',
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/he-IL.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -861,6 +861,10 @@ export const heIL: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'עליך להשתייך לארגון',
subtitle: 'פנה למנהל הארגון שלך לקבלת הזמנה.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/hi-IN.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -875,6 +875,10 @@ export const hiIN: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'आपको किसी संगठन से संबंधित होना चाहिए',
subtitle: 'आमंत्रण के लिए अपने संगठन के व्यवस्थापक से संपर्क करें।',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); feat(clerk-js,shared): Show message in `TaskChooseOrganization` on org creation disabled by LauraBeatris · Pull Request #7502 · clerk/javascript · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .changeset/nice-loops-fail.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
---
'@clerk/localizations': minor
'@clerk/clerk-js': minor
'@clerk/shared': minor
---

Display message in `TaskChooseOrganization` when user is not allowed to create organizations
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
import { useClerk, useSession, useUser } from '@clerk/shared/react';
import { useState } from 'react';
import { type ComponentType, useState } from 'react';

import { useSignOutContext, withCoreSessionSwitchGuard } from '@/ui/contexts';
import { descriptors, Flex, Flow, localizationKeys, Spinner } from '@/ui/customizables';
import { Card } from '@/ui/elements/Card';
import { withCardStateProvider } from '@/ui/elements/contexts';
import { Header } from '@/ui/elements/Header';
import { useMultipleSessions } from '@/ui/hooks/useMultipleSessions';
import { useOrganizationListInView } from '@/ui/hooks/useOrganizationListInView';

Expand All@@ -13,24 +14,10 @@ import { ChooseOrganizationScreen } from './ChooseOrganizationScreen';
import { CreateOrganizationScreen } from './CreateOrganizationScreen';

const TaskChooseOrganizationInternal = () => {
const { signOut } = useClerk();
const { user } = useUser();
const { session } = useSession();
const { userMemberships, userSuggestions, userInvitations } = useOrganizationListInView();
const { otherSessions } = useMultipleSessions({ user });
const { navigateAfterSignOut, navigateAfterMultiSessionSingleSignOutUrl } = useSignOutContext();

const handleSignOut = () => {
if (otherSessions.length === 0) {
return signOut(navigateAfterSignOut);
}

return signOut(navigateAfterMultiSessionSingleSignOutUrl, { sessionId: session?.id });
};

const isLoading = userMemberships?.isLoading || userInvitations?.isLoading || userSuggestions?.isLoading;
const hasExistingResources = !!(userMemberships?.count || userInvitations?.count || userSuggestions?.count);
const identifier = user?.primaryEmailAddress?.emailAddress ?? user?.username;

return (
<Flow.Root flow='taskChooseOrganization'>
Expand DownExpand Up@@ -58,34 +45,56 @@ const TaskChooseOrganizationInternal = () => {
)}
</Card.Content>

<Card.Footer>
<Card.Action
elementId='signOut'
gap={2}
justify='center'
sx={() => ({ width: '100%' })}
>
{identifier && (
<Card.ActionText
truncate
localizationKey={localizationKeys('taskChooseOrganization.signOut.actionText', {
identifier,
})}
/>
)}
<Card.ActionLink
sx={() => ({ flexShrink: 0 })}
onClick={handleSignOut}
localizationKey={localizationKeys('taskChooseOrganization.signOut.actionLink')}
/>
</Card.Action>
</Card.Footer>
<TaskChooseOrganizationCardFooter />
</Card.Root>
</Flow.Part>
</Flow.Root>
);
};

const TaskChooseOrganizationCardFooter = () => {
const { signOut } = useClerk();
const { user } = useUser();
const { session } = useSession();
const { otherSessions } = useMultipleSessions({ user });
const { navigateAfterSignOut, navigateAfterMultiSessionSingleSignOutUrl } = useSignOutContext();

const handleSignOut = () => {
if (otherSessions.length === 0) {
return signOut(navigateAfterSignOut);
}

return signOut(navigateAfterMultiSessionSingleSignOutUrl, { sessionId: session?.id });
};

const identifier = user?.primaryEmailAddress?.emailAddress ?? user?.username;

return (
<Card.Footer>
<Card.Action
elementId='signOut'
gap={2}
justify='center'
sx={() => ({ width: '100%' })}
>
{identifier && (
<Card.ActionText
truncate
localizationKey={localizationKeys('taskChooseOrganization.signOut.actionText', {
identifier,
})}
/>
)}
<Card.ActionLink
sx={() => ({ flexShrink: 0 })}
onClick={handleSignOut}
localizationKey={localizationKeys('taskChooseOrganization.signOut.actionLink')}
/>
</Card.Action>
</Card.Footer>
);
};

type TaskChooseOrganizationFlowsProps = {
initialFlow: 'create' | 'choose';
};
Expand All@@ -104,6 +113,44 @@ const TaskChooseOrganizationFlows = withCardStateProvider((props: TaskChooseOrga
return <ChooseOrganizationScreen onCreateOrganizationClick={() => setCurrentFlow('create')} />;
});

export const withOrganizationCreationEnabledGuard = <T extends object>(Component: ComponentType<T>) => {
return (props: T) => {
const { user } = useUser();

if (!user?.createOrganizationEnabled) {
return <OrganizationCreationDisabledScreen />;
}

return <Component {...props} />;
};
};

function OrganizationCreationDisabledScreen() {
return (
<Flow.Root flow='taskChooseOrganization'>
<Flow.Part part='organizationCreationDisabled'>
<Card.Root>
<Card.Content>
<Header.Root showLogo>
<Header.Title
localizationKey={localizationKeys('taskChooseOrganization.organizationCreationDisabled.title')}
/>
<Header.Subtitle
localizationKey={localizationKeys('taskChooseOrganization.organizationCreationDisabled.subtitle')}
/>
</Header.Root>
</Card.Content>

<TaskChooseOrganizationCardFooter />
</Card.Root>
</Flow.Part>
</Flow.Root>
);
}

export const TaskChooseOrganization = withCoreSessionSwitchGuard(
withTaskGuard(withCardStateProvider(TaskChooseOrganizationInternal), 'choose-organization'),
withTaskGuard(
withCardStateProvider(withOrganizationCreationEnabledGuard(TaskChooseOrganizationInternal)),
'choose-organization',
),
);
1 change: 1 addition & 0 deletions packages/clerk-js/src/ui/elements/contexts/index.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -128,6 +128,7 @@ export type FlowMetadata = {
| 'complete'
| 'accountSwitcher'
| 'chooseOrganization'
| 'organizationCreationDisabled'
| 'enterpriseConnections'
| 'chooseWallet';
};
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/ar-SA.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -867,6 +867,10 @@ export const arSA: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'يجب أن تنتمي إلى منظمة',
subtitle: 'تواصل مع مسؤول منظمتك للحصول على دعوة.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/be-BY.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -875,6 +875,10 @@ export const beBY: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Вы павінны належаць да арганізацыі',
subtitle: 'Звярніцеся да адміністратара вашай арганізацыі для атрымання запрашэння.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/bg-BG.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -871,6 +871,10 @@ export const bgBG: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Трябва да принадлежите към организация',
subtitle: 'Свържете се с администратора на вашата организация за покана.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/bn-IN.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -875,6 +875,10 @@ export const bnIN: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'আপনাকে অবশ্যই একটি সংগঠনের অন্তর্ভুক্ত হতে হবে',
subtitle: 'আমন্ত্রণের জন্য আপনার সংগঠনের প্রশাসকের সাথে যোগাযোগ করুন।',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/ca-ES.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -870,6 +870,10 @@ export const caES: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Heu de pertànyer a una organització',
subtitle: "Contacteu amb l'administrador de la vostra organització per obtenir una invitació.",
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/cs-CZ.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -881,6 +881,10 @@ export const csCZ: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Musíte patřit do organizace',
subtitle: 'Kontaktujte administrátora vaší organizace pro pozvánku.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/da-DK.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -868,6 +868,10 @@ export const daDK: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Du skal tilhøre en organisation',
subtitle: 'Kontakt din organisationsadministrator for en invitation.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/de-DE.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -885,6 +885,10 @@ export const deDE: LocalizationResource = {
subtitle: 'Geben Sie Ihre Organisationsdetails ein, um fortzufahren',
title: 'Organisation einrichten',
},
organizationCreationDisabled: {
title: 'Sie müssen einer Organisation angehören',
subtitle: 'Kontaktieren Sie Ihren Organisationsadministrator für eine Einladung.',
},
signOut: {
actionLink: 'Abmelden',
actionText: 'Angemeldet als {{identifier}}',
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/el-GR.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -872,6 +872,10 @@ export const elGR: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Πρέπει να ανήκετε σε έναν οργανισμό',
subtitle: 'Επικοινωνήστε με τον διαχειριστή του οργανισμού σας για πρόσκληση.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/en-GB.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -872,6 +872,10 @@ export const enGB: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'You must belong to an organisation',
subtitle: 'Contact your organisation admin for an invitation.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/en-US.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -869,6 +869,10 @@ export const enUS: LocalizationResource = {
subtitle: 'Enter your organization details to continue',
title: 'Setup your organization',
},
organizationCreationDisabled: {
title: 'You must belong to an organization',
subtitle: 'Contact your organization admin for an invitation.',
},
signOut: {
actionLink: 'Sign out',
actionText: 'Signed in as {{identifier}}',
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/es-CR.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -877,6 +877,10 @@ export const esCR: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Debe pertenecer a una organización',
subtitle: 'Contacte al administrador de su organización para obtener una invitación.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/es-ES.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -871,6 +871,10 @@ export const esES: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Debe pertenecer a una organización',
subtitle: 'Contacte al administrador de su organización para obtener una invitación.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/es-MX.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -878,6 +878,10 @@ export const esMX: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Debe pertenecer a una organización',
subtitle: 'Contacte al administrador de su organización para obtener una invitación.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/es-UY.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -877,6 +877,10 @@ export const esUY: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Debés pertenecer a una organización',
subtitle: 'Contactá al administrador de tu organización para obtener una invitación.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/fa-IR.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -881,6 +881,10 @@ export const faIR: LocalizationResource = {
subtitle: 'سازمان جدیدی برای شروع کار ایجاد کنید',
title: 'ایجاد سازمان جدید',
},
organizationCreationDisabled: {
title: 'شما باید عضو یک سازمان باشید',
subtitle: 'برای دریافت دعوتنامه با مدیر سازمان خود تماس بگیرید.',
},
signOut: {
actionLink: 'خروج از همه حساب‌ها',
actionText: 'می‌خواهید خارج شوید؟',
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/fi-FI.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -871,6 +871,10 @@ export const fiFI: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'Sinun täytyy kuulua organisaatioon',
subtitle: 'Ota yhteyttä organisaatiosi ylläpitäjään saadaksesi kutsun.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/fr-FR.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -886,6 +886,10 @@ export const frFR: LocalizationResource = {
subtitle: 'Entrez les détails de votre organisation pour continuer',
title: 'Configurer votre organisation',
},
organizationCreationDisabled: {
title: 'Vous devez appartenir à une organisation',
subtitle: "Contactez l'administrateur de votre organisation pour obtenir une invitation.",
},
signOut: {
actionLink: 'Se déconnecter',
actionText: 'Connecté en tant que {{identifier}}',
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/he-IL.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -861,6 +861,10 @@ export const heIL: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'עליך להשתייך לארגון',
subtitle: 'פנה למנהל הארגון שלך לקבלת הזמנה.',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
4 changes: 4 additions & 0 deletions packages/localizations/src/hi-IN.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -875,6 +875,10 @@ export const hiIN: LocalizationResource = {
subtitle: undefined,
title: undefined,
},
organizationCreationDisabled: {
title: 'आपको किसी संगठन से संबंधित होना चाहिए',
subtitle: 'आमंत्रण के लिए अपने संगठन के व्यवस्थापक से संपर्क करें।',
},
signOut: {
actionLink: undefined,
actionText: undefined,
Expand Down
Loading