import { useEffect, useState } from 'react' import { adminApi } from '../../api/client' import { useTranslation } from '../../i18n' import { useSettingsStore } from '../../store/settingsStore' import { useAddonStore } from '../../store/addonStore' import { useToast } from '../shared/Toast' import { Puzzle, ListChecks, Wallet, FileText, CalendarDays, Globe, Briefcase, Image, Terminal, Link2 } from 'lucide-react' const ICON_MAP = { ListChecks, Wallet, FileText, CalendarDays, Puzzle, Globe, Briefcase, Image, Terminal, Link2, } interface Addon { id: string name: string description: string icon: string enabled: boolean } interface AddonIconProps { name: string size?: number } function AddonIcon({ name, size = 20 }: AddonIconProps) { const Icon = ICON_MAP[name] || Puzzle return } export default function AddonManager({ bagTrackingEnabled, onToggleBagTracking }: { bagTrackingEnabled?: boolean; onToggleBagTracking?: () => void }) { const { t } = useTranslation() const dm = useSettingsStore(s => s.settings.dark_mode) const dark = dm === true || dm === 'dark' || (dm === 'auto' && window.matchMedia('(prefers-color-scheme: dark)').matches) const toast = useToast() const refreshGlobalAddons = useAddonStore(s => s.loadAddons) const [addons, setAddons] = useState([]) const [loading, setLoading] = useState(true) useEffect(() => { loadAddons() }, []) const loadAddons = async () => { setLoading(true) try { const data = await adminApi.addons() setAddons(data.addons) } catch (err: unknown) { toast.error(t('admin.addons.toast.error')) } finally { setLoading(false) } } const handleToggle = async (addon) => { const newEnabled = !addon.enabled // Optimistic update setAddons(prev => prev.map(a => a.id === addon.id ? { ...a, enabled: newEnabled } : a)) try { await adminApi.updateAddon(addon.id, { enabled: newEnabled }) refreshGlobalAddons() toast.success(t('admin.addons.toast.updated')) } catch (err: unknown) { // Rollback setAddons(prev => prev.map(a => a.id === addon.id ? { ...a, enabled: !newEnabled } : a)) toast.error(t('admin.addons.toast.error')) } } const tripAddons = addons.filter(a => a.type === 'trip') const globalAddons = addons.filter(a => a.type === 'global') const integrationAddons = addons.filter(a => a.type === 'integration') if (loading) { return (
) } return (
{/* Header */}

{t('admin.addons.title')}

{t('admin.addons.subtitleBefore')}TREK{t('admin.addons.subtitleAfter')}

{addons.length === 0 ? (
{t('admin.addons.noAddons')}
) : (
{/* Trip Addons */} {tripAddons.length > 0 && (
{t('admin.addons.type.trip')} — {t('admin.addons.tripHint')}
{tripAddons.map(addon => (
{addon.id === 'packing' && addon.enabled && onToggleBagTracking && (
{t('admin.bagTracking.title')}
{t('admin.bagTracking.subtitle')}
{bagTrackingEnabled ? t('admin.addons.enabled') : t('admin.addons.disabled')}
)}
))}
)} {/* Global Addons */} {globalAddons.length > 0 && (
{t('admin.addons.type.global')} — {t('admin.addons.globalHint')}
{globalAddons.map(addon => ( ))}
)} {/* Integration Addons */} {integrationAddons.length > 0 && (
{t('admin.addons.type.integration')} — {t('admin.addons.integrationHint')}
{integrationAddons.map(addon => ( ))}
)}
)}
) } interface AddonRowProps { addon: Addon onToggle: (addonId: string) => void t: (key: string) => string } function getAddonLabel(t: (key: string) => string, addon: Addon): { name: string; description: string } { const nameKey = `admin.addons.catalog.${addon.id}.name` const descKey = `admin.addons.catalog.${addon.id}.description` const translatedName = t(nameKey) const translatedDescription = t(descKey) return { name: translatedName !== nameKey ? translatedName : addon.name, description: translatedDescription !== descKey ? translatedDescription : addon.description, } } function AddonRow({ addon, onToggle, t }: AddonRowProps) { const isComingSoon = false const label = getAddonLabel(t, addon) return (
{/* Icon */}
{/* Info */}
{label.name} {isComingSoon && ( Coming Soon )} {addon.type === 'global' ? t('admin.addons.type.global') : addon.type === 'integration' ? t('admin.addons.type.integration') : t('admin.addons.type.trip')}

{label.description}

{/* Toggle */}
{isComingSoon ? t('admin.addons.disabled') : addon.enabled ? t('admin.addons.enabled') : t('admin.addons.disabled')}
) }