import React, { useState, useEffect } from 'react'; import { Search, User, LogIn, Home, MessageSquare, Bell, Settings, Star, Edit, Trash, X, Check, Upload, Send, Calendar, Phone, MapPin, Briefcase, DollarSign, Users, PlusCircle, AlertCircle, Eye, EyeOff, Menu, ChevronDown, ChevronRight } from 'lucide-react'; // Main App Component export default function App() { const [page, setPage] = useState('home'); const [user, setUser] = useState(null); const [isAdmin, setIsAdmin] = useState(false); const [searchParams, setSearchParams] = useState({ query: '', town: '', service: '' }); const [searchResults, setSearchResults] = useState([]); const [notifications, setNotifications] = useState([]); const [interestedMessages, setInterestedMessages] = useState([]); const [adminPassword, setAdminPassword] = useState('jUDmi'); const [masterPhrase, setMasterPhrase] = useState('changeme'); const [advertisements, setAdvertisements] = useState([]); const [services, setServices] = useState([ 'Pianist', 'Bassist', 'Saxophonist', 'Drummer', 'Soloist', 'Singer', 'Comedian', 'MC', 'DJ', 'Service Traiter', 'Cake and pastries', 'Driver on Hire', 'Electrician', 'Graphic Designer', 'Music Band', 'Halls', 'Car for rent', 'Event Decor', 'House Help', 'Delivery Agent', 'Makeup Artist', 'Hair styler', 'Builder', 'Painter', 'Taxi driver', 'Bike man' ]); const [towns, setTowns] = useState([ 'Bamenda', 'Buea', 'Bafoussam', 'Yaounde', 'Douala', 'Kribi', 'Kumba', 'Limbe', 'Bertoua', 'Ngaoundere' ]); const [providers, setProviders] = useState([]); const [tempFormData, setTempFormData] = useState({}); const [error, setError] = useState(''); const [success, setSuccess] = useState(''); const [adminView, setAdminView] = useState('dashboard'); const [selectedProvider, setSelectedProvider] = useState(null); const [messageText, setMessageText] = useState(''); const [allowReply, setAllowReply] = useState(true); const [blockedProviders, setBlockedProviders] = useState([]); const [ratingHistory, setRatingHistory] = useState({}); const [adRequests, setAdRequests] = useState([]); // Load data from localStorage on initial render useEffect(() => { const storedProviders = localStorage.getItem('providers'); if (storedProviders) setProviders(JSON.parse(storedProviders)); const storedNotifications = localStorage.getItem('notifications'); if (storedNotifications) setNotifications(JSON.parse(storedNotifications)); const storedInterestedMessages = localStorage.getItem('interestedMessages'); if (storedInterestedMessages) setInterestedMessages(JSON.parse(storedInterestedMessages)); const storedAdminPassword = localStorage.getItem('adminPassword'); if (storedAdminPassword) setAdminPassword(storedAdminPassword); const storedAdvertisements = localStorage.getItem('advertisements'); if (storedAdvertisements) setAdvertisements(JSON.parse(storedAdvertisements)); const storedServices = localStorage.getItem('services'); if (storedServices) setServices(JSON.parse(storedServices)); const storedTowns = localStorage.getItem('towns'); if (storedTowns) setTowns(JSON.parse(storedTowns)); const storedBlockedProviders = localStorage.getItem('blockedProviders'); if (storedBlockedProviders) setBlockedProviders(JSON.parse(storedBlockedProviders)); const storedRatingHistory = localStorage.getItem('ratingHistory'); if (storedRatingHistory) setRatingHistory(JSON.parse(storedRatingHistory)); const storedAdRequests = localStorage.getItem('adRequests'); if (storedAdRequests) setAdRequests(JSON.parse(storedAdRequests)); // Check for logged in user const loggedInUser = localStorage.getItem('currentUser'); if (loggedInUser) { setUser(JSON.parse(loggedInUser)); } }, []); // Save data to localStorage whenever it changes useEffect(() => { localStorage.setItem('providers', JSON.stringify(providers)); }, [providers]); useEffect(() => { localStorage.setItem('notifications', JSON.stringify(notifications)); }, [notifications]); useEffect(() => { localStorage.setItem('interestedMessages', JSON.stringify(interestedMessages)); }, [interestedMessages]); useEffect(() => { localStorage.setItem('adminPassword', adminPassword); }, [adminPassword]); useEffect(() => { localStorage.setItem('advertisements', JSON.stringify(advertisements)); }, [advertisements]); useEffect(() => { localStorage.setItem('services', JSON.stringify(services)); }, [services]); useEffect(() => { localStorage.setItem('towns', JSON.stringify(towns)); }, [towns]); useEffect(() => { localStorage.setItem('blockedProviders', JSON.stringify(blockedProviders)); }, [blockedProviders]); useEffect(() => { localStorage.setItem('ratingHistory', JSON.stringify(ratingHistory)); }, [ratingHistory]); useEffect(() => { localStorage.setItem('adRequests', JSON.stringify(adRequests)); }, [adRequests]); useEffect(() => { if (user) { localStorage.setItem('currentUser', JSON.stringify(user)); } else { localStorage.removeItem('currentUser'); } }, [user]); // Helper function to show error message const showError = (message) => { setError(message); setTimeout(() => setError(''), 3000); }; // Helper function to show success message const showSuccess = (message) => { setSuccess(message); setTimeout(() => setSuccess(''), 3000); }; // Handle login const handleLogin = (username, password) => { const foundUser = providers.find( p => p.name.toLowerCase() === username.toLowerCase() && p.password === password ); if (foundUser) { setUser(foundUser); setPage('providerProfile'); showSuccess('Login successful!'); } else if (password === adminPassword) { setIsAdmin(true); setPage('adminPanel'); showSuccess('Admin login successful!'); } else { showError('Invalid username or password'); } }; // Handle logout const handleLogout = () => { setUser(null); setIsAdmin(false); setPage('home'); }; // Handle registration const handleRegister = (formData) => { // Check if user already exists const userExists = providers.some( p => p.name.toLowerCase() === formData.name.toLowerCase() || p.whatsappNumber === formData.whatsappNumber ); if (userExists) { showError('A user with this name or WhatsApp number already exists'); return; } // Validate password match if (formData.password !== formData.confirmPassword) { showError('Passwords do not match'); return; } // Validate minimum payment (max 6 figures) if (formData.minimumPayment > 999999 || formData.minimumPayment < 0) { showError('Minimum payment must be between 0 and 999,999'); return; } // Create new provider const newProvider = { id: Date.now().toString(), name: formData.name, password: formData.password, age: formData.age, gender: formData.gender, town: formData.town, service: formData.service, minimumPayment: formData.minimumPayment, whatsappNumber: formData.whatsappNumber, pictures: formData.pictures || [], quarter: formData.quarter || '', rating: 0, ratingCount: 0, messages: [], dateRegistered: new Date().toISOString(), }; setProviders([...providers, newProvider]); setUser(newProvider); setPage('providerProfile'); showSuccess('Registration successful!'); }; // Handle search const handleSearch = (query, type = 'general') => { // Check for admin access if (query === adminPassword) { setIsAdmin(true); setPage('adminPanel'); return; } // Check for master phrase to change admin password if (query === masterPhrase) { const newPassword = prompt('Enter new admin password:'); if (newPassword && newPassword.trim() !== '') { setAdminPassword(newPassword); showSuccess('Admin password changed successfully'); } return; } // Filter out blocked providers const availableProviders = providers.filter(p => !blockedProviders.includes(p.id)); let results = []; if (type === 'general') { // Search by name, service, or town results = availableProviders.filter(p => p.name.toLowerCase().includes(query.toLowerCase()) || p.service.toLowerCase().includes(query.toLowerCase()) || p.town.toLowerCase().includes(query.toLowerCase()) ); } else if (type === 'townAndService') { // Search by town and service results = availableProviders.filter(p => p.town === searchParams.town && p.service === searchParams.service ); } setSearchResults(results); }; // Handle rating a provider const handleRateProvider = (providerId, rating) => { const currentDate = new Date(); const currentWeek = `${currentDate.getFullYear()}-${Math.floor(currentDate.getDate() / 7)}`; const userIP = 'user-' + Math.random().toString(36).substring(2, 15); // Simulating user identification // Check if user has already rated this provider this week const ratingKey = `${userIP}-${providerId}-${currentWeek}`; if (ratingHistory[ratingKey]) { showError('You can only rate a provider once per week'); return; } // Update provider rating const updatedProviders = providers.map(p => { if (p.id === providerId) { const newRatingCount = p.ratingCount + 1; const newRating = ((p.rating * p.ratingCount) + rating) / newRatingCount; return { ...p, rating: newRating, ratingCount: newRatingCount }; } return p; }); // Update rating history setRatingHistory({ ...ratingHistory, [ratingKey]: true }); setProviders(updatedProviders); showSuccess('Rating submitted successfully'); }; // Handle interested button click const handleInterested = (provider) => { setSelectedProvider(provider); setTempFormData({ providerName: provider.name, providerId: provider.id }); setPage('interestedForm'); }; // Submit interested form const submitInterestedForm = (formData) => { const newMessage = { id: Date.now().toString(), providerId: formData.providerId, providerName: formData.providerName, visitorNumber: formData.whatsappNumber, message: formData.message, timestamp: new Date().toISOString(), town: selectedProvider.town, service: selectedProvider.service }; // Add to interested messages setInterestedMessages([newMessage, ...interestedMessages]); // Add to provider's messages const updatedProviders = providers.map(p => { if (p.id === formData.providerId) { return { ...p, messages: [newMessage, ...(p.messages || [])] }; } return p; }); setProviders(updatedProviders); setPage('findService'); showSuccess('Your message has been sent to the service provider'); }; // Cancel interested request const cancelInterestedRequest = (messageId) => { // Remove from interested messages const updatedMessages = interestedMessages.filter(m => m.id !== messageId); setInterestedMessages(updatedMessages); // Remove from provider's messages const updatedProviders = providers.map(p => { return { ...p, messages: (p.messages || []).filter(m => m.id !== messageId) }; }); setProviders(updatedProviders); showSuccess('Request cancelled successfully'); }; // Admin functions const adminDeleteMessage = (messageId) => { const updatedMessages = interestedMessages.filter(m => m.id !== messageId); setInterestedMessages(updatedMessages); const updatedProviders = providers.map(p => { return { ...p, messages: (p.messages || []).filter(m => m.id !== messageId) }; }); setProviders(updatedProviders); showSuccess('Message deleted successfully'); }; const adminSendMessage = (providerId, message, allowReply) => { const newNotification = { id: Date.now().toString(), providerId, message, allowReply, timestamp: new Date().toISOString(), isRead: false, replies: [] }; setNotifications([...notifications, newNotification]); showSuccess('Message sent to provider'); setMessageText(''); }; const adminBroadcastMessage = (targetService, targetTown, message, allowReply) => { let targetProviders = [...providers]; if (targetService) { targetProviders = targetProviders.filter(p => p.service === targetService); } if (targetTown) { targetProviders = targetProviders.filter(p => p.town === targetTown); } const newNotifications = targetProviders.map(provider => ({ id: Date.now().toString() + '-' + provider.id, providerId: provider.id, message, allowReply, timestamp: new Date().toISOString(), isRead: false, replies: [] })); setNotifications([...notifications, ...newNotifications]); showSuccess(`Message broadcast to ${targetProviders.length} providers`); setMessageText(''); }; const adminDeleteProvider = (providerId) => { const updatedProviders = providers.filter(p => p.id !== providerId); setProviders(updatedProviders); showSuccess('Provider deleted successfully'); }; const adminBlockProvider = (providerId) => { if (blockedProviders.includes(providerId)) { setBlockedProviders(blockedProviders.filter(id => id !== providerId)); showSuccess('Provider unblocked successfully'); } else { setBlockedProviders([...blockedProviders, providerId]); showSuccess('Provider blocked successfully'); } }; const adminAddToAdvertisements = (providerId) => { const provider = providers.find(p => p.id === providerId); if (!provider) return; if (advertisements.some(ad => ad.id === providerId)) { showError('This provider is already in advertisements'); return; } setAdvertisements([...advertisements, provider]); showSuccess('Provider added to advertisements'); }; const adminRemoveFromAdvertisements = (providerId) => { const updatedAds = advertisements.filter(ad => ad.id !== providerId); setAdvertisements(updatedAds); showSuccess('Provider removed from advertisements'); }; const adminAddService = (service) => { if (services.includes(service)) { showError('This service already exists'); return; } setServices([...services, service]); showSuccess('Service added successfully'); }; const adminDeleteService = (service) => { const updatedServices = services.filter(s => s !== service); setServices(updatedServices); showSuccess('Service deleted successfully'); }; const adminAddTown = (town) => { if (towns.includes(town)) { showError('This town already exists'); return; } setTowns([...towns, town]); showSuccess('Town added successfully'); }; const adminDeleteTown = (town) => { const updatedTowns = towns.filter(t => t !== town); setTowns(updatedTowns); showSuccess('Town deleted successfully'); }; // Provider functions const providerUpdateProfile = (updatedData) => { const updatedProviders = providers.map(p => { if (p.id === user.id) { return { ...p, ...updatedData }; } return p; }); setProviders(updatedProviders); setUser({ ...user, ...updatedData }); showSuccess('Profile updated successfully'); }; const providerReplyToAdmin = (notificationId, reply) => { const updatedNotifications = notifications.map(n => { if (n.id === notificationId) { return { ...n, replies: [...(n.replies || []), { id: Date.now().toString(), message: reply, timestamp: new Date().toISOString() }] }; } return n; }); setNotifications(updatedNotifications); showSuccess('Reply sent to admin'); }; // Handle advertisement request const handleAdRequest = (formData) => { const newRequest = { id: Date.now().toString(), name: formData.name, number: formData.number, message: formData.message, timestamp: new Date().toISOString() }; setAdRequests([newRequest, ...adRequests]); showSuccess('Advertisement request sent successfully'); }; // Render different pages based on current state const renderPage = () => { switch (page) { case 'home': return ; case 'login': return ; case 'register': return ; case 'findService': return ; case 'interestedForm': return ; case 'providerProfile': return n.providerId === user.id)} providerReplyToAdmin={providerReplyToAdmin} handleLogout={handleLogout} services={services} towns={towns} />; case 'adminPanel': return ; default: return ; } }; return (
{/* Header */}

