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
{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]" />
)}
| Name |
Type |
Rules |
Limit |
Actions |
{collections.map(c => (
| {c.name} |
{c.type} |
{c.rules.map(r => `${r.field} ${r.op} ${r.value}`).join(' & ')} |
{c.item_limit} |
|
))}
);
}
export default function CollectionBuilderPage() {
return ;
}