import React, { useEffect, useState } from 'react'; import { mowingAPI } from '../../services/api'; import LoadingSpinner from '../../components/UI/LoadingSpinner'; import MowingPlanModal from '../../components/Mowing/MowingPlanModal'; import MowingExecutionModal from '../../components/Mowing/MowingExecutionModal'; import MowingSessionViewModal from '../../components/Mowing/MowingSessionViewModal'; import toast from 'react-hot-toast'; const Mowing = () => { const [plans, setPlans] = useState([]); const [loading, setLoading] = useState(true); const [showPlanModal, setShowPlanModal] = useState(false); const [execPlan, setExecPlan] = useState(null); const [sessions, setSessions] = useState([]); const [viewSession, setViewSession] = useState(null); const fetchPlans = async () => { try { setLoading(true); const r = await mowingAPI.getPlans(); setPlans(r.data.data.plans || []); // also load recent sessions try { const s = await mowingAPI.getLogs(); setSessions(s.data?.data?.logs || []); } catch {} } catch (e) { toast.error('Failed to load mowing plans'); } finally { setLoading(false); } }; useEffect(() => { fetchPlans(); }, []); if (loading) return (
); return (

Mowing

Property
Areas
Date
Mower
Cut Height
Status
Actions
{plans.length === 0 ? (
No mowing plans yet.
) : plans.map((p) => (
{p.property_name}
{p.section_names}
{new Date(p.planned_date).toLocaleDateString()}
{p.equipment_name || '—'}
{p.cut_height_inches}"
{p.status}
{p.status !== 'archived' && ( )}
))}
{showPlanModal && ( setShowPlanModal(false)} onCreated={fetchPlans} /> )} {execPlan && ( setExecPlan(null)} onComplete={fetchPlans} /> )} {/* Recent Sessions */}

Recent Sessions

Property
Mower
Cut Height
Avg Speed
Distance
Actions
{sessions.length === 0 ? (
No sessions yet.
) : sessions.map((s) => (
{s.property_name}
{s.equipment_name || '—'}
{Number(s.cut_height_inches || 0).toFixed(2)}"
{(s.average_speed_mph || s.averageSpeed || 0).toFixed?.(1) || Number(s.averageSpeed || 0).toFixed(1)} mph
{Math.round(((s.total_distance_meters || s.gpsTrack?.totalDistance || 0) * 3.28084) || 0)} ft
))}
{viewSession && ( setViewSession(null)} /> )}
); }; export default Mowing;