@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,703 @@
1
+ import { useCallback, useEffect, useMemo, useState } from 'react';
2
+ import { useMoveTheWheels } from '../providers/MoveTheWheelsProvider';
3
+ import type { Order, OrderFilter, OrderStatus } from '../types';
4
+ import { executeGraphQL } from '../utils/graphqlClient';
5
+
6
+ interface UseOrdersOptions {
7
+ filters?: OrderFilter;
8
+ limit?: number;
9
+ offset?: number;
10
+ }
11
+
12
+ interface UseOrdersResult {
13
+ orders: Order[];
14
+ totalOrders: number;
15
+ isLoading: boolean;
16
+ error: Error | null;
17
+ refetch: () => void;
18
+ createOrder: (order: Partial<Order>) => Promise<Order>;
19
+ updateOrder: (id: string, updates: Partial<Order>) => Promise<Order>;
20
+ deleteOrder: (id: string) => Promise<void>;
21
+ updateOrderStatus: (id: string, status: OrderStatus) => Promise<Order>;
22
+ }
23
+
24
+ interface ApiOrder {
25
+ id: string;
26
+ orderNumber: string;
27
+ customerId: string;
28
+ orderType: string;
29
+ status: string;
30
+ priority: string;
31
+ pickupAddress: Record<string, unknown> | null;
32
+ deliveryAddress: Record<string, unknown> | null;
33
+ items: unknown;
34
+ pricing: unknown;
35
+ trackingNumber?: string | null;
36
+ specialInstructions?: string | null;
37
+ scheduledDelivery?: string | null;
38
+ vehicleId?: string | null;
39
+ driverId?: string | null;
40
+ createdAt: string;
41
+ updatedAt: string;
42
+ customer?: {
43
+ name?: string | null;
44
+ email?: string | null;
45
+ phone?: string | null;
46
+ company?: string | null;
47
+ } | null;
48
+ statusHistory?: Array<{
49
+ status: string;
50
+ notes?: string | null;
51
+ location?: Record<string, unknown> | null;
52
+ createdAt: string;
53
+ createdBy?: string | null;
54
+ }>;
55
+ }
56
+
57
+ const LIST_ORDERS_QUERY = `
58
+ query ListMovethewheelsOrders($filter: OrderFilterInput, $pagination: PaginationInput) {
59
+ movethewheelsOrders(filter: $filter, pagination: $pagination) {
60
+ id
61
+ orderNumber
62
+ customerId
63
+ orderType
64
+ status
65
+ priority
66
+ pickupAddress
67
+ deliveryAddress
68
+ items
69
+ pricing
70
+ trackingNumber
71
+ specialInstructions
72
+ scheduledDelivery
73
+ vehicleId
74
+ driverId
75
+ createdAt
76
+ updatedAt
77
+ customer {
78
+ name
79
+ email
80
+ phone
81
+ company
82
+ }
83
+ statusHistory {
84
+ status
85
+ notes
86
+ location
87
+ createdAt
88
+ createdBy
89
+ }
90
+ }
91
+ }
92
+ `;
93
+
94
+ const GET_ORDER_QUERY = `
95
+ query GetMovethewheelsOrder($id: ID!) {
96
+ movethewheelsOrder(id: $id) {
97
+ id
98
+ orderNumber
99
+ customerId
100
+ orderType
101
+ status
102
+ priority
103
+ pickupAddress
104
+ deliveryAddress
105
+ items
106
+ pricing
107
+ trackingNumber
108
+ specialInstructions
109
+ scheduledDelivery
110
+ vehicleId
111
+ driverId
112
+ createdAt
113
+ updatedAt
114
+ customer {
115
+ name
116
+ email
117
+ phone
118
+ company
119
+ }
120
+ statusHistory {
121
+ status
122
+ notes
123
+ location
124
+ createdAt
125
+ createdBy
126
+ }
127
+ }
128
+ }
129
+ `;
130
+
131
+ const ORDER_STATS_QUERY = `
132
+ query GetOrderStatsBundle {
133
+ orderStats {
134
+ total
135
+ pending
136
+ inTransit
137
+ delivered
138
+ cancelled
139
+ failed
140
+ }
141
+ financeMetrics {
142
+ revenue {
143
+ totalRevenue
144
+ averageOrderValue
145
+ }
146
+ }
147
+ }
148
+ `;
149
+
150
+ const CREATE_ORDER_MUTATION = `
151
+ mutation CreateMovethewheelsOrder($input: CreateOrderInput!) {
152
+ createMovethewheelsOrder(input: $input) {
153
+ id
154
+ orderNumber
155
+ customerId
156
+ orderType
157
+ status
158
+ priority
159
+ pickupAddress
160
+ deliveryAddress
161
+ items
162
+ pricing
163
+ trackingNumber
164
+ specialInstructions
165
+ scheduledDelivery
166
+ vehicleId
167
+ driverId
168
+ createdAt
169
+ updatedAt
170
+ customer {
171
+ name
172
+ email
173
+ phone
174
+ company
175
+ }
176
+ statusHistory {
177
+ status
178
+ notes
179
+ location
180
+ createdAt
181
+ createdBy
182
+ }
183
+ }
184
+ }
185
+ `;
186
+
187
+ const UPDATE_ORDER_MUTATION = `
188
+ mutation UpdateMovethewheelsOrder($id: ID!, $input: UpdateOrderInput!) {
189
+ updateMovethewheelsOrder(id: $id, input: $input) {
190
+ id
191
+ orderNumber
192
+ customerId
193
+ orderType
194
+ status
195
+ priority
196
+ pickupAddress
197
+ deliveryAddress
198
+ items
199
+ pricing
200
+ trackingNumber
201
+ specialInstructions
202
+ scheduledDelivery
203
+ vehicleId
204
+ driverId
205
+ createdAt
206
+ updatedAt
207
+ customer {
208
+ name
209
+ email
210
+ phone
211
+ company
212
+ }
213
+ statusHistory {
214
+ status
215
+ notes
216
+ location
217
+ createdAt
218
+ createdBy
219
+ }
220
+ }
221
+ }
222
+ `;
223
+
224
+ const UPDATE_ORDER_STATUS_MUTATION = `
225
+ mutation UpdateMovethewheelsOrderStatus($id: ID!, $input: UpdateOrderStatusInput!) {
226
+ updateMovethewheelsOrderStatus(id: $id, input: $input) {
227
+ id
228
+ orderNumber
229
+ customerId
230
+ orderType
231
+ status
232
+ priority
233
+ pickupAddress
234
+ deliveryAddress
235
+ items
236
+ pricing
237
+ trackingNumber
238
+ specialInstructions
239
+ scheduledDelivery
240
+ vehicleId
241
+ driverId
242
+ createdAt
243
+ updatedAt
244
+ customer {
245
+ name
246
+ email
247
+ phone
248
+ company
249
+ }
250
+ statusHistory {
251
+ status
252
+ notes
253
+ location
254
+ createdAt
255
+ createdBy
256
+ }
257
+ }
258
+ }
259
+ `;
260
+
261
+ const DELETE_ORDER_MUTATION = `
262
+ mutation DeleteMovethewheelsOrder($id: ID!) {
263
+ deleteMovethewheelsOrder(id: $id)
264
+ }
265
+ `;
266
+
267
+ function mapOrderStatus(status: string): OrderStatus {
268
+ switch (status) {
269
+ case 'PENDING':
270
+ return 'pending';
271
+ case 'CONFIRMED':
272
+ return 'confirmed';
273
+ case 'ASSIGNED':
274
+ return 'assigned';
275
+ case 'PICKED_UP':
276
+ return 'picked_up';
277
+ case 'IN_TRANSIT':
278
+ return 'in_transit';
279
+ case 'OUT_FOR_DELIVERY':
280
+ return 'out_for_delivery';
281
+ case 'DELIVERED':
282
+ return 'delivered';
283
+ case 'CANCELLED':
284
+ return 'cancelled';
285
+ default:
286
+ return 'failed';
287
+ }
288
+ }
289
+
290
+ function mapOrderType(type: string): 'b2b' | 'b2c' {
291
+ return type === 'B2B' ? 'b2b' : 'b2c';
292
+ }
293
+
294
+ function mapOrderPriority(priority: string): 'low' | 'normal' | 'high' | 'urgent' {
295
+ switch (priority) {
296
+ case 'LOW':
297
+ return 'low';
298
+ case 'HIGH':
299
+ return 'high';
300
+ case 'URGENT':
301
+ case 'CRITICAL':
302
+ return 'urgent';
303
+ default:
304
+ return 'normal';
305
+ }
306
+ }
307
+
308
+ function toApiStatus(status: OrderStatus): string {
309
+ switch (status) {
310
+ case 'pending':
311
+ return 'PENDING';
312
+ case 'confirmed':
313
+ return 'CONFIRMED';
314
+ case 'assigned':
315
+ return 'ASSIGNED';
316
+ case 'picked_up':
317
+ return 'PICKED_UP';
318
+ case 'in_transit':
319
+ return 'IN_TRANSIT';
320
+ case 'out_for_delivery':
321
+ return 'OUT_FOR_DELIVERY';
322
+ case 'delivered':
323
+ return 'DELIVERED';
324
+ case 'cancelled':
325
+ return 'CANCELLED';
326
+ default:
327
+ return 'FAILED';
328
+ }
329
+ }
330
+
331
+ function toApiOrderType(orderType: 'b2b' | 'b2c' | undefined): string {
332
+ return orderType === 'b2b' ? 'B2B' : 'B2C';
333
+ }
334
+
335
+ function toApiPriority(priority: 'low' | 'normal' | 'high' | 'urgent' | undefined): string {
336
+ switch (priority) {
337
+ case 'low':
338
+ return 'LOW';
339
+ case 'high':
340
+ return 'HIGH';
341
+ case 'urgent':
342
+ return 'URGENT';
343
+ default:
344
+ return 'MEDIUM';
345
+ }
346
+ }
347
+
348
+ function mapAddress(address: Record<string, unknown> | null | undefined): Order['pickupAddress'] {
349
+ return {
350
+ street: '',
351
+ city: '',
352
+ state: '',
353
+ postalCode: '',
354
+ country: '',
355
+ ...(address ?? {}),
356
+ } as Order['pickupAddress'];
357
+ }
358
+
359
+ function mapOrder(order: ApiOrder): Order {
360
+ return {
361
+ id: order.id,
362
+ orderNumber: order.orderNumber,
363
+ customerId: order.customerId,
364
+ customerInfo: {
365
+ name: order.customer?.name ?? 'Unknown Customer',
366
+ email: order.customer?.email ?? '',
367
+ phone: order.customer?.phone ?? '',
368
+ company: order.customer?.company ?? undefined,
369
+ },
370
+ items: Array.isArray(order.items) ? (order.items as Order['items']) : [],
371
+ status: mapOrderStatus(order.status),
372
+ orderType: mapOrderType(order.orderType),
373
+ priority: mapOrderPriority(order.priority),
374
+ pickupAddress: mapAddress(order.pickupAddress),
375
+ deliveryAddress: mapAddress(order.deliveryAddress),
376
+ trackingNumber: order.trackingNumber ?? '',
377
+ specialInstructions: order.specialInstructions ?? undefined,
378
+ pricing: {
379
+ subtotal: 0,
380
+ taxes: 0,
381
+ fees: { delivery: 0, handling: 0 },
382
+ total: 0,
383
+ currency: 'USD',
384
+ paymentMethod: 'unknown',
385
+ paymentStatus: 'pending',
386
+ ...(typeof order.pricing === 'object' && order.pricing !== null ? order.pricing : {}),
387
+ } as Order['pricing'],
388
+ timeline:
389
+ order.statusHistory?.map((entry) => ({
390
+ timestamp: new Date(entry.createdAt),
391
+ status: mapOrderStatus(entry.status),
392
+ location: entry.location as Order['timeline'][number]['location'],
393
+ notes: entry.notes ?? undefined,
394
+ performedBy: entry.createdBy ?? 'system',
395
+ })) ?? [],
396
+ scheduledDelivery: order.scheduledDelivery ? new Date(order.scheduledDelivery) : undefined,
397
+ vehicleId: order.vehicleId ?? undefined,
398
+ driverId: order.driverId ?? undefined,
399
+ createdAt: new Date(order.createdAt),
400
+ updatedAt: new Date(order.updatedAt),
401
+ };
402
+ }
403
+
404
+ export function useOrders(options: UseOrdersOptions = {}): UseOrdersResult {
405
+ const { filters, limit = 20, offset = 0 } = options;
406
+ const { apiGatewayUrl, authToken, workspaceToken, workspaceId, tenantId, currentUser } =
407
+ useMoveTheWheels();
408
+
409
+ const [orders, setOrders] = useState<Order[]>([]);
410
+ const [isLoading, setIsLoading] = useState(false);
411
+ const [error, setError] = useState<Error | null>(null);
412
+
413
+ const graphQLOptions = useMemo(
414
+ () => ({
415
+ apiGatewayUrl,
416
+ authToken,
417
+ workspaceToken,
418
+ workspaceId,
419
+ tenantId,
420
+ actorId: currentUser?.id,
421
+ }),
422
+ [apiGatewayUrl, authToken, workspaceToken, workspaceId, tenantId, currentUser?.id]
423
+ );
424
+
425
+ const loadOrders = useCallback(async () => {
426
+ setIsLoading(true);
427
+ setError(null);
428
+ try {
429
+ const data = await executeGraphQL<{
430
+ movethewheelsOrders: ApiOrder[];
431
+ }>(graphQLOptions, LIST_ORDERS_QUERY, {
432
+ filter: {
433
+ status: filters?.status ? toApiStatus(filters.status) : undefined,
434
+ priority: filters?.priority
435
+ ? toApiPriority(filters.priority as 'low' | 'normal' | 'high' | 'urgent')
436
+ : undefined,
437
+ orderType: filters?.orderType ? toApiOrderType(filters.orderType) : undefined,
438
+ customerId: filters?.customerId,
439
+ driverId: filters?.driverId,
440
+ },
441
+ pagination: { limit, offset },
442
+ });
443
+
444
+ setOrders(data.movethewheelsOrders.map(mapOrder));
445
+ } catch (fetchError) {
446
+ setError(fetchError instanceof Error ? fetchError : new Error('Failed to load orders'));
447
+ } finally {
448
+ setIsLoading(false);
449
+ }
450
+ }, [filters, graphQLOptions, limit, offset]);
451
+
452
+ useEffect(() => {
453
+ void loadOrders();
454
+ }, [loadOrders]);
455
+
456
+ const refetch = useCallback(() => {
457
+ void loadOrders();
458
+ }, [loadOrders]);
459
+
460
+ const createOrder = useCallback(
461
+ async (orderData: Partial<Order>): Promise<Order> => {
462
+ const orderNumber =
463
+ orderData.orderNumber ??
464
+ `ORD-${new Date().getFullYear()}-${Date.now().toString().slice(-6)}`;
465
+
466
+ const data = await executeGraphQL<{
467
+ createMovethewheelsOrder: ApiOrder;
468
+ }>(graphQLOptions, CREATE_ORDER_MUTATION, {
469
+ input: {
470
+ orderNumber,
471
+ orderType: toApiOrderType(orderData.orderType),
472
+ status: toApiStatus(orderData.status ?? 'pending'),
473
+ priority: toApiPriority(orderData.priority),
474
+ customerId: orderData.customerId,
475
+ pickupAddress: orderData.pickupAddress ?? {},
476
+ deliveryAddress: orderData.deliveryAddress ?? {},
477
+ items: orderData.items ?? [],
478
+ pricing: orderData.pricing ?? null,
479
+ specialInstructions: orderData.specialInstructions,
480
+ trackingNumber: orderData.trackingNumber,
481
+ scheduledDelivery: orderData.scheduledDelivery?.toISOString(),
482
+ vehicleId: orderData.vehicleId,
483
+ driverId: orderData.driverId,
484
+ },
485
+ });
486
+
487
+ const created = mapOrder(data.createMovethewheelsOrder);
488
+ setOrders((previous) => [created, ...previous]);
489
+ return created;
490
+ },
491
+ [graphQLOptions]
492
+ );
493
+
494
+ const updateOrder = useCallback(
495
+ async (id: string, updates: Partial<Order>): Promise<Order> => {
496
+ const data = await executeGraphQL<{
497
+ updateMovethewheelsOrder: ApiOrder;
498
+ }>(graphQLOptions, UPDATE_ORDER_MUTATION, {
499
+ id,
500
+ input: {
501
+ orderType: updates.orderType ? toApiOrderType(updates.orderType) : undefined,
502
+ status: updates.status ? toApiStatus(updates.status) : undefined,
503
+ priority: updates.priority ? toApiPriority(updates.priority) : undefined,
504
+ customerId: updates.customerId,
505
+ pickupAddress: updates.pickupAddress,
506
+ deliveryAddress: updates.deliveryAddress,
507
+ items: updates.items,
508
+ pricing: updates.pricing,
509
+ specialInstructions: updates.specialInstructions,
510
+ trackingNumber: updates.trackingNumber,
511
+ scheduledDelivery: updates.scheduledDelivery?.toISOString(),
512
+ vehicleId: updates.vehicleId,
513
+ driverId: updates.driverId,
514
+ },
515
+ });
516
+
517
+ const updated = mapOrder(data.updateMovethewheelsOrder);
518
+ setOrders((previous) => previous.map((item) => (item.id === id ? updated : item)));
519
+ return updated;
520
+ },
521
+ [graphQLOptions]
522
+ );
523
+
524
+ const deleteOrder = useCallback(
525
+ async (id: string): Promise<void> => {
526
+ await executeGraphQL<{ deleteMovethewheelsOrder: boolean }>(
527
+ graphQLOptions,
528
+ DELETE_ORDER_MUTATION,
529
+ { id }
530
+ );
531
+ setOrders((previous) => previous.filter((item) => item.id !== id));
532
+ },
533
+ [graphQLOptions]
534
+ );
535
+
536
+ const updateOrderStatus = useCallback(
537
+ async (id: string, status: OrderStatus): Promise<Order> => {
538
+ const data = await executeGraphQL<{
539
+ updateMovethewheelsOrderStatus: ApiOrder;
540
+ }>(graphQLOptions, UPDATE_ORDER_STATUS_MUTATION, {
541
+ id,
542
+ input: {
543
+ status: toApiStatus(status),
544
+ },
545
+ });
546
+
547
+ const updated = mapOrder(data.updateMovethewheelsOrderStatus);
548
+ setOrders((previous) => previous.map((item) => (item.id === id ? updated : item)));
549
+ return updated;
550
+ },
551
+ [graphQLOptions]
552
+ );
553
+
554
+ return {
555
+ orders,
556
+ totalOrders: orders.length,
557
+ isLoading,
558
+ error,
559
+ refetch,
560
+ createOrder,
561
+ updateOrder,
562
+ deleteOrder,
563
+ updateOrderStatus,
564
+ };
565
+ }
566
+
567
+ export function useOrder(orderId: string | undefined) {
568
+ const { apiGatewayUrl, authToken, workspaceToken, workspaceId, tenantId, currentUser } =
569
+ useMoveTheWheels();
570
+ const [order, setOrder] = useState<Order | null>(null);
571
+ const [isLoading, setIsLoading] = useState(false);
572
+ const [error, setError] = useState<Error | null>(null);
573
+
574
+ const graphQLOptions = useMemo(
575
+ () => ({
576
+ apiGatewayUrl,
577
+ authToken,
578
+ workspaceToken,
579
+ workspaceId,
580
+ tenantId,
581
+ actorId: currentUser?.id,
582
+ }),
583
+ [apiGatewayUrl, authToken, workspaceToken, workspaceId, tenantId, currentUser?.id]
584
+ );
585
+
586
+ const loadOrder = useCallback(async () => {
587
+ if (!orderId) {
588
+ setOrder(null);
589
+ return;
590
+ }
591
+
592
+ setIsLoading(true);
593
+ setError(null);
594
+ try {
595
+ const data = await executeGraphQL<{
596
+ movethewheelsOrder: ApiOrder | null;
597
+ }>(graphQLOptions, GET_ORDER_QUERY, { id: orderId });
598
+
599
+ setOrder(data.movethewheelsOrder ? mapOrder(data.movethewheelsOrder) : null);
600
+ } catch (fetchError) {
601
+ setError(fetchError instanceof Error ? fetchError : new Error('Failed to load order'));
602
+ } finally {
603
+ setIsLoading(false);
604
+ }
605
+ }, [graphQLOptions, orderId]);
606
+
607
+ useEffect(() => {
608
+ void loadOrder();
609
+ }, [loadOrder]);
610
+
611
+ const refetch = useCallback(() => {
612
+ void loadOrder();
613
+ }, [loadOrder]);
614
+
615
+ return { order, isLoading, error, refetch };
616
+ }
617
+
618
+ export function useOrderStats() {
619
+ const { apiGatewayUrl, authToken, workspaceToken, workspaceId, tenantId, currentUser } =
620
+ useMoveTheWheels();
621
+ const [isLoading, setIsLoading] = useState(false);
622
+ const [error, setError] = useState<Error | null>(null);
623
+ const [stats, setStats] = useState({
624
+ total: 0,
625
+ byStatus: {
626
+ pending: 0,
627
+ confirmed: 0,
628
+ assigned: 0,
629
+ picked_up: 0,
630
+ in_transit: 0,
631
+ out_for_delivery: 0,
632
+ delivered: 0,
633
+ cancelled: 0,
634
+ failed: 0,
635
+ },
636
+ totalRevenue: 0,
637
+ todayOrders: 0,
638
+ avgOrderValue: 0,
639
+ });
640
+
641
+ const graphQLOptions = useMemo(
642
+ () => ({
643
+ apiGatewayUrl,
644
+ authToken,
645
+ workspaceToken,
646
+ workspaceId,
647
+ tenantId,
648
+ actorId: currentUser?.id,
649
+ }),
650
+ [apiGatewayUrl, authToken, workspaceToken, workspaceId, tenantId, currentUser?.id]
651
+ );
652
+
653
+ const loadStats = useCallback(async () => {
654
+ setIsLoading(true);
655
+ setError(null);
656
+ try {
657
+ const data = await executeGraphQL<{
658
+ orderStats: {
659
+ total: number;
660
+ pending: number;
661
+ inTransit: number;
662
+ delivered: number;
663
+ cancelled: number;
664
+ failed: number;
665
+ };
666
+ financeMetrics: {
667
+ revenue: {
668
+ totalRevenue: number;
669
+ averageOrderValue: number;
670
+ };
671
+ };
672
+ }>(graphQLOptions, ORDER_STATS_QUERY);
673
+
674
+ setStats({
675
+ total: data.orderStats.total,
676
+ byStatus: {
677
+ pending: data.orderStats.pending,
678
+ confirmed: 0,
679
+ assigned: 0,
680
+ picked_up: 0,
681
+ in_transit: data.orderStats.inTransit,
682
+ out_for_delivery: 0,
683
+ delivered: data.orderStats.delivered,
684
+ cancelled: data.orderStats.cancelled,
685
+ failed: data.orderStats.failed,
686
+ },
687
+ totalRevenue: data.financeMetrics.revenue.totalRevenue,
688
+ todayOrders: 0,
689
+ avgOrderValue: data.financeMetrics.revenue.averageOrderValue,
690
+ });
691
+ } catch (fetchError) {
692
+ setError(fetchError instanceof Error ? fetchError : new Error('Failed to load order stats'));
693
+ } finally {
694
+ setIsLoading(false);
695
+ }
696
+ }, [graphQLOptions]);
697
+
698
+ useEffect(() => {
699
+ void loadStats();
700
+ }, [loadStats]);
701
+
702
+ return { stats, isLoading, error };
703
+ }