Files
Alaister YoungandAlaister Young ca2b50a0a7 chore(ui-patterns): collapse the admonition shim into ui-patterns/Admonition (#48377)
Follow-up to #48344: collapses the two resolution paths for the
Admonition module into one.

`src/admonition.tsx` was a back-compat shim re-exporting
`src/Admonition/`. Two ways to resolve one module is exactly what
produced the macOS self-import bug fixed in #48344, and the local
typecheck errors that #48374 worked around. This removes the shim and
standardizes on the PascalCase subpath, matching every other export in
the package.

**Changed:**

- Codemodded all 246 `ui-patterns/admonition` imports to
`ui-patterns/Admonition` (240 `.tsx`, 5 `.mdx`, 1 `.ts` across studio,
docs, www, design-system, and lite-studio)
- Pointed the 5 internal `'../admonition'` imports back at the
`'../Admonition'` directory

**Removed:**

- `packages/ui-patterns/src/admonition.tsx`, and its `./admonition`
entry in the exports map (regenerated with `pnpm gen:exports`)

## To test

- `grep -r "ui-patterns/admonition" --include='*.ts*'` → no hits
- `pnpm test:case-hazards` → passes
- `pnpm typecheck` → all 15 tasks green
- `pnpm --filter studio run lint:ratchet` → passes
- `pnpm --filter ui-patterns vitest run src/Admonition` → 11 tests pass

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Bug Fixes**
* Standardized Admonition component imports across the application and
documentation.
* Improved compatibility with case-sensitive environments by using the
canonical component path.
  * Removed the legacy Admonition import entry point.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: Alaister Young <10985857+alaister@users.noreply.github.com>
2026-07-29 00:48:56 +08:00

137 lines
5.3 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { useState } from 'react'
import { toast } from 'sonner'
import { Button } from 'ui'
import { Admonition } from 'ui-patterns/Admonition'
import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal'
import { DocsButton } from '@/components/ui/DocsButton'
import Panel from '@/components/ui/Panel'
import { useProjectSettingsV2Query } from '@/data/config/project-settings-v2-query'
import { useCheckCNAMERecordMutation } from '@/data/custom-domains/check-cname-mutation'
import { useCustomDomainActivateMutation } from '@/data/custom-domains/custom-domains-activate-mutation'
import { useCustomDomainDeleteMutation } from '@/data/custom-domains/custom-domains-delete-mutation'
import type { CustomDomainResponse } from '@/data/custom-domains/custom-domains-query'
import { DOCS_URL } from '@/lib/constants'
export type CustomDomainActivateProps = {
projectRef?: string
customDomain: CustomDomainResponse
}
export const CustomDomainActivate = ({ projectRef, customDomain }: CustomDomainActivateProps) => {
const [isActivateConfirmModalVisible, setIsActivateConfirmModalVisible] = useState(false)
const { data: settings } = useProjectSettingsV2Query({ projectRef })
const { mutate: checkCNAMERecord, isPending: isCheckingRecord } = useCheckCNAMERecordMutation()
const { mutate: activateCustomDomain, isPending: isActivating } = useCustomDomainActivateMutation(
{
onSuccess: () => {
toast.success(`Successfully activated custom domain`)
setIsActivateConfirmModalVisible(false)
},
}
)
const { mutate: deleteCustomDomain, isPending: isDeleting } = useCustomDomainDeleteMutation({
onSuccess: () => {
toast.success(
'Custom domain setup cancelled successfully. It may take a few seconds before your custom domain is fully removed, so you may need to refresh your browser.'
)
},
})
const endpoint = settings?.app_config?.endpoint
const onActivateCustomDomain = async () => {
if (!projectRef) return console.error('Project ref is required')
checkCNAMERecord(
{ domain: customDomain.hostname },
{ onSuccess: () => activateCustomDomain({ projectRef }) }
)
}
const onCancelCustomDomain = async () => {
if (!projectRef) return console.error('Project ref is required')
deleteCustomDomain({ projectRef })
}
return (
<>
<div className="flex flex-col items-start">
<Panel.Content>
<div className="flex flex-col gap-2">
<h4 className="text-foreground">Enable your custom domain</h4>
<p className="text-sm text-foreground-light">
Set up is almost complete. Press “Activate” below to enable{' '}
<code className="text-code-inline">{customDomain.hostname}</code> for this project.
</p>
<p className="text-sm text-foreground-light">
We recommend that you schedule a downtime window of 20 - 30 minutes for your
application, as you will need to update any services that need to know about your
custom domain (e.g client side code or OAuth providers).
</p>
</div>
<div className="mt-4">
<Admonition
type="note"
title="Retain your CNAME record for service continuity after activation"
>
<p>
Your custom domain CNAME record for{' '}
<code className="text-code-inline">{customDomain.hostname}</code> should resolve to{' '}
{endpoint ? (
<code className="text-code-inline">{endpoint}</code>
) : (
"your project's API URL"
)}
. If you're using Cloudflare as your DNS provider, disable the proxy option.
</p>
</Admonition>
</div>
</Panel.Content>
<div className="w-full border-t border-muted" />
<Panel.Content className="w-full">
<div className="flex items-center justify-between">
<DocsButton href={`${DOCS_URL}/guides/platform/custom-domains`} />
<div className="flex items-center space-x-2">
<Button
variant="default"
className="self-end"
onClick={onCancelCustomDomain}
loading={isDeleting}
>
Cancel
</Button>
<Button
disabled={isDeleting}
onClick={() => setIsActivateConfirmModalVisible(true)}
className="self-end"
>
Activate
</Button>
</div>
</div>
</Panel.Content>
</div>
<ConfirmationModal
size="small"
loading={isCheckingRecord || isActivating}
visible={isActivateConfirmModalVisible}
title="Activate custom domain"
confirmLabel="Activate"
confirmLabelLoading="Activating"
onCancel={() => setIsActivateConfirmModalVisible(false)}
onConfirm={onActivateCustomDomain}
>
<p className="text-sm">
Activating <code className="text-code-inline break-normal!">{customDomain.hostname}</code>{' '}
will make it visible to users in place of your project’s Supabase domain. The Supabase
domain will continue to work too.
</p>
</ConfirmationModal>
</>
)
}