From 358f476106f1dbf80e5a7f4ef7453e8bfb13f9d4 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 18 May 2026 22:57:06 +0000 Subject: [PATCH] Show toast instead of redirecting after league settings save Commishes now stay on the settings page when saving, with a Sonner toast confirming the save rather than being navigated to the league homepage. https://claude.ai/code/session_01PewdKxVfAbqasJbmk2UGw4 --- app/components/league/settings/SettingsMessages.tsx | 7 ------- app/routes/leagues/$leagueId.settings.server.ts | 2 +- app/routes/leagues/$leagueId.settings.tsx | 12 ++++++++++-- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/app/components/league/settings/SettingsMessages.tsx b/app/components/league/settings/SettingsMessages.tsx index 1d52a83..f4cce8d 100644 --- a/app/components/league/settings/SettingsMessages.tsx +++ b/app/components/league/settings/SettingsMessages.tsx @@ -25,13 +25,6 @@ export function SettingsMessage({ actionData }: { actionData: SettingsActionData ); } - if (actionData.success) { - return ( -
- {actionData.message ?? "Settings updated successfully."} -
- ); - } return null; } diff --git a/app/routes/leagues/$leagueId.settings.server.ts b/app/routes/leagues/$leagueId.settings.server.ts index 18bc795..eac2b50 100644 --- a/app/routes/leagues/$leagueId.settings.server.ts +++ b/app/routes/leagues/$leagueId.settings.server.ts @@ -776,7 +776,7 @@ export async function action(args: Route.ActionArgs) { } } - return redirect(`/leagues/${leagueId}?updated=true`); + return { success: true, message: "Settings saved successfully." }; } catch (error) { logger.error("Error updating season settings:", error); return { error: "Failed to update season settings. Please try again." }; diff --git a/app/routes/leagues/$leagueId.settings.tsx b/app/routes/leagues/$leagueId.settings.tsx index 3467453..e48f4f4 100644 --- a/app/routes/leagues/$leagueId.settings.tsx +++ b/app/routes/leagues/$leagueId.settings.tsx @@ -179,8 +179,8 @@ export default function LeagueSettings({ loaderData, actionData }: Route.Compone setHasDraftOrderChanges(false); }, [draftSlots, teams]); - // Re-mark dirty if the settings save returned an error (success path redirects away, so no cleanup - // needed there). Guard against non-settings errors (e.g. draft-order) which carry a `section` field. + // Re-mark dirty if the settings save returned an error. Guard against non-settings errors + // (e.g. draft-order) which carry a `section` field. useEffect(() => { if (navigation.state !== "idle") return; if (actionData && "error" in actionData && !("section" in actionData)) { @@ -188,6 +188,14 @@ export default function LeagueSettings({ loaderData, actionData }: Route.Compone } }, [actionData, navigation.state]); + useEffect(() => { + if (navigation.state !== "idle") return; + if (actionData && "success" in actionData && actionData.success && !("section" in actionData)) { + toast.success("Settings saved!"); + setHasUnsavedSettingsChanges(false); + } + }, [actionData, navigation.state]); + const canEditSports = season?.status === "pre_draft"; const canEditTeamCount = season?.status === "pre_draft"; const canEditDraftOrder = season?.status === "pre_draft";