setPage('home')}> Freelance Services

{!user && !isAdmin && ( <> )} {(user || isAdmin) && ( )}
{/* Main Content */}
{/* Error and Success Messages */} {error && (
{error}
)} {success && (
{success}
)} {/* Page Content */} {renderPage()}
{/* Footer */}

Freelance Services

Connect with skilled service providers in your area

Quick Links

  • setPage('home')}>Home
  • setPage('findService')}>Find Service
  • setPage('login')}>Login
  • setPage('register')}>Register
© {new Date().getFullYear()} Freelance Services. All rights reserved.
); } // Home Page Component function HomePage({ setPage, advertisements = [], handleInterested, handleAdRequest }) { const [adRequestForm, setAdRequestForm] = useState({ name: '', number: '', message: '' }); const [showAdForm, setShowAdForm] = useState(false); const handleAdFormSubmit = (e) => { e.preventDefault(); handleAdRequest(adRequestForm); setAdRequestForm({ name: '', number: '', message: '' }); setShowAdForm(false); }; return (

Welcome to Freelance Services

setPage('findService')} className="bg-blue-600 text-white rounded-lg shadow-lg p-8 text-center cursor-pointer hover:bg-blue-700 transition-colors flex flex-col items-center justify-center" >

Find Service

Search for service providers in your area

