Skip to content
Closed
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
188 changes: 188 additions & 0 deletions docs/_partials/control-components-with-clerkfailed-clerkdegraded.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,188 @@
<If sdk="nextjs">
<CodeBlockTabs options={["App Router", "Pages Router"]}>
```tsx {{ filename: 'app/page.tsx' }}
import { ClerkLoaded, ClerkLoading, ClerkDegraded, ClerkFailed } from '@clerk/nextjs'

export default function Page() {
return (
<>
<ClerkLoading>
<p>Clerk is loading...</p>
</ClerkLoading>
<ClerkLoaded>
<p>Clerk has loaded (ready or degraded)</p>
<MyCustomSignInFlow />
<ClerkDegraded>
<p>Clerk is experiencing issues. Please try again later.</p>
</ClerkDegraded>
</ClerkLoaded>
<ClerkFailed>
<p>Something went wrong with Clerk. Please contact support.</p>
</ClerkFailed>
</>
)
}
```

```tsx {{ filename: 'pages/index.tsx' }}
import { ClerkLoaded, ClerkLoading, ClerkDegraded, ClerkFailed } from '@clerk/nextjs'

export default function Page() {
return (
<>
<ClerkLoading>
<p>Clerk is loading...</p>
</ClerkLoading>
<ClerkLoaded>
<p>Clerk has loaded (ready or degraded)</p>
<MyCustomSignInFlow />
<ClerkDegraded>
<p>Clerk is experiencing issues. Please try again later.</p>
</ClerkDegraded>
</ClerkLoaded>
<ClerkFailed>
<p>Something went wrong with Clerk. Please contact support.</p>
</ClerkFailed>
</>
)
}
```
</CodeBlockTabs>
</If>

<If sdk="react">
```tsx {{ filename: 'src/App.tsx' }}
import { ClerkLoaded, ClerkLoading, ClerkDegraded, ClerkFailed } from '@clerk/clerk-react'

export default function App() {
return (
<>
<ClerkLoading>
<p>Clerk is loading...</p>
</ClerkLoading>
<ClerkLoaded>
<p>Clerk has loaded (ready or degraded)</p>
<MyCustomSignInFlow />
<ClerkDegraded>
<p>Clerk is experiencing issues. Please try again later.</p>
</ClerkDegraded>
</ClerkLoaded>
<ClerkFailed>
<p>Something went wrong with Clerk. Please contact support.</p>
</ClerkFailed>
</>
)
}

export default App
```
</If>

<If sdk="react-router">
```tsx {{ filename: 'app/routes/example.tsx' }}
import { ClerkLoading, ClerkLoaded, ClerkDegraded, ClerkFailed } from '@clerk/react-router'

export default function Example() {
return (
<>
<ClerkLoading>
<p>Clerk is loading...</p>
</ClerkLoading>
<ClerkLoaded>
<p>Clerk has loaded (ready or degraded)</p>
<MyCustomSignInFlow />
<ClerkDegraded>
<p>Clerk is experiencing issues. Please try again later.</p>
</ClerkDegraded>
</ClerkLoaded>
<ClerkFailed>
<p>Something went wrong with Clerk. Please contact support.</p>
</ClerkFailed>
</>
)
}
```
</If>

<If sdk="chrome-extension">
```jsx {{ filename: 'src/routes/home.tsx' }}
import { ClerkLoaded, ClerkLoading, ClerkDegraded, ClerkFailed } from '@clerk/chrome-extension'

export default function Home() {
return (
<>
<ClerkLoading>
<p>Clerk is loading...</p>
</ClerkLoading>
<ClerkLoaded>
<p>Clerk has loaded (ready or degraded)</p>
<MyCustomSignInFlow />
<ClerkDegraded>
<p>Clerk is experiencing issues. Please try again later.</p>
</ClerkDegraded>
</ClerkLoaded>
<ClerkFailed>
<p>Something went wrong with Clerk. Please contact support.</p>
</ClerkFailed>
</>
)
}
```
</If>

<If sdk="remix">
```tsx {{ filename: 'app/routes/_index.tsx' }}
import { ClerkLoading, ClerkLoaded, ClerkDegraded, ClerkFailed } from '@clerk/remix'

export default function Index() {
return (
<>
<ClerkLoading>
<p>Clerk is loading...</p>
</ClerkLoading>
<ClerkLoaded>
<p>Clerk has loaded (ready or degraded)</p>
<MyCustomSignInFlow />
<ClerkDegraded>
<p>Clerk is experiencing issues. Please try again later.</p>
</ClerkDegraded>
</ClerkLoaded>
<ClerkFailed>
<p>Something went wrong with Clerk. Please contact support.</p>
</ClerkFailed>
</>
)
}
```
</If>

