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 ( <>
Set up is almost complete. Press “Activate” below to enable{' '}
{customDomain.hostname} for this project.
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).
Your custom domain CNAME record for{' '}
{customDomain.hostname} should resolve to{' '}
{endpoint ? (
{endpoint}
) : (
"your project's API URL"
)}
. If you're using Cloudflare as your DNS provider, disable the proxy option.
Activating {customDomain.hostname}{' '}
will make it visible to users in place of your project’s Briven domain. The Briven
domain will continue to work too.