From 031d7009ca447f9cd6bf31599d9fda09f1b0d71b Mon Sep 17 00:00:00 2001 From: Jared Pereira Date: Sat, 14 Mar 2026 20:43:04 -0400 Subject: [PATCH] add loaders --- .../actions/ShareOptions/DomainOptions.tsx | 6 +++- components/Domains/AddDomainForm.tsx | 8 ++++-- components/Domains/DomainSettingsView.tsx | 5 +++- components/Domains/PublicationDomains.tsx | 28 ++++++++++++++----- 4 files changed, 36 insertions(+), 11 deletions(-) diff --git a/app/[leaflet_id]/actions/ShareOptions/DomainOptions.tsx b/app/[leaflet_id]/actions/ShareOptions/DomainOptions.tsx index d7aa54ff..03629244 100644 --- a/app/[leaflet_id]/actions/ShareOptions/DomainOptions.tsx +++ b/app/[leaflet_id]/actions/ShareOptions/DomainOptions.tsx @@ -15,6 +15,7 @@ import { useReplicache } from "src/replicache"; import { AddDomainForm } from "components/Domains/AddDomainForm"; import { DomainSettingsView } from "components/Domains/DomainSettingsView"; import { AddTiny } from "components/Icons/AddTiny"; +import { DotLoader } from "components/utils/DotLoader"; type DomainMenuState = | { state: "default" } @@ -81,6 +82,7 @@ const DomainOptions = (props: { let { identity, mutate: mutateIdentity } = useIdentityData(); let { permission_token } = useReplicache(); + let [loading, setLoading] = useState(false); let toaster = useToaster(); let publishLink = useReadOnlyShareLink(); @@ -106,6 +108,7 @@ const DomainOptions = (props: { async function doPublish() { if (!selectedDomain || !publishLink) return; + setLoading(true); let route = "/" + selectedRoute; // Optimistic update @@ -209,6 +212,7 @@ const DomainOptions = (props: { - Publish! + {loading ? : "Publish!"} diff --git a/components/Domains/AddDomainForm.tsx b/components/Domains/AddDomainForm.tsx index 7253a6e5..3e72e652 100644 --- a/components/Domains/AddDomainForm.tsx +++ b/components/Domains/AddDomainForm.tsx @@ -5,12 +5,14 @@ import { Input } from "components/Input"; import { useSmoker } from "components/Toast"; import { useIdentityData } from "components/IdentityProvider"; import { addDomain } from "actions/domains/addDomain"; +import { DotLoader } from "components/utils/DotLoader"; export function AddDomainForm(props: { onDomainAdded: (domain: string) => void; onBack: () => void; }) { let [value, setValue] = useState(""); + let [loading, setLoading] = useState(false); let { mutate } = useIdentityData(); let smoker = useSmoker(); @@ -39,10 +41,12 @@ export function AddDomainForm(props: { Back { + setLoading(true); let { error } = await addDomain(value); if (error) { + setLoading(false); smoker({ error: true, text: @@ -62,7 +66,7 @@ export function AddDomainForm(props: { props.onDomainAdded(value); }} > - Verify Domain + {loading ? : "Verify Domain"} diff --git a/components/Domains/DomainSettingsView.tsx b/components/Domains/DomainSettingsView.tsx index 02782036..dda6e99f 100644 --- a/components/Domains/DomainSettingsView.tsx +++ b/components/Domains/DomainSettingsView.tsx @@ -214,6 +214,7 @@ function DeleteDomainButton(props: { mutateIdentity: ReturnType["mutate"]; }) { let [confirming, setConfirming] = useState(false); + let [loading, setLoading] = useState(false); if (!props.onDeleteDomain) return null; @@ -247,7 +248,9 @@ function DeleteDomainButton(props: { { + setLoading(true); mutateIdentityData(props.mutateIdentity, (draft) => { draft.custom_domains = draft.custom_domains.filter( (d) => d.domain !== props.domain, @@ -257,7 +260,7 @@ function DeleteDomainButton(props: { await deleteDomain({ domain: props.domain }); }} > - Delete + {loading ? : "Delete"} diff --git a/components/Domains/PublicationDomains.tsx b/components/Domains/PublicationDomains.tsx index 9105703c..4aeed96a 100644 --- a/components/Domains/PublicationDomains.tsx +++ b/components/Domains/PublicationDomains.tsx @@ -20,6 +20,7 @@ import { DomainSettingsView } from "./DomainSettingsView"; import { PinTiny } from "components/Icons/PinTiny"; import { LoadingTiny } from "components/Icons/LoadingTiny"; import { AddTiny } from "components/Icons/AddTiny"; +import { DotLoader } from "components/utils/DotLoader"; import type { CustomDomain } from "./DomainList"; type State = @@ -138,6 +139,7 @@ function PubDomainRow(props: { onSettings: () => void; }) { let { pending } = useDomainStatus(props.domain); + let [loading, setLoading] = useState(false); return (
@@ -170,19 +172,28 @@ function PubDomainRow(props: { ) : ( )}
@@ -200,8 +211,10 @@ function UnassignedDomainRow(props: { let { mutate: mutateIdentity } = useIdentityData(); let assignment = getDomainAssignment(props.domainData); let [confirming, setConfirming] = useState(false); + let [loading, setLoading] = useState(false); async function doAssign() { + setLoading(true); mutateIdentityData(mutateIdentity, (draft) => { let domain = draft.custom_domains.find( (d) => d.domain === props.domainData.domain, @@ -248,6 +261,7 @@ function UnassignedDomainRow(props: { )} @@ -275,8 +289,8 @@ function UnassignedDomainRow(props: { > Cancel - - Reassign + + {loading ? : "Reassign"} -- 2.51.2