@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.
Files changed (214) hide show
  1. package/dist/crewfoundry/CrewFoundryRoot.d.ts.map +1 -1
  2. package/dist/crewfoundry/CrewFoundryRoot.js +160 -256
  3. package/dist/crewfoundry/CrewFoundryRoot.js.map +1 -1
  4. package/dist/crewfoundry/CrewFoundryRoutes.d.ts.map +1 -1
  5. package/dist/crewfoundry/CrewFoundryRoutes.js +152 -192
  6. package/dist/crewfoundry/CrewFoundryRoutes.js.map +1 -1
  7. package/dist/crewfoundry/components/InlineError.d.ts +5 -0
  8. package/dist/crewfoundry/components/InlineError.d.ts.map +1 -0
  9. package/dist/crewfoundry/components/InlineError.js +17 -0
  10. package/dist/crewfoundry/components/InlineError.js.map +1 -0
  11. package/dist/crewfoundry/components/forms/FormModal.d.ts +25 -1
  12. package/dist/crewfoundry/components/forms/FormModal.d.ts.map +1 -1
  13. package/dist/crewfoundry/components/forms/FormModal.js +151 -136
  14. package/dist/crewfoundry/components/forms/FormModal.js.map +1 -1
  15. package/dist/crewfoundry/components/marketplace/BookServiceModal.d.ts +14 -0
  16. package/dist/crewfoundry/components/marketplace/BookServiceModal.d.ts.map +1 -0
  17. package/dist/crewfoundry/components/marketplace/BookServiceModal.js +75 -0
  18. package/dist/crewfoundry/components/marketplace/BookServiceModal.js.map +1 -0
  19. package/dist/crewfoundry/components/marketplace/MarketplaceTabs.d.ts +24 -0
  20. package/dist/crewfoundry/components/marketplace/MarketplaceTabs.d.ts.map +1 -0
  21. package/dist/crewfoundry/components/marketplace/MarketplaceTabs.js +47 -0
  22. package/dist/crewfoundry/components/marketplace/MarketplaceTabs.js.map +1 -0
  23. package/dist/crewfoundry/components/marketplace/ServiceListingModal.d.ts +12 -0
  24. package/dist/crewfoundry/components/marketplace/ServiceListingModal.d.ts.map +1 -0
  25. package/dist/crewfoundry/components/marketplace/ServiceListingModal.js +123 -0
  26. package/dist/crewfoundry/components/marketplace/ServiceListingModal.js.map +1 -0
  27. package/dist/crewfoundry/components/viz/CertificateCard.js +4 -118
  28. package/dist/crewfoundry/components/viz/PathSteps.js +3 -68
  29. package/dist/crewfoundry/components/viz/lib/geometry.js +5 -13
  30. package/dist/crewfoundry/components/viz/lib/geometry.js.map +1 -1
  31. package/dist/crewfoundry/lib/analytics.d.ts +1 -6
  32. package/dist/crewfoundry/lib/analytics.d.ts.map +1 -1
  33. package/dist/crewfoundry/lib/analytics.js +3 -18
  34. package/dist/crewfoundry/lib/analytics.js.map +1 -1
  35. package/dist/crewfoundry/lib/companyFinance.d.ts +3 -7
  36. package/dist/crewfoundry/lib/companyFinance.d.ts.map +1 -1
  37. package/dist/crewfoundry/lib/companyFinance.js +3 -8
  38. package/dist/crewfoundry/lib/companyFinance.js.map +1 -1
  39. package/dist/crewfoundry/lib/learning.d.ts +12 -0
  40. package/dist/crewfoundry/lib/learning.d.ts.map +1 -0
  41. package/dist/crewfoundry/lib/learning.js +26 -0
  42. package/dist/crewfoundry/lib/learning.js.map +1 -0
  43. package/dist/crewfoundry/lib/marketplace.d.ts +30 -0
  44. package/dist/crewfoundry/lib/marketplace.d.ts.map +1 -0
  45. package/dist/crewfoundry/lib/marketplace.js +91 -0
  46. package/dist/crewfoundry/lib/marketplace.js.map +1 -0
  47. package/dist/crewfoundry/lib/useEnsureLoaded.d.ts +7 -0
  48. package/dist/crewfoundry/lib/useEnsureLoaded.d.ts.map +1 -0
  49. package/dist/crewfoundry/lib/useEnsureLoaded.js +25 -0
  50. package/dist/crewfoundry/lib/useEnsureLoaded.js.map +1 -0
  51. package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.d.ts.map +1 -1
  52. package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.js +12 -25
  53. package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.js.map +1 -1
  54. package/dist/crewfoundry/pages/AnalyticsHiringAnalyticsPagePage.d.ts.map +1 -1
  55. package/dist/crewfoundry/pages/AnalyticsHiringAnalyticsPagePage.js +49 -49
  56. package/dist/crewfoundry/pages/AnalyticsHiringAnalyticsPagePage.js.map +1 -1
  57. package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.d.ts.map +1 -1
  58. package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js +145 -157
  59. package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js.map +1 -1
  60. package/dist/crewfoundry/pages/CompanyClientManagementPagePage.d.ts.map +1 -1
  61. package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js +14 -14
  62. package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js.map +1 -1
  63. package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.d.ts.map +1 -1
  64. package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js +14 -14
  65. package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js.map +1 -1
  66. package/dist/crewfoundry/pages/HelpApiDocumentationPagePage.d.ts.map +1 -1
  67. package/dist/crewfoundry/pages/HelpApiDocumentationPagePage.js +71 -33
  68. package/dist/crewfoundry/pages/HelpApiDocumentationPagePage.js.map +1 -1
  69. package/dist/crewfoundry/pages/HiringCreateJobPagePage.d.ts.map +1 -1
  70. package/dist/crewfoundry/pages/HiringCreateJobPagePage.js +260 -115
  71. package/dist/crewfoundry/pages/HiringCreateJobPagePage.js.map +1 -1
  72. package/dist/crewfoundry/pages/HiringJobDetailsPagePage.d.ts.map +1 -1
  73. package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js +199 -166
  74. package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js.map +1 -1
  75. package/dist/crewfoundry/pages/HiringJobsPagePage.d.ts.map +1 -1
  76. package/dist/crewfoundry/pages/HiringJobsPagePage.js +118 -104
  77. package/dist/crewfoundry/pages/HiringJobsPagePage.js.map +1 -1
  78. package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.d.ts.map +1 -1
  79. package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js +247 -173
  80. package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js.map +1 -1
  81. package/dist/crewfoundry/pages/LearningCoursesPagePage.d.ts +12 -0
  82. package/dist/crewfoundry/pages/LearningCoursesPagePage.d.ts.map +1 -1
  83. package/dist/crewfoundry/pages/LearningCoursesPagePage.js +307 -293
  84. package/dist/crewfoundry/pages/LearningCoursesPagePage.js.map +1 -1
  85. package/dist/crewfoundry/pages/LearningEnrollmentsPagePage.d.ts +2 -0
  86. package/dist/crewfoundry/pages/LearningEnrollmentsPagePage.d.ts.map +1 -0
  87. package/dist/crewfoundry/pages/LearningEnrollmentsPagePage.js +223 -0
  88. package/dist/crewfoundry/pages/LearningEnrollmentsPagePage.js.map +1 -0
  89. package/dist/crewfoundry/pages/LearningLearningAnalyticsPagePage.d.ts +4 -0
  90. package/dist/crewfoundry/pages/LearningLearningAnalyticsPagePage.d.ts.map +1 -1
  91. package/dist/crewfoundry/pages/LearningLearningAnalyticsPagePage.js +115 -160
  92. package/dist/crewfoundry/pages/LearningLearningAnalyticsPagePage.js.map +1 -1
  93. package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.d.ts.map +1 -1
  94. package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.js +165 -75
  95. package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.js.map +1 -1
  96. package/dist/crewfoundry/pages/MarketplaceEscrowPagePage.d.ts +7 -0
  97. package/dist/crewfoundry/pages/MarketplaceEscrowPagePage.d.ts.map +1 -0
  98. package/dist/crewfoundry/pages/MarketplaceEscrowPagePage.js +175 -0
  99. package/dist/crewfoundry/pages/MarketplaceEscrowPagePage.js.map +1 -0
  100. package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.d.ts.map +1 -1
  101. package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js +182 -223
  102. package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js.map +1 -1
  103. package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.d.ts.map +1 -1
  104. package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js +168 -227
  105. package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js.map +1 -1
  106. package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.d.ts.map +1 -1
  107. package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.js +127 -290
  108. package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.js.map +1 -1
  109. package/dist/crewfoundry/store/crewfoundryStore.d.ts +139 -79
  110. package/dist/crewfoundry/store/crewfoundryStore.d.ts.map +1 -1
  111. package/dist/crewfoundry/store/crewfoundryStore.js +323 -244
  112. package/dist/crewfoundry/store/crewfoundryStore.js.map +1 -1
  113. package/dist/crewfoundry/utils/dateUtils.d.ts +52 -0
  114. package/dist/crewfoundry/utils/dateUtils.d.ts.map +1 -0
  115. package/dist/crewfoundry/utils/dateUtils.js +31 -0
  116. package/dist/crewfoundry/utils/dateUtils.js.map +1 -0
  117. package/dist/generated/global-types.d.ts +5145 -1627
  118. package/dist/generated/global-types.d.ts.map +1 -1
  119. package/dist/generated/wspace-types.d.ts +100373 -34602
  120. package/dist/generated/wspace-types.d.ts.map +1 -1
  121. package/dist/utils/pageContext.d.ts.map +1 -1
  122. package/dist/utils/pageContext.js +0 -1
  123. package/dist/utils/pageContext.js.map +1 -1
  124. package/package.json +1 -1
  125. package/dist/crewfoundry/components/viz/CertificateCard.js.map +0 -1
  126. package/dist/crewfoundry/components/viz/PathSteps.js.map +0 -1
  127. package/dist/crewfoundry/pages/CommunicationsCallsPagePage.d.ts +0 -2
  128. package/dist/crewfoundry/pages/CommunicationsCallsPagePage.d.ts.map +0 -1
  129. package/dist/crewfoundry/pages/CommunicationsCallsPagePage.js +0 -53
  130. package/dist/crewfoundry/pages/CommunicationsCallsPagePage.js.map +0 -1
  131. package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.d.ts +0 -2
  132. package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.d.ts.map +0 -1
  133. package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.js +0 -107
  134. package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.js.map +0 -1
  135. package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.d.ts +0 -2
  136. package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.d.ts.map +0 -1
  137. package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.js +0 -62
  138. package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.js.map +0 -1
  139. package/dist/crewfoundry/pages/LearningAssessmentsPagePage.d.ts +0 -2
  140. package/dist/crewfoundry/pages/LearningAssessmentsPagePage.d.ts.map +0 -1
  141. package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js +0 -37
  142. package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js.map +0 -1
  143. package/dist/crewfoundry/pages/LearningCertificatesPagePage.d.ts +0 -2
  144. package/dist/crewfoundry/pages/LearningCertificatesPagePage.d.ts.map +0 -1
  145. package/dist/crewfoundry/pages/LearningCertificatesPagePage.js +0 -111
  146. package/dist/crewfoundry/pages/LearningCertificatesPagePage.js.map +0 -1
  147. package/dist/crewfoundry/pages/LearningCourseLearningPagePage.d.ts +0 -2
  148. package/dist/crewfoundry/pages/LearningCourseLearningPagePage.d.ts.map +0 -1
  149. package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js +0 -309
  150. package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js.map +0 -1
  151. package/dist/crewfoundry/pages/LearningLearningPagePage.d.ts +0 -2
  152. package/dist/crewfoundry/pages/LearningLearningPagePage.d.ts.map +0 -1
  153. package/dist/crewfoundry/pages/LearningLearningPagePage.js +0 -200
  154. package/dist/crewfoundry/pages/LearningLearningPagePage.js.map +0 -1
  155. package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.d.ts +0 -2
  156. package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.d.ts.map +0 -1
  157. package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js +0 -190
  158. package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js.map +0 -1
  159. package/dist/crewfoundry/pages/LearningLearningPathsPagePage.d.ts +0 -2
  160. package/dist/crewfoundry/pages/LearningLearningPathsPagePage.d.ts.map +0 -1
  161. package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js +0 -230
  162. package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js.map +0 -1
  163. package/dist/crewfoundry/pages/LearningMyLearningPagePage.d.ts +0 -2
  164. package/dist/crewfoundry/pages/LearningMyLearningPagePage.d.ts.map +0 -1
  165. package/dist/crewfoundry/pages/LearningMyLearningPagePage.js +0 -293
  166. package/dist/crewfoundry/pages/LearningMyLearningPagePage.js.map +0 -1
  167. package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.d.ts +0 -2
  168. package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.d.ts.map +0 -1
  169. package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.js +0 -163
  170. package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.js.map +0 -1
  171. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.d.ts +0 -2
  172. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.d.ts.map +0 -1
  173. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.js +0 -365
  174. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.js.map +0 -1
  175. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.d.ts +0 -2
  176. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.d.ts.map +0 -1
  177. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.js +0 -224
  178. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.js.map +0 -1
  179. package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.d.ts +0 -2
  180. package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.d.ts.map +0 -1
  181. package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.js +0 -180
  182. package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.js.map +0 -1
  183. package/dist/crewfoundry/pages/MarketplaceMessagingPagePage.d.ts +0 -2
  184. package/dist/crewfoundry/pages/MarketplaceMessagingPagePage.d.ts.map +0 -1
  185. package/dist/crewfoundry/pages/MarketplaceMessagingPagePage.js +0 -38
  186. package/dist/crewfoundry/pages/MarketplaceMessagingPagePage.js.map +0 -1
  187. package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.d.ts +0 -2
  188. package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.d.ts.map +0 -1
  189. package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.js +0 -204
  190. package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.js.map +0 -1
  191. package/dist/crewfoundry/pages/PaymentsEscrowPagePage.d.ts +0 -2
  192. package/dist/crewfoundry/pages/PaymentsEscrowPagePage.d.ts.map +0 -1
  193. package/dist/crewfoundry/pages/PaymentsEscrowPagePage.js +0 -55
  194. package/dist/crewfoundry/pages/PaymentsEscrowPagePage.js.map +0 -1
  195. package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.d.ts +0 -2
  196. package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.d.ts.map +0 -1
  197. package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js +0 -335
  198. package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js.map +0 -1
  199. package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.d.ts +0 -2
  200. package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.d.ts.map +0 -1
  201. package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.js +0 -160
  202. package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.js.map +0 -1
  203. package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.d.ts +0 -2
  204. package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.d.ts.map +0 -1
  205. package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.js +0 -80
  206. package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.js.map +0 -1
  207. package/dist/crewfoundry/pages/PaymentsSecurityPagePage.d.ts +0 -2
  208. package/dist/crewfoundry/pages/PaymentsSecurityPagePage.d.ts.map +0 -1
  209. package/dist/crewfoundry/pages/PaymentsSecurityPagePage.js +0 -191
  210. package/dist/crewfoundry/pages/PaymentsSecurityPagePage.js.map +0 -1
  211. package/dist/crewfoundry/utils/courseProgress.d.ts +0 -33
  212. package/dist/crewfoundry/utils/courseProgress.d.ts.map +0 -1
  213. package/dist/crewfoundry/utils/courseProgress.js +0 -46
  214. 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 { formatEnumLabel as t } from "../utils/formatEnumLabel.js";
