fix: add null checks to prevent 'Cannot read properties of null' error on automation page

- Added proper null checks for status object before accessing selectedTimeframes
- Fixed timeframes display to handle null status gracefully
- Fixed analysis interval calculation with optional chaining
- Resolved 500 internal server error on /automation-v2 page
This commit is contained in:
mindesbunister
2025-07-24 15:04:25 +02:00
parent e1d8c0c65a
commit 1505bc04cd
6 changed files with 2381 additions and 249 deletions

View File

@@ -364,7 +364,7 @@ export default function AutomationPageV2() {
<div className="p-2 bg-gray-800/30 rounded-lg mb-3">
<div className="text-xs text-gray-400">
Selected: <span className="text-cyan-400">
{(status.selectedTimeframes || [status.timeframe]).map(tf => timeframes.find(t => t.value === tf)?.label || tf).filter(Boolean).join(', ')}
{config.selectedTimeframes.map(tf => timeframes.find(t => t.value === tf)?.label || tf).filter(Boolean).join(', ')}
</span>
</div>
<div className="text-xs text-gray-500 mt-1">
@@ -499,7 +499,12 @@ export default function AutomationPageV2() {
<div className="flex justify-between">
<span className="text-gray-300">Timeframes:</span>
<span className="text-cyan-400 font-semibold text-xs">
{(status.selectedTimeframes || [status.timeframe]).map(tf => timeframes.find(t => t.value === tf)?.label || tf).filter(Boolean).join(', ')}
{status && status.selectedTimeframes ?
status.selectedTimeframes.map(tf => timeframes.find(t => t.value === tf)?.label || tf).filter(Boolean).join(', ') :
status && status.timeframe ?
(timeframes.find(t => t.value === status.timeframe)?.label || status.timeframe) :
'N/A'
}
</span>
</div>
</div>
@@ -620,7 +625,7 @@ export default function AutomationPageV2() {
<div
className="bg-blue-500 h-2 rounded-full transition-all duration-1000"
style={{
width: status.analysisInterval > 0 ?
width: status?.analysisInterval > 0 ?
`${Math.max(0, 100 - (nextAnalysisCountdown / status.analysisInterval) * 100)}%` :
'0%'
}}
@@ -628,11 +633,11 @@ export default function AutomationPageV2() {
</div>
<div className="text-xs text-gray-400 text-center">
Analysis Interval: {(() => {
const intervalSec = status.analysisInterval || 0
const intervalSec = status?.analysisInterval || 0
const intervalMin = Math.floor(intervalSec / 60)
// Determine strategy type for display
if (status.selectedTimeframes) {
if (status?.selectedTimeframes) {
const timeframes = status.selectedTimeframes
const isScalping = timeframes.includes('5') || timeframes.includes('3') ||
(timeframes.length > 1 && timeframes.every(tf => ['1', '3', '5', '15', '30'].includes(tf)))

View File

@@ -20,7 +20,7 @@ export default function AutomationPageV2() {
timeframe: '1h', // Primary timeframe for backwards compatibility
selectedTimeframes: ['60'], // Multi-timeframe support
tradingAmount: 100,
maxLeverage: 5,
maxLeverage: 20, // Maximum allowed leverage for AI calculations
stopLossPercent: 2,
takeProfitPercent: 6,
riskPercentage: 2
@@ -172,7 +172,7 @@ export default function AutomationPageV2() {
<h3 className="text-xl font-bold text-white mb-6">Configuration</h3>
{/* Trading Mode */}
<div className="grid grid-cols-1 md:grid-cols-2 gap-6 mb-6">
<div className="grid grid-cols-1 md:grid-cols-1 gap-6 mb-6">
<div className="space-y-3">
<label className="block text-sm font-bold text-blue-400">Trading Mode</label>
<div className="space-y-2">
@@ -199,23 +199,16 @@ export default function AutomationPageV2() {
<span className="text-white font-semibold">Live Trading</span>
</label>
</div>
</div>
<div className="space-y-3">
<label className="block text-sm font-bold text-purple-400">Leverage</label>
<select
className="w-full p-3 bg-gray-700 border border-gray-600 rounded-lg text-white focus:border-purple-400"
value={config.maxLeverage}
onChange={(e) => setConfig({...config, maxLeverage: parseInt(e.target.value)})}
disabled={status?.isActive}
>
<option value="1">1x - Spot</option>
<option value="2">2x</option>
<option value="3">3x</option>
<option value="5">5x</option>
<option value="10">10x</option>
<option value="20">20x</option>
</select>
<div className="mt-2 p-3 bg-blue-900/20 border border-blue-700 rounded-lg">
<div className="flex items-center space-x-2">
<span className="text-blue-400">🧠</span>
<span className="text-sm text-blue-300 font-medium">AI-Driven Leverage</span>
</div>
<p className="text-xs text-blue-200 mt-1">
Leverage is now calculated automatically by AI based on account balance, market conditions, and risk assessment.
The system optimizes between 1x-20x for maximum profit while maintaining liquidation safety.
</p>
</div>
</div>
</div>
@@ -254,11 +247,9 @@ export default function AutomationPageV2() {
Available: ${parseFloat(balance.availableBalance).toFixed(2)} Using {((config.tradingAmount / balance.availableBalance) * 100).toFixed(1)}% of balance
</p>
)}
{balance && config.maxLeverage > 1 && (
<p className="text-xs text-green-400 mt-1">
With {config.maxLeverage}x leverage: ${(config.tradingAmount * config.maxLeverage).toFixed(2)} position size
</p>
)}
<p className="text-xs text-cyan-400 mt-1">
💡 AI will apply optimal leverage automatically based on market conditions
</p>
</div>
<div>
@@ -484,8 +475,8 @@ export default function AutomationPageV2() {
<span className="text-white font-semibold">{status.symbol}</span>
</div>
<div className="flex justify-between">
<span className="text-gray-300">Leverage:</span>
<span className="text-yellow-400 font-semibold">{config.maxLeverage}x</span>
<span className="text-gray-300">AI Leverage:</span>
<span className="text-cyan-400 font-semibold">Auto-Calculated</span>
</div>
</div>
) : (
@@ -505,9 +496,9 @@ export default function AutomationPageV2() {
</div>
<div className="text-center">
<div className="text-2xl font-bold text-blue-400">
{balance ? parseFloat(balance.leverage || 0).toFixed(1) : '0.0'}%
{balance && balance.actualLeverage ? parseFloat(balance.actualLeverage).toFixed(1) : 'AI'}x
</div>
<div className="text-xs text-gray-400">Leverage Used</div>
<div className="text-xs text-gray-400">Current Leverage</div>
</div>
<div className="text-center">
<div className="text-2xl font-bold text-red-400">