/** * @license * SPDX-License-Identifier: Apache-2.0 */ import React, { useEffect, useMemo, useRef, useState } from 'react'; import { Building2, Store, Truck, CreditCard, SlidersHorizontal, Users, MapPin, Phone, Mail, Check, RotateCcw, CheckCircle2, } from 'lucide-react'; import { useFiestaAllTenants, useFiestaTenantLocations } from '../services/fiestaQueries'; import { FIESTA_TENANT_ID, str as fstr, num as fnum, roleName } from '../services/fiestaApi'; import UsersPanel from './UsersPanel'; interface SettingsViewProps { tenantId?: number; } type TabKey = 'profile' | 'outlets' | 'users' | 'delivery' | 'payment' | 'preferences'; /** Locally-persisted merchant preferences (survive reload via localStorage). */ interface MerchantSettings { // Business profile (seeded from live tenant data, then locally editable) contactEmail: string; contactPhone: string; minOrderValue: number; // Delivery deliveryCharge: number; prepMins: number; deliveryWindowMins: number; cancelWindowSecs: number; autoAssignRider: boolean; // Payment & tax defaultTaxPercent: number; codEnabled: boolean; onlinePaymentEnabled: boolean; // Preferences defaultRegion: string; defaultNewUserRole: number; orderNotifications: boolean; lowStockAlerts: boolean; dailySummaryEmail: boolean; syncInterval: number; sandboxMode: boolean; } const STORAGE_KEY = 'merchant-settings-v1'; const DEFAULTS: MerchantSettings = { contactEmail: '', contactPhone: '', minOrderValue: 0, deliveryCharge: 30, prepMins: 15, deliveryWindowMins: 45, cancelWindowSecs: 60, autoAssignRider: true, defaultTaxPercent: 5, codEnabled: true, onlinePaymentEnabled: true, defaultRegion: 'Coimbatore', defaultNewUserRole: 4, orderNotifications: true, lowStockAlerts: true, dailySummaryEmail: false, syncInterval: 5, sandboxMode: false, }; function loadSettings(): { settings: MerchantSettings; hadSaved: boolean } { try { const raw = localStorage.getItem(STORAGE_KEY); if (raw) return { settings: { ...DEFAULTS, ...JSON.parse(raw) }, hadSaved: true }; } catch { /* ignore corrupt storage */ } return { settings: { ...DEFAULTS }, hadSaved: false }; } // ── Small presentational helpers ──────────────────────────────────────────── function Toggle({ checked, onChange }: { checked: boolean; onChange: () => void }) { return (