|
export interface DebugWarning { |
|
id: string; |
|
message: string; |
|
timestamp: string; |
|
code: string; |
|
} |
|
|
|
export interface DebugError { |
|
id: string; |
|
message: string; |
|
timestamp: string; |
|
stack?: string; |
|
} |
|
|
|
export interface DebugStatus { |
|
warnings: DebugIssue[]; |
|
errors: DebugIssue[]; |
|
} |
|
|
|
export interface DebugIssue { |
|
id: string; |
|
message: string; |
|
type: 'warning' | 'error'; |
|
timestamp: string; |
|
details?: Record<string, unknown>; |
|
} |
|
|
|
|
|
const acknowledgedIssues = new Set<string>(); |
|
|
|
export const getDebugStatus = async (): Promise<DebugStatus> => { |
|
const issues: DebugStatus = { |
|
warnings: [], |
|
errors: [], |
|
}; |
|
|
|
try { |
|
|
|
if (performance && 'memory' in performance) { |
|
const memory = (performance as any).memory; |
|
|
|
if (memory.usedJSHeapSize > memory.jsHeapSizeLimit * 0.8) { |
|
issues.warnings.push({ |
|
id: 'high-memory-usage', |
|
message: 'High memory usage detected', |
|
type: 'warning', |
|
timestamp: new Date().toISOString(), |
|
details: { |
|
used: memory.usedJSHeapSize, |
|
total: memory.jsHeapSizeLimit, |
|
}, |
|
}); |
|
} |
|
} |
|
|
|
|
|
if (navigator.storage && navigator.storage.estimate) { |
|
const estimate = await navigator.storage.estimate(); |
|
const usageRatio = (estimate.usage || 0) / (estimate.quota || 1); |
|
|
|
if (usageRatio > 0.9) { |
|
issues.warnings.push({ |
|
id: 'storage-quota-warning', |
|
message: 'Storage quota nearly reached', |
|
type: 'warning', |
|
timestamp: new Date().toISOString(), |
|
details: { |
|
used: estimate.usage, |
|
quota: estimate.quota, |
|
}, |
|
}); |
|
} |
|
} |
|
|
|
|
|
const errorLogs = localStorage.getItem('error_logs'); |
|
|
|
if (errorLogs) { |
|
const errors = JSON.parse(errorLogs); |
|
errors.forEach((error: any) => { |
|
issues.errors.push({ |
|
id: `error-${error.timestamp}`, |
|
message: error.message, |
|
type: 'error', |
|
timestamp: error.timestamp, |
|
details: error.details, |
|
}); |
|
}); |
|
} |
|
|
|
|
|
issues.warnings = issues.warnings.filter((warning) => !acknowledgedIssues.has(warning.id)); |
|
issues.errors = issues.errors.filter((error) => !acknowledgedIssues.has(error.id)); |
|
|
|
return issues; |
|
} catch (error) { |
|
console.error('Error getting debug status:', error); |
|
return issues; |
|
} |
|
}; |
|
|
|
export const acknowledgeWarning = async (id: string): Promise<void> => { |
|
acknowledgedIssues.add(id); |
|
}; |
|
|
|
export const acknowledgeError = async (id: string): Promise<void> => { |
|
acknowledgedIssues.add(id); |
|
|
|
|
|
try { |
|
const errorLogs = localStorage.getItem('error_logs'); |
|
|
|
if (errorLogs) { |
|
const errors = JSON.parse(errorLogs); |
|
const updatedErrors = errors.filter((error: any) => `error-${error.timestamp}` !== id); |
|
localStorage.setItem('error_logs', JSON.stringify(updatedErrors)); |
|
} |
|
} catch (error) { |
|
console.error('Error acknowledging error:', error); |
|
} |
|
}; |
|
|