diff --git a/apps/builder/app/builder/features/topbar/add-domain.tsx b/apps/builder/app/builder/features/topbar/add-domain.tsx index 5b928280454e..775ec6c5d691 100644 --- a/apps/builder/app/builder/features/topbar/add-domain.tsx +++ b/apps/builder/app/builder/features/topbar/add-domain.tsx @@ -63,7 +63,6 @@ export const AddDomain = ({ domain, projectId, }); - if (result.success === false) { toast.error(result.error); setError(result.error); diff --git a/apps/builder/app/builder/features/topbar/domain-checkbox.tsx b/apps/builder/app/builder/features/topbar/domain-checkbox.tsx index 849a3ff339f8..a5af32699e0e 100644 --- a/apps/builder/app/builder/features/topbar/domain-checkbox.tsx +++ b/apps/builder/app/builder/features/topbar/domain-checkbox.tsx @@ -59,9 +59,8 @@ export const DomainCheckbox = (props: DomainCheckboxProps) => { const disabled = hasProPlan ? props.disabled : true; const hideDomainCheckbox = - project.domainsVirtual.filter( - (domain) => domain.status === "ACTIVE" && domain.verified - ).length === 0 && hasProPlan; + project.domainsVirtual.filter((domain) => domain.status === "ACTIVE") + .length === 0 && hasProPlan; return (
diff --git a/apps/builder/app/builder/features/topbar/domains.tsx b/apps/builder/app/builder/features/topbar/domains.tsx index b94b548c4aad..54dfe3a4d8ef 100644 --- a/apps/builder/app/builder/features/topbar/domains.tsx +++ b/apps/builder/app/builder/features/topbar/domains.tsx @@ -29,7 +29,7 @@ import { useState, type ReactNode, } from "react"; -import { Entri } from "./entri"; +import { Entri, type DnsRecord } from "./entri"; import { nativeClient } from "~/shared/trpc/trpc-client"; import { useStore } from "@nanostores/react"; import { $publisherHost } from "~/shared/nano-states"; @@ -38,6 +38,7 @@ import { useEffectEvent } from "~/shared/hook-utils/effect-event"; import { DomainCheckbox } from "./domain-checkbox"; import { CopyToClipboard } from "~/builder/shared/copy-to-clipboard"; import { RelativeTime } from "~/builder/shared/relative-time"; +import { z } from "zod"; export type Domain = Project["domainsVirtual"][number]; @@ -50,9 +51,7 @@ const InputEllipsis = styled(InputField, { }); export const getStatus = (projectDomain: Domain) => - projectDomain.verified - ? (`VERIFIED_${projectDomain.status}` as const) - : `UNVERIFIED`; + `VERIFIED_${projectDomain.status}` as const; export const PENDING_TIMEOUT = process.env.NODE_ENV === "production" ? 60 * 3 * 1000 : 35000; @@ -99,10 +98,6 @@ const getStatusText = (props: { let text: ReactNode = "Something went wrong"; switch (status) { - case "UNVERIFIED": - text = "Status: Not verified"; - break; - case "VERIFIED_INITIALIZING": text = "Status: Initializing CNAME"; break; @@ -182,9 +177,8 @@ const DomainItem = ({ const DAY_IN_MS = 24 * 60 * 60 * 1000; - const status = projectDomain.verified - ? (`VERIFIED_${projectDomain.status}` as `VERIFIED_${DomainStatus}`) - : `UNVERIFIED`; + const status = + `VERIFIED_${projectDomain.status}` as `VERIFIED_${DomainStatus}`; const [isStatusLoading, setIsStatusLoading] = useState( initiallyOpen || @@ -214,22 +208,12 @@ const DomainItem = ({ await refresh(); }; - const [verifyError, setVerifyError] = useState(undefined); - const handleVerify = useEffectEvent(async () => { - setVerifyError(undefined); setIsCheckStateInProgress(true); - - const verifyResult = await nativeClient.domain.verify.mutate({ + await nativeClient.domain.verify.mutate({ projectId: projectDomain.projectId, domainId: projectDomain.domainId, }); - - if (verifyResult.success === false) { - setVerifyError(verifyResult.error); - return; - } - await refresh(); }); @@ -267,17 +251,10 @@ const DomainItem = ({ return; } - if (status === "UNVERIFIED") { - startTransition(async () => { - await handleVerify(); - await handleUpdateStatus(); - }); - return; - } startTransition(async () => { await handleUpdateStatus(); }); - }, [status, handleVerify, handleUpdateStatus, isStatusLoading]); + }, [status, handleUpdateStatus, isStatusLoading]); const domainStatus = getStatus(projectDomain); @@ -288,20 +265,30 @@ const DomainItem = ({ const publisherHost = useStore($publisherHost); const cname = extractCname(projectDomain.domain); - const dnsRecords = [ + let verifications; + try { + verifications = z + .array(z.object({ name: z.string(), value: z.string() })) + .parse(JSON.parse(projectDomain.expectedTxtRecord)); + } catch { + // empty block + } + const dnsRecords: DnsRecord[] = [ { type: "CNAME", host: cname, value: `${projectDomain.cname}.customers.${publisherHost}`, ttl: 300, - } as const, - { + }, + ]; + for (const { name, value } of verifications ?? []) { + dnsRecords.push({ type: "TXT", - host: cname === "@" ? "_webstudio_is" : `_webstudio_is.${cname}`, - value: projectDomain.expectedTxtRecord, + host: name, + value, ttl: 300, - } as const, - ]; + }); + } return ( } > - {status === "UNVERIFIED" && ( + {status === "VERIFIED_INITIALIZING" && ( <>