import { useState } from 'react'; import { Domain, DomainStatus, Project } from 'gql-client'; import { Chip, Typography, Menu, MenuHandler, MenuList, MenuItem, Card, } from '@snowballtools/material-tailwind-react-fork'; import EditDomainDialog from './EditDomainDialog'; import { useGQLClient } from 'context/GQLClientContext'; import { DeleteDomainDialog } from 'components/projects/Dialog/DeleteDomainDialog'; import { useToast } from 'components/shared/Toast'; enum RefreshStatus { IDLE, CHECKING, CHECK_SUCCESS, CHECK_FAIL, } interface DomainCardProps { domains: Domain[]; domain: Domain; branches: string[]; project: Project; onUpdate: () => Promise; } const CHECK_FAIL_TIMEOUT = 5000; // In milliseconds // TODO: Get domain record const DOMAIN_RECORD = { type: 'A', name: '@', value: '56.49.19.21', }; const DomainCard = ({ domains, domain, branches, project, onUpdate, }: DomainCardProps) => { const { toast, dismiss } = useToast(); const [refreshStatus, SetRefreshStatus] = useState(RefreshStatus.IDLE); const [deleteDialogOpen, setDeleteDialogOpen] = useState(false); const [editDialogOpen, setEditDialogOpen] = useState(false); const client = useGQLClient(); const deleteDomain = async () => { const { deleteDomain } = await client.deleteDomain(domain.id); if (deleteDomain) { onUpdate(); toast({ id: 'domain_deleted_success', title: 'Domain deleted', variant: 'success', onDismiss: dismiss, }); } else { toast({ id: 'domain_deleted_error', title: `Error deleting domain ${domain.name}`, variant: 'error', onDismiss: dismiss, }); } }; return ( <>
^ {domain.name} ^} />
{ SetRefreshStatus(RefreshStatus.CHECKING); setTimeout(() => { SetRefreshStatus(RefreshStatus.CHECK_FAIL); }, CHECK_FAIL_TIMEOUT); }} > {refreshStatus === RefreshStatus.CHECKING ? 'L' : 'R'} { setEditDialogOpen((preVal) => !preVal); }} > Edit Domain setDeleteDialogOpen((preVal) => !preVal)} > Delete domain
setDeleteDialogOpen((preVal) => !preVal)} open={deleteDialogOpen} handleConfirm={() => { deleteDomain(); setDeleteDialogOpen((preVal) => !preVal); }} projectName={project.name} domainName={domain.name} />
Production {domain.status === DomainStatus.Pending && ( {refreshStatus === RefreshStatus.IDLE ? ( ^ Add these records to your domain and refresh to check ) : refreshStatus === RefreshStatus.CHECKING ? ( ^ Checking records for {domain.name} ) : (
Failed to verify records. DNS propagation can take up to 48 hours. Please ensure you added the correct records and refresh.
)}
Type Name Value
{DOMAIN_RECORD.type} {DOMAIN_RECORD.name} {DOMAIN_RECORD.value}
)} { setEditDialogOpen((preVal) => !preVal); }} domains={domains} open={editDialogOpen} domain={domain} branches={branches} onUpdate={onUpdate} /> ); }; export default DomainCard;