@burdenoff/microfe-movethewheels 2026.703.7 → 2026.703.8

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 (104) hide show
  1. package/dist/{AIAssistantPage-B7FGmmKT.js → AIAssistantPage-MWJLAMN_.js} +5 -5
  2. package/dist/{AnalyticsPage-DXduj5KB.js → AnalyticsPage-900jpV2T.js} +9 -9
  3. package/dist/{CreateOrderPage-DuJJQ16b.js → CreateOrderPage-V8aXfcpN.js} +11 -11
  4. package/dist/{CustomerDetailsPage-C98SKw7Z.js → CustomerDetailsPage-CHzg75Q5.js} +16 -16
  5. package/dist/{CustomersPage-s8hK55JL.js → CustomersPage-CwtVspuq.js} +11 -11
  6. package/dist/{DashboardPage-BsEgcKEN.js → DashboardPage-DiD-cWwD.js} +17 -17
  7. package/dist/{DataTable-Da7yHjM1.js → DataTable-CmdZd6iV.js} +7 -7
  8. package/dist/{DocumentsCard-CziaTJhP.js → DocumentsCard-y2ybnAlu.js} +4 -4
  9. package/dist/{DriverDetailsPage-CBzAmM6s.js → DriverDetailsPage-DjaXaATQ.js} +14 -14
  10. package/dist/{DriversPage-Duy_ITG6.js → DriversPage-DW-FGPFW.js} +11 -11
  11. package/dist/{FinancePage-BZtPTpmT.js → FinancePage-DYadOUzC.js} +9 -9
  12. package/dist/{FleetPage-DJfzoHbs.js → FleetPage-P9k4zZqP.js} +10 -10
  13. package/dist/{FormError-CWjGwOW8.js → FormError-D4T5FWZA.js} +1 -1
  14. package/dist/{ImportExportPage-DJ77GK_7.js → ImportExportPage-BhWGfbH3.js} +6 -6
  15. package/dist/{InventoryPage-Dpnwk_N3.js → InventoryPage-BWikjZMW.js} +10 -10
  16. package/dist/{LiveTrackingPage-CLlvsP1B.js → LiveTrackingPage-UQBWlthJ.js} +10 -10
  17. package/dist/{MarketplacePage-d99r-v6p.js → MarketplacePage-DMH0HNDH.js} +9 -9
  18. package/dist/{MetricCard-DA5ZqAVl.js → MetricCard-CqU5WsyW.js} +2 -2
  19. package/dist/{Notice-kkjV2rLR.js → Notice-BrXJ85dA.js} +2 -2
  20. package/dist/{OrderDetailsPage-BePtkyN0.js → OrderDetailsPage-2J4ua0wd.js} +28 -24
  21. package/dist/{OrdersListPage-Csy_KScx.js → OrdersListPage-DvICveRv.js} +14 -14
  22. package/dist/{PageLayout-h_q9l8af.js → PageLayout-j9Zw3wBN.js} +579 -561
  23. package/dist/{ProductDetailsPage-BMlRoR9E.js → ProductDetailsPage-BSjWLrty.js} +9 -9
  24. package/dist/{ProductsPage-B4jWJ5bv.js → ProductsPage-Bn1U2jTj.js} +9 -9
  25. package/dist/{ReportsPage-ALRYfXtz.js → ReportsPage-MU8F9DQC.js} +9 -9
  26. package/dist/{RouteDetailsPage-Btb1MSIS.js → RouteDetailsPage-CgSY1CTd.js} +18 -18
  27. package/dist/{RoutesPage-CQHCDInT.js → RoutesPage-Dqd5Don6.js} +7 -7
  28. package/dist/{SettingsPage-BYBRrlGe.js → SettingsPage-2a05Sq2k.js} +4 -4
  29. package/dist/{Sparkline-Q-6bJ24J.js → Sparkline-DTGdlxUH.js} +1 -1
  30. package/dist/{StatusBadge-1W2p8fEi.js → StatusBadge-BfiF-nNI.js} +1 -1
  31. package/dist/{TrackingPage-CFndTIyk.js → TrackingPage-SnjW6qeD.js} +11 -11
  32. package/dist/{VehicleDetailsPage-DNLrMljV.js → VehicleDetailsPage-CvRMJ2zC.js} +12 -12
  33. package/dist/{VehiclesPage-ClkfFZxL.js → VehiclesPage-qxf-1C1B.js} +12 -12
  34. package/dist/{WarehouseDetailsPage-CAQFz7l_.js → WarehouseDetailsPage-D0Wyyj1Y.js} +11 -11
  35. package/dist/{WarehousesPage-kNba6cr3.js → WarehousesPage-44Wj7AGT.js} +8 -8
  36. package/dist/{arrow-left-XOzFvBFD.js → arrow-left-1dVWv2dg.js} +1 -1
  37. package/dist/{arrow-right-CRrwlvFe.js → arrow-right-PUCNATnk.js} +1 -1
  38. package/dist/{arrow-up-ClFaLPly.js → arrow-up-VQuGMABN.js} +1 -1
  39. package/dist/{box-BX4WyCLv.js → box-DW1KNP8j.js} +1 -1
  40. package/dist/{boxes-R3nq5f0_.js → boxes-D6I00XqA.js} +1 -1
  41. package/dist/{chart-column-BgF8J9bx.js → chart-column-BwQ5H9ol.js} +1 -1
  42. package/dist/{charts-BS_OnWc6.js → charts-Dv_zxP7L.js} +2 -2
  43. package/dist/{chevron-left-D3hcLQ1g.js → chevron-left-DzNxoaBG.js} +1 -1
  44. package/dist/{chevron-right-BpfSrzQF.js → chevron-right-CKm3ZC1T.js} +1 -1
  45. package/dist/{circle-alert-CLqT8iCQ.js → circle-alert-CtBm6oIb.js} +1 -1
  46. package/dist/{circle-check-CWLAr_8f.js → circle-check-B_Y7FDyR.js} +1 -1
  47. package/dist/{circle-check-big-Dsuz8dJ2.js → circle-check-big-H5pLiMBW.js} +1 -1
  48. package/dist/{clock-DrZOQD8h.js → clock-B4-qjGuB.js} +1 -1
  49. package/dist/{dollar-sign-CJfKfYul.js → dollar-sign-CYGHy2oS.js} +1 -1
  50. package/dist/{download-C-yNvUiL.js → download-BJonq2ty.js} +1 -1
  51. package/dist/{file-text-m2SyQgBo.js → file-text-C-cZx58r.js} +1 -1
  52. package/dist/{filter-uA6govE9.js → filter-B_S6WOqr.js} +1 -1
  53. package/dist/{fuel-BroSIBo1.js → fuel-Cjt6IxKr.js} +1 -1
  54. package/dist/index.js +33 -33
  55. package/dist/{map-BzwQ__kD.js → map-CO0aWUae.js} +1 -1
  56. package/dist/{map-pin-BGbmEGn3.js → map-pin-BISLzLwb.js} +1 -1
  57. package/dist/{maps-DpIuSSmg.js → maps-CtfuCAmh.js} +1 -1
  58. package/dist/{navigation-CjKGLL9T.js → navigation-BFki5UJz.js} +1 -1
  59. package/dist/{package-D36cKFvu.js → package-UyaWiALC.js} +1 -1
  60. package/dist/{phone-mMZFHd1Z.js → phone-Bav_V7rR.js} +1 -1
  61. package/dist/{plus-DY5R-c1j.js → plus-Bk_G-lFC.js} +1 -1
  62. package/dist/{refresh-cw-DyOLYuDU.js → refresh-cw-C4-jecjy.js} +1 -1
  63. package/dist/{route-CuaZ1wU3.js → route-WpCP6F1x.js} +1 -1
  64. package/dist/{save-h9dzHwJE.js → save-CcfoIn2J.js} +1 -1
  65. package/dist/{search-stTGSec-.js → search-C3YRxW9e.js} +1 -1
  66. package/dist/{square-pen-DT5srCPD.js → square-pen-Dr1X-P2s.js} +1 -1
  67. package/dist/{star-gp4yO3PF.js → star-1Ixfuzai.js} +1 -1
  68. package/dist/{store-DJZDAvCY.js → store-BwU935v5.js} +1 -1
  69. package/dist/{trash-2-DwcjTxYE.js → trash-2-CC4KugEJ.js} +1 -1
  70. package/dist/{trending-up-2q2sPVsb.js → trending-up-1brglj1E.js} +1 -1
  71. package/dist/{triangle-alert-CU60xaOi.js → triangle-alert-Dh56Yu3-.js} +1 -1
  72. package/dist/{truck-ByZxqZhI.js → truck-DxhtLfkG.js} +1 -1
  73. package/dist/{upload-CWor1uj3.js → upload-CLf0JLXW.js} +1 -1
  74. package/dist/{useAssistant-uoc8wjr0.js → useAssistant-B9qBtRKm.js} +1 -1
  75. package/dist/{useCustomers-BPPhQXSH.js → useCustomers-BQ4AIEAT.js} +1 -1
  76. package/dist/{useFleet-CT_iW2V9.js → useFleet-BXSocBD_.js} +1 -1
  77. package/dist/{useImportExport-BG0Cg_D9.js → useImportExport-7-O8noRJ.js} +1 -1
  78. package/dist/{useInventory-BtBGnOC2.js → useInventory-DmZficcp.js} +1 -1
  79. package/dist/{useOrders-BC-1mCc0.js → useOrders-B5FV0kcz.js} +1 -1
  80. package/dist/{useReports-Cx8blThR.js → useReports-hUXb8ryJ.js} +1 -1
  81. package/dist/{useRoutes-8fw8oO6y.js → useRoutes-C_ZCYJ_h.js} +1 -1
  82. package/dist/{useSettings-Do5WSUaI.js → useSettings-CteNasBE.js} +1 -1
  83. package/dist/{useTracking-Dogilo5C.js → useTracking-B7ttexRe.js} +3 -3
  84. package/dist/{user-Dr_JS2FF.js → user-B1IjWJtn.js} +1 -1
  85. package/dist/{user-check-CBSiMH6I.js → user-check-Cx6fHHll.js} +1 -1
  86. package/dist/{users-BRV9-2nV.js → users-BKmsb79k.js} +1 -1
  87. package/dist/{warehouse-CmIAl0_w.js → warehouse-DE1irFyJ.js} +1 -1
  88. package/dist/{wrench-6U-BTSbg.js → wrench-DTJGFs17.js} +1 -1
  89. package/dist/{x-DX8sZrkd.js → x-CvsUGJy1.js} +1 -1
  90. package/package.json +1 -1
  91. package/src/movethewheels/components/GlassPanel.tsx +1 -3
  92. package/src/movethewheels/components/MetricCard.tsx +16 -3
  93. package/src/movethewheels/components/charts/StatusDonut.tsx +2 -6
  94. package/src/movethewheels/components/charts/TrendChart.tsx +2 -6
  95. package/src/movethewheels/components/maps/LogisticsMap.tsx +1 -4
  96. package/src/movethewheels/components/maps/RouteMap.tsx +3 -5
  97. package/src/movethewheels/components/maps/TrackingMap.tsx +11 -2
  98. package/src/movethewheels/pages/CustomerDetailsPage.tsx +3 -2
  99. package/src/movethewheels/pages/DriverDetailsPage.tsx +2 -2
  100. package/src/movethewheels/pages/OrderDetailsPage.tsx +2 -1
  101. package/src/movethewheels/pages/VehicleDetailsPage.tsx +2 -2
  102. package/src/movethewheels/pages/VehiclesPage.tsx +9 -1
  103. package/src/movethewheels/pages/WarehouseDetailsPage.tsx +3 -1
  104. package/src/movethewheels/utils/graphqlClient.ts +51 -1
