diff --git a/src/app/merchant/analytics/page.tsx b/src/app/merchant/analytics/page.tsx index bc1d186..ecc09ea 100644 --- a/src/app/merchant/analytics/page.tsx +++ b/src/app/merchant/analytics/page.tsx @@ -19,9 +19,9 @@ import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { useMerchantContext } from "@/lib/contexts/MerchantContext"; import { apiClient } from "@/lib/api"; import { - Sparkles, MessageSquare, Send, X, Bot, RefreshCw, ChevronLeft, ChevronRight, + Sparkles, MessageSquare, Send, X, Bot, RefreshCw, ChevronLeft, ChevronRight, ChevronDown, Filter, Wallet, TrendingUp, PieChart, Activity, ArrowUpRight, ArrowDownRight, DollarSign, List, BadgeDollarSign, Plus, Search, - AlertTriangle, Package, ShieldCheck, ArrowRight, Layers, ShoppingCart, Info, Percent, Tag, CheckCircle2, BarChart3 + AlertTriangle, Package, ShieldCheck, ArrowRight, Layers, ShoppingCart, Info, Percent, Tag, CheckCircle2, BarChart3, Star } from "lucide-react"; ChartJS.register( @@ -48,6 +48,7 @@ const TRANSLATIONS = { description: "Manage your cashflow, monitor sales trends, and get AI business insights.", tabFinance: "Finance & Cashflow", tabSales: "Sales Trends", + tabReviews: "Reviews", tabAI: "AI Insights", netProfit: "Net Profit", totalRevenue: "Total Revenue", @@ -62,6 +63,8 @@ const TRANSLATIONS = { insight1Desc: "Based on weekly trends, bakery items experience a 15% demand drop on Mondays. We recommend reducing the morning prep batch size for Chocolate Bread by 15% next Monday.", insight2Title: "Surplus Conversion Rate", insight2Desc: "Your surplus conversion is at 84%, which is excellent. You saved 12.5 kg of food waste this week, resulting in an additional Rp 320,000 in recovery revenue.", + insight3Title: "Customer Sentiment Summary", + insight3Desc: "Overall customer sentiment is very positive. They love your Chocolate Bread. Consider increasing the initial stock for this product.", chatWelcome: "Hello! I am your AI Business Assistant. Ask me anything about your sales performance, inventory expiry tracking, or how to reduce food surplus waste.", chatInputPlaceholder: "Ask the AI assistant...", send: "Send", @@ -95,6 +98,7 @@ const TRANSLATIONS = { description: "Kelola arus kas, pantau tren penjualan, dan dapatkan wawasan bisnis dari AI.", tabFinance: "Keuangan & Cashflow", tabSales: "Tren Penjualan", + tabReviews: "Ulasan Pelanggan", tabAI: "AI Insights", netProfit: "Laba Bersih", totalRevenue: "Pendapatan Total", @@ -109,6 +113,8 @@ const TRANSLATIONS = { insight1Desc: "Berdasarkan tren mingguan, produk bakery mengalami penurunan permintaan sebesar 15% pada hari Senin. Direkomendasikan untuk mengurangi volume produksi Roti Cokelat sebanyak 15% pada Senin depan.", insight2Title: "Tingkat Konversi Produk Surplus", insight2Desc: "Konversi surplus toko Anda berada di angka 84% (Sangat Baik). Anda menyelamatkan 12.5 kg makanan minggu ini, menghasilkan tambahan pemulihan pendapatan sebesar Rp 320.000.", + insight3Title: "Ringkasan Sentimen Pelanggan", + insight3Desc: "Secara keseluruhan, sentimen pelanggan sangat positif. Mereka menyukai Roti Cokelat Anda. Pertimbangkan untuk meningkatkan stok awal untuk produk ini.", chatWelcome: "Halo! Saya AI Business Assistant Anda. Tanyakan apa saja tentang kinerja penjualan, pemantauan tanggal kedaluwarsa, atau cara mengurangi limbah surplus makanan.", chatInputPlaceholder: "Tanya asisten AI...", send: "Kirim", @@ -142,7 +148,7 @@ const TRANSLATIONS = { export default function StoreAnalyticsPage() { const { storeId } = useMerchantContext(); const [lang, setLang] = useState<"en" | "id">("en"); - const [activeTab, setActiveTab] = useState<"finance" | "sales" | "ai">("finance"); + const [activeTab, setActiveTab] = useState<"finance" | "sales" | "reviews" | "ai">("finance"); // Charts state const [timeFrame, setTimeFrame] = useState<"weekly" | "monthly">("weekly"); @@ -152,6 +158,10 @@ export default function StoreAnalyticsPage() { const [txSearch, setTxSearch] = useState(""); const [txFilter, setTxFilter] = useState<"in" | "out">("in"); + // Reviews State + const [reviewSearch, setReviewSearch] = useState(""); + const [reviewFilter, setReviewFilter] = useState<"all" | "5" | "4" | "3" | "2" | "1">("all"); + // Backend Live State const [financialData, setFinancialData] = useState<{ net_profit: number; @@ -963,6 +973,108 @@ export default function StoreAnalyticsPage() { ); + const mockReviews = [ + { id: 1, customer: "Budi Santoso", rating: 5, date: "21 Jul 2026", comment: "Roti cokelatnya masih sangat enak walaupun beli saat surplus. Teksturnya lembut dan harganya sangat bersahabat!", product: "Roti Cokelat" }, + { id: 2, customer: "Siti Rahma", rating: 4, date: "20 Jul 2026", comment: "Pelayanannya ramah dan proses pick-up sangat cepat. Kualitas makanan masih terjamin.", product: "Paket Bundling Surplus" }, + { id: 3, customer: "Andi Saputra", rating: 5, date: "19 Jul 2026", comment: "Inisiatif yang sangat bagus untuk mengurangi limbah makanan. Makanan beratnya mengenyangkan dan rasanya tidak berubah.", product: "Nasi Goreng Spesial" }, + { id: 4, customer: "Dewi Lestari", rating: 3, date: "18 Jul 2026", comment: "Rotinya agak sedikit keras, tapi masih layak konsumsi. Sesuai dengan harganya yang diskon.", product: "Roti Tawar" }, + ]; + + const renderReviewsTab = () => { + const filteredReviews = mockReviews.filter((r) => { + const matchesSearch = r.customer.toLowerCase().includes(reviewSearch.toLowerCase()) || r.product.toLowerCase().includes(reviewSearch.toLowerCase()); + const matchesFilter = reviewFilter === "all" || r.rating.toString() === reviewFilter; + return matchesSearch && matchesFilter; + }); + + return ( +
{t.insight3Desc}
+{review.date} • {review.product}
+{review.comment}
+Tidak ada ulasan yang sesuai kriteria.
+Coba sesuaikan kata kunci pencarian atau filter rating.
+