"use client"; import React, { useState, useEffect } from "react"; import { apiClient } from "@/lib/api/client"; /* ------------------------------------------------------------------ */ /* Types */ /* ------------------------------------------------------------------ */ interface ActivityItem { id: string; time: string; title: string; description: string; iconGradient: string; icon: React.ReactNode; } /* ------------------------------------------------------------------ */ /* Icons */ /* ------------------------------------------------------------------ */ const InboundIcon = ( ); const OutboundIcon = ( ); /* ------------------------------------------------------------------ */ /* Helper */ /* ------------------------------------------------------------------ */ function formatTime(dateStr: string): string { if (!dateStr) return ""; try { const d = new Date(dateStr); if (isNaN(d.getTime())) return ""; return `${String(d.getHours()).padStart(2, "0")}:${String(d.getMinutes()).padStart(2, "0")}`; } catch { return ""; } } /* ------------------------------------------------------------------ */ /* Component */ /* ------------------------------------------------------------------ */ export function RecentActivity() { const [activities, setActivities] = useState([]); const [loading, setLoading] = useState(true); useEffect(() => { const fetchActivity = async () => { try { const [inboundRes, outboundRes] = await Promise.all([ apiClient.get("/receiving/list", { params: {}, }), apiClient.get("/outbound/list", { params: {}, }), ]); const inboundData: Record[] = inboundRes.data?.data ?? []; const outboundData: Record[] = outboundRes.data?.data ?? []; // Map inbound items const inboundItems: ActivityItem[] = inboundData.slice(0, 10).map((r, idx) => ({ id: `in-${r.id || idx}`, time: formatTime(String(r.created_date ?? "")), title: `입고 ${String(r.inbound_number ?? "")}`, description: [ r.supplier_name ? String(r.supplier_name) : null, r.item_name ? String(r.item_name) : null, r.inbound_qty ? `${String(r.inbound_qty)}${r.unit ? String(r.unit) : "EA"}` : null, ].filter(Boolean).join(" | ") || "입고 처리", iconGradient: "linear-gradient(135deg,#3b82f6,#1d4ed8)", icon: InboundIcon, })); // Map outbound items const outboundItems: ActivityItem[] = outboundData.slice(0, 10).map((r, idx) => ({ id: `out-${r.id || idx}`, time: formatTime(String(r.created_date ?? "")), title: `출고 ${String(r.outbound_number ?? "")}`, description: [ r.customer_name ? String(r.customer_name) : null, r.item_name ? String(r.item_name) : null, r.outbound_qty ? `${String(r.outbound_qty)}${r.unit ? String(r.unit) : "EA"}` : null, ].filter(Boolean).join(" | ") || "출고 처리", iconGradient: "linear-gradient(135deg,#22c55e,#15803d)", icon: OutboundIcon, })); // Merge and sort by time descending, take top 5 const merged = [...inboundItems, ...outboundItems].sort((a, b) => { // Sort by time string descending (HH:MM) if (b.time > a.time) return 1; if (b.time < a.time) return -1; return 0; }); setActivities(merged.slice(0, 5)); } catch { // On failure, show empty state setActivities([]); } finally { setLoading(false); } }; fetchActivity(); }, []); return (

최근 활동

전체 보기
{loading ? (
불러오는 중...
) : activities.length === 0 ? (

최근 활동이 없습니다

) : (
{activities.map((item, idx) => (
{item.time}
{item.icon}
{item.title}
{item.description}
))}
)}
); }