import React, { useState, useEffect } from 'react'; import { PlusIcon, MapPinIcon, BeakerIcon, WrenchScrewdriverIcon, CalculatorIcon } from '@heroicons/react/24/outline'; import { propertiesAPI, productsAPI, equipmentAPI } from '../../services/api'; import LoadingSpinner from '../../components/UI/LoadingSpinner'; import toast from 'react-hot-toast'; const Applications = () => { const [showPlanForm, setShowPlanForm] = useState(false); const [applications, setApplications] = useState([]); const [loading, setLoading] = useState(true); useEffect(() => { fetchApplications(); }, []); const fetchApplications = async () => { try { setLoading(true); // TODO: Implement applications API endpoint setApplications([]); } catch (error) { console.error('Failed to fetch applications:', error); toast.error('Failed to load applications'); } finally { setLoading(false); } }; if (loading) { return (
); } return (

Applications

Plan, track, and log your lawn applications

{/* Applications List */} {applications.length === 0 ? (

No Applications Yet

Start by planning your first lawn application

) : (
{applications.map((application) => (
{/* Application card content will go here */}

Application: {application.id}

))}
)} {/* Plan Application Modal */} {showPlanForm && ( setShowPlanForm(false)} onSubmit={(planData) => { console.log('Plan submitted:', planData); setShowPlanForm(false); fetchApplications(); }} /> )}
); }; // Application Planning Modal Component const ApplicationPlanModal = ({ onClose, onSubmit }) => { const [properties, setProperties] = useState([]); const [products, setProducts] = useState([]); const [equipment, setEquipment] = useState([]); const [selectedPropertyDetails, setSelectedPropertyDetails] = useState(null); const [loading, setLoading] = useState(true); const [loadingProperty, setLoadingProperty] = useState(false); const [planData, setPlanData] = useState({ propertyId: '', selectedAreas: [], productId: '', applicationType: '', // 'liquid' or 'granular' equipmentId: '', notes: '' }); useEffect(() => { fetchPlanningData(); }, []); const fetchPlanningData = async () => { try { setLoading(true); const [propertiesResponse, productsResponse, equipmentResponse] = await Promise.all([ propertiesAPI.getAll(), productsAPI.getAll(), equipmentAPI.getAll() ]); console.log('Properties response:', propertiesResponse.data); console.log('Products response:', productsResponse.data); console.log('Equipment response:', equipmentResponse.data); setProperties(propertiesResponse.data.data.properties || []); // Combine shared and user products const allProducts = [ ...(productsResponse.data.data.sharedProducts || []), ...(productsResponse.data.data.userProducts || []) ]; setProducts(allProducts); setEquipment(equipmentResponse.data.data.equipment || []); } catch (error) { console.error('Failed to fetch planning data:', error); toast.error('Failed to load planning data'); } finally { setLoading(false); } }; const fetchPropertyDetails = async (propertyId) => { try { setLoadingProperty(true); const response = await propertiesAPI.getById(parseInt(propertyId)); console.log('Property details response:', response.data); setSelectedPropertyDetails(response.data.data.property); } catch (error) { console.error('Failed to fetch property details:', error); toast.error('Failed to load property details'); setSelectedPropertyDetails(null); } finally { setLoadingProperty(false); } }; const handlePropertyChange = (propertyId) => { setPlanData({ ...planData, propertyId, selectedAreas: [] }); setSelectedPropertyDetails(null); if (propertyId) { fetchPropertyDetails(propertyId); } }; // Filter equipment based on application type const availableEquipment = equipment.filter(eq => { if (planData.applicationType === 'liquid') { return eq.categoryName === 'Sprayer'; } else if (planData.applicationType === 'granular') { return eq.categoryName === 'Spreader'; } return false; }); const handleSubmit = (e) => { e.preventDefault(); if (!planData.propertyId || planData.selectedAreas.length === 0) { toast.error('Please select a property and at least one area'); return; } if (!planData.productId) { toast.error('Please select a product'); return; } if (!planData.equipmentId) { toast.error('Please select equipment'); return; } onSubmit(planData); }; const handleAreaToggle = (areaId) => { setPlanData(prev => ({ ...prev, selectedAreas: prev.selectedAreas.includes(areaId) ? prev.selectedAreas.filter(id => id !== areaId) : [...prev.selectedAreas, areaId] })); }; return (

Plan Application

{loading ? ( ) : (
{/* Property Selection */}
{/* Area Selection */} {loadingProperty && (
Loading property details...
)} {selectedPropertyDetails && selectedPropertyDetails.sections && selectedPropertyDetails.sections.length > 0 && (
{selectedPropertyDetails.sections.map((section) => ( ))}
{planData.selectedAreas.length > 0 && (

Total area: {selectedPropertyDetails.sections .filter(s => planData.selectedAreas.includes(s.id)) .reduce((total, s) => total + (s.area || 0), 0).toFixed(0)} sq ft

)}
)} {selectedPropertyDetails && (!selectedPropertyDetails.sections || selectedPropertyDetails.sections.length === 0) && (

This property has no lawn sections defined. Please add lawn sections to the property first.

)} {/* Product Selection */}
{/* Equipment Selection */} {planData.applicationType && (
{availableEquipment.length === 0 && (

No {planData.applicationType === 'liquid' ? 'sprayers' : 'spreaders'} found. Please add equipment first.

)}
)} {/* Notes */}