import React, { useState } from 'react'; import toast from 'react-hot-toast'; import { Domain, DomainStatus, Project } from 'gql-client'; import { Chip, Typography, Menu, MenuHandler, MenuList, MenuItem, Card, } from '@material-tailwind/react'; import ConfirmDialog from '../../../shared/ConfirmDialog'; import EditDomainDialog from './EditDomainDialog'; import { useGQLClient } from '../../../../context/GQLClientContext'; 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 [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.success(`Domain ${domain.name} deleted successfully`); } else { toast.error(`Error deleting domain ${domain.name}`); } }; 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} confirmButtonTitle="Yes, Delete domain" handleConfirm={() => { deleteDomain(); setDeleteDialogOpen((preVal) => !preVal); }} color="red" > Once deleted, the project{' '} {project.name} {' '} will not be accessible from the domain{' '} {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;