setPage('login')} className="bg-orange-500 text-white rounded-lg shadow-lg p-8 text-center cursor-pointer hover:bg-orange-600 transition-colors flex flex-col items-center justify-center" >

Login

Access your service provider account

{/* Advertisements Section */} {advertisements.length > 0 && (

Featured Service Providers

{advertisements.map(ad => (
{ad.pictures && ad.pictures.length > 0 ? (
{ad.name}
) : (
)}

{ad.name}

{ad.service}
{ad.town}
From {ad.minimumPayment} CFA
{ad.rating > 0 && (
{[...Array(5)].map((_, i) => ( ))} ({ad.ratingCount} ratings)
)}
))}
)} {/* Ad Request Form Modal */} {showAdForm && (

Request Advertisement

setAdRequestForm({...adRequestForm, name: e.target.value})} className="w-full p-2 border border-gray-300 rounded" required />
setAdRequestForm({...adRequestForm, number: e.target.value})} className="w-full p-2 border border-gray-300 rounded" required />
)}
); } // Login Page Component function LoginPage({ handleLogin, setPage }) { const [formData, setFormData] = useState({ username: '', password: '' }); const handleSubmit = (e) => { e.preventDefault(); handleLogin(formData.username, formData.password); }; return (

Login

setFormData({...formData, username: e.target.value})} className="w-full p-3 border border-gray-300 rounded" required />
setFormData({...formData, password: e.target.value})} className="w-full p-3 border border-gray-300 rounded" required />

