import React, { useState, useEffect, useRef } from 'react'; import api from '../../utils/api'; import Navbar from '../../components/Navbar'; import MemberFooter from '../../components/MemberFooter'; import { Card } from '../../components/ui/card'; import { Button } from '../../components/ui/button'; import { Input } from '../../components/ui/input'; import { Textarea } from '../../components/ui/textarea'; import { Label } from '../../components/ui/label'; import { Switch } from '../../components/ui/switch'; import { User, Upload, X, Facebook, Instagram, Twitter, Linkedin, Camera, Save, Eye } from 'lucide-react'; import { useToast } from '../../hooks/use-toast'; const MemberProfile = () => { const [loading, setLoading] = useState(true); const [saving, setSaving] = useState(false); const [uploading, setUploading] = useState(false); const [profile, setProfile] = useState(null); const [formData, setFormData] = useState({ social_media_facebook: '', social_media_instagram: '', social_media_twitter: '', social_media_linkedin: '', show_in_directory: false, directory_email: '', directory_bio: '', directory_address: '', directory_phone: '', directory_partner_name: '' }); const [previewImage, setPreviewImage] = useState(null); const fileInputRef = useRef(null); const { toast } = useToast(); useEffect(() => { fetchProfile(); }, []); const fetchProfile = async () => { try { const response = await api.get('/members/profile'); setProfile(response.data); // Populate form with existing data setFormData({ social_media_facebook: response.data.social_media_facebook || '', social_media_instagram: response.data.social_media_instagram || '', social_media_twitter: response.data.social_media_twitter || '', social_media_linkedin: response.data.social_media_linkedin || '', show_in_directory: response.data.show_in_directory || false, directory_email: response.data.directory_email || '', directory_bio: response.data.directory_bio || '', directory_address: response.data.directory_address || '', directory_phone: response.data.directory_phone || '', directory_partner_name: response.data.directory_partner_name || '' }); if (response.data.profile_photo_url) { setPreviewImage(response.data.profile_photo_url); } } catch (error) { console.error('Failed to fetch profile:', error); toast({ title: "Error", description: "Failed to load profile. Please try again.", variant: "destructive" }); } finally { setLoading(false); } }; const handleInputChange = (e) => { const { name, value, type, checked } = e.target; setFormData(prev => ({ ...prev, [name]: type === 'checkbox' ? checked : value })); }; const handleSwitchChange = (checked) => { setFormData(prev => ({ ...prev, show_in_directory: checked })); }; const handlePhotoUpload = async (e) => { const file = e.target.files[0]; if (!file) return; // Validate file type if (!file.type.startsWith('image/')) { toast({ title: "Invalid File", description: "Please upload an image file (JPG, PNG, WebP, or GIF).", variant: "destructive" }); return; } // Validate file size (50MB max) if (file.size > 52428800) { toast({ title: "File Too Large", description: "Image must be smaller than 50MB.", variant: "destructive" }); return; } setUploading(true); try { const formData = new FormData(); formData.append('file', file); const response = await api.post('/members/profile/upload-photo', formData, { headers: { 'Content-Type': 'multipart/form-data' } }); setPreviewImage(response.data.profile_photo_url); toast({ title: "Success", description: "Profile photo uploaded successfully!" }); // Refresh profile await fetchProfile(); } catch (error) { console.error('Failed to upload photo:', error); toast({ title: "Upload Failed", description: error.response?.data?.detail || "Failed to upload photo. Please try again.", variant: "destructive" }); } finally { setUploading(false); } }; const handleDeletePhoto = async () => { if (!window.confirm('Are you sure you want to delete your profile photo?')) { return; } try { await api.delete('/members/profile/delete-photo'); setPreviewImage(null); toast({ title: "Success", description: "Profile photo deleted successfully." }); await fetchProfile(); } catch (error) { console.error('Failed to delete photo:', error); toast({ title: "Error", description: "Failed to delete photo. Please try again.", variant: "destructive" }); } }; const handleSubmit = async (e) => { e.preventDefault(); setSaving(true); try { await api.put('/members/profile', formData); toast({ title: "Success", description: "Profile updated successfully!" }); await fetchProfile(); } catch (error) { console.error('Failed to update profile:', error); toast({ title: "Error", description: "Failed to update profile. Please try again.", variant: "destructive" }); } finally { setSaving(false); } }; if (loading) { return (
Loading profile...
Enhance your profile with a photo and social media links.