"use client"; import { useState, useEffect, useCallback } from "react"; import { Loader2, Save, SlidersHorizontal, X } from "lucide-react"; import { toast } from "sonner"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; import { Checkbox } from "@/components/ui/checkbox"; import { Label } from "@/components/ui/label"; import { PageHeader } from '@/components/navigation/page-header'; interface CompanyCategory { value: number; label: string; is_active: boolean; } interface Company { id: number; company_name: string; } interface SectionSettings { company_category_ids: number[]; excluded_company_ids: number[]; } interface DisplaySettings { kiosk: SectionSettings; mobile: SectionSettings; } function CompanySearch({ selectedIds, categoryIds, onAdd, onRemove, allCompanies, }: { selectedIds: number[]; categoryIds: number[]; onAdd: (id: number) => void; onRemove: (id: number) => void; allCompanies: Company[]; }) { const [query, setQuery] = useState(""); const [open, setOpen] = useState(false); const available = allCompanies.filter( (c) => !selectedIds.includes(c.id) && (query === "" || c.company_name.toLowerCase().includes(query.toLowerCase())) ); const selected = allCompanies.filter((c) => selectedIds.includes(c.id)); return (
{selected.map((c) => ( {c.company_name} ))} {selected.length === 0 && ( No exclusions )}
{ setQuery(e.target.value); setOpen(true); }} onFocus={() => setOpen(true)} onBlur={() => setTimeout(() => setOpen(false), 150)} className="w-full rounded-md border border-input bg-background px-3 py-1.5 text-sm shadow-sm placeholder:text-muted-foreground focus:outline-none focus:ring-1 focus:ring-ring" /> {open && available.length > 0 && (
{available.slice(0, 30).map((c) => ( ))}
)}
); } function Section({ title, description, settingsKey, settings, categories, companies, onSaved, }: { title: string; description: string; settingsKey: "kiosk" | "mobile"; settings: SectionSettings; categories: CompanyCategory[]; companies: Company[]; onSaved: (key: "kiosk" | "mobile", updated: SectionSettings) => void; }) { const [local, setLocal] = useState(settings); const [saving, setSaving] = useState(false); useEffect(() => { setLocal(settings); }, [settings]); function toggleCategory(value: number) { setLocal((prev) => ({ ...prev, company_category_ids: prev.company_category_ids.includes(value) ? prev.company_category_ids.filter((v) => v !== value) : [...prev.company_category_ids, value], })); } function addExclusion(id: number) { setLocal((prev) => ({ ...prev, excluded_company_ids: [...prev.excluded_company_ids, id] })); } function removeExclusion(id: number) { setLocal((prev) => ({ ...prev, excluded_company_ids: prev.excluded_company_ids.filter((v) => v !== id) })); } async function save() { setSaving(true); try { await Promise.all([ fetch("/api/admin/display-settings", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ setting_key: `${settingsKey}_company_category_ids`, setting_value: local.company_category_ids, }), }), fetch("/api/admin/display-settings", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ setting_key: `${settingsKey}_excluded_company_ids`, setting_value: local.excluded_company_ids, }), }), ]); toast.success(`${title} settings saved`); onSaved(settingsKey, local); } catch { toast.error(`Failed to save ${title} settings`); } finally { setSaving(false); } } const filteredCompanies = companies.filter((c) => local.company_category_ids.length === 0 ? true : true ); return ( {title} {description}

Company Categories to Include

{categories.length === 0 ? (

No categories synced yet. Run a sync to populate.

) : (
{categories.map((cat) => (
toggleCategory(cat.value)} />
))}
)}

Excluded Companies

Individual companies to hide even if they match the selected categories.

); } export default function DisplaySettingsPage() { const [settings, setSettings] = useState(null); const [categories, setCategories] = useState([]); const [companies, setCompanies] = useState([]); const [loading, setLoading] = useState(true); const load = useCallback(async () => { try { const [settingsRes, catsRes, companiesRes] = await Promise.all([ fetch("/api/admin/display-settings"), fetch("/api/data/company-categories"), fetch("/api/data/companies-list"), ]); if (settingsRes.ok) setSettings(await settingsRes.json()); if (catsRes.ok) setCategories(await catsRes.json()); if (companiesRes.ok) setCompanies(await companiesRes.json()); } catch { toast.error("Failed to load display settings"); } finally { setLoading(false); } }, []); useEffect(() => { load(); }, [load]); function handleSaved(key: "kiosk" | "mobile", updated: SectionSettings) { setSettings((prev) => prev ? { ...prev, [key]: updated } : prev); } if (loading) { return (
); } if (!settings) { return (

Failed to load settings.

); } return ( <>
); }