Don't have an account?{' '}

); } // Register Page Component function RegisterPage({ handleRegister, services, towns, setPage }) { const [formData, setFormData] = useState({ name: '', password: '', confirmPassword: '', age: '', gender: '', town: '', service: '', minimumPayment: '', whatsappNumber: '', pictures: [], quarter: '' }); const [pictureFiles, setPictureFiles] = useState([]); const [picturePreview, setPicturePreview] = useState([]); const handleSubmit = (e) => { e.preventDefault(); handleRegister(formData); }; const handlePictureChange = (e) => { if (e.target.files) { const filesArray = Array.from(e.target.files).slice(0, 4); // Max 4 pictures // Create preview URLs const previewArray = filesArray.map(file => URL.createObjectURL(file)); setPicturePreview([...picturePreview, ...previewArray].slice(0, 4)); setPictureFiles([...pictureFiles, ...filesArray].slice(0, 4)); // Convert to base64 for storage const promises = filesArray.map(file => { return new Promise((resolve, reject) => { const reader = new FileReader(); reader.onload = (e) => resolve(e.target.result); reader.onerror = reject; reader.readAsDataURL(file); }); }); Promise.all(promises).then(base64files => { setFormData({ ...formData, pictures: [...(formData.pictures || []), ...base64files].slice(0, 4) }); }); } }; const removePicture = (index) => { const updatedPreviews = [...picturePreview]; const updatedFiles = [...pictureFiles]; const updatedPictures = [...formData.pictures]; updatedPreviews.splice(index, 1); updatedFiles.splice(index, 1); updatedPictures.splice(index, 1); setPicturePreview(updatedPreviews); setPictureFiles(updatedFiles); setFormData({...formData, pictures: updatedPictures}); }; return (

