import { useState } from "react"; import { ButtonPrimary } from "components/Buttons"; import { useSmoker, useToaster } from "components/Toast"; import { Input, InputWithLabel } from "components/Input"; import useSWR from "swr"; import { useIdentityData } from "components/IdentityProvider"; import { addDomain } from "actions/domains/addDomain"; import { callRPC } from "app/api/rpc/client"; import { useLeafletDomains } from "components/PageSWRDataProvider"; import { usePublishLink } from "."; import { addDomainPath } from "actions/domains/addDomainPath"; import { useReplicache } from "src/replicache"; import { deleteDomain } from "actions/domains/deleteDomain"; import { AddTiny } from "components/Icons/AddTiny"; type DomainMenuState = | { state: "default"; } | { state: "domain-settings"; domain: string; } | { state: "add-domain"; } | { state: "has-domain"; domain: string; }; export function CustomDomainMenu(props: { setShareMenuState: (s: "default") => void; }) { let { data: domains } = useLeafletDomains(); let [state, setState] = useState( domains?.[0] ? { state: "has-domain", domain: domains[0].domain } : { state: "default" }, ); switch (state.state) { case "has-domain": case "default": return ( ); case "domain-settings": return ( ); case "add-domain": return ; } } export const DomainOptions = (props: { setShareMenuState: (s: "default") => void; setDomainMenuState: (state: DomainMenuState) => void; domainConnected: boolean; }) => { let { data: domains, mutate: mutateDomains } = useLeafletDomains(); let [selectedDomain, setSelectedDomain] = useState( domains?.[0]?.domain, ); let [selectedRoute, setSelectedRoute] = useState( domains?.[0]?.route.slice(1) || "", ); let { identity } = useIdentityData(); let { permission_token } = useReplicache(); let toaster = useToaster(); let smoker = useSmoker(); let publishLink = usePublishLink(); return (

Choose a Domain

{identity?.custom_domains .filter((d) => !d.publication_domains.length) .map((domain) => { return ( ); })}
{/* ONLY SHOW IF A DOMAIN IS CURRENTLY CONNECTED */}
{props.domainConnected && ( )} { // let rect = document // .getElementById("publish-to-domain") // ?.getBoundingClientRect(); // smoker({ // error: true, // text: "url already in use!", // position: { // x: rect ? rect.left : 0, // y: rect ? rect.top + 26 : 0, // }, // }); if (!selectedDomain || !publishLink) return; await addDomainPath({ domain: selectedDomain, route: "/" + selectedRoute, view_permission_token: publishLink, edit_permission_token: permission_token.id, }); toaster({ content: (
Published to custom domain!{" "} View
), type: "success", }); mutateDomains(); props.setShareMenuState("default"); }} > Publish!
); }; const DomainOption = (props: { selectedRoute: string; setSelectedRoute: (s: string) => void; checked: boolean; setChecked: (checked: string) => void; domain: string; setDomainMenuState: (state: DomainMenuState) => void; }) => { let [value, setValue] = useState(""); let { data } = useSWR(props.domain, async (domain) => { return await callRPC("get_domain_status", { domain }); }); let pending = data?.config?.misconfigured || data?.error; return ( ); }; export const AddDomain = (props: { setDomainMenuState: (state: DomainMenuState) => void; }) => { let [value, setValue] = useState(""); let { mutate } = useIdentityData(); let smoker = useSmoker(); return (

Add a New Domain

Don't include the protocol or path, just the base domain name for now
setValue(e.target.value)} /> { // call the vercel api, set the thing... let { error } = await addDomain(value); if (error) { smoker({ error: true, text: error === "invalid_domain" ? "Invalid domain! Use just the base domain" : error === "domain_already_in_use" ? "That domain is already in use!" : "An unknown error occured", position: { y: e.clientY, x: e.clientX - 5, }, }); return; } mutate(); props.setDomainMenuState({ state: "domain-settings", domain: value }); }} > Verify Domain
); }; const DomainSettings = (props: { domain: string; setDomainMenuState: (s: DomainMenuState) => void; }) => { let isSubdomain = props.domain.split(".").length > 2; return (

Verify Domain

To verify this domain, add the following record to your DNS provider for {props.domain}.
{isSubdomain ? (
Type
CNAME
Name
{props.domain.split(".").slice(0, -2).join(".")}
Value
cname.vercel-dns.com
) : (
Type
A
Name
@
Value
76.76.21.21
)}
Once you do this, the status may be pending for up to a few hours.
Check back later to see if verification was successful.
{ props.setDomainMenuState({ state: "default" }); }} > Back to Domains
); };