"use client"; import { useState } from "react"; import { ArrowTrendingUpIcon } from "@heroicons/react/24/outline"; import { cn } from "@/lib/utils"; import { DashboardActivityItem } from "./DashboardActivityItem"; import { filterActivities, ACTIVITY_FILTERS, getActivityNavigationPath, isActivityClickable, } from "../utils/dashboard.utils"; import type { Activity } from "@customer-portal/domain/billing"; import type { ActivityFilter } from "@customer-portal/domain/billing"; export interface ActivityFeedProps { activities: Activity[]; onItemClick?: (activity: Activity) => void; className?: string; maxItems?: number; showFilter?: boolean; loading?: boolean; error?: string | null; } export function ActivityFeed({ activities, onItemClick, className, maxItems = 10, showFilter = true, loading = false, error = null, }: ActivityFeedProps) { const [filter, setFilter] = useState("all"); const filteredActivities = filterActivities(activities, filter); const displayActivities = filteredActivities.slice(0, maxItems); const handleActivityClick = (activity: Activity) => { if (onItemClick) { onItemClick(activity); } else if (isActivityClickable(activity)) { const path = getActivityNavigationPath(activity); if (path) { window.location.href = path; } } }; if (loading) { return (
{showFilter && (
{ACTIVITY_FILTERS.map((_, index) => (
))}
)}
{Array.from({ length: 3 }).map((_, index) => (
))}
); } if (error) { return (

Recent Activity

{error}
); } return (

Recent Activity

{showFilter && (
{ACTIVITY_FILTERS.map(filterOption => ( ))}
)}
{displayActivities.length > 0 ? (
{displayActivities.map(activity => { const clickable = isActivityClickable(activity); return ( handleActivityClick(activity) : undefined} /> ); })}
) : (

{filter === "all" ? "No recent activity" : `No ${filter} activity`}

{filter === "all" ? "Your account activity will appear here." : `Your ${filter} activity will appear here.`}

)}
{filteredActivities.length > maxItems && (

Showing {maxItems} of {filteredActivities.length} activities

)}
); }