Service Provider Registration

setFormData({...formData, name: e.target.value})} className="w-full p-3 border border-gray-300 rounded" required />
setFormData({...formData, age: e.target.value})} className="w-full p-3 border border-gray-300 rounded" required min="18" />
setFormData({...formData, password: e.target.value})} className="w-full p-3 border border-gray-300 rounded" required />
setFormData({...formData, confirmPassword: e.target.value})} className="w-full p-3 border border-gray-300 rounded" required />
setFormData({...formData, minimumPayment: e.target.value})} className="w-full p-3 border border-gray-300 rounded" required min="0" max="999999" />
setFormData({...formData, whatsappNumber: e.target.value})} className="w-full p-3 border border-gray-300 rounded" required />
setFormData({...formData, quarter: e.target.value})} className="w-full p-3 border border-gray-300 rounded" />
{picturePreview.map((url, index) => (
{`Preview
))} {picturePreview.length < 4 && ( )}

Already have an account?{' '}

); } // Find Service Page Component function FindServicePage({ searchParams, setSearchParams, handleSearch, searchResults, services, towns, handleRateProvider, handleInterested, setPage }) { const [searchType, setSearchType] = useState('general'); const [showRatingModal, setShowRatingModal] = useState(false); const [selectedProvider, setSelectedProvider] = useState(null); const [ratingValue, setRatingValue] = useState(5); const handleSubmit = (e) => { e.preventDefault(); if (searchType === 'general') { handleSearch(searchParams.query); } else { handleSearch('', 'townAndService'); } }; const openRatingModal = (provider) => { setSelectedProvider(provider); setShowRatingModal(true); }; const submitRating = () => { handleRateProvider(selectedProvider.id, ratingValue); setShowRatingModal(false); }; return (

Find Service Providers

{searchType === 'general' ? (
setSearchParams({...searchParams, query: e.target.value})} placeholder="Search by name, service, or town..." className="w-full p-3 pr-12 border border-gray-300 rounded" required />
) : (
)}
{/* Search Results */} {searchResults.length > 0 ? (

Search Results ({searchResults.length})

{searchResults.map(provider => (
{provider.pictures && provider.pictures.length > 0 ? (
{provider.name}
) : (
)}

{provider.name}

{provider.service}
{provider.town}
From {provider.minimumPayment} CFA
{[...Array(5)].map((_, i) => ( ))} ({provider.ratingCount} ratings)
{provider.pictures && provider.pictures.length > 1 && (
{provider.pictures.slice(1).map((pic, index) => ( {`${provider.name} ))}
)}
))}
) : (
{searchType === 'general' && searchParams.query ? "No results found. Try a different search term." : "Search for service providers using the form above."}
)} {/* Rating Modal */} {showRatingModal && selectedProvider && (

Rate {selectedProvider.name}

{[1, 2, 3, 4, 5].map(star => ( setRatingValue(star)} className={`cursor-pointer ${star <= ratingValue ? "text-yellow-500 fill-yellow-500" : "text-gray-300"}`} /> ))}
)}
); } // Interested Form Page Component function InterestedFormPage({ selectedProvider, submitInterestedForm, cancelInterestedRequest, setPage }) { const [formData, setFormData] = useState({ providerId: selectedProvider?.id || '', providerName: selectedProvider?.name || '', whatsappNumber: '', message: '' }); const handleSubmit = (e) => { e.preventDefault(); submitInterestedForm(formData); }; return (