@@ -1,4 +1,4 @@
1
- import { ut as e } from "./PageLayout-h_q9l8af.js";
1
+ import { ut as e } from "./PageLayout-j9Zw3wBN.js";
2
2
  //#region node_modules/lucide-react/dist/esm/icons/search.js
3
3
  var t = e("Search", [["circle", {
4
4
  cx: "11",
@@ -1,4 +1,4 @@
1
- import { ut as e } from "./PageLayout-h_q9l8af.js";
1
+ import { ut as e } from "./PageLayout-j9Zw3wBN.js";
2
2
  //#region node_modules/lucide-react/dist/esm/icons/square-pen.js
3
3
  var t = e("SquarePen", [["path", {
4
4
  d: "M12 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7",
@@ -1,4 +1,4 @@
1
- import { ut as e } from "./PageLayout-h_q9l8af.js";
1
+ import { ut as e } from "./PageLayout-j9Zw3wBN.js";
2
2
  //#region node_modules/lucide-react/dist/esm/icons/star.js
3
3
  var t = e("Star", [["path", {
4
4
  d: "M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z",
@@ -1,4 +1,4 @@
1
- import { ut as e } from "./PageLayout-h_q9l8af.js";
1
+ import { ut as e } from "./PageLayout-j9Zw3wBN.js";
2
2
  //#region node_modules/lucide-react/dist/esm/icons/store.js
3
3
  var t = e("Store", [
4
4
  ["path", {
@@ -1,4 +1,4 @@
1
- import { ut as e } from "./PageLayout-h_q9l8af.js";
1
+ import { ut as e } from "./PageLayout-j9Zw3wBN.js";
2
2
  //#region node_modules/lucide-react/dist/esm/icons/trash-2.js
3
3
  var t = e("Trash2", [
4
4
  ["path", {
@@ -1,4 +1,4 @@
1
- import { ut as e } from "./PageLayout-h_q9l8af.js";
1
+ import { ut as e } from "./PageLayout-j9Zw3wBN.js";
2
2
  //#region node_modules/lucide-react/dist/esm/icons/trending-up.js
3
3
  var t = e("TrendingUp", [["polyline", {
4
4
  points: "22 7 13.5 15.5 8.5 10.5 2 17",
@@ -1,4 +1,4 @@
1
- import { ut as e } from "./PageLayout-h_q9l8af.js";
1
+ import { ut as e } from "./PageLayout-j9Zw3wBN.js";
2
2
  //#region node_modules/lucide-react/dist/esm/icons/triangle-alert.js
3
3
  var t = e("TriangleAlert", [
4
4
  ["path", {
@@ -1,4 +1,4 @@
1
- import { ut as e } from "./PageLayout-h_q9l8af.js";
1
+ import { ut as e } from "./PageLayout-j9Zw3wBN.js";
2
2
  //#region node_modules/lucide-react/dist/esm/icons/truck.js
3
3
  var t = e("Truck", [
4
4
  ["path", {
@@ -1,4 +1,4 @@
1
- import { ut as e } from "./PageLayout-h_q9l8af.js";
1
+ import { ut as e } from "./PageLayout-j9Zw3wBN.js";
2
2
  //#region node_modules/lucide-react/dist/esm/icons/upload.js
3
3
  var t = e("Upload", [
4
4
  ["path", {
@@ -1,4 +1,4 @@
1
- import { at as e, st as t, ut as n } from "./PageLayout-h_q9l8af.js";
1
+ import { at as e, st as t, ut as n } from "./PageLayout-j9Zw3wBN.js";
2
2
  import { useCallback as r, useMemo as i, useState as a } from "react";
3
3
  //#region node_modules/lucide-react/dist/esm/icons/bot.js
4
4
  var o = n("Bot", [
@@ -1,4 +1,4 @@
1
- import { at as e, st as t } from "./PageLayout-h_q9l8af.js";
1
+ import { at as e, st as t } from "./PageLayout-j9Zw3wBN.js";
2
2
  import { useCallback as n, useEffect as r, useMemo as i, useState as a } from "react";
3
3
  //#region src/movethewheels/hooks/useCustomers.ts
4
4
  var o = "\n query ListCustomers($filter: CustomerFilterInput, $pagination: PaginationInput) {\n customers(filter: $filter, pagination: $pagination) {\n id\n name\n email\n phone\n type\n company\n address\n businessLicense\n taxId\n rating\n createdAt\n updatedAt\n deletedAt\n }\n }\n", s = "\n query GetCustomer($id: ID!) {\n customer(id: $id) {\n id\n name\n email\n phone\n type\n company\n address\n businessLicense\n taxId\n rating\n createdAt\n updatedAt\n deletedAt\n }\n }\n", c = "\n mutation CreateCustomer($input: CreateCustomerInput!) {\n createCustomer(input: $input) {\n id\n name\n email\n phone\n type\n company\n address\n businessLicense\n taxId\n rating\n createdAt\n updatedAt\n deletedAt\n }\n }\n", l = "\n mutation UpdateCustomer($id: ID!, $input: UpdateCustomerInput!) {\n updateCustomer(id: $id, input: $input) {\n id\n name\n email\n phone\n type\n company\n address\n businessLicense\n taxId\n rating\n createdAt\n updatedAt\n deletedAt\n }\n }\n", u = "\n mutation DeleteCustomer($id: ID!) {\n deleteCustomer(id: $id)\n }\n";
@@ -1,4 +1,4 @@
1
- import { at as e, st as t } from "./PageLayout-h_q9l8af.js";
1
+ import { at as e, st as t } from "./PageLayout-j9Zw3wBN.js";
2
2
  import { useCallback as n, useEffect as r, useMemo as i, useState as a } from "react";
3
3
  //#region src/movethewheels/hooks/useFleet.ts
4
4
  var o = "\n query ListVehicles($filter: VehicleFilterInput, $pagination: PaginationInput) {\n vehicles(filter: $filter, pagination: $pagination) {\n id\n vehicleNumber\n type\n make\n model\n year\n capacity\n status\n currentLocation\n fuelLevel\n mileage\n createdAt\n updatedAt\n }\n }\n", s = "\n query ListDrivers($filter: DriverFilterInput, $pagination: PaginationInput) {\n drivers(filter: $filter, pagination: $pagination) {\n id\n userId\n firstName\n lastName\n employeeId\n licenseNumber\n licenseClass\n licenseExpiry\n status\n currentLocation\n rating\n vehicleId\n createdAt\n }\n }\n", c = "\n query GetVehicle($id: ID!) {\n vehicle(id: $id) {\n id\n vehicleNumber\n type\n make\n model\n year\n capacity\n status\n currentLocation\n fuelLevel\n mileage\n createdAt\n updatedAt\n }\n }\n", l = "\n query GetDriver($id: ID!) {\n driver(id: $id) {\n id\n userId\n firstName\n lastName\n employeeId\n licenseNumber\n licenseClass\n licenseExpiry\n status\n currentLocation\n rating\n vehicleId\n createdAt\n }\n }\n", u = "\n mutation UpdateVehicleStatus($id: ID!, $status: VehicleStatus!) {\n updateVehicleStatus(id: $id, status: $status) {\n id\n vehicleNumber\n type\n make\n model\n year\n capacity\n status\n currentLocation\n fuelLevel\n mileage\n createdAt\n updatedAt\n }\n }\n", d = "\n mutation AssignDriverVehicle($id: ID!, $vehicleId: ID) {\n assignDriverVehicle(id: $id, vehicleId: $vehicleId) {\n id\n userId\n firstName\n lastName\n employeeId\n licenseNumber\n licenseClass\n licenseExpiry\n status\n currentLocation\n rating\n vehicleId\n createdAt\n }\n }\n", f = "\n mutation UpdateDriverStatus($id: ID!, $status: DriverStatus!) {\n updateDriverStatus(id: $id, status: $status) {\n id\n userId\n firstName\n lastName\n employeeId\n licenseNumber\n licenseClass\n licenseExpiry\n status\n currentLocation\n rating\n vehicleId\n createdAt\n }\n }\n", p = "\n mutation CreateVehicle($input: CreateVehicleInput!) {\n createVehicle(input: $input) {\n id\n vehicleNumber\n type\n make\n model\n year\n capacity\n status\n currentLocation\n fuelLevel\n mileage\n createdAt\n updatedAt\n }\n }\n", m = "\n mutation CreateDriver($input: CreateDriverInput!) {\n createDriver(input: $input) {\n id\n userId\n firstName\n lastName\n employeeId\n licenseNumber\n licenseClass\n licenseExpiry\n status\n currentLocation\n rating\n vehicleId\n createdAt\n }\n }\n", h = "\n query GetFleetStats {\n fleetStats {\n totalVehicles\n activeVehicles\n inTransitVehicles\n maintenanceVehicles\n totalDrivers\n availableDrivers\n onDeliveryDrivers\n avgDriverRating\n }\n }\n";
@@ -1,4 +1,4 @@
1
- import { at as e, st as t } from "./PageLayout-h_q9l8af.js";
1
+ import { at as e, st as t } from "./PageLayout-j9Zw3wBN.js";
2
2
  import { useCallback as n, useMemo as r, useState as i } from "react";
3
3
  //#region src/movethewheels/hooks/useImportExport.ts
4
4
  var a = "\n mutation MovethewheelsExportData($input: MovethewheelsExportDataInput!) {\n exportData(input: $input) {\n success\n message\n payload\n }\n }\n", o = "\n mutation MovethewheelsImportData($input: MovethewheelsImportDataInput!) {\n importData(input: $input) {\n success\n message\n payload\n }\n }\n";
@@ -1,4 +1,4 @@
1
- import { at as e, st as t } from "./PageLayout-h_q9l8af.js";
1
+ import { at as e, st as t } from "./PageLayout-j9Zw3wBN.js";
2
2
  import { useCallback as n, useEffect as r, useMemo as i, useState as a } from "react";
3
3
  //#region src/movethewheels/hooks/useInventory.ts
4
4
  var o = "\n query ListInventoryItems($filter: InventoryFilterInput, $pagination: PaginationInput) {\n inventoryItems(filter: $filter, pagination: $pagination) {\n id\n productId\n warehouseId\n onHand\n available\n allocated\n damaged\n reorderPoint\n createdAt\n updatedAt\n }\n }\n", s = "\n query ListProducts($filter: ProductFilterInput, $pagination: PaginationInput) {\n products(filter: $filter, pagination: $pagination) {\n id\n sku\n name\n description\n category\n brand\n dimensions\n weight\n value\n hazardous\n fragile\n temperatureControlled\n createdAt\n updatedAt\n }\n }\n", c = "\n query ListWarehouses($filter: WarehouseFilterInput, $pagination: PaginationInput) {\n warehouses(filter: $filter, pagination: $pagination) {\n id\n name\n code\n type\n address\n totalCapacity\n usedCapacity\n createdAt\n }\n }\n", l = "\n query GetProduct($id: ID!) {\n product(id: $id) {\n id\n sku\n name\n description\n category\n brand\n dimensions\n weight\n value\n hazardous\n fragile\n temperatureControlled\n createdAt\n updatedAt\n }\n }\n", u = "\n query GetWarehouse($id: ID!) {\n warehouse(id: $id) {\n id\n name\n code\n type\n address\n totalCapacity\n usedCapacity\n createdAt\n }\n }\n", d = "\n query GetInventoryStats {\n inventoryStats {\n totalOnHand\n totalAvailable\n totalAllocated\n totalDamaged\n lowStockCount\n }\n }\n", f = "\n mutation CreateProduct($input: CreateProductInput!) {\n createProduct(input: $input) {\n id\n sku\n name\n description\n category\n brand\n dimensions\n weight\n value\n hazardous\n fragile\n temperatureControlled\n createdAt\n updatedAt\n }\n }\n", p = "\n mutation CreateWarehouse($input: CreateWarehouseInput!) {\n createWarehouse(input: $input) {\n id\n name\n code\n type\n address\n totalCapacity\n usedCapacity\n createdAt\n }\n }\n", m = "\n mutation AdjustInventoryStock($input: AdjustInventoryStockInput!) {\n adjustInventoryStock(input: $input) {\n id\n productId\n warehouseId\n onHand\n available\n allocated\n damaged\n reorderPoint\n createdAt\n updatedAt\n }\n }\n";
@@ -1,4 +1,4 @@
1
- import { at as e, st as t } from "./PageLayout-h_q9l8af.js";
1
+ import { at as e, st as t } from "./PageLayout-j9Zw3wBN.js";
2
2
  import { useCallback as n, useEffect as r, useMemo as i, useState as a } from "react";
3
3
  //#region src/movethewheels/hooks/useOrders.ts
4
4
  var o = "\n query ListMovethewheelsOrders($filter: OrderFilterInput, $pagination: PaginationInput) {\n movethewheelsOrders(filter: $filter, pagination: $pagination) {\n id\n orderNumber\n customerId\n orderType\n status\n priority\n pickupAddress\n deliveryAddress\n items\n pricing\n trackingNumber\n specialInstructions\n scheduledDelivery\n vehicleId\n driverId\n createdAt\n updatedAt\n customer {\n name\n email\n phone\n company\n }\n statusHistory {\n status\n notes\n location\n createdAt\n createdBy\n }\n }\n }\n", s = "\n query GetMovethewheelsOrder($id: ID!) {\n movethewheelsOrder(id: $id) {\n id\n orderNumber\n customerId\n orderType\n status\n priority\n pickupAddress\n deliveryAddress\n items\n pricing\n trackingNumber\n specialInstructions\n scheduledDelivery\n vehicleId\n driverId\n createdAt\n updatedAt\n customer {\n name\n email\n phone\n company\n }\n statusHistory {\n status\n notes\n location\n createdAt\n createdBy\n }\n }\n }\n", c = "\n query GetOrderStatsBundle {\n orderStats {\n total\n pending\n inTransit\n delivered\n cancelled\n failed\n }\n financeMetrics {\n revenue {\n totalRevenue\n averageOrderValue\n }\n }\n }\n", l = "\n mutation CreateMovethewheelsOrder($input: CreateOrderInput!) {\n createMovethewheelsOrder(input: $input) {\n id\n orderNumber\n customerId\n orderType\n status\n priority\n pickupAddress\n deliveryAddress\n items\n pricing\n trackingNumber\n specialInstructions\n scheduledDelivery\n vehicleId\n driverId\n createdAt\n updatedAt\n customer {\n name\n email\n phone\n company\n }\n statusHistory {\n status\n notes\n location\n createdAt\n createdBy\n }\n }\n }\n", u = "\n mutation UpdateMovethewheelsOrder($id: ID!, $input: UpdateOrderInput!) {\n updateMovethewheelsOrder(id: $id, input: $input) {\n id\n orderNumber\n customerId\n orderType\n status\n priority\n pickupAddress\n deliveryAddress\n items\n pricing\n trackingNumber\n specialInstructions\n scheduledDelivery\n vehicleId\n driverId\n createdAt\n updatedAt\n customer {\n name\n email\n phone\n company\n }\n statusHistory {\n status\n notes\n location\n createdAt\n createdBy\n }\n }\n }\n", d = "\n mutation UpdateMovethewheelsOrderStatus($id: ID!, $input: UpdateOrderStatusInput!) {\n updateMovethewheelsOrderStatus(id: $id, input: $input) {\n id\n orderNumber\n customerId\n orderType\n status\n priority\n pickupAddress\n deliveryAddress\n items\n pricing\n trackingNumber\n specialInstructions\n scheduledDelivery\n vehicleId\n driverId\n createdAt\n updatedAt\n customer {\n name\n email\n phone\n company\n }\n statusHistory {\n status\n notes\n location\n createdAt\n createdBy\n }\n }\n }\n", f = "\n mutation DeleteMovethewheelsOrder($id: ID!) {\n deleteMovethewheelsOrder(id: $id)\n }\n";
@@ -1,4 +1,4 @@
1
- import { at as e, st as t } from "./PageLayout-h_q9l8af.js";
1
+ import { at as e, st as t } from "./PageLayout-j9Zw3wBN.js";
2
2
  import { useCallback as n, useEffect as r, useMemo as i, useState as a } from "react";
3
3
  //#region src/movethewheels/hooks/useReports.ts
4
4
  var o = "\n id\n name\n description\n type\n status\n schedule\n lastGenerated\n createdAt\n updatedAt\n", s = `
@@ -1,4 +1,4 @@
1
- import { at as e, st as t } from "./PageLayout-h_q9l8af.js";
1
+ import { at as e, st as t } from "./PageLayout-j9Zw3wBN.js";
2
2
  import { useCallback as n, useEffect as r, useMemo as i, useState as a } from "react";
3
3
  //#region src/movethewheels/hooks/useRoutes.ts
4
4
  var o = "\n query ListRoutes($filter: RouteFilterInput, $pagination: PaginationInput) {\n routes(filter: $filter, pagination: $pagination) {\n id\n name\n status\n shipmentId\n vehicleId\n driverId\n waypoints\n estimatedDistance\n estimatedDuration\n fuelCost\n actualDistance\n actualDuration\n createdAt\n }\n }\n", s = "\n query GetRoute($id: ID!) {\n route(id: $id) {\n id\n name\n status\n shipmentId\n vehicleId\n driverId\n waypoints\n estimatedDistance\n estimatedDuration\n fuelCost\n actualDistance\n actualDuration\n createdAt\n }\n }\n", c = "\n mutation CreateRoute($input: CreateRouteInput!) {\n createRoute(input: $input) {\n id\n name\n status\n shipmentId\n vehicleId\n driverId\n waypoints\n estimatedDistance\n estimatedDuration\n fuelCost\n actualDistance\n actualDuration\n createdAt\n }\n }\n", l = "\n mutation UpdateRoute($id: ID!, $input: UpdateRouteInput!) {\n updateRoute(id: $id, input: $input) {\n id\n name\n status\n shipmentId\n vehicleId\n driverId\n waypoints\n estimatedDistance\n estimatedDuration\n fuelCost\n actualDistance\n actualDuration\n createdAt\n }\n }\n", u = "\n mutation DeleteRoute($id: ID!) {\n deleteRoute(id: $id)\n }\n", d = "\n mutation OptimizeRoute($id: ID!) {\n optimizeRoute(id: $id) {\n id\n name\n status\n shipmentId\n vehicleId\n driverId\n waypoints\n estimatedDistance\n estimatedDuration\n fuelCost\n actualDistance\n actualDuration\n createdAt\n }\n }\n";
@@ -1,4 +1,4 @@
1
- import { at as e, st as t, ut as n } from "./PageLayout-h_q9l8af.js";
1
+ import { at as e, st as t, ut as n } from "./PageLayout-j9Zw3wBN.js";
2
2
  import { useCallback as r, useEffect as i, useMemo as a, useState as o } from "react";
3
3
  //#region node_modules/lucide-react/dist/esm/icons/globe.js
4
4
  var s = n("Globe", [
@@ -1,6 +1,6 @@
1
- import { at as e, st as t } from "./PageLayout-h_q9l8af.js";
2
- import { r as n, t as r } from "./useOrders-BC-1mCc0.js";
3
- import { a as i, n as a, o, t as s } from "./useFleet-CT_iW2V9.js";
1
+ import { at as e, st as t } from "./PageLayout-j9Zw3wBN.js";
2
+ import { r as n, t as r } from "./useOrders-B5FV0kcz.js";
3
+ import { a as i, n as a, o, t as s } from "./useFleet-BXSocBD_.js";
4
4
  import { useCallback as c, useEffect as l, useMemo as u, useState as d } from "react";
5
5
  //#region src/movethewheels/hooks/useTracking.ts
6
6
  var f = "\n query ListShipments($filter: ShipmentFilterInput, $pagination: PaginationInput) {\n shipments(filter: $filter, pagination: $pagination) {\n id\n shipmentNumber\n orderId\n status\n estimatedDelivery\n }\n }\n", p = "\n query GetShipment($id: ID!) {\n shipment(id: $id) {\n id\n shipmentNumber\n orderId\n status\n estimatedDelivery\n trackingEvents {\n id\n shipmentId\n eventType\n location\n details\n timestamp\n }\n }\n }\n", m = "\n query GetOrderTracking($orderId: ID!) {\n orderTracking(orderId: $orderId) {\n id\n shipmentId\n eventType\n location\n details\n timestamp\n }\n }\n", h = "\n query GetActiveDeliveries {\n activeDeliveries {\n id\n shipmentNumber\n orderId\n status\n estimatedDelivery\n }\n }\n", g = "\n query GetTrackingAlerts {\n trackingAlerts {\n shipmentId\n shipmentNumber\n alertType\n message\n }\n }\n";
@@ -1,4 +1,4 @@
1
- import { ut as e } from "./PageLayout-h_q9l8af.js";
1
+ import { ut as e } from "./PageLayout-j9Zw3wBN.js";
2
2
  //#region node_modules/lucide-react/dist/esm/icons/user.js
3
3
  var t = e("User", [["path", {
4
4
  d: "M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2",
@@ -1,4 +1,4 @@
1
- import { ut as e } from "./PageLayout-h_q9l8af.js";
1
+ import { ut as e } from "./PageLayout-j9Zw3wBN.js";
2
2
  //#region node_modules/lucide-react/dist/esm/icons/user-check.js
3
3
  var t = e("UserCheck", [
4
4
  ["path", {
@@ -1,4 +1,4 @@
1
- import { ut as e } from "./PageLayout-h_q9l8af.js";
1
+ import { ut as e } from "./PageLayout-j9Zw3wBN.js";
2
2
  //#region node_modules/lucide-react/dist/esm/icons/users.js
3
3
  var t = e("Users", [
4
4
  ["path", {
@@ -1,4 +1,4 @@
1
- import { ut as e } from "./PageLayout-h_q9l8af.js";
1
+ import { ut as e } from "./PageLayout-j9Zw3wBN.js";
2
2
  //#region node_modules/lucide-react/dist/esm/icons/warehouse.js
3
3
  var t = e("Warehouse", [
4
4
  ["path", {
@@ -1,4 +1,4 @@
1
- import { ut as e } from "./PageLayout-h_q9l8af.js";
1
+ import { ut as e } from "./PageLayout-j9Zw3wBN.js";
2
2
  //#region node_modules/lucide-react/dist/esm/icons/wrench.js
3
3
  var t = e("Wrench", [["path", {
4
4
  d: "M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z",
@@ -1,4 +1,4 @@
1
- import { ut as e } from "./PageLayout-h_q9l8af.js";
1
+ import { ut as e } from "./PageLayout-j9Zw3wBN.js";
2
2
  //#region node_modules/lucide-react/dist/esm/icons/x.js
3
3
  var t = e("X", [["path", {
4
4
  d: "M18 6 6 18",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@burdenoff/microfe-movethewheels",
3
- "version": "2026.703.7",
3
+ "version": "2026.703.8",
4
4
  "description": "Burdenoff MoveTheWheels Microfrontend - Logistics & Supply Chain Management Platform",
5
5
  "type": "module",
6
6
  "files": [
@@ -58,9 +58,7 @@ export function GlassPanel({
58
58
  {title != null && (
59
59
  <h3 className="truncate text-sm font-semibold text-text-primary">{title}</h3>
60
60
  )}
61
- {description != null && (
62
- <p className="text-xs text-text-secondary">{description}</p>
63
- )}
61
+ {description != null && <p className="text-xs text-text-secondary">{description}</p>}
64
62
  </div>
65
63
  {action != null && <div className="flex shrink-0 items-center gap-2">{action}</div>}
66
64
  </div>
@@ -78,7 +78,13 @@ const accentChipClasses: Record<MetricAccent, string> = {
78
78
  function ArrowIcon({ direction }: { direction: 'up' | 'down' | 'flat' }) {
79
79
  if (direction === 'flat') {
80
80
  return (
81
- <svg className="h-3.5 w-3.5" fill="none" viewBox="0 0 24 24" stroke="currentColor" aria-hidden>
81
+ <svg
82
+ className="h-3.5 w-3.5"
83
+ fill="none"
84
+ viewBox="0 0 24 24"
85
+ stroke="currentColor"
86
+ aria-hidden
87
+ >
82
88
  <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2.5} d="M5 12h14" />
83
89
  </svg>
84
90
  );
@@ -91,7 +97,12 @@ function ArrowIcon({ direction }: { direction: 'up' | 'down' | 'flat' }) {
91
97
  stroke="currentColor"
92
98
  aria-hidden
93
99
  >
94
- <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2.5} d="M12 19V5m0 0l-6 6m6-6l6 6" />
100
+ <path
101
+ strokeLinecap="round"
102
+ strokeLinejoin="round"
103
+ strokeWidth={2.5}
104
+ d="M12 19V5m0 0l-6 6m6-6l6 6"
105
+ />
95
106
  </svg>
96
107
  );
97
108
  }
@@ -278,7 +289,9 @@ export function MetricCardSkeleton({ size = 'md' }: { size?: 'sm' | 'md' | 'lg'
278
289
  <div className="h-8 w-32 rounded bg-bg-sunken motion-safe:animate-vc-shimmer" />
279
290
  <div className="h-3 w-20 rounded bg-bg-sunken motion-safe:animate-vc-shimmer" />
280
291
  </div>
281
- <div className={cn('rounded-xl bg-bg-sunken motion-safe:animate-vc-shimmer', styles.icon)} />
292
+ <div
293
+ className={cn('rounded-xl bg-bg-sunken motion-safe:animate-vc-shimmer', styles.icon)}
294
+ />
282
295
  </div>
283
296
  </div>
284
297
  </GlassCard>
@@ -67,9 +67,7 @@ export function StatusDonut({
67
67
  <Tooltip
68
68
  content={
69
69
  <ChartTooltip
70
- formatter={(v) =>
71
- valueFormatter ? valueFormatter(Number(v)) : String(v)
72
- }
70
+ formatter={(v) => (valueFormatter ? valueFormatter(Number(v)) : String(v))}
73
71
  />
74
72
  }
75
73
  />
@@ -77,9 +75,7 @@ export function StatusDonut({
77
75
  </ResponsiveContainer>
78
76
  {centerLabel != null && (
79
77
  <div className="pointer-events-none absolute inset-0 flex flex-col items-center justify-center text-center">
80
- <span className="text-2xl font-bold tabular-nums text-text-primary">
81
- {centerLabel}
82
- </span>
78
+ <span className="text-2xl font-bold tabular-nums text-text-primary">{centerLabel}</span>
83
79
  {centerSubLabel && (
84
80
  <span className="text-xs text-text-secondary">{centerSubLabel}</span>
85
81
  )}
@@ -99,9 +99,7 @@ export function TrendChart({
99
99
  tickLine={false}
100
100
  axisLine={false}
101
101
  width={44}
102
- tickFormatter={
103
- valueFormatter ? (v: number) => valueFormatter(v, '') : undefined
104
- }
102
+ tickFormatter={valueFormatter ? (v: number) => valueFormatter(v, '') : undefined}
105
103
  />
106
104
  <Tooltip
107
105
  cursor={{ stroke: chartTokens.axis, strokeOpacity: 0.3 }}
@@ -144,9 +142,7 @@ export function TrendChart({
144
142
  tickLine={false}
145
143
  axisLine={false}
146
144
  width={44}
147
- tickFormatter={
148
- valueFormatter ? (v: number) => valueFormatter(v, '') : undefined
149
- }
145
+ tickFormatter={valueFormatter ? (v: number) => valueFormatter(v, '') : undefined}
150
146
  />
151
147
  <Tooltip
152
148
  cursor={{ stroke: chartTokens.axis, strokeOpacity: 0.3 }}
@@ -40,10 +40,7 @@ export function LogisticsMap({
40
40
  fitToMarkers = true,
41
41
  emptyMessage = 'No live locations yet',
42
42
  }: LogisticsMapProps) {
43
- const validMarkers = useMemo(
44
- () => markers.filter((m) => isRealCoord(m.lat, m.lng)),
45
- [markers]
46
- );
43
+ const validMarkers = useMemo(() => markers.filter((m) => isRealCoord(m.lat, m.lng)), [markers]);
47
44
 
48
45
  const validRoutes = useMemo(
49
46
  () =>
@@ -31,7 +31,8 @@ export function RouteMap({
31
31
  emptyMessage = 'No stops with coordinates yet',
32
32
  }: RouteMapProps) {
33
33
  const ordered = useMemo(
34
- () => [...stops].filter((s) => isRealCoord(s.lat, s.lng)).sort((a, b) => a.sequence - b.sequence),
34
+ () =>
35
+ [...stops].filter((s) => isRealCoord(s.lat, s.lng)).sort((a, b) => a.sequence - b.sequence),
35
36
  [stops]
36
37
  );
37
38
 
@@ -48,10 +49,7 @@ export function RouteMap({
48
49
  emptyState={<p className="text-sm text-text-secondary">{emptyMessage}</p>}
49
50
  >
50
51
  {line.length >= 2 && (
51
- <Polyline
52
- positions={line}
53
- pathOptions={{ color: routeColor, weight: 4, opacity: 0.85 }}
54
- />
52
+ <Polyline positions={line} pathOptions={{ color: routeColor, weight: 4, opacity: 0.85 }} />
55
53
  )}
56
54
  {ordered.map((s) => (
57
55
  <Marker
@@ -70,11 +70,20 @@ export function TrackingMap({
70
70
  {trailLine.length >= 2 && (
71
71
  <Polyline
72
72
  positions={trailLine}
73
- pathOptions={{ color: trailColor, weight: 4, opacity: 0.85, dashArray: '1 8', lineCap: 'round' }}
73
+ pathOptions={{
74
+ color: trailColor,
75
+ weight: 4,
76
+ opacity: 0.85,
77
+ dashArray: '1 8',
78
+ lineCap: 'round',
79
+ }}
74
80
  />
75
81
  )}
76
82
  {originOk && (
77
- <Marker position={[originOk.lat, originOk.lng]} icon={createPinIcon('origin', { glyph: false })}>
83
+ <Marker
84
+ position={[originOk.lat, originOk.lng]}
85
+ icon={createPinIcon('origin', { glyph: false })}
86
+ >
78
87
  <Popup>
79
88
  <span className="font-semibold">{originOk.label ?? 'Origin'}</span>
80
89
  </Popup>
@@ -116,8 +116,9 @@ function NewCustomerForm() {
116
116
  }
117
117
  >
118
118
  <PagePurpose icon={<Users size={18} />}>
119
- Add a customer once and their contact details auto-fill every future order you book for them.
120
- Only a name is required — add email, phone and company to make deliveries easier to arrange.
119
+ Add a customer once and their contact details auto-fill every future order you book for
120
+ them. Only a name is required — add email, phone and company to make deliveries easier to
121
+ arrange.
121
122
  </PagePurpose>
122
123
 
123
124
  <form onSubmit={handleSubmit} className="max-w-2xl space-y-6">
@@ -94,8 +94,8 @@ function NewDriverForm() {
94
94
  }
95
95
  >
96
96
  <PagePurpose icon={<Users size={18} />}>
97
- Add a driver so they can be assigned to orders and routes. An employee ID and name get them on
98
- the roster — add contact details and license number to keep the record complete.
97
+ Add a driver so they can be assigned to orders and routes. An employee ID and name get them
98
+ on the roster — add contact details and license number to keep the record complete.
99
99
  </PagePurpose>
100
100
 
101
101
  <form onSubmit={handleSubmit} className="max-w-2xl space-y-6">
@@ -548,7 +548,8 @@ export default function OrderDetailsPage() {
548
548
 
549
549
  <div className="space-y-2">
550
550
  <p className="text-sm text-text-secondary">
551
- Current status: <span className="font-medium">{STATUS_LABELS[order.status]}</span>
551
+ Current status:{' '}
552
+ <span className="font-medium">{STATUS_LABELS[order.status]}</span>
552
553
  </p>
553
554
  {(() => {
554
555
  const upcoming = nextStatus(order.status);
@@ -97,8 +97,8 @@ function NewVehicleForm() {
97
97
  }
98
98
  >
99
99
  <PagePurpose icon={<Truck size={18} />}>
100
- Add a vehicle so it can be assigned to deliveries and routes. Give it a fleet number and type
101
- to start — make, model and plate help identify it on the road.
100
+ Add a vehicle so it can be assigned to deliveries and routes. Give it a fleet number and
101
+ type to start — make, model and plate help identify it on the road.
102
102
  </PagePurpose>
103
103
 
104
104
  <form onSubmit={handleSubmit} className="max-w-2xl space-y-6">
@@ -3,7 +3,15 @@
3
3
  */
4
4
 
5
5
  import { useState } from 'react';
6
- import { Truck, Plus, RefreshCw, Download, CircleCheck, Route as RouteIcon, Wrench } from 'lucide-react';
6
+ import {
7
+ Truck,
8
+ Plus,
9
+ RefreshCw,
10
+ Download,
11
+ CircleCheck,
12
+ Route as RouteIcon,
13
+ Wrench,
14
+ } from 'lucide-react';
7
15
  import { PageLayout } from '../components/PageLayout';
8
16
  import { MetricCard, MetricGrid } from '../components/MetricCard';
9
17
  import { DataTable, type Column } from '../components/DataTable';
@@ -90,7 +90,9 @@ function NewWarehouseForm() {
90
90
  navigate?.(joinPath(basePath, `inventory/warehouses/${created.id}`));
91
91
  } catch (err) {
92
92
  console.error('Failed to create warehouse:', err);
93
- setError(err instanceof Error ? err.message : 'Failed to create warehouse. Please try again.');
93
+ setError(
94
+ err instanceof Error ? err.message : 'Failed to create warehouse. Please try again.'
95
+ );
94
96
  setSubmitting(false);
95
97
  }
96
98
  };
@@ -69,6 +69,40 @@ function isAbortError(error: unknown): boolean {
69
69
 
70
70
  const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));
71
71
 
72
+ /**
73
+ * Global in-flight cap across every GraphQL call this MFE makes. The workspace
74
+ * service runs a single lean replica (no PgBouncer), and a page like the
75
+ * dashboard fans out ~7 queries at once; multiplied by the retry loop below a
76
+ * transient blip could balloon into dozens of simultaneous requests and tip the
77
+ * replica over. A small semaphore keeps the fan-out polite — requests beyond the
78
+ * limit queue for a moment instead of stampeding the service. 4 is high enough
79
+ * that normal navigation feels instant, low enough that a burst never floods.
80
+ */
81
+ const MAX_CONCURRENT = 4;
82
+ let activeRequests = 0;
83
+ const pendingAcquirers: Array<() => void> = [];
84
+
85
+ function acquireSlot(): Promise<void> {
86
+ return new Promise((resolve) => {
87
+ if (activeRequests < MAX_CONCURRENT) {
88
+ activeRequests += 1;
89
+ resolve();
90
+ } else {
91
+ pendingAcquirers.push(resolve);
92
+ }
93
+ });
94
+ }
95
+
96
+ function releaseSlot(): void {
97
+ const next = pendingAcquirers.shift();
98
+ if (next) {
99
+ // Hand the slot straight to the next waiter — activeRequests stays put.
100
+ next();
101
+ } else {
102
+ activeRequests -= 1;
103
+ }
104
+ }
105
+
72
106
  export async function executeGraphQL<TData>(
73
107
  options: GraphQLRequestOptions,
74
108
  query: string,
@@ -88,12 +122,28 @@ export async function executeGraphQL<TData>(
88
122
  };
89
123
  const body = JSON.stringify({ query, variables });
90
124
 
125
+ // Serialize past the global concurrency cap before doing any network work,
126
+ // and always release the slot when this call settles (success or failure).
127
+ await acquireSlot();
128
+ try {
129
+ return await runWithRetries<TData>(url, headers, body);
130
+ } finally {
131
+ releaseSlot();
132
+ }
133
+ }
134
+
135
+ async function runWithRetries<TData>(
136
+ url: string,
137
+ headers: Record<string, string>,
138
+ body: string
139
+ ): Promise<TData> {
91
140
  let lastError: Error = new Error('GraphQL request failed');
92
141
 
93
142
  for (let attempt = 0; attempt <= MAX_RETRIES; attempt += 1) {
94
143
  const canRetry = attempt < MAX_RETRIES;
95
144
  // Exponential backoff with jitter before each retry (not the first attempt).
96
- if (attempt > 0) await sleep(Math.min(250 * 2 ** (attempt - 1), 2000) + Math.floor(Math.random() * 150));
145
+ if (attempt > 0)
146
+ await sleep(Math.min(250 * 2 ** (attempt - 1), 2000) + Math.floor(Math.random() * 150));
97
147
 
98
148
  const controller = new AbortController();
99
149
  const timeoutId = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS);