"use client"; import { useState } from "react"; import { useDomainStatus } from "./useDomainStatus"; import { DotLoader } from "components/utils/DotLoader"; import { deleteDomain, removeDomainAssignment, removeDomainRoute, } from "actions/domains"; import { useIdentityData, mutateIdentityData, } from "components/IdentityProvider"; import { ButtonPrimary, ButtonTertiary } from "components/Buttons"; import { getDomainAssignment } from "./domainAssignment"; import { GoToArrow } from "components/Icons/GoToArrow"; import { useSmoker } from "components/Toast"; import type { CustomDomain } from "./DomainList"; import { UnlinkTiny } from "components/Icons/UnlinkTiny"; export function DomainSettingsView(props: { domain: string; onBack: () => void; onRemoveAssignment?: () => void; onDeleteDomain?: () => void; }) { let { data, pending: needsSetup, mutate: mutateDomainStatus, } = useDomainStatus(props.domain); let { identity, mutate: mutateIdentity } = useIdentityData(); let isSubdomain = props.domain.split(".").length > 2; let domainData = identity?.custom_domains.find( (d) => d.domain === props.domain, ); let assignment = domainData ? getDomainAssignment(domainData) : null; let isAssigned = assignment && assignment.type !== "unassigned"; return (

{needsSetup ? `Verify ${props.domain}` : props.domain}

{needsSetup ? ( <>
To verify this domain, add the following record to your DNS provider for {props.domain}.
Verfication may take up to a few hours to process.
{data?.verification && ( )} {data?.config && (isSubdomain ? ( ) : ( ))}
Type Name Value
{data.verification[0].type}
{data.verification[0].domain}
{data.verification[0].value}
CNAME
{props.domain.split(".").slice(0, -2).join(".")}
{ data.config.recommendedCNAME.sort( (a, b) => a.rank - b.rank, )[0].value }
A
@
{ data.config.recommendedIPv4.sort( (a, b) => a.rank - b.rank, )[0].value[0] }
mutateDomainStatus()} /> ) : null} {/* Assignment list */} {!isAssigned && (
You haven't assigned this domain to anything yet!
You can assign it to either a publication from your pub settings, or to any leaflet!
)} {props.onRemoveAssignment && isAssigned && domainData && (

Assigned{" "} {domainData.publication_domains.length > 0 ? "Publications" : "Leaflets"}

{domainData.publication_domains.length > 0 ? ( ) : ( domainData.custom_domain_routes.map((route) => ( )) )}
)}

); } let containerClassName = "flex items-center justify-between px-[6px] py-1 border rounded-md border-border-light"; const AssignedPublication = (props: { domainData: CustomDomain; domain: string; onRemoveAssignment?: () => void; mutateIdentity: ReturnType["mutate"]; isLastAssignment: boolean; }) => { let [areYouSure, setAreYouSure] = useState(false); if (areYouSure) { return ( { setAreYouSure(false); }} /> ); } return (
{props.domainData.publication_domains[0]?.publications?.name ?? "publication"}
); }; const AssignedLeaflet = (props: { route: { id: string; edit_permission_token: string; route: string; }; domain: string; onRemoveAssignment?: () => void; mutateIdentity: ReturnType["mutate"]; isLastAssignment: boolean; }) => { let [areYouSure, setAreYouSure] = useState(false); if (areYouSure) { return ( { setAreYouSure(false); }} /> ); } return (
{props.route.route}
); }; const UnassignAreYouSure = (props: { domain: string; routeId?: string; isLastAssignment: boolean; onRemoveAssignment?: () => void; mutateIdentity: ReturnType["mutate"]; closeAreYouSure: () => void; }) => { let { domain, routeId, isLastAssignment, onRemoveAssignment, mutateIdentity, } = props; return (

Are You Sure?

{ if (routeId) { mutateIdentityData(mutateIdentity, (draft) => { let domainData = draft.custom_domains.find( (d) => d.domain === domain, ); if (domainData) { domainData.custom_domain_routes = domainData.custom_domain_routes.filter( (r) => r.id !== routeId, ); } }); if (isLastAssignment) onRemoveAssignment?.(); await removeDomainRoute({ routeId }); } else { mutateIdentityData(mutateIdentity, (draft) => { let domainData = draft.custom_domains.find( (d) => d.domain === domain, ); if (domainData) { domainData.publication_domains = []; } }); onRemoveAssignment?.(); await removeDomainAssignment({ domain }); } }} > Confirm
); }; function DeleteDomainButton(props: { domain: string; onDeleteDomain?: () => void; mutateIdentity: ReturnType["mutate"]; }) { let [confirming, setConfirming] = useState(false); let [loading, setLoading] = useState(false); if (!props.onDeleteDomain) return null; if (!confirming) { return ( setConfirming(true)} > Delete Domain ); } return (

Are you sure you want to delete {props.domain}? This will remove all assignments and cannot be undone.

{ setLoading(true); mutateIdentityData(props.mutateIdentity, (draft) => { draft.custom_domains = draft.custom_domains.filter( (d) => d.domain !== props.domain, ); }); props.onDeleteDomain?.(); await deleteDomain({ domain: props.domain }); }} > {loading ? : "Delete"}
); } function VerifyButton(props: { verify: () => Promise }) { let [loading, setLoading] = useState(false); let smoker = useSmoker(); return ( { e.preventDefault(); setLoading(true); let result = await props.verify(); setLoading(false); let stillPending = result?.config?.misconfigured || result?.verification; if (stillPending) { smoker({ position: { x: e.clientX, y: e.clientY - 5, }, text: "Still processing", }); } }} > {loading ? : "Check Status"} ); }