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
90 lines
3.3 KiB
TypeScript
90 lines
3.3 KiB
TypeScript
import { PermissionAction } from '@supabase/shared-types/out/constants'
|
|
import { Download } from 'lucide-react'
|
|
import Link from 'next/link'
|
|
import { toast } from 'sonner'
|
|
import { Button } from 'ui'
|
|
import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader'
|
|
|
|
import {
|
|
ScaffoldSection,
|
|
ScaffoldSectionContent,
|
|
ScaffoldSectionDetail,
|
|
} from '@/components/layouts/Scaffold'
|
|
import { NoPermission } from '@/components/ui/NoPermission'
|
|
import { getDocument } from '@/data/documents/document-query'
|
|
import { useCheckEntitlements } from '@/hooks/misc/useCheckEntitlements'
|
|
import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions'
|
|
import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization'
|
|
import { useTrack } from '@/lib/telemetry/track'
|
|
|
|
export const SecurityQuestionnaire = () => {
|
|
const { data: organization } = useSelectedOrganizationQuery()
|
|
const slug = organization?.slug
|
|
|
|
const track = useTrack()
|
|
const { can: canReadSubscriptions, isLoading: isLoadingPermissions } = useAsyncCheckPermissions(
|
|
PermissionAction.BILLING_READ,
|
|
'stripe.subscriptions'
|
|
)
|
|
const { hasAccess: hasAccessToQuestionnaire, isLoading: isLoadingEntitlement } =
|
|
useCheckEntitlements('security.questionnaire')
|
|
|
|
const fetchQuestionnaire = async (orgSlug: string) => {
|
|
try {
|
|
const questionnaireLink = await getDocument({
|
|
orgSlug,
|
|
docType: 'standard-security-questionnaire',
|
|
})
|
|
if (questionnaireLink?.fileUrl) window.open(questionnaireLink.fileUrl, '_blank')
|
|
} catch (error: unknown) {
|
|
const message = error instanceof Error ? error.message : 'Unknown error occurred'
|
|
toast.error(`Failed to download Security Questionnaire: ${message}`)
|
|
}
|
|
}
|
|
|
|
const handleDownloadClick = () => {
|
|
if (!slug) return
|
|
|
|
track('document_view_button_clicked', { documentName: 'Standard Security Questionnaire' })
|
|
fetchQuestionnaire(slug)
|
|
}
|
|
|
|
return (
|
|
<ScaffoldSection className="py-12">
|
|
<ScaffoldSectionDetail>
|
|
<h4 className="mb-5">Standard Security Questionnaire</h4>
|
|
<div className="space-y-2 text-sm text-foreground-light [&_p]:m-0">
|
|
<p>
|
|
Organizations on Team Plan or above have access to our standard security questionnaire.
|
|
</p>
|
|
</div>
|
|
</ScaffoldSectionDetail>
|
|
<ScaffoldSectionContent>
|
|
{isLoadingPermissions || isLoadingEntitlement ? (
|
|
<div className="@lg:flex items-center justify-center h-full">
|
|
<ShimmeringLoader className="w-24" />
|
|
</div>
|
|
) : !canReadSubscriptions ? (
|
|
<NoPermission resourceText="access our security questionnaire" />
|
|
) : !hasAccessToQuestionnaire ? (
|
|
<div className="@lg:flex items-center justify-center h-full">
|
|
<Button asChild>
|
|
<Link
|
|
href={`/org/${slug}/billing?panel=subscriptionPlan&source=securityQuestionnaire`}
|
|
>
|
|
Upgrade to Team
|
|
</Link>
|
|
</Button>
|
|
</div>
|
|
) : (
|
|
<div className="@lg:flex items-center justify-center h-full">
|
|
<Button icon={<Download />} onClick={handleDownloadClick} disabled={!slug}>
|
|
Download Questionnaire
|
|
</Button>
|
|
</div>
|
|
)}
|
|
</ScaffoldSectionContent>
|
|
</ScaffoldSection>
|
|
)
|
|
}
|