File size: 3,829 Bytes
0675ff5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
class ErrorLogger {
    constructor() {
        this.logKey = 'app_error_log';
        this.maxLogs = 100;
        this.enabled = true;
    }

    init() {
        // پاک کردن لاگ‌های قدیمی در صورت نیاز
        this.cleanupOldLogs();
        
        // ثبت خطاهای全局
        window.addEventListener('error', (event) => {
            this.logError({
                type: 'global_error',
                message: event.message,
                filename: event.filename,
                lineno: event.lineno,
                colno: event.colno,
                error: event.error?.toString(),
                timestamp: new Date().toISOString()
            });
        });

        // ثبت rejectionهای catch نشده
        window.addEventListener('unhandledrejection', (event) => {
            this.logError({
                type: 'unhandled_rejection',
                reason: event.reason?.toString(),
                timestamp: new Date().toISOString()
            });
        });

        console.log('✅ Error logger initialized');
    }

    logError(errorData) {
        if (!this.enabled) return;

        try {
            const logs = this.getLogs();
            logs.push({
                ...errorData,
                id: this.generateId(),
                userAgent: navigator.userAgent,
                url: window.location.href
            });

            // محدود کردن تعداد لاگ‌ها
            if (logs.length > this.maxLogs) {
                logs.splice(0, logs.length - this.maxLogs);
            }

            localStorage.setItem(this.logKey, JSON.stringify(logs));
            
            // همچنین در کنسول نمایش داده شود
            console.error('🔴 Error logged:', errorData);
        } catch (error) {
            console.error('Failed to log error:', error);
        }
    }

    getLogs() {
        try {
            const logs = localStorage.getItem(this.logKey);
            return logs ? JSON.parse(logs) : [];
        } catch (error) {
            console.error('Failed to get logs:', error);
            return [];
        }
    }

    clearLogs() {
        try {
            localStorage.removeItem(this.logKey);
            console.log('✅ Error logs cleared');
        } catch (error) {
            console.error('Failed to clear logs:', error);
        }
    }

    exportLogs() {
        const logs = this.getLogs();
        const dataStr = JSON.stringify(logs, null, 2);
        const dataBlob = new Blob([dataStr], { type: 'application/json' });
        
        const url = URL.createObjectURL(dataBlob);
        const link = document.createElement('a');
        link.href = url;
        link.download = `error_logs_${new Date().toISOString().split('T')[0]}.json`;
        link.click();
        
        URL.revokeObjectURL(url);
    }

    cleanupOldLogs() {
        const logs = this.getLogs();
        const oneWeekAgo = new Date();
        oneWeekAgo.setDate(oneWeekAgo.getDate() - 7);
        
        const filteredLogs = logs.filter(log => 
            new Date(log.timestamp) > oneWeekAgo
        );
        
        if (filteredLogs.length !== logs.length) {
            localStorage.setItem(this.logKey, JSON.stringify(filteredLogs));
        }
    }

    generateId() {
        return Date.now().toString(36) + Math.random().toString(36).substr(2);
    }

    enable() {
        this.enabled = true;
    }

    disable() {
        this.enabled = false;
    }
}

// ایجاد نمونه全局
const errorLogger = new ErrorLogger();

// قرار دادن در全局 برای دسترسی از کنسول
window.errorLogger = errorLogger;

// راه‌اندازی هنگام بارگذاری
document.addEventListener('DOMContentLoaded', () => {
    errorLogger.init();
});