import { createResource, createSignal, Show } from 'solid-js'; import AdminShell from '~/components/AdminShell'; const API = '/api/gateway'; async function loadTaxes(): Promise { try { const res = await fetch(`${API}/api/admin/tax`); if (!res.ok) throw new Error('Failed to load'); const data = await res.json(); return Array.isArray(data) ? data : (data.taxes || data.tax || []); } catch { return []; } } export default function TaxPage() { const [taxes, { refetch }] = createResource(loadTaxes); const [deleting, setDeleting] = createSignal(''); const [showForm, setShowForm] = createSignal(false); const [saving, setSaving] = createSignal(false); const [formError, setFormError] = createSignal(''); const [name, setName] = createSignal(''); const [rate, setRate] = createSignal(''); const [description, setDescription] = createSignal(''); const handleSave = async (e: Event) => { e.preventDefault(); try { setSaving(true); setFormError(''); const res = await fetch(`${API}/api/admin/tax`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ name: name(), rate: Number(rate()), description: description() }), }); if (!res.ok) throw new Error('Failed to create tax'); setName(''); setRate(''); setDescription(''); setShowForm(false); refetch(); } catch (err: any) { setFormError(err.message || 'Failed to save'); } finally { setSaving(false); } }; const handleDelete = async (id: string, taxName: string) => { if (!confirm(`Delete tax "${taxName}"?`)) return; try { setDeleting(id); const res = await fetch(`${API}/api/admin/tax/${id}`, { method: 'DELETE' }); if (!res.ok) throw new Error('Failed to delete'); refetch(); } catch { // ignore } finally { setDeleting(''); } }; return (

Tax Management

Configure tax rates for platform transactions.

New Tax

{formError()}
setName(e.currentTarget.value)} required style="width:100%;padding:8px 10px;border:1px solid #e2e8f0;border-radius:6px;font-size:14px" />
setRate(e.currentTarget.value)} required min="0" max="100" step="0.01" style="width:100%;padding:8px 10px;border:1px solid #e2e8f0;border-radius:6px;font-size:14px" />
setDescription(e.currentTarget.value)} style="width:100%;padding:8px 10px;border:1px solid #e2e8f0;border-radius:6px;font-size:14px" />
0}> {taxes()!.map((item) => ( ))}
Name Rate (%) Description Status Actions
Loading...
Failed to load. Is the backend running?
No records found.
{item.name} {item.rate}% {item.description || '—'} {item.is_active !== false ? 'Active' : 'Inactive'}
Edit
); }