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 ? (

) : (
// ✅ CHANGED: Default icon is now a user profile icon

)}
{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.
);
};