"use client"; import { useState } from "react"; import { toast } from "sonner"; import { ResponsiveDialog } from "@/components/responsive-dialog"; import { Button } from "@/components/ui/button"; import { Checkbox } from "@/components/ui/checkbox"; import { Field, FieldDescription, FieldError, FieldGroup, FieldLabel } from "@/components/ui/field"; import { Input } from "@/components/ui/input"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { tr } from "@/i18n/tr"; import { todayIstanbul } from "@/shared/dates"; import { parseMoney } from "@/shared/money"; import { formatUnitPrice, unitPrice } from "@/shared/prices"; import { addProductPriceAction } from "../actions"; import type { PriceProductOption } from "../options"; import type { StoreRef } from "../service"; import { StoreDot } from "./offers-list"; const t = tr.productPrices; type Errors = Record; /** Elle fiyat girişi: ürün (sabit olabilir), mağaza, tarih, paket fiyatı, kampanya. */ export function PriceFormDialog({ products, stores, productId, onClose, }: { products: PriceProductOption[]; stores: StoreRef[]; /** Ürün sayfasından açılınca sabit. */ productId?: string; onClose: () => void; }) { const [v, setV] = useState({ productId: productId ?? (products.length === 1 ? products[0]!.id : ""), storeId: "", date: todayIstanbul(), price: "", isPromo: false, promoUntil: "", note: "", }); const [errors, setErrors] = useState({}); const [busy, setBusy] = useState(false); const set = (k: K, x: (typeof v)[K]) => setV((s) => ({ ...s, [k]: x })); const product = products.find((p) => p.id === v.productId); const minor = parseMoney(v.price); const preview = product?.inTypeUnit && minor && minor > 0 ? formatUnitPrice(unitPrice(minor, product.inTypeUnit), product.typeUnit) : null; const f = t.fields; async function submit(e: React.FormEvent) { e.preventDefault(); setBusy(true); const r = await addProductPriceAction(v); setBusy(false); if (r.ok) { toast.success(t.toast.saved); onClose(); } else setErrors({ ...r.fieldErrors, root: r.fieldErrors ? undefined : r.error }); } return ( !o && onClose()} title={t.addTitle} description={product ? `${product.label} · ${product.packageLabel}` : undefined} footer={ <> } >
{productId ? null : ( {f.product} {errors.productId ? {errors.productId} : null} )} {f.store} {errors.storeId ? {errors.storeId} : null}
{f.date} set("date", e.target.value)} aria-invalid={Boolean(errors.date)} /> {errors.date ? {errors.date} : null} {f.price} set("price", e.target.value)} className="text-right tabular-nums" aria-invalid={Boolean(errors.price)} autoFocus /> {errors.price ? {errors.price} : null}
{preview ? ( {f.unitPreview(preview)} ) : null} set("isPromo", x === true)} /> {f.isPromo} {v.isPromo ? ( {f.promoUntil} set("promoUntil", e.target.value)} aria-invalid={Boolean(errors.promoUntil)} /> {f.promoUntilHint} {errors.promoUntil ? {errors.promoUntil} : null} ) : null} {f.note} set("note", e.target.value)} /> {errors.root ? {errors.root} : null}
); }