update onboarding colors and add image upload
This commit is contained in:
@@ -82,70 +82,6 @@ export const OrgProvider: React.FC<{ children: React.ReactNode; selectedOrgId: s
|
||||
useEffect(() => {
|
||||
console.log('OrgContext effect running, orgId:', orgId, 'isFirebaseConfigured:', isFirebaseConfigured);
|
||||
if (!orgId) return; // Wait for orgId to be available
|
||||
if (!isFirebaseConfigured) {
|
||||
// Demo mode data - use persistent localStorage with proper initialization
|
||||
console.log('Setting up demo org data with persistence');
|
||||
|
||||
// Get or create persistent demo org
|
||||
let demoOrg = demoStorage.getOrganization(orgId);
|
||||
if (!demoOrg) {
|
||||
demoOrg = {
|
||||
orgId: orgId,
|
||||
name: 'Demo Company',
|
||||
onboardingCompleted: false
|
||||
};
|
||||
demoStorage.saveOrganization(demoOrg);
|
||||
|
||||
// Initialize with empty employee list for clean start
|
||||
// (Removed automatic seeding of 6 default employees per user feedback)
|
||||
|
||||
// Don't automatically create sample submissions - let users create real data
|
||||
// through the proper questionnaire flow
|
||||
|
||||
// Note: Sample employee reports removed - real reports generated via AI after questionnaire submission
|
||||
|
||||
// Don't save sample company report - let users generate real AI-powered reports
|
||||
}
|
||||
|
||||
// Load persistent demo data
|
||||
setOrg({ orgId, name: demoOrg.name, onboardingCompleted: demoOrg.onboardingCompleted });
|
||||
|
||||
// Convert employees to expected format
|
||||
const demoEmployees = demoStorage.getEmployeesByOrg(orgId);
|
||||
const convertedEmployees: Employee[] = demoEmployees.map(emp => ({
|
||||
id: emp.id,
|
||||
name: emp.name,
|
||||
email: emp.email,
|
||||
initials: emp.name ? emp.name.split(' ').map(n => n[0]).join('').toUpperCase() : emp.email.substring(0, 2).toUpperCase(),
|
||||
department: emp.department,
|
||||
role: emp.role,
|
||||
isOwner: emp.id === user?.uid
|
||||
}));
|
||||
setEmployees(convertedEmployees);
|
||||
|
||||
// Load any existing submissions from localStorage
|
||||
const orgSubmissions = demoStorage.getSubmissionsByOrg(orgId);
|
||||
const convertedSubmissions: Record<string, Submission> = {};
|
||||
Object.entries(orgSubmissions).forEach(([employeeId, demoSub]) => {
|
||||
convertedSubmissions[employeeId] = {
|
||||
employeeId,
|
||||
answers: Object.entries(demoSub.answers).map(([question, answer]) => ({
|
||||
question,
|
||||
answer
|
||||
}))
|
||||
};
|
||||
});
|
||||
setSubmissions(convertedSubmissions);
|
||||
|
||||
// Load any existing AI-generated reports from localStorage
|
||||
const orgReports = demoStorage.getEmployeeReportsByOrg(orgId);
|
||||
setReports(orgReports);
|
||||
|
||||
// Load any existing company reports from localStorage
|
||||
const companyReports = demoStorage.getCompanyReportsByOrg(orgId);
|
||||
setFullCompanyReports(companyReports);
|
||||
return;
|
||||
}
|
||||
console.log('Setting up Firebase org data');
|
||||
const orgRef = doc(db, 'orgs', orgId);
|
||||
getDoc(orgRef).then(async (snap) => {
|
||||
@@ -183,89 +119,27 @@ export const OrgProvider: React.FC<{ children: React.ReactNode; selectedOrgId: s
|
||||
}, [orgId]);
|
||||
|
||||
const upsertOrg = async (data: Partial<OrgData>) => {
|
||||
if (!isFirebaseConfigured) {
|
||||
const updatedOrg = { ...(org || { orgId, name: 'Demo Company' }), ...data } as OrgData;
|
||||
setOrg(updatedOrg);
|
||||
|
||||
// If onboarding was completed, update localStorage for persistence and notify other contexts
|
||||
if (data.onboardingCompleted) {
|
||||
const demoOrgData = {
|
||||
orgId: updatedOrg.orgId,
|
||||
name: updatedOrg.name,
|
||||
onboardingCompleted: updatedOrg.onboardingCompleted || false,
|
||||
...updatedOrg // Include all additional fields
|
||||
};
|
||||
demoStorage.saveOrganization(demoOrgData);
|
||||
|
||||
console.log('OrgContext: Onboarding completed, dispatching update event', {
|
||||
orgId: updatedOrg.orgId,
|
||||
onboardingCompleted: true
|
||||
});
|
||||
|
||||
// Signal to UserOrganizationsContext and other components about completion
|
||||
window.dispatchEvent(new CustomEvent('organizationUpdated', {
|
||||
detail: { orgId: updatedOrg.orgId, onboardingCompleted: true }
|
||||
}));
|
||||
}
|
||||
|
||||
// Organization already exists, no need to sync with server during onboarding
|
||||
// We'll update Firestore directly in the Firebase mode below
|
||||
} else {
|
||||
// Firebase mode - save to Firestore
|
||||
const orgRef = doc(db, 'orgs', orgId);
|
||||
await setDoc(orgRef, data, { merge: true });
|
||||
|
||||
// Update local state
|
||||
const updatedOrg = { ...(org || { orgId, name: 'Your Company' }), ...data } as OrgData;
|
||||
setOrg(updatedOrg);
|
||||
|
||||
// If onboarding was completed, notify other contexts
|
||||
if (data.onboardingCompleted) {
|
||||
console.log('OrgContext (Firebase): Onboarding completed, dispatching update event', {
|
||||
orgId: updatedOrg.orgId,
|
||||
onboardingCompleted: true
|
||||
});
|
||||
|
||||
window.dispatchEvent(new CustomEvent('organizationUpdated', {
|
||||
detail: { orgId: updatedOrg.orgId, onboardingCompleted: true }
|
||||
}));
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const updateOrg = async (data: Partial<OrgData>) => {
|
||||
if (!isFirebaseConfigured) {
|
||||
const updatedOrg = { ...(org || { orgId, name: 'Demo Company' }), ...data } as OrgData;
|
||||
setOrg(updatedOrg);
|
||||
|
||||
// Also sync with server for multi-tenant persistence
|
||||
try {
|
||||
const response = await fetch(`${API_URL}/api/organizations/${orgId}`, {
|
||||
method: 'PUT',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify(data)
|
||||
});
|
||||
|
||||
if (!response.ok) {
|
||||
console.warn('Failed to sync organization data with server');
|
||||
}
|
||||
} catch (error) {
|
||||
console.warn('Failed to sync organization data:', error);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
const orgRef = doc(db, 'orgs', orgId);
|
||||
await setDoc(orgRef, data, { merge: true });
|
||||
|
||||
// Update local state
|
||||
const updatedOrg = { ...(org || { orgId, name: 'Your Company' }), ...data } as OrgData;
|
||||
setOrg(updatedOrg);
|
||||
|
||||
// If onboarding was completed, notify other contexts
|
||||
if (data.onboardingCompleted) {
|
||||
console.log('OrgContext (Firebase): Onboarding completed, dispatching update event', {
|
||||
orgId: updatedOrg.orgId,
|
||||
onboardingCompleted: true
|
||||
});
|
||||
|
||||
window.dispatchEvent(new CustomEvent('organizationUpdated', {
|
||||
detail: { orgId: updatedOrg.orgId, onboardingCompleted: true }
|
||||
}));
|
||||
}
|
||||
};
|
||||
|
||||
const saveReport = async (employeeId: string, report: Report) => {
|
||||
if (!isFirebaseConfigured) {
|
||||
setReports(prev => ({ ...prev, [employeeId]: report }));
|
||||
// Persist to localStorage
|
||||
demoStorage.saveEmployeeReport(orgId, employeeId, report);
|
||||
return;
|
||||
}
|
||||
const ref = doc(db, 'orgs', orgId, 'reports', employeeId);
|
||||
await setDoc(ref, report, { merge: true });
|
||||
};
|
||||
@@ -446,7 +320,7 @@ export const OrgProvider: React.FC<{ children: React.ReactNode; selectedOrgId: s
|
||||
// Exclude owners from employee counts - they are company wiki contributors, not employees
|
||||
const actualEmployees = employees.filter(emp => !emp.isOwner);
|
||||
const totalEmployees = actualEmployees.length;
|
||||
|
||||
|
||||
// Only count submissions from non-owner employees
|
||||
const employeeSubmissions = Object.fromEntries(
|
||||
Object.entries(submissions).filter(([employeeId]) => {
|
||||
@@ -539,7 +413,7 @@ export const OrgProvider: React.FC<{ children: React.ReactNode; selectedOrgId: s
|
||||
|
||||
const payload = await res.json();
|
||||
console.log('API success response:', payload);
|
||||
|
||||
|
||||
// Ensure the report has all required fields to prevent undefined errors
|
||||
const data: CompanyReport = {
|
||||
id: Date.now().toString(),
|
||||
@@ -565,7 +439,7 @@ export const OrgProvider: React.FC<{ children: React.ReactNode; selectedOrgId: s
|
||||
// Override with API data if available
|
||||
...(payload.report || payload)
|
||||
};
|
||||
|
||||
|
||||
await saveFullCompanyReport(data);
|
||||
return data;
|
||||
} catch (e) {
|
||||
|
||||
Reference in New Issue
Block a user