mirror of
https://github.com/supabase/supabase.git
synced 2026-10-06 01:45:10 +03:00
## What kind of change does this PR introduce? Mechanical cleanup on top of the Button default-variant change (#50160). ## What is the current behavior? Many callsites still pass `variant="default"` even though that is now the component default. ## What is the new behavior? Removes redundant static `variant="default"` from legacy `Button` and `ButtonTooltip` callsites. Keeps explicit defaults where they document the API: - `button-default.tsx` and `button-sizes.tsx` demos - `DocsButton`, which pins neutral styling at the wrapper boundary ## To test Studio: - [Auth → Rate Limits](https://studio-staging-2s957kwc4-supabase.vercel.app/dashboard/project/_/auth/rate-limits): dirty the form so Cancel appears; Cancel stays neutral, Save stays green - [Project Settings → API Keys](https://studio-staging-2s957kwc4-supabase.vercel.app/dashboard/project/_/settings/api-keys): `DocsButton` in the header actions stays neutral Design system: - [Design system → Button](https://design-system-git-dnywh-dc924ac1-supabase.vercel.app/design-system/docs/components/button): `button-default` / `button-sizes` still show explicit default styling; Primary (green) is restricted to the Primary section (and `asChild`) WWW: - [www → Brand assets](https://zone-www-dot-com-git-dnywh-dc924ac1-supabase.vercel.app/brand-assets): Download logo kit / Download button kit stay neutral
96 lines
2.4 KiB
TypeScript
96 lines
2.4 KiB
TypeScript
import * as Sentry from '@sentry/nextjs'
|
|
import { AlertCircle } from 'lucide-react'
|
|
import { ErrorInfo } from 'react'
|
|
import { ErrorBoundary as ReactErrorBoundary } from 'react-error-boundary'
|
|
import { Alert, AlertDescription, AlertTitle, Button } from 'ui'
|
|
|
|
interface ErrorFallbackProps {
|
|
error: Error
|
|
resetErrorBoundary: () => void
|
|
message?: string
|
|
actions?: {
|
|
label: string
|
|
onClick: () => void
|
|
}[]
|
|
sentryContext?: Record<string, any>
|
|
}
|
|
|
|
const ErrorFallback = ({
|
|
error: _error,
|
|
resetErrorBoundary,
|
|
message = 'Something went wrong',
|
|
actions = [],
|
|
}: ErrorFallbackProps) => {
|
|
return (
|
|
<div className="p-4 bg-destructive-foreground h-full flex flex-col justify-center items-center">
|
|
<Alert variant="destructive">
|
|
<AlertCircle />
|
|
<AlertTitle>{message}</AlertTitle>
|
|
<AlertDescription>We've been notified and will review and fix this issue.</AlertDescription>
|
|
<div className="mt-4 flex gap-2">
|
|
<Button onClick={resetErrorBoundary} className="text-sm">
|
|
Try again
|
|
</Button>
|
|
{actions?.map((action, index) => (
|
|
<Button key={index} onClick={action.onClick} className="text-sm">
|
|
{action.label}
|
|
</Button>
|
|
))}
|
|
</div>
|
|
</Alert>
|
|
</div>
|
|
)
|
|
}
|
|
|
|
interface ErrorBoundaryProps {
|
|
children: React.ReactNode
|
|
message?: string
|
|
actions?: {
|
|
label: string
|
|
onClick: () => void
|
|
}[]
|
|
sentryContext?: Record<string, any>
|
|
onReset?: () => void
|
|
}
|
|
|
|
export const ErrorBoundary = ({
|
|
children,
|
|
message,
|
|
actions,
|
|
sentryContext,
|
|
onReset,
|
|
}: ErrorBoundaryProps) => {
|
|
const handleError = (error: Error, info: ErrorInfo) => {
|
|
Sentry.withScope((scope) => {
|
|
scope.setExtra('componentStack', info.componentStack)
|
|
if (sentryContext) {
|
|
Object.entries(sentryContext).forEach(([key, value]) => {
|
|
scope.setExtra(key, value)
|
|
})
|
|
}
|
|
Sentry.captureException(error)
|
|
})
|
|
}
|
|
|
|
const handleReset = () => {
|
|
onReset?.()
|
|
}
|
|
|
|
return (
|
|
<ReactErrorBoundary
|
|
fallbackRender={({ error, resetErrorBoundary }) => (
|
|
<ErrorFallback
|
|
error={error}
|
|
resetErrorBoundary={resetErrorBoundary}
|
|
message={message}
|
|
actions={actions}
|
|
/>
|
|
)}
|
|
onError={handleError}
|
|
onReset={handleReset}
|
|
>
|
|
{children}
|
|
</ReactErrorBoundary>
|
|
)
|
|
}
|