"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 { MEAL_CARD_PROVIDERS, type MealCardProvider } from "@/shared/accounts"; import { formatMoneyInput } from "@/shared/money"; import { quantityInput } from "@/shared/stock"; import { effortScore, STORE_KINDS, type StoreKind } from "@/shared/stores"; import { saveStoreAction } from "../actions"; import type { StoreView } from "../service"; const t = tr.stores; type Errors = Record; /** Yeni mağaza / düzenle. Online mağazada uzaklık yerine teslimat ücretleri. */ export function StoreFormDialog({ store, onClose, }: { store: StoreView | null; onClose: () => void; }) { const [v, setV] = useState({ name: store?.name ?? "", kind: (store?.kind ?? "market") as StoreKind, branch: store?.branch ?? "", distanceKm: store?.distanceM != null ? quantityInput(store.distanceM) : "", carryDifficulty: String(store?.carryDifficulty ?? 2), deliveryFee: store?.deliveryFeeMinor != null ? formatMoneyInput(store.deliveryFeeMinor) : "", freeDeliveryMin: store?.freeDeliveryMinMinor != null ? formatMoneyInput(store.freeDeliveryMinMinor) : "", mealCardAccepted: store?.mealCardAccepted ?? false, mealCardProviders: (store?.mealCardProviders ?? []) as MealCardProvider[], note: store?.note ?? "", }); const [errors, setErrors] = useState({}); const [busy, setBusy] = useState(false); const set = (k: K, x: (typeof v)[K]) => setV((s) => ({ ...s, [k]: x })); const online = v.kind === "online"; const f = t.fields; // Önizleme: girilen uzaklık ve taşıma puanıyla zahmet skoru. const meters = Number(v.distanceKm.replace(",", ".")) * 1000; const preview = effortScore({ kind: v.kind, distanceM: Number.isFinite(meters) && v.distanceKm.trim() ? meters : null, carryDifficulty: Number(v.carryDifficulty), }); async function submit(e: React.FormEvent) { e.preventDefault(); setBusy(true); const r = await saveStoreAction(store?.id ?? null, { ...v, carryDifficulty: v.carryDifficulty, }); setBusy(false); if (r.ok) { toast.success(t.toast.saved); onClose(); } else setErrors({ ...r.fieldErrors, root: r.fieldErrors ? undefined : r.error }); } const toggleProvider = (p: MealCardProvider, on: boolean) => set( "mealCardProviders", on ? [...v.mealCardProviders, p] : v.mealCardProviders.filter((x) => x !== p), ); return ( !o && onClose()} title={store ? t.editTitle : t.createTitle} footer={ <> } >
{f.name} set("name", e.target.value)} aria-invalid={Boolean(errors.name)} autoFocus={!store} /> {errors.name ? {errors.name} : null} {f.branch} set("branch", e.target.value)} />
{f.kind}
{online ? ( <> {f.deliveryFee} (₺) set("deliveryFee", e.target.value)} className="text-right tabular-nums" aria-invalid={Boolean(errors.deliveryFee)} /> {errors.deliveryFee ? {errors.deliveryFee} : null} {f.freeDeliveryMin} (₺) set("freeDeliveryMin", e.target.value)} className="text-right tabular-nums" aria-invalid={Boolean(errors.freeDeliveryMin)} /> {errors.freeDeliveryMin ? ( {errors.freeDeliveryMin} ) : null} ) : ( {f.distance} set("distanceKm", e.target.value)} className="text-right tabular-nums" aria-invalid={Boolean(errors.distanceKm)} /> {errors.distanceKm ? {errors.distanceKm} : null} )} {f.carry}
{online ? null : `${f.distanceHint} `} {f.carryHint} {t.effortValue(preview)} set("mealCardAccepted", x === true)} /> {f.mealCard} {v.mealCardAccepted ? ( {f.mealCardProviders}
{MEAL_CARD_PROVIDERS.map((p) => ( ))}
{errors.mealCardProviders ? ( {errors.mealCardProviders} ) : null}
) : null} {f.note} set("note", e.target.value)} /> {errors.root ? {errors.root} : null}
); }