fix(ui): reset pending state on success for all save/confirm buttons

Parent button components (EditVendorButton, EditAccountButton, etc.) stay
mounted even when their AdminDialog closes — so pending was never cleared
on success, causing buttons to show 'Saving...' on the next open. The
payment confirm button (no dialog) was stuck in 'Confirming...' until the
page re-render eventually unmounted it. Added setPending(false) before
setOpen/router.refresh in every success path.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Hardik 2026-05-27 04:36:29 +05:30
parent 5ad85417d9
commit c92f136b09
8 changed files with 14 additions and 14 deletions

View file

@ -50,7 +50,7 @@ export function AddAccountButton() {
setError(""); setError("");
const result = await createAccount(new FormData(e.currentTarget)); const result = await createAccount(new FormData(e.currentTarget));
if ("error" in result) { setError(result.error); setPending(false); } if ("error" in result) { setError(result.error); setPending(false); }
else { setOpen(false); router.refresh(); } else { setPending(false); setOpen(false); router.refresh(); }
} }
return ( return (
@ -94,7 +94,7 @@ export function EditAccountButton({ account }: { account: AccountRow }) {
fd.set("id", account.id); fd.set("id", account.id);
const result = await updateAccount(fd); const result = await updateAccount(fd);
if ("error" in result) { setError(result.error); setPending(false); } if ("error" in result) { setError(result.error); setPending(false); }
else { setOpen(false); router.refresh(); } else { setPending(false); setOpen(false); router.refresh(); }
} }
async function handleToggle() { async function handleToggle() {

View file

@ -49,7 +49,7 @@ export function AddProductButton() {
setError(""); setError("");
const result = await createProduct(new FormData(e.currentTarget)); const result = await createProduct(new FormData(e.currentTarget));
if ("error" in result) { setError(result.error); setPending(false); } if ("error" in result) { setError(result.error); setPending(false); }
else { setOpen(false); router.refresh(); } else { setPending(false); setOpen(false); router.refresh(); }
} }
return ( return (

View file

@ -52,7 +52,7 @@ export function AddSiteButton() {
e.preventDefault(); setPending(true); setError(""); e.preventDefault(); setPending(true); setError("");
const result = await createSite(new FormData(e.currentTarget)); const result = await createSite(new FormData(e.currentTarget));
if ("error" in result) { setError(result.error); setPending(false); } if ("error" in result) { setError(result.error); setPending(false); }
else { setOpen(false); router.refresh(); } else { setPending(false); setOpen(false); router.refresh(); }
} }
return ( return (
@ -84,7 +84,7 @@ export function EditSiteButton({ site }: { site: SiteRow }) {
e.preventDefault(); setPending(true); setError(""); e.preventDefault(); setPending(true); setError("");
const result = await updateSite(site.id, new FormData(e.currentTarget)); const result = await updateSite(site.id, new FormData(e.currentTarget));
if ("error" in result) { setError(result.error); setPending(false); } if ("error" in result) { setError(result.error); setPending(false); }
else { setOpen(false); router.refresh(); } else { setPending(false); setOpen(false); router.refresh(); }
} }
async function handleToggle() { async function handleToggle() {

View file

@ -75,7 +75,7 @@ export function AddUserButton() {
setError(""); setError("");
const result = await createUser(new FormData(e.currentTarget)); const result = await createUser(new FormData(e.currentTarget));
if ("error" in result) { setError(result.error); setPending(false); } if ("error" in result) { setError(result.error); setPending(false); }
else { setOpen(false); router.refresh(); } else { setPending(false); setOpen(false); router.refresh(); }
} }
return ( return (
@ -119,7 +119,7 @@ export function EditUserButton({ user }: { user: UserRow }) {
fd.set("id", user.id); fd.set("id", user.id);
const result = await updateUser(fd); const result = await updateUser(fd);
if ("error" in result) { setError(result.error); setPending(false); } if ("error" in result) { setError(result.error); setPending(false); }
else { setOpen(false); router.refresh(); } else { setPending(false); setOpen(false); router.refresh(); }
} }
async function handleToggle() { async function handleToggle() {

View file

@ -253,7 +253,7 @@ export function AddVendorButton() {
e.preventDefault(); setPending(true); setError(""); e.preventDefault(); setPending(true); setError("");
const result = await createVendor(new FormData(e.currentTarget)); const result = await createVendor(new FormData(e.currentTarget));
if ("error" in result) { setError(result.error); setPending(false); } if ("error" in result) { setError(result.error); setPending(false); }
else { setOpen(false); router.refresh(); } else { setPending(false); setOpen(false); router.refresh(); }
} }
return ( return (
@ -292,7 +292,7 @@ export function EditVendorButton({ vendor }: { vendor: VendorRow }) {
fd.set("id", vendor.id); fd.set("id", vendor.id);
const result = await updateVendor(fd); const result = await updateVendor(fd);
if ("error" in result) { setError(result.error); setPending(false); } if ("error" in result) { setError(result.error); setPending(false); }
else { setOpen(false); router.refresh(); } else { setPending(false); setOpen(false); router.refresh(); }
} }
async function handleToggle() { await toggleVendorActive(vendor.id); router.refresh(); } async function handleToggle() { await toggleVendorActive(vendor.id); router.refresh(); }

View file

@ -35,7 +35,7 @@ export function AddVesselButton() {
setError(""); setError("");
const result = await createVessel(new FormData(e.currentTarget)); const result = await createVessel(new FormData(e.currentTarget));
if ("error" in result) { setError(result.error); setPending(false); } if ("error" in result) { setError(result.error); setPending(false); }
else { setOpen(false); router.refresh(); } else { setPending(false); setOpen(false); router.refresh(); }
} }
return ( return (
@ -79,7 +79,7 @@ export function EditVesselButton({ vessel }: { vessel: VesselRow }) {
fd.set("id", vessel.id); fd.set("id", vessel.id);
const result = await updateVessel(fd); const result = await updateVessel(fd);
if ("error" in result) { setError(result.error); setPending(false); } if ("error" in result) { setError(result.error); setPending(false); }
else { setOpen(false); router.refresh(); } else { setPending(false); setOpen(false); router.refresh(); }
} }
async function handleToggle() { async function handleToggle() {

View file

@ -26,7 +26,7 @@ export function PaymentActions({ poId, poStatus, totalAmount = 0, paidAmount = 0
setError(""); setError("");
const result = await processPayment({ poId }); const result = await processPayment({ poId });
if ("error" in result) { setError(result.error); setPending(false); } if ("error" in result) { setError(result.error); setPending(false); }
else { router.refresh(); } else { setPending(false); router.refresh(); }
} }
async function handleMarkPaid(e: React.FormEvent, forceFullPayment = false) { async function handleMarkPaid(e: React.FormEvent, forceFullPayment = false) {
@ -48,7 +48,7 @@ export function PaymentActions({ poId, poStatus, totalAmount = 0, paidAmount = 0
setError(""); setError("");
const result = await markPaid({ poId, paymentRef: ref, paymentAmount }); const result = await markPaid({ poId, paymentRef: ref, paymentAmount });
if ("error" in result) { setError(result.error); setPending(false); } if ("error" in result) { setError(result.error); setPending(false); }
else { router.refresh(); } else { setPending(false); router.refresh(); }
} }
if (poStatus === "MGR_APPROVED") { if (poStatus === "MGR_APPROVED") {

View file

@ -25,7 +25,7 @@ export function VendorIdForm({ poId, vendors }: { poId: string; vendors: Vendor[
setError(""); setError("");
const result = await provideVendorId({ poId, vendorId: selectedVendorId }); const result = await provideVendorId({ poId, vendorId: selectedVendorId });
if ("error" in result) { setError(result.error); setPending(false); } if ("error" in result) { setError(result.error); setPending(false); }
else { router.refresh(); } else { setPending(false); router.refresh(); }
} }
return ( return (