@burdenoff/microfe-crewfoundry 2026.1013.1 → 2026.1029.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/dist/crewfoundry/CrewFoundryRoot.d.ts.map +1 -1
- package/dist/crewfoundry/CrewFoundryRoot.js +160 -256
- package/dist/crewfoundry/CrewFoundryRoot.js.map +1 -1
- package/dist/crewfoundry/CrewFoundryRoutes.d.ts.map +1 -1
- package/dist/crewfoundry/CrewFoundryRoutes.js +152 -192
- package/dist/crewfoundry/CrewFoundryRoutes.js.map +1 -1
- package/dist/crewfoundry/components/InlineError.d.ts +5 -0
- package/dist/crewfoundry/components/InlineError.d.ts.map +1 -0
- package/dist/crewfoundry/components/InlineError.js +17 -0
- package/dist/crewfoundry/components/InlineError.js.map +1 -0
- package/dist/crewfoundry/components/forms/FormModal.d.ts +25 -1
- package/dist/crewfoundry/components/forms/FormModal.d.ts.map +1 -1
- package/dist/crewfoundry/components/forms/FormModal.js +151 -136
- package/dist/crewfoundry/components/forms/FormModal.js.map +1 -1
- package/dist/crewfoundry/components/marketplace/BookServiceModal.d.ts +14 -0
- package/dist/crewfoundry/components/marketplace/BookServiceModal.d.ts.map +1 -0
- package/dist/crewfoundry/components/marketplace/BookServiceModal.js +75 -0
- package/dist/crewfoundry/components/marketplace/BookServiceModal.js.map +1 -0
- package/dist/crewfoundry/components/marketplace/MarketplaceTabs.d.ts +24 -0
- package/dist/crewfoundry/components/marketplace/MarketplaceTabs.d.ts.map +1 -0
- package/dist/crewfoundry/components/marketplace/MarketplaceTabs.js +47 -0
- package/dist/crewfoundry/components/marketplace/MarketplaceTabs.js.map +1 -0
- package/dist/crewfoundry/components/marketplace/ServiceListingModal.d.ts +12 -0
- package/dist/crewfoundry/components/marketplace/ServiceListingModal.d.ts.map +1 -0
- package/dist/crewfoundry/components/marketplace/ServiceListingModal.js +123 -0
- package/dist/crewfoundry/components/marketplace/ServiceListingModal.js.map +1 -0
- package/dist/crewfoundry/components/viz/CertificateCard.js +4 -118
- package/dist/crewfoundry/components/viz/PathSteps.js +3 -68
- package/dist/crewfoundry/components/viz/lib/geometry.js +5 -13
- package/dist/crewfoundry/components/viz/lib/geometry.js.map +1 -1
- package/dist/crewfoundry/lib/analytics.d.ts +1 -6
- package/dist/crewfoundry/lib/analytics.d.ts.map +1 -1
- package/dist/crewfoundry/lib/analytics.js +3 -18
- package/dist/crewfoundry/lib/analytics.js.map +1 -1
- package/dist/crewfoundry/lib/companyFinance.d.ts +3 -7
- package/dist/crewfoundry/lib/companyFinance.d.ts.map +1 -1
- package/dist/crewfoundry/lib/companyFinance.js +3 -8
- package/dist/crewfoundry/lib/companyFinance.js.map +1 -1
- package/dist/crewfoundry/lib/learning.d.ts +12 -0
- package/dist/crewfoundry/lib/learning.d.ts.map +1 -0
- package/dist/crewfoundry/lib/learning.js +26 -0
- package/dist/crewfoundry/lib/learning.js.map +1 -0
- package/dist/crewfoundry/lib/marketplace.d.ts +30 -0
- package/dist/crewfoundry/lib/marketplace.d.ts.map +1 -0
- package/dist/crewfoundry/lib/marketplace.js +91 -0
- package/dist/crewfoundry/lib/marketplace.js.map +1 -0
- package/dist/crewfoundry/lib/useEnsureLoaded.d.ts +7 -0
- package/dist/crewfoundry/lib/useEnsureLoaded.d.ts.map +1 -0
- package/dist/crewfoundry/lib/useEnsureLoaded.js +25 -0
- package/dist/crewfoundry/lib/useEnsureLoaded.js.map +1 -0
- package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.d.ts.map +1 -1
- package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.js +12 -25
- package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/AnalyticsHiringAnalyticsPagePage.d.ts.map +1 -1
- package/dist/crewfoundry/pages/AnalyticsHiringAnalyticsPagePage.js +49 -49
- package/dist/crewfoundry/pages/AnalyticsHiringAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.d.ts.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js +145 -157
- package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyClientManagementPagePage.d.ts.map +1 -1
- package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js +14 -14
- package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.d.ts.map +1 -1
- package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js +14 -14
- package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HelpApiDocumentationPagePage.d.ts.map +1 -1
- package/dist/crewfoundry/pages/HelpApiDocumentationPagePage.js +71 -33
- package/dist/crewfoundry/pages/HelpApiDocumentationPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringCreateJobPagePage.d.ts.map +1 -1
- package/dist/crewfoundry/pages/HiringCreateJobPagePage.js +260 -115
- package/dist/crewfoundry/pages/HiringCreateJobPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringJobDetailsPagePage.d.ts.map +1 -1
- package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js +199 -166
- package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringJobsPagePage.d.ts.map +1 -1
- package/dist/crewfoundry/pages/HiringJobsPagePage.js +118 -104
- package/dist/crewfoundry/pages/HiringJobsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.d.ts.map +1 -1
- package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js +247 -173
- package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCoursesPagePage.d.ts +12 -0
- package/dist/crewfoundry/pages/LearningCoursesPagePage.d.ts.map +1 -1
- package/dist/crewfoundry/pages/LearningCoursesPagePage.js +307 -293
- package/dist/crewfoundry/pages/LearningCoursesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningEnrollmentsPagePage.d.ts +2 -0
- package/dist/crewfoundry/pages/LearningEnrollmentsPagePage.d.ts.map +1 -0
- package/dist/crewfoundry/pages/LearningEnrollmentsPagePage.js +223 -0
- package/dist/crewfoundry/pages/LearningEnrollmentsPagePage.js.map +1 -0
- package/dist/crewfoundry/pages/LearningLearningAnalyticsPagePage.d.ts +4 -0
- package/dist/crewfoundry/pages/LearningLearningAnalyticsPagePage.d.ts.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningAnalyticsPagePage.js +115 -160
- package/dist/crewfoundry/pages/LearningLearningAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.d.ts.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.js +165 -75
- package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceEscrowPagePage.d.ts +7 -0
- package/dist/crewfoundry/pages/MarketplaceEscrowPagePage.d.ts.map +1 -0
- package/dist/crewfoundry/pages/MarketplaceEscrowPagePage.js +175 -0
- package/dist/crewfoundry/pages/MarketplaceEscrowPagePage.js.map +1 -0
- package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.d.ts.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js +182 -223
- package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.d.ts.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js +168 -227
- package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.d.ts.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.js +127 -290
- package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/store/crewfoundryStore.d.ts +139 -79
- package/dist/crewfoundry/store/crewfoundryStore.d.ts.map +1 -1
- package/dist/crewfoundry/store/crewfoundryStore.js +323 -244
- package/dist/crewfoundry/store/crewfoundryStore.js.map +1 -1
- package/dist/crewfoundry/utils/dateUtils.d.ts +52 -0
- package/dist/crewfoundry/utils/dateUtils.d.ts.map +1 -0
- package/dist/crewfoundry/utils/dateUtils.js +31 -0
- package/dist/crewfoundry/utils/dateUtils.js.map +1 -0
- package/dist/generated/global-types.d.ts +5145 -1627
- package/dist/generated/global-types.d.ts.map +1 -1
- package/dist/generated/wspace-types.d.ts +100373 -34602
- package/dist/generated/wspace-types.d.ts.map +1 -1
- package/dist/utils/pageContext.d.ts.map +1 -1
- package/dist/utils/pageContext.js +0 -1
- package/dist/utils/pageContext.js.map +1 -1
- package/package.json +1 -1
- package/dist/crewfoundry/components/viz/CertificateCard.js.map +0 -1
- package/dist/crewfoundry/components/viz/PathSteps.js.map +0 -1
- package/dist/crewfoundry/pages/CommunicationsCallsPagePage.d.ts +0 -2
- package/dist/crewfoundry/pages/CommunicationsCallsPagePage.d.ts.map +0 -1
- package/dist/crewfoundry/pages/CommunicationsCallsPagePage.js +0 -53
- package/dist/crewfoundry/pages/CommunicationsCallsPagePage.js.map +0 -1
- package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.d.ts +0 -2
- package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.d.ts.map +0 -1
- package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.js +0 -107
- package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.js.map +0 -1
- package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.d.ts +0 -2
- package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.d.ts.map +0 -1
- package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.js +0 -62
- package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.js.map +0 -1
- package/dist/crewfoundry/pages/LearningAssessmentsPagePage.d.ts +0 -2
- package/dist/crewfoundry/pages/LearningAssessmentsPagePage.d.ts.map +0 -1
- package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js +0 -37
- package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js.map +0 -1
- package/dist/crewfoundry/pages/LearningCertificatesPagePage.d.ts +0 -2
- package/dist/crewfoundry/pages/LearningCertificatesPagePage.d.ts.map +0 -1
- package/dist/crewfoundry/pages/LearningCertificatesPagePage.js +0 -111
- package/dist/crewfoundry/pages/LearningCertificatesPagePage.js.map +0 -1
- package/dist/crewfoundry/pages/LearningCourseLearningPagePage.d.ts +0 -2
- package/dist/crewfoundry/pages/LearningCourseLearningPagePage.d.ts.map +0 -1
- package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js +0 -309
- package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js.map +0 -1
- package/dist/crewfoundry/pages/LearningLearningPagePage.d.ts +0 -2
- package/dist/crewfoundry/pages/LearningLearningPagePage.d.ts.map +0 -1
- package/dist/crewfoundry/pages/LearningLearningPagePage.js +0 -200
- package/dist/crewfoundry/pages/LearningLearningPagePage.js.map +0 -1
- package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.d.ts +0 -2
- package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.d.ts.map +0 -1
- package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js +0 -190
- package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js.map +0 -1
- package/dist/crewfoundry/pages/LearningLearningPathsPagePage.d.ts +0 -2
- package/dist/crewfoundry/pages/LearningLearningPathsPagePage.d.ts.map +0 -1
- package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js +0 -230
- package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js.map +0 -1
- package/dist/crewfoundry/pages/LearningMyLearningPagePage.d.ts +0 -2
- package/dist/crewfoundry/pages/LearningMyLearningPagePage.d.ts.map +0 -1
- package/dist/crewfoundry/pages/LearningMyLearningPagePage.js +0 -293
- package/dist/crewfoundry/pages/LearningMyLearningPagePage.js.map +0 -1
- package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.d.ts +0 -2
- package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.d.ts.map +0 -1
- package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.js +0 -163
- package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.js.map +0 -1
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.d.ts +0 -2
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.d.ts.map +0 -1
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.js +0 -365
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.js.map +0 -1
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.d.ts +0 -2
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.d.ts.map +0 -1
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.js +0 -224
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.js.map +0 -1
- package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.d.ts +0 -2
- package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.d.ts.map +0 -1
- package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.js +0 -180
- package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.js.map +0 -1
- package/dist/crewfoundry/pages/MarketplaceMessagingPagePage.d.ts +0 -2
- package/dist/crewfoundry/pages/MarketplaceMessagingPagePage.d.ts.map +0 -1
- package/dist/crewfoundry/pages/MarketplaceMessagingPagePage.js +0 -38
- package/dist/crewfoundry/pages/MarketplaceMessagingPagePage.js.map +0 -1
- package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.d.ts +0 -2
- package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.d.ts.map +0 -1
- package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.js +0 -204
- package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.js.map +0 -1
- package/dist/crewfoundry/pages/PaymentsEscrowPagePage.d.ts +0 -2
- package/dist/crewfoundry/pages/PaymentsEscrowPagePage.d.ts.map +0 -1
- package/dist/crewfoundry/pages/PaymentsEscrowPagePage.js +0 -55
- package/dist/crewfoundry/pages/PaymentsEscrowPagePage.js.map +0 -1
- package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.d.ts +0 -2
- package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.d.ts.map +0 -1
- package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js +0 -335
- package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js.map +0 -1
- package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.d.ts +0 -2
- package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.d.ts.map +0 -1
- package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.js +0 -160
- package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.js.map +0 -1
- package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.d.ts +0 -2
- package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.d.ts.map +0 -1
- package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.js +0 -80
- package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.js.map +0 -1
- package/dist/crewfoundry/pages/PaymentsSecurityPagePage.d.ts +0 -2
- package/dist/crewfoundry/pages/PaymentsSecurityPagePage.d.ts.map +0 -1
- package/dist/crewfoundry/pages/PaymentsSecurityPagePage.js +0 -191
- package/dist/crewfoundry/pages/PaymentsSecurityPagePage.js.map +0 -1
- package/dist/crewfoundry/utils/courseProgress.d.ts +0 -33
- package/dist/crewfoundry/utils/courseProgress.d.ts.map +0 -1
- package/dist/crewfoundry/utils/courseProgress.js +0 -46
- package/dist/crewfoundry/utils/courseProgress.js.map +0 -1
|
@@ -1,310 +1,147 @@
|
|
|
1
1
|
import { useCrewFoundryStore as e } from "../store/crewfoundryStore.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { StatCard as t } from "../components/viz/StatCard.js";
|
|
3
|
+
import { AvatarStack as n } from "../components/viz/AvatarStack.js";
|
|
4
4
|
import "../components/viz/index.js";
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
5
|
+
import { formatDate as r } from "../utils/dateUtils.js";
|
|
6
|
+
import { InlineError as i } from "../components/InlineError.js";
|
|
7
|
+
import { useEnsureLoaded as a } from "../lib/useEnsureLoaded.js";
|
|
8
|
+
import { formatRate as o } from "../lib/marketplace.js";
|
|
9
|
+
import { BookServiceModal as s } from "../components/marketplace/BookServiceModal.js";
|
|
10
|
+
import { ServiceListingModal as c } from "../components/marketplace/ServiceListingModal.js";
|
|
11
|
+
import { useState as l } from "react";
|
|
12
|
+
import { ArrowLeft as u, Pencil as d } from "lucide-react";
|
|
13
|
+
import { useNavigate as f, useSearchParams as p } from "react-router";
|
|
14
|
+
import { jsx as m, jsxs as h } from "react/jsx-runtime";
|
|
15
|
+
import { Badge as g, Button as _, Card as v, CardContent as y, CardHeader as b, CardTitle as x, GradientText as S, IllustratedEmptyState as C, Spinner as w } from "@burdenoff/fe-libs/ui";
|
|
10
16
|
//#region src/crewfoundry/pages/MarketplaceServiceDetailsPagePage.tsx
|
|
11
|
-
function
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
label: "Available for new projects",
|
|
15
|
-
icon: o,
|
|
16
|
-
className: "text-status-success-text"
|
|
17
|
-
};
|
|
18
|
-
case "pending": return {
|
|
19
|
-
label: "Pending review",
|
|
20
|
-
icon: s,
|
|
21
|
-
className: "text-status-warning-text"
|
|
22
|
-
};
|
|
23
|
-
default: return {
|
|
24
|
-
label: "Not currently available",
|
|
25
|
-
icon: l,
|
|
26
|
-
className: "text-text-secondary"
|
|
27
|
-
};
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
function O() {
|
|
31
|
-
let o = f(), l = d(), { marketplaceServices: O, initialized: k } = e(), A = new URLSearchParams(l.search).get("id"), j = O.find((e) => e.id === A) ?? O[0], M = r(() => j ? O.filter((e) => e.provider === j.provider) : [], [O, j]), [N, P] = i(null), F = (/* @__PURE__ */ new Date()).toISOString().slice(0, 10), [I, L] = i(F);
|
|
32
|
-
if (!k && !j) return /* @__PURE__ */ p("div", {
|
|
17
|
+
function T() {
|
|
18
|
+
let T = f(), [E] = p(), { serviceListings: D, bookings: O, marketplaceLoaded: k, fetchMarketplace: A, initParams: j } = e(), M = a(k, A), [N, P] = l(null), [F, I] = l(!1), [L, R] = l(null), z = E.get("id"), B = D.find((e) => e.id === z);
|
|
19
|
+
if (!k && !M) return /* @__PURE__ */ m("div", {
|
|
33
20
|
className: "flex min-h-[60vh] items-center justify-center p-6",
|
|
34
|
-
children: /* @__PURE__ */
|
|
21
|
+
children: /* @__PURE__ */ m(w, { size: "lg" })
|
|
35
22
|
});
|
|
36
|
-
if (!
|
|
37
|
-
className: "p-6",
|
|
38
|
-
children: /* @__PURE__ */
|
|
23
|
+
if (!B) return /* @__PURE__ */ h("div", {
|
|
24
|
+
className: "space-y-4 p-6",
|
|
25
|
+
children: [/* @__PURE__ */ m(i, { message: M }), /* @__PURE__ */ m(C, {
|
|
39
26
|
illustration: "empty-search",
|
|
40
27
|
title: "Service not found",
|
|
41
|
-
description: "This service
|
|
42
|
-
|
|
28
|
+
description: "This service was removed or the link is incomplete.",
|
|
29
|
+
action: /* @__PURE__ */ m(_, {
|
|
30
|
+
size: "sm",
|
|
31
|
+
onClick: () => T("../marketplace/marketplace-page"),
|
|
32
|
+
children: "Back to the marketplace"
|
|
33
|
+
})
|
|
34
|
+
})]
|
|
43
35
|
});
|
|
44
|
-
let
|
|
45
|
-
return /* @__PURE__ */
|
|
36
|
+
let V = B.providerActorId === j.actorId, H = O.filter((e) => e.listingId === B.id), U = H.filter((e) => e.status === "completed").length, W = H.filter((e) => e.status === "requested" || e.status === "confirmed").length;
|
|
37
|
+
return /* @__PURE__ */ h("div", {
|
|
46
38
|
className: "space-y-6 p-6",
|
|
47
|
-
children: [
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
/* @__PURE__ */
|
|
57
|
-
className: "
|
|
58
|
-
children: "
|
|
59
|
-
|
|
60
|
-
/* @__PURE__ */ p("span", {
|
|
61
|
-
className: "text-text-primary",
|
|
62
|
-
children: j.title
|
|
63
|
-
})
|
|
64
|
-
]
|
|
65
|
-
}), /* @__PURE__ */ m("div", {
|
|
66
|
-
className: "grid gap-6 lg:grid-cols-3",
|
|
67
|
-
children: [/* @__PURE__ */ m("div", {
|
|
68
|
-
className: "space-y-6 lg:col-span-2",
|
|
69
|
-
children: [
|
|
70
|
-
/* @__PURE__ */ m("div", {
|
|
71
|
-
className: "flex flex-col gap-4 sm:flex-row sm:items-start",
|
|
72
|
-
children: [/* @__PURE__ */ p("span", {
|
|
73
|
-
className: "flex h-20 w-20 shrink-0 items-center justify-center rounded-full bg-action-primary-bg text-2xl font-semibold text-action-primary-text",
|
|
74
|
-
"aria-hidden": "true",
|
|
75
|
-
children: t(j.provider)
|
|
76
|
-
}), /* @__PURE__ */ m("div", {
|
|
77
|
-
className: "min-w-0 flex-1 space-y-2",
|
|
78
|
-
children: [
|
|
79
|
-
/* @__PURE__ */ p("h1", {
|
|
80
|
-
className: "text-2xl font-semibold",
|
|
81
|
-
children: /* @__PURE__ */ p(S, { children: j.provider })
|
|
82
|
-
}),
|
|
83
|
-
/* @__PURE__ */ p("p", {
|
|
84
|
-
className: "text-sm text-text-secondary",
|
|
85
|
-
children: j.title
|
|
86
|
-
}),
|
|
87
|
-
/* @__PURE__ */ m("div", {
|
|
88
|
-
className: "flex flex-wrap items-center gap-3",
|
|
89
|
-
children: [
|
|
90
|
-
/* @__PURE__ */ p(n, {
|
|
91
|
-
value: j.rating,
|
|
92
|
-
count: j.reviews,
|
|
93
|
-
showValue: !0,
|
|
94
|
-
size: 16
|
|
95
|
-
}),
|
|
96
|
-
/* @__PURE__ */ m("span", {
|
|
97
|
-
className: "flex items-center gap-1 text-xs text-text-secondary",
|
|
98
|
-
children: [/* @__PURE__ */ p(s, { className: "h-3 w-3" }), j.deliveryTime]
|
|
99
|
-
}),
|
|
100
|
-
/* @__PURE__ */ p(h, {
|
|
101
|
-
variant: "outline",
|
|
102
|
-
className: "text-[10px]",
|
|
103
|
-
children: j.category
|
|
104
|
-
})
|
|
105
|
-
]
|
|
106
|
-
}),
|
|
107
|
-
/* @__PURE__ */ p("div", {
|
|
108
|
-
className: "flex flex-wrap gap-1.5 pt-1",
|
|
109
|
-
children: j.skills.map((e) => /* @__PURE__ */ p(h, {
|
|
110
|
-
variant: "secondary",
|
|
111
|
-
className: "text-xs",
|
|
112
|
-
children: e
|
|
113
|
-
}, e))
|
|
114
|
-
})
|
|
115
|
-
]
|
|
116
|
-
})]
|
|
117
|
-
}),
|
|
118
|
-
/* @__PURE__ */ p(T, { children: "See exactly what this service includes, what it costs, and how others rated it — use the booking panel to pick a package and request an engagement." }),
|
|
119
|
-
/* @__PURE__ */ m(x, { children: [/* @__PURE__ */ p("div", {
|
|
120
|
-
className: "mb-2 text-lg font-semibold",
|
|
121
|
-
children: "About this service"
|
|
122
|
-
}), /* @__PURE__ */ p("p", {
|
|
123
|
-
className: "text-sm text-text-secondary",
|
|
124
|
-
children: j.description
|
|
125
|
-
})] }),
|
|
126
|
-
/* @__PURE__ */ m("div", {
|
|
127
|
-
className: "space-y-3",
|
|
128
|
-
children: [/* @__PURE__ */ p("h2", {
|
|
129
|
-
className: "text-lg font-semibold",
|
|
130
|
-
children: "Services offered"
|
|
131
|
-
}), /* @__PURE__ */ p("div", {
|
|
132
|
-
className: "grid gap-3 sm:grid-cols-2 xl:grid-cols-3",
|
|
133
|
-
children: M.map((e) => {
|
|
134
|
-
let t = e.id === R.id;
|
|
135
|
-
return /* @__PURE__ */ m("button", {
|
|
136
|
-
type: "button",
|
|
137
|
-
onClick: () => P(e.id),
|
|
138
|
-
"aria-pressed": t,
|
|
139
|
-
className: `flex flex-col rounded-lg border p-4 text-left transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)] ${t ? "border-action-primary-bg bg-action-primary-bg/5" : "border-border-subtle hover:bg-bg-sunken/50"}`,
|
|
140
|
-
children: [
|
|
141
|
-
/* @__PURE__ */ m("div", {
|
|
142
|
-
className: "flex items-start justify-between gap-2",
|
|
143
|
-
children: [/* @__PURE__ */ p("p", {
|
|
144
|
-
className: "text-sm font-semibold",
|
|
145
|
-
children: e.title
|
|
146
|
-
}), /* @__PURE__ */ p("span", {
|
|
147
|
-
className: "whitespace-nowrap text-[11px] text-text-secondary",
|
|
148
|
-
children: e.deliveryTime
|
|
149
|
-
})]
|
|
150
|
-
}),
|
|
151
|
-
/* @__PURE__ */ m("p", {
|
|
152
|
-
className: "mt-1 text-xl font-bold tabular-nums",
|
|
153
|
-
children: [
|
|
154
|
-
"$",
|
|
155
|
-
e.price.toLocaleString(),
|
|
156
|
-
/* @__PURE__ */ m("span", {
|
|
157
|
-
className: "text-xs font-normal text-text-secondary",
|
|
158
|
-
children: ["/", e.priceType]
|
|
159
|
-
})
|
|
160
|
-
]
|
|
161
|
-
}),
|
|
162
|
-
/* @__PURE__ */ p("p", {
|
|
163
|
-
className: "mt-2 line-clamp-3 text-xs text-text-secondary",
|
|
164
|
-
children: e.description
|
|
165
|
-
})
|
|
166
|
-
]
|
|
167
|
-
}, e.id);
|
|
168
|
-
})
|
|
169
|
-
})]
|
|
170
|
-
}),
|
|
171
|
-
/* @__PURE__ */ m("div", {
|
|
172
|
-
className: "space-y-3",
|
|
173
|
-
children: [/* @__PURE__ */ p("h2", {
|
|
174
|
-
className: "text-lg font-semibold",
|
|
175
|
-
children: "Reviews"
|
|
176
|
-
}), /* @__PURE__ */ p(_, { children: /* @__PURE__ */ m(v, {
|
|
177
|
-
className: "flex flex-col items-center gap-2 p-6 text-center",
|
|
178
|
-
children: [/* @__PURE__ */ m("div", {
|
|
179
|
-
className: "flex items-center gap-2",
|
|
180
|
-
children: [
|
|
181
|
-
/* @__PURE__ */ p(u, {
|
|
182
|
-
className: "h-6 w-6 text-status-warning-text",
|
|
183
|
-
fill: "currentColor"
|
|
184
|
-
}),
|
|
185
|
-
/* @__PURE__ */ p("span", {
|
|
186
|
-
className: "text-2xl font-bold tabular-nums",
|
|
187
|
-
children: j.rating.toFixed(1)
|
|
188
|
-
}),
|
|
189
|
-
/* @__PURE__ */ p("span", {
|
|
190
|
-
className: "text-sm text-text-secondary",
|
|
191
|
-
children: "/ 5"
|
|
192
|
-
})
|
|
193
|
-
]
|
|
194
|
-
}), /* @__PURE__ */ m("p", {
|
|
195
|
-
className: "text-sm text-text-secondary",
|
|
196
|
-
children: [
|
|
197
|
-
"Based on ",
|
|
198
|
-
j.reviews.toLocaleString(),
|
|
199
|
-
" ",
|
|
200
|
-
j.reviews === 1 ? "review" : "reviews",
|
|
201
|
-
". Individual review notes aren't published for this listing yet."
|
|
202
|
-
]
|
|
203
|
-
})]
|
|
204
|
-
}) })]
|
|
205
|
-
})
|
|
206
|
-
]
|
|
207
|
-
}), /* @__PURE__ */ p("div", {
|
|
208
|
-
className: "lg:col-span-1",
|
|
209
|
-
children: /* @__PURE__ */ m(_, {
|
|
210
|
-
className: "lg:sticky lg:top-6",
|
|
211
|
-
children: [/* @__PURE__ */ p(y, { children: /* @__PURE__ */ p(b, {
|
|
212
|
-
className: "text-lg",
|
|
213
|
-
children: "Book this service"
|
|
214
|
-
}) }), /* @__PURE__ */ m(v, {
|
|
215
|
-
className: "space-y-5",
|
|
39
|
+
children: [
|
|
40
|
+
/* @__PURE__ */ h(_, {
|
|
41
|
+
variant: "ghost",
|
|
42
|
+
size: "sm",
|
|
43
|
+
onClick: () => T("../marketplace/marketplace-page"),
|
|
44
|
+
children: [/* @__PURE__ */ m(u, { className: "mr-1 h-4 w-4" }), "Marketplace"]
|
|
45
|
+
}),
|
|
46
|
+
/* @__PURE__ */ h("div", {
|
|
47
|
+
className: "flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between",
|
|
48
|
+
children: [/* @__PURE__ */ h("div", {
|
|
49
|
+
className: "min-w-0",
|
|
50
|
+
children: [/* @__PURE__ */ h("div", {
|
|
51
|
+
className: "flex flex-wrap items-center gap-2",
|
|
216
52
|
children: [
|
|
217
|
-
/* @__PURE__ */ m("
|
|
218
|
-
className: "
|
|
219
|
-
children:
|
|
220
|
-
className: "mb-1 text-sm font-medium",
|
|
221
|
-
children: "Package"
|
|
222
|
-
}), M.map((e) => {
|
|
223
|
-
let t = e.id === R.id;
|
|
224
|
-
return /* @__PURE__ */ m("button", {
|
|
225
|
-
type: "button",
|
|
226
|
-
onClick: () => P(e.id),
|
|
227
|
-
"aria-pressed": t,
|
|
228
|
-
className: `flex w-full items-center justify-between gap-3 rounded-lg border px-3 py-2.5 text-left transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)] ${t ? "border-action-primary-bg bg-action-primary-bg/5" : "border-border-subtle hover:bg-bg-sunken/50"}`,
|
|
229
|
-
children: [/* @__PURE__ */ m("span", {
|
|
230
|
-
className: "flex items-center gap-2 min-w-0",
|
|
231
|
-
children: [/* @__PURE__ */ p("span", {
|
|
232
|
-
className: `flex h-4 w-4 shrink-0 items-center justify-center rounded-full border ${t ? "border-action-primary-bg" : "border-border-strong"}`,
|
|
233
|
-
"aria-hidden": "true",
|
|
234
|
-
children: t ? /* @__PURE__ */ p("span", { className: "h-2 w-2 rounded-full bg-action-primary-bg" }) : null
|
|
235
|
-
}), /* @__PURE__ */ p("span", {
|
|
236
|
-
className: "truncate text-sm",
|
|
237
|
-
children: e.title
|
|
238
|
-
})]
|
|
239
|
-
}), /* @__PURE__ */ m("span", {
|
|
240
|
-
className: "whitespace-nowrap text-sm font-semibold tabular-nums",
|
|
241
|
-
children: ["$", e.price.toLocaleString()]
|
|
242
|
-
})]
|
|
243
|
-
}, e.id);
|
|
244
|
-
})]
|
|
245
|
-
}),
|
|
246
|
-
/* @__PURE__ */ m("div", {
|
|
247
|
-
className: "space-y-1.5",
|
|
248
|
-
children: [/* @__PURE__ */ p("label", {
|
|
249
|
-
htmlFor: "booking-date",
|
|
250
|
-
className: "text-sm font-medium",
|
|
251
|
-
children: "Date"
|
|
252
|
-
}), /* @__PURE__ */ m("div", {
|
|
253
|
-
className: "relative",
|
|
254
|
-
children: [/* @__PURE__ */ p(a, { className: "pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-text-secondary" }), /* @__PURE__ */ p(w, {
|
|
255
|
-
id: "booking-date",
|
|
256
|
-
type: "date",
|
|
257
|
-
min: F,
|
|
258
|
-
value: I,
|
|
259
|
-
onChange: (e) => L(e.target.value),
|
|
260
|
-
className: "pl-9"
|
|
261
|
-
})]
|
|
262
|
-
})]
|
|
263
|
-
}),
|
|
264
|
-
/* @__PURE__ */ m("div", {
|
|
265
|
-
className: "flex items-center justify-between border-t border-border-subtle pt-3",
|
|
266
|
-
children: [/* @__PURE__ */ p("span", {
|
|
267
|
-
className: "text-sm font-medium",
|
|
268
|
-
children: "Total price"
|
|
269
|
-
}), /* @__PURE__ */ m("span", {
|
|
270
|
-
className: "text-lg font-bold tabular-nums",
|
|
271
|
-
children: [
|
|
272
|
-
"$",
|
|
273
|
-
R.price.toLocaleString(),
|
|
274
|
-
/* @__PURE__ */ m("span", {
|
|
275
|
-
className: "text-xs font-normal text-text-secondary",
|
|
276
|
-
children: ["/", R.priceType]
|
|
277
|
-
})
|
|
278
|
-
]
|
|
279
|
-
})]
|
|
53
|
+
/* @__PURE__ */ m("h1", {
|
|
54
|
+
className: "text-2xl font-semibold",
|
|
55
|
+
children: /* @__PURE__ */ m(S, { children: B.title })
|
|
280
56
|
}),
|
|
281
|
-
/* @__PURE__ */ m(
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
disabled: !0,
|
|
286
|
-
title: "Booking is coming soon",
|
|
287
|
-
"aria-label": "Book now — coming soon",
|
|
288
|
-
children: "Book Now · Coming soon"
|
|
289
|
-
}), /* @__PURE__ */ m(g, {
|
|
290
|
-
variant: "outline",
|
|
291
|
-
className: "w-full",
|
|
292
|
-
onClick: () => o("../marketplace/messaging-page"),
|
|
293
|
-
children: [/* @__PURE__ */ p(c, { className: "mr-1 h-4 w-4" }), "Message"]
|
|
294
|
-
})]
|
|
57
|
+
/* @__PURE__ */ m(g, {
|
|
58
|
+
variant: B.status === "active" ? "default" : "secondary",
|
|
59
|
+
className: "text-[10px]",
|
|
60
|
+
children: B.status === "active" ? "Bookable" : "Paused"
|
|
295
61
|
}),
|
|
296
|
-
/* @__PURE__ */ m(
|
|
297
|
-
|
|
298
|
-
|
|
62
|
+
B.category && /* @__PURE__ */ m(g, {
|
|
63
|
+
variant: "outline",
|
|
64
|
+
className: "text-[10px]",
|
|
65
|
+
children: B.category
|
|
299
66
|
})
|
|
300
67
|
]
|
|
68
|
+
}), /* @__PURE__ */ h("div", {
|
|
69
|
+
className: "mt-2 flex items-center gap-2 text-sm text-text-secondary",
|
|
70
|
+
children: [
|
|
71
|
+
/* @__PURE__ */ m(n, {
|
|
72
|
+
people: [{ name: B.providerName }],
|
|
73
|
+
size: 28
|
|
74
|
+
}),
|
|
75
|
+
B.providerName,
|
|
76
|
+
V && " (you)",
|
|
77
|
+
" · listed ",
|
|
78
|
+
r(B.createdAt)
|
|
79
|
+
]
|
|
301
80
|
})]
|
|
302
|
-
})
|
|
303
|
-
|
|
304
|
-
|
|
81
|
+
}), /* @__PURE__ */ h("div", {
|
|
82
|
+
className: "flex flex-wrap gap-2",
|
|
83
|
+
children: [V && /* @__PURE__ */ h(_, {
|
|
84
|
+
size: "sm",
|
|
85
|
+
variant: "outline",
|
|
86
|
+
onClick: () => I(!0),
|
|
87
|
+
children: [/* @__PURE__ */ m(d, { className: "mr-1 h-4 w-4" }), "Edit"]
|
|
88
|
+
}), /* @__PURE__ */ m(_, {
|
|
89
|
+
size: "sm",
|
|
90
|
+
disabled: B.status !== "active",
|
|
91
|
+
title: B.status === "active" ? void 0 : "The provider has paused this service",
|
|
92
|
+
onClick: () => {
|
|
93
|
+
R(null), P(B);
|
|
94
|
+
},
|
|
95
|
+
children: "Book this service"
|
|
96
|
+
})]
|
|
97
|
+
})]
|
|
98
|
+
}),
|
|
99
|
+
/* @__PURE__ */ m(i, { message: M }),
|
|
100
|
+
L && /* @__PURE__ */ m("div", {
|
|
101
|
+
role: "status",
|
|
102
|
+
className: "rounded-[var(--radius-card)] border border-border-default bg-status-info-bg p-3 text-sm text-status-info-text",
|
|
103
|
+
children: L
|
|
104
|
+
}),
|
|
105
|
+
/* @__PURE__ */ h("div", {
|
|
106
|
+
className: "grid gap-4 sm:grid-cols-3",
|
|
107
|
+
children: [
|
|
108
|
+
/* @__PURE__ */ m(t, {
|
|
109
|
+
label: "Rate",
|
|
110
|
+
value: o(B)
|
|
111
|
+
}),
|
|
112
|
+
/* @__PURE__ */ m(t, {
|
|
113
|
+
label: "Open Bookings",
|
|
114
|
+
value: W
|
|
115
|
+
}),
|
|
116
|
+
/* @__PURE__ */ m(t, {
|
|
117
|
+
label: "Completed Bookings",
|
|
118
|
+
value: U
|
|
119
|
+
})
|
|
120
|
+
]
|
|
121
|
+
}),
|
|
122
|
+
/* @__PURE__ */ h(v, { children: [/* @__PURE__ */ m(b, { children: /* @__PURE__ */ m(x, {
|
|
123
|
+
className: "text-base",
|
|
124
|
+
children: "What’s included"
|
|
125
|
+
}) }), /* @__PURE__ */ m(y, { children: /* @__PURE__ */ m("p", {
|
|
126
|
+
className: "whitespace-pre-line text-sm text-text-secondary",
|
|
127
|
+
children: B.description
|
|
128
|
+
}) })] }),
|
|
129
|
+
/* @__PURE__ */ m(s, {
|
|
130
|
+
listing: N,
|
|
131
|
+
onOpenChange: (e) => {
|
|
132
|
+
e || P(null);
|
|
133
|
+
},
|
|
134
|
+
onBooked: () => R("Booking requested. Track it under Bookings; the provider confirms it there.")
|
|
135
|
+
}),
|
|
136
|
+
/* @__PURE__ */ m(c, {
|
|
137
|
+
open: F,
|
|
138
|
+
onOpenChange: I,
|
|
139
|
+
listing: B
|
|
140
|
+
})
|
|
141
|
+
]
|
|
305
142
|
});
|
|
306
143
|
}
|
|
307
144
|
//#endregion
|
|
308
|
-
export {
|
|
145
|
+
export { T as MarketplaceServiceDetailsPagePage };
|
|
309
146
|
|
|
310
147
|
//# sourceMappingURL=MarketplaceServiceDetailsPagePage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MarketplaceServiceDetailsPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/MarketplaceServiceDetailsPagePage.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n EmphasisPanel,\n GradientText,\n IllustratedEmptyState,\n Input,\n PagePurpose,\n Spinner,\n} from '@burdenoff/fe-libs/ui';\nimport { CalendarDays, CheckCircle2, Clock3, MessageSquare, PauseCircle, Star } from 'lucide-react';\nimport { useLocation, useNavigate } from 'react-router';\nimport { useCrewFoundryStore, type MarketplaceService } from '../store/crewfoundryStore';\nimport { RatingStars, getInitials } from '../components/viz';\n\n/** Honest availability derived from the real service `status` enum (never \"Booked\"). */\nfunction availabilityOf(status: MarketplaceService['status']): {\n label: string;\n icon: typeof CheckCircle2;\n className: string;\n} {\n switch (status) {\n case 'active':\n return {\n label: 'Available for new projects',\n icon: CheckCircle2,\n className: 'text-status-success-text',\n };\n case 'pending':\n return { label: 'Pending review', icon: Clock3, className: 'text-status-warning-text' };\n default:\n return {\n label: 'Not currently available',\n icon: PauseCircle,\n className: 'text-text-secondary',\n };\n }\n}\n\nexport function MarketplaceServiceDetailsPagePage() {\n const navigate = useNavigate();\n const location = useLocation();\n const { marketplaceServices, initialized } = useCrewFoundryStore();\n const selectedId = new URLSearchParams(location.search).get('id');\n const svc = marketplaceServices.find((s) => s.id === selectedId) ?? marketplaceServices[0];\n\n // Real \"packages\": every service this same provider actually offers. The\n // backend exposes a single price per service (no synthetic tiers), so each\n // package is a genuine listing — the viewed service is pre-selected.\n const providerPackages = useMemo(\n () =>\n svc\n ? marketplaceServices.filter((s) => s.provider === svc.provider)\n : ([] as MarketplaceService[]),\n [marketplaceServices, svc]\n );\n\n const [selectedPackageId, setSelectedPackageId] = useState<string | null>(null);\n const today = new Date().toISOString().slice(0, 10);\n const [bookingDate, setBookingDate] = useState(today);\n\n if (!initialized && !svc) {\n return (\n <div className=\"flex min-h-[60vh] items-center justify-center p-6\">\n <Spinner size=\"lg\" />\n </div>\n );\n }\n\n if (!svc) {\n return (\n <div className=\"p-6\">\n <IllustratedEmptyState\n illustration=\"empty-search\"\n title=\"Service not found\"\n description=\"This service is no longer available.\"\n />\n </div>\n );\n }\n\n const selectedPackage = providerPackages.find((p) => p.id === selectedPackageId) ?? svc;\n const availability = availabilityOf(svc.status);\n const AvailabilityIcon = availability.icon;\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"text-xs text-text-secondary\">\n <button\n type=\"button\"\n className=\"hover:text-text-primary\"\n onClick={() => navigate('../marketplace/marketplace-page')}\n >\n Marketplace\n </button>\n <span className=\"mx-1\">/</span>\n <span className=\"text-text-primary\">{svc.title}</span>\n </div>\n\n <div className=\"grid gap-6 lg:grid-cols-3\">\n {/* ── Left: provider + service detail ─────────────────────────── */}\n <div className=\"space-y-6 lg:col-span-2\">\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-start\">\n <span\n className=\"flex h-20 w-20 shrink-0 items-center justify-center rounded-full bg-action-primary-bg text-2xl font-semibold text-action-primary-text\"\n aria-hidden=\"true\"\n >\n {getInitials(svc.provider)}\n </span>\n <div className=\"min-w-0 flex-1 space-y-2\">\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>{svc.provider}</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">{svc.title}</p>\n <div className=\"flex flex-wrap items-center gap-3\">\n <RatingStars value={svc.rating} count={svc.reviews} showValue size={16} />\n <span className=\"flex items-center gap-1 text-xs text-text-secondary\">\n <Clock3 className=\"h-3 w-3\" />\n {svc.deliveryTime}\n </span>\n <Badge variant=\"outline\" className=\"text-[10px]\">\n {svc.category}\n </Badge>\n </div>\n <div className=\"flex flex-wrap gap-1.5 pt-1\">\n {svc.skills.map((skill) => (\n <Badge key={skill} variant=\"secondary\" className=\"text-xs\">\n {skill}\n </Badge>\n ))}\n </div>\n </div>\n </div>\n\n <PagePurpose>\n See exactly what this service includes, what it costs, and how others rated it — use the\n booking panel to pick a package and request an engagement.\n </PagePurpose>\n\n <EmphasisPanel>\n <div className=\"mb-2 text-lg font-semibold\">About this service</div>\n <p className=\"text-sm text-text-secondary\">{svc.description}</p>\n </EmphasisPanel>\n\n {/* Services offered — real listings from this provider */}\n <div className=\"space-y-3\">\n <h2 className=\"text-lg font-semibold\">Services offered</h2>\n <div className=\"grid gap-3 sm:grid-cols-2 xl:grid-cols-3\">\n {providerPackages.map((pkg) => {\n const active = pkg.id === selectedPackage.id;\n return (\n <button\n key={pkg.id}\n type=\"button\"\n onClick={() => setSelectedPackageId(pkg.id)}\n aria-pressed={active}\n className={`flex flex-col rounded-lg border p-4 text-left transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)] ${\n active\n ? 'border-action-primary-bg bg-action-primary-bg/5'\n : 'border-border-subtle hover:bg-bg-sunken/50'\n }`}\n >\n <div className=\"flex items-start justify-between gap-2\">\n <p className=\"text-sm font-semibold\">{pkg.title}</p>\n <span className=\"whitespace-nowrap text-[11px] text-text-secondary\">\n {pkg.deliveryTime}\n </span>\n </div>\n <p className=\"mt-1 text-xl font-bold tabular-nums\">\n ${pkg.price.toLocaleString()}\n <span className=\"text-xs font-normal text-text-secondary\">\n /{pkg.priceType}\n </span>\n </p>\n <p className=\"mt-2 line-clamp-3 text-xs text-text-secondary\">\n {pkg.description}\n </p>\n </button>\n );\n })}\n </div>\n </div>\n\n {/* Reviews — backend stores only an aggregate rating + count, not\n individual review bodies, so we report that honestly rather than\n inventing reviewer cards. */}\n <div className=\"space-y-3\">\n <h2 className=\"text-lg font-semibold\">Reviews</h2>\n <Card>\n <CardContent className=\"flex flex-col items-center gap-2 p-6 text-center\">\n <div className=\"flex items-center gap-2\">\n <Star className=\"h-6 w-6 text-status-warning-text\" fill=\"currentColor\" />\n <span className=\"text-2xl font-bold tabular-nums\">{svc.rating.toFixed(1)}</span>\n <span className=\"text-sm text-text-secondary\">/ 5</span>\n </div>\n <p className=\"text-sm text-text-secondary\">\n Based on {svc.reviews.toLocaleString()} {svc.reviews === 1 ? 'review' : 'reviews'}\n . Individual review notes aren't published for this listing yet.\n </p>\n </CardContent>\n </Card>\n </div>\n </div>\n\n {/* ── Right: sticky booking panel ─────────────────────────────── */}\n <div className=\"lg:col-span-1\">\n <Card className=\"lg:sticky lg:top-6\">\n <CardHeader>\n <CardTitle className=\"text-lg\">Book this service</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-5\">\n <fieldset className=\"space-y-2\">\n <legend className=\"mb-1 text-sm font-medium\">Package</legend>\n {providerPackages.map((pkg) => {\n const active = pkg.id === selectedPackage.id;\n return (\n <button\n key={pkg.id}\n type=\"button\"\n onClick={() => setSelectedPackageId(pkg.id)}\n aria-pressed={active}\n className={`flex w-full items-center justify-between gap-3 rounded-lg border px-3 py-2.5 text-left transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)] ${\n active\n ? 'border-action-primary-bg bg-action-primary-bg/5'\n : 'border-border-subtle hover:bg-bg-sunken/50'\n }`}\n >\n <span className=\"flex items-center gap-2 min-w-0\">\n <span\n className={`flex h-4 w-4 shrink-0 items-center justify-center rounded-full border ${\n active ? 'border-action-primary-bg' : 'border-border-strong'\n }`}\n aria-hidden=\"true\"\n >\n {active ? (\n <span className=\"h-2 w-2 rounded-full bg-action-primary-bg\" />\n ) : null}\n </span>\n <span className=\"truncate text-sm\">{pkg.title}</span>\n </span>\n <span className=\"whitespace-nowrap text-sm font-semibold tabular-nums\">\n ${pkg.price.toLocaleString()}\n </span>\n </button>\n );\n })}\n </fieldset>\n\n <div className=\"space-y-1.5\">\n <label htmlFor=\"booking-date\" className=\"text-sm font-medium\">\n Date\n </label>\n <div className=\"relative\">\n <CalendarDays className=\"pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-text-secondary\" />\n <Input\n id=\"booking-date\"\n type=\"date\"\n min={today}\n value={bookingDate}\n onChange={(event) => setBookingDate(event.target.value)}\n className=\"pl-9\"\n />\n </div>\n </div>\n\n <div className=\"flex items-center justify-between border-t border-border-subtle pt-3\">\n <span className=\"text-sm font-medium\">Total price</span>\n <span className=\"text-lg font-bold tabular-nums\">\n ${selectedPackage.price.toLocaleString()}\n <span className=\"text-xs font-normal text-text-secondary\">\n /{selectedPackage.priceType}\n </span>\n </span>\n </div>\n\n <div className=\"space-y-2\">\n {/* No createCrewBooking mutation exists in the backend yet, so\n Book Now stays an honest disabled control — the panel is\n fully interactive but does not fake a booking. */}\n <Button\n className=\"w-full\"\n disabled\n title=\"Booking is coming soon\"\n aria-label=\"Book now — coming soon\"\n >\n Book Now · Coming soon\n </Button>\n <Button\n variant=\"outline\"\n className=\"w-full\"\n onClick={() => navigate('../marketplace/messaging-page')}\n >\n <MessageSquare className=\"mr-1 h-4 w-4\" />\n Message\n </Button>\n </div>\n\n <p\n className={`flex items-center justify-center gap-1.5 text-xs ${availability.className}`}\n >\n <AvailabilityIcon className=\"h-3.5 w-3.5\" />\n {availability.label}\n </p>\n </CardContent>\n </Card>\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"MarketplaceServiceDetailsPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/MarketplaceServiceDetailsPagePage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n GradientText,\n IllustratedEmptyState,\n Spinner,\n} from '@burdenoff/fe-libs/ui';\nimport { ArrowLeft, Pencil } from 'lucide-react';\nimport { useNavigate, useSearchParams } from 'react-router';\nimport { InlineError } from '../components/InlineError';\nimport { BookServiceModal } from '../components/marketplace/BookServiceModal';\nimport { ServiceListingModal } from '../components/marketplace/ServiceListingModal';\nimport { AvatarStack, StatCard } from '../components/viz';\nimport { useCrewFoundryStore, type CrewServiceListing } from '../store/crewfoundryStore';\nimport { formatRate } from '../lib/marketplace';\nimport { useEnsureLoaded } from '../lib/useEnsureLoaded';\nimport { formatDate } from '../utils/dateUtils';\n\nexport function MarketplaceServiceDetailsPagePage() {\n const navigate = useNavigate();\n const [searchParams] = useSearchParams();\n const { serviceListings, bookings, marketplaceLoaded, fetchMarketplace, initParams } =\n useCrewFoundryStore();\n const loadError = useEnsureLoaded(marketplaceLoaded, fetchMarketplace);\n const [bookTarget, setBookTarget] = useState<CrewServiceListing | null>(null);\n const [editOpen, setEditOpen] = useState(false);\n const [notice, setNotice] = useState<string | null>(null);\n\n const listingId = searchParams.get('id');\n const listing = serviceListings.find((item) => item.id === listingId);\n\n if (!marketplaceLoaded && !loadError) {\n return (\n <div className=\"flex min-h-[60vh] items-center justify-center p-6\">\n <Spinner size=\"lg\" />\n </div>\n );\n }\n\n if (!listing) {\n return (\n <div className=\"space-y-4 p-6\">\n <InlineError message={loadError} />\n <IllustratedEmptyState\n illustration=\"empty-search\"\n title=\"Service not found\"\n description=\"This service was removed or the link is incomplete.\"\n action={\n <Button size=\"sm\" onClick={() => navigate('../marketplace/marketplace-page')}>\n Back to the marketplace\n </Button>\n }\n />\n </div>\n );\n }\n\n const own = listing.providerActorId === initParams.actorId;\n const listingBookings = bookings.filter((booking) => booking.listingId === listing.id);\n const completed = listingBookings.filter((booking) => booking.status === 'completed').length;\n const open = listingBookings.filter(\n (booking) => booking.status === 'requested' || booking.status === 'confirmed'\n ).length;\n\n return (\n <div className=\"space-y-6 p-6\">\n <Button variant=\"ghost\" size=\"sm\" onClick={() => navigate('../marketplace/marketplace-page')}>\n <ArrowLeft className=\"mr-1 h-4 w-4\" />\n Marketplace\n </Button>\n\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between\">\n <div className=\"min-w-0\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>{listing.title}</GradientText>\n </h1>\n <Badge\n variant={listing.status === 'active' ? 'default' : 'secondary'}\n className=\"text-[10px]\"\n >\n {listing.status === 'active' ? 'Bookable' : 'Paused'}\n </Badge>\n {listing.category && (\n <Badge variant=\"outline\" className=\"text-[10px]\">\n {listing.category}\n </Badge>\n )}\n </div>\n <div className=\"mt-2 flex items-center gap-2 text-sm text-text-secondary\">\n <AvatarStack people={[{ name: listing.providerName }]} size={28} />\n {listing.providerName}\n {own && ' (you)'} · listed {formatDate(listing.createdAt)}\n </div>\n </div>\n <div className=\"flex flex-wrap gap-2\">\n {own && (\n <Button size=\"sm\" variant=\"outline\" onClick={() => setEditOpen(true)}>\n <Pencil className=\"mr-1 h-4 w-4\" />\n Edit\n </Button>\n )}\n <Button\n size=\"sm\"\n disabled={listing.status !== 'active'}\n title={listing.status !== 'active' ? 'The provider has paused this service' : undefined}\n onClick={() => {\n setNotice(null);\n setBookTarget(listing);\n }}\n >\n Book this service\n </Button>\n </div>\n </div>\n\n <InlineError message={loadError} />\n {notice && (\n <div\n role=\"status\"\n className=\"rounded-[var(--radius-card)] border border-border-default bg-status-info-bg p-3 text-sm text-status-info-text\"\n >\n {notice}\n </div>\n )}\n\n <div className=\"grid gap-4 sm:grid-cols-3\">\n <StatCard label=\"Rate\" value={formatRate(listing)} />\n <StatCard label=\"Open Bookings\" value={open} />\n <StatCard label=\"Completed Bookings\" value={completed} />\n </div>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"text-base\">What’s included</CardTitle>\n </CardHeader>\n <CardContent>\n <p className=\"whitespace-pre-line text-sm text-text-secondary\">{listing.description}</p>\n </CardContent>\n </Card>\n\n <BookServiceModal\n listing={bookTarget}\n onOpenChange={(next) => {\n if (!next) setBookTarget(null);\n }}\n onBooked={() =>\n setNotice('Booking requested. Track it under Bookings; the provider confirms it there.')\n }\n />\n <ServiceListingModal open={editOpen} onOpenChange={setEditOpen} listing={listing} />\n </div>\n );\n}\n"],"mappings":"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"}
|