@burdenoff/microfe-adaptercloud 2026.625.1 → 2026.625.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adaptercloud/components/PageLayout.js +24 -17
- package/dist/adaptercloud/components/PageLayout.js.map +1 -1
- package/dist/adaptercloud/pages/HomePage.js +18 -16
- package/dist/adaptercloud/pages/HomePage.js.map +1 -1
- package/dist/adaptercloud/pages/admin/AdminAnalyticsPage.js +90 -82
- package/dist/adaptercloud/pages/admin/AdminAnalyticsPage.js.map +1 -1
- package/dist/adaptercloud/pages/admin/AdminDashboard.js +70 -44
- package/dist/adaptercloud/pages/admin/AdminDashboard.js.map +1 -1
- package/dist/adaptercloud/pages/admin/AdminFinancialPage.js +60 -55
- package/dist/adaptercloud/pages/admin/AdminFinancialPage.js.map +1 -1
- package/dist/adaptercloud/pages/admin/AdminOrdersPage.js +97 -92
- package/dist/adaptercloud/pages/admin/AdminOrdersPage.js.map +1 -1
- package/dist/adaptercloud/pages/admin/AdminProfilePage.js +59 -57
- package/dist/adaptercloud/pages/admin/AdminProfilePage.js.map +1 -1
- package/dist/adaptercloud/pages/admin/AdminSettingsPage.js +118 -104
- package/dist/adaptercloud/pages/admin/AdminSettingsPage.js.map +1 -1
- package/dist/adaptercloud/pages/admin/CartManagementPage.js +145 -140
- package/dist/adaptercloud/pages/admin/CartManagementPage.js.map +1 -1
- package/dist/adaptercloud/pages/admin/UserManagementPage.js +152 -147
- package/dist/adaptercloud/pages/admin/UserManagementPage.js.map +1 -1
- package/dist/adaptercloud/pages/cart-owner/AnalyticsDashboard.js +87 -81
- package/dist/adaptercloud/pages/cart-owner/AnalyticsDashboard.js.map +1 -1
- package/dist/adaptercloud/pages/cart-owner/BusinessSettingsPage.js +179 -165
- package/dist/adaptercloud/pages/cart-owner/BusinessSettingsPage.js.map +1 -1
- package/dist/adaptercloud/pages/cart-owner/CartOwnerDashboard.js +73 -48
- package/dist/adaptercloud/pages/cart-owner/CartOwnerDashboard.js.map +1 -1
- package/dist/adaptercloud/pages/cart-owner/CartOwnerProfilePage.js +95 -93
- package/dist/adaptercloud/pages/cart-owner/CartOwnerProfilePage.js.map +1 -1
- package/dist/adaptercloud/pages/cart-owner/CartServiceConfigPage.js +110 -107
- package/dist/adaptercloud/pages/cart-owner/CartServiceConfigPage.js.map +1 -1
- package/dist/adaptercloud/pages/cart-owner/InventoryManagementPage.js +293 -299
- package/dist/adaptercloud/pages/cart-owner/InventoryManagementPage.js.map +1 -1
- package/dist/adaptercloud/pages/cart-owner/OrderManagementPage.js +218 -224
- package/dist/adaptercloud/pages/cart-owner/OrderManagementPage.js.map +1 -1
- package/dist/adaptercloud/pages/cart-owner/StaffManagementPage.js +122 -128
- package/dist/adaptercloud/pages/cart-owner/StaffManagementPage.js.map +1 -1
- package/dist/adaptercloud/pages/common/HelpSupportPage.js +248 -244
- package/dist/adaptercloud/pages/common/HelpSupportPage.js.map +1 -1
- package/dist/adaptercloud/pages/common/NotificationCenterPage.js +96 -91
- package/dist/adaptercloud/pages/common/NotificationCenterPage.js.map +1 -1
- package/dist/adaptercloud/pages/common/SettingsPage.js +754 -736
- package/dist/adaptercloud/pages/common/SettingsPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/BookingDetailsPage.js +63 -61
- package/dist/adaptercloud/pages/customer/BookingDetailsPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/CartDetailPage.js +110 -108
- package/dist/adaptercloud/pages/customer/CartDetailPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/CartDiscoveryPage.js +221 -217
- package/dist/adaptercloud/pages/customer/CartDiscoveryPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/CheckoutPage.js +89 -87
- package/dist/adaptercloud/pages/customer/CheckoutPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/CustomerDashboard.js +410 -381
- package/dist/adaptercloud/pages/customer/CustomerDashboard.js.map +1 -1
- package/dist/adaptercloud/pages/customer/CustomerProfilePage.js +120 -118
- package/dist/adaptercloud/pages/customer/CustomerProfilePage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/DirectServiceBookingPage.js +86 -81
- package/dist/adaptercloud/pages/customer/DirectServiceBookingPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/FavoritesPage.js +53 -51
- package/dist/adaptercloud/pages/customer/FavoritesPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/OrderHistoryPage.js +114 -109
- package/dist/adaptercloud/pages/customer/OrderHistoryPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/OrderTrackingPage.js +60 -58
- package/dist/adaptercloud/pages/customer/OrderTrackingPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/PaymentMethodsPage.js +87 -72
- package/dist/adaptercloud/pages/customer/PaymentMethodsPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/ReviewsPage.js +65 -63
- package/dist/adaptercloud/pages/customer/ReviewsPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/SavedAddressesPage.js +68 -53
- package/dist/adaptercloud/pages/customer/SavedAddressesPage.js.map +1 -1
- package/dist/adaptercloud/pages/investor/InvestmentDetailsPage.js +63 -61
- package/dist/adaptercloud/pages/investor/InvestmentDetailsPage.js.map +1 -1
- package/dist/adaptercloud/pages/investor/InvestmentOpportunitiesPage.js +86 -84
- package/dist/adaptercloud/pages/investor/InvestmentOpportunitiesPage.js.map +1 -1
- package/dist/adaptercloud/pages/investor/InvestorAnalyticsPage.js +57 -55
- package/dist/adaptercloud/pages/investor/InvestorAnalyticsPage.js.map +1 -1
- package/dist/adaptercloud/pages/investor/InvestorDashboard.js +341 -308
- package/dist/adaptercloud/pages/investor/InvestorDashboard.js.map +1 -1
- package/dist/adaptercloud/pages/investor/InvestorInvestmentsPage.js +34 -32
- package/dist/adaptercloud/pages/investor/InvestorInvestmentsPage.js.map +1 -1
- package/dist/adaptercloud/pages/investor/InvestorPortfolioPage.js +48 -46
- package/dist/adaptercloud/pages/investor/InvestorPortfolioPage.js.map +1 -1
- package/dist/adaptercloud/pages/investor/InvestorProfilePage.js +383 -381
- package/dist/adaptercloud/pages/investor/InvestorProfilePage.js.map +1 -1
- package/dist/adaptercloud/pages/worker/TaskDetailsPage.js +348 -319
- package/dist/adaptercloud/pages/worker/TaskDetailsPage.js.map +1 -1
- package/dist/adaptercloud/pages/worker/WorkerDashboard.js +84 -59
- package/dist/adaptercloud/pages/worker/WorkerDashboard.js.map +1 -1
- package/dist/adaptercloud/pages/worker/WorkerOrdersPage.js +73 -71
- package/dist/adaptercloud/pages/worker/WorkerOrdersPage.js.map +1 -1
- package/dist/adaptercloud/pages/worker/WorkerProfilePage.js +76 -74
- package/dist/adaptercloud/pages/worker/WorkerProfilePage.js.map +1 -1
- package/dist/adaptercloud/pages/worker/WorkerSchedulePage.js +70 -68
- package/dist/adaptercloud/pages/worker/WorkerSchedulePage.js.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BusinessSettingsPage.js","names":[],"sources":["../../../../src/adaptercloud/pages/cart-owner/BusinessSettingsPage.tsx"],"sourcesContent":["/**\n * Business Settings Page\n *\n * Tabbed interface (general/contact/location/operating/policies/notifications/integrations),\n * all form fields per tab including social media, coordinates, delivery charges,\n * payment methods, policy textareas, notification toggles, payment gateway config.\n *\n * @module adaptercloud/pages/cart-owner\n */\n\nimport { useState } from'react';\nimport {\n Store,\n FileText,\n CreditCard,\n Building2,\n Save,\n AlertCircle,\n MapPin,\n Clock,\n Shield,\n Bell,\n Link2,\n CheckCircle2,\n Globe,\n Phone,\n Mail,\n Instagram,\n Twitter,\n} from'lucide-react';\nimport { PageLayout } from'../../components/PageLayout';\nimport { useAdapterCloud } from'../../context/AdapterCloudContext';\nimport { cn } from'../../utils/cn';\n\n// ============================================================================\n// Types\n// ============================================================================\n\ntype TabId =\n | 'general'\n | 'contact'\n | 'location'\n | 'operating'\n | 'policies'\n | 'notifications'\n | 'integration';\n\ninterface Tab {\n id: TabId;\n label: string;\n icon: typeof Store;\n}\n\ninterface GeneralSettings {\n businessName: string;\n description: string;\n category: string;\n gstNumber: string;\n panNumber: string;\n fssaiLicense: string;\n establishedYear: string;\n}\n\ninterface ContactSettings {\n phone: string;\n email: string;\n website: string;\n whatsapp: string;\n instagram: string;\n twitter: string;\n facebook: string;\n}\n\ninterface LocationSettings {\n address: string;\n city: string;\n state: string;\n pincode: string;\n latitude: string;\n longitude: string;\n deliveryRadius: number;\n deliveryCharge: number;\n freeDeliveryAbove: number;\n}\n\ninterface OperatingSettings {\n autoAcceptOrders: boolean;\n preparationTime: number;\n maxConcurrentOrders: number;\n advanceBookingDays: number;\n}\n\ninterface PolicySettings {\n returnPolicy: string;\n cancellationPolicy: string;\n privacyPolicy: string;\n termsOfService: string;\n}\n\ninterface NotificationSettings {\n newOrderEmail: boolean;\n newOrderSms: boolean;\n newOrderPush: boolean;\n orderUpdateEmail: boolean;\n orderUpdatePush: boolean;\n dailySummaryEmail: boolean;\n weeklySummaryEmail: boolean;\n lowStockAlert: boolean;\n reviewNotification: boolean;\n marketingEmails: boolean;\n}\n\ninterface IntegrationSettings {\n paymentGateway: string;\n paymentGatewayKey: string;\n smsProvider: string;\n smsApiKey: string;\n analyticsId: string;\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst tabs: Tab[] = [\n { id: 'general', label: 'General', icon: Store },\n { id: 'contact', label: 'Contact', icon: Phone },\n { id: 'location', label: 'Location', icon: MapPin },\n { id: 'operating', label: 'Operating', icon: Clock },\n { id: 'policies', label: 'Policies', icon: Shield },\n { id: 'notifications', label: 'Notifications', icon: Bell },\n { id: 'integration', label: 'Integrations', icon: Link2 },\n];\n\nconst categories = [\n 'Food & Beverage',\n 'Personal Care & Beauty',\n 'Repair & Maintenance',\n 'Home Services',\n 'Clothing & Fashion',\n 'Health & Wellness',\n 'Education & Skills',\n 'Retail & Merchandise',\n 'Grocery & Essentials',\n];\n\n// ============================================================================\n// Form Field Component\n// ============================================================================\n\ninterface FormFieldProps {\n label: string;\n value: string | number;\n onChange: (value: string) => void;\n type?: 'text' | 'email' | 'tel' | 'url' | 'number' | 'textarea' | 'select';\n options?: string[];\n placeholder?: string;\n hint?: string;\n rows?: number;\n}\n\nconst FormField = ({\n label,\n value,\n onChange,\n type = 'text',\n options,\n placeholder,\n hint,\n rows = 3,\n}: FormFieldProps) => {\n const id = label.toLowerCase().replace(/\\s+/g, '-');\n return (\n <div>\n <label htmlFor={id} className=\"block text-sm font-medium text-text-primary mb-1.5\">\n {label}\n </label>\n {type === 'textarea' ? (\n <textarea\n id={id}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n rows={rows}\n placeholder={placeholder}\n className=\"w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)] resize-none\"\n />\n ) : type === 'select' ? (\n <select\n id={id}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n className=\"w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n >\n {options?.map((opt) => (\n <option key={opt} value={opt}>\n {opt}\n </option>\n ))}\n </select>\n ) : (\n <input\n id={id}\n type={type}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n placeholder={placeholder}\n className=\"w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n />\n )}\n {hint && <p className=\"mt-1 text-xs text-text-secondary\">{hint}</p>}\n </div>\n );\n};\n\n// ============================================================================\n// Toggle Component\n// ============================================================================\n\nconst Toggle = ({\n label,\n description,\n checked,\n onChange,\n}: {\n label: string;\n description?: string;\n checked: boolean;\n onChange: (v: boolean) => void;\n}) => (\n <div className=\"flex items-center justify-between py-3\">\n <div>\n <p className=\"text-sm font-medium text-text-primary\">{label}</p>\n {description && <p className=\"text-xs text-text-secondary mt-0.5\">{description}</p>}\n </div>\n <button\n type=\"button\"\n onClick={() => onChange(!checked)}\n className={cn(\n 'h-6 w-11 rounded-full transition-colors relative',\n checked ? 'bg-accent-blue-subtle' : 'bg-muted-foreground/30'\n )}\n >\n <div\n className={cn(\n 'absolute top-0.5 h-5 w-5 rounded-full bg-white transition-transform',\n checked ? 'translate-x-5' : 'translate-x-0.5'\n )}\n />\n </button>\n </div>\n);\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport const BusinessSettingsPage = () => {\n const { navigateTo } = useAdapterCloud();\n const [activeTab, setActiveTab] = useState<TabId>('general');\n const [saving, setSaving] = useState(false);\n const [saved, setSaved] = useState(false);\n\n // Form state\n const [general, setGeneral] = useState<GeneralSettings>({\n businessName: 'Dosa Express',\n description:\n 'Authentic South Indian street food with a modern twist. Serving crispy dosas, filter coffee, and more since 2020.',\n category: 'Food & Beverage',\n gstNumber: '29ABCDE1234F1Z5',\n panNumber: 'ABCDE1234F',\n fssaiLicense: '12345678',\n establishedYear: '2020',\n });\n\n const [contact, setContact] = useState<ContactSettings>({\n phone: '+91-9876543210',\n email: 'ravi@dosaexpress.in',\n website: 'https://dosaexpress.in',\n whatsapp: '+91-9876543210',\n instagram: '@dosaexpress',\n twitter: '@dosaexpress',\n facebook: 'dosaexpress',\n });\n\n const [location, setLocation] = useState<LocationSettings>({\n address: 'Koramangala 5th Block',\n city: 'Bangalore',\n state: 'Karnataka',\n pincode: '560034',\n latitude: '12.9352',\n longitude: '77.6245',\n deliveryRadius: 5,\n deliveryCharge: 30,\n freeDeliveryAbove: 300,\n });\n\n const [operating, setOperating] = useState<OperatingSettings>({\n autoAcceptOrders: true,\n preparationTime: 15,\n maxConcurrentOrders: 10,\n advanceBookingDays: 3,\n });\n\n const [policies, setPolicies] = useState<PolicySettings>({\n returnPolicy:\n 'Items can be returned within 30 minutes of delivery if there are quality issues. Refund will be processed within 2-3 business days.',\n cancellationPolicy:\n 'Orders can be cancelled within 2 minutes of placing. After preparation starts, cancellation is not allowed.',\n privacyPolicy:\n 'We collect and process your data in accordance with applicable privacy laws. Your data is never shared with third parties without consent.',\n termsOfService:\n 'By using our services, you agree to our terms. All prices are inclusive of taxes unless stated otherwise.',\n });\n\n const [notifications, setNotifications] = useState<NotificationSettings>({\n newOrderEmail: true,\n newOrderSms: true,\n newOrderPush: true,\n orderUpdateEmail: true,\n orderUpdatePush: true,\n dailySummaryEmail: true,\n weeklySummaryEmail: false,\n lowStockAlert: true,\n reviewNotification: true,\n marketingEmails: false,\n });\n\n const [integration, setIntegration] = useState<IntegrationSettings>({\n paymentGateway: 'razorpay',\n paymentGatewayKey: 'rzp_live_xxxxxxxx',\n smsProvider: 'twilio',\n smsApiKey: '',\n analyticsId: '',\n });\n\n const handleSave = () => {\n setSaving(true);\n setTimeout(() => {\n setSaving(false);\n setSaved(true);\n setTimeout(() => setSaved(false), 3000);\n }, 1000);\n };\n\n const updateGeneral = (field: keyof GeneralSettings) => (value: string) =>\n setGeneral((p) => ({ ...p, [field]: value }));\n const updateContact = (field: keyof ContactSettings) => (value: string) =>\n setContact((p) => ({ ...p, [field]: value }));\n const updateLocation = (field: keyof LocationSettings) => (value: string) =>\n setLocation((p) => ({\n ...p,\n [field]:\n field === 'deliveryRadius' || field === 'deliveryCharge' || field === 'freeDeliveryAbove'\n ? parseInt(value) || 0\n : value,\n }));\n const updatePolicies = (field: keyof PolicySettings) => (value: string) =>\n setPolicies((p) => ({ ...p, [field]: value }));\n const updateNotification = (field: keyof NotificationSettings) => (value: boolean) =>\n setNotifications((p) => ({ ...p, [field]: value }));\n const updateIntegration = (field: keyof IntegrationSettings) => (value: string) =>\n setIntegration((p) => ({ ...p, [field]: value }));\n\n // ---- Tab content renderers ----\n\n const renderGeneralTab = () => (\n <div className=\"space-y-5\">\n <FormField\n label=\"Business Name\"\n value={general.businessName}\n onChange={updateGeneral('businessName')}\n />\n <FormField\n label=\"Description\"\n value={general.description}\n onChange={updateGeneral('description')}\n type=\"textarea\"\n />\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-5\">\n <FormField\n label=\"Category\"\n value={general.category}\n onChange={updateGeneral('category')}\n type=\"select\"\n options={categories}\n />\n <FormField\n label=\"Established Year\"\n value={general.establishedYear}\n onChange={updateGeneral('establishedYear')}\n />\n </div>\n <div className=\"flex items-start gap-3 rounded-md bg-accent-blue-subtle/5 border border-accent-blue-subtle/20 p-3\">\n <AlertCircle className=\"h-4 w-4 text-accent-blue shrink-0 mt-0.5\" />\n <p className=\"text-xs text-accent-blue\">\n GST, PAN, and FSSAI details are used for invoicing and compliance. Changes require\n verification.\n </p>\n </div>\n <div className=\"grid grid-cols-1 sm:grid-cols-3 gap-5\">\n <FormField\n label=\"GST Number\"\n value={general.gstNumber}\n onChange={updateGeneral('gstNumber')}\n hint=\"15-digit GST ID\"\n />\n <FormField\n label=\"PAN Number\"\n value={general.panNumber}\n onChange={updateGeneral('panNumber')}\n hint=\"10-digit PAN\"\n />\n <FormField\n label=\"FSSAI License\"\n value={general.fssaiLicense}\n onChange={updateGeneral('fssaiLicense')}\n hint=\"FSSAI license number\"\n />\n </div>\n </div>\n );\n\n const renderContactTab = () => (\n <div className=\"space-y-5\">\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-5\">\n <FormField\n label=\"Phone\"\n value={contact.phone}\n onChange={updateContact('phone')}\n type=\"tel\"\n />\n <FormField\n label=\"Email\"\n value={contact.email}\n onChange={updateContact('email')}\n type=\"email\"\n />\n </div>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-5\">\n <FormField\n label=\"Website\"\n value={contact.website}\n onChange={updateContact('website')}\n type=\"url\"\n placeholder=\"https://\"\n />\n <FormField\n label=\"WhatsApp\"\n value={contact.whatsapp}\n onChange={updateContact('whatsapp')}\n type=\"tel\"\n />\n </div>\n <h3 className=\"text-sm font-semibold text-text-primary pt-2\">Social Media</h3>\n <div className=\"grid grid-cols-1 sm:grid-cols-3 gap-5\">\n <FormField\n label=\"Instagram\"\n value={contact.instagram}\n onChange={updateContact('instagram')}\n placeholder=\"@handle\"\n />\n <FormField\n label=\"Twitter / X\"\n value={contact.twitter}\n onChange={updateContact('twitter')}\n placeholder=\"@handle\"\n />\n <FormField\n label=\"Facebook\"\n value={contact.facebook}\n onChange={updateContact('facebook')}\n placeholder=\"Page name\"\n />\n </div>\n </div>\n );\n\n const renderLocationTab = () => (\n <div className=\"space-y-5\">\n <FormField\n label=\"Address\"\n value={location.address}\n onChange={updateLocation('address')}\n type=\"textarea\"\n rows={2}\n />\n <div className=\"grid grid-cols-1 sm:grid-cols-3 gap-5\">\n <FormField label=\"City\" value={location.city} onChange={updateLocation('city')} />\n <FormField label=\"State\" value={location.state} onChange={updateLocation('state')} />\n <FormField label=\"Pincode\" value={location.pincode} onChange={updateLocation('pincode')} />\n </div>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-5\">\n <FormField\n label=\"Latitude\"\n value={location.latitude}\n onChange={updateLocation('latitude')}\n hint=\"e.g., 12.9352\"\n />\n <FormField\n label=\"Longitude\"\n value={location.longitude}\n onChange={updateLocation('longitude')}\n hint=\"e.g., 77.6245\"\n />\n </div>\n <h3 className=\"text-sm font-semibold text-text-primary pt-2\">Delivery Settings</h3>\n <div className=\"grid grid-cols-1 sm:grid-cols-3 gap-5\">\n <FormField\n label=\"Delivery Radius (km)\"\n value={location.deliveryRadius}\n onChange={updateLocation('deliveryRadius')}\n type=\"number\"\n />\n <FormField\n label=\"Delivery Charge (₹)\"\n value={location.deliveryCharge}\n onChange={updateLocation('deliveryCharge')}\n type=\"number\"\n />\n <FormField\n label=\"Free Delivery Above (₹)\"\n value={location.freeDeliveryAbove}\n onChange={updateLocation('freeDeliveryAbove')}\n type=\"number\"\n />\n </div>\n </div>\n );\n\n const renderOperatingTab = () => (\n <div className=\"space-y-5\">\n <Toggle\n label=\"Auto-Accept Orders\"\n description=\"Automatically accept incoming orders without manual confirmation\"\n checked={operating.autoAcceptOrders}\n onChange={(v) => setOperating((p) => ({ ...p, autoAcceptOrders: v }))}\n />\n <div className=\"grid grid-cols-1 sm:grid-cols-3 gap-5\">\n <FormField\n label=\"Default Preparation Time (min)\"\n value={operating.preparationTime}\n onChange={(v) => setOperating((p) => ({ ...p, preparationTime: parseInt(v) || 0 }))}\n type=\"number\"\n />\n <FormField\n label=\"Max Concurrent Orders\"\n value={operating.maxConcurrentOrders}\n onChange={(v) => setOperating((p) => ({ ...p, maxConcurrentOrders: parseInt(v) || 0 }))}\n type=\"number\"\n />\n <FormField\n label=\"Advance Booking (days)\"\n value={operating.advanceBookingDays}\n onChange={(v) => setOperating((p) => ({ ...p, advanceBookingDays: parseInt(v) || 0 }))}\n type=\"number\"\n />\n </div>\n </div>\n );\n\n const renderPoliciesTab = () => (\n <div className=\"space-y-5\">\n <FormField\n label=\"Return Policy\"\n value={policies.returnPolicy}\n onChange={updatePolicies('returnPolicy')}\n type=\"textarea\"\n rows={4}\n />\n <FormField\n label=\"Cancellation Policy\"\n value={policies.cancellationPolicy}\n onChange={updatePolicies('cancellationPolicy')}\n type=\"textarea\"\n rows={4}\n />\n <FormField\n label=\"Privacy Policy\"\n value={policies.privacyPolicy}\n onChange={updatePolicies('privacyPolicy')}\n type=\"textarea\"\n rows={4}\n />\n <FormField\n label=\"Terms of Service\"\n value={policies.termsOfService}\n onChange={updatePolicies('termsOfService')}\n type=\"textarea\"\n rows={4}\n />\n </div>\n );\n\n const renderNotificationsTab = () => (\n <div className=\"space-y-1 divide-y divide-border\">\n <h3 className=\"text-sm font-semibold text-text-primary pb-2\">New Orders</h3>\n <Toggle\n label=\"Email Notification\"\n description=\"Receive email for new orders\"\n checked={notifications.newOrderEmail}\n onChange={updateNotification('newOrderEmail')}\n />\n <Toggle\n label=\"SMS Notification\"\n description=\"Receive SMS for new orders\"\n checked={notifications.newOrderSms}\n onChange={updateNotification('newOrderSms')}\n />\n <Toggle\n label=\"Push Notification\"\n description=\"Receive push notifications for new orders\"\n checked={notifications.newOrderPush}\n onChange={updateNotification('newOrderPush')}\n />\n <h3 className=\"text-sm font-semibold text-text-primary pt-4 pb-2\">Order Updates</h3>\n <Toggle\n label=\"Email Updates\"\n description=\"Get email when order status changes\"\n checked={notifications.orderUpdateEmail}\n onChange={updateNotification('orderUpdateEmail')}\n />\n <Toggle\n label=\"Push Updates\"\n description=\"Get push notifications for order updates\"\n checked={notifications.orderUpdatePush}\n onChange={updateNotification('orderUpdatePush')}\n />\n <h3 className=\"text-sm font-semibold text-text-primary pt-4 pb-2\">Reports & Alerts</h3>\n <Toggle\n label=\"Daily Summary\"\n description=\"Receive daily business summary email\"\n checked={notifications.dailySummaryEmail}\n onChange={updateNotification('dailySummaryEmail')}\n />\n <Toggle\n label=\"Weekly Summary\"\n description=\"Receive weekly performance report\"\n checked={notifications.weeklySummaryEmail}\n onChange={updateNotification('weeklySummaryEmail')}\n />\n <Toggle\n label=\"Low Stock Alert\"\n description=\"Get alerted when items are low on stock\"\n checked={notifications.lowStockAlert}\n onChange={updateNotification('lowStockAlert')}\n />\n <Toggle\n label=\"Review Notifications\"\n description=\"Get notified for new customer reviews\"\n checked={notifications.reviewNotification}\n onChange={updateNotification('reviewNotification')}\n />\n <Toggle\n label=\"Marketing Emails\"\n description=\"Receive tips and promotional content\"\n checked={notifications.marketingEmails}\n onChange={updateNotification('marketingEmails')}\n />\n </div>\n );\n\n const renderIntegrationTab = () => (\n <div className=\"space-y-5\">\n <h3 className=\"text-sm font-semibold text-text-primary\">Payment Gateway</h3>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-5\">\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">Provider</label>\n <select\n value={integration.paymentGateway}\n onChange={(e) => updateIntegration('paymentGateway')(e.target.value)}\n className=\"w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n >\n <option value=\"razorpay\">Razorpay</option>\n <option value=\"paytm\">Paytm</option>\n <option value=\"stripe\">Stripe</option>\n <option value=\"phonepe\">PhonePe</option>\n </select>\n </div>\n <FormField\n label=\"API Key\"\n value={integration.paymentGatewayKey}\n onChange={updateIntegration('paymentGatewayKey')}\n placeholder=\"Enter API key\"\n hint=\"Keep this secret\"\n />\n </div>\n <h3 className=\"text-sm font-semibold text-text-primary pt-2\">SMS Provider</h3>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-5\">\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">Provider</label>\n <select\n value={integration.smsProvider}\n onChange={(e) => updateIntegration('smsProvider')(e.target.value)}\n className=\"w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n >\n <option value=\"twilio\">Twilio</option>\n <option value=\"msg91\">MSG91</option>\n <option value=\"textlocal\">Textlocal</option>\n </select>\n </div>\n <FormField\n label=\"SMS API Key\"\n value={integration.smsApiKey}\n onChange={updateIntegration('smsApiKey')}\n placeholder=\"Enter SMS API key\"\n />\n </div>\n <h3 className=\"text-sm font-semibold text-text-primary pt-2\">Analytics</h3>\n <FormField\n label=\"Google Analytics ID\"\n value={integration.analyticsId}\n onChange={updateIntegration('analyticsId')}\n placeholder=\"GA-XXXXXXXXX\"\n />\n </div>\n );\n\n const ActiveIcon = tabs.find((t) => t.id === activeTab)?.icon || Store;\n\n return (\n <PageLayout\n title=\"Business Settings\"\n description=\"Manage your business profile and configuration\"\n actions={\n <button\n type=\"button\"\n onClick={handleSave}\n disabled={saving}\n className={cn(\n 'inline-flex items-center gap-2 rounded-md px-4 py-2 text-sm font-medium transition-colors',\n saved\n ? 'bg-status-success-bg-subtle/10 text-status-success-text'\n : saving\n ? 'bg-bg-sunken text-text-secondary cursor-not-allowed'\n : 'bg-accent text-text-primary hover:bg-accent/80'\n )}\n >\n {saving ? (\n <>\n <div className=\"h-4 w-4 animate-spin rounded-full border-2 border-current border-t-transparent\" />\n Saving...\n </>\n ) : saved ? (\n <>\n <CheckCircle2 className=\"h-4 w-4\" />\n Saved!\n </>\n ) : (\n <>\n <Save className=\"h-4 w-4\" />\n Save Settings\n </>\n )}\n </button>\n }\n >\n <div className=\"flex flex-col lg:flex-row gap-6\">\n {/* Mobile Tab Navigation */}\n <div className=\"lg:hidden\">\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-3 shadow-sm\">\n <div className=\"grid grid-cols-4 gap-2\">\n {tabs.map((tab) => {\n const Icon = tab.icon;\n return (\n <button\n key={tab.id}\n type=\"button\"\n onClick={() => setActiveTab(tab.id)}\n className={cn(\n 'flex flex-col items-center gap-1 rounded-md px-2 py-2 text-xs font-medium transition-colors',\n activeTab === tab.id\n ? 'bg-accent text-text-primary'\n : 'text-text-secondary hover:bg-bg-sunken'\n )}\n >\n <Icon className=\"h-4 w-4\" />\n <span className=\"hidden sm:inline\">{tab.label}</span>\n </button>\n );\n })}\n </div>\n </div>\n </div>\n\n {/* Desktop Sidebar */}\n <div className=\"hidden lg:block lg:w-56 shrink-0\">\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface shadow-sm sticky top-24\">\n <div className=\"p-4 border-b border-border-subtle\">\n <h2 className=\"font-semibold text-text-primary text-sm\">Settings</h2>\n </div>\n <nav className=\"p-2\">\n {tabs.map((tab) => {\n const Icon = tab.icon;\n return (\n <button\n key={tab.id}\n type=\"button\"\n onClick={() => setActiveTab(tab.id)}\n className={cn(\n 'w-full text-left px-3 py-2 rounded-md mb-1 flex items-center gap-3 text-sm transition-colors',\n activeTab === tab.id\n ? 'bg-accent text-text-primary font-medium'\n : 'text-text-secondary hover:bg-bg-sunken hover:text-text-primary'\n )}\n >\n <Icon className=\"h-4 w-4\" />\n {tab.label}\n </button>\n );\n })}\n </nav>\n </div>\n </div>\n\n {/* Content */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-5 sm:p-6 bg-gloss-card shadow-pop\">\n {activeTab === 'general' && renderGeneralTab()}\n {activeTab === 'contact' && renderContactTab()}\n {activeTab === 'location' && renderLocationTab()}\n {activeTab === 'operating' && renderOperatingTab()}\n {activeTab === 'policies' && renderPoliciesTab()}\n {activeTab === 'notifications' && renderNotificationsTab()}\n {activeTab === 'integration' && renderIntegrationTab()}\n\n {/* Save Button (bottom) */}\n <div className=\"flex justify-end mt-8 pt-6 border-t border-border-subtle\">\n <button\n type=\"button\"\n onClick={handleSave}\n disabled={saving}\n className={cn(\n 'inline-flex items-center gap-2 rounded-md px-6 py-2 text-sm font-medium transition-colors',\n saved\n ? 'bg-status-success-bg-subtle/10 text-status-success-text'\n : saving\n ? 'bg-bg-sunken text-text-secondary cursor-not-allowed'\n : 'bg-accent text-text-primary hover:bg-accent/80'\n )}\n >\n {saving ? (\n <>\n <div className=\"h-4 w-4 animate-spin rounded-full border-2 border-current border-t-transparent\" />\n Saving...\n </>\n ) : saved ? (\n <>\n <CheckCircle2 className=\"h-4 w-4\" />\n Saved!\n </>\n ) : (\n <>\n <Save className=\"h-4 w-4\" />\n Save Settings\n </>\n )}\n </button>\n </div>\n </div>\n </div>\n </div>\n </PageLayout>\n );\n};\n"],"mappings":";;;;;;;AA4HA,IAAM,IAAc;CAClB;EAAE,IAAI;EAAW,OAAO;EAAW,MAAM;EAAO;CAChD;EAAE,IAAI;EAAW,OAAO;EAAW,MAAM;EAAO;CAChD;EAAE,IAAI;EAAY,OAAO;EAAY,MAAM;EAAQ;CACnD;EAAE,IAAI;EAAa,OAAO;EAAa,MAAM;EAAO;CACpD;EAAE,IAAI;EAAY,OAAO;EAAY,MAAM;EAAQ;CACnD;EAAE,IAAI;EAAiB,OAAO;EAAiB,MAAM;EAAM;CAC3D;EAAE,IAAI;EAAe,OAAO;EAAgB,MAAM;EAAO;CAC1D,EAEK,IAAa;CACjB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,EAiBK,KAAa,EACjB,UACA,UACA,aACA,UAAO,QACP,YACA,gBACA,SACA,UAAO,QACa;CACpB,IAAM,IAAK,EAAM,aAAa,CAAC,QAAQ,QAAQ,IAAI;AACnD,QACE,kBAAC,OAAD,EAAA,UAAA;EACE,kBAAC,SAAD;GAAO,SAAS;GAAI,WAAU;aAC3B;GACK,CAAA;EACP,MAAS,aACR,kBAAC,YAAD;GACM;GACG;GACP,WAAW,MAAM,EAAS,EAAE,OAAO,MAAM;GACnC;GACO;GACb,WAAU;GACV,CAAA,GACA,MAAS,WACX,kBAAC,UAAD;GACM;GACG;GACP,WAAW,MAAM,EAAS,EAAE,OAAO,MAAM;GACzC,WAAU;aAET,GAAS,KAAK,MACb,kBAAC,UAAD;IAAkB,OAAO;cACtB;IACM,EAFI,EAEJ,CACT;GACK,CAAA,GAET,kBAAC,SAAD;GACM;GACE;GACC;GACP,WAAW,MAAM,EAAS,EAAE,OAAO,MAAM;GAC5B;GACb,WAAU;GACV,CAAA;EAEH,KAAQ,kBAAC,KAAD;GAAG,WAAU;aAAoC;GAAS,CAAA;EAC/D,EAAA,CAAA;GAQJ,KAAU,EACd,UACA,gBACA,YACA,kBAOA,kBAAC,OAAD;CAAK,WAAU;WAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;EAAG,WAAU;YAAyC;EAAU,CAAA,EAC/D,KAAe,kBAAC,KAAD;EAAG,WAAU;YAAsC;EAAgB,CAAA,CAC/E,EAAA,CAAA,EACN,kBAAC,UAAD;EACE,MAAK;EACL,eAAe,EAAS,CAAC,EAAQ;EACjC,WAAW,EACT,oDACA,IAAU,0BAA0B,yBACrC;YAED,kBAAC,OAAD,EACE,WAAW,EACT,uEACA,IAAU,kBAAkB,kBAC7B,EACD,CAAA;EACK,CAAA,CACL;IAOK,UAA6B;CACxC,IAAM,EAAE,kBAAe,GAAiB,EAClC,CAAC,GAAW,KAAgB,EAAgB,UAAU,EACtD,CAAC,GAAQ,KAAa,EAAS,GAAM,EACrC,CAAC,GAAO,KAAY,EAAS,GAAM,EAGnC,CAAC,GAAS,KAAc,EAA0B;EACtD,cAAc;EACd,aACE;EACF,UAAU;EACV,WAAW;EACX,WAAW;EACX,cAAc;EACd,iBAAiB;EAClB,CAAC,EAEI,CAAC,GAAS,KAAc,EAA0B;EACtD,OAAO;EACP,OAAO;EACP,SAAS;EACT,UAAU;EACV,WAAW;EACX,SAAS;EACT,UAAU;EACX,CAAC,EAEI,CAAC,GAAU,KAAe,EAA2B;EACzD,SAAS;EACT,MAAM;EACN,OAAO;EACP,SAAS;EACT,UAAU;EACV,WAAW;EACX,gBAAgB;EAChB,gBAAgB;EAChB,mBAAmB;EACpB,CAAC,EAEI,CAAC,GAAW,KAAgB,EAA4B;EAC5D,kBAAkB;EAClB,iBAAiB;EACjB,qBAAqB;EACrB,oBAAoB;EACrB,CAAC,EAEI,CAAC,GAAU,KAAe,EAAyB;EACvD,cACE;EACF,oBACE;EACF,eACE;EACF,gBACE;EACH,CAAC,EAEI,CAAC,GAAe,KAAoB,EAA+B;EACvE,eAAe;EACf,aAAa;EACb,cAAc;EACd,kBAAkB;EAClB,iBAAiB;EACjB,mBAAmB;EACnB,oBAAoB;EACpB,eAAe;EACf,oBAAoB;EACpB,iBAAiB;EAClB,CAAC,EAEI,CAAC,GAAa,KAAkB,EAA8B;EAClE,gBAAgB;EAChB,mBAAmB;EACnB,aAAa;EACb,WAAW;EACX,aAAa;EACd,CAAC,EAEI,UAAmB;AAEvB,EADA,EAAU,GAAK,EACf,iBAAiB;AAGf,GAFA,EAAU,GAAM,EAChB,EAAS,GAAK,EACd,iBAAiB,EAAS,GAAM,EAAE,IAAK;KACtC,IAAK;IAGJ,KAAiB,OAAkC,MACvD,GAAY,OAAO;EAAE,GAAG;GAAI,IAAQ;EAAO,EAAE,EACzC,KAAiB,OAAkC,MACvD,GAAY,OAAO;EAAE,GAAG;GAAI,IAAQ;EAAO,EAAE,EACzC,KAAkB,OAAmC,MACzD,GAAa,OAAO;EAClB,GAAG;GACF,IACC,MAAU,oBAAoB,MAAU,oBAAoB,MAAU,sBAClE,SAAS,EAAM,IAAI,IACnB;EACP,EAAE,EACC,KAAkB,OAAiC,MACvD,GAAa,OAAO;EAAE,GAAG;GAAI,IAAQ;EAAO,EAAE,EAC1C,KAAsB,OAAuC,MACjE,GAAkB,OAAO;EAAE,GAAG;GAAI,IAAQ;EAAO,EAAE,EAC/C,KAAqB,OAAsC,MAC/D,GAAgB,OAAO;EAAE,GAAG;GAAI,IAAQ;EAAO,EAAE;AAsWnD,QAFmB,EAAK,MAAM,MAAM,EAAE,OAAO,EAAU,EAAE,MAGvD,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;EACZ,SACE,kBAAC,UAAD;GACE,MAAK;GACL,SAAS;GACT,UAAU;GACV,WAAW,EACT,6FACA,IACI,4DACA,IACE,wDACA,iDACP;aAEA,IACC,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,OAAD,EAAK,WAAU,kFAAmF,CAAA,EAAA,YAEjG,EAAA,CAAA,GACD,IACF,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD,EAAc,WAAU,WAAY,CAAA,EAAA,SAEnC,EAAA,CAAA,GAEH,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD,EAAM,WAAU,WAAY,CAAA,EAAA,gBAE3B,EAAA,CAAA;GAEE,CAAA;YAGX,kBAAC,OAAD;GAAK,WAAU;aAAf;IAEE,kBAAC,OAAD;KAAK,WAAU;eACb,kBAAC,OAAD;MAAK,WAAU;gBACb,kBAAC,OAAD;OAAK,WAAU;iBACZ,EAAK,KAAK,MAAQ;QACjB,IAAM,IAAO,EAAI;AACjB,eACE,kBAAC,UAAD;SAEE,MAAK;SACL,eAAe,EAAa,EAAI,GAAG;SACnC,WAAW,EACT,+FACA,MAAc,EAAI,KACd,gCACA,yCACL;mBATH,CAWE,kBAAC,GAAD,EAAM,WAAU,WAAY,CAAA,EAC5B,kBAAC,QAAD;UAAM,WAAU;oBAAoB,EAAI;UAAa,CAAA,CAC9C;WAZF,EAAI,GAYF;SAEX;OACE,CAAA;MACF,CAAA;KACF,CAAA;IAGN,kBAAC,OAAD;KAAK,WAAU;eACb,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,OAAD;OAAK,WAAU;iBACb,kBAAC,MAAD;QAAI,WAAU;kBAA0C;QAAa,CAAA;OACjE,CAAA,EACN,kBAAC,OAAD;OAAK,WAAU;iBACZ,EAAK,KAAK,MAAQ;QACjB,IAAM,IAAO,EAAI;AACjB,eACE,kBAAC,UAAD;SAEE,MAAK;SACL,eAAe,EAAa,EAAI,GAAG;SACnC,WAAW,EACT,gGACA,MAAc,EAAI,KACd,4CACA,iEACL;mBATH,CAWE,kBAAC,GAAD,EAAM,WAAU,WAAY,CAAA,EAC3B,EAAI,MACE;WAZF,EAAI,GAYF;SAEX;OACE,CAAA,CACF;;KACF,CAAA;IAGN,kBAAC,OAAD;KAAK,WAAU;eACb,kBAAC,OAAD;MAAK,WAAU;gBAAf;OACG,MAAc,aAncvB,kBAAC,OAAD;QAAK,WAAU;kBAAf;SACE,kBAAC,GAAD;UACE,OAAM;UACN,OAAO,EAAQ;UACf,UAAU,EAAc,eAAe;UACvC,CAAA;SACF,kBAAC,GAAD;UACE,OAAM;UACN,OAAO,EAAQ;UACf,UAAU,EAAc,cAAc;UACtC,MAAK;UACL,CAAA;SACF,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,GAAD;WACE,OAAM;WACN,OAAO,EAAQ;WACf,UAAU,EAAc,WAAW;WACnC,MAAK;WACL,SAAS;WACT,CAAA,EACF,kBAAC,GAAD;WACE,OAAM;WACN,OAAO,EAAQ;WACf,UAAU,EAAc,kBAAkB;WAC1C,CAAA,CACE;;SACN,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,GAAD,EAAa,WAAU,4CAA6C,CAAA,EACpE,kBAAC,KAAD;WAAG,WAAU;qBAA2B;WAGpC,CAAA,CACA;;SACN,kBAAC,OAAD;UAAK,WAAU;oBAAf;WACE,kBAAC,GAAD;YACE,OAAM;YACN,OAAO,EAAQ;YACf,UAAU,EAAc,YAAY;YACpC,MAAK;YACL,CAAA;WACF,kBAAC,GAAD;YACE,OAAM;YACN,OAAO,EAAQ;YACf,UAAU,EAAc,YAAY;YACpC,MAAK;YACL,CAAA;WACF,kBAAC,GAAD;YACE,OAAM;YACN,OAAO,EAAQ;YACf,UAAU,EAAc,eAAe;YACvC,MAAK;YACL,CAAA;WACE;;SACF;;OA+YG,MAAc,aA3YvB,kBAAC,OAAD;QAAK,WAAU;kBAAf;SACE,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,GAAD;WACE,OAAM;WACN,OAAO,EAAQ;WACf,UAAU,EAAc,QAAQ;WAChC,MAAK;WACL,CAAA,EACF,kBAAC,GAAD;WACE,OAAM;WACN,OAAO,EAAQ;WACf,UAAU,EAAc,QAAQ;WAChC,MAAK;WACL,CAAA,CACE;;SACN,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,GAAD;WACE,OAAM;WACN,OAAO,EAAQ;WACf,UAAU,EAAc,UAAU;WAClC,MAAK;WACL,aAAY;WACZ,CAAA,EACF,kBAAC,GAAD;WACE,OAAM;WACN,OAAO,EAAQ;WACf,UAAU,EAAc,WAAW;WACnC,MAAK;WACL,CAAA,CACE;;SACN,kBAAC,MAAD;UAAI,WAAU;oBAA+C;UAAiB,CAAA;SAC9E,kBAAC,OAAD;UAAK,WAAU;oBAAf;WACE,kBAAC,GAAD;YACE,OAAM;YACN,OAAO,EAAQ;YACf,UAAU,EAAc,YAAY;YACpC,aAAY;YACZ,CAAA;WACF,kBAAC,GAAD;YACE,OAAM;YACN,OAAO,EAAQ;YACf,UAAU,EAAc,UAAU;YAClC,aAAY;YACZ,CAAA;WACF,kBAAC,GAAD;YACE,OAAM;YACN,OAAO,EAAQ;YACf,UAAU,EAAc,WAAW;YACnC,aAAY;YACZ,CAAA;WACE;;SACF;;OAyVG,MAAc,cArVvB,kBAAC,OAAD;QAAK,WAAU;kBAAf;SACE,kBAAC,GAAD;UACE,OAAM;UACN,OAAO,EAAS;UAChB,UAAU,EAAe,UAAU;UACnC,MAAK;UACL,MAAM;UACN,CAAA;SACF,kBAAC,OAAD;UAAK,WAAU;oBAAf;WACE,kBAAC,GAAD;YAAW,OAAM;YAAO,OAAO,EAAS;YAAM,UAAU,EAAe,OAAO;YAAI,CAAA;WAClF,kBAAC,GAAD;YAAW,OAAM;YAAQ,OAAO,EAAS;YAAO,UAAU,EAAe,QAAQ;YAAI,CAAA;WACrF,kBAAC,GAAD;YAAW,OAAM;YAAU,OAAO,EAAS;YAAS,UAAU,EAAe,UAAU;YAAI,CAAA;WACvF;;SACN,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,GAAD;WACE,OAAM;WACN,OAAO,EAAS;WAChB,UAAU,EAAe,WAAW;WACpC,MAAK;WACL,CAAA,EACF,kBAAC,GAAD;WACE,OAAM;WACN,OAAO,EAAS;WAChB,UAAU,EAAe,YAAY;WACrC,MAAK;WACL,CAAA,CACE;;SACN,kBAAC,MAAD;UAAI,WAAU;oBAA+C;UAAsB,CAAA;SACnF,kBAAC,OAAD;UAAK,WAAU;oBAAf;WACE,kBAAC,GAAD;YACE,OAAM;YACN,OAAO,EAAS;YAChB,UAAU,EAAe,iBAAiB;YAC1C,MAAK;YACL,CAAA;WACF,kBAAC,GAAD;YACE,OAAM;YACN,OAAO,EAAS;YAChB,UAAU,EAAe,iBAAiB;YAC1C,MAAK;YACL,CAAA;WACF,kBAAC,GAAD;YACE,OAAM;YACN,OAAO,EAAS;YAChB,UAAU,EAAe,oBAAoB;YAC7C,MAAK;YACL,CAAA;WACE;;SACF;;OAsSG,MAAc,eAlSvB,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,GAAD;SACE,OAAM;SACN,aAAY;SACZ,SAAS,EAAU;SACnB,WAAW,MAAM,GAAc,OAAO;UAAE,GAAG;UAAG,kBAAkB;UAAG,EAAE;SACrE,CAAA,EACF,kBAAC,OAAD;SAAK,WAAU;mBAAf;UACE,kBAAC,GAAD;WACE,OAAM;WACN,OAAO,EAAU;WACjB,WAAW,MAAM,GAAc,OAAO;YAAE,GAAG;YAAG,iBAAiB,SAAS,EAAE,IAAI;YAAG,EAAE;WACnF,MAAK;WACL,CAAA;UACF,kBAAC,GAAD;WACE,OAAM;WACN,OAAO,EAAU;WACjB,WAAW,MAAM,GAAc,OAAO;YAAE,GAAG;YAAG,qBAAqB,SAAS,EAAE,IAAI;YAAG,EAAE;WACvF,MAAK;WACL,CAAA;UACF,kBAAC,GAAD;WACE,OAAM;WACN,OAAO,EAAU;WACjB,WAAW,MAAM,GAAc,OAAO;YAAE,GAAG;YAAG,oBAAoB,SAAS,EAAE,IAAI;YAAG,EAAE;WACtF,MAAK;WACL,CAAA;UACE;WACF;;OAwQG,MAAc,cApQvB,kBAAC,OAAD;QAAK,WAAU;kBAAf;SACE,kBAAC,GAAD;UACE,OAAM;UACN,OAAO,EAAS;UAChB,UAAU,EAAe,eAAe;UACxC,MAAK;UACL,MAAM;UACN,CAAA;SACF,kBAAC,GAAD;UACE,OAAM;UACN,OAAO,EAAS;UAChB,UAAU,EAAe,qBAAqB;UAC9C,MAAK;UACL,MAAM;UACN,CAAA;SACF,kBAAC,GAAD;UACE,OAAM;UACN,OAAO,EAAS;UAChB,UAAU,EAAe,gBAAgB;UACzC,MAAK;UACL,MAAM;UACN,CAAA;SACF,kBAAC,GAAD;UACE,OAAM;UACN,OAAO,EAAS;UAChB,UAAU,EAAe,iBAAiB;UAC1C,MAAK;UACL,MAAM;UACN,CAAA;SACE;;OAwOG,MAAc,mBApOvB,kBAAC,OAAD;QAAK,WAAU;kBAAf;SACE,kBAAC,MAAD;UAAI,WAAU;oBAA+C;UAAe,CAAA;SAC5E,kBAAC,GAAD;UACE,OAAM;UACN,aAAY;UACZ,SAAS,EAAc;UACvB,UAAU,EAAmB,gBAAgB;UAC7C,CAAA;SACF,kBAAC,GAAD;UACE,OAAM;UACN,aAAY;UACZ,SAAS,EAAc;UACvB,UAAU,EAAmB,cAAc;UAC3C,CAAA;SACF,kBAAC,GAAD;UACE,OAAM;UACN,aAAY;UACZ,SAAS,EAAc;UACvB,UAAU,EAAmB,eAAe;UAC5C,CAAA;SACF,kBAAC,MAAD;UAAI,WAAU;oBAAoD;UAAkB,CAAA;SACpF,kBAAC,GAAD;UACE,OAAM;UACN,aAAY;UACZ,SAAS,EAAc;UACvB,UAAU,EAAmB,mBAAmB;UAChD,CAAA;SACF,kBAAC,GAAD;UACE,OAAM;UACN,aAAY;UACZ,SAAS,EAAc;UACvB,UAAU,EAAmB,kBAAkB;UAC/C,CAAA;SACF,kBAAC,MAAD;UAAI,WAAU;oBAAoD;UAAqB,CAAA;SACvF,kBAAC,GAAD;UACE,OAAM;UACN,aAAY;UACZ,SAAS,EAAc;UACvB,UAAU,EAAmB,oBAAoB;UACjD,CAAA;SACF,kBAAC,GAAD;UACE,OAAM;UACN,aAAY;UACZ,SAAS,EAAc;UACvB,UAAU,EAAmB,qBAAqB;UAClD,CAAA;SACF,kBAAC,GAAD;UACE,OAAM;UACN,aAAY;UACZ,SAAS,EAAc;UACvB,UAAU,EAAmB,gBAAgB;UAC7C,CAAA;SACF,kBAAC,GAAD;UACE,OAAM;UACN,aAAY;UACZ,SAAS,EAAc;UACvB,UAAU,EAAmB,qBAAqB;UAClD,CAAA;SACF,kBAAC,GAAD;UACE,OAAM;UACN,aAAY;UACZ,SAAS,EAAc;UACvB,UAAU,EAAmB,kBAAkB;UAC/C,CAAA;SACE;;OAqKG,MAAc,iBAjKvB,kBAAC,OAAD;QAAK,WAAU;kBAAf;SACE,kBAAC,MAAD;UAAI,WAAU;oBAA0C;UAAoB,CAAA;SAC5E,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;WAAO,WAAU;qBAAqD;WAAgB,CAAA,EACtF,kBAAC,UAAD;WACE,OAAO,EAAY;WACnB,WAAW,MAAM,EAAkB,iBAAiB,CAAC,EAAE,OAAO,MAAM;WACpE,WAAU;qBAHZ;YAKE,kBAAC,UAAD;aAAQ,OAAM;uBAAW;aAAiB,CAAA;YAC1C,kBAAC,UAAD;aAAQ,OAAM;uBAAQ;aAAc,CAAA;YACpC,kBAAC,UAAD;aAAQ,OAAM;uBAAS;aAAe,CAAA;YACtC,kBAAC,UAAD;aAAQ,OAAM;uBAAU;aAAgB,CAAA;YACjC;aACL,EAAA,CAAA,EACN,kBAAC,GAAD;WACE,OAAM;WACN,OAAO,EAAY;WACnB,UAAU,EAAkB,oBAAoB;WAChD,aAAY;WACZ,MAAK;WACL,CAAA,CACE;;SACN,kBAAC,MAAD;UAAI,WAAU;oBAA+C;UAAiB,CAAA;SAC9E,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;WAAO,WAAU;qBAAqD;WAAgB,CAAA,EACtF,kBAAC,UAAD;WACE,OAAO,EAAY;WACnB,WAAW,MAAM,EAAkB,cAAc,CAAC,EAAE,OAAO,MAAM;WACjE,WAAU;qBAHZ;YAKE,kBAAC,UAAD;aAAQ,OAAM;uBAAS;aAAe,CAAA;YACtC,kBAAC,UAAD;aAAQ,OAAM;uBAAQ;aAAc,CAAA;YACpC,kBAAC,UAAD;aAAQ,OAAM;uBAAY;aAAkB,CAAA;YACrC;aACL,EAAA,CAAA,EACN,kBAAC,GAAD;WACE,OAAM;WACN,OAAO,EAAY;WACnB,UAAU,EAAkB,YAAY;WACxC,aAAY;WACZ,CAAA,CACE;;SACN,kBAAC,MAAD;UAAI,WAAU;oBAA+C;UAAc,CAAA;SAC3E,kBAAC,GAAD;UACE,OAAM;UACN,OAAO,EAAY;UACnB,UAAU,EAAkB,cAAc;UAC1C,aAAY;UACZ,CAAA;SACE;;OAgHE,kBAAC,OAAD;QAAK,WAAU;kBACb,kBAAC,UAAD;SACE,MAAK;SACL,SAAS;SACT,UAAU;SACV,WAAW,EACT,6FACA,IACI,4DACA,IACE,wDACA,iDACP;mBAEA,IACC,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,OAAD,EAAK,WAAU,kFAAmF,CAAA,EAAA,YAEjG,EAAA,CAAA,GACD,IACF,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD,EAAc,WAAU,WAAY,CAAA,EAAA,SAEnC,EAAA,CAAA,GAEH,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD,EAAM,WAAU,WAAY,CAAA,EAAA,gBAE3B,EAAA,CAAA;SAEE,CAAA;QACL,CAAA;OACF;;KACF,CAAA;IACF;;EACK,CAAA"}
|
|
1
|
+
{"version":3,"file":"BusinessSettingsPage.js","names":[],"sources":["../../../../src/adaptercloud/pages/cart-owner/BusinessSettingsPage.tsx"],"sourcesContent":["/**\n * Business Settings Page\n *\n * Tabbed interface (general/contact/location/operating/policies/notifications/integrations),\n * all form fields per tab including social media, coordinates, delivery charges,\n * payment methods, policy textareas, notification toggles, payment gateway config.\n *\n * @module adaptercloud/pages/cart-owner\n */\n\nimport { useState } from'react';\nimport {\n Store,\n FileText,\n CreditCard,\n Building2,\n Save,\n AlertCircle,\n MapPin,\n Clock,\n Shield,\n Bell,\n Link2,\n CheckCircle2,\n Globe,\n Phone,\n Mail,\n Instagram,\n Twitter,\n} from'lucide-react';\nimport { EmphasisPanel } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from'../../components/PageLayout';\nimport { useAdapterCloud } from'../../context/AdapterCloudContext';\nimport { cn } from'../../utils/cn';\n\n// ============================================================================\n// Types\n// ============================================================================\n\ntype TabId =\n | 'general'\n | 'contact'\n | 'location'\n | 'operating'\n | 'policies'\n | 'notifications'\n | 'integration';\n\ninterface Tab {\n id: TabId;\n label: string;\n icon: typeof Store;\n}\n\ninterface GeneralSettings {\n businessName: string;\n description: string;\n category: string;\n gstNumber: string;\n panNumber: string;\n fssaiLicense: string;\n establishedYear: string;\n}\n\ninterface ContactSettings {\n phone: string;\n email: string;\n website: string;\n whatsapp: string;\n instagram: string;\n twitter: string;\n facebook: string;\n}\n\ninterface LocationSettings {\n address: string;\n city: string;\n state: string;\n pincode: string;\n latitude: string;\n longitude: string;\n deliveryRadius: number;\n deliveryCharge: number;\n freeDeliveryAbove: number;\n}\n\ninterface OperatingSettings {\n autoAcceptOrders: boolean;\n preparationTime: number;\n maxConcurrentOrders: number;\n advanceBookingDays: number;\n}\n\ninterface PolicySettings {\n returnPolicy: string;\n cancellationPolicy: string;\n privacyPolicy: string;\n termsOfService: string;\n}\n\ninterface NotificationSettings {\n newOrderEmail: boolean;\n newOrderSms: boolean;\n newOrderPush: boolean;\n orderUpdateEmail: boolean;\n orderUpdatePush: boolean;\n dailySummaryEmail: boolean;\n weeklySummaryEmail: boolean;\n lowStockAlert: boolean;\n reviewNotification: boolean;\n marketingEmails: boolean;\n}\n\ninterface IntegrationSettings {\n paymentGateway: string;\n paymentGatewayKey: string;\n smsProvider: string;\n smsApiKey: string;\n analyticsId: string;\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst tabs: Tab[] = [\n { id: 'general', label: 'General', icon: Store },\n { id: 'contact', label: 'Contact', icon: Phone },\n { id: 'location', label: 'Location', icon: MapPin },\n { id: 'operating', label: 'Operating', icon: Clock },\n { id: 'policies', label: 'Policies', icon: Shield },\n { id: 'notifications', label: 'Notifications', icon: Bell },\n { id: 'integration', label: 'Integrations', icon: Link2 },\n];\n\nconst categories = [\n 'Food & Beverage',\n 'Personal Care & Beauty',\n 'Repair & Maintenance',\n 'Home Services',\n 'Clothing & Fashion',\n 'Health & Wellness',\n 'Education & Skills',\n 'Retail & Merchandise',\n 'Grocery & Essentials',\n];\n\n// ============================================================================\n// Form Field Component\n// ============================================================================\n\ninterface FormFieldProps {\n label: string;\n value: string | number;\n onChange: (value: string) => void;\n type?: 'text' | 'email' | 'tel' | 'url' | 'number' | 'textarea' | 'select';\n options?: string[];\n placeholder?: string;\n hint?: string;\n rows?: number;\n}\n\nconst FormField = ({\n label,\n value,\n onChange,\n type = 'text',\n options,\n placeholder,\n hint,\n rows = 3,\n}: FormFieldProps) => {\n const id = label.toLowerCase().replace(/\\s+/g, '-');\n return (\n <div>\n <label htmlFor={id} className=\"block text-sm font-medium text-text-primary mb-1.5\">\n {label}\n </label>\n {type === 'textarea' ? (\n <textarea\n id={id}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n rows={rows}\n placeholder={placeholder}\n className=\"w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)] resize-none\"\n />\n ) : type === 'select' ? (\n <select\n id={id}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n className=\"w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n >\n {options?.map((opt) => (\n <option key={opt} value={opt}>\n {opt}\n </option>\n ))}\n </select>\n ) : (\n <input\n id={id}\n type={type}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n placeholder={placeholder}\n className=\"w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n />\n )}\n {hint && <p className=\"mt-1 text-xs text-text-secondary\">{hint}</p>}\n </div>\n );\n};\n\n// ============================================================================\n// Toggle Component\n// ============================================================================\n\nconst Toggle = ({\n label,\n description,\n checked,\n onChange,\n}: {\n label: string;\n description?: string;\n checked: boolean;\n onChange: (v: boolean) => void;\n}) => (\n <div className=\"flex items-center justify-between py-3\">\n <div>\n <p className=\"text-sm font-medium text-text-primary\">{label}</p>\n {description && <p className=\"text-xs text-text-secondary mt-0.5\">{description}</p>}\n </div>\n <button\n type=\"button\"\n onClick={() => onChange(!checked)}\n className={cn(\n 'h-6 w-11 rounded-full transition-colors relative',\n checked ? 'bg-accent-blue-subtle' : 'bg-muted-foreground/30'\n )}\n >\n <div\n className={cn(\n 'absolute top-0.5 h-5 w-5 rounded-full bg-white transition-transform',\n checked ? 'translate-x-5' : 'translate-x-0.5'\n )}\n />\n </button>\n </div>\n);\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport const BusinessSettingsPage = () => {\n const { navigateTo } = useAdapterCloud();\n const [activeTab, setActiveTab] = useState<TabId>('general');\n const [saving, setSaving] = useState(false);\n const [saved, setSaved] = useState(false);\n\n // Form state\n const [general, setGeneral] = useState<GeneralSettings>({\n businessName: 'Dosa Express',\n description:\n 'Authentic South Indian street food with a modern twist. Serving crispy dosas, filter coffee, and more since 2020.',\n category: 'Food & Beverage',\n gstNumber: '29ABCDE1234F1Z5',\n panNumber: 'ABCDE1234F',\n fssaiLicense: '12345678',\n establishedYear: '2020',\n });\n\n const [contact, setContact] = useState<ContactSettings>({\n phone: '+91-9876543210',\n email: 'ravi@dosaexpress.in',\n website: 'https://dosaexpress.in',\n whatsapp: '+91-9876543210',\n instagram: '@dosaexpress',\n twitter: '@dosaexpress',\n facebook: 'dosaexpress',\n });\n\n const [location, setLocation] = useState<LocationSettings>({\n address: 'Koramangala 5th Block',\n city: 'Bangalore',\n state: 'Karnataka',\n pincode: '560034',\n latitude: '12.9352',\n longitude: '77.6245',\n deliveryRadius: 5,\n deliveryCharge: 30,\n freeDeliveryAbove: 300,\n });\n\n const [operating, setOperating] = useState<OperatingSettings>({\n autoAcceptOrders: true,\n preparationTime: 15,\n maxConcurrentOrders: 10,\n advanceBookingDays: 3,\n });\n\n const [policies, setPolicies] = useState<PolicySettings>({\n returnPolicy:\n 'Items can be returned within 30 minutes of delivery if there are quality issues. Refund will be processed within 2-3 business days.',\n cancellationPolicy:\n 'Orders can be cancelled within 2 minutes of placing. After preparation starts, cancellation is not allowed.',\n privacyPolicy:\n 'We collect and process your data in accordance with applicable privacy laws. Your data is never shared with third parties without consent.',\n termsOfService:\n 'By using our services, you agree to our terms. All prices are inclusive of taxes unless stated otherwise.',\n });\n\n const [notifications, setNotifications] = useState<NotificationSettings>({\n newOrderEmail: true,\n newOrderSms: true,\n newOrderPush: true,\n orderUpdateEmail: true,\n orderUpdatePush: true,\n dailySummaryEmail: true,\n weeklySummaryEmail: false,\n lowStockAlert: true,\n reviewNotification: true,\n marketingEmails: false,\n });\n\n const [integration, setIntegration] = useState<IntegrationSettings>({\n paymentGateway: 'razorpay',\n paymentGatewayKey: 'rzp_live_xxxxxxxx',\n smsProvider: 'twilio',\n smsApiKey: '',\n analyticsId: '',\n });\n\n const handleSave = () => {\n setSaving(true);\n setTimeout(() => {\n setSaving(false);\n setSaved(true);\n setTimeout(() => setSaved(false), 3000);\n }, 1000);\n };\n\n const updateGeneral = (field: keyof GeneralSettings) => (value: string) =>\n setGeneral((p) => ({ ...p, [field]: value }));\n const updateContact = (field: keyof ContactSettings) => (value: string) =>\n setContact((p) => ({ ...p, [field]: value }));\n const updateLocation = (field: keyof LocationSettings) => (value: string) =>\n setLocation((p) => ({\n ...p,\n [field]:\n field === 'deliveryRadius' || field === 'deliveryCharge' || field === 'freeDeliveryAbove'\n ? parseInt(value) || 0\n : value,\n }));\n const updatePolicies = (field: keyof PolicySettings) => (value: string) =>\n setPolicies((p) => ({ ...p, [field]: value }));\n const updateNotification = (field: keyof NotificationSettings) => (value: boolean) =>\n setNotifications((p) => ({ ...p, [field]: value }));\n const updateIntegration = (field: keyof IntegrationSettings) => (value: string) =>\n setIntegration((p) => ({ ...p, [field]: value }));\n\n // ---- Tab content renderers ----\n\n const renderGeneralTab = () => (\n <div className=\"space-y-5\">\n <FormField\n label=\"Business Name\"\n value={general.businessName}\n onChange={updateGeneral('businessName')}\n />\n <FormField\n label=\"Description\"\n value={general.description}\n onChange={updateGeneral('description')}\n type=\"textarea\"\n />\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-5\">\n <FormField\n label=\"Category\"\n value={general.category}\n onChange={updateGeneral('category')}\n type=\"select\"\n options={categories}\n />\n <FormField\n label=\"Established Year\"\n value={general.establishedYear}\n onChange={updateGeneral('establishedYear')}\n />\n </div>\n <div className=\"flex items-start gap-3 rounded-md bg-accent-blue-subtle/5 border border-accent-blue-subtle/20 p-3\">\n <AlertCircle className=\"h-4 w-4 text-accent-blue shrink-0 mt-0.5\" />\n <p className=\"text-xs text-accent-blue\">\n GST, PAN, and FSSAI details are used for invoicing and compliance. Changes require\n verification.\n </p>\n </div>\n <div className=\"grid grid-cols-1 sm:grid-cols-3 gap-5\">\n <FormField\n label=\"GST Number\"\n value={general.gstNumber}\n onChange={updateGeneral('gstNumber')}\n hint=\"15-digit GST ID\"\n />\n <FormField\n label=\"PAN Number\"\n value={general.panNumber}\n onChange={updateGeneral('panNumber')}\n hint=\"10-digit PAN\"\n />\n <FormField\n label=\"FSSAI License\"\n value={general.fssaiLicense}\n onChange={updateGeneral('fssaiLicense')}\n hint=\"FSSAI license number\"\n />\n </div>\n </div>\n );\n\n const renderContactTab = () => (\n <div className=\"space-y-5\">\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-5\">\n <FormField\n label=\"Phone\"\n value={contact.phone}\n onChange={updateContact('phone')}\n type=\"tel\"\n />\n <FormField\n label=\"Email\"\n value={contact.email}\n onChange={updateContact('email')}\n type=\"email\"\n />\n </div>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-5\">\n <FormField\n label=\"Website\"\n value={contact.website}\n onChange={updateContact('website')}\n type=\"url\"\n placeholder=\"https://\"\n />\n <FormField\n label=\"WhatsApp\"\n value={contact.whatsapp}\n onChange={updateContact('whatsapp')}\n type=\"tel\"\n />\n </div>\n <h3 className=\"text-sm font-semibold text-text-primary pt-2\">Social Media</h3>\n <div className=\"grid grid-cols-1 sm:grid-cols-3 gap-5\">\n <FormField\n label=\"Instagram\"\n value={contact.instagram}\n onChange={updateContact('instagram')}\n placeholder=\"@handle\"\n />\n <FormField\n label=\"Twitter / X\"\n value={contact.twitter}\n onChange={updateContact('twitter')}\n placeholder=\"@handle\"\n />\n <FormField\n label=\"Facebook\"\n value={contact.facebook}\n onChange={updateContact('facebook')}\n placeholder=\"Page name\"\n />\n </div>\n </div>\n );\n\n const renderLocationTab = () => (\n <div className=\"space-y-5\">\n <FormField\n label=\"Address\"\n value={location.address}\n onChange={updateLocation('address')}\n type=\"textarea\"\n rows={2}\n />\n <div className=\"grid grid-cols-1 sm:grid-cols-3 gap-5\">\n <FormField label=\"City\" value={location.city} onChange={updateLocation('city')} />\n <FormField label=\"State\" value={location.state} onChange={updateLocation('state')} />\n <FormField label=\"Pincode\" value={location.pincode} onChange={updateLocation('pincode')} />\n </div>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-5\">\n <FormField\n label=\"Latitude\"\n value={location.latitude}\n onChange={updateLocation('latitude')}\n hint=\"e.g., 12.9352\"\n />\n <FormField\n label=\"Longitude\"\n value={location.longitude}\n onChange={updateLocation('longitude')}\n hint=\"e.g., 77.6245\"\n />\n </div>\n <h3 className=\"text-sm font-semibold text-text-primary pt-2\">Delivery Settings</h3>\n <div className=\"grid grid-cols-1 sm:grid-cols-3 gap-5\">\n <FormField\n label=\"Delivery Radius (km)\"\n value={location.deliveryRadius}\n onChange={updateLocation('deliveryRadius')}\n type=\"number\"\n />\n <FormField\n label=\"Delivery Charge (₹)\"\n value={location.deliveryCharge}\n onChange={updateLocation('deliveryCharge')}\n type=\"number\"\n />\n <FormField\n label=\"Free Delivery Above (₹)\"\n value={location.freeDeliveryAbove}\n onChange={updateLocation('freeDeliveryAbove')}\n type=\"number\"\n />\n </div>\n </div>\n );\n\n const renderOperatingTab = () => (\n <div className=\"space-y-5\">\n <Toggle\n label=\"Auto-Accept Orders\"\n description=\"Automatically accept incoming orders without manual confirmation\"\n checked={operating.autoAcceptOrders}\n onChange={(v) => setOperating((p) => ({ ...p, autoAcceptOrders: v }))}\n />\n <div className=\"grid grid-cols-1 sm:grid-cols-3 gap-5\">\n <FormField\n label=\"Default Preparation Time (min)\"\n value={operating.preparationTime}\n onChange={(v) => setOperating((p) => ({ ...p, preparationTime: parseInt(v) || 0 }))}\n type=\"number\"\n />\n <FormField\n label=\"Max Concurrent Orders\"\n value={operating.maxConcurrentOrders}\n onChange={(v) => setOperating((p) => ({ ...p, maxConcurrentOrders: parseInt(v) || 0 }))}\n type=\"number\"\n />\n <FormField\n label=\"Advance Booking (days)\"\n value={operating.advanceBookingDays}\n onChange={(v) => setOperating((p) => ({ ...p, advanceBookingDays: parseInt(v) || 0 }))}\n type=\"number\"\n />\n </div>\n </div>\n );\n\n const renderPoliciesTab = () => (\n <div className=\"space-y-5\">\n <FormField\n label=\"Return Policy\"\n value={policies.returnPolicy}\n onChange={updatePolicies('returnPolicy')}\n type=\"textarea\"\n rows={4}\n />\n <FormField\n label=\"Cancellation Policy\"\n value={policies.cancellationPolicy}\n onChange={updatePolicies('cancellationPolicy')}\n type=\"textarea\"\n rows={4}\n />\n <FormField\n label=\"Privacy Policy\"\n value={policies.privacyPolicy}\n onChange={updatePolicies('privacyPolicy')}\n type=\"textarea\"\n rows={4}\n />\n <FormField\n label=\"Terms of Service\"\n value={policies.termsOfService}\n onChange={updatePolicies('termsOfService')}\n type=\"textarea\"\n rows={4}\n />\n </div>\n );\n\n const renderNotificationsTab = () => (\n <div className=\"space-y-1 divide-y divide-border\">\n <h3 className=\"text-sm font-semibold text-text-primary pb-2\">New Orders</h3>\n <Toggle\n label=\"Email Notification\"\n description=\"Receive email for new orders\"\n checked={notifications.newOrderEmail}\n onChange={updateNotification('newOrderEmail')}\n />\n <Toggle\n label=\"SMS Notification\"\n description=\"Receive SMS for new orders\"\n checked={notifications.newOrderSms}\n onChange={updateNotification('newOrderSms')}\n />\n <Toggle\n label=\"Push Notification\"\n description=\"Receive push notifications for new orders\"\n checked={notifications.newOrderPush}\n onChange={updateNotification('newOrderPush')}\n />\n <h3 className=\"text-sm font-semibold text-text-primary pt-4 pb-2\">Order Updates</h3>\n <Toggle\n label=\"Email Updates\"\n description=\"Get email when order status changes\"\n checked={notifications.orderUpdateEmail}\n onChange={updateNotification('orderUpdateEmail')}\n />\n <Toggle\n label=\"Push Updates\"\n description=\"Get push notifications for order updates\"\n checked={notifications.orderUpdatePush}\n onChange={updateNotification('orderUpdatePush')}\n />\n <h3 className=\"text-sm font-semibold text-text-primary pt-4 pb-2\">Reports & Alerts</h3>\n <Toggle\n label=\"Daily Summary\"\n description=\"Receive daily business summary email\"\n checked={notifications.dailySummaryEmail}\n onChange={updateNotification('dailySummaryEmail')}\n />\n <Toggle\n label=\"Weekly Summary\"\n description=\"Receive weekly performance report\"\n checked={notifications.weeklySummaryEmail}\n onChange={updateNotification('weeklySummaryEmail')}\n />\n <Toggle\n label=\"Low Stock Alert\"\n description=\"Get alerted when items are low on stock\"\n checked={notifications.lowStockAlert}\n onChange={updateNotification('lowStockAlert')}\n />\n <Toggle\n label=\"Review Notifications\"\n description=\"Get notified for new customer reviews\"\n checked={notifications.reviewNotification}\n onChange={updateNotification('reviewNotification')}\n />\n <Toggle\n label=\"Marketing Emails\"\n description=\"Receive tips and promotional content\"\n checked={notifications.marketingEmails}\n onChange={updateNotification('marketingEmails')}\n />\n </div>\n );\n\n const renderIntegrationTab = () => (\n <div className=\"space-y-5\">\n <h3 className=\"text-sm font-semibold text-text-primary\">Payment Gateway</h3>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-5\">\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">Provider</label>\n <select\n value={integration.paymentGateway}\n onChange={(e) => updateIntegration('paymentGateway')(e.target.value)}\n className=\"w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n >\n <option value=\"razorpay\">Razorpay</option>\n <option value=\"paytm\">Paytm</option>\n <option value=\"stripe\">Stripe</option>\n <option value=\"phonepe\">PhonePe</option>\n </select>\n </div>\n <FormField\n label=\"API Key\"\n value={integration.paymentGatewayKey}\n onChange={updateIntegration('paymentGatewayKey')}\n placeholder=\"Enter API key\"\n hint=\"Keep this secret\"\n />\n </div>\n <h3 className=\"text-sm font-semibold text-text-primary pt-2\">SMS Provider</h3>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-5\">\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">Provider</label>\n <select\n value={integration.smsProvider}\n onChange={(e) => updateIntegration('smsProvider')(e.target.value)}\n className=\"w-full rounded-md border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary\"\n >\n <option value=\"twilio\">Twilio</option>\n <option value=\"msg91\">MSG91</option>\n <option value=\"textlocal\">Textlocal</option>\n </select>\n </div>\n <FormField\n label=\"SMS API Key\"\n value={integration.smsApiKey}\n onChange={updateIntegration('smsApiKey')}\n placeholder=\"Enter SMS API key\"\n />\n </div>\n <h3 className=\"text-sm font-semibold text-text-primary pt-2\">Analytics</h3>\n <FormField\n label=\"Google Analytics ID\"\n value={integration.analyticsId}\n onChange={updateIntegration('analyticsId')}\n placeholder=\"GA-XXXXXXXXX\"\n />\n </div>\n );\n\n const ActiveIcon = tabs.find((t) => t.id === activeTab)?.icon || Store;\n\n return (\n <PageLayout\n title=\"Business Settings\"\n description=\"Manage your business profile and configuration\"\n purpose=\"Control how your cart works behind the scenes — business details, operating preferences, payment and payout setup, and whether orders are accepted automatically. Get these right once and your day-to-day runs on autopilot.\"\n actions={\n <button\n type=\"button\"\n onClick={handleSave}\n disabled={saving}\n className={cn(\n 'inline-flex items-center gap-2 rounded-md px-4 py-2 text-sm font-medium transition-colors',\n saved\n ? 'bg-status-success-bg-subtle/10 text-status-success-text'\n : saving\n ? 'bg-bg-sunken text-text-secondary cursor-not-allowed'\n : 'bg-accent text-text-primary hover:bg-accent/80'\n )}\n >\n {saving ? (\n <>\n <div className=\"h-4 w-4 animate-spin rounded-full border-2 border-current border-t-transparent\" />\n Saving...\n </>\n ) : saved ? (\n <>\n <CheckCircle2 className=\"h-4 w-4\" />\n Saved!\n </>\n ) : (\n <>\n <Save className=\"h-4 w-4\" />\n Save Settings\n </>\n )}\n </button>\n }\n >\n {/* Setup callout (emphasis zone) */}\n <EmphasisPanel className=\"mb-6 flex items-start gap-3 p-4\">\n <Store className=\"h-5 w-5 shrink-0 text-text-secondary\" aria-hidden=\"true\" />\n <div>\n <h2 className=\"text-sm font-semibold text-text-primary\">Set this up once, run on autopilot</h2>\n <p className=\"mt-0.5 text-sm text-text-secondary\">\n Your business details, payment and payout setup, and order preferences live across these\n tabs. Getting them right means smoother orders and faster payouts every day.\n </p>\n </div>\n </EmphasisPanel>\n\n <div className=\"flex flex-col lg:flex-row gap-6\">\n {/* Mobile Tab Navigation */}\n <div className=\"lg:hidden\">\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-3 shadow-sm\">\n <div className=\"grid grid-cols-4 gap-2\">\n {tabs.map((tab) => {\n const Icon = tab.icon;\n return (\n <button\n key={tab.id}\n type=\"button\"\n onClick={() => setActiveTab(tab.id)}\n className={cn(\n 'flex flex-col items-center gap-1 rounded-md px-2 py-2 text-xs font-medium transition-colors',\n activeTab === tab.id\n ? 'bg-accent text-text-primary'\n : 'text-text-secondary hover:bg-bg-sunken'\n )}\n >\n <Icon className=\"h-4 w-4\" />\n <span className=\"hidden sm:inline\">{tab.label}</span>\n </button>\n );\n })}\n </div>\n </div>\n </div>\n\n {/* Desktop Sidebar */}\n <div className=\"hidden lg:block lg:w-56 shrink-0\">\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface shadow-sm sticky top-24\">\n <div className=\"p-4 border-b border-border-subtle\">\n <h2 className=\"font-semibold text-text-primary text-sm\">Settings</h2>\n </div>\n <nav className=\"p-2\">\n {tabs.map((tab) => {\n const Icon = tab.icon;\n return (\n <button\n key={tab.id}\n type=\"button\"\n onClick={() => setActiveTab(tab.id)}\n className={cn(\n 'w-full text-left px-3 py-2 rounded-md mb-1 flex items-center gap-3 text-sm transition-colors',\n activeTab === tab.id\n ? 'bg-accent text-text-primary font-medium'\n : 'text-text-secondary hover:bg-bg-sunken hover:text-text-primary'\n )}\n >\n <Icon className=\"h-4 w-4\" />\n {tab.label}\n </button>\n );\n })}\n </nav>\n </div>\n </div>\n\n {/* Content */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-5 sm:p-6 bg-gloss-card shadow-pop\">\n {activeTab === 'general' && renderGeneralTab()}\n {activeTab === 'contact' && renderContactTab()}\n {activeTab === 'location' && renderLocationTab()}\n {activeTab === 'operating' && renderOperatingTab()}\n {activeTab === 'policies' && renderPoliciesTab()}\n {activeTab === 'notifications' && renderNotificationsTab()}\n {activeTab === 'integration' && renderIntegrationTab()}\n\n {/* Save Button (bottom) */}\n <div className=\"flex justify-end mt-8 pt-6 border-t border-border-subtle\">\n <button\n type=\"button\"\n onClick={handleSave}\n disabled={saving}\n className={cn(\n 'inline-flex items-center gap-2 rounded-md px-6 py-2 text-sm font-medium transition-colors',\n saved\n ? 'bg-status-success-bg-subtle/10 text-status-success-text'\n : saving\n ? 'bg-bg-sunken text-text-secondary cursor-not-allowed'\n : 'bg-accent text-text-primary hover:bg-accent/80'\n )}\n >\n {saving ? (\n <>\n <div className=\"h-4 w-4 animate-spin rounded-full border-2 border-current border-t-transparent\" />\n Saving...\n </>\n ) : saved ? (\n <>\n <CheckCircle2 className=\"h-4 w-4\" />\n Saved!\n </>\n ) : (\n <>\n <Save className=\"h-4 w-4\" />\n Save Settings\n </>\n )}\n </button>\n </div>\n </div>\n </div>\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}
|
|
@@ -6,8 +6,9 @@ import { mockAdminAnalytics as i } from "../../mocks/data.js";
|
|
|
6
6
|
import { useState as a } from "react";
|
|
7
7
|
import { Activity as o, AlertCircle as s, ArrowRight as c, BarChart3 as l, Bell as u, CheckCircle as d, ChevronRight as f, Clock as p, Edit as m, Eye as h, Flame as g, IndianRupee as _, MapPin as v, Package as y, Plus as b, Settings as x, ShoppingCart as S, Star as C, TrendingDown as w, TrendingUp as T, UserCheck as E, Users as D } from "lucide-react";
|
|
8
8
|
import { jsx as O, jsxs as k } from "react/jsx-runtime";
|
|
9
|
+
import { EmphasisPanel as A, NextSteps as j } from "@burdenoff/fe-libs/ui";
|
|
9
10
|
//#region src/adaptercloud/pages/cart-owner/CartOwnerDashboard.tsx
|
|
10
|
-
var
|
|
11
|
+
var M = {
|
|
11
12
|
totalRevenue: 45230,
|
|
12
13
|
dailyRevenue: 1850,
|
|
13
14
|
ordersToday: 23,
|
|
@@ -16,7 +17,7 @@ var A = {
|
|
|
16
17
|
averageOrderValue: 80,
|
|
17
18
|
customerCount: 342,
|
|
18
19
|
rating: 4.2
|
|
19
|
-
},
|
|
20
|
+
}, N = [
|
|
20
21
|
{
|
|
21
22
|
id: "ORD-001",
|
|
22
23
|
customerName: "Rahul Sharma",
|
|
@@ -61,7 +62,7 @@ var A = {
|
|
|
61
62
|
timestamp: "2 mins ago",
|
|
62
63
|
priority: "urgent"
|
|
63
64
|
}
|
|
64
|
-
],
|
|
65
|
+
], P = [
|
|
65
66
|
{
|
|
66
67
|
name: "Masala Dosa",
|
|
67
68
|
quantity: 245,
|
|
@@ -87,7 +88,7 @@ var A = {
|
|
|
87
88
|
quantity: 98,
|
|
88
89
|
revenue: 8820
|
|
89
90
|
}
|
|
90
|
-
],
|
|
91
|
+
], F = [
|
|
91
92
|
{
|
|
92
93
|
name: "Ramesh Kumar",
|
|
93
94
|
role: "Chef",
|
|
@@ -108,7 +109,7 @@ var A = {
|
|
|
108
109
|
role: "Manager",
|
|
109
110
|
status: "active"
|
|
110
111
|
}
|
|
111
|
-
],
|
|
112
|
+
], I = [
|
|
112
113
|
{
|
|
113
114
|
id: "1",
|
|
114
115
|
message: "New order #ORD-004 received",
|
|
@@ -139,43 +140,43 @@ var A = {
|
|
|
139
140
|
type: "warning",
|
|
140
141
|
time: "1 hr ago"
|
|
141
142
|
}
|
|
142
|
-
],
|
|
143
|
+
], L = i.orderTrends.slice(0, 7), R = () => {
|
|
143
144
|
let e = (/* @__PURE__ */ new Date()).getHours();
|
|
144
145
|
return e < 12 ? "Good Morning" : e < 17 ? "Good Afternoon" : "Good Evening";
|
|
145
|
-
},
|
|
146
|
+
}, z = {
|
|
146
147
|
pending: "bg-status-error-bg-subtle/15 text-status-error-text",
|
|
147
148
|
preparing: "bg-status-warning-bg-subtle/15 text-status-warning-text",
|
|
148
149
|
ready: "bg-accent-blue-subtle/15 text-accent-blue",
|
|
149
150
|
delivered: "bg-status-success-bg-subtle/15 text-status-success-text",
|
|
150
151
|
cancelled: "bg-bg-sunken text-text-secondary"
|
|
151
|
-
},
|
|
152
|
+
}, B = {
|
|
152
153
|
active: "bg-status-success-bg-subtle",
|
|
153
154
|
"on-break": "bg-status-warning-bg-subtle",
|
|
154
155
|
"off-duty": "bg-muted-foreground"
|
|
155
|
-
},
|
|
156
|
+
}, V = {
|
|
156
157
|
info: "text-accent-blue",
|
|
157
158
|
warning: "text-status-warning-text",
|
|
158
159
|
success: "text-status-success-text"
|
|
159
|
-
},
|
|
160
|
-
let { navigateTo: i } = e(), [
|
|
160
|
+
}, H = () => {
|
|
161
|
+
let { navigateTo: i } = e(), [H, U] = a(N), [W, G] = a({
|
|
161
162
|
isOpen: !0,
|
|
162
163
|
currentLocation: "Koramangala 5th Block, Near BDA Complex",
|
|
163
164
|
lastUpdate: (/* @__PURE__ */ new Date()).toLocaleTimeString(),
|
|
164
165
|
operatingHours: "9:00 AM - 9:00 PM"
|
|
165
|
-
}),
|
|
166
|
-
|
|
166
|
+
}), K = (e) => {
|
|
167
|
+
U((t) => t.map((t) => t.id === e ? {
|
|
167
168
|
...t,
|
|
168
169
|
status: "preparing"
|
|
169
170
|
} : t));
|
|
170
|
-
},
|
|
171
|
-
|
|
171
|
+
}, q = (e) => {
|
|
172
|
+
U((t) => t.map((t) => t.id === e ? {
|
|
172
173
|
...t,
|
|
173
174
|
status: "ready"
|
|
174
175
|
} : t));
|
|
175
176
|
};
|
|
176
177
|
return /* @__PURE__ */ O(n, {
|
|
177
178
|
title: /* @__PURE__ */ k("span", { children: [
|
|
178
|
-
|
|
179
|
+
R(),
|
|
179
180
|
", ",
|
|
180
181
|
/* @__PURE__ */ O("span", {
|
|
181
182
|
className: "text-text-secondary font-normal",
|
|
@@ -183,6 +184,7 @@ var A = {
|
|
|
183
184
|
})
|
|
184
185
|
] }),
|
|
185
186
|
description: "Manage your service provider operations",
|
|
187
|
+
purpose: "Your daily home base as a cart owner — see today's orders and earnings at a glance, check whether your cart is open, and jump straight to the things that need you. Start here every morning to run your business.",
|
|
186
188
|
actions: /* @__PURE__ */ k("button", {
|
|
187
189
|
type: "button",
|
|
188
190
|
onClick: () => i("/cart-owner/orders"),
|
|
@@ -193,25 +195,25 @@ var A = {
|
|
|
193
195
|
className: "space-y-6",
|
|
194
196
|
children: [
|
|
195
197
|
/* @__PURE__ */ O("div", {
|
|
196
|
-
className: t("p-4 rounded-lg border-l-4",
|
|
198
|
+
className: t("p-4 rounded-lg border-l-4", W.isOpen ? "border-status-success-border bg-status-success-bg-subtle/5" : "border-status-error-border bg-status-error-bg-subtle/5"),
|
|
197
199
|
children: /* @__PURE__ */ k("div", {
|
|
198
200
|
className: "flex flex-col lg:flex-row lg:items-center lg:justify-between gap-4",
|
|
199
201
|
children: [/* @__PURE__ */ k("div", {
|
|
200
202
|
className: "flex items-start gap-3",
|
|
201
203
|
children: [/* @__PURE__ */ O("div", {
|
|
202
204
|
"aria-hidden": "true",
|
|
203
|
-
className: t("w-3 h-3 rounded-full mt-1 shrink-0",
|
|
205
|
+
className: t("w-3 h-3 rounded-full mt-1 shrink-0", W.isOpen ? "bg-status-success-text motion-safe:animate-vc-glow-pulse" : "bg-status-error-text")
|
|
204
206
|
}), /* @__PURE__ */ k("div", { children: [/* @__PURE__ */ k("h3", {
|
|
205
207
|
className: "font-semibold text-text-primary text-sm",
|
|
206
|
-
children: ["Service Status: ",
|
|
208
|
+
children: ["Service Status: ", W.isOpen ? "Open" : "Closed"]
|
|
207
209
|
}), /* @__PURE__ */ k("div", {
|
|
208
210
|
className: "flex flex-col sm:flex-row sm:items-center gap-2 sm:gap-4 mt-1 text-xs text-text-secondary",
|
|
209
211
|
children: [/* @__PURE__ */ k("span", {
|
|
210
212
|
className: "flex items-center gap-1",
|
|
211
|
-
children: [/* @__PURE__ */ O(v, { className: "h-3 w-3 shrink-0" }),
|
|
213
|
+
children: [/* @__PURE__ */ O(v, { className: "h-3 w-3 shrink-0" }), W.currentLocation]
|
|
212
214
|
}), /* @__PURE__ */ k("span", {
|
|
213
215
|
className: "flex items-center gap-1",
|
|
214
|
-
children: [/* @__PURE__ */ O(p, { className: "h-3 w-3 shrink-0" }),
|
|
216
|
+
children: [/* @__PURE__ */ O(p, { className: "h-3 w-3 shrink-0" }), W.operatingHours]
|
|
215
217
|
})]
|
|
216
218
|
})] })]
|
|
217
219
|
}), /* @__PURE__ */ k("div", {
|
|
@@ -224,18 +226,18 @@ var A = {
|
|
|
224
226
|
}), /* @__PURE__ */ O("button", {
|
|
225
227
|
type: "button",
|
|
226
228
|
onClick: () => {
|
|
227
|
-
|
|
229
|
+
G((e) => e && {
|
|
228
230
|
...e,
|
|
229
231
|
isOpen: !e.isOpen
|
|
230
232
|
});
|
|
231
233
|
},
|
|
232
|
-
className: t("inline-flex items-center gap-1 rounded-md px-3 py-1.5 text-xs font-medium transition-colors",
|
|
233
|
-
children:
|
|
234
|
+
className: t("inline-flex items-center gap-1 rounded-md px-3 py-1.5 text-xs font-medium transition-colors", W.isOpen ? "bg-status-error-bg-subtle/10 text-status-error-text hover:bg-status-error-bg-subtle/20" : "bg-status-success-bg-subtle/10 text-status-success-text hover:bg-status-success-bg-subtle/20"),
|
|
235
|
+
children: W.isOpen ? "Close Service" : "Open Service"
|
|
234
236
|
})]
|
|
235
237
|
})]
|
|
236
238
|
})
|
|
237
239
|
}),
|
|
238
|
-
/* @__PURE__ */ k(
|
|
240
|
+
/* @__PURE__ */ k(A, { children: [/* @__PURE__ */ O("h2", {
|
|
239
241
|
className: "text-base font-semibold text-text-primary mb-3",
|
|
240
242
|
children: "Today's Performance"
|
|
241
243
|
}), /* @__PURE__ */ O("div", {
|
|
@@ -243,28 +245,28 @@ var A = {
|
|
|
243
245
|
children: [
|
|
244
246
|
{
|
|
245
247
|
label: "Daily Revenue",
|
|
246
|
-
value: r(
|
|
248
|
+
value: r(M.dailyRevenue, { minimumFractionDigits: 0 }),
|
|
247
249
|
icon: _,
|
|
248
250
|
trend: "+15.2% vs yesterday",
|
|
249
251
|
trendUp: !0
|
|
250
252
|
},
|
|
251
253
|
{
|
|
252
254
|
label: "Orders Today",
|
|
253
|
-
value: String(
|
|
255
|
+
value: String(M.ordersToday),
|
|
254
256
|
icon: S,
|
|
255
257
|
trend: "+8.5% vs yesterday",
|
|
256
258
|
trendUp: !0
|
|
257
259
|
},
|
|
258
260
|
{
|
|
259
261
|
label: "Avg Order Value",
|
|
260
|
-
value: r(
|
|
262
|
+
value: r(M.averageOrderValue, { minimumFractionDigits: 0 }),
|
|
261
263
|
icon: T,
|
|
262
264
|
trend: "+3.2% vs last week",
|
|
263
265
|
trendUp: !0
|
|
264
266
|
},
|
|
265
267
|
{
|
|
266
268
|
label: "Service Rating",
|
|
267
|
-
value:
|
|
269
|
+
value: M.rating.toFixed(1),
|
|
268
270
|
icon: C,
|
|
269
271
|
trend: "Based on 342 reviews",
|
|
270
272
|
trendUp: !0
|
|
@@ -296,6 +298,29 @@ var A = {
|
|
|
296
298
|
}, e.label);
|
|
297
299
|
})
|
|
298
300
|
})] }),
|
|
301
|
+
/* @__PURE__ */ O(j, {
|
|
302
|
+
storageKey: "adaptercloud-cartowner-dashboard",
|
|
303
|
+
steps: [
|
|
304
|
+
{
|
|
305
|
+
id: "manage-orders",
|
|
306
|
+
label: "Work your live order queue",
|
|
307
|
+
description: "Accept and progress incoming orders so customers stay updated.",
|
|
308
|
+
onClick: () => i("/cart-owner/orders")
|
|
309
|
+
},
|
|
310
|
+
{
|
|
311
|
+
id: "update-offerings",
|
|
312
|
+
label: "Update your offerings",
|
|
313
|
+
description: "Add products, set prices, and keep availability current.",
|
|
314
|
+
onClick: () => i("/cart-owner/inventory")
|
|
315
|
+
},
|
|
316
|
+
{
|
|
317
|
+
id: "check-analytics",
|
|
318
|
+
label: "Review your analytics",
|
|
319
|
+
description: "See what sells and when to staff up.",
|
|
320
|
+
onClick: () => i("/cart-owner/analytics")
|
|
321
|
+
}
|
|
322
|
+
]
|
|
323
|
+
}),
|
|
299
324
|
/* @__PURE__ */ k("div", {
|
|
300
325
|
className: "grid grid-cols-1 gap-6 lg:grid-cols-3",
|
|
301
326
|
children: [/* @__PURE__ */ k("div", {
|
|
@@ -363,7 +388,7 @@ var A = {
|
|
|
363
388
|
})]
|
|
364
389
|
}), /* @__PURE__ */ O("div", {
|
|
365
390
|
className: "space-y-3",
|
|
366
|
-
children:
|
|
391
|
+
children: H.map((e) => /* @__PURE__ */ O("div", {
|
|
367
392
|
className: "rounded-lg border border-border-seam bg-bg-surface p-4 bg-gloss-card shadow-pop",
|
|
368
393
|
children: /* @__PURE__ */ k("div", {
|
|
369
394
|
className: "flex flex-col lg:flex-row lg:items-start lg:justify-between gap-3",
|
|
@@ -378,7 +403,7 @@ var A = {
|
|
|
378
403
|
children: ["#", e.id]
|
|
379
404
|
}),
|
|
380
405
|
/* @__PURE__ */ O("span", {
|
|
381
|
-
className: t("inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium capitalize",
|
|
406
|
+
className: t("inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium capitalize", z[e.status] || "bg-bg-sunken text-text-secondary"),
|
|
382
407
|
children: e.status
|
|
383
408
|
}),
|
|
384
409
|
e.priority === "urgent" && /* @__PURE__ */ O(s, { className: "h-4 w-4 text-status-error-text" })
|
|
@@ -414,13 +439,13 @@ var A = {
|
|
|
414
439
|
}),
|
|
415
440
|
e.status === "pending" && /* @__PURE__ */ k("button", {
|
|
416
441
|
type: "button",
|
|
417
|
-
onClick: () =>
|
|
442
|
+
onClick: () => K(e.id),
|
|
418
443
|
className: "inline-flex items-center gap-1 rounded-md bg-status-success-bg-subtle/10 px-3 py-1.5 text-xs font-medium text-status-success-text hover:bg-status-success-bg-subtle/20 transition-colors",
|
|
419
444
|
children: [/* @__PURE__ */ O(d, { className: "h-3 w-3" }), "Accept"]
|
|
420
445
|
}),
|
|
421
446
|
e.status === "preparing" && /* @__PURE__ */ k("button", {
|
|
422
447
|
type: "button",
|
|
423
|
-
onClick: () =>
|
|
448
|
+
onClick: () => q(e.id),
|
|
424
449
|
className: "inline-flex items-center gap-1 rounded-md bg-accent-blue-subtle/10 px-3 py-1.5 text-xs font-medium text-accent-blue hover:bg-accent-blue-subtle/20 transition-colors",
|
|
425
450
|
children: [/* @__PURE__ */ O(d, { className: "h-3 w-3" }), "Mark Ready"]
|
|
426
451
|
})
|
|
@@ -466,8 +491,8 @@ var A = {
|
|
|
466
491
|
children: "Trend"
|
|
467
492
|
})
|
|
468
493
|
]
|
|
469
|
-
}) }), /* @__PURE__ */ O("tbody", { children:
|
|
470
|
-
let n = Math.max(...
|
|
494
|
+
}) }), /* @__PURE__ */ O("tbody", { children: L.map((e, t) => {
|
|
495
|
+
let n = Math.max(...L.map((e) => e.revenue)), i = e.revenue / n * 100;
|
|
471
496
|
return /* @__PURE__ */ k("tr", {
|
|
472
497
|
className: "border-b border-border-subtle last:border-0",
|
|
473
498
|
children: [
|
|
@@ -515,7 +540,7 @@ var A = {
|
|
|
515
540
|
className: "text-center p-3 rounded-lg bg-bg-sunken/50",
|
|
516
541
|
children: [/* @__PURE__ */ O("div", {
|
|
517
542
|
className: "text-xl font-bold text-text-primary",
|
|
518
|
-
children: r(
|
|
543
|
+
children: r(M.totalRevenue, { minimumFractionDigits: 0 })
|
|
519
544
|
}), /* @__PURE__ */ O("div", {
|
|
520
545
|
className: "text-xs text-text-secondary mt-1",
|
|
521
546
|
children: "Total Revenue"
|
|
@@ -525,7 +550,7 @@ var A = {
|
|
|
525
550
|
className: "text-center p-3 rounded-lg bg-bg-sunken/50",
|
|
526
551
|
children: [/* @__PURE__ */ O("div", {
|
|
527
552
|
className: "text-xl font-bold text-text-primary",
|
|
528
|
-
children:
|
|
553
|
+
children: M.totalOrders
|
|
529
554
|
}), /* @__PURE__ */ O("div", {
|
|
530
555
|
className: "text-xs text-text-secondary mt-1",
|
|
531
556
|
children: "Total Orders"
|
|
@@ -535,7 +560,7 @@ var A = {
|
|
|
535
560
|
className: "text-center p-3 rounded-lg bg-bg-sunken/50",
|
|
536
561
|
children: [/* @__PURE__ */ O("div", {
|
|
537
562
|
className: "text-xl font-bold text-text-primary",
|
|
538
|
-
children:
|
|
563
|
+
children: M.customerCount
|
|
539
564
|
}), /* @__PURE__ */ O("div", {
|
|
540
565
|
className: "text-xs text-text-secondary mt-1",
|
|
541
566
|
children: "Unique Customers"
|
|
@@ -557,13 +582,13 @@ var A = {
|
|
|
557
582
|
children: [/* @__PURE__ */ O(u, { className: "h-4 w-4" }), "Notifications"]
|
|
558
583
|
}), /* @__PURE__ */ O("span", {
|
|
559
584
|
className: "inline-flex items-center justify-center rounded-full bg-status-error-bg-subtle text-white text-[10px] font-bold h-5 w-5",
|
|
560
|
-
children:
|
|
585
|
+
children: I.length
|
|
561
586
|
})]
|
|
562
587
|
}), /* @__PURE__ */ O("div", {
|
|
563
588
|
className: "space-y-3",
|
|
564
|
-
children:
|
|
589
|
+
children: I.map((e) => /* @__PURE__ */ k("div", {
|
|
565
590
|
className: "flex items-start gap-2",
|
|
566
|
-
children: [/* @__PURE__ */ O(o, { className: t("h-4 w-4 mt-0.5 shrink-0",
|
|
591
|
+
children: [/* @__PURE__ */ O(o, { className: t("h-4 w-4 mt-0.5 shrink-0", V[e.type]) }), /* @__PURE__ */ k("div", {
|
|
567
592
|
className: "min-w-0",
|
|
568
593
|
children: [/* @__PURE__ */ O("p", {
|
|
569
594
|
className: "text-xs text-text-primary leading-tight",
|
|
@@ -583,7 +608,7 @@ var A = {
|
|
|
583
608
|
children: [/* @__PURE__ */ O(g, { className: "h-4 w-4 text-accent-orange" }), "Top Selling Items"]
|
|
584
609
|
}), /* @__PURE__ */ O("div", {
|
|
585
610
|
className: "space-y-3",
|
|
586
|
-
children:
|
|
611
|
+
children: P.map((e, t) => /* @__PURE__ */ k("div", {
|
|
587
612
|
className: "flex items-center justify-between",
|
|
588
613
|
children: [/* @__PURE__ */ k("div", {
|
|
589
614
|
className: "flex items-center gap-2 min-w-0",
|
|
@@ -622,11 +647,11 @@ var A = {
|
|
|
622
647
|
})]
|
|
623
648
|
}), /* @__PURE__ */ O("div", {
|
|
624
649
|
className: "space-y-3",
|
|
625
|
-
children:
|
|
650
|
+
children: F.map((e) => /* @__PURE__ */ k("div", {
|
|
626
651
|
className: "flex items-center justify-between",
|
|
627
652
|
children: [/* @__PURE__ */ k("div", {
|
|
628
653
|
className: "flex items-center gap-2",
|
|
629
|
-
children: [/* @__PURE__ */ O("div", { className: t("w-2 h-2 rounded-full",
|
|
654
|
+
children: [/* @__PURE__ */ O("div", { className: t("w-2 h-2 rounded-full", B[e.status]) }), /* @__PURE__ */ k("div", { children: [/* @__PURE__ */ O("p", {
|
|
630
655
|
className: "text-xs font-medium text-text-primary",
|
|
631
656
|
children: e.name
|
|
632
657
|
}), /* @__PURE__ */ O("p", {
|
|
@@ -655,7 +680,7 @@ var A = {
|
|
|
655
680
|
children: "Active Offerings"
|
|
656
681
|
}), /* @__PURE__ */ O("span", {
|
|
657
682
|
className: "text-sm font-semibold text-text-primary",
|
|
658
|
-
children:
|
|
683
|
+
children: M.activeOfferings
|
|
659
684
|
})]
|
|
660
685
|
}),
|
|
661
686
|
/* @__PURE__ */ k("div", {
|
|
@@ -665,7 +690,7 @@ var A = {
|
|
|
665
690
|
children: "Customer Rating"
|
|
666
691
|
}), /* @__PURE__ */ k("span", {
|
|
667
692
|
className: "text-sm font-semibold text-text-primary flex items-center gap-1",
|
|
668
|
-
children: [/* @__PURE__ */ O(C, { className: "h-3 w-3 text-status-warning-text fill-status-warning-text" }),
|
|
693
|
+
children: [/* @__PURE__ */ O(C, { className: "h-3 w-3 text-status-warning-text fill-status-warning-text" }), M.rating]
|
|
669
694
|
})]
|
|
670
695
|
}),
|
|
671
696
|
/* @__PURE__ */ k("div", {
|
|
@@ -675,7 +700,7 @@ var A = {
|
|
|
675
700
|
children: "Total Customers"
|
|
676
701
|
}), /* @__PURE__ */ O("span", {
|
|
677
702
|
className: "text-sm font-semibold text-text-primary",
|
|
678
|
-
children:
|
|
703
|
+
children: M.customerCount
|
|
679
704
|
})]
|
|
680
705
|
})
|
|
681
706
|
]
|
|
@@ -758,6 +783,6 @@ var A = {
|
|
|
758
783
|
});
|
|
759
784
|
};
|
|
760
785
|
//#endregion
|
|
761
|
-
export {
|
|
786
|
+
export { H as CartOwnerDashboard };
|
|
762
787
|
|
|
763
788
|
//# sourceMappingURL=CartOwnerDashboard.js.map
|