"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.
| Type |
Name |
Value |
{data?.verification && (
|
{data.verification[0].type}
|
{data.verification[0].domain}
|
{data.verification[0].value}
|
)}
{data?.config &&
(isSubdomain ? (
|
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 (
);
};
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"}
);
}