import React, { useState, useEffect } from 'react'; import { AuthProvider, AuthGuard, useAuth } from './AdminAuth'; import AdminLayout from './AdminLayout'; interface Rule { field: string; op: string; value: string; } interface Collection { id: string; name: string; slug: string; type: 'smart' | 'manual'; rules: Rule[]; sort_field: string; sort_dir: string; item_limit: number; enabled: boolean; } const FIELDS = ['brand', 'category', 'price', 'performance_score', 'shop_count', 'clicks_7d']; const OPERATORS = ['equals', 'not_equals', 'contains', 'greater_than', 'less_than', 'in_list']; function RuleRow({ rule, onChange, onRemove }: { rule: Rule; onChange: (r: Rule) => void; onRemove: () => void }) { return (
onChange({ ...rule, value: e.target.value })} className="bg-[#0A0A0A] border border-[#333] rounded-lg px-3 py-2 text-sm text-[#F5F5F5] flex-1" placeholder="Value" />
); } function CollectionBuilderContent() { const { token } = useAuth(); const [collections, setCollections] = useState([]); const [editing, setEditing] = useState(null); const [showForm, setShowForm] = useState(false); useEffect(() => { // Mock data setCollections([ { id: '1', name: 'Bestsellers', slug: 'bestsellers', type: 'smart', rules: [{ field: 'performance_score', op: 'greater_than', value: '70' }], sort_field: 'performance_score', sort_dir: 'desc', item_limit: 50, enabled: true }, { id: '2', name: 'Nike Dunks', slug: 'nike-dunks', type: 'smart', rules: [{ field: 'brand', op: 'equals', value: 'Nike' }, { field: 'category', op: 'contains', value: 'Dunk' }], sort_field: 'price', sort_dir: 'asc', item_limit: 100, enabled: true }, { id: '3', name: 'Under €100', slug: 'under-100', type: 'smart', rules: [{ field: 'price', op: 'less_than', value: '100' }], sort_field: 'price', sort_dir: 'asc', item_limit: 50, enabled: true }, ]); }, []); const startEdit = (c: Collection) => { setEditing({ ...c, rules: [...c.rules] }); setShowForm(true); }; const startNew = () => { setEditing({ id: '', name: '', slug: '', type: 'smart', rules: [{ field: 'brand', op: 'equals', value: '' }], sort_field: 'performance_score', sort_dir: 'desc', item_limit: 50, enabled: true }); setShowForm(true); }; const addRule = () => { if (editing) setEditing({ ...editing, rules: [...editing.rules, { field: 'brand', op: 'equals', value: '' }] }); }; const updateRule = (i: number, rule: Rule) => { if (editing) { const rules = [...editing.rules]; rules[i] = rule; setEditing({ ...editing, rules }); } }; const removeRule = (i: number) => { if (editing) setEditing({ ...editing, rules: editing.rules.filter((_, idx) => idx !== i) }); }; const save = () => { if (!editing) return; if (editing.id) { setCollections(prev => prev.map(c => c.id === editing.id ? editing : c)); } else { setCollections(prev => [...prev, { ...editing, id: crypto.randomUUID() }]); } setShowForm(false); setEditing(null); }; return (
{showForm && editing && (

{editing.id ? 'Edit' : 'New'} Collection

setEditing({ ...editing, name: e.target.value })} className="w-full bg-[#0A0A0A] border border-[#333] rounded-lg px-3 py-2 text-sm text-[#F5F5F5]" />
setEditing({ ...editing, slug: e.target.value })} className="w-full bg-[#0A0A0A] border border-[#333] rounded-lg px-3 py-2 text-sm text-[#F5F5F5]" />
{editing.rules.map((rule, i) => ( updateRule(i, r)} onRemove={() => removeRule(i)} /> ))}
setEditing({ ...editing, item_limit: Number(e.target.value) })} className="w-full bg-[#0A0A0A] border border-[#333] rounded-lg px-3 py-2 text-sm text-[#F5F5F5]" />
)}
{collections.map(c => ( ))}
Name Type Rules Limit Actions
{c.name} {c.type} {c.rules.map(r => `${r.field} ${r.op} ${r.value}`).join(' & ')} {c.item_limit}
); } export default function CollectionBuilderPage() { return ; }