@burdenoff/microfe-movethewheels 2026.510.105

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.
Files changed (208) hide show
  1. package/README.md +82 -0
  2. package/dist/AIAssistantPage-hD0VYJdH.js +210 -0
  3. package/dist/AnalyticsPage-DHTHCUtr.js +201 -0
  4. package/dist/CreateOrderPage-Cprg4Y9V.js +471 -0
  5. package/dist/CustomerDetailsPage-DNDEw7IW.js +239 -0
  6. package/dist/CustomersPage-CDjjeCEL.js +119 -0
  7. package/dist/DashboardPage-8iTPXRAG.js +374 -0
  8. package/dist/DataTable-CRIKfdIN.js +239 -0
  9. package/dist/DriverDetailsPage-CRyRCno7.js +297 -0
  10. package/dist/DriversPage-16O8fVmf.js +127 -0
  11. package/dist/FinancePage-BYUxK5dR.js +154 -0
  12. package/dist/FleetPage-CHYETCWT.js +293 -0
  13. package/dist/ImportExportPage-C3MKKxfc.js +232 -0
  14. package/dist/InventoryPage--822AxZM.js +223 -0
  15. package/dist/LiveTrackingPage-Dp3rTJDr.js +332 -0
  16. package/dist/MarketplacePage-DjEqudfM.js +192 -0
  17. package/dist/MetricCard-GTbxAk1a.js +135 -0
  18. package/dist/OrderDetailsPage-BIuYG0ub.js +398 -0
  19. package/dist/OrdersListPage-CW5V0Uvh.js +257 -0
  20. package/dist/PageLayout-B7b0vl0R.js +1894 -0
  21. package/dist/ProductDetailsPage-Q3X7AT-7.js +168 -0
  22. package/dist/ProductsPage-CUj9JpnW.js +131 -0
  23. package/dist/ReportsPage-DblO5CdJ.js +227 -0
  24. package/dist/RouteDetailsPage-CLctgk6A.js +240 -0
  25. package/dist/RoutesPage-8hrv6RWT.js +116 -0
  26. package/dist/SettingsPage-BJ5BQeqn.js +247 -0
  27. package/dist/StatusBadge-BrrwraIA.js +206 -0
  28. package/dist/TrackingPage-BGqHDh-w.js +322 -0
  29. package/dist/VehicleDetailsPage-XnDH4iQR.js +194 -0
  30. package/dist/VehiclesPage-Cs4XxHkA.js +127 -0
  31. package/dist/WarehouseDetailsPage-GemdMvr_.js +215 -0
  32. package/dist/WarehousesPage-QTiuDuXy.js +121 -0
  33. package/dist/arrow-left-6CiLhqVp.js +11 -0
  34. package/dist/box-BunB_4UH.js +18 -0
  35. package/dist/chart-column-DWwVEVQ-.js +22 -0
  36. package/dist/chevron-right-DhZVf20o.js +8 -0
  37. package/dist/circle-alert-D5f6RZxt.js +26 -0
  38. package/dist/circle-check-big-D-JMHcTe.js +11 -0
  39. package/dist/clock-CvwBKbQP.js +13 -0
  40. package/dist/dev/main.d.ts +1 -0
  41. package/dist/dollar-sign-CP9qeU5d.js +14 -0
  42. package/dist/download-CIuG04pJ.js +21 -0
  43. package/dist/file-text-Dd_thxkn.js +26 -0
  44. package/dist/filter-DyRMX9CU.js +8 -0
  45. package/dist/formatters-_vJlC-47.js +50 -0
  46. package/dist/generated/global-operations.d.ts +1 -0
  47. package/dist/generated/global-types.d.ts +20715 -0
  48. package/dist/generated/wspace-operations.d.ts +3704 -0
  49. package/dist/generated/wspace-types.d.ts +53362 -0
  50. package/dist/graphqlClient-CdJyR_ed.js +55 -0
  51. package/dist/index.d.ts +4 -0
  52. package/dist/index.js +772 -0
  53. package/dist/map-BqH1cBJi.js +18 -0
  54. package/dist/map-pin-CFBOmh-A.js +13 -0
  55. package/dist/movethewheels/MoveTheWheelsRoot.d.ts +25 -0
  56. package/dist/movethewheels/MoveTheWheelsRoutes.d.ts +7 -0
  57. package/dist/movethewheels/components/DataTable.d.ts +32 -0
  58. package/dist/movethewheels/components/MetricCard.d.ts +43 -0
  59. package/dist/movethewheels/components/PageLayout.d.ts +68 -0
  60. package/dist/movethewheels/components/StatusBadge.d.ts +49 -0
  61. package/dist/movethewheels/components/index.d.ts +10 -0
  62. package/dist/movethewheels/components/ui.d.ts +22 -0
  63. package/dist/movethewheels/constants/index.d.ts +24 -0
  64. package/dist/movethewheels/constants/mockData.d.ts +33 -0
  65. package/dist/movethewheels/hooks/index.d.ts +12 -0
  66. package/dist/movethewheels/hooks/useAnalytics.d.ts +118 -0
  67. package/dist/movethewheels/hooks/useCustomers.d.ts +37 -0
  68. package/dist/movethewheels/hooks/useFleet.d.ts +71 -0
  69. package/dist/movethewheels/hooks/useInventory.d.ts +60 -0
  70. package/dist/movethewheels/hooks/useOrders.d.ts +47 -0
  71. package/dist/movethewheels/hooks/useRoutes.d.ts +41 -0
  72. package/dist/movethewheels/hooks/useTracking.d.ts +69 -0
  73. package/dist/movethewheels/index.d.ts +30 -0
  74. package/dist/movethewheels/pages/AIAssistantPage.d.ts +4 -0
  75. package/dist/movethewheels/pages/AnalyticsPage.d.ts +4 -0
  76. package/dist/movethewheels/pages/CreateOrderPage.d.ts +6 -0
  77. package/dist/movethewheels/pages/CustomerDetailsPage.d.ts +4 -0
  78. package/dist/movethewheels/pages/CustomersPage.d.ts +4 -0
  79. package/dist/movethewheels/pages/DashboardPage.d.ts +6 -0
  80. package/dist/movethewheels/pages/DriverDetailsPage.d.ts +4 -0
  81. package/dist/movethewheels/pages/DriversPage.d.ts +4 -0
  82. package/dist/movethewheels/pages/FinancePage.d.ts +4 -0
  83. package/dist/movethewheels/pages/FleetPage.d.ts +6 -0
  84. package/dist/movethewheels/pages/ImportExportPage.d.ts +4 -0
  85. package/dist/movethewheels/pages/InventoryPage.d.ts +4 -0
  86. package/dist/movethewheels/pages/LiveTrackingPage.d.ts +6 -0
  87. package/dist/movethewheels/pages/MarketplacePage.d.ts +4 -0
  88. package/dist/movethewheels/pages/OrderDetailsPage.d.ts +6 -0
  89. package/dist/movethewheels/pages/OrdersListPage.d.ts +6 -0
  90. package/dist/movethewheels/pages/ProductDetailsPage.d.ts +4 -0
  91. package/dist/movethewheels/pages/ProductsPage.d.ts +4 -0
  92. package/dist/movethewheels/pages/ReportsPage.d.ts +4 -0
  93. package/dist/movethewheels/pages/RouteDetailsPage.d.ts +4 -0
  94. package/dist/movethewheels/pages/RoutesPage.d.ts +4 -0
  95. package/dist/movethewheels/pages/SettingsPage.d.ts +4 -0
  96. package/dist/movethewheels/pages/TrackingPage.d.ts +6 -0
  97. package/dist/movethewheels/pages/VehicleDetailsPage.d.ts +4 -0
  98. package/dist/movethewheels/pages/VehiclesPage.d.ts +4 -0
  99. package/dist/movethewheels/pages/WarehouseDetailsPage.d.ts +4 -0
  100. package/dist/movethewheels/pages/WarehousesPage.d.ts +4 -0
  101. package/dist/movethewheels/providers/MoveTheWheelsProvider.d.ts +16 -0
  102. package/dist/movethewheels/store/movethewheelsStore.d.ts +73 -0
  103. package/dist/movethewheels/types/index.d.ts +655 -0
  104. package/dist/movethewheels/utils/cn.d.ts +6 -0
  105. package/dist/movethewheels/utils/formatters.d.ts +60 -0
  106. package/dist/movethewheels/utils/graphqlClient.d.ts +11 -0
  107. package/dist/movethewheels/utils/index.d.ts +7 -0
  108. package/dist/movethewheels/utils/navigation.d.ts +23 -0
  109. package/dist/navigation-BgnOfsVd.js +6 -0
  110. package/dist/navigation-C2fY_aS9.js +8 -0
  111. package/dist/package-DVZbDRcV.js +22 -0
  112. package/dist/phone-KdwpVmC4.js +18 -0
  113. package/dist/plus-Bl7uX6Ji.js +11 -0
  114. package/dist/refresh-cw-BYjl3K-8.js +22 -0
  115. package/dist/route-Ce_poKFi.js +51 -0
  116. package/dist/save-C-qDVat-.js +18 -0
  117. package/dist/search-5pdn5eOO.js +13 -0
  118. package/dist/settings-C4kIDsYg.js +28 -0
  119. package/dist/square-pen-BwQ67vLE.js +11 -0
  120. package/dist/star-BlVsC3Ad.js +8 -0
  121. package/dist/store-DTmQT5M0.js +26 -0
  122. package/dist/trending-up-C1faflCI.js +11 -0
  123. package/dist/triangle-alert-CUoVAA4L.js +18 -0
  124. package/dist/truck-BmDAzu05.js +30 -0
  125. package/dist/useAnalytics-ph7eTIK6.js +297 -0
  126. package/dist/useCustomers-bS3a4ytk.js +186 -0
  127. package/dist/useFleet-BdETplNE.js +398 -0
  128. package/dist/useInventory-Dwn18FPz.js +323 -0
  129. package/dist/useOrders-D_3_hGMp.js +324 -0
  130. package/dist/useRoutes-v4aBaS-E.js +224 -0
  131. package/dist/useTracking-De2KIUNu.js +261 -0
  132. package/dist/user-BplzDrLP.js +13 -0
  133. package/dist/users-i-igmsP4.js +24 -0
  134. package/dist/warehouse-DewG0PXh.js +25 -0
  135. package/dist/wrench-CoSDEIC7.js +31 -0
  136. package/package.json +107 -0
  137. package/src/dev/main.tsx +110 -0
  138. package/src/dev/styles.css +139 -0
  139. package/src/generated/global-operations.ts +2 -0
  140. package/src/generated/global-types.ts +24048 -0
  141. package/src/generated/wspace-operations.ts +3734 -0
  142. package/src/generated/wspace-types.ts +60715 -0
  143. package/src/index.ts +4 -0
  144. package/src/movethewheels/MoveTheWheelsRoot.tsx +258 -0
  145. package/src/movethewheels/MoveTheWheelsRoutes.tsx +119 -0
  146. package/src/movethewheels/components/DataTable.tsx +367 -0
  147. package/src/movethewheels/components/MetricCard.tsx +180 -0
  148. package/src/movethewheels/components/PageLayout.tsx +234 -0
  149. package/src/movethewheels/components/StatusBadge.tsx +243 -0
  150. package/src/movethewheels/components/index.ts +26 -0
  151. package/src/movethewheels/components/ui.tsx +124 -0
  152. package/src/movethewheels/constants/index.ts +65 -0
  153. package/src/movethewheels/constants/mockData.ts +1342 -0
  154. package/src/movethewheels/hooks/index.ts +55 -0
  155. package/src/movethewheels/hooks/useAnalytics.ts +476 -0
  156. package/src/movethewheels/hooks/useCustomers.ts +359 -0
  157. package/src/movethewheels/hooks/useFleet.ts +778 -0
  158. package/src/movethewheels/hooks/useInventory.ts +632 -0
  159. package/src/movethewheels/hooks/useOrders.ts +703 -0
  160. package/src/movethewheels/hooks/useRoutes.ts +453 -0
  161. package/src/movethewheels/hooks/useTracking.ts +505 -0
  162. package/src/movethewheels/index.ts +68 -0
  163. package/src/movethewheels/pages/AIAssistantPage.tsx +160 -0
  164. package/src/movethewheels/pages/AnalyticsPage.tsx +190 -0
  165. package/src/movethewheels/pages/CreateOrderPage.tsx +454 -0
  166. package/src/movethewheels/pages/CustomerDetailsPage.tsx +207 -0
  167. package/src/movethewheels/pages/CustomersPage.tsx +115 -0
  168. package/src/movethewheels/pages/DashboardPage.tsx +414 -0
  169. package/src/movethewheels/pages/DriverDetailsPage.tsx +261 -0
  170. package/src/movethewheels/pages/DriversPage.tsx +118 -0
  171. package/src/movethewheels/pages/FinancePage.tsx +141 -0
  172. package/src/movethewheels/pages/FleetPage.tsx +289 -0
  173. package/src/movethewheels/pages/ImportExportPage.tsx +165 -0
  174. package/src/movethewheels/pages/InventoryPage.tsx +212 -0
  175. package/src/movethewheels/pages/LiveTrackingPage.tsx +325 -0
  176. package/src/movethewheels/pages/MarketplacePage.tsx +235 -0
  177. package/src/movethewheels/pages/OrderDetailsPage.tsx +387 -0
  178. package/src/movethewheels/pages/OrdersListPage.tsx +241 -0
  179. package/src/movethewheels/pages/ProductDetailsPage.tsx +155 -0
  180. package/src/movethewheels/pages/ProductsPage.tsx +124 -0
  181. package/src/movethewheels/pages/ReportsPage.tsx +164 -0
  182. package/src/movethewheels/pages/RouteDetailsPage.tsx +245 -0
  183. package/src/movethewheels/pages/RoutesPage.tsx +104 -0
  184. package/src/movethewheels/pages/SettingsPage.tsx +242 -0
  185. package/src/movethewheels/pages/TrackingPage.tsx +419 -0
  186. package/src/movethewheels/pages/VehicleDetailsPage.tsx +218 -0
  187. package/src/movethewheels/pages/VehiclesPage.tsx +124 -0
  188. package/src/movethewheels/pages/WarehouseDetailsPage.tsx +216 -0
  189. package/src/movethewheels/pages/WarehousesPage.tsx +122 -0
  190. package/src/movethewheels/providers/MoveTheWheelsProvider.tsx +66 -0
  191. package/src/movethewheels/store/movethewheelsStore.ts +136 -0
  192. package/src/movethewheels/types/index.ts +744 -0
  193. package/src/movethewheels/utils/cn.ts +9 -0
  194. package/src/movethewheels/utils/formatters.ts +215 -0
  195. package/src/movethewheels/utils/graphqlClient.ts +63 -0
  196. package/src/movethewheels/utils/index.ts +8 -0
  197. package/src/movethewheels/utils/navigation.ts +70 -0
  198. package/src/operations/global/.gitkeep +0 -0
  199. package/src/operations/wspace/movethewheels/fragments/core.graphql +191 -0
  200. package/src/operations/wspace/movethewheels/mutations/entities.graphql +87 -0
  201. package/src/operations/wspace/movethewheels/mutations/logistics.graphql +86 -0
  202. package/src/operations/wspace/movethewheels/mutations/marketplace-reports.graphql +81 -0
  203. package/src/operations/wspace/movethewheels/mutations/orders.graphql +21 -0
  204. package/src/operations/wspace/movethewheels/queries/dashboard.graphql +61 -0
  205. package/src/operations/wspace/movethewheels/queries/entities.graphql +83 -0
  206. package/src/operations/wspace/movethewheels/queries/logistics.graphql +84 -0
  207. package/src/operations/wspace/movethewheels/queries/marketplace-reports.graphql +40 -0
  208. package/src/operations/wspace/movethewheels/queries/orders.graphql +43 -0
