@burdenoff/microfe-subscriberbot 2026.624.1 → 2026.625.1
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/subscriberbot/components/EmptyState.js +17 -10
- package/dist/subscriberbot/components/EmptyState.js.map +1 -1
- package/dist/subscriberbot/components/InvestmentCard.js +23 -22
- package/dist/subscriberbot/components/InvestmentCard.js.map +1 -1
- package/dist/subscriberbot/components/MetricsCard.js +15 -12
- package/dist/subscriberbot/components/MetricsCard.js.map +1 -1
- package/dist/subscriberbot/components/PageLayout.js +27 -15
- package/dist/subscriberbot/components/PageLayout.js.map +1 -1
- package/dist/subscriberbot/components/RatingDisplay.js +3 -3
- package/dist/subscriberbot/components/RatingDisplay.js.map +1 -1
- package/dist/subscriberbot/components/StatusBadge.js +25 -13
- package/dist/subscriberbot/components/StatusBadge.js.map +1 -1
- package/dist/subscriberbot/context/SubscriberBotContext.js.map +1 -1
- package/dist/subscriberbot/pages/HomePage.js +67 -63
- package/dist/subscriberbot/pages/HomePage.js.map +1 -1
- package/dist/subscriberbot/pages/admin/AdminAnalyticsPage.js +42 -42
- package/dist/subscriberbot/pages/admin/AdminAnalyticsPage.js.map +1 -1
- package/dist/subscriberbot/pages/admin/AdminDashboard.js +42 -41
- package/dist/subscriberbot/pages/admin/AdminDashboard.js.map +1 -1
- package/dist/subscriberbot/pages/admin/AdminFinancialPage.js +14 -14
- package/dist/subscriberbot/pages/admin/AdminFinancialPage.js.map +1 -1
- package/dist/subscriberbot/pages/admin/AdminOrdersPage.js +24 -24
- package/dist/subscriberbot/pages/admin/AdminOrdersPage.js.map +1 -1
- package/dist/subscriberbot/pages/admin/AdminProfilePage.js +11 -11
- package/dist/subscriberbot/pages/admin/AdminProfilePage.js.map +1 -1
- package/dist/subscriberbot/pages/admin/AdminSettingsPage.js +14 -14
- package/dist/subscriberbot/pages/admin/AdminSettingsPage.js.map +1 -1
- package/dist/subscriberbot/pages/admin/CartManagementPage.js +41 -41
- package/dist/subscriberbot/pages/admin/CartManagementPage.js.map +1 -1
- package/dist/subscriberbot/pages/admin/UserManagementPage.js +47 -47
- package/dist/subscriberbot/pages/admin/UserManagementPage.js.map +1 -1
- package/dist/subscriberbot/pages/cart-owner/AnalyticsDashboard.js +44 -44
- package/dist/subscriberbot/pages/cart-owner/AnalyticsDashboard.js.map +1 -1
- package/dist/subscriberbot/pages/cart-owner/BusinessSettingsPage.js +17 -17
- package/dist/subscriberbot/pages/cart-owner/BusinessSettingsPage.js.map +1 -1
- package/dist/subscriberbot/pages/cart-owner/CartOwnerDashboard.js +94 -89
- package/dist/subscriberbot/pages/cart-owner/CartOwnerDashboard.js.map +1 -1
- package/dist/subscriberbot/pages/cart-owner/CartOwnerProfilePage.js +58 -58
- package/dist/subscriberbot/pages/cart-owner/CartOwnerProfilePage.js.map +1 -1
- package/dist/subscriberbot/pages/cart-owner/CartServiceConfigPage.js +51 -51
- package/dist/subscriberbot/pages/cart-owner/CartServiceConfigPage.js.map +1 -1
- package/dist/subscriberbot/pages/cart-owner/InventoryManagementPage.js +54 -54
- package/dist/subscriberbot/pages/cart-owner/InventoryManagementPage.js.map +1 -1
- package/dist/subscriberbot/pages/cart-owner/OrderManagementPage.js +54 -53
- package/dist/subscriberbot/pages/cart-owner/OrderManagementPage.js.map +1 -1
- package/dist/subscriberbot/pages/cart-owner/StaffManagementPage.js +51 -51
- package/dist/subscriberbot/pages/cart-owner/StaffManagementPage.js.map +1 -1
- package/dist/subscriberbot/pages/common/HelpSupportPage.js +65 -65
- package/dist/subscriberbot/pages/common/HelpSupportPage.js.map +1 -1
- package/dist/subscriberbot/pages/common/NotificationCenterPage.js +46 -45
- package/dist/subscriberbot/pages/common/NotificationCenterPage.js.map +1 -1
- package/dist/subscriberbot/pages/common/SettingsPage.js +46 -46
- package/dist/subscriberbot/pages/common/SettingsPage.js.map +1 -1
- package/dist/subscriberbot/pages/customer/BookingDetailsPage.js +24 -23
- package/dist/subscriberbot/pages/customer/BookingDetailsPage.js.map +1 -1
- package/dist/subscriberbot/pages/customer/CartDetailPage.js +31 -30
- package/dist/subscriberbot/pages/customer/CartDetailPage.js.map +1 -1
- package/dist/subscriberbot/pages/customer/CartDiscoveryPage.js +25 -23
- package/dist/subscriberbot/pages/customer/CartDiscoveryPage.js.map +1 -1
- package/dist/subscriberbot/pages/customer/CheckoutPage.js +26 -26
- package/dist/subscriberbot/pages/customer/CheckoutPage.js.map +1 -1
- package/dist/subscriberbot/pages/customer/CustomerDashboard.js +39 -38
- package/dist/subscriberbot/pages/customer/CustomerDashboard.js.map +1 -1
- package/dist/subscriberbot/pages/customer/CustomerProfilePage.js +36 -36
- package/dist/subscriberbot/pages/customer/CustomerProfilePage.js.map +1 -1
- package/dist/subscriberbot/pages/customer/DirectServiceBookingPage.js +37 -36
- package/dist/subscriberbot/pages/customer/DirectServiceBookingPage.js.map +1 -1
- package/dist/subscriberbot/pages/customer/FavoritesPage.js +16 -15
- package/dist/subscriberbot/pages/customer/FavoritesPage.js.map +1 -1
- package/dist/subscriberbot/pages/customer/OrderHistoryPage.js +19 -17
- package/dist/subscriberbot/pages/customer/OrderHistoryPage.js.map +1 -1
- package/dist/subscriberbot/pages/customer/OrderTrackingPage.js +21 -20
- package/dist/subscriberbot/pages/customer/OrderTrackingPage.js.map +1 -1
- package/dist/subscriberbot/pages/customer/PaymentMethodsPage.js +22 -21
- package/dist/subscriberbot/pages/customer/PaymentMethodsPage.js.map +1 -1
- package/dist/subscriberbot/pages/customer/ReviewsPage.js +29 -28
- package/dist/subscriberbot/pages/customer/ReviewsPage.js.map +1 -1
- package/dist/subscriberbot/pages/customer/SavedAddressesPage.js +26 -25
- package/dist/subscriberbot/pages/customer/SavedAddressesPage.js.map +1 -1
- package/dist/subscriberbot/pages/investor/InvestmentDetailsPage.js +46 -46
- package/dist/subscriberbot/pages/investor/InvestmentDetailsPage.js.map +1 -1
- package/dist/subscriberbot/pages/investor/InvestmentOpportunitiesPage.js +34 -32
- package/dist/subscriberbot/pages/investor/InvestmentOpportunitiesPage.js.map +1 -1
- package/dist/subscriberbot/pages/investor/InvestorAnalyticsPage.js +38 -38
- package/dist/subscriberbot/pages/investor/InvestorAnalyticsPage.js.map +1 -1
- package/dist/subscriberbot/pages/investor/InvestorDashboard.js +26 -25
- package/dist/subscriberbot/pages/investor/InvestorDashboard.js.map +1 -1
- package/dist/subscriberbot/pages/investor/InvestorInvestmentsPage.js +12 -11
- package/dist/subscriberbot/pages/investor/InvestorInvestmentsPage.js.map +1 -1
- package/dist/subscriberbot/pages/investor/InvestorPortfolioPage.js +25 -25
- package/dist/subscriberbot/pages/investor/InvestorPortfolioPage.js.map +1 -1
- package/dist/subscriberbot/pages/investor/InvestorProfilePage.js +58 -58
- package/dist/subscriberbot/pages/investor/InvestorProfilePage.js.map +1 -1
- package/dist/subscriberbot/pages/worker/TaskDetailsPage.js +26 -25
- package/dist/subscriberbot/pages/worker/TaskDetailsPage.js.map +1 -1
- package/dist/subscriberbot/pages/worker/WorkerDashboard.js +48 -47
- package/dist/subscriberbot/pages/worker/WorkerDashboard.js.map +1 -1
- package/dist/subscriberbot/pages/worker/WorkerOrdersPage.js +41 -40
- package/dist/subscriberbot/pages/worker/WorkerOrdersPage.js.map +1 -1
- package/dist/subscriberbot/pages/worker/WorkerProfilePage.js +44 -44
- package/dist/subscriberbot/pages/worker/WorkerProfilePage.js.map +1 -1
- package/dist/subscriberbot/pages/worker/WorkerSchedulePage.js +32 -30
- package/dist/subscriberbot/pages/worker/WorkerSchedulePage.js.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BookingDetailsPage.js","names":[],"sources":["../../../../src/subscriberbot/pages/customer/BookingDetailsPage.tsx"],"sourcesContent":["/**\n * Booking Details Page\n * @module subscriberbot/pages/customer\n *\n * Detailed view of a service booking with service name, provider info,\n * scheduled date/time, booking status timeline, location info,\n * price breakdown, Contact Support button, Rate Service button (when completed),\n * Cart Information sidebar, cancel button.\n * Uses route param :bookingId from useParams().\n */\n\nimport { useMemo, useState } from 'react';\nimport { useParams } from 'react-router-dom';\nimport {\n ArrowLeft,\n Calendar,\n Clock,\n MapPin,\n Phone,\n Star,\n CheckCircle2,\n Circle,\n XCircle,\n ShoppingBag,\n CalendarCheck,\n AlertTriangle,\n Headphones,\n MessageSquare,\n IndianRupee,\n} from 'lucide-react';\nimport { PageLayout } from '../../components/PageLayout';\nimport { StatusBadge } from '../../components/StatusBadge';\nimport { EmptyState } from '../../components/EmptyState';\nimport { useSubscriberBot } from '../../context/SubscriberBotContext';\nimport { cn } from '../../utils/cn';\nimport { formatCurrency, formatDate } from '../../utils/formatters';\n\n// ============================================================================\n// Types\n// ============================================================================\n\ntype BookingStatus = 'confirmed' | 'in_progress' | 'completed' | 'cancelled';\n\ninterface BookingTimelineEvent {\n status: string;\n label: string;\n timestamp: string | null;\n completed: boolean;\n}\n\ninterface MockBooking {\n id: string;\n serviceName: string;\n serviceDescription: string;\n provider: {\n id: string;\n name: string;\n phone: string;\n rating: number;\n reviewCount: number;\n category: string;\n image: string;\n location: string;\n };\n scheduledDate: string;\n scheduledTime: string;\n duration: number;\n status: BookingStatus;\n location: {\n street: string;\n area: string;\n city: string;\n pincode: string;\n landmark?: string;\n };\n pricing: {\n serviceCharge: number;\n convenienceFee: number;\n tax: number;\n discount: number;\n total: number;\n };\n createdAt: string;\n notes?: string;\n cancellationReason?: string;\n timeline: BookingTimelineEvent[];\n}\n\n// ============================================================================\n// Mock Data\n// ============================================================================\n\nconst mockBookings: MockBooking[] = [\n {\n id: 'BK-001',\n serviceName: \"Men's Haircut + Beard Trim\",\n serviceDescription: 'Professional haircut and beard grooming service at your doorstep',\n provider: {\n id: 'SERV-001',\n name: 'Quick Cuts Salon',\n phone: '+91-9876543210',\n rating: 4.6,\n reviewCount: 248,\n category: 'Personal Care & Beauty',\n image: 'https://images.unsplash.com/photo-1562322140-8baeececf3df?w=400',\n location: 'Indiranagar, Bangalore',\n },\n scheduledDate: '2024-01-20',\n scheduledTime: '10:00 AM',\n duration: 50,\n status: 'confirmed',\n location: {\n street: '123 Main Street',\n area: 'Koramangala',\n city: 'Bangalore',\n pincode: '560034',\n landmark: 'Near Metro Station',\n },\n pricing: {\n serviceCharge: 450,\n convenienceFee: 30,\n tax: 48,\n discount: 50,\n total: 478,\n },\n createdAt: '2024-01-16T14:30:00Z',\n notes: 'Please bring your own equipment',\n timeline: [\n {\n status: 'booked',\n label: 'Booking Placed',\n timestamp: '2024-01-16T14:30:00Z',\n completed: true,\n },\n {\n status: 'confirmed',\n label: 'Booking Confirmed',\n timestamp: '2024-01-16T14:35:00Z',\n completed: true,\n },\n { status: 'in_progress', label: 'Service Started', timestamp: null, completed: false },\n { status: 'completed', label: 'Service Completed', timestamp: null, completed: false },\n ],\n },\n {\n id: 'BK-002',\n serviceName: 'Deep House Cleaning',\n serviceDescription:\n 'Complete house cleaning service including kitchen, bathrooms, and living areas',\n provider: {\n id: 'SERV-005',\n name: 'Spotless Cleaning Services',\n phone: '+91-9876543215',\n rating: 4.8,\n reviewCount: 312,\n category: 'Home Services',\n image: 'https://images.unsplash.com/photo-1558618666-fcd25c85cd64?w=400',\n location: 'Whitefield, Bangalore',\n },\n scheduledDate: '2024-01-18',\n scheduledTime: '09:00 AM',\n duration: 180,\n status: 'completed',\n location: {\n street: '456 Park Avenue',\n area: 'Indiranagar',\n city: 'Bangalore',\n pincode: '560038',\n },\n pricing: {\n serviceCharge: 1500,\n convenienceFee: 50,\n tax: 155,\n discount: 0,\n total: 1705,\n },\n createdAt: '2024-01-15T10:00:00Z',\n timeline: [\n {\n status: 'booked',\n label: 'Booking Placed',\n timestamp: '2024-01-15T10:00:00Z',\n completed: true,\n },\n {\n status: 'confirmed',\n label: 'Booking Confirmed',\n timestamp: '2024-01-15T10:05:00Z',\n completed: true,\n },\n {\n status: 'in_progress',\n label: 'Service Started',\n timestamp: '2024-01-18T09:10:00Z',\n completed: true,\n },\n {\n status: 'completed',\n label: 'Service Completed',\n timestamp: '2024-01-18T12:15:00Z',\n completed: true,\n },\n ],\n },\n {\n id: 'BK-003',\n serviceName: 'Facial Treatment',\n serviceDescription: 'Deep cleansing facial with natural ingredients for glowing skin',\n provider: {\n id: 'SERV-002',\n name: 'Glow Beauty Services',\n phone: '+91-9876543212',\n rating: 4.7,\n reviewCount: 180,\n category: 'Personal Care & Beauty',\n image: 'https://images.unsplash.com/photo-1560066984-138dadb4c035?w=400',\n location: 'HSR Layout, Bangalore',\n },\n scheduledDate: '2024-01-22',\n scheduledTime: '02:00 PM',\n duration: 60,\n status: 'cancelled',\n location: {\n street: '789 Lake View',\n area: 'HSR Layout',\n city: 'Bangalore',\n pincode: '560102',\n },\n pricing: {\n serviceCharge: 800,\n convenienceFee: 30,\n tax: 83,\n discount: 0,\n total: 913,\n },\n createdAt: '2024-01-17T16:00:00Z',\n cancellationReason: 'Schedule conflict - need to reschedule',\n timeline: [\n {\n status: 'booked',\n label: 'Booking Placed',\n timestamp: '2024-01-17T16:00:00Z',\n completed: true,\n },\n {\n status: 'confirmed',\n label: 'Booking Confirmed',\n timestamp: '2024-01-17T16:10:00Z',\n completed: true,\n },\n {\n status: 'cancelled',\n label: 'Booking Cancelled',\n timestamp: '2024-01-18T09:00:00Z',\n completed: true,\n },\n ],\n },\n];\n\nconst getBookingById = (bookingId: string): MockBooking | undefined =>\n mockBookings.find((b) => b.id === bookingId);\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport function BookingDetailsPage() {\n const { bookingId } = useParams<{ bookingId: string }>();\n const { navigateTo } = useSubscriberBot();\n const [statusMessage, setStatusMessage] = useState<string | null>(null);\n\n const booking = useMemo(() => (bookingId ? getBookingById(bookingId) : undefined), [bookingId]);\n\n const showStatus = (msg: string) => {\n setStatusMessage(msg);\n setTimeout(() => setStatusMessage(null), 3000);\n };\n\n if (!booking) {\n return (\n <PageLayout title=\"Booking Not Found\">\n <EmptyState\n icon={<CalendarCheck className=\"h-12 w-12\" />}\n title=\"Booking not found\"\n description={`No booking found with ID \"${bookingId}\".`}\n action={\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/dashboard')}\n className=\"rounded-lg bg-foreground px-4 py-2 text-sm font-medium text-background hover:opacity-90 transition-opacity\"\n >\n Go to Dashboard\n </button>\n }\n />\n </PageLayout>\n );\n }\n\n const isCancelled = booking.status === 'cancelled';\n const isCompleted = booking.status === 'completed';\n const canCancel = !isCancelled && !isCompleted;\n\n const handleContactSupport = () => {\n showStatus('Support team will contact you shortly.');\n };\n\n const handleRateService = () => {\n showStatus('Thank you! Rating feature coming soon.');\n };\n\n return (\n <PageLayout\n title={\n <div className=\"flex items-center gap-3\">\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/dashboard')}\n className=\"rounded-md p-1 text-text-secondary hover:bg-accent hover:text-text-primary transition-colors\"\n >\n <ArrowLeft className=\"h-5 w-5\" />\n </button>\n <span>Booking #{booking.id}</span>\n </div>\n }\n actions={<StatusBadge status={booking.status} />}\n >\n {/* Status message */}\n {statusMessage && (\n <div className=\"mb-4 rounded-lg border border-green-500/30 bg-green-500/10 p-3 flex items-center gap-2\">\n <CheckCircle2 className=\"h-4 w-4 text-green-600 dark:text-green-400 shrink-0\" />\n <p className=\"text-sm text-green-600 dark:text-green-400\">{statusMessage}</p>\n </div>\n )}\n\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-3\">\n {/* Left: Main Content */}\n <div className=\"lg:col-span-2 space-y-6\">\n {/* Service Info */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-6\">\n <h2 className=\"text-lg font-semibold text-text-primary\">{booking.serviceName}</h2>\n <p className=\"mt-1 text-sm text-text-secondary\">{booking.serviceDescription}</p>\n\n <div className=\"mt-4 flex flex-wrap gap-4 text-sm text-text-secondary\">\n <div className=\"flex items-center gap-1.5\">\n <Calendar className=\"h-4 w-4\" />\n <span>{booking.scheduledDate}</span>\n </div>\n <div className=\"flex items-center gap-1.5\">\n <Clock className=\"h-4 w-4\" />\n <span>{booking.scheduledTime}</span>\n </div>\n <div className=\"flex items-center gap-1.5\">\n <Clock className=\"h-4 w-4\" />\n <span>{booking.duration} min</span>\n </div>\n </div>\n\n {booking.notes && (\n <div className=\"mt-4 rounded-md bg-bg-sunken p-3\">\n <p className=\"text-xs text-text-secondary mb-1\">Notes</p>\n <p className=\"text-sm text-text-primary\">{booking.notes}</p>\n </div>\n )}\n\n {booking.cancellationReason && (\n <div className=\"mt-4 rounded-md bg-red-500/5 border border-red-500/20 p-3\">\n <div className=\"flex items-center gap-2 mb-1\">\n <AlertTriangle className=\"h-3.5 w-3.5 text-red-600 dark:text-red-400\" />\n <p className=\"text-xs font-medium text-red-600 dark:text-red-400\">\n Cancellation Reason\n </p>\n </div>\n <p className=\"text-sm text-text-primary\">{booking.cancellationReason}</p>\n </div>\n )}\n </div>\n\n {/* Provider Info */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-6\">\n <h2 className=\"text-base font-semibold text-text-primary mb-4\">Service Provider</h2>\n <div className=\"flex items-center gap-4\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-full bg-bg-sunken text-text-secondary\">\n <ShoppingBag className=\"h-6 w-6\" />\n </div>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-semibold text-text-primary\">{booking.provider.name}</p>\n <p className=\"text-xs text-text-secondary\">{booking.provider.category}</p>\n <div className=\"flex items-center gap-1 mt-1\">\n <Star className=\"h-3 w-3 fill-yellow-400 text-yellow-400\" />\n <span className=\"text-xs font-medium text-text-primary\">\n {booking.provider.rating}\n </span>\n </div>\n </div>\n <a\n href={`tel:${booking.provider.phone}`}\n className=\"flex h-10 w-10 items-center justify-center rounded-full bg-bg-sunken text-text-secondary hover:bg-accent hover:text-text-primary transition-colors\"\n >\n <Phone className=\"h-4 w-4\" />\n </a>\n </div>\n <div className=\"mt-3 flex items-center gap-2 text-sm text-text-secondary\">\n <Phone className=\"h-4 w-4 shrink-0\" />\n <span>{booking.provider.phone}</span>\n </div>\n </div>\n\n {/* Booking Status Timeline */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-6\">\n <h2 className=\"text-base font-semibold text-text-primary mb-5\">Booking Timeline</h2>\n <div className=\"relative\">\n {booking.timeline.map((event, index) => {\n const isLast = index === booking.timeline.length - 1;\n const isCancelledEvent = event.status === 'cancelled';\n const Icon = isCancelledEvent ? XCircle : event.completed ? CheckCircle2 : Circle;\n\n return (\n <div key={`${event.status}-${index}`} className=\"flex gap-4\">\n <div className=\"flex flex-col items-center\">\n <div\n className={cn(\n 'flex h-8 w-8 shrink-0 items-center justify-center rounded-full',\n isCancelledEvent\n ? 'bg-red-500/10 text-red-600 dark:text-red-400'\n : event.completed\n ? 'bg-green-500/10 text-green-600 dark:text-green-400'\n : 'bg-bg-sunken text-text-secondary'\n )}\n >\n <Icon className=\"h-4 w-4\" />\n </div>\n {!isLast && (\n <div\n className={cn(\n 'w-0.5 flex-1 my-1',\n event.completed ? 'bg-green-500/30' : 'bg-border'\n )}\n />\n )}\n </div>\n <div className={cn('pb-6', isLast && 'pb-0')}>\n <p className=\"text-sm font-medium text-text-primary\">{event.label}</p>\n <p className=\"mt-0.5 text-xs text-text-secondary\">\n {event.timestamp ? formatDate(event.timestamp) : 'Pending'}\n </p>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n\n {/* Action Buttons: Contact Support + Rate Service */}\n <div className=\"flex flex-col sm:flex-row gap-3\">\n <button\n type=\"button\"\n onClick={handleContactSupport}\n className=\"flex-1 flex items-center justify-center gap-2 rounded-lg border border-border-subtle px-4 py-3 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n <Headphones className=\"h-4 w-4\" />\n Contact Support\n </button>\n\n {isCompleted && (\n <button\n type=\"button\"\n onClick={handleRateService}\n className=\"flex-1 flex items-center justify-center gap-2 rounded-lg bg-foreground px-4 py-3 text-sm font-medium text-background hover:opacity-90 transition-opacity\"\n >\n <Star className=\"h-4 w-4\" />\n Rate Service\n </button>\n )}\n </div>\n </div>\n\n {/* Right: Sidebar */}\n <div className=\"space-y-6\">\n {/* Cart Information */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-5\">\n <h3 className=\"text-base font-semibold text-text-primary mb-3\">Cart Information</h3>\n <div className=\"flex items-center gap-3 mb-4\">\n <img\n src={booking.provider.image}\n alt={booking.provider.name}\n className=\"h-14 w-14 rounded-lg object-cover\"\n />\n <div className=\"min-w-0\">\n <p className=\"text-sm font-semibold text-text-primary\">{booking.provider.name}</p>\n <p className=\"text-xs text-text-secondary\">{booking.provider.category}</p>\n <div className=\"flex items-center gap-1 mt-0.5\">\n <Star className=\"h-3 w-3 fill-yellow-400 text-yellow-400\" />\n <span className=\"text-xs font-medium text-text-primary\">\n {booking.provider.rating}\n </span>\n <span className=\"text-xs text-text-secondary\">\n ({booking.provider.reviewCount})\n </span>\n </div>\n </div>\n </div>\n\n <div className=\"space-y-2 text-sm mb-4\">\n <div className=\"flex items-start gap-2\">\n <MapPin className=\"h-4 w-4 text-text-secondary shrink-0 mt-0.5\" />\n <span className=\"text-text-secondary\">{booking.provider.location}</span>\n </div>\n </div>\n\n <button\n type=\"button\"\n onClick={() => navigateTo(`/customer/carts/${booking.provider.id}`)}\n className=\"w-full rounded-lg border border-border-subtle px-4 py-2.5 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n View Cart Menu\n </button>\n </div>\n\n {/* Location Info */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-5\">\n <h3 className=\"text-base font-semibold text-text-primary mb-3\">Service Location</h3>\n <div className=\"flex items-start gap-3\">\n <MapPin className=\"mt-0.5 h-5 w-5 shrink-0 text-text-secondary\" />\n <div>\n <p className=\"text-sm text-text-primary\">{booking.location.street}</p>\n <p className=\"text-sm text-text-secondary\">\n {booking.location.area}, {booking.location.city} - {booking.location.pincode}\n </p>\n {booking.location.landmark && (\n <p className=\"text-xs text-text-secondary mt-1\">\n Landmark: {booking.location.landmark}\n </p>\n )}\n </div>\n </div>\n </div>\n\n {/* Price Breakdown */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-5\">\n <h3 className=\"text-base font-semibold text-text-primary mb-3\">Price Breakdown</h3>\n <div className=\"space-y-2.5 text-sm\">\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">Service Charge</span>\n <span className=\"text-text-primary\">\n {formatCurrency(booking.pricing.serviceCharge, { minimumFractionDigits: 0 })}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">Convenience Fee</span>\n <span className=\"text-text-primary\">\n {formatCurrency(booking.pricing.convenienceFee, { minimumFractionDigits: 0 })}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">Tax</span>\n <span className=\"text-text-primary\">\n {formatCurrency(booking.pricing.tax, { minimumFractionDigits: 0 })}\n </span>\n </div>\n {booking.pricing.discount > 0 && (\n <div className=\"flex justify-between\">\n <span className=\"text-green-600 dark:text-green-400\">Discount</span>\n <span className=\"text-green-600 dark:text-green-400\">\n -{formatCurrency(booking.pricing.discount, { minimumFractionDigits: 0 })}\n </span>\n </div>\n )}\n <div className=\"flex justify-between border-t border-border-subtle pt-2.5\">\n <span className=\"font-semibold text-text-primary\">Total</span>\n <span className=\"font-bold text-text-primary\">\n {formatCurrency(booking.pricing.total, { minimumFractionDigits: 0 })}\n </span>\n </div>\n </div>\n </div>\n\n {/* Booking Info */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-5\">\n <h3 className=\"text-base font-semibold text-text-primary mb-3\">Booking Info</h3>\n <div className=\"space-y-3\">\n <div className=\"flex items-center gap-2\">\n <CalendarCheck className=\"h-4 w-4 text-text-secondary\" />\n <div>\n <p className=\"text-xs text-text-secondary\">Booked On</p>\n <p className=\"text-sm text-text-primary\">{formatDate(booking.createdAt)}</p>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <Calendar className=\"h-4 w-4 text-text-secondary\" />\n <div>\n <p className=\"text-xs text-text-secondary\">Scheduled</p>\n <p className=\"text-sm text-text-primary\">\n {booking.scheduledDate} at {booking.scheduledTime}\n </p>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <Clock className=\"h-4 w-4 text-text-secondary\" />\n <div>\n <p className=\"text-xs text-text-secondary\">Duration</p>\n <p className=\"text-sm text-text-primary\">{booking.duration} minutes</p>\n </div>\n </div>\n </div>\n </div>\n\n {/* Cancel Button */}\n {canCancel && (\n <button\n type=\"button\"\n className=\"w-full inline-flex items-center justify-center gap-2 rounded-lg border border-red-500/30 bg-red-500/5 px-4 py-3 text-sm font-medium text-red-600 dark:text-red-400 hover:bg-red-500/10 transition-colors\"\n >\n <XCircle className=\"h-4 w-4\" />\n Cancel Booking\n </button>\n )}\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"BookingDetailsPage.js","names":[],"sources":["../../../../src/subscriberbot/pages/customer/BookingDetailsPage.tsx"],"sourcesContent":["/**\n * Booking Details Page\n * @module subscriberbot/pages/customer\n *\n * Detailed view of a service booking with service name, provider info,\n * scheduled date/time, booking status timeline, location info,\n * price breakdown, Contact Support button, Rate Service button (when completed),\n * Cart Information sidebar, cancel button.\n * Uses route param :bookingId from useParams().\n */\n\nimport { useMemo, useState } from 'react';\nimport { useParams } from 'react-router-dom';\nimport {\n ArrowLeft,\n Calendar,\n Clock,\n MapPin,\n Phone,\n Star,\n CheckCircle2,\n Circle,\n XCircle,\n ShoppingBag,\n CalendarCheck,\n AlertTriangle,\n Headphones,\n MessageSquare,\n IndianRupee,\n} from 'lucide-react';\nimport { PageLayout } from '../../components/PageLayout';\nimport { StatusBadge } from '../../components/StatusBadge';\nimport { EmptyState } from '../../components/EmptyState';\nimport { useSubscriberBot } from '../../context/SubscriberBotContext';\nimport { cn } from '../../utils/cn';\nimport { formatCurrency, formatDate } from '../../utils/formatters';\n\n// ============================================================================\n// Types\n// ============================================================================\n\ntype BookingStatus = 'confirmed' | 'in_progress' | 'completed' | 'cancelled';\n\ninterface BookingTimelineEvent {\n status: string;\n label: string;\n timestamp: string | null;\n completed: boolean;\n}\n\ninterface MockBooking {\n id: string;\n serviceName: string;\n serviceDescription: string;\n provider: {\n id: string;\n name: string;\n phone: string;\n rating: number;\n reviewCount: number;\n category: string;\n image: string;\n location: string;\n };\n scheduledDate: string;\n scheduledTime: string;\n duration: number;\n status: BookingStatus;\n location: {\n street: string;\n area: string;\n city: string;\n pincode: string;\n landmark?: string;\n };\n pricing: {\n serviceCharge: number;\n convenienceFee: number;\n tax: number;\n discount: number;\n total: number;\n };\n createdAt: string;\n notes?: string;\n cancellationReason?: string;\n timeline: BookingTimelineEvent[];\n}\n\n// ============================================================================\n// Mock Data\n// ============================================================================\n\nconst mockBookings: MockBooking[] = [\n {\n id: 'BK-001',\n serviceName: \"Men's Haircut + Beard Trim\",\n serviceDescription: 'Professional haircut and beard grooming service at your doorstep',\n provider: {\n id: 'SERV-001',\n name: 'Quick Cuts Salon',\n phone: '+91-9876543210',\n rating: 4.6,\n reviewCount: 248,\n category: 'Personal Care & Beauty',\n image: 'https://images.unsplash.com/photo-1562322140-8baeececf3df?w=400',\n location: 'Indiranagar, Bangalore',\n },\n scheduledDate: '2024-01-20',\n scheduledTime: '10:00 AM',\n duration: 50,\n status: 'confirmed',\n location: {\n street: '123 Main Street',\n area: 'Koramangala',\n city: 'Bangalore',\n pincode: '560034',\n landmark: 'Near Metro Station',\n },\n pricing: {\n serviceCharge: 450,\n convenienceFee: 30,\n tax: 48,\n discount: 50,\n total: 478,\n },\n createdAt: '2024-01-16T14:30:00Z',\n notes: 'Please bring your own equipment',\n timeline: [\n {\n status: 'booked',\n label: 'Booking Placed',\n timestamp: '2024-01-16T14:30:00Z',\n completed: true,\n },\n {\n status: 'confirmed',\n label: 'Booking Confirmed',\n timestamp: '2024-01-16T14:35:00Z',\n completed: true,\n },\n { status: 'in_progress', label: 'Service Started', timestamp: null, completed: false },\n { status: 'completed', label: 'Service Completed', timestamp: null, completed: false },\n ],\n },\n {\n id: 'BK-002',\n serviceName: 'Deep House Cleaning',\n serviceDescription:\n 'Complete house cleaning service including kitchen, bathrooms, and living areas',\n provider: {\n id: 'SERV-005',\n name: 'Spotless Cleaning Services',\n phone: '+91-9876543215',\n rating: 4.8,\n reviewCount: 312,\n category: 'Home Services',\n image: 'https://images.unsplash.com/photo-1558618666-fcd25c85cd64?w=400',\n location: 'Whitefield, Bangalore',\n },\n scheduledDate: '2024-01-18',\n scheduledTime: '09:00 AM',\n duration: 180,\n status: 'completed',\n location: {\n street: '456 Park Avenue',\n area: 'Indiranagar',\n city: 'Bangalore',\n pincode: '560038',\n },\n pricing: {\n serviceCharge: 1500,\n convenienceFee: 50,\n tax: 155,\n discount: 0,\n total: 1705,\n },\n createdAt: '2024-01-15T10:00:00Z',\n timeline: [\n {\n status: 'booked',\n label: 'Booking Placed',\n timestamp: '2024-01-15T10:00:00Z',\n completed: true,\n },\n {\n status: 'confirmed',\n label: 'Booking Confirmed',\n timestamp: '2024-01-15T10:05:00Z',\n completed: true,\n },\n {\n status: 'in_progress',\n label: 'Service Started',\n timestamp: '2024-01-18T09:10:00Z',\n completed: true,\n },\n {\n status: 'completed',\n label: 'Service Completed',\n timestamp: '2024-01-18T12:15:00Z',\n completed: true,\n },\n ],\n },\n {\n id: 'BK-003',\n serviceName: 'Facial Treatment',\n serviceDescription: 'Deep cleansing facial with natural ingredients for glowing skin',\n provider: {\n id: 'SERV-002',\n name: 'Glow Beauty Services',\n phone: '+91-9876543212',\n rating: 4.7,\n reviewCount: 180,\n category: 'Personal Care & Beauty',\n image: 'https://images.unsplash.com/photo-1560066984-138dadb4c035?w=400',\n location: 'HSR Layout, Bangalore',\n },\n scheduledDate: '2024-01-22',\n scheduledTime: '02:00 PM',\n duration: 60,\n status: 'cancelled',\n location: {\n street: '789 Lake View',\n area: 'HSR Layout',\n city: 'Bangalore',\n pincode: '560102',\n },\n pricing: {\n serviceCharge: 800,\n convenienceFee: 30,\n tax: 83,\n discount: 0,\n total: 913,\n },\n createdAt: '2024-01-17T16:00:00Z',\n cancellationReason: 'Schedule conflict - need to reschedule',\n timeline: [\n {\n status: 'booked',\n label: 'Booking Placed',\n timestamp: '2024-01-17T16:00:00Z',\n completed: true,\n },\n {\n status: 'confirmed',\n label: 'Booking Confirmed',\n timestamp: '2024-01-17T16:10:00Z',\n completed: true,\n },\n {\n status: 'cancelled',\n label: 'Booking Cancelled',\n timestamp: '2024-01-18T09:00:00Z',\n completed: true,\n },\n ],\n },\n];\n\nconst getBookingById = (bookingId: string): MockBooking | undefined =>\n mockBookings.find((b) => b.id === bookingId);\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport function BookingDetailsPage() {\n const { bookingId } = useParams<{ bookingId: string }>();\n const { navigateTo } = useSubscriberBot();\n const [statusMessage, setStatusMessage] = useState<string | null>(null);\n\n const booking = useMemo(() => (bookingId ? getBookingById(bookingId) : undefined), [bookingId]);\n\n const showStatus = (msg: string) => {\n setStatusMessage(msg);\n setTimeout(() => setStatusMessage(null), 3000);\n };\n\n if (!booking) {\n return (\n <PageLayout title=\"Booking Not Found\">\n <EmptyState\n illustration=\"empty-generic\"\n icon={<CalendarCheck className=\"h-12 w-12\" />}\n title=\"Booking not found\"\n description={`No booking found with ID \"${bookingId}\".`}\n action={\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/dashboard')}\n className=\"rounded-lg bg-foreground px-4 py-2 text-sm font-medium text-background hover:opacity-90 transition-opacity\"\n >\n Go to Dashboard\n </button>\n }\n />\n </PageLayout>\n );\n }\n\n const isCancelled = booking.status === 'cancelled';\n const isCompleted = booking.status === 'completed';\n const canCancel = !isCancelled && !isCompleted;\n\n const handleContactSupport = () => {\n showStatus('Support team will contact you shortly.');\n };\n\n const handleRateService = () => {\n showStatus('Thank you! Rating feature coming soon.');\n };\n\n return (\n <PageLayout\n title={\n <div className=\"flex items-center gap-3\">\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/dashboard')}\n className=\"rounded-md p-1 text-text-secondary hover:bg-accent hover:text-text-primary transition-colors\"\n >\n <ArrowLeft className=\"h-5 w-5\" />\n </button>\n <span>Booking #{booking.id}</span>\n </div>\n }\n actions={<StatusBadge status={booking.status} />}\n >\n {/* Status message */}\n {statusMessage && (\n <div className=\"mb-4 rounded-lg border border-status-success-border/30 bg-status-success-bg/10 p-3 flex items-center gap-2\">\n <CheckCircle2 className=\"h-4 w-4 text-status-success-text shrink-0\" />\n <p className=\"text-sm text-status-success-text\">{statusMessage}</p>\n </div>\n )}\n\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-3\">\n {/* Left: Main Content */}\n <div className=\"lg:col-span-2 space-y-6\">\n {/* Service Info */}\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-6\">\n <h2 className=\"text-lg font-semibold text-text-primary\">{booking.serviceName}</h2>\n <p className=\"mt-1 text-sm text-text-secondary\">{booking.serviceDescription}</p>\n\n <div className=\"mt-4 flex flex-wrap gap-4 text-sm text-text-secondary\">\n <div className=\"flex items-center gap-1.5\">\n <Calendar className=\"h-4 w-4\" />\n <span>{booking.scheduledDate}</span>\n </div>\n <div className=\"flex items-center gap-1.5\">\n <Clock className=\"h-4 w-4\" />\n <span>{booking.scheduledTime}</span>\n </div>\n <div className=\"flex items-center gap-1.5\">\n <Clock className=\"h-4 w-4\" />\n <span>{booking.duration} min</span>\n </div>\n </div>\n\n {booking.notes && (\n <div className=\"mt-4 rounded-md bg-bg-sunken p-3\">\n <p className=\"text-xs text-text-secondary mb-1\">Notes</p>\n <p className=\"text-sm text-text-primary\">{booking.notes}</p>\n </div>\n )}\n\n {booking.cancellationReason && (\n <div className=\"mt-4 rounded-md bg-status-error-bg/5 border border-status-error-border/20 p-3\">\n <div className=\"flex items-center gap-2 mb-1\">\n <AlertTriangle className=\"h-3.5 w-3.5 text-status-error-text\" />\n <p className=\"text-xs font-medium text-status-error-text\">Cancellation Reason</p>\n </div>\n <p className=\"text-sm text-text-primary\">{booking.cancellationReason}</p>\n </div>\n )}\n </div>\n\n {/* Provider Info */}\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-6\">\n <h2 className=\"text-base font-semibold text-text-primary mb-4\">Service Provider</h2>\n <div className=\"flex items-center gap-4\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-full bg-bg-sunken text-text-secondary\">\n <ShoppingBag className=\"h-6 w-6\" />\n </div>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-semibold text-text-primary\">{booking.provider.name}</p>\n <p className=\"text-xs text-text-secondary\">{booking.provider.category}</p>\n <div className=\"flex items-center gap-1 mt-1\">\n <Star className=\"h-3 w-3 fill-status-warning-text text-status-warning-text\" />\n <span className=\"text-xs font-medium text-text-primary\">\n {booking.provider.rating}\n </span>\n </div>\n </div>\n <a\n href={`tel:${booking.provider.phone}`}\n className=\"flex h-10 w-10 items-center justify-center rounded-full bg-bg-sunken text-text-secondary hover:bg-accent hover:text-text-primary transition-colors\"\n >\n <Phone className=\"h-4 w-4\" />\n </a>\n </div>\n <div className=\"mt-3 flex items-center gap-2 text-sm text-text-secondary\">\n <Phone className=\"h-4 w-4 shrink-0\" />\n <span>{booking.provider.phone}</span>\n </div>\n </div>\n\n {/* Booking Status Timeline */}\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-6\">\n <h2 className=\"text-base font-semibold text-text-primary mb-5\">Booking Timeline</h2>\n <div className=\"relative\">\n {booking.timeline.map((event, index) => {\n const isLast = index === booking.timeline.length - 1;\n const isCancelledEvent = event.status === 'cancelled';\n const Icon = isCancelledEvent ? XCircle : event.completed ? CheckCircle2 : Circle;\n\n return (\n <div key={`${event.status}-${index}`} className=\"flex gap-4\">\n <div className=\"flex flex-col items-center\">\n <div\n className={cn(\n 'flex h-8 w-8 shrink-0 items-center justify-center rounded-full',\n isCancelledEvent\n ? 'bg-status-error-bg/10 text-status-error-text'\n : event.completed\n ? 'bg-status-success-bg/10 text-status-success-text'\n : 'bg-bg-sunken text-text-secondary'\n )}\n >\n <Icon className=\"h-4 w-4\" />\n </div>\n {!isLast && (\n <div\n className={cn(\n 'w-0.5 flex-1 my-1',\n event.completed ? 'bg-status-success-bg/30' : 'bg-border'\n )}\n />\n )}\n </div>\n <div className={cn('pb-6', isLast && 'pb-0')}>\n <p className=\"text-sm font-medium text-text-primary\">{event.label}</p>\n <p className=\"mt-0.5 text-xs text-text-secondary\">\n {event.timestamp ? formatDate(event.timestamp) : 'Pending'}\n </p>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n\n {/* Action Buttons: Contact Support + Rate Service */}\n <div className=\"flex flex-col sm:flex-row gap-3\">\n <button\n type=\"button\"\n onClick={handleContactSupport}\n className=\"flex-1 flex items-center justify-center gap-2 rounded-lg border border-border-seam px-4 py-3 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n <Headphones className=\"h-4 w-4\" />\n Contact Support\n </button>\n\n {isCompleted && (\n <button\n type=\"button\"\n onClick={handleRateService}\n className=\"flex-1 flex items-center justify-center gap-2 rounded-lg bg-foreground px-4 py-3 text-sm font-medium text-background hover:opacity-90 transition-opacity\"\n >\n <Star className=\"h-4 w-4\" />\n Rate Service\n </button>\n )}\n </div>\n </div>\n\n {/* Right: Sidebar */}\n <div className=\"space-y-6\">\n {/* Cart Information */}\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-5\">\n <h3 className=\"text-base font-semibold text-text-primary mb-3\">Cart Information</h3>\n <div className=\"flex items-center gap-3 mb-4\">\n <img\n src={booking.provider.image}\n alt={booking.provider.name}\n className=\"h-14 w-14 rounded-lg object-cover\"\n />\n <div className=\"min-w-0\">\n <p className=\"text-sm font-semibold text-text-primary\">{booking.provider.name}</p>\n <p className=\"text-xs text-text-secondary\">{booking.provider.category}</p>\n <div className=\"flex items-center gap-1 mt-0.5\">\n <Star className=\"h-3 w-3 fill-status-warning-text text-status-warning-text\" />\n <span className=\"text-xs font-medium text-text-primary\">\n {booking.provider.rating}\n </span>\n <span className=\"text-xs text-text-secondary\">\n ({booking.provider.reviewCount})\n </span>\n </div>\n </div>\n </div>\n\n <div className=\"space-y-2 text-sm mb-4\">\n <div className=\"flex items-start gap-2\">\n <MapPin className=\"h-4 w-4 text-text-secondary shrink-0 mt-0.5\" />\n <span className=\"text-text-secondary\">{booking.provider.location}</span>\n </div>\n </div>\n\n <button\n type=\"button\"\n onClick={() => navigateTo(`/customer/carts/${booking.provider.id}`)}\n className=\"w-full rounded-lg border border-border-seam px-4 py-2.5 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n View Cart Menu\n </button>\n </div>\n\n {/* Location Info */}\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-5\">\n <h3 className=\"text-base font-semibold text-text-primary mb-3\">Service Location</h3>\n <div className=\"flex items-start gap-3\">\n <MapPin className=\"mt-0.5 h-5 w-5 shrink-0 text-text-secondary\" />\n <div>\n <p className=\"text-sm text-text-primary\">{booking.location.street}</p>\n <p className=\"text-sm text-text-secondary\">\n {booking.location.area}, {booking.location.city} - {booking.location.pincode}\n </p>\n {booking.location.landmark && (\n <p className=\"text-xs text-text-secondary mt-1\">\n Landmark: {booking.location.landmark}\n </p>\n )}\n </div>\n </div>\n </div>\n\n {/* Price Breakdown */}\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-5\">\n <h3 className=\"text-base font-semibold text-text-primary mb-3\">Price Breakdown</h3>\n <div className=\"space-y-2.5 text-sm\">\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">Service Charge</span>\n <span className=\"text-text-primary\">\n {formatCurrency(booking.pricing.serviceCharge, { minimumFractionDigits: 0 })}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">Convenience Fee</span>\n <span className=\"text-text-primary\">\n {formatCurrency(booking.pricing.convenienceFee, { minimumFractionDigits: 0 })}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">Tax</span>\n <span className=\"text-text-primary\">\n {formatCurrency(booking.pricing.tax, { minimumFractionDigits: 0 })}\n </span>\n </div>\n {booking.pricing.discount > 0 && (\n <div className=\"flex justify-between\">\n <span className=\"text-status-success-text\">Discount</span>\n <span className=\"text-status-success-text\">\n -{formatCurrency(booking.pricing.discount, { minimumFractionDigits: 0 })}\n </span>\n </div>\n )}\n <div className=\"flex justify-between border-t border-border-seam pt-2.5\">\n <span className=\"font-semibold text-text-primary\">Total</span>\n <span className=\"font-bold text-text-primary\">\n {formatCurrency(booking.pricing.total, { minimumFractionDigits: 0 })}\n </span>\n </div>\n </div>\n </div>\n\n {/* Booking Info */}\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-5\">\n <h3 className=\"text-base font-semibold text-text-primary mb-3\">Booking Info</h3>\n <div className=\"space-y-3\">\n <div className=\"flex items-center gap-2\">\n <CalendarCheck className=\"h-4 w-4 text-text-secondary\" />\n <div>\n <p className=\"text-xs text-text-secondary\">Booked On</p>\n <p className=\"text-sm text-text-primary\">{formatDate(booking.createdAt)}</p>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <Calendar className=\"h-4 w-4 text-text-secondary\" />\n <div>\n <p className=\"text-xs text-text-secondary\">Scheduled</p>\n <p className=\"text-sm text-text-primary\">\n {booking.scheduledDate} at {booking.scheduledTime}\n </p>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <Clock className=\"h-4 w-4 text-text-secondary\" />\n <div>\n <p className=\"text-xs text-text-secondary\">Duration</p>\n <p className=\"text-sm text-text-primary\">{booking.duration} minutes</p>\n </div>\n </div>\n </div>\n </div>\n\n {/* Cancel Button */}\n {canCancel && (\n <button\n type=\"button\"\n className=\"w-full inline-flex items-center justify-center gap-2 rounded-lg border border-status-error-border/30 bg-status-error-bg/5 px-4 py-3 text-sm font-medium text-status-error-text hover:bg-status-error-bg/10 transition-colors\"\n >\n <XCircle className=\"h-4 w-4\" />\n Cancel Booking\n </button>\n )}\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|
|
@@ -76,7 +76,7 @@ function A() {
|
|
|
76
76
|
className: "truncate",
|
|
77
77
|
children: F.name
|
|
78
78
|
}),
|
|
79
|
-
F.isVerified && /* @__PURE__ */ O(m, { className: "h-5 w-5 text-
|
|
79
|
+
F.isVerified && /* @__PURE__ */ O(m, { className: "h-5 w-5 text-status-info-text shrink-0" })
|
|
80
80
|
]
|
|
81
81
|
}),
|
|
82
82
|
description: F.category,
|
|
@@ -92,18 +92,18 @@ function A() {
|
|
|
92
92
|
children: /* @__PURE__ */ k("div", {
|
|
93
93
|
className: "flex items-center gap-3",
|
|
94
94
|
children: [/* @__PURE__ */ O("span", {
|
|
95
|
-
className: t("inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium", F.isOpen ? "bg-
|
|
95
|
+
className: t("inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium", F.isOpen ? "bg-status-success-bg/20 text-status-success-text" : "bg-status-error-bg/20 text-status-error-text"),
|
|
96
96
|
children: F.isOpen ? "Open Now" : "Closed"
|
|
97
97
|
}), /* @__PURE__ */ k("div", {
|
|
98
|
-
className: "flex items-center gap-1 text-
|
|
98
|
+
className: "flex items-center gap-1 text-text-inverse text-sm",
|
|
99
99
|
children: [
|
|
100
|
-
/* @__PURE__ */ O(w, { className: "h-3.5 w-3.5 fill-
|
|
100
|
+
/* @__PURE__ */ O(w, { className: "h-3.5 w-3.5 fill-status-warning-text text-status-warning-text" }),
|
|
101
101
|
/* @__PURE__ */ O("span", {
|
|
102
102
|
className: "font-medium",
|
|
103
103
|
children: F.rating
|
|
104
104
|
}),
|
|
105
105
|
/* @__PURE__ */ k("span", {
|
|
106
|
-
className: "text-
|
|
106
|
+
className: "text-text-inverse/70",
|
|
107
107
|
children: [
|
|
108
108
|
"(",
|
|
109
109
|
F.totalRatings,
|
|
@@ -116,9 +116,9 @@ function A() {
|
|
|
116
116
|
})]
|
|
117
117
|
}),
|
|
118
118
|
!F.isOpen && /* @__PURE__ */ O("div", {
|
|
119
|
-
className: "mt-4 rounded-lg border border-
|
|
119
|
+
className: "mt-4 rounded-lg border border-status-warning-border/30 bg-status-warning-bg/10 p-3",
|
|
120
120
|
children: /* @__PURE__ */ k("p", {
|
|
121
|
-
className: "text-sm text-
|
|
121
|
+
className: "text-sm text-status-warning-text",
|
|
122
122
|
children: [/* @__PURE__ */ O("strong", { children: "This cart is currently closed." }), " You can browse the offerings but orders are not being accepted."]
|
|
123
123
|
})
|
|
124
124
|
}),
|
|
@@ -126,7 +126,7 @@ function A() {
|
|
|
126
126
|
className: "mt-4 grid grid-cols-1 gap-3 sm:grid-cols-3",
|
|
127
127
|
children: [
|
|
128
128
|
/* @__PURE__ */ k("div", {
|
|
129
|
-
className: "rounded-lg border border-border-
|
|
129
|
+
className: "rounded-lg border border-border-seam bg-bg-surface p-3",
|
|
130
130
|
children: [
|
|
131
131
|
/* @__PURE__ */ k("div", {
|
|
132
132
|
className: "flex items-center gap-2 text-text-secondary text-xs mb-1",
|
|
@@ -146,7 +146,7 @@ function A() {
|
|
|
146
146
|
]
|
|
147
147
|
}),
|
|
148
148
|
/* @__PURE__ */ k("div", {
|
|
149
|
-
className: "rounded-lg border border-border-
|
|
149
|
+
className: "rounded-lg border border-border-seam bg-bg-surface p-3",
|
|
150
150
|
children: [
|
|
151
151
|
/* @__PURE__ */ k("div", {
|
|
152
152
|
className: "flex items-center gap-2 text-text-secondary text-xs mb-1",
|
|
@@ -166,7 +166,7 @@ function A() {
|
|
|
166
166
|
]
|
|
167
167
|
}),
|
|
168
168
|
/* @__PURE__ */ k("div", {
|
|
169
|
-
className: "rounded-lg border border-border-
|
|
169
|
+
className: "rounded-lg border border-border-seam bg-bg-surface p-3",
|
|
170
170
|
children: [
|
|
171
171
|
/* @__PURE__ */ k("div", {
|
|
172
172
|
className: "flex items-center gap-2 text-text-secondary text-xs mb-1",
|
|
@@ -193,9 +193,9 @@ function A() {
|
|
|
193
193
|
className: "text-base font-semibold text-text-primary mb-2",
|
|
194
194
|
children: "Operating Hours"
|
|
195
195
|
}), /* @__PURE__ */ O("div", {
|
|
196
|
-
className: "rounded-lg border border-border-
|
|
196
|
+
className: "rounded-lg border border-border-seam bg-bg-surface overflow-hidden",
|
|
197
197
|
children: Object.entries(F.businessHours).map(([e, t]) => /* @__PURE__ */ k("div", {
|
|
198
|
-
className: "flex items-center justify-between px-4 py-2 border-b border-border-
|
|
198
|
+
className: "flex items-center justify-between px-4 py-2 border-b border-border-seam last:border-b-0",
|
|
199
199
|
children: [/* @__PURE__ */ O("span", {
|
|
200
200
|
className: "text-sm font-medium text-text-primary capitalize",
|
|
201
201
|
children: e
|
|
@@ -227,12 +227,12 @@ function A() {
|
|
|
227
227
|
placeholder: "Search offerings...",
|
|
228
228
|
value: L,
|
|
229
229
|
onChange: (e) => R(e.target.value),
|
|
230
|
-
className: "w-full rounded-lg border border-border-
|
|
230
|
+
className: "w-full rounded-lg border border-border-seam bg-bg-surface py-2 pl-10 pr-3 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]"
|
|
231
231
|
})]
|
|
232
232
|
}), /* @__PURE__ */ k("select", {
|
|
233
233
|
value: z,
|
|
234
234
|
onChange: (e) => B(e.target.value),
|
|
235
|
-
className: "rounded-lg border border-border-
|
|
235
|
+
className: "rounded-lg border border-border-seam bg-bg-surface px-3 py-2 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]",
|
|
236
236
|
children: [/* @__PURE__ */ O("option", {
|
|
237
237
|
value: "",
|
|
238
238
|
children: "All Categories"
|
|
@@ -251,7 +251,7 @@ function A() {
|
|
|
251
251
|
]
|
|
252
252
|
}),
|
|
253
253
|
Y.length === 0 ? /* @__PURE__ */ k("div", {
|
|
254
|
-
className: "rounded-lg border border-border-
|
|
254
|
+
className: "rounded-lg border border-border-seam bg-bg-surface p-8 text-center",
|
|
255
255
|
children: [/* @__PURE__ */ O(S, { className: "mx-auto h-10 w-10 text-text-secondary/50" }), /* @__PURE__ */ O("p", {
|
|
256
256
|
className: "mt-3 text-sm text-text-secondary",
|
|
257
257
|
children: "No offerings found"
|
|
@@ -266,7 +266,7 @@ function A() {
|
|
|
266
266
|
children: n.map((e) => {
|
|
267
267
|
let n = ie(e.id);
|
|
268
268
|
return /* @__PURE__ */ k("div", {
|
|
269
|
-
className: "flex gap-4 rounded-lg border border-border-
|
|
269
|
+
className: "flex gap-4 rounded-lg border border-border-seam bg-bg-surface p-4",
|
|
270
270
|
children: [/* @__PURE__ */ O("div", {
|
|
271
271
|
className: "h-20 w-20 shrink-0 rounded-md bg-bg-sunken overflow-hidden",
|
|
272
272
|
children: /* @__PURE__ */ O("img", {
|
|
@@ -284,7 +284,7 @@ function A() {
|
|
|
284
284
|
children: [/* @__PURE__ */ O("h4", {
|
|
285
285
|
className: "text-sm font-semibold text-text-primary",
|
|
286
286
|
children: e.name
|
|
287
|
-
}), e.isVeg && /* @__PURE__ */ O(v, { className: "h-3.5 w-3.5 text-
|
|
287
|
+
}), e.isVeg && /* @__PURE__ */ O(v, { className: "h-3.5 w-3.5 text-status-success-text" })]
|
|
288
288
|
}), /* @__PURE__ */ O("p", {
|
|
289
289
|
className: "text-xs text-text-secondary mt-0.5",
|
|
290
290
|
children: e.category
|
|
@@ -361,7 +361,7 @@ function A() {
|
|
|
361
361
|
className: "space-y-4",
|
|
362
362
|
children: [
|
|
363
363
|
/* @__PURE__ */ k("div", {
|
|
364
|
-
className: "rounded-lg border border-border-
|
|
364
|
+
className: "rounded-lg border border-border-seam bg-bg-surface p-4 lg:sticky lg:top-6",
|
|
365
365
|
children: [/* @__PURE__ */ k("h3", {
|
|
366
366
|
className: "text-base font-semibold text-text-primary mb-3 flex items-center gap-2",
|
|
367
367
|
children: [/* @__PURE__ */ O(C, { className: "h-4 w-4" }), "Your Order"]
|
|
@@ -418,7 +418,7 @@ function A() {
|
|
|
418
418
|
})]
|
|
419
419
|
}, e.id))
|
|
420
420
|
}), /* @__PURE__ */ k("div", {
|
|
421
|
-
className: "border-t border-border-
|
|
421
|
+
className: "border-t border-border-seam pt-3",
|
|
422
422
|
children: [/* @__PURE__ */ k("div", {
|
|
423
423
|
className: "flex justify-between items-center mb-3",
|
|
424
424
|
children: [/* @__PURE__ */ k("span", {
|
|
@@ -437,11 +437,11 @@ function A() {
|
|
|
437
437
|
})] })]
|
|
438
438
|
}),
|
|
439
439
|
F.serviceTypes?.includes("direct_service") && /* @__PURE__ */ k("div", {
|
|
440
|
-
className: "rounded-lg border border-purple
|
|
440
|
+
className: "rounded-lg border border-accent-purple/30 bg-accent-purple-subtle p-4",
|
|
441
441
|
children: [
|
|
442
442
|
/* @__PURE__ */ k("h3", {
|
|
443
443
|
className: "text-sm font-semibold text-text-primary flex items-center gap-2 mb-2",
|
|
444
|
-
children: [/* @__PURE__ */ O(_, { className: "h-4 w-4 text-
|
|
444
|
+
children: [/* @__PURE__ */ O(_, { className: "h-4 w-4 text-accent-purple" }), "Direct Service"]
|
|
445
445
|
}),
|
|
446
446
|
/* @__PURE__ */ O("p", {
|
|
447
447
|
className: "text-xs text-text-secondary mb-3",
|
|
@@ -450,27 +450,27 @@ function A() {
|
|
|
450
450
|
/* @__PURE__ */ O("button", {
|
|
451
451
|
type: "button",
|
|
452
452
|
onClick: () => j(`/customer/carts/${F.id}`),
|
|
453
|
-
className: "w-full rounded-lg bg-purple
|
|
453
|
+
className: "w-full rounded-lg bg-accent-purple py-2 text-xs font-medium text-text-inverse hover:bg-accent-purple transition-colors",
|
|
454
454
|
children: "Book Direct Service"
|
|
455
455
|
})
|
|
456
456
|
]
|
|
457
457
|
}),
|
|
458
458
|
F.serviceTypes?.includes("appointment") && /* @__PURE__ */ k("div", {
|
|
459
|
-
className: "rounded-lg border border-
|
|
459
|
+
className: "rounded-lg border border-status-info-border/30 bg-status-info-bg/10 p-4",
|
|
460
460
|
children: [/* @__PURE__ */ k("h3", {
|
|
461
461
|
className: "text-sm font-semibold text-text-primary flex items-center gap-2 mb-2",
|
|
462
|
-
children: [/* @__PURE__ */ O(p, { className: "h-4 w-4 text-
|
|
462
|
+
children: [/* @__PURE__ */ O(p, { className: "h-4 w-4 text-status-info-text" }), "Appointments Available"]
|
|
463
463
|
}), /* @__PURE__ */ O("p", {
|
|
464
464
|
className: "text-xs text-text-secondary",
|
|
465
465
|
children: "This service provider accepts appointments. Contact them to schedule."
|
|
466
466
|
})]
|
|
467
467
|
}),
|
|
468
468
|
I && /* @__PURE__ */ k("div", {
|
|
469
|
-
className: "rounded-lg border border-
|
|
469
|
+
className: "rounded-lg border border-status-success-border/30 bg-status-success-bg/10 p-4",
|
|
470
470
|
children: [
|
|
471
471
|
/* @__PURE__ */ k("h3", {
|
|
472
472
|
className: "text-sm font-semibold text-text-primary flex items-center gap-2 mb-2",
|
|
473
|
-
children: [/* @__PURE__ */ O(ee, { className: "h-4 w-4 text-
|
|
473
|
+
children: [/* @__PURE__ */ O(ee, { className: "h-4 w-4 text-status-success-text" }), "Investment Opportunity"]
|
|
474
474
|
}),
|
|
475
475
|
/* @__PURE__ */ O("p", {
|
|
476
476
|
className: "text-xs text-text-secondary mb-2",
|
|
@@ -496,7 +496,7 @@ function A() {
|
|
|
496
496
|
/* @__PURE__ */ O("button", {
|
|
497
497
|
type: "button",
|
|
498
498
|
onClick: () => alert("Navigate to investor section to fund this business."),
|
|
499
|
-
className: "w-full rounded-lg bg-
|
|
499
|
+
className: "w-full rounded-lg bg-status-success-text py-2 text-xs font-medium text-text-inverse hover:bg-status-success-text transition-colors",
|
|
500
500
|
children: "Fund This Business"
|
|
501
501
|
})
|
|
502
502
|
]
|
|
@@ -505,9 +505,9 @@ function A() {
|
|
|
505
505
|
})]
|
|
506
506
|
}),
|
|
507
507
|
U && G && /* @__PURE__ */ O("div", {
|
|
508
|
-
className: "fixed inset-0 z-50 flex items-center justify-center bg-
|
|
508
|
+
className: "fixed inset-0 z-50 flex items-center justify-center bg-bg-canvas/50 p-4",
|
|
509
509
|
children: /* @__PURE__ */ O("div", {
|
|
510
|
-
className: "w-full max-w-md max-h-[90vh] overflow-y-auto rounded-lg border border-border-
|
|
510
|
+
className: "w-full max-w-md max-h-[90vh] overflow-y-auto rounded-lg border border-border-seam bg-bg-surface",
|
|
511
511
|
children: /* @__PURE__ */ k("div", {
|
|
512
512
|
className: "p-5",
|
|
513
513
|
children: [
|
|
@@ -578,7 +578,7 @@ function A() {
|
|
|
578
578
|
specialInstructions: e.target.value
|
|
579
579
|
}),
|
|
580
580
|
placeholder: "Any special requests...",
|
|
581
|
-
className: "w-full rounded-lg border border-border-
|
|
581
|
+
className: "w-full rounded-lg border border-border-seam bg-bg-surface p-3 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]",
|
|
582
582
|
rows: 3
|
|
583
583
|
})]
|
|
584
584
|
}),
|
|
@@ -602,6 +602,7 @@ function A() {
|
|
|
602
602
|
}) : /* @__PURE__ */ O(n, {
|
|
603
603
|
title: "Cart Not Found",
|
|
604
604
|
children: /* @__PURE__ */ O(r, {
|
|
605
|
+
illustration: "empty-generic",
|
|
605
606
|
icon: /* @__PURE__ */ O(C, { className: "h-12 w-12" }),
|
|
606
607
|
title: "Cart not found",
|
|
607
608
|
description: `No cart found with ID "${A}".`,
|