refactor: enhance error handling and performance tracking across components
- Improve localStorage access in ActivityFeed, ChatWidget, and AdminPage with try-catch blocks to handle potential errors gracefully. - Update performance tracking in AnalyticsProvider and analytics.ts to ensure robust error handling and prevent failures from affecting user experience. - Refactor Web Vitals tracking to include error handling for observer initialization and data collection. - Ensure consistent handling of hydration mismatches in components like BackgroundBlobs and ChatWidget to improve rendering reliability.
This commit is contained in:
@@ -57,25 +57,42 @@ const AdminPage = () => {
|
||||
|
||||
// Check if user is locked out
|
||||
const checkLockout = useCallback(() => {
|
||||
const lockoutData = localStorage.getItem('admin_lockout');
|
||||
if (lockoutData) {
|
||||
try {
|
||||
const { timestamp, attempts } = JSON.parse(lockoutData);
|
||||
const now = Date.now();
|
||||
if (typeof window === 'undefined') return false;
|
||||
|
||||
try {
|
||||
const lockoutData = localStorage.getItem('admin_lockout');
|
||||
if (lockoutData) {
|
||||
try {
|
||||
const { timestamp, attempts } = JSON.parse(lockoutData);
|
||||
const now = Date.now();
|
||||
|
||||
if (now - timestamp < LOCKOUT_DURATION) {
|
||||
setAuthState(prev => ({
|
||||
...prev,
|
||||
isLocked: true,
|
||||
attempts,
|
||||
isLoading: false
|
||||
}));
|
||||
return true;
|
||||
} else {
|
||||
localStorage.removeItem('admin_lockout');
|
||||
if (now - timestamp < LOCKOUT_DURATION) {
|
||||
setAuthState(prev => ({
|
||||
...prev,
|
||||
isLocked: true,
|
||||
attempts,
|
||||
isLoading: false
|
||||
}));
|
||||
return true;
|
||||
} else {
|
||||
try {
|
||||
localStorage.removeItem('admin_lockout');
|
||||
} catch {
|
||||
// Ignore errors
|
||||
}
|
||||
}
|
||||
} catch {
|
||||
try {
|
||||
localStorage.removeItem('admin_lockout');
|
||||
} catch {
|
||||
// Ignore errors
|
||||
}
|
||||
}
|
||||
} catch {
|
||||
localStorage.removeItem('admin_lockout');
|
||||
}
|
||||
} catch (error) {
|
||||
// localStorage might be disabled
|
||||
if (process.env.NODE_ENV === 'development') {
|
||||
console.warn('Failed to check lockout status:', error);
|
||||
}
|
||||
}
|
||||
return false;
|
||||
@@ -197,7 +214,11 @@ const AdminPage = () => {
|
||||
attempts: 0,
|
||||
isLoading: false
|
||||
}));
|
||||
localStorage.removeItem('admin_lockout');
|
||||
try {
|
||||
localStorage.removeItem('admin_lockout');
|
||||
} catch {
|
||||
// Ignore errors
|
||||
}
|
||||
} else {
|
||||
const newAttempts = authState.attempts + 1;
|
||||
setAuthState(prev => ({
|
||||
@@ -208,10 +229,17 @@ const AdminPage = () => {
|
||||
}));
|
||||
|
||||
if (newAttempts >= 5) {
|
||||
localStorage.setItem('admin_lockout', JSON.stringify({
|
||||
timestamp: Date.now(),
|
||||
attempts: newAttempts
|
||||
}));
|
||||
try {
|
||||
localStorage.setItem('admin_lockout', JSON.stringify({
|
||||
timestamp: Date.now(),
|
||||
attempts: newAttempts
|
||||
}));
|
||||
} catch (error) {
|
||||
// localStorage might be full or disabled
|
||||
if (process.env.NODE_ENV === 'development') {
|
||||
console.warn('Failed to save lockout data:', error);
|
||||
}
|
||||
}
|
||||
setAuthState(prev => ({
|
||||
...prev,
|
||||
isLocked: true,
|
||||
@@ -252,7 +280,11 @@ const AdminPage = () => {
|
||||
<p className="text-stone-500">Too many failed attempts. Please try again in 15 minutes.</p>
|
||||
<button
|
||||
onClick={() => {
|
||||
localStorage.removeItem('admin_lockout');
|
||||
try {
|
||||
localStorage.removeItem('admin_lockout');
|
||||
} catch (error) {
|
||||
// Ignore errors
|
||||
}
|
||||
window.location.reload();
|
||||
}}
|
||||
className="mt-4 px-6 py-2 bg-stone-900 text-stone-50 rounded-xl hover:bg-stone-800 transition-colors"
|
||||
|
||||
Reference in New Issue
Block a user