"use client"; import { ArrowLeft, EllipsisVertical, Gift, HandCoins, Lock, Pencil, ShoppingBag, Trash2, } from "lucide-react"; import Link from "next/link"; import { useRouter } from "next/navigation"; import { useState } from "react"; import { toast } from "sonner"; import { PageHeader } from "@/components/page-header"; import { AlertDialog, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, } from "@/components/ui/alert-dialog"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Card, CardContent } from "@/components/ui/card"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; import { tr } from "@/i18n/tr"; import { ASSETS, formatAssetQuantity } from "@/shared/assets"; import { formatDate, formatMoney } from "@/shared/format"; import { isInflow, type MovementKind } from "@/shared/portfolio"; import { deleteAssetAction, deleteMovementAction } from "../actions"; import type { AssetDetail, MovementRow } from "../service"; import { AssetFormDialog, MovementDialog } from "./asset-dialogs"; import { ProfitLoss, Stat } from "./assets-view"; const t = tr.assets; const d = (ymd: string) => formatDate(`${ymd}T12:00:00+03:00`); type Pending = | { kind: "edit" } | { kind: "movement"; movement: MovementKind } | { kind: "deleteMovement"; row: MovementRow } | { kind: "deleteAsset" } | null; /** /birikim/:id — özet, hareket ekleme ve hareket geçmişi. */ export function AssetDetailView({ data }: { data: AssetDetail }) { const router = useRouter(); const [pending, setPending] = useState(null); const close = () => setPending(null); const s = data.summary; const unit = ASSETS[data.assetKey].unit; return (
setPending({ kind: "edit" })}> {tr.common.edit} 0} onSelect={() => setPending({ kind: "deleteAsset" })} > {t.delete} ) : null } /> {data.isPrivate ? ( {t.privateBadge} ) : null}
{formatAssetQuantity(data.assetKey, s.quantity)} {s.avgCostMinor !== null ? `${formatMoney(s.avgCostMinor)} ${t.stats.perUnit(unit)}` : "—"} {formatMoney(s.costMinor)} {s.currentValueMinor !== null ? formatMoney(s.currentValueMinor) : t.stats.noPrice} {formatMoney(s.investedMinor)} {formatMoney(s.proceedsMinor)}
{data.price ? (

{t.stats.price(formatMoney(data.price.buyMinor), d(data.price.date))} ·{" "} {t.prices}

) : null} {data.storage ? (

{t.movement.storage}: {data.storage}

) : null} {data.note ?

{data.note}

: null} {data.canWrite ? (
{s.quantity > 0 ? ( ) : null}
) : null}

{t.history}

{data.movements.length === 0 ? (

{t.noMovements}

) : (
    {data.movements.map((row) => ( setPending({ kind: "deleteMovement", row })} /> ))}
)}
{pending?.kind === "edit" ? : null} {pending?.kind === "movement" ? ( ) : null} !o && close()} > {pending?.kind === "deleteAsset" ? t.deleteTitle : t.deleteMovementTitle} {pending?.kind === "deleteAsset" ? t.deleteDescription : t.deleteMovementDescription} {tr.common.cancel}
); } function MovementItem({ row, data, canWrite, onDelete, }: { row: MovementRow; data: AssetDetail; canWrite: boolean; onDelete: () => void; }) { const inflow = isInflow(row.kind); const qty = formatAssetQuantity(data.assetKey, row.quantity); const unit = ASSETS[data.assetKey].unit; return (
  • {t.kinds[row.kind]} {inflow ? "+" : "−"} {qty}

    {d(row.date)} {row.unitPriceMinor !== null ? ` · ${formatMoney(row.unitPriceMinor)} ${t.stats.perUnit(unit)}` : ""} {row.account ? ` · ${row.account}` : ""} {row.storage ? ` · ${row.storage}` : ""}

    {row.note ?

    {row.note}

    : null}

    {t.table.balance}: {formatAssetQuantity(data.assetKey, row.quantityAfter)}

    {row.kind !== "gift_out" ? ( {formatMoney(row.amountMinor)} ) : ( {t.stats.cost} {formatMoney(row.costOutMinor)} )} {row.kind === "sell" ? ( {t.table.result}: ) : null}
    {canWrite && !row.fromInKind ? ( ) : null}
  • ); }