Contact Service Provider

Send your contact details to {selectedProvider?.name}

setFormData({...formData, whatsappNumber: e.target.value})} className="w-full p-3 border border-gray-300 rounded" required />
); } // Provider Profile Page Component function ProviderProfilePage({ user, providerUpdateProfile, notifications, providerReplyToAdmin, handleLogout, services, towns }) { const [activeTab, setActiveTab] = useState('profile'); const [editMode, setEditMode] = useState(false); const [formData, setFormData] = useState({...user}); const [replyText, setReplyText] = useState(''); const [replyingTo, setReplyingTo] = useState(null); const [pictureFiles, setPictureFiles] = useState([]); const [picturePreview, setPicturePreview] = useState(user.pictures || []); const handleSubmit = (e) => { e.preventDefault(); providerUpdateProfile(formData); setEditMode(false); }; const handlePictureChange = (e) => { if (e.target.files) { const filesArray = Array.from(e.target.files).slice(0, 4 - (picturePreview.length || 0)); // Max 4 pictures // Create preview URLs for new files const previewArray = filesArray.map(file => URL.createObjectURL(file)); setPicturePreview([...picturePreview, ...previewArray].slice(0, 4)); setPictureFiles([...pictureFiles, ...filesArray].slice(0, 4)); // Convert to base64 for storage const promises = filesArray.map(file => { return new Promise((resolve, reject) => { const reader = new FileReader(); reader.onload = (e) => resolve(e.target.result); reader.onerror = reject; reader.readAsDataURL(file); }); }); Promise.all(promises).then(base64files => { setFormData({ ...formData, pictures: [...(formData.pictures || []), ...base64files].slice(0, 4) }); }); } }; const removePicture = (index) => { const updatedPreviews = [...picturePreview]; const updatedFiles = [...pictureFiles]; const updatedPictures = [...formData.pictures]; updatedPreviews.splice(index, 1); updatedFiles.splice(index, 1); updatedPictures.splice(index, 1); setPicturePreview(updatedPreviews); setPictureFiles(updatedFiles); setFormData({...formData, pictures: updatedPictures}); }; const handleReply = (notification) => { if (replyText.trim() === '') return; providerReplyToAdmin(notification.id, replyText); setReplyText(''); setReplyingTo(null); }; const formatDate = (dateString) => { const date = new Date(dateString); return date.toLocaleString(); }; return (

Service Provider Dashboard

