@burdenoff/microfe-atheletebridge 2026.614.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -0
- package/dist/atheletebridge/AthleteBridgeRoot.js +177 -0
- package/dist/atheletebridge/AthleteBridgeRoot.js.map +1 -0
- package/dist/atheletebridge/AthleteBridgeRoutes.js +215 -0
- package/dist/atheletebridge/AthleteBridgeRoutes.js.map +1 -0
- package/dist/atheletebridge/components/EmptyState.js +28 -0
- package/dist/atheletebridge/components/EmptyState.js.map +1 -0
- package/dist/atheletebridge/components/InvestmentCard.js +96 -0
- package/dist/atheletebridge/components/InvestmentCard.js.map +1 -0
- package/dist/atheletebridge/components/MetricsCard.js +46 -0
- package/dist/atheletebridge/components/MetricsCard.js.map +1 -0
- package/dist/atheletebridge/components/PageLayout.js +26 -0
- package/dist/atheletebridge/components/PageLayout.js.map +1 -0
- package/dist/atheletebridge/components/RatingDisplay.js +35 -0
- package/dist/atheletebridge/components/RatingDisplay.js.map +1 -0
- package/dist/atheletebridge/components/StatusBadge.js +45 -0
- package/dist/atheletebridge/components/StatusBadge.js.map +1 -0
- package/dist/atheletebridge/context/AthleteBridgeContext.js +93 -0
- package/dist/atheletebridge/context/AthleteBridgeContext.js.map +1 -0
- package/dist/atheletebridge/context/index.js +1 -0
- package/dist/atheletebridge/hooks/useAthleteBridgeApi.js +223 -0
- package/dist/atheletebridge/hooks/useAthleteBridgeApi.js.map +1 -0
- package/dist/atheletebridge/index.js +7 -0
- package/dist/atheletebridge/mocks/data.js +1517 -0
- package/dist/atheletebridge/mocks/data.js.map +1 -0
- package/dist/atheletebridge/mocks/users.js +34 -0
- package/dist/atheletebridge/mocks/users.js.map +1 -0
- package/dist/atheletebridge/pages/HomePage.js +921 -0
- package/dist/atheletebridge/pages/HomePage.js.map +1 -0
- package/dist/atheletebridge/pages/admin/AdminAnalyticsPage.js +645 -0
- package/dist/atheletebridge/pages/admin/AdminAnalyticsPage.js.map +1 -0
- package/dist/atheletebridge/pages/admin/AdminDashboard.js +639 -0
- package/dist/atheletebridge/pages/admin/AdminDashboard.js.map +1 -0
- package/dist/atheletebridge/pages/admin/AdminFinancialPage.js +421 -0
- package/dist/atheletebridge/pages/admin/AdminFinancialPage.js.map +1 -0
- package/dist/atheletebridge/pages/admin/AdminOrdersPage.js +660 -0
- package/dist/atheletebridge/pages/admin/AdminOrdersPage.js.map +1 -0
- package/dist/atheletebridge/pages/admin/AdminProfilePage.js +259 -0
- package/dist/atheletebridge/pages/admin/AdminProfilePage.js.map +1 -0
- package/dist/atheletebridge/pages/admin/AdminSettingsPage.js +649 -0
- package/dist/atheletebridge/pages/admin/AdminSettingsPage.js.map +1 -0
- package/dist/atheletebridge/pages/admin/CartManagementPage.js +869 -0
- package/dist/atheletebridge/pages/admin/CartManagementPage.js.map +1 -0
- package/dist/atheletebridge/pages/admin/UserManagementPage.js +893 -0
- package/dist/atheletebridge/pages/admin/UserManagementPage.js.map +1 -0
- package/dist/atheletebridge/pages/cart-owner/AnalyticsDashboard.js +834 -0
- package/dist/atheletebridge/pages/cart-owner/AnalyticsDashboard.js.map +1 -0
- package/dist/atheletebridge/pages/cart-owner/BusinessSettingsPage.js +700 -0
- package/dist/atheletebridge/pages/cart-owner/BusinessSettingsPage.js.map +1 -0
- package/dist/atheletebridge/pages/cart-owner/CartOwnerDashboard.js +760 -0
- package/dist/atheletebridge/pages/cart-owner/CartOwnerDashboard.js.map +1 -0
- package/dist/atheletebridge/pages/cart-owner/CartOwnerProfilePage.js +886 -0
- package/dist/atheletebridge/pages/cart-owner/CartOwnerProfilePage.js.map +1 -0
- package/dist/atheletebridge/pages/cart-owner/CartServiceConfigPage.js +631 -0
- package/dist/atheletebridge/pages/cart-owner/CartServiceConfigPage.js.map +1 -0
- package/dist/atheletebridge/pages/cart-owner/InventoryManagementPage.js +913 -0
- package/dist/atheletebridge/pages/cart-owner/InventoryManagementPage.js.map +1 -0
- package/dist/atheletebridge/pages/cart-owner/OrderManagementPage.js +881 -0
- package/dist/atheletebridge/pages/cart-owner/OrderManagementPage.js.map +1 -0
- package/dist/atheletebridge/pages/cart-owner/StaffManagementPage.js +833 -0
- package/dist/atheletebridge/pages/cart-owner/StaffManagementPage.js.map +1 -0
- package/dist/atheletebridge/pages/common/HelpSupportPage.js +1325 -0
- package/dist/atheletebridge/pages/common/HelpSupportPage.js.map +1 -0
- package/dist/atheletebridge/pages/common/NotificationCenterPage.js +665 -0
- package/dist/atheletebridge/pages/common/NotificationCenterPage.js.map +1 -0
- package/dist/atheletebridge/pages/common/SettingsPage.js +964 -0
- package/dist/atheletebridge/pages/common/SettingsPage.js.map +1 -0
- package/dist/atheletebridge/pages/customer/BookingDetailsPage.js +593 -0
- package/dist/atheletebridge/pages/customer/BookingDetailsPage.js.map +1 -0
- package/dist/atheletebridge/pages/customer/CartDetailPage.js +620 -0
- package/dist/atheletebridge/pages/customer/CartDetailPage.js.map +1 -0
- package/dist/atheletebridge/pages/customer/CartDiscoveryPage.js +547 -0
- package/dist/atheletebridge/pages/customer/CartDiscoveryPage.js.map +1 -0
- package/dist/atheletebridge/pages/customer/CheckoutPage.js +532 -0
- package/dist/atheletebridge/pages/customer/CheckoutPage.js.map +1 -0
- package/dist/atheletebridge/pages/customer/CustomerDashboard.js +496 -0
- package/dist/atheletebridge/pages/customer/CustomerDashboard.js.map +1 -0
- package/dist/atheletebridge/pages/customer/CustomerProfilePage.js +621 -0
- package/dist/atheletebridge/pages/customer/CustomerProfilePage.js.map +1 -0
- package/dist/atheletebridge/pages/customer/DirectServiceBookingPage.js +623 -0
- package/dist/atheletebridge/pages/customer/DirectServiceBookingPage.js.map +1 -0
- package/dist/atheletebridge/pages/customer/FavoritesPage.js +477 -0
- package/dist/atheletebridge/pages/customer/FavoritesPage.js.map +1 -0
- package/dist/atheletebridge/pages/customer/OrderHistoryPage.js +438 -0
- package/dist/atheletebridge/pages/customer/OrderHistoryPage.js.map +1 -0
- package/dist/atheletebridge/pages/customer/OrderTrackingPage.js +388 -0
- package/dist/atheletebridge/pages/customer/OrderTrackingPage.js.map +1 -0
- package/dist/atheletebridge/pages/customer/PaymentMethodsPage.js +488 -0
- package/dist/atheletebridge/pages/customer/PaymentMethodsPage.js.map +1 -0
- package/dist/atheletebridge/pages/customer/ReviewsPage.js +606 -0
- package/dist/atheletebridge/pages/customer/ReviewsPage.js.map +1 -0
- package/dist/atheletebridge/pages/customer/SavedAddressesPage.js +443 -0
- package/dist/atheletebridge/pages/customer/SavedAddressesPage.js.map +1 -0
- package/dist/atheletebridge/pages/investor/InvestmentDetailsPage.js +849 -0
- package/dist/atheletebridge/pages/investor/InvestmentDetailsPage.js.map +1 -0
- package/dist/atheletebridge/pages/investor/InvestmentOpportunitiesPage.js +939 -0
- package/dist/atheletebridge/pages/investor/InvestmentOpportunitiesPage.js.map +1 -0
- package/dist/atheletebridge/pages/investor/InvestorAnalyticsPage.js +681 -0
- package/dist/atheletebridge/pages/investor/InvestorAnalyticsPage.js.map +1 -0
- package/dist/atheletebridge/pages/investor/InvestorDashboard.js +419 -0
- package/dist/atheletebridge/pages/investor/InvestorDashboard.js.map +1 -0
- package/dist/atheletebridge/pages/investor/InvestorInvestmentsPage.js +399 -0
- package/dist/atheletebridge/pages/investor/InvestorInvestmentsPage.js.map +1 -0
- package/dist/atheletebridge/pages/investor/InvestorPortfolioPage.js +569 -0
- package/dist/atheletebridge/pages/investor/InvestorPortfolioPage.js.map +1 -0
- package/dist/atheletebridge/pages/investor/InvestorProfilePage.js +1065 -0
- package/dist/atheletebridge/pages/investor/InvestorProfilePage.js.map +1 -0
- package/dist/atheletebridge/pages/worker/TaskDetailsPage.js +496 -0
- package/dist/atheletebridge/pages/worker/TaskDetailsPage.js.map +1 -0
- package/dist/atheletebridge/pages/worker/WorkerDashboard.js +634 -0
- package/dist/atheletebridge/pages/worker/WorkerDashboard.js.map +1 -0
- package/dist/atheletebridge/pages/worker/WorkerOrdersPage.js +675 -0
- package/dist/atheletebridge/pages/worker/WorkerOrdersPage.js.map +1 -0
- package/dist/atheletebridge/pages/worker/WorkerProfilePage.js +687 -0
- package/dist/atheletebridge/pages/worker/WorkerProfilePage.js.map +1 -0
- package/dist/atheletebridge/pages/worker/WorkerSchedulePage.js +578 -0
- package/dist/atheletebridge/pages/worker/WorkerSchedulePage.js.map +1 -0
- package/dist/atheletebridge/store/atheletebridgeStore.js +38 -0
- package/dist/atheletebridge/store/atheletebridgeStore.js.map +1 -0
- package/dist/atheletebridge/store/index.js +1 -0
- package/dist/atheletebridge/utils/cn.js +10 -0
- package/dist/atheletebridge/utils/cn.js.map +1 -0
- package/dist/atheletebridge/utils/formatters.js +51 -0
- package/dist/atheletebridge/utils/formatters.js.map +1 -0
- package/dist/atheletebridge/utils/navigation.js +9 -0
- package/dist/atheletebridge/utils/navigation.js.map +1 -0
- package/dist/index.js +7 -0
- package/dist/node_modules/.bun/clsx@2.1.1/node_modules/clsx/dist/clsx.js +18 -0
- package/dist/node_modules/.bun/clsx@2.1.1/node_modules/clsx/dist/clsx.js.map +1 -0
- package/dist/node_modules/.bun/tailwind-merge@3.5.0/node_modules/tailwind-merge/dist/bundle-mjs.js +1674 -0
- package/dist/node_modules/.bun/tailwind-merge@3.5.0/node_modules/tailwind-merge/dist/bundle-mjs.js.map +1 -0
- package/package.json +106 -0
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { cn as e } from "../utils/cn.js";
|
|
2
|
+
import { Minus as t, TrendingDown as n, TrendingUp as r } from "lucide-react";
|
|
3
|
+
import { jsx as i, jsxs as a } from "react/jsx-runtime";
|
|
4
|
+
//#region src/atheletebridge/components/MetricsCard.tsx
|
|
5
|
+
var o = {
|
|
6
|
+
up: {
|
|
7
|
+
icon: r,
|
|
8
|
+
color: "text-green-600 dark:text-green-400"
|
|
9
|
+
},
|
|
10
|
+
down: {
|
|
11
|
+
icon: n,
|
|
12
|
+
color: "text-red-600 dark:text-red-400"
|
|
13
|
+
},
|
|
14
|
+
neutral: {
|
|
15
|
+
icon: t,
|
|
16
|
+
color: "text-muted-foreground"
|
|
17
|
+
}
|
|
18
|
+
}, s = ({ icon: t, value: n, label: r, trend: s, trendValue: c, className: l }) => {
|
|
19
|
+
let u = s ? o[s] : null, d = u?.icon;
|
|
20
|
+
return /* @__PURE__ */ a("div", {
|
|
21
|
+
className: e("rounded-lg border border-border bg-card p-6 shadow-sm", l),
|
|
22
|
+
children: [/* @__PURE__ */ a("div", {
|
|
23
|
+
className: "flex items-center justify-between",
|
|
24
|
+
children: [/* @__PURE__ */ i("div", {
|
|
25
|
+
className: "text-muted-foreground",
|
|
26
|
+
children: t
|
|
27
|
+
}), s && u && d && /* @__PURE__ */ a("div", {
|
|
28
|
+
className: e("flex items-center gap-1 text-xs font-medium", u.color),
|
|
29
|
+
children: [/* @__PURE__ */ i(d, { className: "h-3.5 w-3.5" }), c && /* @__PURE__ */ i("span", { children: c })]
|
|
30
|
+
})]
|
|
31
|
+
}), /* @__PURE__ */ a("div", {
|
|
32
|
+
className: "mt-3",
|
|
33
|
+
children: [/* @__PURE__ */ i("p", {
|
|
34
|
+
className: "text-2xl font-bold text-foreground",
|
|
35
|
+
children: n
|
|
36
|
+
}), /* @__PURE__ */ i("p", {
|
|
37
|
+
className: "mt-1 text-sm text-muted-foreground",
|
|
38
|
+
children: r
|
|
39
|
+
})]
|
|
40
|
+
})]
|
|
41
|
+
});
|
|
42
|
+
};
|
|
43
|
+
//#endregion
|
|
44
|
+
export { s as MetricsCard };
|
|
45
|
+
|
|
46
|
+
//# sourceMappingURL=MetricsCard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MetricsCard.js","names":[],"sources":["../../../src/atheletebridge/components/MetricsCard.tsx"],"sourcesContent":["/**\n * Metrics Card Component\n * @module atheletebridge/components\n */\n\nimport type { FC, ReactNode } from 'react';\nimport { TrendingUp, TrendingDown, Minus } from 'lucide-react';\nimport { cn } from '../utils/cn';\nimport type { TrendDirection } from '../types';\n\ninterface MetricsCardProps {\n icon: ReactNode;\n value: string | number;\n label: string;\n trend?: TrendDirection;\n trendValue?: string;\n className?: string;\n}\n\nconst trendConfig: Record<TrendDirection, { icon: typeof TrendingUp; color: string }> = {\n up: { icon: TrendingUp, color: 'text-green-600 dark:text-green-400' },\n down: { icon: TrendingDown, color: 'text-red-600 dark:text-red-400' },\n neutral: { icon: Minus, color: 'text-muted-foreground' },\n};\n\nexport const MetricsCard: FC<MetricsCardProps> = ({\n icon,\n value,\n label,\n trend,\n trendValue,\n className,\n}) => {\n const trendInfo = trend ? trendConfig[trend] : null;\n const TrendIcon = trendInfo?.icon;\n\n return (\n <div className={cn('rounded-lg border border-border bg-card p-6 shadow-sm', className)}>\n <div className=\"flex items-center justify-between\">\n <div className=\"text-muted-foreground\">{icon}</div>\n {trend && trendInfo && TrendIcon && (\n <div className={cn('flex items-center gap-1 text-xs font-medium', trendInfo.color)}>\n <TrendIcon className=\"h-3.5 w-3.5\" />\n {trendValue && <span>{trendValue}</span>}\n </div>\n )}\n </div>\n <div className=\"mt-3\">\n <p className=\"text-2xl font-bold text-foreground\">{value}</p>\n <p className=\"mt-1 text-sm text-muted-foreground\">{label}</p>\n </div>\n </div>\n );\n};\n"],"mappings":";;;;AAmBA,IAAM,IAAkF;CACtF,IAAI;EAAE,MAAM;EAAY,OAAO;EAAsC;CACrE,MAAM;EAAE,MAAM;EAAc,OAAO;EAAkC;CACrE,SAAS;EAAE,MAAM;EAAO,OAAO;EAAyB;CACzD,EAEY,KAAqC,EAChD,SACA,UACA,UACA,UACA,eACA,mBACI;CACJ,IAAM,IAAY,IAAQ,EAAY,KAAS,MACzC,IAAY,GAAW;AAE7B,QACE,kBAAC,OAAD;EAAK,WAAW,EAAG,yDAAyD,EAAU;YAAtF,CACE,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD;IAAK,WAAU;cAAyB;IAAW,CAAA,EAClD,KAAS,KAAa,KACrB,kBAAC,OAAD;IAAK,WAAW,EAAG,+CAA+C,EAAU,MAAM;cAAlF,CACE,kBAAC,GAAD,EAAW,WAAU,eAAgB,CAAA,EACpC,KAAc,kBAAC,QAAD,EAAA,UAAO,GAAkB,CAAA,CACpC;MAEJ;MACN,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,KAAD;IAAG,WAAU;cAAsC;IAAU,CAAA,EAC7D,kBAAC,KAAD;IAAG,WAAU;cAAsC;IAAU,CAAA,CACzD;KACF"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { cn as e } from "../utils/cn.js";
|
|
2
|
+
import { jsx as t, jsxs as n } from "react/jsx-runtime";
|
|
3
|
+
//#region src/atheletebridge/components/PageLayout.tsx
|
|
4
|
+
var r = ({ title: r, description: i, actions: a, children: o, className: s }) => /* @__PURE__ */ n("div", {
|
|
5
|
+
className: e("flex flex-col h-full", s),
|
|
6
|
+
children: [/* @__PURE__ */ n("div", {
|
|
7
|
+
className: "flex items-center justify-between px-6 py-4 border-b border-border bg-card",
|
|
8
|
+
children: [/* @__PURE__ */ n("div", { children: [/* @__PURE__ */ t("h1", {
|
|
9
|
+
className: "text-2xl font-semibold text-foreground",
|
|
10
|
+
children: r
|
|
11
|
+
}), i && /* @__PURE__ */ t("p", {
|
|
12
|
+
className: "mt-1 text-sm text-muted-foreground",
|
|
13
|
+
children: i
|
|
14
|
+
})] }), a && /* @__PURE__ */ t("div", {
|
|
15
|
+
className: "flex items-center gap-3",
|
|
16
|
+
children: a
|
|
17
|
+
})]
|
|
18
|
+
}), /* @__PURE__ */ t("div", {
|
|
19
|
+
className: "flex-1 overflow-auto p-6",
|
|
20
|
+
children: o
|
|
21
|
+
})]
|
|
22
|
+
});
|
|
23
|
+
//#endregion
|
|
24
|
+
export { r as PageLayout };
|
|
25
|
+
|
|
26
|
+
//# sourceMappingURL=PageLayout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PageLayout.js","names":[],"sources":["../../../src/atheletebridge/components/PageLayout.tsx"],"sourcesContent":["/**\n * Page Layout Component\n * @module atheletebridge/components\n */\n\nimport type { FC, ReactNode } from 'react';\nimport { cn } from '../utils/cn';\n\ninterface PageLayoutProps {\n title: ReactNode;\n description?: string;\n actions?: ReactNode;\n children: ReactNode;\n className?: string;\n}\n\nexport const PageLayout: FC<PageLayoutProps> = ({\n title,\n description,\n actions,\n children,\n className,\n}) => {\n return (\n <div className={cn('flex flex-col h-full', className)}>\n {/* Page Header */}\n <div className=\"flex items-center justify-between px-6 py-4 border-b border-border bg-card\">\n <div>\n <h1 className=\"text-2xl font-semibold text-foreground\">{title}</h1>\n {description && <p className=\"mt-1 text-sm text-muted-foreground\">{description}</p>}\n </div>\n {actions && <div className=\"flex items-center gap-3\">{actions}</div>}\n </div>\n\n {/* Page Content */}\n <div className=\"flex-1 overflow-auto p-6\">{children}</div>\n </div>\n );\n};\n"],"mappings":";;;AAgBA,IAAa,KAAmC,EAC9C,UACA,gBACA,YACA,aACA,mBAGE,kBAAC,OAAD;CAAK,WAAW,EAAG,wBAAwB,EAAU;WAArD,CAEE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;GAAI,WAAU;aAA0C;GAAW,CAAA,EAClE,KAAe,kBAAC,KAAD;GAAG,WAAU;aAAsC;GAAgB,CAAA,CAC/E,EAAA,CAAA,EACL,KAAW,kBAAC,OAAD;GAAK,WAAU;aAA2B;GAAc,CAAA,CAChE;KAGN,kBAAC,OAAD;EAAK,WAAU;EAA4B;EAAe,CAAA,CACtD"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { cn as e } from "../utils/cn.js";
|
|
2
|
+
import { Star as t } from "lucide-react";
|
|
3
|
+
import { jsx as n, jsxs as r } from "react/jsx-runtime";
|
|
4
|
+
//#region src/atheletebridge/components/RatingDisplay.tsx
|
|
5
|
+
var i = ({ value: i, count: a, maxStars: o = 5, size: s = "sm", className: c }) => {
|
|
6
|
+
let l = s === "sm" ? "h-3.5 w-3.5" : "h-4.5 w-4.5", u = Math.min(Math.max(i, 0), o);
|
|
7
|
+
return /* @__PURE__ */ r("div", {
|
|
8
|
+
className: e("flex items-center gap-1", c),
|
|
9
|
+
children: [
|
|
10
|
+
/* @__PURE__ */ n("div", {
|
|
11
|
+
className: "flex items-center",
|
|
12
|
+
children: Array.from({ length: o }, (r, i) => {
|
|
13
|
+
let a = i < Math.floor(u);
|
|
14
|
+
return /* @__PURE__ */ n(t, { className: e(l, a ? "fill-yellow-400 text-yellow-400" : !a && i < u ? "fill-yellow-400/50 text-yellow-400" : "fill-none text-muted-foreground/40") }, i);
|
|
15
|
+
})
|
|
16
|
+
}),
|
|
17
|
+
/* @__PURE__ */ n("span", {
|
|
18
|
+
className: "text-xs font-medium text-foreground",
|
|
19
|
+
children: u.toFixed(1)
|
|
20
|
+
}),
|
|
21
|
+
a !== void 0 && /* @__PURE__ */ r("span", {
|
|
22
|
+
className: "text-xs text-muted-foreground",
|
|
23
|
+
children: [
|
|
24
|
+
"(",
|
|
25
|
+
a,
|
|
26
|
+
")"
|
|
27
|
+
]
|
|
28
|
+
})
|
|
29
|
+
]
|
|
30
|
+
});
|
|
31
|
+
};
|
|
32
|
+
//#endregion
|
|
33
|
+
export { i as RatingDisplay };
|
|
34
|
+
|
|
35
|
+
//# sourceMappingURL=RatingDisplay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RatingDisplay.js","names":[],"sources":["../../../src/atheletebridge/components/RatingDisplay.tsx"],"sourcesContent":["/**\n * Rating Display Component\n * @module atheletebridge/components\n *\n * Star rating display with value and review count.\n */\n\nimport type { FC } from 'react';\nimport { Star } from 'lucide-react';\nimport { cn } from '../utils/cn';\n\ninterface RatingDisplayProps {\n value: number;\n count?: number;\n maxStars?: number;\n size?: 'sm' | 'md';\n className?: string;\n}\n\nexport const RatingDisplay: FC<RatingDisplayProps> = ({\n value,\n count,\n maxStars = 5,\n size = 'sm',\n className,\n}) => {\n const starSize = size === 'sm' ? 'h-3.5 w-3.5' : 'h-4.5 w-4.5';\n const clampedValue = Math.min(Math.max(value, 0), maxStars);\n\n return (\n <div className={cn('flex items-center gap-1', className)}>\n <div className=\"flex items-center\">\n {Array.from({ length: maxStars }, (_, i) => {\n const filled = i < Math.floor(clampedValue);\n const halfFilled = !filled && i < clampedValue;\n\n return (\n <Star\n key={i}\n className={cn(\n starSize,\n filled\n ? 'fill-yellow-400 text-yellow-400'\n : halfFilled\n ? 'fill-yellow-400/50 text-yellow-400'\n : 'fill-none text-muted-foreground/40'\n )}\n />\n );\n })}\n </div>\n <span className=\"text-xs font-medium text-foreground\">{clampedValue.toFixed(1)}</span>\n {count !== undefined && <span className=\"text-xs text-muted-foreground\">({count})</span>}\n </div>\n );\n};\n"],"mappings":";;;;AAmBA,IAAa,KAAyC,EACpD,UACA,UACA,cAAW,GACX,UAAO,MACP,mBACI;CACJ,IAAM,IAAW,MAAS,OAAO,gBAAgB,eAC3C,IAAe,KAAK,IAAI,KAAK,IAAI,GAAO,EAAE,EAAE,EAAS;AAE3D,QACE,kBAAC,OAAD;EAAK,WAAW,EAAG,2BAA2B,EAAU;YAAxD;GACE,kBAAC,OAAD;IAAK,WAAU;cACZ,MAAM,KAAK,EAAE,QAAQ,GAAU,GAAG,GAAG,MAAM;KAC1C,IAAM,IAAS,IAAI,KAAK,MAAM,EAAa;AAG3C,YACE,kBAAC,GAAD,EAEE,WAAW,EACT,GACA,IACI,oCARS,CAAC,KAAU,IAAI,IAUtB,uCACA,qCACP,EACD,EATK,EASL;MAEJ;IACE,CAAA;GACN,kBAAC,QAAD;IAAM,WAAU;cAAuC,EAAa,QAAQ,EAAE;IAAQ,CAAA;GACrF,MAAU,KAAA,KAAa,kBAAC,QAAD;IAAM,WAAU;cAAhB;KAAgD;KAAE;KAAM;KAAQ;;GACpF"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { cn as e } from "../utils/cn.js";
|
|
2
|
+
import { jsx as t } from "react/jsx-runtime";
|
|
3
|
+
//#region src/atheletebridge/components/StatusBadge.tsx
|
|
4
|
+
var n = {
|
|
5
|
+
success: "bg-green-500/20 text-green-600 dark:text-green-400",
|
|
6
|
+
warning: "bg-yellow-500/20 text-yellow-600 dark:text-yellow-400",
|
|
7
|
+
destructive: "bg-destructive/20 text-destructive",
|
|
8
|
+
secondary: "bg-secondary text-secondary-foreground",
|
|
9
|
+
info: "bg-blue-500/20 text-blue-600 dark:text-blue-400",
|
|
10
|
+
outline: "border border-border text-foreground"
|
|
11
|
+
}, r = {
|
|
12
|
+
open: "success",
|
|
13
|
+
closed: "destructive",
|
|
14
|
+
busy: "warning",
|
|
15
|
+
temporarily_closed: "warning",
|
|
16
|
+
pending: "secondary",
|
|
17
|
+
confirmed: "info",
|
|
18
|
+
preparing: "warning",
|
|
19
|
+
ready: "success",
|
|
20
|
+
out_for_delivery: "info",
|
|
21
|
+
delivered: "success",
|
|
22
|
+
cancelled: "destructive",
|
|
23
|
+
refunded: "outline",
|
|
24
|
+
funded: "success",
|
|
25
|
+
returning: "info",
|
|
26
|
+
active: "success",
|
|
27
|
+
inactive: "secondary",
|
|
28
|
+
draft: "secondary",
|
|
29
|
+
archived: "outline",
|
|
30
|
+
error: "destructive",
|
|
31
|
+
failed: "destructive",
|
|
32
|
+
processing: "warning",
|
|
33
|
+
completed: "success"
|
|
34
|
+
};
|
|
35
|
+
function i(e) {
|
|
36
|
+
return e.replace(/_/g, " ").replace(/\b\w/g, (e) => e.toUpperCase());
|
|
37
|
+
}
|
|
38
|
+
var a = ({ status: a, className: o }) => /* @__PURE__ */ t("span", {
|
|
39
|
+
className: e("inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium", n[r[a.toLowerCase()] || "secondary"], o),
|
|
40
|
+
children: i(a)
|
|
41
|
+
});
|
|
42
|
+
//#endregion
|
|
43
|
+
export { a as StatusBadge };
|
|
44
|
+
|
|
45
|
+
//# sourceMappingURL=StatusBadge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StatusBadge.js","names":[],"sources":["../../../src/atheletebridge/components/StatusBadge.tsx"],"sourcesContent":["/**\n * Status Badge Component\n * @module atheletebridge/components\n *\n * A colored badge based on status value with semantic color mapping\n * for various order, cart, and investment statuses.\n */\n\nimport type { FC } from 'react';\nimport { cn } from '../utils/cn';\n\ninterface StatusBadgeProps {\n status: string;\n className?: string;\n}\n\ntype BadgeVariant = 'success' | 'warning' | 'destructive' | 'secondary' | 'info' | 'outline';\n\nconst variantStyles: Record<BadgeVariant, string> = {\n success: 'bg-green-500/20 text-green-600 dark:text-green-400',\n warning: 'bg-yellow-500/20 text-yellow-600 dark:text-yellow-400',\n destructive: 'bg-destructive/20 text-destructive',\n secondary: 'bg-secondary text-secondary-foreground',\n info: 'bg-blue-500/20 text-blue-600 dark:text-blue-400',\n outline: 'border border-border text-foreground',\n};\n\nconst statusVariantMap: Record<string, BadgeVariant> = {\n // Cart statuses\n open: 'success',\n closed: 'destructive',\n busy: 'warning',\n temporarily_closed: 'warning',\n\n // Order statuses\n pending: 'secondary',\n confirmed: 'info',\n preparing: 'warning',\n ready: 'success',\n out_for_delivery: 'info',\n delivered: 'success',\n cancelled: 'destructive',\n refunded: 'outline',\n\n // Investment statuses\n funded: 'success',\n returning: 'info',\n\n // Generic statuses\n active: 'success',\n inactive: 'secondary',\n draft: 'secondary',\n archived: 'outline',\n error: 'destructive',\n failed: 'destructive',\n processing: 'warning',\n completed: 'success',\n};\n\nfunction formatStatusLabel(status: string): string {\n return status.replace(/_/g, ' ').replace(/\\b\\w/g, (char) => char.toUpperCase());\n}\n\nexport const StatusBadge: FC<StatusBadgeProps> = ({ status, className }) => {\n const variant = statusVariantMap[status.toLowerCase()] || 'secondary';\n\n return (\n <span\n className={cn(\n 'inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium',\n variantStyles[variant],\n className\n )}\n >\n {formatStatusLabel(status)}\n </span>\n );\n};\n"],"mappings":";;;AAkBA,IAAM,IAA8C;CAClD,SAAS;CACT,SAAS;CACT,aAAa;CACb,WAAW;CACX,MAAM;CACN,SAAS;CACV,EAEK,IAAiD;CAErD,MAAM;CACN,QAAQ;CACR,MAAM;CACN,oBAAoB;CAGpB,SAAS;CACT,WAAW;CACX,WAAW;CACX,OAAO;CACP,kBAAkB;CAClB,WAAW;CACX,WAAW;CACX,UAAU;CAGV,QAAQ;CACR,WAAW;CAGX,QAAQ;CACR,UAAU;CACV,OAAO;CACP,UAAU;CACV,OAAO;CACP,QAAQ;CACR,YAAY;CACZ,WAAW;CACZ;AAED,SAAS,EAAkB,GAAwB;AACjD,QAAO,EAAO,QAAQ,MAAM,IAAI,CAAC,QAAQ,UAAU,MAAS,EAAK,aAAa,CAAC;;AAGjF,IAAa,KAAqC,EAAE,WAAQ,mBAIxD,kBAAC,QAAD;CACE,WAAW,EACT,2EACA,EANU,EAAiB,EAAO,aAAa,KAAK,cAOpD,EACD;WAEA,EAAkB,EAAO;CACrB,CAAA"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { joinPath as e } from "../utils/navigation.js";
|
|
2
|
+
import { createContext as t, useCallback as n, useContext as r, useMemo as i } from "react";
|
|
3
|
+
import { MemoryRouter as a, useNavigate as o } from "react-router-dom";
|
|
4
|
+
import { jsx as s } from "react/jsx-runtime";
|
|
5
|
+
//#region src/atheletebridge/context/AthleteBridgeContext.tsx
|
|
6
|
+
var c = t(null);
|
|
7
|
+
function l() {
|
|
8
|
+
let e = r(c);
|
|
9
|
+
if (!e) throw Error("useAthleteBridge must be used within a AthleteBridgeProvider");
|
|
10
|
+
return e;
|
|
11
|
+
}
|
|
12
|
+
var u = ({ children: t, basePath: r, currentUser: a, tenantId: l, workspaceId: u, apiGatewayUrl: d, authToken: f, onCartSelect: p, onOrderSelect: m }) => {
|
|
13
|
+
let h = o(), g = r || "/", _ = n((t) => e(g, t), [g]), v = n((t) => {
|
|
14
|
+
h(e(g, t));
|
|
15
|
+
}, [g, h]), y = i(() => ({
|
|
16
|
+
basePath: g,
|
|
17
|
+
navigate: void 0,
|
|
18
|
+
currentUser: a,
|
|
19
|
+
tenantId: l,
|
|
20
|
+
workspaceId: u,
|
|
21
|
+
apiGatewayUrl: d,
|
|
22
|
+
authToken: f,
|
|
23
|
+
onCartSelect: p,
|
|
24
|
+
onOrderSelect: m,
|
|
25
|
+
isStandalone: !0,
|
|
26
|
+
navigateTo: v,
|
|
27
|
+
getPath: _
|
|
28
|
+
}), [
|
|
29
|
+
g,
|
|
30
|
+
a,
|
|
31
|
+
l,
|
|
32
|
+
u,
|
|
33
|
+
d,
|
|
34
|
+
f,
|
|
35
|
+
p,
|
|
36
|
+
m,
|
|
37
|
+
v,
|
|
38
|
+
_
|
|
39
|
+
]);
|
|
40
|
+
return /* @__PURE__ */ s(c.Provider, {
|
|
41
|
+
value: y,
|
|
42
|
+
children: t
|
|
43
|
+
});
|
|
44
|
+
}, d = ({ children: t, basePath: r, navigate: a, currentUser: o, tenantId: l, workspaceId: u, apiGatewayUrl: d, authToken: f, onCartSelect: p, onOrderSelect: m }) => {
|
|
45
|
+
let h = r || "/", g = n((t) => e(h, t), [h]), _ = n((t) => {
|
|
46
|
+
a(e(h, t));
|
|
47
|
+
}, [h, a]), v = i(() => ({
|
|
48
|
+
basePath: h,
|
|
49
|
+
navigate: a,
|
|
50
|
+
currentUser: o,
|
|
51
|
+
tenantId: l,
|
|
52
|
+
workspaceId: u,
|
|
53
|
+
apiGatewayUrl: d,
|
|
54
|
+
authToken: f,
|
|
55
|
+
onCartSelect: p,
|
|
56
|
+
onOrderSelect: m,
|
|
57
|
+
isStandalone: !1,
|
|
58
|
+
navigateTo: _,
|
|
59
|
+
getPath: g
|
|
60
|
+
}), [
|
|
61
|
+
h,
|
|
62
|
+
a,
|
|
63
|
+
o,
|
|
64
|
+
l,
|
|
65
|
+
u,
|
|
66
|
+
d,
|
|
67
|
+
f,
|
|
68
|
+
p,
|
|
69
|
+
m,
|
|
70
|
+
_,
|
|
71
|
+
g
|
|
72
|
+
]);
|
|
73
|
+
return /* @__PURE__ */ s(c.Provider, {
|
|
74
|
+
value: v,
|
|
75
|
+
children: t
|
|
76
|
+
});
|
|
77
|
+
}, f = (e) => {
|
|
78
|
+
let { children: t, navigate: n } = e;
|
|
79
|
+
return n ? /* @__PURE__ */ s(d, {
|
|
80
|
+
...e,
|
|
81
|
+
navigate: n,
|
|
82
|
+
isStandalone: !1,
|
|
83
|
+
children: t
|
|
84
|
+
}) : /* @__PURE__ */ s(a, { children: /* @__PURE__ */ s(u, {
|
|
85
|
+
...e,
|
|
86
|
+
isStandalone: !0,
|
|
87
|
+
children: t
|
|
88
|
+
}) });
|
|
89
|
+
};
|
|
90
|
+
//#endregion
|
|
91
|
+
export { f as AthleteBridgeProvider, l as useAthleteBridge };
|
|
92
|
+
|
|
93
|
+
//# sourceMappingURL=AthleteBridgeContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AthleteBridgeContext.js","names":[],"sources":["../../../src/atheletebridge/context/AthleteBridgeContext.tsx"],"sourcesContent":["/**\n * AthleteBridge Context Provider\n * @module atheletebridge/context\n */\n\nimport type { FC, PropsWithChildren } from 'react';\nimport { createContext, useContext, useMemo, useCallback } from 'react';\nimport { MemoryRouter, useNavigate as useRouterNavigate } from 'react-router-dom';\nimport type { AthleteBridgeRootProps } from '../types';\nimport { joinPath } from '../utils/navigation';\n\n// ============================================================================\n// Context\n// ============================================================================\n\ninterface AthleteBridgeContextValue extends Omit<\n AthleteBridgeRootProps,\n 'registerNavItems' | 'registerFooterItems' | 'navigate'\n> {\n isStandalone: boolean;\n /** Shell's navigate function (only available in integrated mode) */\n navigate?: (path: string) => void;\n /** Navigate to a path relative to basePath */\n navigateTo: (relativePath: string) => void;\n /** Get the full path for a relative path */\n getPath: (relativePath: string) => string;\n}\n\nconst AthleteBridgeContext = createContext<AthleteBridgeContextValue | null>(null);\n\n// ============================================================================\n// Hook\n// ============================================================================\n\nexport function useAthleteBridge(): AthleteBridgeContextValue {\n const context = useContext(AthleteBridgeContext);\n if (!context) {\n throw new Error('useAthleteBridge must be used within a AthleteBridgeProvider');\n }\n return context;\n}\n\n// ============================================================================\n// Provider Component\n// ============================================================================\n\ntype ProviderProps = Omit<AthleteBridgeRootProps, 'registerNavItems' | 'registerFooterItems'> & {\n isStandalone: boolean;\n};\n\n/** Provider for standalone mode (has access to MemoryRouter) */\nconst StandaloneProviderInner: FC<PropsWithChildren<ProviderProps>> = ({\n children,\n basePath,\n currentUser,\n tenantId,\n workspaceId,\n apiGatewayUrl,\n authToken,\n onCartSelect,\n onOrderSelect,\n}) => {\n const routerNavigate = useRouterNavigate();\n const effectiveBasePath = basePath || '/';\n\n const getPath = useCallback(\n (relativePath: string) => joinPath(effectiveBasePath, relativePath),\n [effectiveBasePath]\n );\n\n const navigateTo = useCallback(\n (relativePath: string) => {\n const fullPath = joinPath(effectiveBasePath, relativePath);\n routerNavigate(fullPath);\n },\n [effectiveBasePath, routerNavigate]\n );\n\n const contextValue = useMemo<AthleteBridgeContextValue>(\n () => ({\n basePath: effectiveBasePath,\n navigate: undefined,\n currentUser,\n tenantId,\n workspaceId,\n apiGatewayUrl,\n authToken,\n onCartSelect,\n onOrderSelect,\n isStandalone: true,\n navigateTo,\n getPath,\n }),\n [\n effectiveBasePath,\n currentUser,\n tenantId,\n workspaceId,\n apiGatewayUrl,\n authToken,\n onCartSelect,\n onOrderSelect,\n navigateTo,\n getPath,\n ]\n );\n\n return <AthleteBridgeContext.Provider value={contextValue}>{children}</AthleteBridgeContext.Provider>;\n};\n\n/** Provider for integrated mode (shell provides navigate) */\nconst IntegratedProviderInner: FC<\n PropsWithChildren<ProviderProps & { navigate: (path: string) => void }>\n> = ({\n children,\n basePath,\n navigate,\n currentUser,\n tenantId,\n workspaceId,\n apiGatewayUrl,\n authToken,\n onCartSelect,\n onOrderSelect,\n}) => {\n const effectiveBasePath = basePath || '/';\n\n const getPath = useCallback(\n (relativePath: string) => joinPath(effectiveBasePath, relativePath),\n [effectiveBasePath]\n );\n\n const navigateTo = useCallback(\n (relativePath: string) => {\n const fullPath = joinPath(effectiveBasePath, relativePath);\n navigate(fullPath);\n },\n [effectiveBasePath, navigate]\n );\n\n const contextValue = useMemo<AthleteBridgeContextValue>(\n () => ({\n basePath: effectiveBasePath,\n navigate,\n currentUser,\n tenantId,\n workspaceId,\n apiGatewayUrl,\n authToken,\n onCartSelect,\n onOrderSelect,\n isStandalone: false,\n navigateTo,\n getPath,\n }),\n [\n effectiveBasePath,\n navigate,\n currentUser,\n tenantId,\n workspaceId,\n apiGatewayUrl,\n authToken,\n onCartSelect,\n onOrderSelect,\n navigateTo,\n getPath,\n ]\n );\n\n return <AthleteBridgeContext.Provider value={contextValue}>{children}</AthleteBridgeContext.Provider>;\n};\n\nexport const AthleteBridgeProvider: FC<PropsWithChildren<AthleteBridgeRootProps>> = (props) => {\n const { children, navigate } = props;\n // Standalone mode: no navigate function provided (MFE manages its own router)\n // Integrated mode: navigate function provided by shell (shell provides router)\n const isStandalone = !navigate;\n\n // Standalone mode: wrap in MemoryRouter\n if (isStandalone) {\n return (\n <MemoryRouter>\n <StandaloneProviderInner {...props} isStandalone={true}>\n {children}\n </StandaloneProviderInner>\n </MemoryRouter>\n );\n }\n\n // Integrated mode: shell provides router\n return (\n <IntegratedProviderInner {...props} navigate={navigate} isStandalone={false}>\n {children}\n </IntegratedProviderInner>\n );\n};\n"],"mappings":";;;;;AA4BA,IAAM,IAAuB,EAAgD,KAAK;AAMlF,SAAgB,IAA8C;CAC5D,IAAM,IAAU,EAAW,EAAqB;AAChD,KAAI,CAAC,EACH,OAAU,MAAM,+DAA+D;AAEjF,QAAO;;AAYT,IAAM,KAAiE,EACrE,aACA,aACA,gBACA,aACA,gBACA,kBACA,cACA,iBACA,uBACI;CACJ,IAAM,IAAiB,GAAmB,EACpC,IAAoB,KAAY,KAEhC,IAAU,GACb,MAAyB,EAAS,GAAmB,EAAa,EACnE,CAAC,EAAkB,CACpB,EAEK,IAAa,GAChB,MAAyB;AAExB,IADiB,EAAS,GAAmB,EAAa,CAClC;IAE1B,CAAC,GAAmB,EAAe,CACpC,EAEK,IAAe,SACZ;EACL,UAAU;EACV,UAAU,KAAA;EACV;EACA;EACA;EACA;EACA;EACA;EACA;EACA,cAAc;EACd;EACA;EACD,GACD;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CACF;AAED,QAAO,kBAAC,EAAqB,UAAtB;EAA+B,OAAO;EAAe;EAAyC,CAAA;GAIjG,KAED,EACH,aACA,aACA,aACA,gBACA,aACA,gBACA,kBACA,cACA,iBACA,uBACI;CACJ,IAAM,IAAoB,KAAY,KAEhC,IAAU,GACb,MAAyB,EAAS,GAAmB,EAAa,EACnE,CAAC,EAAkB,CACpB,EAEK,IAAa,GAChB,MAAyB;AAExB,IADiB,EAAS,GAAmB,EAAa,CACxC;IAEpB,CAAC,GAAmB,EAAS,CAC9B,EAEK,IAAe,SACZ;EACL,UAAU;EACV;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,cAAc;EACd;EACA;EACD,GACD;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CACF;AAED,QAAO,kBAAC,EAAqB,UAAtB;EAA+B,OAAO;EAAe;EAAyC,CAAA;GAG1F,KAAwE,MAAU;CAC7F,IAAM,EAAE,aAAU,gBAAa;AAiB/B,QAdsB,IAepB,kBAAC,GAAD;EAAyB,GAAI;EAAiB;EAAU,cAAc;EACnE;EACuB,CAAA,GAZxB,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;EAAyB,GAAI;EAAO,cAAc;EAC/C;EACuB,CAAA,EACb,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import "./AthleteBridgeContext.js";
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
import { useAthleteBridge as e } from "../context/AthleteBridgeContext.js";
|
|
2
|
+
import "../context/index.js";
|
|
3
|
+
import { useMemo as t } from "react";
|
|
4
|
+
import { useMutation as n, useQuery as r, useQueryClient as i } from "@tanstack/react-query";
|
|
5
|
+
import { graphqlFetch as a } from "@burdenoff/fe-libs/shared/graphql";
|
|
6
|
+
//#region src/atheletebridge/hooks/useAthleteBridgeApi.ts
|
|
7
|
+
var o = async (e, t, n) => {
|
|
8
|
+
let r = await a({
|
|
9
|
+
gateway: "workspace",
|
|
10
|
+
baseUrl: n,
|
|
11
|
+
query: e,
|
|
12
|
+
variables: t,
|
|
13
|
+
workspaceToken: !0
|
|
14
|
+
});
|
|
15
|
+
if (r.errors?.length) throw Error(r.errors[0]?.message ?? "GraphQL request failed");
|
|
16
|
+
if (!r.data) throw Error("GraphQL response did not include data");
|
|
17
|
+
return r.data;
|
|
18
|
+
}, s = (t) => {
|
|
19
|
+
let { apiGatewayUrl: n } = e();
|
|
20
|
+
return r({
|
|
21
|
+
queryKey: [
|
|
22
|
+
"atheletebridge",
|
|
23
|
+
"providers",
|
|
24
|
+
t
|
|
25
|
+
],
|
|
26
|
+
queryFn: async () => (await o("query Providers($filter: AthleteBridgeProviderFilterInput) {\n listServiceProviders(filter: $filter, limit: 200) {\n id name slug category status rating totalRatings averageOrderValue serviceTypes location businessHours createdAt\n }\n }", { filter: t ? { query: t } : void 0 }, n)).listServiceProviders.map((e) => ({
|
|
27
|
+
...e,
|
|
28
|
+
image: "https://images.unsplash.com/photo-1567620905732-2d1ec7ab7445?w=400",
|
|
29
|
+
images: ["https://images.unsplash.com/photo-1567620905732-2d1ec7ab7445?w=400"],
|
|
30
|
+
isOpen: e.status === "ACTIVE" || e.status === "VERIFIED",
|
|
31
|
+
isVerified: e.status === "VERIFIED",
|
|
32
|
+
distance: .5,
|
|
33
|
+
estimatedTime: 20,
|
|
34
|
+
createdAt: e.createdAt
|
|
35
|
+
}))
|
|
36
|
+
});
|
|
37
|
+
}, c = (t) => {
|
|
38
|
+
let { apiGatewayUrl: n } = e();
|
|
39
|
+
return r({
|
|
40
|
+
queryKey: [
|
|
41
|
+
"atheletebridge",
|
|
42
|
+
"offerings",
|
|
43
|
+
t
|
|
44
|
+
],
|
|
45
|
+
queryFn: async () => (await o("query Offerings($providerId: String) {\n listOfferings(providerId: $providerId, limit: 300) {\n id providerId kind name slug category description price originalPrice stock durationMinutes serviceType tags isAvailable metadata media\n }\n }", { providerId: t }, n)).listOfferings,
|
|
46
|
+
enabled: !!t
|
|
47
|
+
});
|
|
48
|
+
}, l = (t = {}) => {
|
|
49
|
+
let { apiGatewayUrl: n } = e();
|
|
50
|
+
return r({
|
|
51
|
+
queryKey: [
|
|
52
|
+
"atheletebridge",
|
|
53
|
+
"orders",
|
|
54
|
+
t.providerId,
|
|
55
|
+
t.customerId
|
|
56
|
+
],
|
|
57
|
+
queryFn: async () => (await o("query Orders($providerId: String, $customerId: String) {\n listOrders(providerId: $providerId, customerId: $customerId, limit: 200) {\n id orderNumber providerId customerId status paymentStatus fulfillmentType subtotal tax deliveryFee discount total notes timeline paymentMethod deliveryAddress createdAt\n provider { name }\n items { id offeringId name quantity unitPrice totalPrice customizations }\n }\n }", t, n)).listOrders.map((e) => ({
|
|
58
|
+
id: e.id,
|
|
59
|
+
cartId: e.providerId,
|
|
60
|
+
cartName: e.provider?.name || "Unknown Cart",
|
|
61
|
+
cartImage: "https://images.unsplash.com/photo-1567620905732-2d1ec7ab7445?w=100",
|
|
62
|
+
items: e.items.map((e) => ({
|
|
63
|
+
id: e.id,
|
|
64
|
+
name: e.name,
|
|
65
|
+
quantity: e.quantity,
|
|
66
|
+
price: e.unitPrice,
|
|
67
|
+
customizations: e.customizations
|
|
68
|
+
})),
|
|
69
|
+
total: e.total,
|
|
70
|
+
subtotal: e.subtotal,
|
|
71
|
+
taxes: e.tax,
|
|
72
|
+
deliveryFee: e.deliveryFee,
|
|
73
|
+
discount: e.discount,
|
|
74
|
+
status: e.status.toLowerCase(),
|
|
75
|
+
orderDate: e.createdAt,
|
|
76
|
+
deliveryAddress: e.deliveryAddress,
|
|
77
|
+
paymentMethod: e.paymentMethod || "Cash",
|
|
78
|
+
paymentStatus: e.paymentStatus.toLowerCase(),
|
|
79
|
+
timeline: e.timeline || []
|
|
80
|
+
}))
|
|
81
|
+
});
|
|
82
|
+
}, u = () => {
|
|
83
|
+
let { apiGatewayUrl: t } = e();
|
|
84
|
+
return r({
|
|
85
|
+
queryKey: ["atheletebridge", "dashboard-stats"],
|
|
86
|
+
queryFn: async () => (await o("query DashboardStats { atheletebridgeDashboardStats { totalOrders totalRevenue activeProviders activeCustomers avgRating pendingOrders } }", {}, t)).atheletebridgeDashboardStats
|
|
87
|
+
});
|
|
88
|
+
}, d = () => {
|
|
89
|
+
let { apiGatewayUrl: t } = e();
|
|
90
|
+
return r({
|
|
91
|
+
queryKey: ["atheletebridge", "investment-opportunities"],
|
|
92
|
+
queryFn: async () => (await o("query Opportunities {\n listInvestmentOpportunities(limit: 200) {\n id providerId title description targetAmount raisedAmount minimumInvestment expectedReturnsPct lockInMonths riskLevel status expiresAt terms businessMetrics createdAt\n provider { name }\n }\n }", {}, t)).listInvestmentOpportunities.map((e) => ({
|
|
93
|
+
id: e.id,
|
|
94
|
+
cartId: e.providerId,
|
|
95
|
+
cartName: e.provider?.name || "Unknown Cart",
|
|
96
|
+
businessOwner: "Owner",
|
|
97
|
+
targetAmount: e.targetAmount,
|
|
98
|
+
raisedAmount: e.raisedAmount,
|
|
99
|
+
minimumInvestment: e.minimumInvestment,
|
|
100
|
+
expectedReturns: e.expectedReturnsPct,
|
|
101
|
+
investmentPeriod: e.lockInMonths,
|
|
102
|
+
riskLevel: e.riskLevel.toLowerCase(),
|
|
103
|
+
description: e.description,
|
|
104
|
+
businessPlan: "",
|
|
105
|
+
financialProjections: [],
|
|
106
|
+
documents: [],
|
|
107
|
+
investors: [],
|
|
108
|
+
status: e.status.toLowerCase(),
|
|
109
|
+
createdAt: e.createdAt,
|
|
110
|
+
expiresAt: e.expiresAt
|
|
111
|
+
}))
|
|
112
|
+
});
|
|
113
|
+
}, f = (t) => {
|
|
114
|
+
let { apiGatewayUrl: n } = e();
|
|
115
|
+
return r({
|
|
116
|
+
queryKey: [
|
|
117
|
+
"atheletebridge",
|
|
118
|
+
"investments",
|
|
119
|
+
t
|
|
120
|
+
],
|
|
121
|
+
queryFn: async () => (await o("query Investments($investorId: String!) {\n listInvestments(investorId: $investorId) {\n id opportunityId amount currentValue expectedReturnsPct status investedAt maturedAt realizedReturns\n opportunity { provider { name } }\n }\n }", { investorId: t }, n)).listInvestments.map((e) => ({
|
|
122
|
+
id: e.id,
|
|
123
|
+
opportunityId: e.opportunityId,
|
|
124
|
+
cartName: e.opportunity?.provider?.name || "Unknown Cart",
|
|
125
|
+
investedAmount: e.amount,
|
|
126
|
+
currentValue: e.currentValue,
|
|
127
|
+
returns: e.realizedReturns,
|
|
128
|
+
returnsPercentage: e.expectedReturnsPct,
|
|
129
|
+
investmentDate: e.investedAt,
|
|
130
|
+
status: e.status.toLowerCase()
|
|
131
|
+
})),
|
|
132
|
+
enabled: !!t
|
|
133
|
+
});
|
|
134
|
+
}, p = (t) => {
|
|
135
|
+
let { apiGatewayUrl: n } = e();
|
|
136
|
+
return r({
|
|
137
|
+
queryKey: [
|
|
138
|
+
"atheletebridge",
|
|
139
|
+
"worker-tasks",
|
|
140
|
+
t
|
|
141
|
+
],
|
|
142
|
+
queryFn: async () => (await o("query WorkerTasks($workerId: String!) {\n listWorkerTasks(workerId: $workerId, limit: 100) {\n id orderId providerId type description priority status assignedAt dueAt completedAt customerName customerPhone earnings distance notes\n provider { name }\n order { deliveryAddress }\n }\n }", { workerId: t }, n)).listWorkerTasks.map((e) => ({
|
|
143
|
+
id: e.id,
|
|
144
|
+
orderId: e.orderId,
|
|
145
|
+
cartId: e.providerId,
|
|
146
|
+
cartName: e.provider?.name || "Unknown Cart",
|
|
147
|
+
type: e.type.toLowerCase(),
|
|
148
|
+
description: e.description,
|
|
149
|
+
priority: e.priority.toLowerCase(),
|
|
150
|
+
status: e.status.toLowerCase(),
|
|
151
|
+
assignedAt: e.assignedAt,
|
|
152
|
+
dueAt: e.dueAt,
|
|
153
|
+
completedAt: e.completedAt,
|
|
154
|
+
customerName: e.customerName,
|
|
155
|
+
customerPhone: e.customerPhone,
|
|
156
|
+
deliveryAddress: e.order?.deliveryAddress,
|
|
157
|
+
earnings: e.earnings,
|
|
158
|
+
distance: e.distance,
|
|
159
|
+
notes: e.notes
|
|
160
|
+
})),
|
|
161
|
+
enabled: !!t
|
|
162
|
+
});
|
|
163
|
+
}, m = (t) => {
|
|
164
|
+
let { apiGatewayUrl: n } = e();
|
|
165
|
+
return r({
|
|
166
|
+
queryKey: [
|
|
167
|
+
"atheletebridge",
|
|
168
|
+
"worker-stats",
|
|
169
|
+
t
|
|
170
|
+
],
|
|
171
|
+
queryFn: async () => (await o("query WorkerStats($workerId: String!) {\n atheletebridgeWorkerStats(workerId: $workerId) {\n totalDeliveries totalEarnings averageRating completionRate todayTasks todayEarnings\n }\n }", { workerId: t }, n)).atheletebridgeWorkerStats,
|
|
172
|
+
enabled: !!t
|
|
173
|
+
});
|
|
174
|
+
}, h = () => {
|
|
175
|
+
let t = i(), { apiGatewayUrl: r } = e();
|
|
176
|
+
return n({
|
|
177
|
+
mutationFn: async (e) => (await o("mutation PlaceOrder($input: AthleteBridgePlaceOrderInput!) {\n placeOrder(input: $input) {\n id orderNumber status total createdAt\n }\n }", { input: e }, r)).placeOrder,
|
|
178
|
+
onSuccess: () => {
|
|
179
|
+
t.invalidateQueries({ queryKey: ["atheletebridge", "orders"] }), t.invalidateQueries({ queryKey: ["atheletebridge", "dashboard-stats"] });
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
}, g = () => {
|
|
183
|
+
let t = i(), { apiGatewayUrl: r } = e();
|
|
184
|
+
return n({
|
|
185
|
+
mutationFn: async ({ taskId: e, status: t }) => (await o("mutation UpdateTaskStatus($taskId: String!, $status: AthleteBridgeWorkerTaskStatus!) {\n atheletebridgeUpdateWorkerTaskStatus(taskId: $taskId, status: $status) {\n id status\n }\n }", {
|
|
186
|
+
taskId: e,
|
|
187
|
+
status: t
|
|
188
|
+
}, r)).atheletebridgeUpdateWorkerTaskStatus,
|
|
189
|
+
onSuccess: () => {
|
|
190
|
+
t.invalidateQueries({ queryKey: ["atheletebridge", "worker-tasks"] }), t.invalidateQueries({ queryKey: ["atheletebridge", "worker-stats"] });
|
|
191
|
+
}
|
|
192
|
+
});
|
|
193
|
+
}, _ = () => {
|
|
194
|
+
let t = i(), { apiGatewayUrl: r } = e();
|
|
195
|
+
return n({
|
|
196
|
+
mutationFn: async ({ workerId: e, action: t }) => (await o("mutation ClockInOut($workerId: String!, $action: AthleteBridgeClockAction!) {\n atheletebridgeWorkerClockInOut(workerId: $workerId, action: $action) {\n success message\n }\n }", {
|
|
197
|
+
workerId: e,
|
|
198
|
+
action: t
|
|
199
|
+
}, r)).atheletebridgeWorkerClockInOut,
|
|
200
|
+
onSuccess: () => {
|
|
201
|
+
t.invalidateQueries({ queryKey: ["atheletebridge", "worker-schedules"] });
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
}, v = () => {
|
|
205
|
+
let { currentUser: n } = e(), r = s(), i = l({ customerId: n?.id }), a = u(), o = d(), c = f(n?.id || "");
|
|
206
|
+
return t(() => ({
|
|
207
|
+
providers: r,
|
|
208
|
+
orders: i,
|
|
209
|
+
dashboardStats: a,
|
|
210
|
+
investmentOpportunities: o,
|
|
211
|
+
investments: c
|
|
212
|
+
}), [
|
|
213
|
+
r,
|
|
214
|
+
i,
|
|
215
|
+
a,
|
|
216
|
+
o,
|
|
217
|
+
c
|
|
218
|
+
]);
|
|
219
|
+
};
|
|
220
|
+
//#endregion
|
|
221
|
+
export { v as useAthleteBridgeApi, u as useDashboardStats, d as useInvestmentOpportunities, f as useInvestments, c as useOfferings, l as useOrders, h as usePlaceOrder, s as useProviders, g as useUpdateWorkerTaskStatus, _ as useWorkerClockInOut, m as useWorkerStats, p as useWorkerTasks };
|
|
222
|
+
|
|
223
|
+
//# sourceMappingURL=useAthleteBridgeApi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAthleteBridgeApi.js","names":[],"sources":["../../../src/atheletebridge/hooks/useAthleteBridgeApi.ts"],"sourcesContent":["import { useMemo } from 'react';\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';\n\nimport { graphqlFetch } from '@burdenoff/fe-libs/shared/graphql';\n\nimport { useAthleteBridge } from '../context';\nimport type {\n MockCart,\n MockOrder,\n InvestmentOpportunity,\n Investment,\n DashboardStats,\n AdminAnalytics,\n WorkerTask,\n} from '../types';\n\nconst atheletebridgeQuery = async <TData>(\n query: string,\n variables: Record<string, unknown>,\n baseUrl?: string\n): Promise<TData> => {\n const response = await graphqlFetch<TData>({\n gateway: 'workspace',\n baseUrl,\n query,\n variables,\n workspaceToken: true,\n });\n\n if (response.errors?.length) {\n throw new Error(response.errors[0]?.message ?? 'GraphQL request failed');\n }\n\n if (!response.data) {\n throw new Error('GraphQL response did not include data');\n }\n\n return response.data;\n};\n\n// ============================================================================\n// Service Providers (Carts)\n// ============================================================================\n\nexport const useProviders = (query?: string) => {\n const { apiGatewayUrl } = useAthleteBridge();\n return useQuery({\n queryKey: ['atheletebridge', 'providers', query],\n queryFn: async () => {\n const result = await atheletebridgeQuery<{ listServiceProviders: any[] }>(\n `query Providers($filter: AthleteBridgeProviderFilterInput) {\n listServiceProviders(filter: $filter, limit: 200) {\n id name slug category status rating totalRatings averageOrderValue serviceTypes location businessHours createdAt\n }\n }`,\n {\n filter: query\n ? {\n query,\n }\n : undefined,\n },\n apiGatewayUrl\n );\n\n return result.listServiceProviders.map((p) => ({\n ...p,\n image: `https://images.unsplash.com/photo-1567620905732-2d1ec7ab7445?w=400`, // Placeholder\n images: [`https://images.unsplash.com/photo-1567620905732-2d1ec7ab7445?w=400`],\n isOpen: p.status === 'ACTIVE' || p.status === 'VERIFIED',\n isVerified: p.status === 'VERIFIED',\n distance: 0.5, // Mock\n estimatedTime: 20, // Mock\n createdAt: p.createdAt,\n })) as MockCart[];\n },\n });\n};\n\nexport const useOfferings = (providerId?: string) => {\n const { apiGatewayUrl } = useAthleteBridge();\n return useQuery({\n queryKey: ['atheletebridge', 'offerings', providerId],\n queryFn: async () => {\n const result = await atheletebridgeQuery<{ listOfferings: any[] }>(\n `query Offerings($providerId: String) {\n listOfferings(providerId: $providerId, limit: 300) {\n id providerId kind name slug category description price originalPrice stock durationMinutes serviceType tags isAvailable metadata media\n }\n }`,\n { providerId },\n apiGatewayUrl\n );\n return result.listOfferings;\n },\n enabled: Boolean(providerId),\n });\n};\n\n// ============================================================================\n// Orders\n// ============================================================================\n\nexport const useOrders = (input: { providerId?: string; customerId?: string } = {}) => {\n const { apiGatewayUrl } = useAthleteBridge();\n return useQuery({\n queryKey: ['atheletebridge', 'orders', input.providerId, input.customerId],\n queryFn: async () => {\n const result = await atheletebridgeQuery<{ listOrders: any[] }>(\n `query Orders($providerId: String, $customerId: String) {\n listOrders(providerId: $providerId, customerId: $customerId, limit: 200) {\n id orderNumber providerId customerId status paymentStatus fulfillmentType subtotal tax deliveryFee discount total notes timeline paymentMethod deliveryAddress createdAt\n provider { name }\n items { id offeringId name quantity unitPrice totalPrice customizations }\n }\n }`,\n input,\n apiGatewayUrl\n );\n\n return result.listOrders.map((o) => ({\n id: o.id,\n cartId: o.providerId,\n cartName: o.provider?.name || 'Unknown Cart',\n cartImage: `https://images.unsplash.com/photo-1567620905732-2d1ec7ab7445?w=100`, // Placeholder\n items: o.items.map((i: any) => ({\n id: i.id,\n name: i.name,\n quantity: i.quantity,\n price: i.unitPrice,\n customizations: i.customizations,\n })),\n total: o.total,\n subtotal: o.subtotal,\n taxes: o.tax,\n deliveryFee: o.deliveryFee,\n discount: o.discount,\n status: o.status.toLowerCase(),\n orderDate: o.createdAt,\n deliveryAddress: o.deliveryAddress,\n paymentMethod: o.paymentMethod || 'Cash',\n paymentStatus: o.paymentStatus.toLowerCase(),\n timeline: o.timeline || [],\n })) as MockOrder[];\n },\n });\n};\n\n// ============================================================================\n// Analytics & Stats\n// ============================================================================\n\nexport const useDashboardStats = () => {\n const { apiGatewayUrl } = useAthleteBridge();\n return useQuery({\n queryKey: ['atheletebridge', 'dashboard-stats'],\n queryFn: async () => {\n const result = await atheletebridgeQuery<{\n atheletebridgeDashboardStats: DashboardStats;\n }>(\n `query DashboardStats { atheletebridgeDashboardStats { totalOrders totalRevenue activeProviders activeCustomers avgRating pendingOrders } }`,\n {},\n apiGatewayUrl\n );\n return result.atheletebridgeDashboardStats;\n },\n });\n};\n\nexport const useAdminAnalytics = () => {\n const { apiGatewayUrl } = useAthleteBridge();\n return useQuery({\n queryKey: ['atheletebridge', 'admin-analytics'],\n queryFn: async () => {\n const result = await atheletebridgeQuery<{ atheletebridgeAdminAnalytics: AdminAnalytics }>(\n `query AdminAnalytics { atheletebridgeAdminAnalytics { revenueByCategory orderTrends topProviders customerGrowth categoryDistribution } }`,\n {},\n apiGatewayUrl\n );\n return result.atheletebridgeAdminAnalytics;\n },\n });\n};\n\n// ============================================================================\n// Investments\n// ============================================================================\n\nexport const useInvestmentOpportunities = () => {\n const { apiGatewayUrl } = useAthleteBridge();\n return useQuery({\n queryKey: ['atheletebridge', 'investment-opportunities'],\n queryFn: async () => {\n const result = await atheletebridgeQuery<{ listInvestmentOpportunities: any[] }>(\n `query Opportunities {\n listInvestmentOpportunities(limit: 200) {\n id providerId title description targetAmount raisedAmount minimumInvestment expectedReturnsPct lockInMonths riskLevel status expiresAt terms businessMetrics createdAt\n provider { name }\n }\n }`,\n {},\n apiGatewayUrl\n );\n\n return result.listInvestmentOpportunities.map((o) => ({\n id: o.id,\n cartId: o.providerId,\n cartName: o.provider?.name || 'Unknown Cart',\n businessOwner: 'Owner', // Mock\n targetAmount: o.targetAmount,\n raisedAmount: o.raisedAmount,\n minimumInvestment: o.minimumInvestment,\n expectedReturns: o.expectedReturnsPct,\n investmentPeriod: o.lockInMonths,\n riskLevel: o.riskLevel.toLowerCase(),\n description: o.description,\n businessPlan: '',\n financialProjections: [],\n documents: [],\n investors: [],\n status: o.status.toLowerCase(),\n createdAt: o.createdAt,\n expiresAt: o.expiresAt,\n })) as InvestmentOpportunity[];\n },\n });\n};\n\nexport const useInvestments = (investorId: string) => {\n const { apiGatewayUrl } = useAthleteBridge();\n return useQuery({\n queryKey: ['atheletebridge', 'investments', investorId],\n queryFn: async () => {\n const result = await atheletebridgeQuery<{ listInvestments: any[] }>(\n `query Investments($investorId: String!) {\n listInvestments(investorId: $investorId) {\n id opportunityId amount currentValue expectedReturnsPct status investedAt maturedAt realizedReturns\n opportunity { provider { name } }\n }\n }`,\n { investorId },\n apiGatewayUrl\n );\n\n return result.listInvestments.map((i) => ({\n id: i.id,\n opportunityId: i.opportunityId,\n cartName: i.opportunity?.provider?.name || 'Unknown Cart',\n investedAmount: i.amount,\n currentValue: i.currentValue,\n returns: i.realizedReturns,\n returnsPercentage: i.expectedReturnsPct,\n investmentDate: i.investedAt,\n status: i.status.toLowerCase(),\n })) as Investment[];\n },\n enabled: Boolean(investorId),\n });\n};\n\n// ============================================================================\n// Workers & Tasks\n// ============================================================================\n\nexport const useWorkerTasks = (workerId: string) => {\n const { apiGatewayUrl } = useAthleteBridge();\n return useQuery({\n queryKey: ['atheletebridge', 'worker-tasks', workerId],\n queryFn: async () => {\n const result = await atheletebridgeQuery<{ listWorkerTasks: any[] }>(\n `query WorkerTasks($workerId: String!) {\n listWorkerTasks(workerId: $workerId, limit: 100) {\n id orderId providerId type description priority status assignedAt dueAt completedAt customerName customerPhone earnings distance notes\n provider { name }\n order { deliveryAddress }\n }\n }`,\n { workerId },\n apiGatewayUrl\n );\n\n return result.listWorkerTasks.map((t) => ({\n id: t.id,\n orderId: t.orderId,\n cartId: t.providerId,\n cartName: t.provider?.name || 'Unknown Cart',\n type: t.type.toLowerCase(),\n description: t.description,\n priority: t.priority.toLowerCase(),\n status: t.status.toLowerCase(),\n assignedAt: t.assignedAt,\n dueAt: t.dueAt,\n completedAt: t.completedAt,\n customerName: t.customerName,\n customerPhone: t.customerPhone,\n deliveryAddress: t.order?.deliveryAddress,\n earnings: t.earnings,\n distance: t.distance,\n notes: t.notes,\n })) as WorkerTask[];\n },\n enabled: Boolean(workerId),\n });\n};\n\nexport const useWorkerStats = (workerId: string) => {\n const { apiGatewayUrl } = useAthleteBridge();\n return useQuery({\n queryKey: ['atheletebridge', 'worker-stats', workerId],\n queryFn: async () => {\n const result = await atheletebridgeQuery<{ atheletebridgeWorkerStats: any }>(\n `query WorkerStats($workerId: String!) {\n atheletebridgeWorkerStats(workerId: $workerId) {\n totalDeliveries totalEarnings averageRating completionRate todayTasks todayEarnings\n }\n }`,\n { workerId },\n apiGatewayUrl\n );\n return result.atheletebridgeWorkerStats;\n },\n enabled: Boolean(workerId),\n });\n};\n\nexport const useWorkerSchedules = (workerId: string) => {\n const { apiGatewayUrl } = useAthleteBridge();\n return useQuery({\n queryKey: ['atheletebridge', 'worker-schedules', workerId],\n queryFn: async () => {\n const result = await atheletebridgeQuery<{ listWorkerSchedules: any[] }>(\n `query WorkerSchedules($workerId: String!) {\n listWorkerSchedules(workerId: $workerId) {\n id date startTime endTime providerId status tasksCompleted totalEarnings\n provider { name }\n }\n }`,\n { workerId },\n apiGatewayUrl\n );\n\n return result.listWorkerSchedules.map((s) => ({\n id: s.id,\n date: s.date,\n startTime: s.startTime,\n endTime: s.endTime,\n cartId: s.providerId,\n cartName: s.provider?.name || 'Unknown Cart',\n status: s.status.toLowerCase(),\n tasksCompleted: s.tasksCompleted,\n totalEarnings: s.totalEarnings,\n }));\n },\n enabled: Boolean(workerId),\n });\n};\n\n// ============================================================================\n// Reviews\n// ============================================================================\n\nexport const useReviews = (providerId: string) => {\n const { apiGatewayUrl } = useAthleteBridge();\n return useQuery({\n queryKey: ['atheletebridge', 'reviews', providerId],\n queryFn: async () => {\n const result = await atheletebridgeQuery<{ listReviews: any[] }>(\n `query Reviews($providerId: String!) {\n listReviews(providerId: $providerId) {\n id providerId customerId rating review response createdAt updatedAt\n }\n }`,\n { providerId },\n apiGatewayUrl\n );\n return result.listReviews;\n },\n enabled: Boolean(providerId),\n });\n};\n\n// ============================================================================\n// Mutations\n// ============================================================================\n\nexport const usePlaceOrder = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useAthleteBridge();\n\n return useMutation({\n mutationFn: async (input: Record<string, unknown>) => {\n const result = await atheletebridgeQuery<{ placeOrder: any }>(\n `mutation PlaceOrder($input: AthleteBridgePlaceOrderInput!) {\n placeOrder(input: $input) {\n id orderNumber status total createdAt\n }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.placeOrder;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: ['atheletebridge', 'orders'] });\n void queryClient.invalidateQueries({ queryKey: ['atheletebridge', 'dashboard-stats'] });\n },\n });\n};\n\nexport const useCreateProvider = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useAthleteBridge();\n\n return useMutation({\n mutationFn: async (input: Record<string, unknown>) => {\n const result = await atheletebridgeQuery<{ atheletebridgeCreateServiceProvider: any }>(\n `mutation CreateProvider($input: AthleteBridgeCreateServiceProviderInput!) {\n atheletebridgeCreateServiceProvider(input: $input) {\n id name slug status category location rating\n }\n }`,\n { input },\n apiGatewayUrl\n );\n return result.atheletebridgeCreateServiceProvider;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: ['atheletebridge', 'providers'] });\n void queryClient.invalidateQueries({ queryKey: ['atheletebridge', 'dashboard-stats'] });\n },\n });\n};\n\nexport const useUpdateWorkerTaskStatus = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useAthleteBridge();\n\n return useMutation({\n mutationFn: async ({ taskId, status }: { taskId: string; status: string }) => {\n const result = await atheletebridgeQuery<{ atheletebridgeUpdateWorkerTaskStatus: any }>(\n `mutation UpdateTaskStatus($taskId: String!, $status: AthleteBridgeWorkerTaskStatus!) {\n atheletebridgeUpdateWorkerTaskStatus(taskId: $taskId, status: $status) {\n id status\n }\n }`,\n { taskId, status },\n apiGatewayUrl\n );\n return result.atheletebridgeUpdateWorkerTaskStatus;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: ['atheletebridge', 'worker-tasks'] });\n void queryClient.invalidateQueries({ queryKey: ['atheletebridge', 'worker-stats'] });\n },\n });\n};\n\nexport const useWorkerClockInOut = () => {\n const queryClient = useQueryClient();\n const { apiGatewayUrl } = useAthleteBridge();\n\n return useMutation({\n mutationFn: async ({\n workerId,\n action,\n }: {\n workerId: string;\n action: 'CLOCK_IN' | 'CLOCK_OUT';\n }) => {\n const result = await atheletebridgeQuery<{ atheletebridgeWorkerClockInOut: any }>(\n `mutation ClockInOut($workerId: String!, $action: AthleteBridgeClockAction!) {\n atheletebridgeWorkerClockInOut(workerId: $workerId, action: $action) {\n success message\n }\n }`,\n { workerId, action },\n apiGatewayUrl\n );\n return result.atheletebridgeWorkerClockInOut;\n },\n onSuccess: () => {\n void queryClient.invalidateQueries({ queryKey: ['atheletebridge', 'worker-schedules'] });\n },\n });\n};\n\n// ============================================================================\n// Main Hook\n// ============================================================================\n\nexport const useAthleteBridgeApi = () => {\n const { currentUser } = useAthleteBridge();\n const providers = useProviders();\n const orders = useOrders({ customerId: currentUser?.id });\n const dashboardStats = useDashboardStats();\n const investmentOpportunities = useInvestmentOpportunities();\n const investments = useInvestments(currentUser?.id || '');\n\n return useMemo(\n () => ({\n providers,\n orders,\n dashboardStats,\n investmentOpportunities,\n investments,\n }),\n [providers, orders, dashboardStats, investmentOpportunities, investments]\n );\n};\n"],"mappings":"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"}
|