From 1f7c07b4270fc07cdb4ecf66925d036d0ef47fff Mon Sep 17 00:00:00 2001 From: Henry Winkel Date: Sat, 16 May 2026 21:21:35 +0200 Subject: [PATCH] fix: improve settings page error handling, race condition, and metadata --- app/routes/settings.tsx | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/app/routes/settings.tsx b/app/routes/settings.tsx index 53eacb6..24357ed 100644 --- a/app/routes/settings.tsx +++ b/app/routes/settings.tsx @@ -1,4 +1,4 @@ -import React, { useEffect, useState } from "react"; +import { useEffect, useState } from "react"; import Navbar from "../components/Navbar"; import SettingsSidebar, { type SettingsSection } from "../components/SettingsSidebar"; import LlmSettings from "../components/LlmSettings"; @@ -6,6 +6,8 @@ import TradingSettings from "../components/TradingSettings"; import StockTable from "../components/StockTable"; import SystemSettings from "../components/SystemSettings"; +export const meta = () => [{ title: "Settings - AITrader" }]; + interface Stock { id: string; ticker: string; @@ -69,7 +71,7 @@ export default function SettingsPage() { const saveStockNotes = async (ticker: string, notes: string) => { setSaveError(null); - const prevStocks = [...stocks]; + const prevNotes = stocks.find((st) => st.ticker === ticker)?.notes ?? null; setStocks((s) => s.map((st) => (st.ticker === ticker ? { ...st, notes } : st))); try { const fd = new FormData(); @@ -80,7 +82,7 @@ export default function SettingsPage() { throw new Error("Failed to save notes"); } } catch (err) { - setStocks(prevStocks); + setStocks((s) => s.map((st) => (st.ticker === ticker ? { ...st, notes: prevNotes } : st))); setSaveError(err instanceof Error ? err.message : "Save failed"); } }; @@ -117,7 +119,7 @@ export default function SettingsPage() {
- + { setActiveSection(s); setSaveError(null); }} />
{renderSection()}