import { useEffect, useMemo, useState } from "react"; import { useNavigate } from "react-router-dom"; import { AppLayout } from "@/components/AppLayout"; import { useAuth } from "@/hooks/useAuth"; import { supabase } from "@/integrations/supabase/client"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Textarea } from "@/components/ui/textarea"; import { Dialog, DialogContent, DialogHeader, DialogTitle } from "@/components/ui/dialog"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"; import { Badge } from "@/components/ui/badge"; import { Skeleton } from "@/components/ui/skeleton"; import { toast } from "@/hooks/use-toast"; import { formatIDR, formatDateTime } from "@/lib/format"; interface WalletData { current_balance: number; total_earned: number; total_withdrawn: number; pending_balance: number; } interface ProfitRow { order_item_id: string; order_id: string; created_at: string; product_title: string; profit_share_percentage: number; profit_amount: number; profit_status: string | null; wallet_transaction_id: string | null; } interface WithdrawalRow { id: string; amount: number; status: string; requested_at: string; processed_at: string | null; payment_reference: string | null; admin_notes: string | null; } export default function MemberProfit() { const { user, loading: authLoading } = useAuth(); const navigate = useNavigate(); const [loading, setLoading] = useState(true); const [wallet, setWallet] = useState(null); const [profits, setProfits] = useState([]); const [withdrawals, setWithdrawals] = useState([]); const [openWithdrawDialog, setOpenWithdrawDialog] = useState(false); const [withdrawAmount, setWithdrawAmount] = useState(""); const [withdrawNotes, setWithdrawNotes] = useState(""); const [submitting, setSubmitting] = useState(false); const [settings, setSettings] = useState<{ min_withdrawal_amount: number } | null>(null); useEffect(() => { if (!authLoading && !user) navigate("/auth"); if (user) fetchData(); }, [user, authLoading]); const fetchData = async () => { const [walletRes, profitRes, withdrawalRes, settingsRes] = await Promise.all([ supabase.rpc("get_collaborator_wallet", { p_user_id: user!.id }), supabase .from("collaborator_profits") .select("*") .eq("collaborator_user_id", user!.id) .order("created_at", { ascending: false }), supabase .from("withdrawals") .select("id, amount, status, requested_at, processed_at, payment_reference, admin_notes") .eq("user_id", user!.id) .order("requested_at", { ascending: false }), supabase.rpc("get_collaboration_settings"), ]); setWallet((walletRes.data?.[0] as WalletData) || { current_balance: 0, total_earned: 0, total_withdrawn: 0, pending_balance: 0, }); setProfits((profitRes.data as ProfitRow[]) || []); setWithdrawals((withdrawalRes.data as WithdrawalRow[]) || []); setSettings({ min_withdrawal_amount: settingsRes.data?.[0]?.min_withdrawal_amount || 100000 }); setLoading(false); }; const canSubmit = useMemo(() => { const amount = Number(withdrawAmount || 0); const min = settings?.min_withdrawal_amount || 100000; const available = Number(wallet?.current_balance || 0); return amount >= min && amount <= available; }, [withdrawAmount, settings, wallet]); const submitWithdrawal = async () => { if (!canSubmit) { toast({ title: "Nominal tidak valid", description: "Periksa minimum penarikan dan saldo tersedia", variant: "destructive", }); return; } setSubmitting(true); const { data, error } = await supabase.functions.invoke("create-withdrawal", { body: { amount: Number(withdrawAmount), notes: withdrawNotes || null, }, }); const response = data as { error?: string } | null; if (error || response?.error) { toast({ title: "Gagal membuat withdrawal", description: response?.error || error?.message || "Unknown error", variant: "destructive", }); setSubmitting(false); return; } toast({ title: "Berhasil", description: "Withdrawal request berhasil dibuat" }); setSubmitting(false); setOpenWithdrawDialog(false); setWithdrawAmount(""); setWithdrawNotes(""); fetchData(); }; if (authLoading || loading) { return (
); } return (

Profit

Ringkasan pendapatan kolaborasi Anda

Total Earnings

{formatIDR(wallet?.total_earned || 0)}

Available Balance

{formatIDR(wallet?.current_balance || 0)}

Total Withdrawn

{formatIDR(wallet?.total_withdrawn || 0)}

Pending Balance

{formatIDR(wallet?.pending_balance || 0)}

Withdrawal

Minimum withdrawal: {formatIDR(settings?.min_withdrawal_amount || 100000)}

Available balance: {formatIDR(wallet?.current_balance || 0)}

Profit History DateProductShareAmountStatus {profits.map((row) => ( {formatDateTime(row.created_at)} {row.product_title} {row.profit_share_percentage}% {formatIDR(row.profit_amount || 0)} {row.profit_status || "-"} ))} {profits.length === 0 && ( Belum ada data profit )}
Withdrawal History DateAmountStatusReference {withdrawals.map((w) => ( {formatDateTime(w.requested_at)} {formatIDR(w.amount || 0)} {w.status} {w.payment_reference || "-"} ))} {withdrawals.length === 0 && ( Belum ada withdrawal )}
Request Withdrawal
setWithdrawAmount(e.target.value)} />