"use client" import * as React from "react" import { useRouter } from "next/navigation" import { BanknoteIcon, CreditCardIcon, LandmarkIcon, Layers2Icon, Loader2Icon, MoreHorizontalIcon, PowerIcon, PowerOffIcon, PencilIcon, PlusIcon, SearchIcon, Trash2Icon, WalletCardsIcon, } from "lucide-react" import { deleteAccountAction, toggleAccountActiveAction, type AccountWithChannels, } from "@/lib/actions/account" import { Badge } from "@/components/ui/badge" import { Button } from "@/components/ui/button" import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog" import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu" import { Input } from "@/components/ui/input" import { Select, SelectContent, SelectGroup, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select" import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, } from "@/components/ui/tooltip" import { AccountDialog } from "./account-dialog" const typeLabels = { BANK: "银行账户", E_WALLET: "电子钱包", CASH: "现金", } as const const balanceLabels = { ASSET: "资产类", LIABILITY: "负债类", EQUITY: "权益类", } as const const typeIcon = (type: AccountWithChannels["accountType"]) => type === "BANK" ? ( ) : type === "E_WALLET" ? ( ) : ( ) export function AccountsView({ initialAccounts, }: { initialAccounts: AccountWithChannels[] }) { const router = useRouter() const [accountsList, setAccountsList] = React.useState(initialAccounts) const [searchQuery, setSearchQuery] = React.useState("") const [typeFilter, setTypeFilter] = React.useState("ALL") const [balanceFilter, setBalanceFilter] = React.useState("ALL") const [dialogOpen, setDialogOpen] = React.useState(false) const [editingAccount, setEditingAccount] = React.useState(null) const [deletingAccount, setDeletingAccount] = React.useState(null) const [isDeleting, setIsDeleting] = React.useState(false) const [togglingId, setTogglingId] = React.useState(null) const filteredAccounts = React.useMemo(() => { const query = searchQuery.trim().toLowerCase() return accountsList.filter((account) => { const text = [ account.name, account.issuerName, account.platform, account.accountNumber, account.accountId, account.primaryCurrency, account.remark, ] .filter(Boolean) .join(" ") .toLowerCase() return ( (!query || text.includes(query)) && (typeFilter === "ALL" || account.accountType === typeFilter) && (balanceFilter === "ALL" || account.balanceType === balanceFilter) ) }) }, [accountsList, balanceFilter, searchQuery, typeFilter]) const groups = ( Object.keys(balanceLabels) as Array ) .map((balanceType) => ({ balanceType, accounts: filteredAccounts.filter( (account) => account.balanceType === balanceType ), })) .filter((group) => group.accounts.length) const clearFilters = () => { setSearchQuery("") setTypeFilter("ALL") setBalanceFilter("ALL") } const hasFilters = Boolean(searchQuery) || typeFilter !== "ALL" || balanceFilter !== "ALL" const openCreate = () => { setEditingAccount(null) setDialogOpen(true) } const toggleActive = async ( account: AccountWithChannels, checked: boolean ) => { setTogglingId(account.id) setAccountsList((items) => items.map((item) => item.id === account.id ? { ...item, isActive: checked } : item ) ) try { const result = await toggleAccountActiveAction(account.id, checked) if (!result.success) setAccountsList((items) => items.map((item) => item.id === account.id ? { ...item, isActive: !checked } : item ) ) else router.refresh() } catch { setAccountsList((items) => items.map((item) => item.id === account.id ? { ...item, isActive: !checked } : item ) ) } finally { setTogglingId(null) } } const confirmDelete = async () => { if (!deletingAccount) return setIsDeleting(true) try { const result = await deleteAccountAction(deletingAccount.id) if (result.success) { setAccountsList((items) => items.filter((item) => item.id !== deletingAccount.id) ) setDeletingAccount(null) router.refresh() } } finally { setIsDeleting(false) } } return (

资金管理

资金账户

按资产归属管理账户主体与结算币种。

setSearchQuery(event.target.value)} placeholder="搜索账户、机构、账号或币种" className="pl-8" />
{hasFilters && ( )}
{groups.length ? (
{groups.map(({ balanceType, accounts }) => (

{balanceLabels[balanceType]}

{accounts.length} 个账户
账户名称 账户类型 关联渠道
{accounts.map((account) => { const actionMenu = ( } /> } > 更多操作 toggleActive(account, !account.isActive) } > {account.isActive ? ( ) : ( )} {account.isActive ? "停用账户" : "启用账户"} { setEditingAccount(account) setDialogOpen(true) }} > 编辑账户 setDeletingAccount(account)} > 删除账户 ) return (
{typeIcon(account.accountType)}

{account.name}

{!account.isActive && ( 已停用 )}

{account.issuerName || account.platform || account.location || account.remark || ""}

{actionMenu}
类型 {typeLabels[account.accountType]}
关联渠道 {account.channelCount} 个
{actionMenu}
) })}
))}
) : (

{hasFilters ? "没有符合条件的账户" : "还没有资金账户"}

{hasFilters ? "调整关键词或筛选条件后再试。" : "创建账户后即可关联支付渠道。"}

{hasFilters && ( )}
)} router.refresh()} /> !open && setDeletingAccount(null)} > 确认删除账户 将删除「{deletingAccount?.name} 」。删除后不可恢复,历史关联记录会保留。
) }