import React, { useEffect, useState } from 'react'; import { Row, Col, Card, Typography, Button, Space, message, Table, Image, Grid, Skeleton } from 'antd'; import { useNavigate, Link } from 'react-router-dom'; import api, { API_BASE_URL } from '../utils/api'; import { colors, spacing, fontSize, buttonStyles, commonStyles } from '../theme'; const { Title } = Typography; const { useBreakpoint } = Grid; const deliveriesColumns = [ { title: 'Date', dataIndex: 'delivery_date', key: 'delivery_date', render: (date) => date ? new Date(date).toLocaleDateString() : 'N/A' }, { title: 'Gallons', dataIndex: 'gallons', key: 'gallons', render: (gallons) => gallons ? `${gallons} gal` : 'N/A' }, { title: 'Price', dataIndex: 'customer_price', key: 'customer_price', render: (price) => price ? `$${price.toFixed(2)}` : 'N/A' }, { title: 'Status', dataIndex: 'delivery_status', key: 'delivery_status', render: (status) => { if (status === 'Pending') return 'pending cc charge'; if (status === 'Finalized') return 'Delivered/Charged'; if (status === 'Waiting') return 'waiting for delivery'; return status; } }, { title: 'Payment Type', dataIndex: 'payment_type', key: 'payment_type' } ]; function Index() { const navigate = useNavigate(); const isLoggedIn = !!localStorage.getItem('token'); const [userData, setUserData] = useState(null); const [deliveries, setDeliveries] = useState([]); const [tankImages, setTankImages] = useState([]); const [pricing, setPricing] = useState(null); const [loadingUser, setLoadingUser] = useState(true); const [loadingDeliveries, setLoadingDeliveries] = useState(true); const [loadingTankImages, setLoadingTankImages] = useState(true); const [loadingPricing, setLoadingPricing] = useState(true); const screens = useBreakpoint(); const fetchTankImages = async (accountNumber) => { setLoadingTankImages(true); try { const response = await api.get(`/auth/tank-images/${accountNumber}`); // Get the latest image set (first one after sorting) const imageGroups = response.data.image_sets.map(set => ({ date: set.date, images: set.images.map(img => `${API_BASE_URL}${img}`) })); // Sort by date descending (newest first) imageGroups.sort((a, b) => { const parseDate = (dateStr) => { if (dateStr.includes('_')) { const [datePart, timePart] = dateStr.split('_'); const [year, month, day] = datePart.split('-'); const [hour, minute, second] = timePart.split('-'); return new Date(year, month - 1, day, hour, minute, second); } else { return new Date(dateStr); } }; return parseDate(b.date) - parseDate(a.date); }); setTankImages(imageGroups[0]?.images || []); } catch (error) { console.error('Failed to load tank images:', error); // No fallback to example images on main page } finally { setLoadingTankImages(false); } }; useEffect(() => { if (isLoggedIn) { const fetchUserData = async () => { setLoadingUser(true); try { const response = await api.get('/auth/me'); setUserData(response.data); await fetchTankImages(response.data.account_number); } catch (error) { message.error('Failed to load user data'); console.error('Error fetching user data:', error); } finally { setLoadingUser(false); } }; const fetchDeliveries = async () => { setLoadingDeliveries(true); try { const response = await api.get('/info/deliveries'); setDeliveries(response.data); } catch (error) { message.error('Failed to load deliveries'); console.error('Error fetching deliveries:', error); } finally { setLoadingDeliveries(false); } }; const fetchPricing = async () => { setLoadingPricing(true); try { const response = await api.get('/info/pricing/current'); setPricing(response.data); } catch (error) { console.error('Failed to load pricing:', error); } finally { setLoadingPricing(false); } }; fetchUserData(); fetchDeliveries(); fetchPricing(); } else { // Reset loading states when not logged in setLoadingUser(false); setLoadingDeliveries(false); setLoadingTankImages(false); setLoadingPricing(false); } }, [isLoggedIn]); if (!isLoggedIn) { return (
Welcome to Oil Customer Gateway
For customers with an existing online account
For existing customers who haven't signed up for online access
For new customers to Auburn Oil
); } return (
{/* Row 1: Customer Information and Order Oil */} Edit} > {loadingUser ? ( <>
) : userData ? ( <>
{userData.account_number}

Name: {userData.customer_first_name} {userData.customer_last_name}

Address: {userData.customer_address}, {userData.customer_town}, {userData.customer_state} {userData.customer_zip}

Phone: {userData.customer_phone_number}

Email: {userData.email}

) : (

Failed to load customer information.

)}
{loadingPricing ? ( ) : pricing ? ( Todays Price: ${pricing.price_per_gallon.toFixed(2)} ) : ( Todays Price: N/A )}
{/* Row 2: Tank Images and Emergency Delivery Info */} {loadingTankImages ? ( <> {[1, 2, 3].map((i) => ( ))} ) : tankImages.length > 0 ? ( <> {tankImages.map((image, index) => ( {`Tank ))} Upload / Edit images ) : ( <> Please upload tank images

Upload / Edit images )}
We do deliveries after hours, nights, weekends, holidays as emergency. Snow may effect delivery. We reserve the right to cancel deliveries if tank is not safe to deliver.
{/* Row 3: My Deliveries (Full Width) */} {loadingDeliveries ? ( screens.xs && !screens.sm ? ( // Mobile: Skeleton Cards
{[1, 2, 3].map((i) => ( ))}
) : ( // Desktop/Tablet: Skeleton Table
) ) : deliveries.length > 0 ? ( screens.xs && !screens.sm ? ( // Mobile: Cards
{deliveries.map((delivery) => { let cardStyle = { marginBottom: spacing.xs, maxWidth: '100%' }; if (delivery.delivery_status === 'Waiting') { cardStyle.backgroundColor = colors.successLight; } else if (delivery.delivery_status === 'Out for Delivery') { cardStyle.border = `2px solid ${colors.gold}`; cardStyle.boxShadow = colors.goldGlow; } return ( Date:
{delivery.delivery_date ? new Date(delivery.delivery_date).toLocaleDateString() : 'N/A'} Gallons:
{delivery.gallons ? `${delivery.gallons} gal` : 'N/A'} Price:
{delivery.customer_price ? `$${delivery.customer_price.toFixed(2)}` : 'N/A'} Status:
{(() => { if (delivery.delivery_status === 'Pending') return 'pending cc charge'; if (delivery.delivery_status === 'Finalized') return 'Delivered/Charged'; if (delivery.delivery_status === 'Waiting') return 'waiting for delivery'; return delivery.delivery_status; })()} Payment:
{delivery.payment_type}
); })}
) : ( // Desktop/Tablet: Table
{ if (record.delivery_status === 'Waiting') return 'waiting-delivery'; if (record.delivery_status === 'Out for Delivery') return 'out-for-delivery'; return ''; }} /> ) ) : (

No deliveries found.

)} )} export default Index;