132 lines
4.4 KiB
JavaScript
132 lines
4.4 KiB
JavaScript
|
|
'use client';
|
||
|
|
|
||
|
|
import { useEffect, useState } from 'react';
|
||
|
|
import { useRouter } from 'next/navigation';
|
||
|
|
import { Bell, CheckCircle, XCircle, Calendar, MessageCircle } from 'lucide-react';
|
||
|
|
import AuthService from '@/app/services/AuthService';
|
||
|
|
|
||
|
|
const mockNotifications = [
|
||
|
|
{
|
||
|
|
id: 1,
|
||
|
|
type: 'booking',
|
||
|
|
title: 'تأكيد الحجز',
|
||
|
|
message: 'تم تأكيد حجزك في فيلا المزة للفترة 10-15 مارس',
|
||
|
|
date: '2024-03-01',
|
||
|
|
read: false,
|
||
|
|
icon: CheckCircle,
|
||
|
|
color: 'text-green-600',
|
||
|
|
bgColor: 'bg-green-50'
|
||
|
|
},
|
||
|
|
{
|
||
|
|
id: 2,
|
||
|
|
type: 'payment',
|
||
|
|
title: 'دفعة مستلمة',
|
||
|
|
message: 'تم استلام دفعة الإيجار بقيمة 500,000 ل.س',
|
||
|
|
date: '2024-02-28',
|
||
|
|
read: false,
|
||
|
|
icon: MessageCircle,
|
||
|
|
color: 'text-blue-600',
|
||
|
|
bgColor: 'bg-blue-50'
|
||
|
|
},
|
||
|
|
{
|
||
|
|
id: 3,
|
||
|
|
type: 'reminder',
|
||
|
|
title: 'تذكير بالإيجار',
|
||
|
|
message: 'ينتهي عقد الإيجار خلال 3 أيام',
|
||
|
|
date: '2024-02-25',
|
||
|
|
read: true,
|
||
|
|
icon: Calendar,
|
||
|
|
color: 'text-amber-600',
|
||
|
|
bgColor: 'bg-amber-50'
|
||
|
|
}
|
||
|
|
];
|
||
|
|
|
||
|
|
export default function NotificationsPage() {
|
||
|
|
const router = useRouter();
|
||
|
|
const [notifications, setNotifications] = useState([]);
|
||
|
|
const [isLoading, setIsLoading] = useState(true);
|
||
|
|
|
||
|
|
useEffect(() => {
|
||
|
|
if (AuthService.isAdmin()) {
|
||
|
|
router.push('/');
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
setTimeout(() => {
|
||
|
|
setNotifications(mockNotifications);
|
||
|
|
setIsLoading(false);
|
||
|
|
}, 500);
|
||
|
|
}, [router]);
|
||
|
|
|
||
|
|
const markAsRead = (id) => {
|
||
|
|
setNotifications(prev =>
|
||
|
|
prev.map(n => (n.id === id ? { ...n, read: true } : n))
|
||
|
|
);
|
||
|
|
};
|
||
|
|
|
||
|
|
const markAllAsRead = () => {
|
||
|
|
setNotifications(prev => prev.map(n => ({ ...n, read: true })));
|
||
|
|
};
|
||
|
|
|
||
|
|
const unreadCount = notifications.filter(n => !n.read).length;
|
||
|
|
|
||
|
|
if (isLoading) {
|
||
|
|
return (
|
||
|
|
<div className="min-h-screen flex items-center justify-center">
|
||
|
|
<div className="text-center">
|
||
|
|
<div className="w-16 h-16 border-4 border-amber-500 border-t-transparent rounded-full animate-spin mx-auto mb-4" />
|
||
|
|
<p className="text-gray-600">جاري التحميل...</p>
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
);
|
||
|
|
}
|
||
|
|
|
||
|
|
return (
|
||
|
|
<div className="min-h-screen bg-gray-50 py-8">
|
||
|
|
<div className="container mx-auto px-4 max-w-4xl">
|
||
|
|
<div className="flex justify-between items-center mb-8">
|
||
|
|
<div>
|
||
|
|
<h1 className="text-3xl font-bold text-gray-900 mb-2">الإشعارات</h1>
|
||
|
|
<p className="text-gray-600">
|
||
|
|
{unreadCount > 0 ? `لديك ${unreadCount} إشعار غير مقروء` : 'جميع الإشعارات مقروءة'}
|
||
|
|
</p>
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
|
||
|
|
{notifications.length === 0 ? (
|
||
|
|
<div className="bg-white rounded-2xl p-12 text-center border-2 border-dashed border-gray-300">
|
||
|
|
<Bell className="w-16 h-16 text-gray-300 mx-auto mb-4" />
|
||
|
|
<h3 className="text-xl font-bold text-gray-700 mb-2">لا توجد إشعارات</h3>
|
||
|
|
<p className="text-gray-500">ستظهر هنا الإشعارات المتعلقة بحجوزاتك ومدفوعاتك</p>
|
||
|
|
</div>
|
||
|
|
) : (
|
||
|
|
<div className="space-y-4">
|
||
|
|
{notifications.map((notification) => {
|
||
|
|
const Icon = notification.icon;
|
||
|
|
return (
|
||
|
|
<div
|
||
|
|
key={notification.id}
|
||
|
|
className={`bg-white rounded-2xl shadow-sm border transition-all hover:shadow-md 'border-gray-200'}`}
|
||
|
|
>
|
||
|
|
<div className="p-5 flex gap-4">
|
||
|
|
<div className={`w-12 h-12 ${notification.bgColor} rounded-full flex items-center justify-center flex-shrink-0`}>
|
||
|
|
<Icon className={`w-6 h-6 ${notification.color}`} />
|
||
|
|
</div>
|
||
|
|
<div className="flex-1">
|
||
|
|
<div className="flex justify-between items-start">
|
||
|
|
<div>
|
||
|
|
<h3 className="font-bold text-gray-900">{notification.title}</h3>
|
||
|
|
<p className="text-gray-600 text-sm mt-1">{notification.message}</p>
|
||
|
|
<p className="text-xs text-gray-400 mt-2">{notification.date}</p>
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
);
|
||
|
|
})}
|
||
|
|
</div>
|
||
|
|
)}
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
);
|
||
|
|
}
|