Implement comprehensive report system with detailed viewing and AI enhancements

- Add detailed report viewing with full-screen ReportDetail component for both company and employee reports
- Fix company wiki to display onboarding Q&A in card format matching Figma designs
- Exclude company owners from employee submission counts (owners contribute to wiki, not employee data)
- Fix employee report generation to include company context (wiki + company report + employee answers)
- Fix company report generation to use filtered employee submissions only
- Add proper error handling for submission data format variations
- Update Firebase functions to use gpt-4o model instead of deprecated gpt-4.1
- Fix UI syntax errors and improve report display functionality
- Add comprehensive logging for debugging report generation flow

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Ra
2025-08-18 19:08:29 -07:00
parent 557b113196
commit 1a9e92d7bd
20 changed files with 1793 additions and 635 deletions

View File

@@ -24,25 +24,55 @@ export const AuthProvider: React.FC<{ children: React.ReactNode }> = ({ children
useEffect(() => {
console.log('AuthContext initializing, isFirebaseConfigured:', isFirebaseConfigured);
if (!isFirebaseConfigured) {
// Demo mode: check for persisted session
console.log('Demo mode: checking for persisted session');
const sessionUser = sessionStorage.getItem('auditly_demo_session');
if (isFirebaseConfigured) {
// Firebase mode: Set up proper Firebase auth state listener
const unsubscribe = onAuthStateChanged(auth, (firebaseUser) => {
console.log('Firebase auth state changed:', firebaseUser?.email);
if (firebaseUser) {
setUser(firebaseUser);
} else {
// Check for OTP session as fallback
const sessionUser = localStorage.getItem('auditly_demo_session');
if (sessionUser) {
try {
const parsedUser = JSON.parse(sessionUser);
console.log('Restoring OTP session for:', parsedUser.email);
setUser(parsedUser as User);
} catch (error) {
console.error('Failed to parse session user:', error);
localStorage.removeItem('auditly_demo_session');
setUser(null);
}
} else {
setUser(null);
}
}
setLoading(false);
});
return unsubscribe;
} else {
// Demo/OTP mode: Check localStorage for persisted session
console.log('Checking for persisted OTP session');
const sessionUser = localStorage.getItem('auditly_demo_session');
if (sessionUser) {
const parsedUser = JSON.parse(sessionUser);
console.log('Restoring demo session for:', parsedUser.email);
setUser(parsedUser as User);
try {
const parsedUser = JSON.parse(sessionUser);
console.log('Restoring session for:', parsedUser.email);
setUser(parsedUser as User);
} catch (error) {
console.error('Failed to parse session user:', error);
localStorage.removeItem('auditly_demo_session');
setUser(null);
}
} else {
setUser(null);
}
setLoading(false);
return () => { };
}
console.log('Setting up Firebase auth listener');
const unsub = onAuthStateChanged(auth, (u) => {
console.log('Auth state changed:', u);
setUser(u);
setLoading(false);
});
return () => unsub();
}, []);
const signInWithGoogle = async () => {
@@ -54,13 +84,24 @@ export const AuthProvider: React.FC<{ children: React.ReactNode }> = ({ children
};
const signOutUser = async () => {
if (!isFirebaseConfigured) {
// Clear demo session
sessionStorage.removeItem('auditly_demo_session');
setUser(null);
return;
try {
// Sign out from Firebase if configured and user is signed in via Firebase
if (isFirebaseConfigured && auth.currentUser) {
await signOut(auth);
console.log('Firebase signout completed');
}
} catch (error) {
console.error('Firebase signout error:', error);
}
await signOut(auth);
// Always clear all local session data
localStorage.removeItem('auditly_demo_session');
localStorage.removeItem('auditly_auth_token');
localStorage.removeItem('auditly_selected_org');
sessionStorage.clear();
setUser(null);
console.log('User signed out and all sessions cleared');
};
const signInWithEmail = async (email: string, password: string) => {
@@ -79,7 +120,7 @@ export const AuthProvider: React.FC<{ children: React.ReactNode }> = ({ children
} as unknown as User;
setUser(mockUser);
sessionStorage.setItem('auditly_demo_session', JSON.stringify(mockUser));
localStorage.setItem('auditly_demo_session', JSON.stringify(mockUser));
console.log('Demo login successful for:', email);
} else {
throw new Error('Invalid password');
@@ -132,7 +173,7 @@ export const AuthProvider: React.FC<{ children: React.ReactNode }> = ({ children
} as unknown as User;
setUser(mockUser);
sessionStorage.setItem('auditly_demo_session', JSON.stringify(mockUser));
localStorage.setItem('auditly_demo_session', JSON.stringify(mockUser));
console.log('Demo signup successful for:', email);
return;
}
@@ -191,8 +232,8 @@ export const AuthProvider: React.FC<{ children: React.ReactNode }> = ({ children
} as unknown as User;
setUser(mockUser);
sessionStorage.setItem('auditly_demo_session', JSON.stringify(mockUser));
sessionStorage.setItem('auditly_auth_token', data.token);
localStorage.setItem('auditly_demo_session', JSON.stringify(mockUser));
localStorage.setItem('auditly_auth_token', data.token);
return data;
};
@@ -206,8 +247,8 @@ export const AuthProvider: React.FC<{ children: React.ReactNode }> = ({ children
} as unknown as User;
setUser(mockUser);
sessionStorage.setItem('auditly_demo_session', JSON.stringify(mockUser));
sessionStorage.setItem('auditly_auth_token', token);
localStorage.setItem('auditly_demo_session', JSON.stringify(mockUser));
localStorage.setItem('auditly_auth_token', token);
};
return (