import React, { useState, useEffect } from 'react'; import { View, Text, TextInput, Button, FlatList, TouchableOpacity, ScrollView, Dimensions, Alert } from 'react-native'; import { SafeAreaView } from 'react-native-safe-area-context'; import DateTimePicker from '@react-native-community/datetimepicker'; import BigCalendar from 'react-native-big-calendar'; const { width } = Dimensions.get('window'); export default function App() { const [tasks, setTasks] = useState([]); const [newTask, setNewTask] = useState({ title: '', person: '', type: 'Work', reminder: new Date(), completionDate: null }); const [showDatePicker, setShowDatePicker] = useState(false); const [presetServices, setPresetServices] = useState([ { id: 'svc1', name: 'Crane Rental', price: 1200 }, { id: 'svc2', name: 'HVAC Install', price: 2500 }, { id: 'svc3', name: 'Electrical Hookup', price: 800 }, ]); const [selectedServices, setSelectedServices] = useState([]); const [quote, setQuote] = useState(null); const [quotes, setQuotes] = useState([]); const [contacts, setContacts] = useState([]); const [newContact, setNewContact] = useState({ name: '', phone: '', email: '', type: 'Work' }); const [followUpThreshold, setFollowUpThreshold] = useState(7); const [jobs, setJobs] = useState([]); const [jobDate, setJobDate] = useState(new Date()); const [showJobDatePicker, setShowJobDatePicker] = useState(false); const [calendarView, setCalendarView] = useState('month'); useEffect(() => { const now = new Date(); const updatedQuotes = quotes.map(q => { const createdAt = new Date(q.createdAt); const age = Math.floor((now - createdAt) / (1000 * 60 * 60 * 24)); return { ...q, age, needsFollowUp: q.status === 'Pending' && age >= followUpThreshold }; }); setQuotes(updatedQuotes); }, [followUpThreshold]); const scheduleJob = (quoteId) => { const quoteToSchedule = quotes.find(q => q.id === quoteId); if (!quoteToSchedule) return; const job = { id: Date.now().toString(), quoteId, taskId: quoteToSchedule.taskId, description: quoteToSchedule.description, date: jobDate, status: 'Scheduled' }; setJobs([...jobs, job]); setQuotes(quotes.map(q => q.id === quoteId ? { ...q, status: 'Accepted' } : q)); }; const handleDragJob = (event) => { const updatedJobs = jobs.map(job => job.description === event.title ? { ...job, date: event.start } : job ); setJobs(updatedJobs); Alert.alert('Job Rescheduled', `New Date: ${event.start.toLocaleString()}`); }; const calendarEvents = jobs.map(job => ({ title: job.description, start: new Date(job.date), end: new Date(new Date(job.date).getTime() + 60 * 60 * 1000), })); return ( TaskSort + Scheduler Calendar View