mirror of
https://github.com/supabase/supabase.git
synced 2026-10-06 09:55:06 +03:00
## What kind of change does this PR introduce? Bug fix and design-system documentation update. ## What is the current behavior? Invite acceptance failures only appear in a transient toast. ## What is the new behavior? Invite failures remain visible beside the actions. The design-system guidance now distinguishes field, action, state, and toast feedback. | Before | After | | --- | --- | | <img width="759" height="619" alt="Join Organization Supabase" src="https://github.com/user-attachments/assets/ed8e974c-5da3-477a-81da-628d3f847131" /> | <img width="741" height="768" alt="Join Organization Supabase" src="https://github.com/user-attachments/assets/4c3f6bcd-4ed9-40b2-8280-e8c8a44ecbd6" /> | ## To test With local Studio running at `http://localhost:8082`: 1. Open `apps/studio/components/interfaces/OrganizationInvite/OrganizationInvite.utils.ts`. 2. At line 37, immediately inside `getOrganizationInviteStatus`, add: ```tsx return 'ready' ``` This deliberately bypasses invite lookup and account checks for the visual test. 3. Open `apps/studio/components/interfaces/OrganizationInvite/OrganizationInvite.tsx`. 4. At line 30, change: ```tsx const [joinError, setJoinError] = useState<string>() ``` to: ```tsx const [joinError, setJoinError] = useState<string>('Invite token can only be accepted via an SSO account') ``` 5. Open `http://localhost:8082/join?token=test&slug=test` while signed in. 6. Confirm the card says **Join an organization** and shows the error below **Decline**, separated from the actions by a divider. 7. Revert both temporary edits before committing anything. ## Additional context First PR in a five-PR stack. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit - **New Features** - Added a new connect interstitial example showcasing an inline action-error state with clear retry guidance. - **Bug Fixes** - Invitation acceptance failures now show inline destructive feedback under “Accept invite,” keeping the button enabled for retry (and removing prior toast-based failure behavior). - Updated the invalid-invitation title to “Invalid invitation.” - Changed the “Decline” link destination to `/organizations`. - **Documentation** - Expanded Sonner toast “When to use” guidance. - Refined form and connect interstitial action-feedback patterns (inline vs toast usage). - **Tests** - Updated and added coverage for the inline error rendering and “Invalid invitation” text. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Co-authored-by: Joshen Lim <joshenlimek@gmail.com>
113 lines
2.2 KiB
Plaintext
113 lines
2.2 KiB
Plaintext
---
|
|
title: Sonner
|
|
description: An opinionated toast component for React.
|
|
component: true
|
|
links:
|
|
doc: https://sonner.emilkowal.ski
|
|
source:
|
|
shadcn: true
|
|
---
|
|
|
|
<ComponentPreview name="sonner-demo" peekCode wide />
|
|
|
|
## About
|
|
|
|
Sonner is built and maintained by [emilkowalski\_](https://twitter.com/emilkowalski_).
|
|
|
|
## Installation
|
|
|
|
<Steps>
|
|
|
|
<Step>Install the following dependencies:</Step>
|
|
|
|
```bash
|
|
npm install sonner next-themes
|
|
```
|
|
|
|
<Step>Copy and paste the following code into your project.</Step>
|
|
|
|
<ComponentSource name="sonner" />
|
|
|
|
<Step>Add the Toaster component</Step>
|
|
|
|
```tsx title="app/layout.tsx" {1,9}
|
|
import { Toaster } from '@/components/ui/sonner'
|
|
|
|
export default function RootLayout({ children }) {
|
|
return (
|
|
<html lang="en">
|
|
<head />
|
|
<body>
|
|
<main>{children}</main>
|
|
<Toaster />
|
|
</body>
|
|
</html>
|
|
)
|
|
}
|
|
```
|
|
|
|
</Steps>
|
|
|
|
## Usage
|
|
|
|
```tsx
|
|
import { toast } from 'sonner'
|
|
```
|
|
|
|
```tsx
|
|
toast('Event has been created.')
|
|
```
|
|
|
|
## When to use
|
|
|
|
Use a toast for short-lived, non-blocking feedback or to confirm an operation
|
|
after its originating surface has closed or navigated away.
|
|
|
|
Do not use a toast as the only feedback for:
|
|
|
|
- Field validation. Use `FormMessage` or `FieldError` beside the field.
|
|
- A failed submission that leaves the form or interstitial visible. Show a
|
|
`role="alert"` message in destructive text near the actions.
|
|
- A blocking or materially changed page state. Use an inline state component
|
|
such as `Admonition` or `ErrorDisplay`.
|
|
|
|
Keep error copy specific and include the next step when it is not obvious.
|
|
|
|
## Expand
|
|
|
|
You can change the amount of toasts visible through the visibleToasts prop.
|
|
|
|
```tsx
|
|
<Toaster expand={true | false} />
|
|
```
|
|
|
|
You can use the Input below to try it out.
|
|
|
|
<SonnerExpandConfig />
|
|
|
|
## Position
|
|
|
|
You can change the amount of toasts visible through the visibleToasts prop.
|
|
|
|
```tsx
|
|
<Toaster
|
|
position={
|
|
'top-left' | 'top-right' | 'bottom-left' | 'bottom-right' | 'top-center' | 'bottom-center'
|
|
}
|
|
/>
|
|
```
|
|
|
|
You can use the Input below to try it out.
|
|
|
|
<SonnerPositionConfig />
|
|
|
|
## Types
|
|
|
|
You can customize the type of toast you want to render, and pass an options object as the second argument.
|
|
|
|
<ComponentPreview name="sonner-types" />
|
|
|
|
## Upload example
|
|
|
|
<ComponentPreview name="sonner-upload" />
|