@@ -0,0 +1,55 @@
1
+ /**
2
+ * MoveTheWheels Hooks
3
+ *
4
+ * All custom hooks for data access and operations.
5
+ */
6
+
7
+ // Orders
8
+ export { useOrders, useOrder, useOrderStats } from './useOrders';
9
+
10
+ // Fleet (Vehicles & Drivers)
11
+ export {
12
+ useFleet,
13
+ useVehicles,
14
+ useVehicle,
15
+ useDrivers,
16
+ useDriver,
17
+ useFleetStats,
18
+ } from './useFleet';
19
+
20
+ // Inventory (Products & Warehouses)
21
+ export {
22
+ useInventory,
23
+ useProducts,
24
+ useProduct,
25
+ useWarehouses,
26
+ useWarehouse,
27
+ useInventoryStats,
28
+ } from './useInventory';
29
+
30
+ // Customers
31
+ export { useCustomers, useCustomer, useCustomerStats } from './useCustomers';
32
+
33
+ // Routes
34
+ export { useRoutes, useRoute, useRouteStats } from './useRoutes';
35
+
36
+ // Analytics
37
+ export {
38
+ useAnalytics,
39
+ useDashboardMetrics,
40
+ useRevenueAnalytics,
41
+ useOrderAnalytics,
42
+ useFleetAnalytics,
43
+ usePerformanceAnalytics,
44
+ } from './useAnalytics';
45
+
46
+ // Tracking
47
+ export {
48
+ useTracking,
49
+ useOrderTracking,
50
+ useVehicleTracking,
51
+ useDriverTracking,
52
+ useLiveTracking,
53
+ useTrackingAlerts,
54
+ useGeofence,
55
+ } from './useTracking';
@@ -0,0 +1,476 @@
1
+ import { useCallback, useEffect, useMemo, useState } from 'react';
2
+ import { useMoveTheWheels } from '../providers/MoveTheWheelsProvider';
3
+ import type { Analytics } from '../types';
4
+ import { executeGraphQL } from '../utils/graphqlClient';
5
+
6
+ interface UseAnalyticsOptions {
7
+ dateRange?: {
8
+ from: Date;
9
+ to: Date;
10
+ };
11
+ }
12
+
13
+ interface UseAnalyticsResult {
14
+ analytics: Analytics;
15
+ isLoading: boolean;
16
+ error: Error | null;
17
+ refetch: () => void;
18
+ }
19
+
20
+ const ANALYTICS_QUERY = `
21
+ query GetMovethewheelsAnalytics {
22
+ analytics {
23
+ orderTrend {
24
+ label
25
+ value
26
+ }
27
+ deliveryTrend {
28
+ label
29
+ value
30
+ }
31
+ revenueTrend {
32
+ label
33
+ value
34
+ }
35
+ }
36
+ dashboardMetrics {
37
+ totalOrders
38
+ activeDeliveries
39
+ availableDrivers
40
+ activeVehicles
41
+ lowStockItems
42
+ totalRevenue
43
+ }
44
+ fleetStats {
45
+ totalVehicles
46
+ activeVehicles
47
+ maintenanceVehicles
48
+ }
49
+ }
50
+ `;
51
+
52
+ const DASHBOARD_QUERY = `
53
+ query GetDashboardMetrics {
54
+ dashboardMetrics {
55
+ totalOrders
56
+ activeDeliveries
57
+ availableDrivers
58
+ activeVehicles
59
+ lowStockItems
60
+ totalRevenue
61
+ }
62
+ orderStats {
63
+ total
64
+ pending
65
+ inTransit
66
+ delivered
67
+ cancelled
68
+ failed
69
+ }
70
+ fleetStats {
71
+ totalVehicles
72
+ activeVehicles
73
+ maintenanceVehicles
74
+ totalDrivers
75
+ availableDrivers
76
+ onDeliveryDrivers
77
+ }
78
+ financeMetrics {
79
+ revenue {
80
+ totalRevenue
81
+ averageOrderValue
82
+ }
83
+ }
84
+ }
85
+ `;
86
+
87
+ const ORDER_ANALYTICS_QUERY = `
88
+ query GetOrderAnalytics {
89
+ orderStats {
90
+ pending
91
+ inTransit
92
+ delivered
93
+ cancelled
94
+ failed
95
+ }
96
+ analytics {
97
+ orderTrend {
98
+ label
99
+ value
100
+ }
101
+ }
102
+ }
103
+ `;
104
+
105
+ function emptyAnalytics(): Analytics {
106
+ return {
107
+ overview: {
108
+ totalOrders: 0,
109
+ totalRevenue: 0,
110
+ activeVehicles: 0,
111
+ onTimeDeliveryRate: 0,
112
+ customerSatisfaction: 0,
113
+ },
114
+ trends: {
115
+ dailyOrders: [],
116
+ revenue: [],
117
+ },
118
+ fleet: {
119
+ utilization: 0,
120
+ totalVehicles: 0,
121
+ activeVehicles: 0,
122
+ maintenanceVehicles: 0,
123
+ outOfServiceVehicles: 0,
124
+ fuelEfficiency: 0,
125
+ },
126
+ performance: {
127
+ onTimePickup: 0,
128
+ onTimeDelivery: 0,
129
+ damagedItems: 0,
130
+ customerComplaints: 0,
131
+ driverRatings: 0,
132
+ },
133
+ };
134
+ }
135
+
136
+ export function useAnalytics(_options: UseAnalyticsOptions = {}): UseAnalyticsResult {
137
+ const { apiGatewayUrl, authToken, workspaceToken, workspaceId, tenantId, currentUser } =
138
+ useMoveTheWheels();
139
+ const [analytics, setAnalytics] = useState<Analytics>(emptyAnalytics());
140
+ const [isLoading, setIsLoading] = useState(false);
141
+ const [error, setError] = useState<Error | null>(null);
142
+
143
+ const graphQLOptions = useMemo(
144
+ () => ({
145
+ apiGatewayUrl,
146
+ authToken,
147
+ workspaceToken,
148
+ workspaceId,
149
+ tenantId,
150
+ actorId: currentUser?.id,
151
+ }),
152
+ [apiGatewayUrl, authToken, workspaceToken, workspaceId, tenantId, currentUser?.id]
153
+ );
154
+
155
+ const load = useCallback(async () => {
156
+ setIsLoading(true);
157
+ setError(null);
158
+ try {
159
+ const data = await executeGraphQL<{
160
+ analytics: {
161
+ orderTrend: Array<{ label: string; value: number }>;
162
+ revenueTrend: Array<{ label: string; value: number }>;
163
+ };
164
+ dashboardMetrics: {
165
+ totalOrders: number;
166
+ totalRevenue: number;
167
+ activeVehicles: number;
168
+ };
169
+ fleetStats: {
170
+ totalVehicles: number;
171
+ activeVehicles: number;
172
+ maintenanceVehicles: number;
173
+ };
174
+ }>(graphQLOptions, ANALYTICS_QUERY);
175
+
176
+ setAnalytics({
177
+ overview: {
178
+ totalOrders: data.dashboardMetrics.totalOrders,
179
+ totalRevenue: data.dashboardMetrics.totalRevenue,
180
+ activeVehicles: data.dashboardMetrics.activeVehicles,
181
+ onTimeDeliveryRate: 0,
182
+ customerSatisfaction: 0,
183
+ },
184
+ trends: {
185
+ dailyOrders: data.analytics.orderTrend.map((item) => ({
186
+ date: item.label,
187
+ orders: Math.round(item.value),
188
+ })),
189
+ revenue: data.analytics.revenueTrend.map((item) => ({
190
+ month: item.label,
191
+ revenue: item.value,
192
+ })),
193
+ },
194
+ fleet: {
195
+ utilization:
196
+ data.fleetStats.totalVehicles > 0
197
+ ? (data.fleetStats.activeVehicles / data.fleetStats.totalVehicles) * 100
198
+ : 0,
199
+ totalVehicles: data.fleetStats.totalVehicles,
200
+ activeVehicles: data.fleetStats.activeVehicles,
201
+ maintenanceVehicles: data.fleetStats.maintenanceVehicles,
202
+ outOfServiceVehicles: Math.max(
203
+ data.fleetStats.totalVehicles -
204
+ data.fleetStats.activeVehicles -
205
+ data.fleetStats.maintenanceVehicles,
206
+ 0
207
+ ),
208
+ fuelEfficiency: 0,
209
+ },
210
+ performance: {
211
+ onTimePickup: 0,
212
+ onTimeDelivery: 0,
213
+ damagedItems: 0,
214
+ customerComplaints: 0,
215
+ driverRatings: 0,
216
+ },
217
+ });
218
+ } catch (fetchError) {
219
+ setError(fetchError instanceof Error ? fetchError : new Error('Failed to load analytics'));
220
+ } finally {
221
+ setIsLoading(false);
222
+ }
223
+ }, [graphQLOptions]);
224
+
225
+ useEffect(() => {
226
+ void load();
227
+ }, [load]);
228
+
229
+ const refetch = useCallback(() => {
230
+ void load();
231
+ }, [load]);
232
+
233
+ return { analytics, isLoading, error, refetch };
234
+ }
235
+
236
+ export function useDashboardMetrics() {
237
+ const { apiGatewayUrl, authToken, workspaceToken, workspaceId, tenantId, currentUser } =
238
+ useMoveTheWheels();
239
+ const [metrics, setMetrics] = useState({
240
+ orders: {
241
+ total: 0,
242
+ pending: 0,
243
+ inTransit: 0,
244
+ delivered: 0,
245
+ today: 0,
246
+ },
247
+ fleet: {
248
+ totalVehicles: 0,
249
+ activeVehicles: 0,
250
+ totalDrivers: 0,
251
+ availableDrivers: 0,
252
+ },
253
+ revenue: {
254
+ total: 0,
255
+ avgOrderValue: 0,
256
+ currency: 'USD',
257
+ },
258
+ performance: {
259
+ onTimeDeliveryRate: 0,
260
+ avgDriverRating: 0,
261
+ },
262
+ });
263
+ const [isLoading, setIsLoading] = useState(false);
264
+ const [error, setError] = useState<Error | null>(null);
265
+
266
+ const graphQLOptions = useMemo(
267
+ () => ({
268
+ apiGatewayUrl,
269
+ authToken,
270
+ workspaceToken,
271
+ workspaceId,
272
+ tenantId,
273
+ actorId: currentUser?.id,
274
+ }),
275
+ [apiGatewayUrl, authToken, workspaceToken, workspaceId, tenantId, currentUser?.id]
276
+ );
277
+
278
+ useEffect(() => {
279
+ const load = async () => {
280
+ setIsLoading(true);
281
+ setError(null);
282
+ try {
283
+ const data = await executeGraphQL<{
284
+ orderStats: {
285
+ total: number;
286
+ pending: number;
287
+ inTransit: number;
288
+ delivered: number;
289
+ };
290
+ fleetStats: {
291
+ totalVehicles: number;
292
+ activeVehicles: number;
293
+ totalDrivers: number;
294
+ availableDrivers: number;
295
+ };
296
+ financeMetrics: {
297
+ revenue: {
298
+ totalRevenue: number;
299
+ averageOrderValue: number;
300
+ };
301
+ };
302
+ }>(graphQLOptions, DASHBOARD_QUERY);
303
+
304
+ setMetrics({
305
+ orders: {
306
+ total: data.orderStats.total,
307
+ pending: data.orderStats.pending,
308
+ inTransit: data.orderStats.inTransit,
309
+ delivered: data.orderStats.delivered,
310
+ today: 0,
311
+ },
312
+ fleet: {
313
+ totalVehicles: data.fleetStats.totalVehicles,
314
+ activeVehicles: data.fleetStats.activeVehicles,
315
+ totalDrivers: data.fleetStats.totalDrivers,
316
+ availableDrivers: data.fleetStats.availableDrivers,
317
+ },
318
+ revenue: {
319
+ total: data.financeMetrics.revenue.totalRevenue,
320
+ avgOrderValue: data.financeMetrics.revenue.averageOrderValue,
321
+ currency: 'USD',
322
+ },
323
+ performance: {
324
+ onTimeDeliveryRate: 0,
325
+ avgDriverRating: 0,
326
+ },
327
+ });
328
+ } catch (fetchError) {
329
+ setError(
330
+ fetchError instanceof Error ? fetchError : new Error('Failed to load dashboard metrics')
331
+ );
332
+ } finally {
333
+ setIsLoading(false);
334
+ }
335
+ };
336
+
337
+ void load();
338
+ }, [graphQLOptions]);
339
+
340
+ return { metrics, isLoading, error };
341
+ }
342
+
343
+ export function useRevenueAnalytics(period: 'daily' | 'weekly' | 'monthly' = 'monthly') {
344
+ const { analytics, isLoading, error } = useAnalytics();
345
+
346
+ const revenueData = useMemo(() => {
347
+ if (period === 'daily') {
348
+ return analytics.trends.dailyOrders.map((item) => ({
349
+ label: item.date,
350
+ value: item.orders,
351
+ }));
352
+ }
353
+
354
+ return analytics.trends.revenue.map((item) => ({
355
+ label: item.month,
356
+ value: item.revenue,
357
+ }));
358
+ }, [analytics.trends.dailyOrders, analytics.trends.revenue, period]);
359
+
360
+ return { revenueData, isLoading, error };
361
+ }
362
+
363
+ export function useOrderAnalytics() {
364
+ const { apiGatewayUrl, authToken, workspaceToken, workspaceId, tenantId, currentUser } =
365
+ useMoveTheWheels();
366
+ const [orderData, setOrderData] = useState({
367
+ byStatus: [] as Array<{ status: string; count: number }>,
368
+ byType: [] as Array<{ type: string; count: number }>,
369
+ byPriority: [] as Array<{ priority: string; count: number }>,
370
+ trends: [] as Array<{ date: string; orders: number }>,
371
+ });
372
+ const [isLoading, setIsLoading] = useState(false);
373
+ const [error, setError] = useState<Error | null>(null);
374
+
375
+ const graphQLOptions = useMemo(
376
+ () => ({
377
+ apiGatewayUrl,
378
+ authToken,
379
+ workspaceToken,
380
+ workspaceId,
381
+ tenantId,
382
+ actorId: currentUser?.id,
383
+ }),
384
+ [apiGatewayUrl, authToken, workspaceToken, workspaceId, tenantId, currentUser?.id]
385
+ );
386
+
387
+ useEffect(() => {
388
+ const load = async () => {
389
+ setIsLoading(true);
390
+ setError(null);
391
+ try {
392
+ const data = await executeGraphQL<{
393
+ orderStats: {
394
+ pending: number;
395
+ inTransit: number;
396
+ delivered: number;
397
+ cancelled: number;
398
+ failed: number;
399
+ };
400
+ analytics: {
401
+ orderTrend: Array<{ label: string; value: number }>;
402
+ };
403
+ }>(graphQLOptions, ORDER_ANALYTICS_QUERY);
404
+
405
+ setOrderData({
406
+ byStatus: [
407
+ { status: 'pending', count: data.orderStats.pending },
408
+ { status: 'in_transit', count: data.orderStats.inTransit },
409
+ { status: 'delivered', count: data.orderStats.delivered },
410
+ { status: 'cancelled', count: data.orderStats.cancelled },
411
+ { status: 'failed', count: data.orderStats.failed },
412
+ ],
413
+ byType: [],
414
+ byPriority: [],
415
+ trends: data.analytics.orderTrend.map((item) => ({
416
+ date: item.label,
417
+ orders: Math.round(item.value),
418
+ })),
419
+ });
420
+ } catch (fetchError) {
421
+ setError(
422
+ fetchError instanceof Error ? fetchError : new Error('Failed to load order analytics')
423
+ );
424
+ } finally {
425
+ setIsLoading(false);
426
+ }
427
+ };
428
+
429
+ void load();
430
+ }, [graphQLOptions]);
431
+
432
+ return { orderData, isLoading, error };
433
+ }
434
+
435
+ export function useFleetAnalytics() {
436
+ const { analytics, isLoading, error } = useAnalytics();
437
+
438
+ const fleetData = useMemo(
439
+ () => ({
440
+ vehicleUtilization: analytics.fleet.utilization,
441
+ avgFuelLevel: 0,
442
+ vehiclesByType: [] as Array<{ type: string; count: number }>,
443
+ driverPerformance: [] as Array<{
444
+ id: string;
445
+ name: string;
446
+ completedOrders: number;
447
+ rating: number;
448
+ onTimeRate: number;
449
+ }>,
450
+ fleetStats: analytics.fleet,
451
+ }),
452
+ [analytics.fleet]
453
+ );
454
+
455
+ return { fleetData, isLoading, error };
456
+ }
457
+
458
+ export function usePerformanceAnalytics() {
459
+ const { analytics, isLoading, error } = useAnalytics();
460
+
461
+ const performanceData = useMemo(
462
+ () => ({
463
+ ...analytics.performance,
464
+ driverRatings: [] as Array<{
465
+ name: string;
466
+ overall: number;
467
+ punctuality: number;
468
+ communication: number;
469
+ handling: number;
470
+ }>,
471
+ }),
472
+ [analytics.performance]
473
+ );
474
+
475
+ return { performanceData, isLoading, error };
476
+ }