diff --git a/src/components/ControlPanel.tsx b/src/components/ControlPanel.tsx index 38b2cb1..11b641f 100644 --- a/src/components/ControlPanel.tsx +++ b/src/components/ControlPanel.tsx @@ -112,11 +112,12 @@ export default function ControlPanel() { const [data, setData] = useState([]) const [currentTemp, setCurrentTemp] = useState(0) const [isPowerOn, setIsPowerOn] = useState(false) + const [isExhaustOn, setIsExhaustOn] = useState(false) const [targetTemp, setTargetTemp] = useState(50) const [loading, setLoading] = useState(true) const [error, setError] = useState(null) - - const sliderPct = ((targetTemp - 30) / 50) * 100 + const [hasData, setHasData] = useState(false) // Track apakah ada data masuk + const [lastDataTime, setLastDataTime] = useState(null) // Track waktu data terakhir // Fetch latest sensor data const fetchLatestData = async () => { @@ -125,15 +126,32 @@ export default function ControlPanel() { const result = await response.json() if (result.success && result.data) { + // Cek apakah data benar-benar ada (bukan kosong) + const dataAge = new Date().getTime() - new Date(result.data.createdAt).getTime() + const isDataFresh = dataAge < 30000 // Data dianggap segar jika < 30 detik + setCurrentTemp(result.data.suhu) - setIsPowerOn(result.data.heater) // Heater status sebagai power + setIsPowerOn(result.data.heater) // Heater + Fan In status if (result.data.setpoint) { setTargetTemp(result.data.setpoint) } + // Jika backend mengembalikan status exhaust + if (result.data.exhaust !== undefined) { + setIsExhaustOn(result.data.exhaust) + } + + // Set hasData hanya jika data segar + setHasData(isDataFresh) + setLastDataTime(new Date(result.data.createdAt)) setError(null) + } else { + // Tidak ada data + setHasData(false) + setLastDataTime(null) } } catch (err) { setError('Gagal memuat data sensor') + setHasData(false) console.error('Error fetching latest data:', err) } finally { setLoading(false) @@ -174,7 +192,7 @@ export default function ControlPanel() { } } - // Toggle heater (kontrol manual) + // Toggle heater + fan in (kontrol manual) const handlePowerToggle = async () => { const newState = !isPowerOn @@ -194,9 +212,9 @@ export default function ControlPanel() { if (result.success) { setIsPowerOn(newState) - console.log('Heater berhasil diubah:', newState ? 'ON' : 'OFF') + console.log('Heater + Fan In berhasil diubah:', newState ? 'ON' : 'OFF') } else { - alert('Gagal mengubah status heater') + alert('Gagal mengubah status heater + fan in') } } catch (err) { alert('Gagal mengirim kontrol') @@ -204,24 +222,33 @@ export default function ControlPanel() { } } - // Update setpoint - const handleSetpointChange = async (newTemp: number) => { - setTargetTemp(newTemp) + // Toggle exhaust fan + const handleExhaustToggle = async () => { + const newState = !isExhaustOn - // Debounce: kirim ke backend setelah user selesai drag - // Untuk sementara langsung kirim try { - await fetch(`${API_URL}/sensor/setpoint`, { + // Endpoint untuk exhaust bisa disesuaikan dengan backend + const response = await fetch(`${API_URL}/sensor/exhaust`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ - setpoint: newTemp + exhaust: newState }) }) + + const result = await response.json() + + if (result.success) { + setIsExhaustOn(newState) + console.log('Exhaust Fan berhasil diubah:', newState ? 'ON' : 'OFF') + } else { + alert('Gagal mengubah status exhaust fan') + } } catch (err) { - console.error('Error setting setpoint:', err) + alert('Gagal mengirim kontrol exhaust') + console.error('Error sending exhaust control:', err) } } @@ -290,30 +317,32 @@ export default function ControlPanel() {

Panel Kontrol Pengeringan Pintar

-
+ {hasData && (
- - Status: {isPowerOn ? 'Online' : 'Offline'} - -
+
+ + Status: Online + +
+ )}
- {/* Power row - Kontrol Manual Heater */} + {/* Power row - Kontrol Heater + Fan In */}
- HEATER + HEATER + FAN IN
- {/* Slider */} + {/* Exhaust Fan row */} +
+ + EXHAUST FAN + + +
+ + {/* Setpoint - READ ONLY (Monitoring) */}
-
+
TARGET SUHU @@ -372,20 +415,22 @@ export default function ControlPanel() { {targetTemp}°C
- - handleSetpointChange(Number(e.target.value))} - style={{ - background: `linear-gradient(to right,#d48c2a ${sliderPct}%,#e8eee0 ${sliderPct}%)`, - }} - /> +
+

+ ℹ️ Target suhu diatur dari aplikasi mobile +

+
)}