3
- import { FormModal as n, useFormModal as r } from "../components/forms/FormModal.js";
4
- import { Eye as i, Pencil as a, Plus as o, Star as s, Trash2 as c } from "lucide-react";
5
- import { useNavigate as l } from "react-router";
6
- import { jsx as u, jsxs as d } from "react/jsx-runtime";
7
- import { AlertDialog as f, AlertDialogAction as p, AlertDialogCancel as m, AlertDialogContent as h, AlertDialogDescription as g, AlertDialogFooter as _, AlertDialogHeader as v, AlertDialogTitle as y, AlertDialogTrigger as b, Badge as x, Button as S, CardContent as C, CardHeader as w, CardTitle as T, GlassCard as E, GradientText as D, IllustratedEmptyState as O, PagePurpose as k, Pagination as A } from "@burdenoff/fe-libs/ui";
8
- import { usePagination as j } from "@burdenoff/fe-libs/shared/hooks";
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
- var M = [
11
- {
12
- name: "title",
13
- label: "Service title",
14
- type: "text",
15
- required: !0,
16
- colSpan: 2
17
- },
18
- {
19
- name: "provider",
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__ */ d("div", {
125
- className: "flex items-center justify-between",
126
- children: [/* @__PURE__ */ d("div", { children: [
127
- /* @__PURE__ */ u("h1", {
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__ */ u(D, { children: "My Services" })
32
+ children: /* @__PURE__ */ m(O, { children: "My Services" })
130
33
  }),
131
- /* @__PURE__ */ u("p", {
34
+ /* @__PURE__ */ h("p", {
132
35
  className: "text-sm text-text-secondary",
133
- children: "Manage your listed services"
36
+ children: [
37
+ X.length,
38
+ " services you offer · ",
39
+ Q,
40
+ " booking requests waiting"
41
+ ]
134
42
  }),
135
- /* @__PURE__ */ u(k, {
43
+ /* @__PURE__ */ m(A, {
136
44
  className: "mt-1",
137
- children: "Manage the services you offer to clients — list, edit, and showcase your offerings to win more work on the marketplace."
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__ */ d(S, {
47
+ ] }), /* @__PURE__ */ h(T, {
140
48
  size: "sm",
141
- onClick: () => B.openModal(),
142
- children: [/* @__PURE__ */ u(o, { className: "h-4 w-4 mr-1" }), "Create Service"]
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__ */ u("div", {
146
- className: "grid gap-4 md:grid-cols-2 lg:grid-cols-3",
147
- children: I.length === 0 ? /* @__PURE__ */ u("div", {
148
- className: "col-span-full",
149
- children: /* @__PURE__ */ u(O, {
150
- illustration: "empty-generic",
151
- title: "No services listed",
152
- description: "List a service to start winning work on the marketplace."
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
- }) : G.map((e, n) => /* @__PURE__ */ d(E, {
155
- treatment: n === 0 ? "glass" : "plain",
156
- glow: n === 0,
157
- children: [/* @__PURE__ */ u(w, { children: /* @__PURE__ */ d("div", {
158
- className: "flex items-center justify-between",
159
- children: [/* @__PURE__ */ u(T, {
160
- className: "text-base",
161
- children: e.title
162
- }), /* @__PURE__ */ u(x, {
163
- variant: e.status === "active" ? "default" : "secondary",
164
- className: "text-[10px]",
165
- children: t(e.status)
166
- })]
167
- }) }), /* @__PURE__ */ d(C, { children: [
168
- /* @__PURE__ */ u("p", {
169
- className: "text-sm text-text-secondary mb-3",
170
- children: e.description
171
- }),
172
- /* @__PURE__ */ d("div", {
173
- className: "flex items-center justify-between text-sm",
174
- children: [/* @__PURE__ */ d("span", {
175
- className: "font-bold",
176
- children: [
177
- "$",
178
- e.price,
179
- "/",
180
- e.priceType
181
- ]
182
- }), /* @__PURE__ */ d("span", {
183
- className: "flex items-center gap-1",
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__ */ u(s, { className: "h-3 w-3 text-status-warning-text" }),
186
- e.rating,
187
- " (",
188
- e.reviews,
189
- ")"
190
- ]
191
- })]
192
- }),
193
- /* @__PURE__ */ d("div", {
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
- children: /* @__PURE__ */ u(c, { className: "h-4 w-4 text-status-error-text" })
154
+ onClick: () => Y(e),
155
+ children: /* @__PURE__ */ m(f, { className: "h-4 w-4" })
216
156
  })
217
- }), /* @__PURE__ */ d(h, { children: [/* @__PURE__ */ d(v, { children: [/* @__PURE__ */ u(y, { children: "Delete service?" }), /* @__PURE__ */ d(g, { children: [
218
- "This removes “",
219
- e.title,
220
- "” from your marketplace listings. This action cannot be undone."
221
- ] })] }), /* @__PURE__ */ d(_, { children: [/* @__PURE__ */ u(m, { children: "Cancel" }), /* @__PURE__ */ u(p, {
222
- onClick: () => void z(e.id),
223
- children: "Delete"
224
- })] })] })] })
225
- ]
226
- })
227
- ] })]
228
- }, e.id))
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
- I.length > 0 ? /* @__PURE__ */ u(A, {
231
- page: V,
232
- pageSize: H,
233
- totalItems: I.length,
234
- onPageChange: W
235
- }) : null,
236
- /* @__PURE__ */ u(n, {
237
- open: B.open,
238
- onOpenChange: B.onOpenChange,
239
- title: B.context ? "Edit service" : "Create service",
240
- description: "Describe the service you offer clients on the marketplace.",
241
- fields: M,
242
- initialValues: B.context ? N(B.context) : void 0,
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 { F as MarketplaceMyServicesPagePage };
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":"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"}
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":"AA4CA,wBAAgB,iCAAiC,gCA8QhD"}
1
+ {"version":3,"file":"MarketplaceServiceDetailsPagePage.d.ts","sourceRoot":"","sources":["../../../src/crewfoundry/pages/MarketplaceServiceDetailsPagePage.tsx"],"names":[],"mappings":"AAuBA,wBAAgB,iCAAiC,gCAuIhD"}