{activeTab === 'profile' && (
{!editMode ? (

Profile Information

Name

{user.name}

Age

{user.age}

Gender

{user.gender}

Town

{user.town}

Service

{user.service}

Minimum Payment

{user.minimumPayment} CFA

WhatsApp Number

{user.whatsappNumber}

{user.quarter && (

Quarter

{user.quarter}

)}

Rating

{[...Array(5)].map((_, i) => ( ))} ({user.ratingCount} ratings)
{user.pictures && user.pictures.length > 0 && (

Pictures

{user.pictures.map((pic, index) => ( {`${user.name} ))}
)}
) : (

Edit Profile

setFormData({...formData, name: e.target.value})} className="w-full p-3 border border-gray-300 rounded" required />
setFormData({...formData, age: e.target.value})} className="w-full p-3 border border-gray-300 rounded" required min="18" />
setFormData({...formData, minimumPayment: e.target.value})} className="w-full p-3 border border-gray-300 rounded" required min="0" max="999999" />
setFormData({...formData, whatsappNumber: e.target.value})} className="w-full p-3 border border-gray-300 rounded" required />
setFormData({...formData, quarter: e.target.value})} className="w-full p-3 border border-gray-300 rounded" />
{picturePreview.map((url, index) => (
{`Preview
))} {picturePreview.length < 4 && ( )}
)}
)} {activeTab === 'notifications' && (

Admin Notifications

{notifications.length > 0 ? (
{notifications.map(notification => (

Admin Message

{formatDate(notification.timestamp)}

{!notification.isRead && ( New )}

{notification.message}

{notification.replies && notification.replies.length > 0 && (

Your replies:

{notification.replies.map(reply => (

{reply.message}

{formatDate(reply.timestamp)}

))}
)} {notification.allowReply && (
{replyingTo === notification.id ? (
) : ( )}
)}
))}
) : (

No notifications from admin yet.

)}
)} {activeTab === 'messages' && (

Messages from Interested Clients

{user.messages && user.messages.length > 0 ? (
{user.messages.map(message => (

Client Inquiry

{formatDate(message.timestamp)}

{message.message}

WhatsApp: {message.visitorNumber}
))}
) : (

No messages from interested clients yet.

)}
)}
); } // Admin Panel Component function AdminPanel({ adminView, setAdminView, providers, interestedMessages, notifications, services, towns, advertisements, blockedProviders, adRequests, adminDeleteMessage, adminSendMessage, adminBroadcastMessage, adminDeleteProvider, adminBlockProvider, adminAddToAdvertisements, adminRemoveFromAdvertisements, adminAddService, adminDeleteService, adminAddTown, adminDeleteTown, messageText, setMessageText, allowReply, setAllowReply, handleLogout }) { const [searchQuery, setSearchQuery] = useState(''); const [searchResults, setSearchResults] = useState([]); const [selectedProvider, setSelectedProvider] = useState(null); const [newService, setNewService] = useState(''); const [newTown, setNewTown] = useState(''); const [broadcastType, setBroadcastType] = useState('service'); const [broadcastService, setBroadcastService] = useState(''); const [broadcastTown, setBroadcastTown] = useState(''); const [specificTown, setSpecificTown] = useState(false); const handleSearch = () => { if (!searchQuery.trim()) return; let results = []; if (adminView === 'messageProvider' || adminView === 'manageProviders' || adminView === 'advert') { // Search by name, town, or phone number results = providers.filter(p => p.name.toLowerCase().includes(searchQuery.toLowerCase()) || p.town.toLowerCase().includes(searchQuery.toLowerCase()) || p.whatsappNumber.includes(searchQuery) ); } setSearchResults(results); }; const handleSendMessage = () => { if (!messageText.trim() || !selectedProvider) return; adminSendMessage(selectedProvider.id, messageText, allowReply); setMessageText(''); setSelectedProvider(null); }; const handleBroadcast = () => { if (!messageText.trim()) return; let targetService = null; let targetTown = null; if (broadcastType === 'service') { targetService = broadcastService; if (specificTown) { targetTown = broadcastTown; } } else { targetTown = broadcastTown; } adminBroadcastMessage(targetService, targetTown, messageText, allowReply); setMessageText(''); setBroadcastService(''); setBroadcastTown(''); setSpecificTown(false); }; const handleAddService = () => { if (!newService.trim()) return; adminAddService(newService); setNewService(''); }; const handleAddTown = () => { if (!newTown.trim()) return; adminAddTown(newTown); setNewTown(''); }; const formatDate = (dateString) => { const date = new Date(dateString); return date.toLocaleString(); }; return (

Admin Panel

{adminView === 'dashboard' && (

Admin Dashboard

Total Providers

{providers.length}

Total Services

{services.length}

Total Towns

{towns.length}

Recent Messages

{interestedMessages.slice(0, 5).map(message => (

{message.providerName}

{formatDate(message.timestamp)}

{message.message}

))} {interestedMessages.length === 0 && (

No messages yet

)}

Ad Requests

{adRequests.slice(0, 5).map(request => (

{request.name}

{formatDate(request.timestamp)}

{request.message}

))} {adRequests.length === 0 && (

No ad requests yet

)}
)} {adminView === 'interestedPersons' && (

Interested Persons

{interestedMessages.length > 0 ? (
{interestedMessages.map(message => (

{message.providerName}

{message.town} • {message.service}

{formatDate(message.timestamp)}

{message.message}

Visitor: {message.visitorNumber}
))}
) : (

No interested persons messages yet.

)}
)} {adminView === 'messageProvider' && (

Message Provider

setSearchQuery(e.target.value)} placeholder="Search provider by name, town, or phone number..." className="flex-1 p-3 border border-gray-300 rounded-l" />
{searchResults.length > 0 && (
{searchResults.map(provider => ( ))}
Name Town Service Phone Action
{provider.name}
{provider.town}
{provider.service}
{provider.whatsappNumber}
)}
{selectedProvider && (

Sending message to: {selectedProvider.name}

{selectedProvider.service} in {selectedProvider.town}

setAllowReply(e.target.checked)} className="mr-2" />
)}
)} {adminView === 'providersMessages' && (

Provider Messages

{notifications.filter(n => n.replies && n.replies.length > 0).length > 0 ? (
{notifications .filter(n => n.replies && n.replies.length > 0) .sort((a, b) => new Date(b.replies[b.replies.length - 1].timestamp) - new Date(a.replies[a.replies.length - 1].timestamp)) .map(notification => { const provider = providers.find(p => p.id === notification.providerId); return (

{provider ? provider.name : 'Unknown Provider'}

{provider && (
{provider.town} • {provider.service}
)}

Your message:

{notification.message}

Provider replies:

{notification.replies.map(reply => (

{reply.message}

{formatDate(reply.timestamp)}

))}
); })}
) : (

No provider replies yet.

)}
)} {adminView === 'manageProviders' && (

Manage Providers

setSearchQuery(e.target.value)} placeholder="Search provider by name, town, or phone number..." className="flex-1 p-3 border border-gray-300 rounded-l" />
{searchResults.length > 0 && (
{searchResults.map(provider => ( ))}
Name Town Service Phone Actions
{provider.name}
{provider.town}
{provider.service}
{provider.whatsappNumber}
)}
)} {adminView === 'advert' && (

Manage Advertisements

Add Provider to Advertisements

setSearchQuery(e.target.value)} placeholder="Search provider by name..." className="flex-1 p-3 border border-gray-300 rounded-l" />
{searchResults.length > 0 && (
{searchResults.map(provider => ( ))}
Name Town Service Rating Action
{provider.name}
{provider.town}
{provider.service}
{[...Array(5)].map((_, i) => ( ))} ({provider.ratingCount})
)}

Current Advertisements

{advertisements.length > 0 ? (
{advertisements.map(ad => (
{ad.pictures && ad.pictures.length > 0 ? (
{ad.name}
) : (
)}
{ad.name}
{ad.service} in {ad.town}
{[...Array(5)].map((_, i) => ( ))} ({ad.ratingCount})
))}
) : (

No advertisements yet. Add providers to the advertisement section.

)}

Advertisement Requests

{adRequests.length > 0 ? (
{adRequests.map(request => (

{request.name}

{request.number}

{formatDate(request.timestamp)}

{request.message}

))}
) : (

No advertisement requests yet.

)}
)} {adminView === 'broadcast' && (

Broadcast Message

{broadcastType === 'service' ? (
setSpecificTown(e.target.checked)} className="mr-2" />
{specificTown && (
)}
) : (
)}
setAllowReply(e.target.checked)} className="mr-2" />
)} {adminView === 'manageServices' && (

Manage Services

Add New Service

setNewService(e.target.value)} placeholder="Enter new service name..." className="flex-1 p-3 border border-gray-300 rounded-l" />

Current Services

{services.map(service => ( ))}
Service Name Action
{service}
)} {adminView === 'manageTowns' && (

Manage Towns

Add New Town

setNewTown(e.target.value)} placeholder="Enter new town name..." className="flex-1 p-3 border border-gray-300 rounded-l" />

Current Towns

{towns.map(town => ( ))}
Town Name Action
{town}
)}
); }