@burdenoff/microfe-crewfoundry 2026.1013.2 → 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/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/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/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 +138 -78
- 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 +5 -0
- package/dist/crewfoundry/utils/dateUtils.d.ts.map +1 -1
- package/dist/crewfoundry/utils/dateUtils.js +10 -1
- package/dist/crewfoundry/utils/dateUtils.js.map +1 -1
- 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,254 +1,195 @@
|
|
|
1
1
|
import { useCrewFoundryStore as e } from "../store/crewfoundryStore.js";
|
|
2
|
-
import {
|
|
3
|
-
import
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
2
|
+
import { StatCard as t } from "../components/viz/StatCard.js";
|
|
3
|
+
import "../components/viz/index.js";
|
|
4
|
+
import { InlineError as n } from "../components/InlineError.js";
|
|
5
|
+
import { useEnsureLoaded as r } from "../lib/useEnsureLoaded.js";
|
|
6
|
+
import { MarketplaceTabs as i } from "../components/marketplace/MarketplaceTabs.js";
|
|
7
|
+
import { formatRate as a } from "../lib/marketplace.js";
|
|
8
|
+
import { ServiceListingModal as o } from "../components/marketplace/ServiceListingModal.js";
|
|
9
|
+
import { useState as s } from "react";
|
|
10
|
+
import { Pause as c, Pencil as l, Play as u, Plus as d, Trash2 as f } from "lucide-react";
|
|
11
|
+
import { useNavigate as p } from "react-router";
|
|
12
|
+
import { jsx as m, jsxs as h } from "react/jsx-runtime";
|
|
13
|
+
import { AlertDialog as g, AlertDialogAction as _, AlertDialogCancel as v, AlertDialogContent as y, AlertDialogDescription as b, AlertDialogFooter as x, AlertDialogHeader as S, AlertDialogTitle as C, Badge as w, Button as T, Card as E, CardContent as D, GradientText as O, IllustratedEmptyState as k, PagePurpose as A, ResponsiveTable as j, Spinner as M } from "@burdenoff/fe-libs/ui";
|
|
9
14
|
//#region src/crewfoundry/pages/MarketplaceMyServicesPagePage.tsx
|
|
10
|
-
|
|
11
|
-
{
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
label: "Provider",
|
|
21
|
-
type: "text",
|
|
22
|
-
required: !0
|
|
23
|
-
},
|
|
24
|
-
{
|
|
25
|
-
name: "category",
|
|
26
|
-
label: "Category",
|
|
27
|
-
type: "text",
|
|
28
|
-
required: !0
|
|
29
|
-
},
|
|
30
|
-
{
|
|
31
|
-
name: "price",
|
|
32
|
-
label: "Price",
|
|
33
|
-
type: "number",
|
|
34
|
-
required: !0
|
|
35
|
-
},
|
|
36
|
-
{
|
|
37
|
-
name: "priceType",
|
|
38
|
-
label: "Price type",
|
|
39
|
-
type: "select",
|
|
40
|
-
required: !0,
|
|
41
|
-
options: [
|
|
42
|
-
{
|
|
43
|
-
label: "Hourly",
|
|
44
|
-
value: "hourly"
|
|
45
|
-
},
|
|
46
|
-
{
|
|
47
|
-
label: "Fixed",
|
|
48
|
-
value: "fixed"
|
|
49
|
-
},
|
|
50
|
-
{
|
|
51
|
-
label: "Monthly",
|
|
52
|
-
value: "monthly"
|
|
53
|
-
}
|
|
54
|
-
]
|
|
55
|
-
},
|
|
56
|
-
{
|
|
57
|
-
name: "deliveryTime",
|
|
58
|
-
label: "Delivery time",
|
|
59
|
-
type: "text",
|
|
60
|
-
required: !0,
|
|
61
|
-
placeholder: "e.g. 3 days"
|
|
62
|
-
},
|
|
63
|
-
{
|
|
64
|
-
name: "status",
|
|
65
|
-
label: "Status",
|
|
66
|
-
type: "select",
|
|
67
|
-
options: [
|
|
68
|
-
{
|
|
69
|
-
label: "Active",
|
|
70
|
-
value: "active"
|
|
71
|
-
},
|
|
72
|
-
{
|
|
73
|
-
label: "Paused",
|
|
74
|
-
value: "paused"
|
|
75
|
-
},
|
|
76
|
-
{
|
|
77
|
-
label: "Pending",
|
|
78
|
-
value: "pending"
|
|
79
|
-
}
|
|
80
|
-
]
|
|
81
|
-
},
|
|
82
|
-
{
|
|
83
|
-
name: "description",
|
|
84
|
-
label: "Description",
|
|
85
|
-
type: "textarea",
|
|
86
|
-
required: !0,
|
|
87
|
-
colSpan: 2
|
|
88
|
-
},
|
|
89
|
-
{
|
|
90
|
-
name: "skills",
|
|
91
|
-
label: "Skills",
|
|
92
|
-
type: "tags",
|
|
93
|
-
colSpan: 2
|
|
94
|
-
}
|
|
95
|
-
], N = (e) => ({
|
|
96
|
-
title: e.title,
|
|
97
|
-
provider: e.provider,
|
|
98
|
-
category: e.category,
|
|
99
|
-
price: e.price,
|
|
100
|
-
priceType: e.priceType,
|
|
101
|
-
deliveryTime: e.deliveryTime,
|
|
102
|
-
status: e.status,
|
|
103
|
-
description: e.description,
|
|
104
|
-
skills: e.skills
|
|
105
|
-
}), P = (e, t) => ({
|
|
106
|
-
id: t?.id ?? crypto.randomUUID(),
|
|
107
|
-
title: String(e.title ?? ""),
|
|
108
|
-
provider: String(e.provider ?? ""),
|
|
109
|
-
category: String(e.category ?? ""),
|
|
110
|
-
price: typeof e.price == "number" ? e.price : Number(e.price) || 0,
|
|
111
|
-
priceType: e.priceType || "hourly",
|
|
112
|
-
rating: t?.rating ?? 0,
|
|
113
|
-
reviews: t?.reviews ?? 0,
|
|
114
|
-
description: String(e.description ?? ""),
|
|
115
|
-
deliveryTime: String(e.deliveryTime ?? ""),
|
|
116
|
-
status: e.status || "active",
|
|
117
|
-
skills: Array.isArray(e.skills) ? e.skills : []
|
|
118
|
-
});
|
|
119
|
-
function F() {
|
|
120
|
-
let F = l(), { marketplaceServices: I, addMarketplaceService: L, updateMarketplaceService: R, removeMarketplaceService: z } = e(), B = r(), { page: V, pageSize: H, offset: U, setPage: W } = j({ initialPageSize: 9 }), G = I.slice(U, U + H);
|
|
121
|
-
return /* @__PURE__ */ d("div", {
|
|
15
|
+
function N() {
|
|
16
|
+
let N = p(), { serviceListings: P, bookings: F, marketplaceLoaded: I, fetchMarketplace: L, updateServiceListing: R, removeServiceListing: z, initParams: B } = e(), V = r(I, L), [H, U] = s(null), [W, G] = s(null), [K, q] = s(!1), [J, Y] = s(null), X = P.filter((e) => e.providerActorId === B.actorId), Z = F.filter((e) => e.providerActorId === B.actorId), Q = Z.filter((e) => e.status === "requested").length, $ = async (e) => {
|
|
17
|
+
U(null);
|
|
18
|
+
try {
|
|
19
|
+
await e();
|
|
20
|
+
} catch (e) {
|
|
21
|
+
U(e instanceof Error ? e.message : "Something went wrong");
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
return /* @__PURE__ */ h("div", {
|
|
122
25
|
className: "space-y-6 p-6",
|
|
123
26
|
children: [
|
|
124
|
-
/* @__PURE__ */
|
|
125
|
-
className: "flex items-center justify-between",
|
|
126
|
-
children: [/* @__PURE__ */
|
|
127
|
-
/* @__PURE__ */
|
|
27
|
+
/* @__PURE__ */ h("div", {
|
|
28
|
+
className: "flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between",
|
|
29
|
+
children: [/* @__PURE__ */ h("div", { children: [
|
|
30
|
+
/* @__PURE__ */ m("h1", {
|
|
128
31
|
className: "text-2xl font-semibold",
|
|
129
|
-
children: /* @__PURE__ */
|
|
32
|
+
children: /* @__PURE__ */ m(O, { children: "My Services" })
|
|
130
33
|
}),
|
|
131
|
-
/* @__PURE__ */
|
|
34
|
+
/* @__PURE__ */ h("p", {
|
|
132
35
|
className: "text-sm text-text-secondary",
|
|
133
|
-
children:
|
|
36
|
+
children: [
|
|
37
|
+
X.length,
|
|
38
|
+
" services you offer · ",
|
|
39
|
+
Q,
|
|
40
|
+
" booking requests waiting"
|
|
41
|
+
]
|
|
134
42
|
}),
|
|
135
|
-
/* @__PURE__ */
|
|
43
|
+
/* @__PURE__ */ m(A, {
|
|
136
44
|
className: "mt-1",
|
|
137
|
-
children: "Manage the services you offer
|
|
45
|
+
children: "Manage the services you offer on the marketplace — set your rate, pause a service when you are fully booked, and respond to booking requests."
|
|
138
46
|
})
|
|
139
|
-
] }), /* @__PURE__ */
|
|
47
|
+
] }), /* @__PURE__ */ h(T, {
|
|
140
48
|
size: "sm",
|
|
141
|
-
onClick: () =>
|
|
142
|
-
children: [/* @__PURE__ */
|
|
49
|
+
onClick: () => q(!0),
|
|
50
|
+
children: [/* @__PURE__ */ m(d, { className: "mr-1 h-4 w-4" }), "Publish a service"]
|
|
143
51
|
})]
|
|
144
52
|
}),
|
|
145
|
-
/* @__PURE__ */
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
53
|
+
/* @__PURE__ */ m(i, { value: "my-services" }),
|
|
54
|
+
/* @__PURE__ */ m(n, { message: V ?? H }),
|
|
55
|
+
/* @__PURE__ */ h("div", {
|
|
56
|
+
className: "grid gap-4 sm:grid-cols-3",
|
|
57
|
+
children: [
|
|
58
|
+
/* @__PURE__ */ m(t, {
|
|
59
|
+
label: "Services",
|
|
60
|
+
value: X.length
|
|
61
|
+
}),
|
|
62
|
+
/* @__PURE__ */ m(t, {
|
|
63
|
+
label: "Bookable",
|
|
64
|
+
value: X.filter((e) => e.status === "active").length
|
|
65
|
+
}),
|
|
66
|
+
/* @__PURE__ */ m(t, {
|
|
67
|
+
label: "Requests Waiting",
|
|
68
|
+
value: Q
|
|
153
69
|
})
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
70
|
+
]
|
|
71
|
+
}),
|
|
72
|
+
!I && !V ? /* @__PURE__ */ m("div", {
|
|
73
|
+
className: "flex min-h-[240px] items-center justify-center",
|
|
74
|
+
children: /* @__PURE__ */ m(M, { size: "lg" })
|
|
75
|
+
}) : X.length === 0 ? /* @__PURE__ */ m(k, {
|
|
76
|
+
illustration: "empty-data",
|
|
77
|
+
title: "You haven't published a service",
|
|
78
|
+
description: "Publish what you can help with and at what rate; colleagues can then book you.",
|
|
79
|
+
action: /* @__PURE__ */ h(T, {
|
|
80
|
+
size: "sm",
|
|
81
|
+
onClick: () => q(!0),
|
|
82
|
+
children: [/* @__PURE__ */ m(d, { className: "mr-1 h-4 w-4" }), "Publish a service"]
|
|
83
|
+
})
|
|
84
|
+
}) : /* @__PURE__ */ m(E, { children: /* @__PURE__ */ m(D, {
|
|
85
|
+
className: "pt-6",
|
|
86
|
+
children: /* @__PURE__ */ m(j, {
|
|
87
|
+
data: X,
|
|
88
|
+
rowKey: (e) => e.id,
|
|
89
|
+
columns: [
|
|
90
|
+
{
|
|
91
|
+
key: "title",
|
|
92
|
+
header: "Service",
|
|
93
|
+
priority: "primary",
|
|
94
|
+
cell: (e) => /* @__PURE__ */ m("button", {
|
|
95
|
+
type: "button",
|
|
96
|
+
className: "text-left font-medium hover:underline",
|
|
97
|
+
onClick: () => N(`../marketplace/service-details-page?id=${encodeURIComponent(e.id)}`),
|
|
98
|
+
children: e.title
|
|
99
|
+
})
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
key: "rate",
|
|
103
|
+
header: "Rate",
|
|
104
|
+
cell: (e) => /* @__PURE__ */ m("span", {
|
|
105
|
+
className: "tabular-nums",
|
|
106
|
+
children: a(e)
|
|
107
|
+
})
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
key: "bookings",
|
|
111
|
+
header: "Bookings",
|
|
112
|
+
cell: (e) => /* @__PURE__ */ m("span", {
|
|
113
|
+
className: "tabular-nums",
|
|
114
|
+
children: Z.filter((t) => t.listingId === e.id).length
|
|
115
|
+
})
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
key: "status",
|
|
119
|
+
header: "Status",
|
|
120
|
+
cell: (e) => /* @__PURE__ */ m(w, {
|
|
121
|
+
variant: e.status === "active" ? "default" : "secondary",
|
|
122
|
+
className: "text-[10px]",
|
|
123
|
+
children: e.status === "active" ? "Bookable" : "Paused"
|
|
124
|
+
})
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
key: "actions",
|
|
128
|
+
header: "",
|
|
129
|
+
cellClassName: "md:text-right",
|
|
130
|
+
cell: (e) => /* @__PURE__ */ h("div", {
|
|
131
|
+
className: "flex justify-end gap-1",
|
|
184
132
|
children: [
|
|
185
|
-
/* @__PURE__ */
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
className: "flex gap-2 mt-3",
|
|
195
|
-
children: [
|
|
196
|
-
/* @__PURE__ */ d(S, {
|
|
197
|
-
variant: "outline",
|
|
198
|
-
size: "sm",
|
|
199
|
-
className: "flex-1",
|
|
200
|
-
onClick: () => B.openModal(e),
|
|
201
|
-
children: [/* @__PURE__ */ u(a, { className: "h-3.5 w-3.5 mr-1" }), "Edit"]
|
|
202
|
-
}),
|
|
203
|
-
/* @__PURE__ */ d(S, {
|
|
204
|
-
size: "sm",
|
|
205
|
-
className: "flex-1",
|
|
206
|
-
onClick: () => F(`../marketplace/service-details-page?id=${e.id}`),
|
|
207
|
-
children: [/* @__PURE__ */ u(i, { className: "h-3.5 w-3.5 mr-1" }), "View"]
|
|
208
|
-
}),
|
|
209
|
-
/* @__PURE__ */ d(f, { children: [/* @__PURE__ */ u(b, {
|
|
210
|
-
asChild: !0,
|
|
211
|
-
children: /* @__PURE__ */ u(S, {
|
|
133
|
+
/* @__PURE__ */ m(T, {
|
|
134
|
+
variant: "ghost",
|
|
135
|
+
size: "icon",
|
|
136
|
+
className: "h-8 w-8",
|
|
137
|
+
"aria-label": `${e.status === "active" ? "Pause" : "Resume"} ${e.title}`,
|
|
138
|
+
onClick: () => void $(() => R(e.id, { status: e.status === "active" ? "paused" : "active" })),
|
|
139
|
+
children: e.status === "active" ? /* @__PURE__ */ m(c, { className: "h-4 w-4" }) : /* @__PURE__ */ m(u, { className: "h-4 w-4" })
|
|
140
|
+
}),
|
|
141
|
+
/* @__PURE__ */ m(T, {
|
|
212
142
|
variant: "ghost",
|
|
213
143
|
size: "icon",
|
|
144
|
+
className: "h-8 w-8",
|
|
145
|
+
"aria-label": `Edit ${e.title}`,
|
|
146
|
+
onClick: () => G(e),
|
|
147
|
+
children: /* @__PURE__ */ m(l, { className: "h-4 w-4" })
|
|
148
|
+
}),
|
|
149
|
+
/* @__PURE__ */ m(T, {
|
|
150
|
+
variant: "ghost",
|
|
151
|
+
size: "icon",
|
|
152
|
+
className: "h-8 w-8",
|
|
214
153
|
"aria-label": `Delete ${e.title}`,
|
|
215
|
-
|
|
154
|
+
onClick: () => Y(e),
|
|
155
|
+
children: /* @__PURE__ */ m(f, { className: "h-4 w-4" })
|
|
216
156
|
})
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
157
|
+
]
|
|
158
|
+
})
|
|
159
|
+
}
|
|
160
|
+
]
|
|
161
|
+
})
|
|
162
|
+
}) }),
|
|
163
|
+
/* @__PURE__ */ m(o, {
|
|
164
|
+
open: K,
|
|
165
|
+
onOpenChange: q,
|
|
166
|
+
listing: null
|
|
167
|
+
}),
|
|
168
|
+
/* @__PURE__ */ m(o, {
|
|
169
|
+
open: W !== null,
|
|
170
|
+
onOpenChange: (e) => {
|
|
171
|
+
e || G(null);
|
|
172
|
+
},
|
|
173
|
+
listing: W
|
|
229
174
|
}),
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
submitLabel: B.context ? "Save changes" : "Create service",
|
|
244
|
-
onSubmit: async (e) => {
|
|
245
|
-
B.context ? await R(B.context.id, P(e, B.context)) : await L(P(e));
|
|
246
|
-
}
|
|
175
|
+
/* @__PURE__ */ m(g, {
|
|
176
|
+
open: J !== null,
|
|
177
|
+
onOpenChange: (e) => {
|
|
178
|
+
e || Y(null);
|
|
179
|
+
},
|
|
180
|
+
children: /* @__PURE__ */ h(y, { children: [/* @__PURE__ */ h(S, { children: [/* @__PURE__ */ m(C, { children: "Delete service?" }), /* @__PURE__ */ m(b, { children: J ? `“${J.title}” is removed from the marketplace. Existing bookings and their escrow records are kept.` : "" })] }), /* @__PURE__ */ h(x, { children: [/* @__PURE__ */ m(v, { children: "Cancel" }), /* @__PURE__ */ m(_, {
|
|
181
|
+
onClick: (e) => {
|
|
182
|
+
e.preventDefault();
|
|
183
|
+
let t = J;
|
|
184
|
+
Y(null), t && $(() => z(t.id));
|
|
185
|
+
},
|
|
186
|
+
children: "Delete"
|
|
187
|
+
})] })] })
|
|
247
188
|
})
|
|
248
189
|
]
|
|
249
190
|
});
|
|
250
191
|
}
|
|
251
192
|
//#endregion
|
|
252
|
-
export {
|
|
193
|
+
export { N as MarketplaceMyServicesPagePage };
|
|
253
194
|
|
|
254
195
|
//# sourceMappingURL=MarketplaceMyServicesPagePage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MarketplaceMyServicesPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/MarketplaceMyServicesPagePage.tsx"],"sourcesContent":["import { useNavigate } from 'react-router';\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n AlertDialogTrigger,\n Badge,\n Button,\n CardContent,\n CardHeader,\n CardTitle,\n GlassCard,\n GradientText,\n IllustratedEmptyState,\n PagePurpose,\n Pagination,\n} from '@burdenoff/fe-libs/ui';\nimport { usePagination } from '@burdenoff/fe-libs/shared/hooks';\nimport { Eye, Pencil, Plus, Star, Trash2 } from 'lucide-react';\nimport {\n FormModal,\n useFormModal,\n type FieldConfig,\n type FormValues,\n} from '../components/forms/FormModal';\nimport { useCrewFoundryStore, type MarketplaceService } from '../store/crewfoundryStore';\nimport { formatEnumLabel } from '../utils/formatEnumLabel';\n\nconst SERVICE_FIELDS: FieldConfig[] = [\n { name: 'title', label: 'Service title', type: 'text', required: true, colSpan: 2 },\n { name: 'provider', label: 'Provider', type: 'text', required: true },\n { name: 'category', label: 'Category', type: 'text', required: true },\n { name: 'price', label: 'Price', type: 'number', required: true },\n {\n name: 'priceType',\n label: 'Price type',\n type: 'select',\n required: true,\n options: [\n { label: 'Hourly', value: 'hourly' },\n { label: 'Fixed', value: 'fixed' },\n { label: 'Monthly', value: 'monthly' },\n ],\n },\n {\n name: 'deliveryTime',\n label: 'Delivery time',\n type: 'text',\n required: true,\n placeholder: 'e.g. 3 days',\n },\n {\n name: 'status',\n label: 'Status',\n type: 'select',\n options: [\n { label: 'Active', value: 'active' },\n { label: 'Paused', value: 'paused' },\n { label: 'Pending', value: 'pending' },\n ],\n },\n { name: 'description', label: 'Description', type: 'textarea', required: true, colSpan: 2 },\n { name: 'skills', label: 'Skills', type: 'tags', colSpan: 2 },\n];\n\nconst toInitialValues = (service: MarketplaceService): FormValues => ({\n title: service.title,\n provider: service.provider,\n category: service.category,\n price: service.price,\n priceType: service.priceType,\n deliveryTime: service.deliveryTime,\n status: service.status,\n description: service.description,\n skills: service.skills,\n});\n\nconst valuesToService = (values: FormValues, base?: MarketplaceService): MarketplaceService => ({\n id: base?.id ?? crypto.randomUUID(),\n title: String(values.title ?? ''),\n provider: String(values.provider ?? ''),\n category: String(values.category ?? ''),\n price: typeof values.price === 'number' ? values.price : Number(values.price) || 0,\n priceType: (values.priceType as MarketplaceService['priceType']) || 'hourly',\n rating: base?.rating ?? 0,\n reviews: base?.reviews ?? 0,\n description: String(values.description ?? ''),\n deliveryTime: String(values.deliveryTime ?? ''),\n status: (values.status as MarketplaceService['status']) || 'active',\n skills: Array.isArray(values.skills) ? values.skills : [],\n});\n\nexport function MarketplaceMyServicesPagePage() {\n const navigate = useNavigate();\n const {\n marketplaceServices,\n addMarketplaceService,\n updateMarketplaceService,\n removeMarketplaceService,\n } = useCrewFoundryStore();\n const modal = useFormModal<MarketplaceService>();\n const { page, pageSize, offset, setPage } = usePagination({ initialPageSize: 9 });\n // Every marketplace service in this workspace is managed here as an owned listing.\n const myServices = marketplaceServices.slice(offset, offset + pageSize);\n\n const handleSubmit = async (values: FormValues) => {\n if (modal.context) {\n await updateMarketplaceService(modal.context.id, valuesToService(values, modal.context));\n } else {\n await addMarketplaceService(valuesToService(values));\n }\n };\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>My Services</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">Manage your listed services</p>\n <PagePurpose className=\"mt-1\">\n Manage the services you offer to clients — list, edit, and showcase your offerings to\n win more work on the marketplace.\n </PagePurpose>\n </div>\n <Button size=\"sm\" onClick={() => modal.openModal()}>\n <Plus className=\"h-4 w-4 mr-1\" />\n Create Service\n </Button>\n </div>\n <div className=\"grid gap-4 md:grid-cols-2 lg:grid-cols-3\">\n {marketplaceServices.length === 0 ? (\n <div className=\"col-span-full\">\n <IllustratedEmptyState\n illustration=\"empty-generic\"\n title=\"No services listed\"\n description=\"List a service to start winning work on the marketplace.\"\n />\n </div>\n ) : (\n myServices.map((svc, _idx) => (\n <GlassCard key={svc.id} treatment={_idx === 0 ? 'glass' : 'plain'} glow={_idx === 0}>\n <CardHeader>\n <div className=\"flex items-center justify-between\">\n <CardTitle className=\"text-base\">{svc.title}</CardTitle>\n <Badge\n variant={svc.status === 'active' ? 'default' : 'secondary'}\n className=\"text-[10px]\"\n >\n {formatEnumLabel(svc.status)}\n </Badge>\n </div>\n </CardHeader>\n <CardContent>\n <p className=\"text-sm text-text-secondary mb-3\">{svc.description}</p>\n <div className=\"flex items-center justify-between text-sm\">\n <span className=\"font-bold\">\n ${svc.price}/{svc.priceType}\n </span>\n <span className=\"flex items-center gap-1\">\n <Star className=\"h-3 w-3 text-status-warning-text\" />\n {svc.rating} ({svc.reviews})\n </span>\n </div>\n <div className=\"flex gap-2 mt-3\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"flex-1\"\n onClick={() => modal.openModal(svc)}\n >\n <Pencil className=\"h-3.5 w-3.5 mr-1\" />\n Edit\n </Button>\n <Button\n size=\"sm\"\n className=\"flex-1\"\n onClick={() => navigate(`../marketplace/service-details-page?id=${svc.id}`)}\n >\n <Eye className=\"h-3.5 w-3.5 mr-1\" />\n View\n </Button>\n <AlertDialog>\n <AlertDialogTrigger asChild>\n <Button variant=\"ghost\" size=\"icon\" aria-label={`Delete ${svc.title}`}>\n <Trash2 className=\"h-4 w-4 text-status-error-text\" />\n </Button>\n </AlertDialogTrigger>\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>Delete service?</AlertDialogTitle>\n <AlertDialogDescription>\n This removes “{svc.title}” from your marketplace listings. This action\n cannot be undone.\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel>Cancel</AlertDialogCancel>\n <AlertDialogAction onClick={() => void removeMarketplaceService(svc.id)}>\n Delete\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </div>\n </CardContent>\n </GlassCard>\n ))\n )}\n </div>\n {marketplaceServices.length > 0 ? (\n <Pagination\n page={page}\n pageSize={pageSize}\n totalItems={marketplaceServices.length}\n onPageChange={setPage}\n />\n ) : null}\n\n <FormModal\n open={modal.open}\n onOpenChange={modal.onOpenChange}\n title={modal.context ? 'Edit service' : 'Create service'}\n description=\"Describe the service you offer clients on the marketplace.\"\n fields={SERVICE_FIELDS}\n initialValues={modal.context ? toInitialValues(modal.context) : undefined}\n submitLabel={modal.context ? 'Save changes' : 'Create service'}\n onSubmit={handleSubmit}\n />\n </div>\n );\n}\n"],"mappings":";;;;;;;;;AAiCA,IAAM,IAAgC;CACpC;EAAE,MAAM;EAAS,OAAO;EAAiB,MAAM;EAAQ,UAAU;EAAM,SAAS;EAAG;CACnF;EAAE,MAAM;EAAY,OAAO;EAAY,MAAM;EAAQ,UAAU;EAAM;CACrE;EAAE,MAAM;EAAY,OAAO;EAAY,MAAM;EAAQ,UAAU;EAAM;CACrE;EAAE,MAAM;EAAS,OAAO;EAAS,MAAM;EAAU,UAAU;EAAM;CACjE;EACE,MAAM;EACN,OAAO;EACP,MAAM;EACN,UAAU;EACV,SAAS;GACP;IAAE,OAAO;IAAU,OAAO;IAAU;GACpC;IAAE,OAAO;IAAS,OAAO;IAAS;GAClC;IAAE,OAAO;IAAW,OAAO;IAAW;GACvC;EACF;CACD;EACE,MAAM;EACN,OAAO;EACP,MAAM;EACN,UAAU;EACV,aAAa;EACd;CACD;EACE,MAAM;EACN,OAAO;EACP,MAAM;EACN,SAAS;GACP;IAAE,OAAO;IAAU,OAAO;IAAU;GACpC;IAAE,OAAO;IAAU,OAAO;IAAU;GACpC;IAAE,OAAO;IAAW,OAAO;IAAW;GACvC;EACF;CACD;EAAE,MAAM;EAAe,OAAO;EAAe,MAAM;EAAY,UAAU;EAAM,SAAS;EAAG;CAC3F;EAAE,MAAM;EAAU,OAAO;EAAU,MAAM;EAAQ,SAAS;EAAG;CAC9D,EAEK,KAAmB,OAA6C;CACpE,OAAO,EAAQ;CACf,UAAU,EAAQ;CAClB,UAAU,EAAQ;CAClB,OAAO,EAAQ;CACf,WAAW,EAAQ;CACnB,cAAc,EAAQ;CACtB,QAAQ,EAAQ;CAChB,aAAa,EAAQ;CACrB,QAAQ,EAAQ;CACjB,GAEK,KAAmB,GAAoB,OAAmD;CAC9F,IAAI,GAAM,MAAM,OAAO,YAAY;CACnC,OAAO,OAAO,EAAO,SAAS,GAAG;CACjC,UAAU,OAAO,EAAO,YAAY,GAAG;CACvC,UAAU,OAAO,EAAO,YAAY,GAAG;CACvC,OAAO,OAAO,EAAO,SAAU,WAAW,EAAO,QAAQ,OAAO,EAAO,MAAM,IAAI;CACjF,WAAY,EAAO,aAAiD;CACpE,QAAQ,GAAM,UAAU;CACxB,SAAS,GAAM,WAAW;CAC1B,aAAa,OAAO,EAAO,eAAe,GAAG;CAC7C,cAAc,OAAO,EAAO,gBAAgB,GAAG;CAC/C,QAAS,EAAO,UAA2C;CAC3D,QAAQ,MAAM,QAAQ,EAAO,OAAO,GAAG,EAAO,SAAS,EAAE;CAC1D;AAED,SAAgB,IAAgC;CAC9C,IAAM,IAAW,GAAa,EACxB,EACJ,wBACA,0BACA,6BACA,gCACE,GAAqB,EACnB,IAAQ,GAAkC,EAC1C,EAAE,SAAM,aAAU,WAAQ,eAAY,EAAc,EAAE,iBAAiB,GAAG,CAAC,EAE3E,IAAa,EAAoB,MAAM,GAAQ,IAAS,EAAS;AAUvE,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GACE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD,EAAA,UAAA;KACE,kBAAC,MAAD;MAAI,WAAU;gBACZ,kBAAC,GAAD,EAAA,UAAc,eAA0B,CAAA;MACrC,CAAA;KACL,kBAAC,KAAD;MAAG,WAAU;gBAA8B;MAA+B,CAAA;KAC1E,kBAAC,GAAD;MAAa,WAAU;gBAAO;MAGhB,CAAA;KACV,EAAA,CAAA,EACN,kBAAC,GAAD;KAAQ,MAAK;KAAK,eAAe,EAAM,WAAW;eAAlD,CACE,kBAAC,GAAD,EAAM,WAAU,gBAAiB,CAAA,EAAA,iBAE1B;OACL;;GACN,kBAAC,OAAD;IAAK,WAAU;cACZ,EAAoB,WAAW,IAC9B,kBAAC,OAAD;KAAK,WAAU;eACb,kBAAC,GAAD;MACE,cAAa;MACb,OAAM;MACN,aAAY;MACZ,CAAA;KACE,CAAA,GAEN,EAAW,KAAK,GAAK,MACnB,kBAAC,GAAD;KAAwB,WAAW,MAAS,IAAI,UAAU;KAAS,MAAM,MAAS;eAAlF,CACE,kBAAC,GAAD,EAAA,UACE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD;OAAW,WAAU;iBAAa,EAAI;OAAkB,CAAA,EACxD,kBAAC,GAAD;OACE,SAAS,EAAI,WAAW,WAAW,YAAY;OAC/C,WAAU;iBAET,EAAgB,EAAI,OAAO;OACtB,CAAA,CACJ;SACK,CAAA,EACb,kBAAC,GAAD,EAAA,UAAA;MACE,kBAAC,KAAD;OAAG,WAAU;iBAAoC,EAAI;OAAgB,CAAA;MACrE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,QAAD;QAAM,WAAU;kBAAhB;SAA4B;SACxB,EAAI;SAAM;SAAE,EAAI;SACb;WACP,kBAAC,QAAD;QAAM,WAAU;kBAAhB;SACE,kBAAC,GAAD,EAAM,WAAU,oCAAqC,CAAA;SACpD,EAAI;SAAO;SAAG,EAAI;SAAQ;SACtB;UACH;;MACN,kBAAC,OAAD;OAAK,WAAU;iBAAf;QACE,kBAAC,GAAD;SACE,SAAQ;SACR,MAAK;SACL,WAAU;SACV,eAAe,EAAM,UAAU,EAAI;mBAJrC,CAME,kBAAC,GAAD,EAAQ,WAAU,oBAAqB,CAAA,EAAA,OAEhC;;QACT,kBAAC,GAAD;SACE,MAAK;SACL,WAAU;SACV,eAAe,EAAS,0CAA0C,EAAI,KAAK;mBAH7E,CAKE,kBAAC,GAAD,EAAK,WAAU,oBAAqB,CAAA,EAAA,OAE7B;;QACT,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD;SAAoB,SAAA;mBAClB,kBAAC,GAAD;UAAQ,SAAQ;UAAQ,MAAK;UAAO,cAAY,UAAU,EAAI;oBAC5D,kBAAC,GAAD,EAAQ,WAAU,kCAAmC,CAAA;UAC9C,CAAA;SACU,CAAA,EACrB,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UAAkB,mBAAkC,CAAA,EACpD,kBAAC,GAAD,EAAA,UAAA;SAAwB;SACP,EAAI;SAAM;SAEF,EAAA,CAAA,CACP,EAAA,CAAA,EACpB,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UAAmB,UAA0B,CAAA,EAC7C,kBAAC,GAAD;SAAmB,eAAe,KAAK,EAAyB,EAAI,GAAG;mBAAE;SAErD,CAAA,CACF,EAAA,CAAA,CACD,EAAA,CAAA,CACT,EAAA,CAAA;QACV;;MACM,EAAA,CAAA,CACJ;OAjEI,EAAI,GAiER,CACZ;IAEA,CAAA;GACL,EAAoB,SAAS,IAC5B,kBAAC,GAAD;IACQ;IACI;IACV,YAAY,EAAoB;IAChC,cAAc;IACd,CAAA,GACA;GAEJ,kBAAC,GAAD;IACE,MAAM,EAAM;IACZ,cAAc,EAAM;IACpB,OAAO,EAAM,UAAU,iBAAiB;IACxC,aAAY;IACZ,QAAQ;IACR,eAAe,EAAM,UAAU,EAAgB,EAAM,QAAQ,GAAG,KAAA;IAChE,aAAa,EAAM,UAAU,iBAAiB;IAC9C,UA3He,OAAO,MAAuB;AACjD,KAAI,EAAM,UACR,MAAM,EAAyB,EAAM,QAAQ,IAAI,EAAgB,GAAQ,EAAM,QAAQ,CAAC,GAExF,MAAM,EAAsB,EAAgB,EAAO,CAAC;;IAwHlD,CAAA;GACE"}
|
|
1
|
+
{"version":3,"file":"MarketplaceMyServicesPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/MarketplaceMyServicesPagePage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n Badge,\n Button,\n Card,\n CardContent,\n GradientText,\n IllustratedEmptyState,\n PagePurpose,\n ResponsiveTable,\n Spinner,\n type ResponsiveTableColumn,\n} from '@burdenoff/fe-libs/ui';\nimport { Pause, Pencil, Play, Plus, Trash2 } from 'lucide-react';\nimport { useNavigate } from 'react-router';\nimport { InlineError } from '../components/InlineError';\nimport { MarketplaceTabs } from '../components/marketplace/MarketplaceTabs';\nimport { ServiceListingModal } from '../components/marketplace/ServiceListingModal';\nimport { StatCard } from '../components/viz';\nimport { useCrewFoundryStore, type CrewServiceListing } from '../store/crewfoundryStore';\nimport { formatRate } from '../lib/marketplace';\nimport { useEnsureLoaded } from '../lib/useEnsureLoaded';\n\nexport function MarketplaceMyServicesPagePage() {\n const navigate = useNavigate();\n const {\n serviceListings,\n bookings,\n marketplaceLoaded,\n fetchMarketplace,\n updateServiceListing,\n removeServiceListing,\n initParams,\n } = useCrewFoundryStore();\n const loadError = useEnsureLoaded(marketplaceLoaded, fetchMarketplace);\n const [actionError, setActionError] = useState<string | null>(null);\n const [editTarget, setEditTarget] = useState<CrewServiceListing | null>(null);\n const [createOpen, setCreateOpen] = useState(false);\n const [deleteTarget, setDeleteTarget] = useState<CrewServiceListing | null>(null);\n\n const mine = serviceListings.filter((listing) => listing.providerActorId === initParams.actorId);\n const myBookings = bookings.filter((booking) => booking.providerActorId === initParams.actorId);\n const pending = myBookings.filter((booking) => booking.status === 'requested').length;\n\n const runAction = async (action: () => Promise<void>) => {\n setActionError(null);\n try {\n await action();\n } catch (error) {\n setActionError(error instanceof Error ? error.message : 'Something went wrong');\n }\n };\n\n const columns: ResponsiveTableColumn<CrewServiceListing>[] = [\n {\n key: 'title',\n header: 'Service',\n priority: 'primary',\n cell: (listing) => (\n <button\n type=\"button\"\n className=\"text-left font-medium hover:underline\"\n onClick={() =>\n navigate(`../marketplace/service-details-page?id=${encodeURIComponent(listing.id)}`)\n }\n >\n {listing.title}\n </button>\n ),\n },\n {\n key: 'rate',\n header: 'Rate',\n cell: (listing) => <span className=\"tabular-nums\">{formatRate(listing)}</span>,\n },\n {\n key: 'bookings',\n header: 'Bookings',\n cell: (listing) => (\n <span className=\"tabular-nums\">\n {myBookings.filter((booking) => booking.listingId === listing.id).length}\n </span>\n ),\n },\n {\n key: 'status',\n header: 'Status',\n cell: (listing) => (\n <Badge\n variant={listing.status === 'active' ? 'default' : 'secondary'}\n className=\"text-[10px]\"\n >\n {listing.status === 'active' ? 'Bookable' : 'Paused'}\n </Badge>\n ),\n },\n {\n key: 'actions',\n header: '',\n cellClassName: 'md:text-right',\n cell: (listing) => (\n <div className=\"flex justify-end gap-1\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8\"\n aria-label={`${listing.status === 'active' ? 'Pause' : 'Resume'} ${listing.title}`}\n onClick={() =>\n void runAction(() =>\n updateServiceListing(listing.id, {\n status: listing.status === 'active' ? 'paused' : 'active',\n })\n )\n }\n >\n {listing.status === 'active' ? (\n <Pause className=\"h-4 w-4\" />\n ) : (\n <Play className=\"h-4 w-4\" />\n )}\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8\"\n aria-label={`Edit ${listing.title}`}\n onClick={() => setEditTarget(listing)}\n >\n <Pencil className=\"h-4 w-4\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8\"\n aria-label={`Delete ${listing.title}`}\n onClick={() => setDeleteTarget(listing)}\n >\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n </div>\n ),\n },\n ];\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>My Services</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">\n {mine.length} services you offer · {pending} booking requests waiting\n </p>\n <PagePurpose className=\"mt-1\">\n Manage the services you offer on the marketplace — set your rate, pause a service when\n you are fully booked, and respond to booking requests.\n </PagePurpose>\n </div>\n <Button size=\"sm\" onClick={() => setCreateOpen(true)}>\n <Plus className=\"mr-1 h-4 w-4\" />\n Publish a service\n </Button>\n </div>\n\n <MarketplaceTabs value=\"my-services\" />\n\n <InlineError message={loadError ?? actionError} />\n\n <div className=\"grid gap-4 sm:grid-cols-3\">\n <StatCard label=\"Services\" value={mine.length} />\n <StatCard\n label=\"Bookable\"\n value={mine.filter((listing) => listing.status === 'active').length}\n />\n <StatCard label=\"Requests Waiting\" value={pending} />\n </div>\n\n {!marketplaceLoaded && !loadError ? (\n <div className=\"flex min-h-[240px] items-center justify-center\">\n <Spinner size=\"lg\" />\n </div>\n ) : mine.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title=\"You haven't published a service\"\n description=\"Publish what you can help with and at what rate; colleagues can then book you.\"\n action={\n <Button size=\"sm\" onClick={() => setCreateOpen(true)}>\n <Plus className=\"mr-1 h-4 w-4\" />\n Publish a service\n </Button>\n }\n />\n ) : (\n <Card>\n <CardContent className=\"pt-6\">\n <ResponsiveTable<CrewServiceListing>\n data={mine}\n rowKey={(listing) => listing.id}\n columns={columns}\n />\n </CardContent>\n </Card>\n )}\n\n <ServiceListingModal open={createOpen} onOpenChange={setCreateOpen} listing={null} />\n <ServiceListingModal\n open={editTarget !== null}\n onOpenChange={(open) => {\n if (!open) setEditTarget(null);\n }}\n listing={editTarget}\n />\n\n <AlertDialog\n open={deleteTarget !== null}\n onOpenChange={(open) => {\n if (!open) setDeleteTarget(null);\n }}\n >\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>Delete service?</AlertDialogTitle>\n <AlertDialogDescription>\n {deleteTarget\n ? `“${deleteTarget.title}” is removed from the marketplace. Existing bookings and their escrow records are kept.`\n : ''}\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel>Cancel</AlertDialogCancel>\n <AlertDialogAction\n onClick={(event) => {\n event.preventDefault();\n const target = deleteTarget;\n setDeleteTarget(null);\n if (target) void runAction(() => removeServiceListing(target.id));\n }}\n >\n Delete\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MarketplaceServiceDetailsPagePage.d.ts","sourceRoot":"","sources":["../../../src/crewfoundry/pages/MarketplaceServiceDetailsPagePage.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"MarketplaceServiceDetailsPagePage.d.ts","sourceRoot":"","sources":["../../../src/crewfoundry/pages/MarketplaceServiceDetailsPagePage.tsx"],"names":[],"mappings":"AAuBA,wBAAgB,iCAAiC,gCAuIhD"}
|