// نظام الإشعارات والتنبيهات
class NotificationManager {
constructor() {
this.notifications = [];
this.toastContainer = null;
this.modalContainer = null;
this.init();
}
// تهيئة نظام الإشعارات
init() {
this.createToastContainer();
this.createModalContainer();
this.loadStoredNotifications();
}
// إنشاء حاوية التوست
createToastContainer() {
this.toastContainer = document.createElement('div');
this.toastContainer.className = 'toast-container';
this.toastContainer.innerHTML = '';
document.body.appendChild(this.toastContainer);
}
// إنشاء حاوية المودال
createModalContainer() {
this.modalContainer = document.createElement('div');
this.modalContainer.className = 'modal-container';
this.modalContainer.innerHTML = `
`;
document.body.appendChild(this.modalContainer);
}
// عرض تنبيه توست
showToast(message, type = 'info', duration = 5000) {
const toast = document.createElement('div');
toast.className = `toast toast-${type}`;
const icon = this.getToastIcon(type);
toast.innerHTML = `
`;
// إضافة التوست
this.toastContainer.appendChild(toast);
// تحريك التوست للداخل
setTimeout(() => {
toast.classList.add('toast-show');
}, 100);
// إزالة التوست تلقائياً
if (duration > 0) {
setTimeout(() => {
this.removeToast(toast);
}, duration);
}
return toast;
}
// إزالة التوست
removeToast(toast) {
toast.classList.add('toast-hide');
setTimeout(() => {
if (toast.parentElement) {
toast.parentElement.removeChild(toast);
}
}, 300);
}
// الحصول على أيقونة التوست
getToastIcon(type) {
const icons = {
success: 'fas fa-check-circle',
error: 'fas fa-exclamation-circle',
warning: 'fas fa-exclamation-triangle',
info: 'fas fa-info-circle',
loading: 'fas fa-spinner fa-spin'
};
return icons[type] || icons.info;
}
// عرض مودال
showModal(title, content, buttons = []) {
const modal = this.modalContainer;
modal.querySelector('.modal-title').textContent = title;
modal.querySelector('.modal-body').innerHTML = content;
// إضافة الأزرار
const footer = modal.querySelector('.modal-footer');
footer.innerHTML = '';
buttons.forEach(button => {
const btn = document.createElement('button');
btn.className = `btn ${button.class || 'btn-primary'}`;
btn.textContent = button.text;
btn.onclick = () => {
if (button.action) button.action();
modal.style.display = 'none';
};
footer.appendChild(btn);
});
// إضافة زر إغلاق افتراضي إذا لم توجد أزرار
if (buttons.length === 0) {
const closeBtn = document.createElement('button');
closeBtn.className = 'btn btn-secondary';
closeBtn.textContent = 'إغلاق';
closeBtn.onclick = () => modal.style.display = 'none';
footer.appendChild(closeBtn);
}
modal.style.display = 'flex';
return modal;
}
// عرض مودال تأكيد
showConfirm(title, message, onConfirm, onCancel) {
return this.showModal(title, `${message}
`, [
{
text: 'تأكيد',
class: 'btn-primary',
action: onConfirm
},
{
text: 'إلغاء',
class: 'btn-secondary',
action: onCancel
}
]);
}
// عرض مودال تحميل
showLoading(message = 'جاري التحميل...') {
const loadingContent = `
`;
const modal = this.showModal('', loadingContent, []);
modal.classList.add('loading-modal');
// منع إغلاق مودال التحميل بالنقر خارجه
modal.querySelector('.modal-overlay').onclick = null;
modal.querySelector('.modal-close').style.display = 'none';
return modal;
}
// إخفاء مودال التحميل
hideLoading() {
const loadingModal = document.querySelector('.loading-modal');
if (loadingModal) {
loadingModal.style.display = 'none';
loadingModal.classList.remove('loading-modal');
}
}
// إضافة إشعار
addNotification(notification) {
const newNotification = {
id: Date.now(),
timestamp: new Date().toISOString(),
read: false,
...notification
};
this.notifications.unshift(newNotification);
this.saveNotifications();
this.updateNotificationBadge();
return newNotification;
}
// وضع علامة مقروء على الإشعار
markAsRead(notificationId) {
const notification = this.notifications.find(n => n.id === notificationId);
if (notification) {
notification.read = true;
this.saveNotifications();
this.updateNotificationBadge();
}
}
// وضع علامة مقروء على جميع الإشعارات
markAllAsRead() {
this.notifications.forEach(n => n.read = true);
this.saveNotifications();
this.updateNotificationBadge();
}
// حذف إشعار
deleteNotification(notificationId) {
this.notifications = this.notifications.filter(n => n.id !== notificationId);
this.saveNotifications();
this.updateNotificationBadge();
}
// الحصول على الإشعارات غير المقروءة
getUnreadNotifications() {
return this.notifications.filter(n => !n.read);
}
// الحصول على عدد الإشعارات غير المقروءة
getUnreadCount() {
return this.getUnreadNotifications().length;
}
// تحديث شارة الإشعارات
updateNotificationBadge() {
const badge = document.querySelector('#notifications-btn .badge');
const unreadCount = this.getUnreadCount();
if (badge) {
if (unreadCount > 0) {
badge.textContent = unreadCount > 99 ? '99+' : unreadCount;
badge.style.display = 'block';
} else {
badge.style.display = 'none';
}
}
}
// عرض قائمة الإشعارات
showNotificationsList() {
const notificationsHtml = this.notifications.length > 0 ?
this.notifications.map(n => this.renderNotification(n)).join('') :
'لا توجد إشعارات
';
const content = `
${notificationsHtml}
`;
this.showModal('الإشعارات', content, []);
}
// عرض إشعار واحد
renderNotification(notification) {
const timeAgo = this.getTimeAgo(notification.timestamp);
const readClass = notification.read ? 'read' : 'unread';
return `
${notification.title}
${notification.message}
${timeAgo}
${!notification.read ? `
` : ''}
`;
}
// الحصول على أيقونة الإشعار
getNotificationIcon(type) {
const icons = {
transaction: 'fas fa-exchange-alt',
security: 'fas fa-shield-alt',
system: 'fas fa-cog',
promotion: 'fas fa-gift',
warning: 'fas fa-exclamation-triangle'
};
return icons[type] || 'fas fa-bell';
}
// حساب الوقت المنقضي
getTimeAgo(timestamp) {
const now = new Date();
const time = new Date(timestamp);
const diffInSeconds = Math.floor((now - time) / 1000);
if (diffInSeconds < 60) return 'الآن';
if (diffInSeconds < 3600) return `${Math.floor(diffInSeconds / 60)} دقيقة`;
if (diffInSeconds < 86400) return `${Math.floor(diffInSeconds / 3600)} ساعة`;
if (diffInSeconds < 2592000) return `${Math.floor(diffInSeconds / 86400)} يوم`;
return time.toLocaleDateString('ar-SA');
}
// حفظ الإشعارات
saveNotifications() {
localStorage.setItem('unifiedWallet_notifications', JSON.stringify(this.notifications));
}
// تحميل الإشعارات المحفوظة
loadStoredNotifications() {
const stored = localStorage.getItem('unifiedWallet_notifications');
if (stored) {
this.notifications = JSON.parse(stored);
this.updateNotificationBadge();
}
}
// إضافة إشعار معاملة
addTransactionNotification(type, amount, wallet) {
const messages = {
send: `تم إرسال ${amount.toLocaleString()} ر.ي من ${wallet}`,
receive: `تم استلام ${amount.toLocaleString()} ر.ي في ${wallet}`,
bill: `تم دفع فاتورة بمبلغ ${amount.toLocaleString()} ر.ي من ${wallet}`
};
this.addNotification({
type: 'transaction',
title: 'معاملة جديدة',
message: messages[type] || `معاملة بمبلغ ${amount.toLocaleString()} ر.ي`
});
}
// إضافة إشعار أمني
addSecurityNotification(message) {
this.addNotification({
type: 'security',
title: 'تنبيه أمني',
message: message
});
}
// إضافة إشعار نظام
addSystemNotification(message) {
this.addNotification({
type: 'system',
title: 'إشعار النظام',
message: message
});
}
}
// تصدير الكلاس للاستخدام في التطبيق الرئيسي
window.NotificationManager = NotificationManager;