From b7044a1eaecf26a96d1e1e34759d42e9b70aa405 Mon Sep 17 00:00:00 2001 From: root Date: Wed, 6 May 2026 00:05:28 +0000 Subject: [PATCH] fix(web): source simple trigger market price --- web/src/views/SimpleView.tsx | 49 ++++++++++++++++++++++++++---------- 1 file changed, 36 insertions(+), 13 deletions(-) diff --git a/web/src/views/SimpleView.tsx b/web/src/views/SimpleView.tsx index 7956ffa..b7d0c9b 100644 --- a/web/src/views/SimpleView.tsx +++ b/web/src/views/SimpleView.tsx @@ -140,6 +140,8 @@ export function SimpleView() { const normalizedSymbol = draft.symbol.trim().toUpperCase(); const livePrice = normalizedSymbol ? Number(botState.symbols?.[normalizedSymbol]?.price || 0) : 0; const computedTriggerPrice = computeSimpleTriggerPrice(draft); + const resolvedMarketPrice = parsePositiveNumber(draft.currentMarketPrice); + const marketPriceSource = livePrice > 0 ? 'live' : (resolvedMarketPrice !== null ? 'recent_close' : null); const triggerOptions = draft.side === 'buy' ? [ @@ -176,11 +178,23 @@ export function SimpleView() { }, [draft.side, draft.triggerMode]); useEffect(() => { - if (draft.triggerMode !== 'drop_percent' || !livePrice || draft.currentMarketPrice.trim()) { + if (draft.triggerMode !== 'drop_percent' || !livePrice) { return; } - setDraft(prev => ({ ...prev, currentMarketPrice: livePrice.toFixed(4) })); - }, [draft.triggerMode, draft.currentMarketPrice, livePrice]); + setDraft(prev => ( + prev.currentMarketPrice === livePrice.toFixed(4) + ? prev + : { ...prev, currentMarketPrice: livePrice.toFixed(4) } + )); + }, [draft.triggerMode, livePrice]); + + useEffect(() => { + if (draft.triggerMode !== 'drop_percent' || !normalizedSymbol || livePrice > 0 || draft.currentMarketPrice.trim() || loadingPrice) { + return; + } + + void handleLoadMarketPrice(); + }, [draft.triggerMode, normalizedSymbol, livePrice]); const rulePreview = useMemo(() => { if (!normalizedSymbol || computedTriggerPrice === null) return null; @@ -207,7 +221,7 @@ export function SimpleView() { throw new Error(`No recent market price found for ${normalizedSymbol}`); } updateDraft('currentMarketPrice', latestClose.toFixed(4)); - setMessage(`Loaded current market price for ${normalizedSymbol}`); + setMessage(`Loaded market price for ${normalizedSymbol}`); } catch (err: any) { setError(err?.message ?? 'Failed to load current market price'); } finally { @@ -387,15 +401,22 @@ export function SimpleView() {
updateDraft('currentMarketPrice', e.target.value)} - placeholder="e.g. 212.42" - inputMode="decimal" - style={{ flex: 1, border: '1px solid #D1D5DB', borderRadius: 10, padding: '10px 12px', fontSize: 14 }} + readOnly + placeholder={normalizedSymbol ? 'Loading market price…' : 'Enter symbol first'} + style={{ + flex: 1, + border: '1px solid #D1D5DB', + borderRadius: 10, + padding: '10px 12px', + fontSize: 14, + background: '#F9FAFB', + color: draft.currentMarketPrice ? '#111827' : '#6B7280', + }} />
- {livePrice > 0 && ( - Live feed price in app state: {livePrice.toFixed(4)} + {marketPriceSource && ( + + Source: {marketPriceSource === 'live' ? 'live market feed' : 'recent market close'} + )}