import React, { useState, useEffect } from 'react'; import { motion, AnimatePresence } from 'framer-motion'; import { supabase } from '../supabaseClient'; import AdminSettings from '../components/adminSettings'; // --- Icons --- const UploadIcon = () => ; const SpinnerIcon = () => ; export default function SettingsPage() { // --- State for UI control --- const [loading, setLoading] = useState(true); const [isSaving, setIsSaving] = useState(false); const [saveSuccess, setSaveSuccess] = useState(false); const [isEditing, setIsEditing] = useState(false); // --- State for data --- const [companyName, setCompanyName] = useState(''); const [recruiterName, setRecruiterName] = useState(''); const [logoUrl, setLogoUrl] = useState(null); const [logoFile, setLogoFile] = useState(null); const [companyEmail, setCompanyEmail] = useState(''); const [currentCompanyId, setCurrentCompanyId] = useState(null); // To track which company to update // --- 1. Fetch Data from 'user_roles' and 'companies' --- useEffect(() => { const fetchData = async () => { setLoading(true); try { const { data: { user } } = await supabase.auth.getUser(); if (!user) throw new Error("User not found"); // A. Get Recruiter/Admin Details from 'user_roles' const { data: roleData, error: roleError } = await supabase .from('user_roles') .select('name, company_id') .eq('user_id', user.id) .single(); if (roleError) { // Handle case where user exists in Auth but not in user_roles table yet if (roleError.code !== 'PGRST116') throw roleError; } if (roleData) { setRecruiterName(roleData.name || ''); // B. If they have a company assigned, fetch Company Details if (roleData.company_id) { setCurrentCompanyId(roleData.company_id); const { data: companyData, error: companyError } = await supabase .from('companies') .select('*') .eq('id', roleData.company_id) .single(); if (companyError) throw companyError; if (companyData) { setCompanyName(companyData.name || ''); setLogoUrl(companyData.logo_url || null); setCompanyEmail(companyData.company_email || ''); } } } } catch (error) { console.error("Error fetching settings:", error.message); } finally { setLoading(false); } }; fetchData(); }, []); const handlePhotoChange = (e) => { const file = e.target.files[0]; if (file) { setLogoFile(file); setLogoUrl(URL.createObjectURL(file)); } }; // --- 2. Save Data to 'user_roles' and 'companies' --- const handleSaveSettings = async () => { setIsSaving(true); setSaveSuccess(false); try { const { data: { user } } = await supabase.auth.getUser(); if (!user) throw new Error("User not found"); // --- A. Upload Logo if changed --- let updatedLogoUrl = logoUrl; if (logoFile) { // Ensure you have a bucket named 'company_logos' or similar const filePath = `company_logos/${user.id}-${Date.now()}-${logoFile.name}`; const { error: uploadError } = await supabase.storage .from('company_logos') // Make sure this bucket exists! .upload(filePath, logoFile, { upsert: true }); if (uploadError) throw uploadError; const { data: urlData } = supabase.storage .from('company_logos') .getPublicUrl(filePath); updatedLogoUrl = urlData.publicUrl; } // --- B. Update or Create Company --- const domain = companyEmail ? companyEmail.split('@')[1] : null; const companyUpdateData = { name: companyName, company_email: companyEmail, domain: domain, logo_url: updatedLogoUrl }; let finalCompanyId = currentCompanyId; if (currentCompanyId) { // Update existing company const { error: companyError } = await supabase .from('companies') .update(companyUpdateData) .eq('id', currentCompanyId); if (companyError) throw companyError; } else { // Create new company if none exists const { data: newCompany, error: createError } = await supabase .from('companies') .insert(companyUpdateData) .select('id') .single(); if (createError) throw createError; finalCompanyId = newCompany.id; setCurrentCompanyId(finalCompanyId); } // --- C. Update Recruiter Profile in 'user_roles' --- const { error: roleUpdateError } = await supabase .from('user_roles') .update({ name: recruiterName, company_id: finalCompanyId }) .eq('user_id', user.id); if (roleUpdateError) throw roleUpdateError; // Success UI setSaveSuccess(true); setIsEditing(false); setLogoFile(null); setTimeout(() => setSaveSuccess(false), 3000); } catch (error) { console.error("Error saving settings:", error.message); alert("Error: " + error.message); } finally { setIsSaving(false); } }; if (loading) { return
Loading Settings...
; } // --- Component JSX (UI) remains mostly the same, just using the new state --- const profilePhotoSection = (

Profile Photo

{logoUrl ? ( Profile Preview ) : ( // ✅ CHANGED: Default icon is now a user profile icon Profile )} {isEditing && (
)}
); const companySettings = (

Company Settings

{!isEditing && ( setIsEditing(true)} whileHover={{ scale: 1.03 }} whileTap={{ scale: 0.98 }} style={{ backgroundColor: 'rgba(255,255,255,0.1)', color: 'white', padding: '0.5rem 1rem', borderRadius: '0.5rem', border: '1px solid rgba(255,255,255,0.2)', cursor: 'pointer' }}> Edit Profile )}
{isEditing ? ( setCompanyName(e.target.value)} style={{ width: '100%', padding: '0.75rem', borderRadius: '0.5rem', border: '1px solid rgba(239, 68, 68, 0.3)', backgroundColor: 'rgba(255,255,255,0.1)', color: 'white', boxSizing: 'border-box' }} /> ) : (

{companyName || 'Not set'}

)}
{isEditing ? ( setRecruiterName(e.target.value)} style={{ width: '100%', padding: '0.75rem', borderRadius: '0.5rem', border: '1px solid rgba(239, 68, 68, 0.3)', backgroundColor: 'rgba(255,255,255,0.1)', color: 'white', boxSizing: 'border-box' }} /> ) : (

{recruiterName || 'Not set'}

)}
{isEditing ? ( setCompanyEmail(e.target.value)} style={{ width: '100%', padding: '0.75rem', borderRadius: '0.5rem', border: '1px solid rgba(239, 68, 68, 0.3)', backgroundColor: 'rgba(255,255,255,0.1)', color: 'white', boxSizing: 'border-box' }} /> ) : (

{companyEmail || 'Not set'}

)}
{isEditing && (
{isSaving && } {isSaving ? 'Saving...' : 'Save Settings'} {saveSuccess && Settings Saved!}
)}
); return (
{profilePhotoSection} {companySettings}

Danger Zone

Transferring ownership is a permanent action. The new admin will have full control, and your admin privileges will be revoked.

); };