<If sdk="tanstack-react-start">
```tsx {{ filename: 'app/routes/index.tsx' }}
import { ClerkLoading, ClerkLoaded, ClerkDegraded, ClerkFailed } from '@clerk/tanstack-react-start'
import { createFileRoute } from '@tanstack/react-router'

export const Route = createFileRoute('/')({
component: Home,
})

function Home() {
return (
<>
<ClerkLoading>
<p>Clerk is loading...</p>
</ClerkLoading>
<ClerkLoaded>
<p>Clerk has loaded (ready or degraded)</p>
<MyCustomSignInFlow />
<ClerkDegraded>
<p>Clerk is experiencing issues. Please try again later.</p>
</ClerkDegraded>
</ClerkLoaded>
<ClerkFailed>
<p>Something went wrong with Clerk. Please contact support.</p>
</ClerkFailed>
</>
)
}
```
</If>
8 changes: 8 additions & 0 deletions docs/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -3174,6 +3174,14 @@
"title": "`<ClerkLoading>`",
"href": "/docs/reference/components/control/clerk-loading"
},
{
"title": "`<ClerkDegraded>`",
"href": "/docs/reference/components/control/clerk-degraded"
},
{
"title": "`<ClerkFailed>`",
"href": "/docs/reference/components/control/clerk-failed"
},
{
"title": "`<Protect>`",
"href": "/docs/reference/components/control/protect"
Expand Down
12 changes: 12 additions & 0 deletions docs/reference/components/control/clerk-degraded.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
---
title: '`<ClerkDegraded>`'
description: The `<ClerkDegraded>` component indicates that Clerk is partially operational.
---

The `<ClerkDegraded>` component indicates that Clerk is partially operational.

## Example

It's not recommended to wrap the entire app in the `<ClerkDegraded>` component; instead, only wrap the components that need access to the `Clerk` object.

<Include src="_partials/control-components-with-clerkfailed-clerkdegraded" />
12 changes: 12 additions & 0 deletions docs/reference/components/control/clerk-failed.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
---
title: '`<ClerkFailed>`'
description: The `<ClerkFailed>` component indicates that the Clerk object has failed to load.
---

The `<ClerkFailed>` component indicates that the Clerk object has failed to load. This is useful for displaying an error message to the user.

## Example

It's not recommended to wrap the entire app in the `<ClerkFailed>` component; instead, only wrap the components that need access to the `Clerk` object.

<Include src="_partials/control-components-with-clerkfailed-clerkdegraded" />
97 changes: 2 additions & 95 deletions docs/reference/components/control/clerk-loaded.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ description: The `<ClerkLoaded>` component guarantees that the Clerk object has
sdk: astro, chrome-extension, expo, nextjs, nuxt, react, react-router, remix, tanstack-react-start, vue, js-frontend
---

The `<ClerkLoaded>` component guarantees that the Clerk object has loaded and will be available under `window.Clerk`. This allows you to wrap child components to access the `Clerk` object without the need to check it exists.
The `<ClerkLoaded>` component guarantees that the Clerk object has loaded (the `status` is `'ready'` or `'degraded'`) and will be available under `window.Clerk`. This allows you to wrap child components to access the `Clerk` object without the need to check it exists.

<If
sdk={["astro", "chrome-extension", "expo", "nextjs", "nuxt", "react", "react-router", "remix", "tanstack-react-start", "vue"]}
Expand All @@ -13,79 +13,7 @@ The `<ClerkLoaded>` component guarantees that the Clerk object has loaded and wi

It's not recommended to wrap the entire app in the `<ClerkLoaded>` component; instead, only wrap the components that need access to the `Clerk` object.

<If sdk="nextjs">
```tsx {{ filename: 'app/page.tsx' }}
import { ClerkLoaded } from '@clerk/nextjs'

export default function Page() {
return (
<ClerkLoaded>
<p>Clerk has loaded</p>
</ClerkLoaded>
)
}
```
</If>

<If sdk="react">
```tsx {{ filename: 'src/App.tsx' }}
import { ClerkLoaded } from '@clerk/clerk-react'

function App() {
return (
<ClerkLoaded>
<p>Clerk has loaded</p>
</ClerkLoaded>
)
}

export default App
```
</If>

<If sdk="react-router">
```tsx {{ filename: 'app/routes/example.tsx' }}
import { ClerkLoaded } from '@clerk/react-router'

export default function Example() {
return (
<ClerkLoaded>
<p>Clerk has loaded</p>
</ClerkLoaded>
)
}
```
</If>

<If sdk="chrome-extension">
```jsx {{ filename: 'src/routes/home.tsx' }}
import { ClerkLoaded } from '@clerk/chrome-extension'

export default function Home() {
return (
<ClerkLoaded>
<p>Clerk has loaded</p>
</ClerkLoaded>
)
}
```
</If>

<If sdk="remix">
```tsx {{ filename: 'app/routes/_index.tsx' }}
import { ClerkLoaded } from '@clerk/remix'

export default function Index() {
return (
<div>
<ClerkLoaded>
<p>Clerk has loaded</p>
</ClerkLoaded>
</div>
)
}
```
</If>
<Include src="_partials/control-components-with-clerkfailed-clerkdegraded" />

<If sdk="astro">
> [!NOTE]
Expand Down Expand Up @@ -119,27 +47,6 @@ The `<ClerkLoaded>` component guarantees that the Clerk object has loaded and wi
```
</If>

<If sdk="tanstack-react-start">
```tsx {{ filename: 'app/routes/index.tsx' }}
import { ClerkLoaded } from '@clerk/tanstack-react-start'
import { createFileRoute } from '@tanstack/react-router'

export const Route = createFileRoute('/')({
component: Home,
})

function Home() {
return (
<div>
<ClerkLoaded>
<p>Clerk has loaded</p>
</ClerkLoaded>
</div>
)
}
```
</If>

<If sdk="vue">
```vue {{ filename: 'App.vue' }}
<script setup lang="ts">
Expand Down
Loading