From d5699a827e085a1fe3d7874e21d3ce39129f8ba9 Mon Sep 17 00:00:00 2001 From: Macbook Date: Sat, 30 May 2026 16:37:18 +0900 Subject: [PATCH] =?UTF-8?q?=EC=95=8C=EB=A6=BC=EB=AA=A9=EB=A1=9D=20?= =?UTF-8?q?=EC=8B=9C=EA=B0=84=EB=B4=89=20=ED=95=84=ED=84=B0=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/TradeNotificationListPage.tsx | 72 +++++++++++++------ .../components/layout/BuilderPageShell.tsx | 7 +- frontend/src/styles/builderPageShell.css | 11 +++ frontend/src/styles/tradeNotificationList.css | 17 +++++ frontend/src/types/uiPreferences.ts | 2 + .../src/utils/tradeNotificationListLayout.ts | 22 ++++++ 6 files changed, 110 insertions(+), 21 deletions(-) diff --git a/frontend/src/components/TradeNotificationListPage.tsx b/frontend/src/components/TradeNotificationListPage.tsx index 8d17361..db2ecb8 100644 --- a/frontend/src/components/TradeNotificationListPage.tsx +++ b/frontend/src/components/TradeNotificationListPage.tsx @@ -23,13 +23,18 @@ import TradeNotificationGridLayoutPicker from './tradeNotification/TradeNotifica import { loadTradeNotificationGridPreset, loadTradeNotificationListLayout, + loadTradeNotificationCandleFilter, loadTradeNotificationListSort, + saveTradeNotificationCandleFilter, saveTradeNotificationGridPreset, saveTradeNotificationListLayout, saveTradeNotificationListSort, + TRADE_NOTIFICATION_CANDLE_FILTER_OPTIONS, + type TradeNotificationCandleFilter, type TradeNotificationListLayout, type TradeNotificationListSort, } from '../utils/tradeNotificationListLayout'; +import { normalizeStartCandleType } from '../utils/strategyStartNodes'; import { getTradeNotificationGridPreset, type TradeNotificationGridPresetId, @@ -120,6 +125,9 @@ export const TradeNotificationListPage: React.FC = ({ const [listSort, setListSort] = useState( () => loadTradeNotificationListSort(), ); + const [candleFilter, setCandleFilter] = useState( + () => loadTradeNotificationCandleFilter(), + ); const [listLayout, setListLayout] = useState( () => loadTradeNotificationListLayout(), ); @@ -246,9 +254,17 @@ export const TradeNotificationListPage: React.FC = ({ else setFillSell(req); }, [selectedMarket]); - const filtered = filter === 'unread' - ? allNotifications.filter(n => !n.isRead) - : allNotifications; + const filtered = useMemo(() => { + let items = filter === 'unread' + ? allNotifications.filter(n => !n.isRead) + : allNotifications; + if (candleFilter) { + items = items.filter( + n => normalizeStartCandleType(n.candleType) === candleFilter, + ); + } + return items; + }, [allNotifications, filter, candleFilter]); const sorted = useMemo( () => sortNotifications(filtered, listSort), @@ -260,6 +276,11 @@ export const TradeNotificationListPage: React.FC = ({ saveTradeNotificationListSort(sort); }, []); + const handleCandleFilterChange = useCallback((value: TradeNotificationCandleFilter) => { + setCandleFilter(value); + saveTradeNotificationCandleFilter(value); + }, []); + const handleListLayoutChange = useCallback((layout: TradeNotificationListLayout) => { setListLayout(layout); saveTradeNotificationListLayout(layout); @@ -360,23 +381,35 @@ export const TradeNotificationListPage: React.FC = ({ 이전시간순 + +
+ + +
+