@burdenoff/microfe-adaptercloud 2026.614.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/README.md +12 -0
- package/dist/adaptercloud/AdapterCloudRoot.js +177 -0
- package/dist/adaptercloud/AdapterCloudRoot.js.map +1 -0
- package/dist/adaptercloud/AdapterCloudRoutes.js +215 -0
- package/dist/adaptercloud/AdapterCloudRoutes.js.map +1 -0
- package/dist/adaptercloud/components/EmptyState.js +28 -0
- package/dist/adaptercloud/components/EmptyState.js.map +1 -0
- package/dist/adaptercloud/components/InvestmentCard.js +96 -0
- package/dist/adaptercloud/components/InvestmentCard.js.map +1 -0
- package/dist/adaptercloud/components/MetricsCard.js +46 -0
- package/dist/adaptercloud/components/MetricsCard.js.map +1 -0
- package/dist/adaptercloud/components/PageLayout.js +26 -0
- package/dist/adaptercloud/components/PageLayout.js.map +1 -0
- package/dist/adaptercloud/components/RatingDisplay.js +35 -0
- package/dist/adaptercloud/components/RatingDisplay.js.map +1 -0
- package/dist/adaptercloud/components/StatusBadge.js +45 -0
- package/dist/adaptercloud/components/StatusBadge.js.map +1 -0
- package/dist/adaptercloud/context/AdapterCloudContext.js +93 -0
- package/dist/adaptercloud/context/AdapterCloudContext.js.map +1 -0
- package/dist/adaptercloud/context/index.js +1 -0
- package/dist/adaptercloud/hooks/useAdapterCloudApi.js +223 -0
- package/dist/adaptercloud/hooks/useAdapterCloudApi.js.map +1 -0
- package/dist/adaptercloud/index.js +7 -0
- package/dist/adaptercloud/mocks/data.js +1517 -0
- package/dist/adaptercloud/mocks/data.js.map +1 -0
- package/dist/adaptercloud/mocks/users.js +34 -0
- package/dist/adaptercloud/mocks/users.js.map +1 -0
- package/dist/adaptercloud/pages/HomePage.js +921 -0
- package/dist/adaptercloud/pages/HomePage.js.map +1 -0
- package/dist/adaptercloud/pages/admin/AdminAnalyticsPage.js +645 -0
- package/dist/adaptercloud/pages/admin/AdminAnalyticsPage.js.map +1 -0
- package/dist/adaptercloud/pages/admin/AdminDashboard.js +639 -0
- package/dist/adaptercloud/pages/admin/AdminDashboard.js.map +1 -0
- package/dist/adaptercloud/pages/admin/AdminFinancialPage.js +421 -0
- package/dist/adaptercloud/pages/admin/AdminFinancialPage.js.map +1 -0
- package/dist/adaptercloud/pages/admin/AdminOrdersPage.js +660 -0
- package/dist/adaptercloud/pages/admin/AdminOrdersPage.js.map +1 -0
- package/dist/adaptercloud/pages/admin/AdminProfilePage.js +259 -0
- package/dist/adaptercloud/pages/admin/AdminProfilePage.js.map +1 -0
- package/dist/adaptercloud/pages/admin/AdminSettingsPage.js +649 -0
- package/dist/adaptercloud/pages/admin/AdminSettingsPage.js.map +1 -0
- package/dist/adaptercloud/pages/admin/CartManagementPage.js +869 -0
- package/dist/adaptercloud/pages/admin/CartManagementPage.js.map +1 -0
- package/dist/adaptercloud/pages/admin/UserManagementPage.js +893 -0
- package/dist/adaptercloud/pages/admin/UserManagementPage.js.map +1 -0
- package/dist/adaptercloud/pages/cart-owner/AnalyticsDashboard.js +834 -0
- package/dist/adaptercloud/pages/cart-owner/AnalyticsDashboard.js.map +1 -0
- package/dist/adaptercloud/pages/cart-owner/BusinessSettingsPage.js +700 -0
- package/dist/adaptercloud/pages/cart-owner/BusinessSettingsPage.js.map +1 -0
- package/dist/adaptercloud/pages/cart-owner/CartOwnerDashboard.js +760 -0
- package/dist/adaptercloud/pages/cart-owner/CartOwnerDashboard.js.map +1 -0
- package/dist/adaptercloud/pages/cart-owner/CartOwnerProfilePage.js +886 -0
- package/dist/adaptercloud/pages/cart-owner/CartOwnerProfilePage.js.map +1 -0
- package/dist/adaptercloud/pages/cart-owner/CartServiceConfigPage.js +631 -0
- package/dist/adaptercloud/pages/cart-owner/CartServiceConfigPage.js.map +1 -0
- package/dist/adaptercloud/pages/cart-owner/InventoryManagementPage.js +913 -0
- package/dist/adaptercloud/pages/cart-owner/InventoryManagementPage.js.map +1 -0
- package/dist/adaptercloud/pages/cart-owner/OrderManagementPage.js +881 -0
- package/dist/adaptercloud/pages/cart-owner/OrderManagementPage.js.map +1 -0
- package/dist/adaptercloud/pages/cart-owner/StaffManagementPage.js +833 -0
- package/dist/adaptercloud/pages/cart-owner/StaffManagementPage.js.map +1 -0
- package/dist/adaptercloud/pages/common/HelpSupportPage.js +1325 -0
- package/dist/adaptercloud/pages/common/HelpSupportPage.js.map +1 -0
- package/dist/adaptercloud/pages/common/NotificationCenterPage.js +665 -0
- package/dist/adaptercloud/pages/common/NotificationCenterPage.js.map +1 -0
- package/dist/adaptercloud/pages/common/SettingsPage.js +964 -0
- package/dist/adaptercloud/pages/common/SettingsPage.js.map +1 -0
- package/dist/adaptercloud/pages/customer/BookingDetailsPage.js +593 -0
- package/dist/adaptercloud/pages/customer/BookingDetailsPage.js.map +1 -0
- package/dist/adaptercloud/pages/customer/CartDetailPage.js +620 -0
- package/dist/adaptercloud/pages/customer/CartDetailPage.js.map +1 -0
- package/dist/adaptercloud/pages/customer/CartDiscoveryPage.js +547 -0
- package/dist/adaptercloud/pages/customer/CartDiscoveryPage.js.map +1 -0
- package/dist/adaptercloud/pages/customer/CheckoutPage.js +532 -0
- package/dist/adaptercloud/pages/customer/CheckoutPage.js.map +1 -0
- package/dist/adaptercloud/pages/customer/CustomerDashboard.js +496 -0
- package/dist/adaptercloud/pages/customer/CustomerDashboard.js.map +1 -0
- package/dist/adaptercloud/pages/customer/CustomerProfilePage.js +621 -0
- package/dist/adaptercloud/pages/customer/CustomerProfilePage.js.map +1 -0
- package/dist/adaptercloud/pages/customer/DirectServiceBookingPage.js +623 -0
- package/dist/adaptercloud/pages/customer/DirectServiceBookingPage.js.map +1 -0
- package/dist/adaptercloud/pages/customer/FavoritesPage.js +477 -0
- package/dist/adaptercloud/pages/customer/FavoritesPage.js.map +1 -0
- package/dist/adaptercloud/pages/customer/OrderHistoryPage.js +438 -0
- package/dist/adaptercloud/pages/customer/OrderHistoryPage.js.map +1 -0
- package/dist/adaptercloud/pages/customer/OrderTrackingPage.js +388 -0
- package/dist/adaptercloud/pages/customer/OrderTrackingPage.js.map +1 -0
- package/dist/adaptercloud/pages/customer/PaymentMethodsPage.js +488 -0
- package/dist/adaptercloud/pages/customer/PaymentMethodsPage.js.map +1 -0
- package/dist/adaptercloud/pages/customer/ReviewsPage.js +606 -0
- package/dist/adaptercloud/pages/customer/ReviewsPage.js.map +1 -0
- package/dist/adaptercloud/pages/customer/SavedAddressesPage.js +443 -0
- package/dist/adaptercloud/pages/customer/SavedAddressesPage.js.map +1 -0
- package/dist/adaptercloud/pages/investor/InvestmentDetailsPage.js +849 -0
- package/dist/adaptercloud/pages/investor/InvestmentDetailsPage.js.map +1 -0
- package/dist/adaptercloud/pages/investor/InvestmentOpportunitiesPage.js +939 -0
- package/dist/adaptercloud/pages/investor/InvestmentOpportunitiesPage.js.map +1 -0
- package/dist/adaptercloud/pages/investor/InvestorAnalyticsPage.js +681 -0
- package/dist/adaptercloud/pages/investor/InvestorAnalyticsPage.js.map +1 -0
- package/dist/adaptercloud/pages/investor/InvestorDashboard.js +419 -0
- package/dist/adaptercloud/pages/investor/InvestorDashboard.js.map +1 -0
- package/dist/adaptercloud/pages/investor/InvestorInvestmentsPage.js +399 -0
- package/dist/adaptercloud/pages/investor/InvestorInvestmentsPage.js.map +1 -0
- package/dist/adaptercloud/pages/investor/InvestorPortfolioPage.js +569 -0
- package/dist/adaptercloud/pages/investor/InvestorPortfolioPage.js.map +1 -0
- package/dist/adaptercloud/pages/investor/InvestorProfilePage.js +1065 -0
- package/dist/adaptercloud/pages/investor/InvestorProfilePage.js.map +1 -0
- package/dist/adaptercloud/pages/worker/TaskDetailsPage.js +496 -0
- package/dist/adaptercloud/pages/worker/TaskDetailsPage.js.map +1 -0
- package/dist/adaptercloud/pages/worker/WorkerDashboard.js +634 -0
- package/dist/adaptercloud/pages/worker/WorkerDashboard.js.map +1 -0
- package/dist/adaptercloud/pages/worker/WorkerOrdersPage.js +675 -0
- package/dist/adaptercloud/pages/worker/WorkerOrdersPage.js.map +1 -0
- package/dist/adaptercloud/pages/worker/WorkerProfilePage.js +687 -0
- package/dist/adaptercloud/pages/worker/WorkerProfilePage.js.map +1 -0
- package/dist/adaptercloud/pages/worker/WorkerSchedulePage.js +578 -0
- package/dist/adaptercloud/pages/worker/WorkerSchedulePage.js.map +1 -0
- package/dist/adaptercloud/store/adaptercloudStore.js +38 -0
- package/dist/adaptercloud/store/adaptercloudStore.js.map +1 -0
- package/dist/adaptercloud/store/index.js +1 -0
- package/dist/adaptercloud/utils/cn.js +10 -0
- package/dist/adaptercloud/utils/cn.js.map +1 -0
- package/dist/adaptercloud/utils/formatters.js +51 -0
- package/dist/adaptercloud/utils/formatters.js.map +1 -0
- package/dist/adaptercloud/utils/navigation.js +9 -0
- package/dist/adaptercloud/utils/navigation.js.map +1 -0
- package/dist/index.js +7 -0
- package/dist/node_modules/.bun/clsx@2.1.1/node_modules/clsx/dist/clsx.js +18 -0
- package/dist/node_modules/.bun/clsx@2.1.1/node_modules/clsx/dist/clsx.js.map +1 -0
- package/dist/node_modules/.bun/tailwind-merge@3.5.0/node_modules/tailwind-merge/dist/bundle-mjs.js +1674 -0
- package/dist/node_modules/.bun/tailwind-merge@3.5.0/node_modules/tailwind-merge/dist/bundle-mjs.js.map +1 -0
- package/package.json +106 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkerSchedulePage.js","names":[],"sources":["../../../../src/adaptercloud/pages/worker/WorkerSchedulePage.tsx"],"sourcesContent":["/**\n * Worker Schedule Page\n *\n * Full-featured schedule page with:\n * - Loading state\n * - 3 tabs: My Schedule, Shift Requests, Availability\n * - Week navigation with Previous/Next buttons and date range display\n * - Shift cards with date, time, cart, location, status, earnings, rating, tasks\n * - Check In/Check Out buttons for scheduled/ongoing shifts\n * - Shift Requests tab: list with Accept/Reject for pending\n * - Availability tab: 7-day editor with checkboxes and time pickers + Save button\n * - Stats: Hours This Week, Shifts This Week, Week Earnings, Next Shift\n *\n * @module adaptercloud/pages/worker\n */\n\nimport { useState, useEffect, useMemo } from 'react';\nimport {\n Calendar,\n ShoppingCart,\n CheckCircle2,\n PlayCircle,\n ChevronLeft,\n ChevronRight,\n Loader2,\n MapPin,\n Star,\n LogIn,\n LogOut,\n CalendarDays,\n Send,\n Timer,\n Save,\n} from 'lucide-react';\nimport { PageLayout } from '../../components/PageLayout';\nimport { EmptyState } from '../../components/EmptyState';\nimport { useAdapterCloud } from '../../context/AdapterCloudContext';\nimport { cn } from '../../utils/cn';\nimport { formatCurrency } from '../../utils/formatters';\n\n// ============================================================================\n// Types\n// ============================================================================\n\ntype ScheduleTab = 'schedule' | 'requests' | 'availability';\n\ninterface Shift {\n id: string;\n date: string;\n startTime: string;\n endTime: string;\n cartId: string;\n cartName: string;\n location: string;\n status: 'scheduled' | 'ongoing' | 'completed' | 'cancelled';\n earnings: number;\n tasksCompleted?: number;\n rating?: number;\n}\n\ninterface ShiftRequest {\n id: string;\n date: string;\n startTime: string;\n endTime: string;\n cartName: string;\n location: string;\n status: 'pending' | 'approved' | 'rejected';\n requestedOn: string;\n}\n\ninterface DayAvailability {\n dayOfWeek: string;\n isAvailable: boolean;\n preferredStartTime: string;\n preferredEndTime: string;\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\nfunction formatDate(dateString: string): string {\n const date = new Date(dateString);\n return date.toLocaleDateString('en-US', { weekday: 'short', month: 'short', day: 'numeric' });\n}\n\nfunction formatTime(time: string): string {\n const [hours, minutes] = time.split(':');\n const hour = parseInt(hours);\n const ampm = hour >= 12 ? 'PM' : 'AM';\n const displayHour = hour % 12 || 12;\n return `${displayHour}:${minutes} ${ampm}`;\n}\n\nfunction getWeekDates(weekOffset: number) {\n const today = new Date();\n const currentDay = today.getDay();\n const weekStart = new Date(today);\n weekStart.setDate(today.getDate() - currentDay + weekOffset * 7);\n const weekEnd = new Date(weekStart);\n weekEnd.setDate(weekStart.getDate() + 6);\n return {\n start: weekStart.toLocaleDateString('en-US', { month: 'short', day: 'numeric' }),\n end: weekEnd.toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' }),\n };\n}\n\nfunction getShiftStatusStyle(status: Shift['status']) {\n switch (status) {\n case 'scheduled':\n return 'bg-blue-500/20 text-blue-600 dark:text-blue-400';\n case 'ongoing':\n return 'bg-green-500/20 text-green-600 dark:text-green-400';\n case 'completed':\n return 'bg-secondary text-secondary-foreground';\n case 'cancelled':\n return 'bg-red-500/20 text-red-600 dark:text-red-400';\n default:\n return 'bg-secondary text-secondary-foreground';\n }\n}\n\nfunction getRequestStatusStyle(status: ShiftRequest['status']) {\n switch (status) {\n case 'pending':\n return 'bg-yellow-500/20 text-yellow-600 dark:text-yellow-400';\n case 'approved':\n return 'bg-green-500/20 text-green-600 dark:text-green-400';\n case 'rejected':\n return 'bg-red-500/20 text-red-600 dark:text-red-400';\n default:\n return 'bg-secondary text-secondary-foreground';\n }\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport const WorkerSchedulePage = () => {\n const { navigateTo } = useAdapterCloud();\n const [loading, setLoading] = useState(true);\n const [activeTab, setActiveTab] = useState<ScheduleTab>('schedule');\n const [selectedWeek, setSelectedWeek] = useState(0);\n const [shifts, setShifts] = useState<Shift[]>([]);\n const [shiftRequests, setShiftRequests] = useState<ShiftRequest[]>([]);\n const [availability, setAvailability] = useState<DayAvailability[]>([]);\n\n useEffect(() => {\n setLoading(true);\n const timer = setTimeout(() => {\n setShifts([\n {\n id: 'shift-001',\n date: new Date().toISOString().split('T')[0],\n startTime: '09:00',\n endTime: '14:00',\n cartId: 'cart-001',\n cartName: 'South Indian Express',\n location: 'MG Road, Bangalore',\n status: 'ongoing',\n earnings: 1200,\n tasksCompleted: 8,\n },\n {\n id: 'shift-002',\n date: new Date(Date.now() + 24 * 60 * 60 * 1000).toISOString().split('T')[0],\n startTime: '14:00',\n endTime: '20:00',\n cartId: 'cart-002',\n cartName: 'Chaat Corner',\n location: 'Brigade Road, Bangalore',\n status: 'scheduled',\n earnings: 1500,\n },\n {\n id: 'shift-003',\n date: new Date(Date.now() - 24 * 60 * 60 * 1000).toISOString().split('T')[0],\n startTime: '10:00',\n endTime: '16:00',\n cartId: 'cart-001',\n cartName: 'South Indian Express',\n location: 'MG Road, Bangalore',\n status: 'completed',\n earnings: 1350,\n tasksCompleted: 12,\n rating: 4.8,\n },\n {\n id: 'shift-004',\n date: new Date(Date.now() + 3 * 24 * 60 * 60 * 1000).toISOString().split('T')[0],\n startTime: '08:00',\n endTime: '14:00',\n cartId: 'cart-003',\n cartName: 'Biryani Pot',\n location: 'Frazer Town, Bangalore',\n status: 'scheduled',\n earnings: 0,\n },\n ]);\n\n setShiftRequests([\n {\n id: 'req-001',\n date: new Date(Date.now() + 2 * 24 * 60 * 60 * 1000).toISOString().split('T')[0],\n startTime: '08:00',\n endTime: '14:00',\n cartName: 'Burger Bliss',\n location: 'Koramangala, Bangalore',\n status: 'pending',\n requestedOn: new Date(Date.now() - 2 * 60 * 60 * 1000).toISOString(),\n },\n {\n id: 'req-002',\n date: new Date(Date.now() + 3 * 24 * 60 * 60 * 1000).toISOString().split('T')[0],\n startTime: '16:00',\n endTime: '22:00',\n cartName: 'Pizza Paradise',\n location: 'Indiranagar, Bangalore',\n status: 'approved',\n requestedOn: new Date(Date.now() - 24 * 60 * 60 * 1000).toISOString(),\n },\n {\n id: 'req-003',\n date: new Date(Date.now() - 2 * 24 * 60 * 60 * 1000).toISOString().split('T')[0],\n startTime: '10:00',\n endTime: '16:00',\n cartName: 'Dosa Express',\n location: 'BTM Layout, Bangalore',\n status: 'rejected',\n requestedOn: new Date(Date.now() - 3 * 24 * 60 * 60 * 1000).toISOString(),\n },\n ]);\n\n setAvailability([\n {\n dayOfWeek: 'Monday',\n isAvailable: true,\n preferredStartTime: '09:00',\n preferredEndTime: '18:00',\n },\n {\n dayOfWeek: 'Tuesday',\n isAvailable: true,\n preferredStartTime: '09:00',\n preferredEndTime: '18:00',\n },\n {\n dayOfWeek: 'Wednesday',\n isAvailable: true,\n preferredStartTime: '09:00',\n preferredEndTime: '18:00',\n },\n {\n dayOfWeek: 'Thursday',\n isAvailable: true,\n preferredStartTime: '09:00',\n preferredEndTime: '18:00',\n },\n {\n dayOfWeek: 'Friday',\n isAvailable: true,\n preferredStartTime: '09:00',\n preferredEndTime: '20:00',\n },\n {\n dayOfWeek: 'Saturday',\n isAvailable: true,\n preferredStartTime: '10:00',\n preferredEndTime: '20:00',\n },\n {\n dayOfWeek: 'Sunday',\n isAvailable: false,\n preferredStartTime: '09:00',\n preferredEndTime: '18:00',\n },\n ]);\n\n setLoading(false);\n }, 600);\n return () => clearTimeout(timer);\n }, [selectedWeek]);\n\n // Stats\n const weekStats = useMemo(() => {\n const active = shifts.filter((s) => s.status !== 'cancelled');\n const totalHours = active.reduce((sum, s) => {\n const start = new Date(`2024-01-01T${s.startTime}`);\n const end = new Date(`2024-01-01T${s.endTime}`);\n return sum + (end.getTime() - start.getTime()) / (1000 * 60 * 60);\n }, 0);\n const earnings = active.reduce((sum, s) => sum + s.earnings, 0);\n const nextShift = shifts.find((s) => s.status === 'scheduled');\n return {\n hoursThisWeek: totalHours,\n shiftsThisWeek: active.length,\n earningsThisWeek: earnings,\n nextShift,\n };\n }, [shifts]);\n\n const pendingRequestCount = shiftRequests.filter((r) => r.status === 'pending').length;\n const weekDates = getWeekDates(selectedWeek);\n\n const handleCheckIn = (shiftId: string) => {\n setShifts((prev) =>\n prev.map((s) => (s.id === shiftId ? { ...s, status: 'ongoing' as const } : s))\n );\n alert('Checked in successfully');\n };\n\n const handleCheckOut = (shiftId: string) => {\n setShifts((prev) =>\n prev.map((s) => (s.id === shiftId ? { ...s, status: 'completed' as const } : s))\n );\n alert('Checked out successfully');\n };\n\n const handleAcceptShift = (requestId: string) => {\n setShiftRequests((prev) =>\n prev.map((r) => (r.id === requestId ? { ...r, status: 'approved' as const } : r))\n );\n alert('Shift accepted');\n };\n\n const handleRejectShift = (requestId: string) => {\n setShiftRequests((prev) =>\n prev.map((r) => (r.id === requestId ? { ...r, status: 'rejected' as const } : r))\n );\n alert('Shift rejected');\n };\n\n const updateAvailability = (\n dayOfWeek: string,\n field: keyof DayAvailability,\n value: string | boolean\n ) => {\n setAvailability((prev) =>\n prev.map((d) => (d.dayOfWeek === dayOfWeek ? { ...d, [field]: value } : d))\n );\n };\n\n const handleSaveAvailability = () => {\n alert('Availability updated successfully');\n };\n\n if (loading) {\n return (\n <PageLayout title=\"Schedule\" description=\"Manage your work schedule\">\n <div className=\"flex items-center justify-center py-24\">\n <div className=\"text-center\">\n <Loader2 className=\"h-10 w-10 animate-spin text-muted-foreground mx-auto mb-4\" />\n <p className=\"text-sm text-muted-foreground\">Loading schedule...</p>\n </div>\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout title=\"Schedule\" description=\"Manage your work schedule\">\n <div className=\"space-y-6\">\n {/* Stats Overview */}\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-3\">\n <div className=\"rounded-lg border border-border bg-card p-4 shadow-sm\">\n <p className=\"text-xs text-muted-foreground\">Hours This Week</p>\n <p className=\"text-2xl font-bold text-foreground\">{weekStats.hoursThisWeek}h</p>\n </div>\n <div className=\"rounded-lg border border-border bg-card p-4 shadow-sm\">\n <p className=\"text-xs text-muted-foreground\">Shifts This Week</p>\n <p className=\"text-2xl font-bold text-foreground\">{weekStats.shiftsThisWeek}</p>\n </div>\n <div className=\"rounded-lg border border-border bg-card p-4 shadow-sm\">\n <p className=\"text-xs text-muted-foreground\">Week Earnings</p>\n <p className=\"text-2xl font-bold text-foreground\">\n {formatCurrency(weekStats.earningsThisWeek, { minimumFractionDigits: 0 })}\n </p>\n </div>\n <div className=\"rounded-lg border border-border bg-card p-4 shadow-sm\">\n <p className=\"text-xs text-muted-foreground\">Next Shift</p>\n <p className=\"text-sm font-bold text-foreground\">\n {weekStats.nextShift\n ? `${formatDate(weekStats.nextShift.date)} ${formatTime(weekStats.nextShift.startTime)}`\n : 'None scheduled'}\n </p>\n </div>\n </div>\n\n {/* Tabs */}\n <div className=\"rounded-lg border border-border bg-card shadow-sm overflow-hidden\">\n <div className=\"flex border-b border-border\">\n <button\n type=\"button\"\n onClick={() => setActiveTab('schedule')}\n className={cn(\n 'flex-1 py-3 px-4 text-sm font-medium transition-colors flex items-center justify-center gap-2',\n activeTab === 'schedule'\n ? 'border-b-2 border-blue-500 text-blue-600 dark:text-blue-400 bg-blue-500/5'\n : 'text-muted-foreground hover:text-foreground'\n )}\n >\n <CalendarDays className=\"h-4 w-4\" />\n My Schedule\n </button>\n <button\n type=\"button\"\n onClick={() => setActiveTab('requests')}\n className={cn(\n 'flex-1 py-3 px-4 text-sm font-medium transition-colors flex items-center justify-center gap-2',\n activeTab === 'requests'\n ? 'border-b-2 border-blue-500 text-blue-600 dark:text-blue-400 bg-blue-500/5'\n : 'text-muted-foreground hover:text-foreground'\n )}\n >\n <Send className=\"h-4 w-4\" />\n Shift Requests\n {pendingRequestCount > 0 && (\n <span className=\"ml-1 inline-flex items-center justify-center rounded-full bg-red-500 px-1.5 py-0.5 text-[10px] font-medium text-white\">\n {pendingRequestCount}\n </span>\n )}\n </button>\n <button\n type=\"button\"\n onClick={() => setActiveTab('availability')}\n className={cn(\n 'flex-1 py-3 px-4 text-sm font-medium transition-colors flex items-center justify-center gap-2',\n activeTab === 'availability'\n ? 'border-b-2 border-blue-500 text-blue-600 dark:text-blue-400 bg-blue-500/5'\n : 'text-muted-foreground hover:text-foreground'\n )}\n >\n <Timer className=\"h-4 w-4\" />\n Availability\n </button>\n </div>\n\n <div className=\"p-5\">\n {/* ============= Schedule Tab ============= */}\n {activeTab === 'schedule' && (\n <div>\n {/* Week Navigation */}\n <div className=\"flex items-center justify-between mb-5\">\n <button\n type=\"button\"\n onClick={() => setSelectedWeek((w) => w - 1)}\n className=\"inline-flex items-center gap-1.5 rounded-md bg-accent px-3 py-1.5 text-xs font-medium text-foreground hover:bg-accent/80 transition-colors\"\n >\n <ChevronLeft className=\"h-3.5 w-3.5\" />\n Previous Week\n </button>\n <h3 className=\"text-sm font-medium text-foreground\">\n {weekDates.start} - {weekDates.end}\n </h3>\n <button\n type=\"button\"\n onClick={() => setSelectedWeek((w) => w + 1)}\n className=\"inline-flex items-center gap-1.5 rounded-md bg-accent px-3 py-1.5 text-xs font-medium text-foreground hover:bg-accent/80 transition-colors\"\n >\n Next Week\n <ChevronRight className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n\n {/* Shifts */}\n {shifts.length === 0 ? (\n <EmptyState\n icon={<Calendar className=\"h-12 w-12\" />}\n title=\"No shifts scheduled\"\n description=\"No shifts scheduled for this week\"\n />\n ) : (\n <div className=\"space-y-3\">\n {shifts.map((shift) => (\n <div\n key={shift.id}\n className={cn(\n 'rounded-lg border p-4 transition-colors',\n shift.status === 'ongoing'\n ? 'border-green-500/30 bg-green-500/5'\n : 'border-border hover:bg-muted/30'\n )}\n >\n <div className=\"flex items-center justify-between mb-3\">\n <div>\n <div className=\"flex items-center gap-2 flex-wrap\">\n <h4 className=\"text-sm font-semibold text-foreground\">\n {formatDate(shift.date)}\n </h4>\n <span\n className={cn(\n 'inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-medium capitalize',\n getShiftStatusStyle(shift.status)\n )}\n >\n {shift.status === 'ongoing' ? 'Ongoing' : shift.status}\n </span>\n </div>\n <p className=\"text-xs text-muted-foreground mt-1\">\n {formatTime(shift.startTime)} - {formatTime(shift.endTime)}\n </p>\n </div>\n <div className=\"text-right\">\n <p className=\"text-lg font-bold text-foreground\">\n {formatCurrency(shift.earnings, { minimumFractionDigits: 0 })}\n </p>\n {shift.rating != null && (\n <p className=\"text-xs text-muted-foreground flex items-center gap-1 justify-end\">\n <Star className=\"h-3 w-3 fill-yellow-400 text-yellow-400\" />\n {shift.rating}\n </p>\n )}\n </div>\n </div>\n\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-3 text-sm\">\n <div>\n <p className=\"text-xs text-muted-foreground\">Cart</p>\n <p className=\"text-xs font-medium text-foreground flex items-center gap-1\">\n <ShoppingCart className=\"h-3 w-3 text-muted-foreground\" />\n {shift.cartName}\n </p>\n </div>\n <div>\n <p className=\"text-xs text-muted-foreground\">Location</p>\n <p className=\"text-xs font-medium text-foreground flex items-center gap-1\">\n <MapPin className=\"h-3 w-3 text-muted-foreground\" />\n {shift.location}\n </p>\n </div>\n {shift.tasksCompleted != null && (\n <div>\n <p className=\"text-xs text-muted-foreground\">Tasks Completed</p>\n <p className=\"text-xs font-medium text-foreground flex items-center gap-1\">\n <CheckCircle2 className=\"h-3 w-3 text-muted-foreground\" />\n {shift.tasksCompleted}\n </p>\n </div>\n )}\n </div>\n\n {shift.status === 'scheduled' && (\n <div className=\"mt-3 pt-3 border-t border-border\">\n <button\n type=\"button\"\n onClick={() => handleCheckIn(shift.id)}\n className=\"inline-flex items-center gap-1.5 rounded-md bg-blue-500/10 px-3 py-1.5 text-xs font-medium text-blue-600 dark:text-blue-400 hover:bg-blue-500/20 transition-colors\"\n >\n <LogIn className=\"h-3.5 w-3.5\" />\n Check In\n </button>\n </div>\n )}\n\n {shift.status === 'ongoing' && (\n <div className=\"mt-3 pt-3 border-t border-green-500/20 flex items-center justify-between\">\n <span className=\"text-xs font-medium text-green-600 dark:text-green-400 flex items-center gap-1\">\n <PlayCircle className=\"h-3.5 w-3.5\" />\n Shift in progress\n </span>\n <button\n type=\"button\"\n onClick={() => handleCheckOut(shift.id)}\n className=\"inline-flex items-center gap-1.5 rounded-md bg-accent px-3 py-1.5 text-xs font-medium text-foreground hover:bg-accent/80 transition-colors\"\n >\n <LogOut className=\"h-3.5 w-3.5\" />\n Check Out\n </button>\n </div>\n )}\n </div>\n ))}\n </div>\n )}\n </div>\n )}\n\n {/* ============= Shift Requests Tab ============= */}\n {activeTab === 'requests' && (\n <div>\n {shiftRequests.length === 0 ? (\n <EmptyState\n icon={<Send className=\"h-12 w-12\" />}\n title=\"No shift requests\"\n description=\"No shift requests available\"\n />\n ) : (\n <div className=\"space-y-3\">\n {shiftRequests.map((request) => (\n <div key={request.id} className=\"rounded-lg border border-border p-4\">\n <div className=\"flex items-center justify-between mb-3\">\n <div>\n <h4 className=\"text-sm font-semibold text-foreground\">\n {formatDate(request.date)}\n </h4>\n <p className=\"text-xs text-muted-foreground mt-0.5\">\n {formatTime(request.startTime)} - {formatTime(request.endTime)}\n </p>\n </div>\n <span\n className={cn(\n 'inline-flex items-center rounded-full px-2 py-0.5 text-[10px] font-medium capitalize',\n getRequestStatusStyle(request.status)\n )}\n >\n {request.status}\n </span>\n </div>\n\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-3 text-sm mb-3\">\n <div>\n <p className=\"text-xs text-muted-foreground\">Cart</p>\n <p className=\"text-xs font-medium text-foreground\">\n {request.cartName}\n </p>\n </div>\n <div>\n <p className=\"text-xs text-muted-foreground\">Location</p>\n <p className=\"text-xs font-medium text-foreground\">\n {request.location}\n </p>\n </div>\n </div>\n\n <p className=\"text-[10px] text-muted-foreground mb-3\">\n Requested{' '}\n {new Date(request.requestedOn).toLocaleString('en-IN', {\n day: 'numeric',\n month: 'short',\n hour: '2-digit',\n minute: '2-digit',\n hour12: true,\n })}\n </p>\n\n {request.status === 'pending' && (\n <div className=\"flex gap-2\">\n <button\n type=\"button\"\n onClick={() => handleAcceptShift(request.id)}\n className=\"inline-flex items-center gap-1.5 rounded-md bg-green-500/10 px-3 py-1.5 text-xs font-medium text-green-600 dark:text-green-400 hover:bg-green-500/20 transition-colors\"\n >\n <CheckCircle2 className=\"h-3.5 w-3.5\" />\n Accept\n </button>\n <button\n type=\"button\"\n onClick={() => handleRejectShift(request.id)}\n className=\"inline-flex items-center gap-1.5 rounded-md bg-red-500/10 px-3 py-1.5 text-xs font-medium text-red-600 dark:text-red-400 hover:bg-red-500/20 transition-colors\"\n >\n Reject\n </button>\n </div>\n )}\n </div>\n ))}\n </div>\n )}\n </div>\n )}\n\n {/* ============= Availability Tab ============= */}\n {activeTab === 'availability' && (\n <div>\n <p className=\"text-xs text-muted-foreground mb-5\">\n Set your preferred working hours for each day of the week\n </p>\n\n <div className=\"space-y-3\">\n {availability.map((day) => (\n <div\n key={day.dayOfWeek}\n className={cn(\n 'flex flex-col sm:flex-row sm:items-center gap-3 p-3 rounded-lg border',\n day.isAvailable ? 'border-border bg-card' : 'border-border/50 bg-muted/30'\n )}\n >\n <div className=\"w-32 shrink-0\">\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={day.isAvailable}\n onChange={(e) =>\n updateAvailability(day.dayOfWeek, 'isAvailable', e.target.checked)\n }\n className=\"h-4 w-4 rounded border-border text-blue-600 focus:ring-blue-500/40\"\n />\n <span className=\"text-sm font-medium text-foreground\">\n {day.dayOfWeek}\n </span>\n </label>\n </div>\n\n {day.isAvailable ? (\n <div className=\"flex flex-col sm:flex-row gap-3 flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-muted-foreground w-10\">From</span>\n <input\n type=\"time\"\n value={day.preferredStartTime}\n onChange={(e) =>\n updateAvailability(\n day.dayOfWeek,\n 'preferredStartTime',\n e.target.value\n )\n }\n className=\"rounded-md border border-border bg-background px-3 py-1.5 text-sm text-foreground focus:outline-none focus:ring-2 focus:ring-blue-500/40\"\n />\n </div>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-muted-foreground w-10\">To</span>\n <input\n type=\"time\"\n value={day.preferredEndTime}\n onChange={(e) =>\n updateAvailability(\n day.dayOfWeek,\n 'preferredEndTime',\n e.target.value\n )\n }\n className=\"rounded-md border border-border bg-background px-3 py-1.5 text-sm text-foreground focus:outline-none focus:ring-2 focus:ring-blue-500/40\"\n />\n </div>\n </div>\n ) : (\n <span className=\"text-xs text-muted-foreground\">Not available</span>\n )}\n </div>\n ))}\n </div>\n\n <div className=\"mt-5\">\n <button\n type=\"button\"\n onClick={handleSaveAvailability}\n className=\"inline-flex items-center gap-2 rounded-md bg-blue-500/10 px-4 py-2 text-sm font-medium text-blue-600 dark:text-blue-400 hover:bg-blue-500/20 transition-colors\"\n >\n <Save className=\"h-4 w-4\" />\n Save Availability\n </button>\n </div>\n </div>\n )}\n </div>\n </div>\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { create as e } from "zustand";
|
|
2
|
+
import { devtools as t, persist as n } from "zustand/middleware";
|
|
3
|
+
import { createProfileScopedStorage as r } from "@burdenoff/fe-libs/shared/utils";
|
|
4
|
+
//#region src/adaptercloud/store/adaptercloudStore.ts
|
|
5
|
+
var i = {
|
|
6
|
+
viewMode: "grid",
|
|
7
|
+
activeSection: "dashboard",
|
|
8
|
+
sidebarCollapsed: !1,
|
|
9
|
+
searchQuery: "",
|
|
10
|
+
categoryFilter: "",
|
|
11
|
+
selectedCartId: null,
|
|
12
|
+
selectedOrderId: null
|
|
13
|
+
}, a = e()(t(n((e) => ({
|
|
14
|
+
...i,
|
|
15
|
+
setViewMode: (t) => e({ viewMode: t }),
|
|
16
|
+
setActiveSection: (t) => e({ activeSection: t }),
|
|
17
|
+
toggleSidebar: () => e((e) => ({ sidebarCollapsed: !e.sidebarCollapsed })),
|
|
18
|
+
setSearchQuery: (t) => e({ searchQuery: t }),
|
|
19
|
+
setCategoryFilter: (t) => e({ categoryFilter: t }),
|
|
20
|
+
setSelectedCartId: (t) => e({ selectedCartId: t }),
|
|
21
|
+
setSelectedOrderId: (t) => e({ selectedOrderId: t }),
|
|
22
|
+
reset: () => e(i)
|
|
23
|
+
}), {
|
|
24
|
+
name: "burdenoff-adaptercloud-storage",
|
|
25
|
+
storage: r(),
|
|
26
|
+
partialize: (e) => ({
|
|
27
|
+
viewMode: e.viewMode,
|
|
28
|
+
sidebarCollapsed: e.sidebarCollapsed,
|
|
29
|
+
activeSection: e.activeSection
|
|
30
|
+
})
|
|
31
|
+
}), {
|
|
32
|
+
name: "AdapterCloud Store",
|
|
33
|
+
enabled: !1
|
|
34
|
+
}));
|
|
35
|
+
//#endregion
|
|
36
|
+
export { a as useAdapterCloudStore };
|
|
37
|
+
|
|
38
|
+
//# sourceMappingURL=adaptercloudStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adaptercloudStore.js","names":[],"sources":["../../../src/adaptercloud/store/adaptercloudStore.ts"],"sourcesContent":["/**\n * AdapterCloud Zustand Store\n * @module adaptercloud/store\n */\n\nimport { create } from 'zustand';\nimport { devtools, persist } from 'zustand/middleware';\nimport { createProfileScopedStorage } from '@burdenoff/fe-libs/shared/utils';\nimport type { ViewMode } from '../types';\n\n// ============================================================================\n// State Interface\n// ============================================================================\n\ninterface AdapterCloudState {\n // View state\n viewMode: ViewMode;\n activeSection: string;\n sidebarCollapsed: boolean;\n\n // Search & filters\n searchQuery: string;\n categoryFilter: string;\n\n // Selected entities\n selectedCartId: string | null;\n selectedOrderId: string | null;\n\n // Actions\n setViewMode: (mode: ViewMode) => void;\n setActiveSection: (section: string) => void;\n setSearchQuery: (query: string) => void;\n setCategoryFilter: (category: string) => void;\n setSelectedCartId: (cartId: string | null) => void;\n setSelectedOrderId: (orderId: string | null) => void;\n toggleSidebar: () => void;\n reset: () => void;\n}\n\n// ============================================================================\n// Initial State\n// ============================================================================\n\nconst initialState = {\n viewMode: 'grid' as ViewMode,\n activeSection: 'dashboard',\n sidebarCollapsed: false,\n\n searchQuery: '',\n categoryFilter: '',\n\n selectedCartId: null,\n selectedOrderId: null,\n};\n\n// ============================================================================\n// Store\n// ============================================================================\n\nexport const useAdapterCloudStore = create<AdapterCloudState>()(\n devtools(\n persist(\n (set) => ({\n ...initialState,\n\n // View actions\n setViewMode: (mode) => set({ viewMode: mode }),\n setActiveSection: (section) => set({ activeSection: section }),\n toggleSidebar: () => set((state) => ({ sidebarCollapsed: !state.sidebarCollapsed })),\n\n // Search & filter actions\n setSearchQuery: (query) => set({ searchQuery: query }),\n setCategoryFilter: (category) => set({ categoryFilter: category }),\n\n // Selection actions\n setSelectedCartId: (cartId) => set({ selectedCartId: cartId }),\n setSelectedOrderId: (orderId) => set({ selectedOrderId: orderId }),\n\n // Reset\n reset: () => set(initialState),\n }),\n {\n name: 'burdenoff-adaptercloud-storage',\n storage: createProfileScopedStorage(),\n partialize: (state) => ({\n viewMode: state.viewMode,\n sidebarCollapsed: state.sidebarCollapsed,\n activeSection: state.activeSection,\n }),\n }\n ),\n { name: 'AdapterCloud Store', enabled: import.meta.env.DEV }\n )\n);\n"],"mappings":";;;;AA2CA,IAAM,IAAe;CACnB,UAAU;CACV,eAAe;CACf,kBAAkB;CAElB,aAAa;CACb,gBAAgB;CAEhB,gBAAgB;CAChB,iBAAiB;CAClB,EAMY,IAAuB,GAA2B,CAC7D,EACE,GACG,OAAS;CACR,GAAG;CAGH,cAAc,MAAS,EAAI,EAAE,UAAU,GAAM,CAAC;CAC9C,mBAAmB,MAAY,EAAI,EAAE,eAAe,GAAS,CAAC;CAC9D,qBAAqB,GAAK,OAAW,EAAE,kBAAkB,CAAC,EAAM,kBAAkB,EAAE;CAGpF,iBAAiB,MAAU,EAAI,EAAE,aAAa,GAAO,CAAC;CACtD,oBAAoB,MAAa,EAAI,EAAE,gBAAgB,GAAU,CAAC;CAGlE,oBAAoB,MAAW,EAAI,EAAE,gBAAgB,GAAQ,CAAC;CAC9D,qBAAqB,MAAY,EAAI,EAAE,iBAAiB,GAAS,CAAC;CAGlE,aAAa,EAAI,EAAa;CAC/B,GACD;CACE,MAAM;CACN,SAAS,GAA4B;CACrC,aAAa,OAAW;EACtB,UAAU,EAAM;EAChB,kBAAkB,EAAM;EACxB,eAAe,EAAM;EACtB;CACF,CACF,EACD;CAAE,MAAM;CAAsB,SAAA;CAA8B,CAC7D,CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import "./adaptercloudStore.js";
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import e from "../../node_modules/.bun/clsx@2.1.1/node_modules/clsx/dist/clsx.js";
|
|
2
|
+
import { twMerge as t } from "../../node_modules/.bun/tailwind-merge@3.5.0/node_modules/tailwind-merge/dist/bundle-mjs.js";
|
|
3
|
+
//#region src/adaptercloud/utils/cn.ts
|
|
4
|
+
function n(...n) {
|
|
5
|
+
return t(e(n));
|
|
6
|
+
}
|
|
7
|
+
//#endregion
|
|
8
|
+
export { n as cn };
|
|
9
|
+
|
|
10
|
+
//# sourceMappingURL=cn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cn.js","names":[],"sources":["../../../src/adaptercloud/utils/cn.ts"],"sourcesContent":["/**\n * Class name utility\n * @module adaptercloud/utils\n */\n\nimport { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n"],"mappings":";;;AAQA,SAAgB,EAAG,GAAG,GAA8B;AAClD,QAAO,EAAQ,EAAK,EAAO,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
//#region src/adaptercloud/utils/formatters.ts
|
|
2
|
+
function e(e, t) {
|
|
3
|
+
return new Intl.NumberFormat("en-IN", {
|
|
4
|
+
style: "currency",
|
|
5
|
+
currency: "INR",
|
|
6
|
+
minimumFractionDigits: 2,
|
|
7
|
+
maximumFractionDigits: 2,
|
|
8
|
+
...t
|
|
9
|
+
}).format(e);
|
|
10
|
+
}
|
|
11
|
+
function t(e, t) {
|
|
12
|
+
let n = typeof e == "string" ? new Date(e) : e;
|
|
13
|
+
return new Intl.DateTimeFormat("en-IN", {
|
|
14
|
+
day: "numeric",
|
|
15
|
+
month: "short",
|
|
16
|
+
year: "numeric",
|
|
17
|
+
hour: "numeric",
|
|
18
|
+
minute: "2-digit",
|
|
19
|
+
hour12: !0,
|
|
20
|
+
...t
|
|
21
|
+
}).format(n);
|
|
22
|
+
}
|
|
23
|
+
function n(e) {
|
|
24
|
+
let t = typeof e == "string" ? new Date(e) : e, n = (/* @__PURE__ */ new Date()).getTime() - t.getTime(), r = Math.floor(n / 1e3), i = Math.floor(r / 60), a = Math.floor(i / 60), o = Math.floor(a / 24), s = Math.floor(o / 7), c = Math.floor(o / 30);
|
|
25
|
+
if (r < 60) return "just now";
|
|
26
|
+
if (i < 60) return `${i} min${i === 1 ? "" : "s"} ago`;
|
|
27
|
+
if (a < 24) return `${a} hour${a === 1 ? "" : "s"} ago`;
|
|
28
|
+
if (o < 7) return `${o} day${o === 1 ? "" : "s"} ago`;
|
|
29
|
+
if (s < 4) return `${s} week${s === 1 ? "" : "s"} ago`;
|
|
30
|
+
if (c < 12) return `${c} month${c === 1 ? "" : "s"} ago`;
|
|
31
|
+
let l = Math.floor(o / 365);
|
|
32
|
+
return `${l} year${l === 1 ? "" : "s"} ago`;
|
|
33
|
+
}
|
|
34
|
+
function r(e, t) {
|
|
35
|
+
return new Intl.NumberFormat("en-IN", t).format(e);
|
|
36
|
+
}
|
|
37
|
+
function i(e) {
|
|
38
|
+
return e < 1 ? `${Math.round(e * 1e3)} m` : e < 10 ? `${e.toFixed(1)} km` : `${Math.round(e)} km`;
|
|
39
|
+
}
|
|
40
|
+
function a(e) {
|
|
41
|
+
if (e < 1) return "instant";
|
|
42
|
+
if (e < 60) return `${e} min`;
|
|
43
|
+
let t = Math.floor(e / 60), n = e % 60;
|
|
44
|
+
if (t < 24) return n === 0 ? `${t}h` : `${t}h ${n}min`;
|
|
45
|
+
let r = Math.floor(t / 24), i = t % 24;
|
|
46
|
+
return i === 0 ? `${r} day${r === 1 ? "" : "s"}` : `${r} day${r === 1 ? "" : "s"} ${i}h`;
|
|
47
|
+
}
|
|
48
|
+
//#endregion
|
|
49
|
+
export { e as formatCurrency, t as formatDate, i as formatDistance, a as formatDuration, r as formatNumber, n as formatRelativeTime };
|
|
50
|
+
|
|
51
|
+
//# sourceMappingURL=formatters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatters.js","names":[],"sources":["../../../src/adaptercloud/utils/formatters.ts"],"sourcesContent":["/**\n * Formatting utilities for the AdapterCloud microfrontend\n * @module adaptercloud/utils/formatters\n */\n\n/**\n * Format a number as Indian Rupees (INR) currency\n *\n * @param amount - The numeric amount to format\n * @param options - Optional Intl.NumberFormat options to override defaults\n * @returns Formatted currency string (e.g., \"₹1,200.00\")\n *\n * @example\n * formatCurrency(1200) // => \"₹1,200.00\"\n * formatCurrency(0) // => \"₹0.00\"\n * formatCurrency(1200, { minimumFractionDigits: 0 }) // => \"₹1,200\"\n */\nexport function formatCurrency(\n amount: number,\n options?: Partial<Intl.NumberFormatOptions>\n): string {\n return new Intl.NumberFormat('en-IN', {\n style: 'currency',\n currency: 'INR',\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n ...options,\n }).format(amount);\n}\n\n/**\n * Format a date string or Date object into a human-readable format\n *\n * @param date - ISO date string or Date object\n * @param options - Optional Intl.DateTimeFormat options\n * @returns Formatted date string (e.g., \"15 Jan 2024, 4:00 PM\")\n *\n * @example\n * formatDate('2024-01-15T10:30:00Z')\n * // => \"15 Jan 2024, 4:00 PM\" (in IST)\n */\nexport function formatDate(\n date: string | Date,\n options?: Partial<Intl.DateTimeFormatOptions>\n): string {\n const d = typeof date === 'string' ? new Date(date) : date;\n return new Intl.DateTimeFormat('en-IN', {\n day: 'numeric',\n month: 'short',\n year: 'numeric',\n hour: 'numeric',\n minute: '2-digit',\n hour12: true,\n ...options,\n }).format(d);\n}\n\n/**\n * Format a date into a relative time string (e.g., \"2 hours ago\")\n *\n * @param date - ISO date string or Date object\n * @returns Human-readable relative time string\n *\n * @example\n * formatRelativeTime('2024-01-15T10:30:00Z') // => \"3 days ago\"\n * formatRelativeTime(new Date()) // => \"just now\"\n */\nexport function formatRelativeTime(date: string | Date): string {\n const d = typeof date === 'string' ? new Date(date) : date;\n const now = new Date();\n const diffMs = now.getTime() - d.getTime();\n const diffSeconds = Math.floor(diffMs / 1000);\n const diffMinutes = Math.floor(diffSeconds / 60);\n const diffHours = Math.floor(diffMinutes / 60);\n const diffDays = Math.floor(diffHours / 24);\n const diffWeeks = Math.floor(diffDays / 7);\n const diffMonths = Math.floor(diffDays / 30);\n\n if (diffSeconds < 60) return 'just now';\n if (diffMinutes < 60) return `${diffMinutes} min${diffMinutes !== 1 ? 's' : ''} ago`;\n if (diffHours < 24) return `${diffHours} hour${diffHours !== 1 ? 's' : ''} ago`;\n if (diffDays < 7) return `${diffDays} day${diffDays !== 1 ? 's' : ''} ago`;\n if (diffWeeks < 4) return `${diffWeeks} week${diffWeeks !== 1 ? 's' : ''} ago`;\n if (diffMonths < 12) return `${diffMonths} month${diffMonths !== 1 ? 's' : ''} ago`;\n\n const diffYears = Math.floor(diffDays / 365);\n return `${diffYears} year${diffYears !== 1 ? 's' : ''} ago`;\n}\n\n/**\n * Format a number with Indian locale grouping (lakhs, crores)\n *\n * @param value - The number to format\n * @param options - Optional Intl.NumberFormat options\n * @returns Formatted number string (e.g., \"12,345\" or \"1,24,500\")\n *\n * @example\n * formatNumber(1245) // => \"1,245\"\n * formatNumber(124500) // => \"1,24,500\"\n */\nexport function formatNumber(value: number, options?: Partial<Intl.NumberFormatOptions>): string {\n return new Intl.NumberFormat('en-IN', options).format(value);\n}\n\n/**\n * Format a distance value in kilometers\n *\n * @param km - Distance in kilometers\n * @returns Formatted distance string\n *\n * @example\n * formatDistance(0.5) // => \"500 m\"\n * formatDistance(1.2) // => \"1.2 km\"\n * formatDistance(15) // => \"15 km\"\n */\nexport function formatDistance(km: number): string {\n if (km < 1) {\n return `${Math.round(km * 1000)} m`;\n }\n if (km < 10) {\n return `${km.toFixed(1)} km`;\n }\n return `${Math.round(km)} km`;\n}\n\n/**\n * Format a duration in minutes into a human-readable string\n *\n * @param minutes - Duration in minutes\n * @returns Formatted duration string\n *\n * @example\n * formatDuration(5) // => \"5 min\"\n * formatDuration(90) // => \"1h 30min\"\n * formatDuration(1440) // => \"1 day\"\n * formatDuration(4320) // => \"3 days\"\n */\nexport function formatDuration(minutes: number): string {\n if (minutes < 1) return 'instant';\n if (minutes < 60) return `${minutes} min`;\n\n const hours = Math.floor(minutes / 60);\n const remainingMinutes = minutes % 60;\n\n if (hours < 24) {\n if (remainingMinutes === 0) {\n return `${hours}h`;\n }\n return `${hours}h ${remainingMinutes}min`;\n }\n\n const days = Math.floor(hours / 24);\n const remainingHours = hours % 24;\n\n if (remainingHours === 0) {\n return `${days} day${days !== 1 ? 's' : ''}`;\n }\n return `${days} day${days !== 1 ? 's' : ''} ${remainingHours}h`;\n}\n"],"mappings":";AAiBA,SAAgB,EACd,GACA,GACQ;AACR,QAAO,IAAI,KAAK,aAAa,SAAS;EACpC,OAAO;EACP,UAAU;EACV,uBAAuB;EACvB,uBAAuB;EACvB,GAAG;EACJ,CAAC,CAAC,OAAO,EAAO;;AAcnB,SAAgB,EACd,GACA,GACQ;CACR,IAAM,IAAI,OAAO,KAAS,WAAW,IAAI,KAAK,EAAK,GAAG;AACtD,QAAO,IAAI,KAAK,eAAe,SAAS;EACtC,KAAK;EACL,OAAO;EACP,MAAM;EACN,MAAM;EACN,QAAQ;EACR,QAAQ;EACR,GAAG;EACJ,CAAC,CAAC,OAAO,EAAE;;AAad,SAAgB,EAAmB,GAA6B;CAC9D,IAAM,IAAI,OAAO,KAAS,WAAW,IAAI,KAAK,EAAK,GAAG,GAEhD,qBADM,IAAI,MAAM,EACH,SAAS,GAAG,EAAE,SAAS,EACpC,IAAc,KAAK,MAAM,IAAS,IAAK,EACvC,IAAc,KAAK,MAAM,IAAc,GAAG,EAC1C,IAAY,KAAK,MAAM,IAAc,GAAG,EACxC,IAAW,KAAK,MAAM,IAAY,GAAG,EACrC,IAAY,KAAK,MAAM,IAAW,EAAE,EACpC,IAAa,KAAK,MAAM,IAAW,GAAG;AAE5C,KAAI,IAAc,GAAI,QAAO;AAC7B,KAAI,IAAc,GAAI,QAAO,GAAG,EAAY,MAAM,MAAgB,IAAU,KAAN,IAAS;AAC/E,KAAI,IAAY,GAAI,QAAO,GAAG,EAAU,OAAO,MAAc,IAAU,KAAN,IAAS;AAC1E,KAAI,IAAW,EAAG,QAAO,GAAG,EAAS,MAAM,MAAa,IAAU,KAAN,IAAS;AACrE,KAAI,IAAY,EAAG,QAAO,GAAG,EAAU,OAAO,MAAc,IAAU,KAAN,IAAS;AACzE,KAAI,IAAa,GAAI,QAAO,GAAG,EAAW,QAAQ,MAAe,IAAU,KAAN,IAAS;CAE9E,IAAM,IAAY,KAAK,MAAM,IAAW,IAAI;AAC5C,QAAO,GAAG,EAAU,OAAO,MAAc,IAAU,KAAN,IAAS;;AAcxD,SAAgB,EAAa,GAAe,GAAqD;AAC/F,QAAO,IAAI,KAAK,aAAa,SAAS,EAAQ,CAAC,OAAO,EAAM;;AAc9D,SAAgB,EAAe,GAAoB;AAOjD,QANI,IAAK,IACA,GAAG,KAAK,MAAM,IAAK,IAAK,CAAC,MAE9B,IAAK,KACA,GAAG,EAAG,QAAQ,EAAE,CAAC,OAEnB,GAAG,KAAK,MAAM,EAAG,CAAC;;AAe3B,SAAgB,EAAe,GAAyB;AACtD,KAAI,IAAU,EAAG,QAAO;AACxB,KAAI,IAAU,GAAI,QAAO,GAAG,EAAQ;CAEpC,IAAM,IAAQ,KAAK,MAAM,IAAU,GAAG,EAChC,IAAmB,IAAU;AAEnC,KAAI,IAAQ,GAIV,QAHI,MAAqB,IAChB,GAAG,EAAM,KAEX,GAAG,EAAM,IAAI,EAAiB;CAGvC,IAAM,IAAO,KAAK,MAAM,IAAQ,GAAG,EAC7B,IAAiB,IAAQ;AAK/B,QAHI,MAAmB,IACd,GAAG,EAAK,MAAM,MAAS,IAAU,KAAN,QAE7B,GAAG,EAAK,MAAM,MAAS,IAAU,KAAN,IAAS,GAAG,EAAe"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
//#region src/adaptercloud/utils/navigation.ts
|
|
2
|
+
function e(e, t) {
|
|
3
|
+
let n = e.endsWith("/") ? e.slice(0, -1) : e;
|
|
4
|
+
return !t || t === "" ? n || "/" : n + (t.startsWith("/") ? t : `/${t}`);
|
|
5
|
+
}
|
|
6
|
+
//#endregion
|
|
7
|
+
export { e as joinPath };
|
|
8
|
+
|
|
9
|
+
//# sourceMappingURL=navigation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"navigation.js","names":[],"sources":["../../../src/adaptercloud/utils/navigation.ts"],"sourcesContent":["/**\n * Navigation utilities for the AdapterCloud microfrontend\n * @module adaptercloud/utils\n */\n\n/**\n * Join basePath with a relative path, correctly handling slashes\n *\n * @param basePath - The base path (e.g., '/' or '/adaptercloud')\n * @param relativePath - The relative path (e.g., 'carts/new' or '/carts/new')\n * @returns The joined path (e.g., '/adaptercloud/carts/new')\n *\n * @example\n * joinPath('/', 'carts/new') // => '/carts/new'\n * joinPath('/', '/carts/new') // => '/carts/new'\n * joinPath('/adaptercloud', 'orders') // => '/adaptercloud/orders'\n * joinPath('/adaptercloud/', 'orders') // => '/adaptercloud/orders'\n * joinPath('/adaptercloud', '') // => '/adaptercloud'\n */\nexport function joinPath(basePath: string, relativePath: string): string {\n // Remove trailing slash from base\n const cleanBase = basePath.endsWith('/') ? basePath.slice(0, -1) : basePath;\n\n // Handle empty relative path (go to base)\n if (!relativePath || relativePath === '') {\n return cleanBase || '/';\n }\n\n // Ensure relative path starts with /\n const cleanPath = relativePath.startsWith('/') ? relativePath : `/${relativePath}`;\n\n // Join them\n return cleanBase + cleanPath;\n}\n"],"mappings":";AAmBA,SAAgB,EAAS,GAAkB,GAA8B;CAEvE,IAAM,IAAY,EAAS,SAAS,IAAI,GAAG,EAAS,MAAM,GAAG,GAAG,GAAG;AAWnE,QARI,CAAC,KAAgB,MAAiB,KAC7B,KAAa,MAOf,KAHW,EAAa,WAAW,IAAI,GAAG,IAAe,IAAI"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { AdapterCloudProvider as e, useAdapterCloud as t } from "./adaptercloud/context/AdapterCloudContext.js";
|
|
2
|
+
import { cn as n } from "./adaptercloud/utils/cn.js";
|
|
3
|
+
import { formatCurrency as r, formatDate as i, formatNumber as a, formatRelativeTime as o } from "./adaptercloud/utils/formatters.js";
|
|
4
|
+
import { AdapterCloudRoot as s } from "./adaptercloud/AdapterCloudRoot.js";
|
|
5
|
+
import { useAdapterCloudStore as c } from "./adaptercloud/store/adaptercloudStore.js";
|
|
6
|
+
import "./adaptercloud/index.js";
|
|
7
|
+
export { e as AdapterCloudProvider, s as AdapterCloudRoot, n as cn, r as formatCurrency, i as formatDate, a as formatNumber, o as formatRelativeTime, t as useAdapterCloud, c as useAdapterCloudStore };
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
//#region ../../node_modules/.bun/clsx@2.1.1/node_modules/clsx/dist/clsx.mjs
|
|
2
|
+
function e(t) {
|
|
3
|
+
var n, r, i = "";
|
|
4
|
+
if (typeof t == "string" || typeof t == "number") i += t;
|
|
5
|
+
else if (typeof t == "object") if (Array.isArray(t)) {
|
|
6
|
+
var a = t.length;
|
|
7
|
+
for (n = 0; n < a; n++) t[n] && (r = e(t[n])) && (i && (i += " "), i += r);
|
|
8
|
+
} else for (r in t) t[r] && (i && (i += " "), i += r);
|
|
9
|
+
return i;
|
|
10
|
+
}
|
|
11
|
+
function t() {
|
|
12
|
+
for (var t, n, r = 0, i = "", a = arguments.length; r < a; r++) (t = arguments[r]) && (n = e(t)) && (i && (i += " "), i += n);
|
|
13
|
+
return i;
|
|
14
|
+
}
|
|
15
|
+
//#endregion
|
|
16
|
+
export { t as default };
|
|
17
|
+
|
|
18
|
+
//# sourceMappingURL=clsx.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clsx.js","names":[],"sources":["../../../../../../../../../node_modules/.bun/clsx@2.1.1/node_modules/clsx/dist/clsx.mjs"],"sourcesContent":["function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f)}else for(f in e)e[f]&&(n&&(n+=\" \"),n+=f);return n}export function clsx(){for(var e,t,f=0,n=\"\",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;"],"x_google_ignoreList":[0],"mappings":";AAAA,SAAS,EAAE,GAAE;CAAC,IAAI,GAAE,GAAE,IAAE;AAAG,KAAa,OAAO,KAAjB,YAA8B,OAAO,KAAjB,SAAmB,MAAG;UAAoB,OAAO,KAAjB,SAAmB,KAAG,MAAM,QAAQ,EAAE,EAAC;EAAC,IAAI,IAAE,EAAE;AAAO,OAAI,IAAE,GAAE,IAAE,GAAE,IAAI,GAAE,OAAK,IAAE,EAAE,EAAE,GAAG,MAAI,MAAI,KAAG,MAAK,KAAG;OAAQ,MAAI,KAAK,EAAE,GAAE,OAAK,MAAI,KAAG,MAAK,KAAG;AAAG,QAAO;;AAAE,SAAgB,IAAM;AAAC,MAAI,IAAI,GAAE,GAAE,IAAE,GAAE,IAAE,IAAG,IAAE,UAAU,QAAO,IAAE,GAAE,IAAI,EAAC,IAAE,UAAU,QAAM,IAAE,EAAE,EAAE,MAAI,MAAI,KAAG,MAAK,KAAG;AAAG,QAAO"}
|