import React, { useState } from "react"; import { base44 } from "@/api/base44Client"; import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query"; import { Card, CardHeader, CardTitle, CardContent } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; import { Input } from "@/components/ui/input"; import { Tabs, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { Activity, Calendar, UserPlus, FileText, MessageSquare, AlertCircle, CheckCircle, Search, Filter } from "lucide-react"; import { formatDistanceToNow } from "date-fns"; import PageHeader from "../components/common/PageHeader"; const iconMap = { calendar: Calendar, user: UserPlus, invoice: FileText, message: MessageSquare, alert: AlertCircle, check: CheckCircle, }; const colorMap = { blue: "bg-blue-100 text-blue-600", red: "bg-red-100 text-red-600", green: "bg-green-100 text-green-600", yellow: "bg-yellow-100 text-yellow-600", purple: "bg-purple-100 text-purple-600", }; // Safe date formatter const safeFormatDistanceToNow = (dateString) => { if (!dateString) return "Unknown time"; try { const date = new Date(dateString); // Check for valid date object if (isNaN(date.getTime())) return "Unknown time"; return formatDistanceToNow(date, { addSuffix: true }); } catch { return "Unknown time"; } }; export default function ActivityLog() { const [activeTab, setActiveTab] = useState("all"); const [searchTerm, setSearchTerm] = useState(""); const queryClient = useQueryClient(); const { data: user } = useQuery({ queryKey: ['current-user-activity'], queryFn: () => base44.auth.me(), }); const { data: activities = [], isLoading } = useQuery({ queryKey: ['activity-logs', user?.id], queryFn: () => base44.entities.ActivityLog.filter({ user_id: user?.id }, '-created_date', 100), enabled: !!user?.id, initialData: [], }); const filteredActivities = activities.filter(activity => { const matchesSearch = !searchTerm || activity.title?.toLowerCase().includes(searchTerm.toLowerCase()) || activity.description?.toLowerCase().includes(searchTerm.toLowerCase()); const matchesTab = activeTab === "all" || (activeTab === "unread" && !activity.is_read) || (activeTab === "read" && activity.is_read); return matchesSearch && matchesTab; }); const unreadCount = activities.filter(a => !a.is_read).length; return (
{activity.description}
Try adjusting your filters