import { useEffect, useState } from 'react';
import { Plus, Pencil, Trash2, Save, X, EyeOff, Eye, ChevronUp, ChevronDown } from 'lucide-react';
import { api } from '../lib/api.js';
function cx(...args) {
return args.filter(Boolean).join(' ');
}
const inputCls = 'w-full rounded-md border px-2.5 py-1.5 text-sm bg-transparent border-slate-300 dark:border-slate-700';
function PromoCard({ promo, onSave, onDelete, onMoveUp, onMoveDown, isFirst, isLast }) {
const [editing, setEditing] = useState(false);
const [form, setForm] = useState(promo);
useEffect(() => setForm(promo), [promo]);
if (editing) {
return (
);
}
return (
{promo.title}
{promo.price_text}
{promo.old_price_text && {promo.old_price_text}}
{promo.description}
);
}
function NewPromoForm({ onCreate }) {
const [open, setOpen] = useState(false);
const [form, setForm] = useState({ title: '', price_text: '', old_price_text: '', description: '' });
async function submit() {
if (!form.title.trim() || !form.price_text.trim()) return;
await onCreate({ ...form, old_price_text: form.old_price_text || null });
setForm({ title: '', price_text: '', old_price_text: '', description: '' });
setOpen(false);
}
if (!open) {
return (
);
}
return (
);
}
export default function PromotionsEditor() {
const [promotions, setPromotions] = useState([]);
const [loading, setLoading] = useState(true);
const [reordering, setReordering] = useState(false);
async function load() {
setLoading(true);
setPromotions(await api.adminGetPromotions());
setLoading(false);
}
useEffect(() => {
load();
}, []);
async function move(index, direction) {
const targetIndex = index + direction;
if (targetIndex < 0 || targetIndex >= promotions.length || reordering) return;
const a = promotions[index];
const b = promotions[targetIndex];
setReordering(true);
try {
await Promise.all([
api.adminUpdatePromotion(a.id, { sort_order: b.sort_order }),
api.adminUpdatePromotion(b.id, { sort_order: a.sort_order }),
]);
await load();
} finally {
setReordering(false);
}
}
if (loading) return Загружаем акции...
;
return (
Акции
Когда акция заканчивается, просто скройте её кнопкой с глазом - не обязательно удалять.
Стрелками можно менять порядок, в котором акции идут на сайте.
{promotions.map((p, i) => (
move(i, -1)}
onMoveDown={() => move(i, 1)}
onSave={async (data) => { await api.adminUpdatePromotion(p.id, data); load(); }}
onDelete={async (id) => { await api.adminDeletePromotion(id); load(); }}
/>
))}
{ await api.adminCreatePromotion(data); load(); }} />
);
}