@burdenoff/microfe-housingvista 2026.709.2 → 2026.709.3
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/housingvista/HousingVistaRoutes.d.ts.map +1 -1
- package/dist/housingvista/HousingVistaRoutes.js +136 -37
- package/dist/housingvista/HousingVistaRoutes.js.map +1 -1
- package/dist/housingvista/hooks/useHousingVistaAnalytics.d.ts +1 -1
- package/dist/housingvista/hooks/useHousingVistaAnalytics.d.ts.map +1 -1
- package/dist/housingvista/hooks/useHousingVistaAnalytics.js +4 -4
- package/dist/housingvista/hooks/useHousingVistaAnalytics.js.map +1 -1
- package/dist/housingvista/pages/amc/AMCManagementPage.d.ts.map +1 -1
- package/dist/housingvista/pages/amc/AMCManagementPage.js +62 -60
- package/dist/housingvista/pages/amc/AMCManagementPage.js.map +1 -1
- package/dist/housingvista/pages/assets/AssetDetailPage.d.ts.map +1 -1
- package/dist/housingvista/pages/assets/AssetDetailPage.js +141 -138
- package/dist/housingvista/pages/assets/AssetDetailPage.js.map +1 -1
- package/dist/housingvista/pages/assets/AssetManagementPage.d.ts.map +1 -1
- package/dist/housingvista/pages/assets/AssetManagementPage.js +193 -191
- package/dist/housingvista/pages/assets/AssetManagementPage.js.map +1 -1
- package/dist/housingvista/pages/chat/ChatPage.d.ts.map +1 -1
- package/dist/housingvista/pages/chat/ChatPage.js +115 -113
- package/dist/housingvista/pages/chat/ChatPage.js.map +1 -1
- package/dist/housingvista/pages/finance/HomeLoanDetailPage.d.ts.map +1 -1
- package/dist/housingvista/pages/finance/HomeLoanDetailPage.js +152 -149
- package/dist/housingvista/pages/finance/HomeLoanDetailPage.js.map +1 -1
- package/dist/housingvista/pages/finance/HomeLoansPage.d.ts.map +1 -1
- package/dist/housingvista/pages/finance/HomeLoansPage.js +141 -139
- package/dist/housingvista/pages/finance/HomeLoansPage.js.map +1 -1
- package/dist/housingvista/pages/investments/InvestmentDetailPage.d.ts.map +1 -1
- package/dist/housingvista/pages/investments/InvestmentDetailPage.js +290 -287
- package/dist/housingvista/pages/investments/InvestmentDetailPage.js.map +1 -1
- package/dist/housingvista/pages/investments/InvestmentsPage.d.ts.map +1 -1
- package/dist/housingvista/pages/investments/InvestmentsPage.js +64 -62
- package/dist/housingvista/pages/investments/InvestmentsPage.js.map +1 -1
- package/dist/housingvista/pages/legal/LegalPage.d.ts.map +1 -1
- package/dist/housingvista/pages/legal/LegalPage.js +95 -93
- package/dist/housingvista/pages/legal/LegalPage.js.map +1 -1
- package/dist/housingvista/pages/legal/LegalServiceDetailPage.d.ts.map +1 -1
- package/dist/housingvista/pages/legal/LegalServiceDetailPage.js +129 -126
- package/dist/housingvista/pages/legal/LegalServiceDetailPage.js.map +1 -1
- package/dist/housingvista/pages/market/AreaInsightsPage.d.ts.map +1 -1
- package/dist/housingvista/pages/market/AreaInsightsPage.js +99 -97
- package/dist/housingvista/pages/market/AreaInsightsPage.js.map +1 -1
- package/dist/housingvista/pages/market/MarketAnalyticsPage.d.ts.map +1 -1
- package/dist/housingvista/pages/market/MarketAnalyticsPage.js +138 -136
- package/dist/housingvista/pages/market/MarketAnalyticsPage.js.map +1 -1
- package/dist/housingvista/pages/marketplace/MarketplacePage.d.ts.map +1 -1
- package/dist/housingvista/pages/marketplace/MarketplacePage.js +99 -97
- package/dist/housingvista/pages/marketplace/MarketplacePage.js.map +1 -1
- package/dist/housingvista/pages/marketplace/ServiceDetailPage.d.ts.map +1 -1
- package/dist/housingvista/pages/marketplace/ServiceDetailPage.js +137 -134
- package/dist/housingvista/pages/marketplace/ServiceDetailPage.js.map +1 -1
- package/dist/housingvista/pages/offers/OffersPage.d.ts.map +1 -1
- package/dist/housingvista/pages/offers/OffersPage.js +94 -92
- package/dist/housingvista/pages/offers/OffersPage.js.map +1 -1
- package/dist/housingvista/pages/properties/AddPropertyPage.d.ts.map +1 -1
- package/dist/housingvista/pages/properties/AddPropertyPage.js +280 -279
- package/dist/housingvista/pages/properties/AddPropertyPage.js.map +1 -1
- package/dist/housingvista/pages/rental/RentalManagementPage.d.ts.map +1 -1
- package/dist/housingvista/pages/rental/RentalManagementPage.js +153 -151
- package/dist/housingvista/pages/rental/RentalManagementPage.js.map +1 -1
- package/dist/housingvista/pages/settings/ProfilePage.d.ts.map +1 -1
- package/dist/housingvista/pages/settings/ProfilePage.js +52 -50
- package/dist/housingvista/pages/settings/ProfilePage.js.map +1 -1
- package/dist/housingvista/pages/settings/SettingsPage.d.ts.map +1 -1
- package/dist/housingvista/pages/settings/SettingsPage.js +54 -52
- package/dist/housingvista/pages/settings/SettingsPage.js.map +1 -1
- package/dist/housingvista/pages/shortlist/ShortlistPage.d.ts.map +1 -1
- package/dist/housingvista/pages/shortlist/ShortlistPage.js +43 -41
- package/dist/housingvista/pages/shortlist/ShortlistPage.js.map +1 -1
- package/dist/housingvista/pages/transactions/TransactionDetailPage.d.ts.map +1 -1
- package/dist/housingvista/pages/transactions/TransactionDetailPage.js +211 -208
- package/dist/housingvista/pages/transactions/TransactionDetailPage.js.map +1 -1
- package/dist/housingvista/pages/transactions/TransactionsPage.d.ts.map +1 -1
- package/dist/housingvista/pages/transactions/TransactionsPage.js +85 -83
- package/dist/housingvista/pages/transactions/TransactionsPage.js.map +1 -1
- package/dist/housingvista/pages/verification/VerificationDetailPage.d.ts.map +1 -1
- package/dist/housingvista/pages/verification/VerificationDetailPage.js +25 -22
- package/dist/housingvista/pages/verification/VerificationDetailPage.js.map +1 -1
- package/dist/housingvista/pages/verification/VerificationPage.d.ts.map +1 -1
- package/dist/housingvista/pages/verification/VerificationPage.js +123 -121
- package/dist/housingvista/pages/verification/VerificationPage.js.map +1 -1
- package/dist/housingvista/pages/viewings/ViewingsPage.d.ts.map +1 -1
- package/dist/housingvista/pages/viewings/ViewingsPage.js +128 -126
- package/dist/housingvista/pages/viewings/ViewingsPage.js.map +1 -1
- package/package.json +1 -1
|
@@ -3,314 +3,317 @@ import { StatusBadge as t } from "../../components/StatusBadge.js";
|
|
|
3
3
|
import { EmptyState as n } from "../../components/EmptyState.js";
|
|
4
4
|
import { Breadcrumbs as r } from "../../components/Breadcrumbs.js";
|
|
5
5
|
import { LoadingSkeleton as i } from "../../components/LoadingSkeleton.js";
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
6
|
+
import { useTrackPageView as a } from "../../hooks/useHousingVistaAnalytics.js";
|
|
7
|
+
import { useMarketplaceService as o } from "../../hooks/index.js";
|
|
8
|
+
import { ContactOwnerDialog as s } from "../../components/ContactOwnerDialog.js";
|
|
9
|
+
import { ReviewsSection as c } from "../../components/ReviewsSection.js";
|
|
9
10
|
import "../../components/index.js";
|
|
10
|
-
import { useState as
|
|
11
|
-
import { ArrowLeft as
|
|
12
|
-
import { useLocation as
|
|
13
|
-
import { jsx as
|
|
14
|
-
import { Button as
|
|
11
|
+
import { useState as l } from "react";
|
|
12
|
+
import { ArrowLeft as u, CheckCircle as d, Clock as f, MapPin as p, MessageCircle as m, Paintbrush as h, Phone as g, Shield as _, ShieldCheck as v, SprayCanIcon as y, Star as b, Trees as x, Users as S, Wrench as C, Zap as w } from "lucide-react";
|
|
13
|
+
import { useLocation as T, useNavigate as E, useParams as D } from "react-router-dom";
|
|
14
|
+
import { jsx as O, jsxs as k } from "react/jsx-runtime";
|
|
15
|
+
import { Button as A, EmphasisPanel as j, GlassCard as M, PagePurpose as N } from "@burdenoff/fe-libs/ui";
|
|
15
16
|
//#region src/housingvista/pages/marketplace/ServiceDetailPage.tsx
|
|
16
|
-
function
|
|
17
|
+
function P(e) {
|
|
17
18
|
switch (e) {
|
|
18
|
-
case "repair": return /* @__PURE__ */
|
|
19
|
-
case "maintenance": return /* @__PURE__ */
|
|
20
|
-
case "cleaning": return /* @__PURE__ */
|
|
21
|
-
case "renovation": return /* @__PURE__ */
|
|
22
|
-
case "security": return /* @__PURE__ */
|
|
23
|
-
case "landscaping": return /* @__PURE__ */
|
|
24
|
-
case "pest_control": return /* @__PURE__ */
|
|
25
|
-
default: return /* @__PURE__ */
|
|
19
|
+
case "repair": return /* @__PURE__ */ O(C, { className: "h-5 w-5" });
|
|
20
|
+
case "maintenance": return /* @__PURE__ */ O(w, { className: "h-5 w-5" });
|
|
21
|
+
case "cleaning": return /* @__PURE__ */ O(y, { className: "h-5 w-5" });
|
|
22
|
+
case "renovation": return /* @__PURE__ */ O(h, { className: "h-5 w-5" });
|
|
23
|
+
case "security": return /* @__PURE__ */ O(_, { className: "h-5 w-5" });
|
|
24
|
+
case "landscaping": return /* @__PURE__ */ O(x, { className: "h-5 w-5" });
|
|
25
|
+
case "pest_control": return /* @__PURE__ */ O(v, { className: "h-5 w-5" });
|
|
26
|
+
default: return /* @__PURE__ */ O(C, { className: "h-5 w-5" });
|
|
26
27
|
}
|
|
27
28
|
}
|
|
28
|
-
function
|
|
29
|
-
return /* @__PURE__ */
|
|
29
|
+
function F({ rating: t }) {
|
|
30
|
+
return /* @__PURE__ */ O("div", {
|
|
30
31
|
className: "flex items-center gap-0.5 text-status-warning-text",
|
|
31
|
-
children: Array.from({ length: 5 }).map((n, r) => /* @__PURE__ */
|
|
32
|
+
children: Array.from({ length: 5 }).map((n, r) => /* @__PURE__ */ O(b, { className: e("h-4 w-4", r < Math.floor(t) ? "fill-current" : r < t ? "fill-current opacity-50" : "fill-none text-text-secondary/30") }, r))
|
|
32
33
|
});
|
|
33
34
|
}
|
|
34
|
-
function
|
|
35
|
-
let { id: e } =
|
|
36
|
-
|
|
35
|
+
function I() {
|
|
36
|
+
let { id: e } = D();
|
|
37
|
+
a("housingvista.marketplace.viewed", e);
|
|
38
|
+
let h = E(), _ = T(), [v, y] = l(!1), { data: x, loading: C } = o(e);
|
|
39
|
+
if (C) return /* @__PURE__ */ O("div", {
|
|
37
40
|
className: "p-6",
|
|
38
|
-
children: /* @__PURE__ */
|
|
41
|
+
children: /* @__PURE__ */ O(i, { variant: "detail" })
|
|
39
42
|
});
|
|
40
|
-
if (!
|
|
43
|
+
if (!x) return /* @__PURE__ */ O("div", {
|
|
41
44
|
className: "p-6",
|
|
42
|
-
children: /* @__PURE__ */
|
|
45
|
+
children: /* @__PURE__ */ O(n, {
|
|
43
46
|
illustration: "empty-search",
|
|
44
|
-
icon: /* @__PURE__ */
|
|
47
|
+
icon: /* @__PURE__ */ O(S, { className: "h-12 w-12" }),
|
|
45
48
|
title: "Service Not Found",
|
|
46
49
|
description: "The service provider you're looking for doesn't exist or is no longer listed.",
|
|
47
|
-
action: /* @__PURE__ */
|
|
48
|
-
onClick: () =>
|
|
50
|
+
action: /* @__PURE__ */ k("button", {
|
|
51
|
+
onClick: () => h("../marketplace"),
|
|
49
52
|
className: "inline-flex items-center gap-2 rounded-md bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text transition-colors hover:bg-action-primary-bg-hover",
|
|
50
|
-
children: [/* @__PURE__ */
|
|
53
|
+
children: [/* @__PURE__ */ O(u, { className: "h-4 w-4" }), "Back to Marketplace"]
|
|
51
54
|
})
|
|
52
55
|
})
|
|
53
56
|
});
|
|
54
|
-
let
|
|
55
|
-
return /* @__PURE__ */
|
|
57
|
+
let w = x.availableAreas ?? [];
|
|
58
|
+
return /* @__PURE__ */ k("div", {
|
|
56
59
|
className: "flex flex-col gap-6 p-6",
|
|
57
60
|
children: [
|
|
58
|
-
/* @__PURE__ */
|
|
61
|
+
/* @__PURE__ */ O(r, { items: [{
|
|
59
62
|
label: "Marketplace",
|
|
60
63
|
href: "../"
|
|
61
|
-
}, { label:
|
|
62
|
-
/* @__PURE__ */
|
|
64
|
+
}, { label: x.name }] }),
|
|
65
|
+
/* @__PURE__ */ k("div", {
|
|
63
66
|
className: "flex flex-col gap-4 lg:flex-row lg:items-start lg:justify-between",
|
|
64
|
-
children: [/* @__PURE__ */
|
|
67
|
+
children: [/* @__PURE__ */ k("div", {
|
|
65
68
|
className: "flex items-start gap-4",
|
|
66
|
-
children: [/* @__PURE__ */
|
|
69
|
+
children: [/* @__PURE__ */ O("div", {
|
|
67
70
|
className: "flex h-12 w-12 shrink-0 items-center justify-center rounded-lg bg-bg-sunken text-text-secondary",
|
|
68
|
-
children:
|
|
69
|
-
}), /* @__PURE__ */
|
|
70
|
-
/* @__PURE__ */
|
|
71
|
-
onClick: () =>
|
|
71
|
+
children: P(x.category)
|
|
72
|
+
}), /* @__PURE__ */ k("div", { children: [
|
|
73
|
+
/* @__PURE__ */ k("button", {
|
|
74
|
+
onClick: () => h("../marketplace"),
|
|
72
75
|
className: "mb-2 inline-flex items-center gap-2 rounded-md px-2 py-1 text-sm text-text-secondary transition-colors hover:bg-bg-sunken hover:text-text-primary",
|
|
73
|
-
children: [/* @__PURE__ */
|
|
76
|
+
children: [/* @__PURE__ */ O(u, { className: "h-4 w-4" }), "Back to Marketplace"]
|
|
74
77
|
}),
|
|
75
|
-
/* @__PURE__ */
|
|
78
|
+
/* @__PURE__ */ O("h1", {
|
|
76
79
|
className: "text-2xl font-semibold text-text-primary",
|
|
77
|
-
children:
|
|
80
|
+
children: x.name
|
|
78
81
|
}),
|
|
79
|
-
/* @__PURE__ */
|
|
82
|
+
/* @__PURE__ */ k("div", {
|
|
80
83
|
className: "mt-2 flex flex-wrap items-center gap-2",
|
|
81
84
|
children: [
|
|
82
|
-
/* @__PURE__ */
|
|
83
|
-
label:
|
|
85
|
+
/* @__PURE__ */ O(t, {
|
|
86
|
+
label: x.category.replace(/_/g, " "),
|
|
84
87
|
variant: "muted"
|
|
85
88
|
}),
|
|
86
|
-
|
|
89
|
+
x.verified && /* @__PURE__ */ O(t, {
|
|
87
90
|
label: "Verified",
|
|
88
91
|
variant: "success",
|
|
89
92
|
dot: !0
|
|
90
93
|
}),
|
|
91
|
-
|
|
94
|
+
x.featured && /* @__PURE__ */ O(t, {
|
|
92
95
|
label: "Featured",
|
|
93
96
|
variant: "warning"
|
|
94
97
|
}),
|
|
95
|
-
/* @__PURE__ */
|
|
98
|
+
/* @__PURE__ */ O("span", {
|
|
96
99
|
className: "text-sm text-text-secondary",
|
|
97
|
-
children:
|
|
100
|
+
children: x.providerName
|
|
98
101
|
})
|
|
99
102
|
]
|
|
100
103
|
})
|
|
101
104
|
] })]
|
|
102
|
-
}), /* @__PURE__ */
|
|
105
|
+
}), /* @__PURE__ */ O("div", {
|
|
103
106
|
className: "flex items-center gap-2",
|
|
104
|
-
children: /* @__PURE__ */
|
|
107
|
+
children: /* @__PURE__ */ k(A, {
|
|
105
108
|
type: "button",
|
|
106
109
|
variant: "default",
|
|
107
|
-
onClick: () =>
|
|
108
|
-
children: [/* @__PURE__ */
|
|
110
|
+
onClick: () => y(!0),
|
|
111
|
+
children: [/* @__PURE__ */ O(m, { className: "mr-1.5 h-4 w-4" }), "Contact"]
|
|
109
112
|
})
|
|
110
113
|
})]
|
|
111
114
|
}),
|
|
112
|
-
/* @__PURE__ */
|
|
115
|
+
/* @__PURE__ */ O(N, {
|
|
113
116
|
className: "max-w-3xl",
|
|
114
117
|
children: "Everything you need to decide whether to hire this provider — their rating and reviews, how fast they respond, the areas they cover, and whether they're verified. When you're ready, contact them through Messages."
|
|
115
118
|
}),
|
|
116
|
-
/* @__PURE__ */
|
|
119
|
+
/* @__PURE__ */ O(j, {
|
|
117
120
|
className: "p-4",
|
|
118
|
-
children: /* @__PURE__ */
|
|
121
|
+
children: /* @__PURE__ */ k("div", {
|
|
119
122
|
className: "grid grid-cols-2 gap-4 lg:grid-cols-4",
|
|
120
123
|
children: [
|
|
121
|
-
/* @__PURE__ */
|
|
124
|
+
/* @__PURE__ */ k("div", {
|
|
122
125
|
className: "rounded-lg border border-border-subtle bg-bg-surface p-4",
|
|
123
|
-
children: [/* @__PURE__ */
|
|
126
|
+
children: [/* @__PURE__ */ k("div", {
|
|
124
127
|
className: "flex items-center gap-2 text-text-secondary",
|
|
125
|
-
children: [/* @__PURE__ */
|
|
128
|
+
children: [/* @__PURE__ */ O(b, { className: "h-4 w-4" }), /* @__PURE__ */ O("span", {
|
|
126
129
|
className: "text-xs font-medium",
|
|
127
130
|
children: "Rating"
|
|
128
131
|
})]
|
|
129
|
-
}), /* @__PURE__ */
|
|
132
|
+
}), /* @__PURE__ */ k("div", {
|
|
130
133
|
className: "mt-2 flex items-center gap-2",
|
|
131
|
-
children: [/* @__PURE__ */
|
|
134
|
+
children: [/* @__PURE__ */ O("span", {
|
|
132
135
|
className: "text-xl font-bold text-text-primary",
|
|
133
|
-
children:
|
|
134
|
-
}),
|
|
136
|
+
children: x.rating ?? "—"
|
|
137
|
+
}), x.rating != null && /* @__PURE__ */ O(F, { rating: x.rating })]
|
|
135
138
|
})]
|
|
136
139
|
}),
|
|
137
|
-
/* @__PURE__ */
|
|
140
|
+
/* @__PURE__ */ k("div", {
|
|
138
141
|
className: "rounded-lg border border-border-subtle bg-bg-surface p-4",
|
|
139
|
-
children: [/* @__PURE__ */
|
|
142
|
+
children: [/* @__PURE__ */ k("div", {
|
|
140
143
|
className: "flex items-center gap-2 text-text-secondary",
|
|
141
|
-
children: [/* @__PURE__ */
|
|
144
|
+
children: [/* @__PURE__ */ O(S, { className: "h-4 w-4" }), /* @__PURE__ */ O("span", {
|
|
142
145
|
className: "text-xs font-medium",
|
|
143
146
|
children: "Reviews"
|
|
144
147
|
})]
|
|
145
|
-
}), /* @__PURE__ */
|
|
148
|
+
}), /* @__PURE__ */ O("div", {
|
|
146
149
|
className: "mt-2 text-xl font-bold text-text-primary",
|
|
147
|
-
children:
|
|
150
|
+
children: x.reviewCount
|
|
148
151
|
})]
|
|
149
152
|
}),
|
|
150
|
-
/* @__PURE__ */
|
|
153
|
+
/* @__PURE__ */ k("div", {
|
|
151
154
|
className: "rounded-lg border border-border-subtle bg-bg-surface p-4",
|
|
152
|
-
children: [/* @__PURE__ */
|
|
155
|
+
children: [/* @__PURE__ */ k("div", {
|
|
153
156
|
className: "flex items-center gap-2 text-text-secondary",
|
|
154
|
-
children: [/* @__PURE__ */
|
|
157
|
+
children: [/* @__PURE__ */ O(f, { className: "h-4 w-4" }), /* @__PURE__ */ O("span", {
|
|
155
158
|
className: "text-xs font-medium",
|
|
156
159
|
children: "Response Time"
|
|
157
160
|
})]
|
|
158
|
-
}), /* @__PURE__ */
|
|
161
|
+
}), /* @__PURE__ */ O("div", {
|
|
159
162
|
className: "mt-2 text-sm font-bold text-text-primary",
|
|
160
|
-
children:
|
|
163
|
+
children: x.responseTime ?? "—"
|
|
161
164
|
})]
|
|
162
165
|
}),
|
|
163
|
-
/* @__PURE__ */
|
|
166
|
+
/* @__PURE__ */ k("div", {
|
|
164
167
|
className: "rounded-lg border border-border-subtle bg-bg-surface p-4",
|
|
165
|
-
children: [/* @__PURE__ */
|
|
168
|
+
children: [/* @__PURE__ */ k("div", {
|
|
166
169
|
className: "flex items-center gap-2 text-text-secondary",
|
|
167
|
-
children: [/* @__PURE__ */
|
|
170
|
+
children: [/* @__PURE__ */ O(p, { className: "h-4 w-4" }), /* @__PURE__ */ O("span", {
|
|
168
171
|
className: "text-xs font-medium",
|
|
169
172
|
children: "Coverage"
|
|
170
173
|
})]
|
|
171
|
-
}), /* @__PURE__ */
|
|
174
|
+
}), /* @__PURE__ */ k("div", {
|
|
172
175
|
className: "mt-2 text-sm font-bold text-text-primary",
|
|
173
176
|
children: [
|
|
174
|
-
|
|
177
|
+
w.length,
|
|
175
178
|
" area",
|
|
176
|
-
|
|
179
|
+
w.length === 1 ? "" : "s"
|
|
177
180
|
]
|
|
178
181
|
})]
|
|
179
182
|
})
|
|
180
183
|
]
|
|
181
184
|
})
|
|
182
185
|
}),
|
|
183
|
-
/* @__PURE__ */
|
|
186
|
+
/* @__PURE__ */ k("div", {
|
|
184
187
|
className: "grid grid-cols-1 gap-6 lg:grid-cols-3",
|
|
185
|
-
children: [/* @__PURE__ */
|
|
188
|
+
children: [/* @__PURE__ */ k("div", {
|
|
186
189
|
className: "space-y-6 lg:col-span-2",
|
|
187
190
|
children: [
|
|
188
|
-
|
|
191
|
+
x.imageUrl && /* @__PURE__ */ O("div", {
|
|
189
192
|
className: "overflow-hidden rounded-xl border border-border-subtle",
|
|
190
|
-
children: /* @__PURE__ */
|
|
191
|
-
src:
|
|
192
|
-
alt:
|
|
193
|
+
children: /* @__PURE__ */ O("img", {
|
|
194
|
+
src: x.imageUrl,
|
|
195
|
+
alt: x.name,
|
|
193
196
|
className: "h-64 w-full object-cover"
|
|
194
197
|
})
|
|
195
198
|
}),
|
|
196
|
-
|
|
199
|
+
x.description && /* @__PURE__ */ k(M, {
|
|
197
200
|
treatment: "plain",
|
|
198
201
|
className: "border-border-seam p-6",
|
|
199
|
-
children: [/* @__PURE__ */
|
|
202
|
+
children: [/* @__PURE__ */ O("h2", {
|
|
200
203
|
className: "mb-3 text-base font-semibold text-text-primary",
|
|
201
204
|
children: "About this provider"
|
|
202
|
-
}), /* @__PURE__ */
|
|
205
|
+
}), /* @__PURE__ */ O("p", {
|
|
203
206
|
className: "text-sm leading-relaxed text-text-secondary",
|
|
204
|
-
children:
|
|
207
|
+
children: x.description
|
|
205
208
|
})]
|
|
206
209
|
}),
|
|
207
|
-
/* @__PURE__ */
|
|
210
|
+
/* @__PURE__ */ k(M, {
|
|
208
211
|
treatment: "plain",
|
|
209
212
|
className: "border-border-seam p-6",
|
|
210
|
-
children: [/* @__PURE__ */
|
|
213
|
+
children: [/* @__PURE__ */ k("h2", {
|
|
211
214
|
className: "mb-4 flex items-center gap-2 text-base font-semibold text-text-primary",
|
|
212
|
-
children: [/* @__PURE__ */
|
|
213
|
-
}),
|
|
215
|
+
children: [/* @__PURE__ */ O(p, { className: "h-5 w-5" }), "Service Areas"]
|
|
216
|
+
}), w.length > 0 ? /* @__PURE__ */ O("div", {
|
|
214
217
|
className: "flex flex-wrap gap-2",
|
|
215
|
-
children:
|
|
218
|
+
children: w.map((e, t) => /* @__PURE__ */ O("span", {
|
|
216
219
|
className: "rounded-full bg-bg-sunken px-3 py-1 text-xs text-text-primary",
|
|
217
220
|
children: e
|
|
218
221
|
}, t))
|
|
219
|
-
}) : /* @__PURE__ */
|
|
222
|
+
}) : /* @__PURE__ */ O("p", {
|
|
220
223
|
className: "text-sm text-text-secondary",
|
|
221
224
|
children: "Service areas not specified — ask the provider directly."
|
|
222
225
|
})]
|
|
223
226
|
})
|
|
224
227
|
]
|
|
225
|
-
}), /* @__PURE__ */
|
|
228
|
+
}), /* @__PURE__ */ O("div", {
|
|
226
229
|
className: "space-y-6",
|
|
227
|
-
children: /* @__PURE__ */
|
|
230
|
+
children: /* @__PURE__ */ k(M, {
|
|
228
231
|
treatment: "plain",
|
|
229
232
|
className: "border-border-seam p-5",
|
|
230
233
|
children: [
|
|
231
|
-
/* @__PURE__ */
|
|
234
|
+
/* @__PURE__ */ O("h3", {
|
|
232
235
|
className: "mb-4 text-base font-semibold text-text-primary",
|
|
233
236
|
children: "Provider"
|
|
234
237
|
}),
|
|
235
|
-
/* @__PURE__ */
|
|
238
|
+
/* @__PURE__ */ k("dl", {
|
|
236
239
|
className: "space-y-3 text-sm",
|
|
237
240
|
children: [
|
|
238
|
-
/* @__PURE__ */
|
|
241
|
+
/* @__PURE__ */ k("div", {
|
|
239
242
|
className: "flex items-center justify-between",
|
|
240
|
-
children: [/* @__PURE__ */
|
|
243
|
+
children: [/* @__PURE__ */ O("dt", {
|
|
241
244
|
className: "text-text-secondary",
|
|
242
245
|
children: "Name"
|
|
243
|
-
}), /* @__PURE__ */
|
|
246
|
+
}), /* @__PURE__ */ O("dd", {
|
|
244
247
|
className: "font-medium text-text-primary",
|
|
245
|
-
children:
|
|
248
|
+
children: x.providerName
|
|
246
249
|
})]
|
|
247
250
|
}),
|
|
248
|
-
/* @__PURE__ */
|
|
251
|
+
/* @__PURE__ */ k("div", {
|
|
249
252
|
className: "flex items-center justify-between",
|
|
250
|
-
children: [/* @__PURE__ */
|
|
253
|
+
children: [/* @__PURE__ */ O("dt", {
|
|
251
254
|
className: "text-text-secondary",
|
|
252
255
|
children: "Category"
|
|
253
|
-
}), /* @__PURE__ */
|
|
256
|
+
}), /* @__PURE__ */ O("dd", {
|
|
254
257
|
className: "font-medium capitalize text-text-primary",
|
|
255
|
-
children:
|
|
258
|
+
children: x.category.replace(/_/g, " ")
|
|
256
259
|
})]
|
|
257
260
|
}),
|
|
258
|
-
/* @__PURE__ */
|
|
261
|
+
/* @__PURE__ */ k("div", {
|
|
259
262
|
className: "flex items-center justify-between",
|
|
260
|
-
children: [/* @__PURE__ */
|
|
263
|
+
children: [/* @__PURE__ */ O("dt", {
|
|
261
264
|
className: "text-text-secondary",
|
|
262
265
|
children: "Price Range"
|
|
263
|
-
}), /* @__PURE__ */
|
|
266
|
+
}), /* @__PURE__ */ O("dd", {
|
|
264
267
|
className: "font-medium text-text-primary",
|
|
265
|
-
children:
|
|
268
|
+
children: x.priceRange ?? "—"
|
|
266
269
|
})]
|
|
267
270
|
}),
|
|
268
|
-
/* @__PURE__ */
|
|
271
|
+
/* @__PURE__ */ k("div", {
|
|
269
272
|
className: "flex items-center justify-between",
|
|
270
|
-
children: [/* @__PURE__ */
|
|
273
|
+
children: [/* @__PURE__ */ O("dt", {
|
|
271
274
|
className: "text-text-secondary",
|
|
272
275
|
children: "Verified"
|
|
273
|
-
}), /* @__PURE__ */
|
|
276
|
+
}), /* @__PURE__ */ O("dd", { children: x.verified ? /* @__PURE__ */ k("span", {
|
|
274
277
|
className: "inline-flex items-center gap-1 text-status-success-text",
|
|
275
|
-
children: [/* @__PURE__ */
|
|
276
|
-
}) : /* @__PURE__ */
|
|
278
|
+
children: [/* @__PURE__ */ O(d, { className: "h-4 w-4" }), "Yes"]
|
|
279
|
+
}) : /* @__PURE__ */ O("span", {
|
|
277
280
|
className: "text-text-secondary",
|
|
278
281
|
children: "Not verified"
|
|
279
282
|
}) })]
|
|
280
283
|
})
|
|
281
284
|
]
|
|
282
285
|
}),
|
|
283
|
-
/* @__PURE__ */
|
|
286
|
+
/* @__PURE__ */ k(A, {
|
|
284
287
|
type: "button",
|
|
285
288
|
variant: "default",
|
|
286
289
|
className: "mt-4 w-full justify-center",
|
|
287
|
-
onClick: () =>
|
|
288
|
-
children: [/* @__PURE__ */
|
|
290
|
+
onClick: () => y(!0),
|
|
291
|
+
children: [/* @__PURE__ */ O(g, { className: "mr-1.5 h-4 w-4" }), "Contact provider"]
|
|
289
292
|
})
|
|
290
293
|
]
|
|
291
294
|
})
|
|
292
295
|
})]
|
|
293
296
|
}),
|
|
294
|
-
/* @__PURE__ */
|
|
295
|
-
entityId:
|
|
297
|
+
/* @__PURE__ */ O(c, {
|
|
298
|
+
entityId: x.id,
|
|
296
299
|
entityType: "housingvista-marketplace-service",
|
|
297
|
-
aggregateRating:
|
|
298
|
-
reviewCount:
|
|
300
|
+
aggregateRating: x.rating,
|
|
301
|
+
reviewCount: x.reviewCount
|
|
299
302
|
}),
|
|
300
|
-
/* @__PURE__ */
|
|
301
|
-
open:
|
|
302
|
-
onOpenChange:
|
|
303
|
-
entityId:
|
|
303
|
+
/* @__PURE__ */ O(s, {
|
|
304
|
+
open: v,
|
|
305
|
+
onOpenChange: y,
|
|
306
|
+
entityId: x.id,
|
|
304
307
|
entityType: "housingvista-marketplace-service",
|
|
305
|
-
title:
|
|
306
|
-
pagePath:
|
|
307
|
-
heading: `Contact ${
|
|
308
|
-
description: `Start a conversation about ${
|
|
308
|
+
title: x.name,
|
|
309
|
+
pagePath: _.pathname,
|
|
310
|
+
heading: `Contact ${x.providerName}`,
|
|
311
|
+
description: `Start a conversation about ${x.name}. Messages are saved and delivered in your inbox.`
|
|
309
312
|
})
|
|
310
313
|
]
|
|
311
314
|
});
|
|
312
315
|
}
|
|
313
316
|
//#endregion
|
|
314
|
-
export {
|
|
317
|
+
export { I as ServiceDetailPage };
|
|
315
318
|
|
|
316
319
|
//# sourceMappingURL=ServiceDetailPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ServiceDetailPage.js","names":[],"sources":["../../../../src/housingvista/pages/marketplace/ServiceDetailPage.tsx"],"sourcesContent":["/**\n * HousingVista Marketplace Service Detail Page\n * Single service provider backed by `housingvistaMarketplaceService(id)` —\n * rating, review count, response time, service areas, verified status.\n *\n * \"Contact\" opens the real `ContactOwnerDialog` — a persisted conversation with\n * the provider. Reviews are real, backed by EntityComments; the denormalized\n * rating/reviewCount stays for at-a-glance display.\n * @module housingvista\n */\n\nimport { useState } from 'react';\nimport { useNavigate, useParams, useLocation } from 'react-router-dom';\nimport {\n ArrowLeft,\n Star,\n MapPin,\n Clock,\n CheckCircle,\n MessageCircle,\n Phone,\n Wrench,\n Zap,\n SprayCanIcon,\n Paintbrush,\n Shield,\n ShieldCheck,\n Trees,\n Users,\n} from 'lucide-react';\nimport { Button, EmphasisPanel, GlassCard, PagePurpose } from '@burdenoff/fe-libs/ui';\nimport {\n Breadcrumbs,\n StatusBadge,\n EmptyState,\n LoadingSkeleton,\n ContactOwnerDialog,\n ReviewsSection,\n} from '../../components';\nimport type { BreadcrumbItem } from '../../components';\nimport { useMarketplaceService } from '../../hooks';\nimport { cn } from '../../utils/helpers';\n\nfunction getCategoryIcon(category: string) {\n switch (category) {\n case 'repair':\n return <Wrench className=\"h-5 w-5\" />;\n case 'maintenance':\n return <Zap className=\"h-5 w-5\" />;\n case 'cleaning':\n return <SprayCanIcon className=\"h-5 w-5\" />;\n case 'renovation':\n return <Paintbrush className=\"h-5 w-5\" />;\n case 'security':\n return <Shield className=\"h-5 w-5\" />;\n case 'landscaping':\n return <Trees className=\"h-5 w-5\" />;\n case 'pest_control':\n return <ShieldCheck className=\"h-5 w-5\" />;\n default:\n return <Wrench className=\"h-5 w-5\" />;\n }\n}\n\nfunction RatingStars({ rating }: { rating: number }) {\n return (\n <div className=\"flex items-center gap-0.5 text-status-warning-text\">\n {Array.from({ length: 5 }).map((_, i) => (\n <Star\n key={i}\n className={cn(\n 'h-4 w-4',\n i < Math.floor(rating)\n ? 'fill-current'\n : i < rating\n ? 'fill-current opacity-50'\n : 'fill-none text-text-secondary/30'\n )}\n />\n ))}\n </div>\n );\n}\n\nexport function ServiceDetailPage() {\n const { id } = useParams<{ id: string }>();\n const navigate = useNavigate();\n const location = useLocation();\n const [contactOpen, setContactOpen] = useState(false);\n const { data: service, loading } = useMarketplaceService(id);\n\n if (loading) {\n return (\n <div className=\"p-6\">\n <LoadingSkeleton variant=\"detail\" />\n </div>\n );\n }\n\n if (!service) {\n return (\n <div className=\"p-6\">\n <EmptyState\n illustration=\"empty-search\"\n icon={<Users className=\"h-12 w-12\" />}\n title=\"Service Not Found\"\n description=\"The service provider you're looking for doesn't exist or is no longer listed.\"\n action={\n <button\n onClick={() => navigate('../marketplace')}\n className=\"inline-flex items-center gap-2 rounded-md bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text transition-colors hover:bg-action-primary-bg-hover\"\n >\n <ArrowLeft className=\"h-4 w-4\" />\n Back to Marketplace\n </button>\n }\n />\n </div>\n );\n }\n\n const areas = service.availableAreas ?? [];\n const breadcrumbs: BreadcrumbItem[] = [{ label: 'Marketplace', href: '../' }, { label: service.name }];\n\n return (\n <div className=\"flex flex-col gap-6 p-6\">\n <Breadcrumbs items={breadcrumbs} />\n\n {/* Header */}\n <div className=\"flex flex-col gap-4 lg:flex-row lg:items-start lg:justify-between\">\n <div className=\"flex items-start gap-4\">\n <div className=\"flex h-12 w-12 shrink-0 items-center justify-center rounded-lg bg-bg-sunken text-text-secondary\">\n {getCategoryIcon(service.category)}\n </div>\n <div>\n <button\n onClick={() => navigate('../marketplace')}\n className=\"mb-2 inline-flex items-center gap-2 rounded-md px-2 py-1 text-sm text-text-secondary transition-colors hover:bg-bg-sunken hover:text-text-primary\"\n >\n <ArrowLeft className=\"h-4 w-4\" />\n Back to Marketplace\n </button>\n <h1 className=\"text-2xl font-semibold text-text-primary\">{service.name}</h1>\n <div className=\"mt-2 flex flex-wrap items-center gap-2\">\n <StatusBadge label={service.category.replace(/_/g, ' ')} variant=\"muted\" />\n {service.verified && <StatusBadge label=\"Verified\" variant=\"success\" dot />}\n {service.featured && <StatusBadge label=\"Featured\" variant=\"warning\" />}\n <span className=\"text-sm text-text-secondary\">{service.providerName}</span>\n </div>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <Button type=\"button\" variant=\"default\" onClick={() => setContactOpen(true)}>\n <MessageCircle className=\"mr-1.5 h-4 w-4\" />\n Contact\n </Button>\n </div>\n </div>\n\n <PagePurpose className=\"max-w-3xl\">\n Everything you need to decide whether to hire this provider — their rating and reviews, how fast they respond,\n the areas they cover, and whether they're verified. When you're ready, contact them through Messages.\n </PagePurpose>\n\n {/* Key facts — primary insight zone (one EmphasisPanel per page) */}\n <EmphasisPanel className=\"p-4\">\n <div className=\"grid grid-cols-2 gap-4 lg:grid-cols-4\">\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4\">\n <div className=\"flex items-center gap-2 text-text-secondary\">\n <Star className=\"h-4 w-4\" />\n <span className=\"text-xs font-medium\">Rating</span>\n </div>\n <div className=\"mt-2 flex items-center gap-2\">\n <span className=\"text-xl font-bold text-text-primary\">{service.rating ?? '—'}</span>\n {service.rating != null && <RatingStars rating={service.rating} />}\n </div>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4\">\n <div className=\"flex items-center gap-2 text-text-secondary\">\n <Users className=\"h-4 w-4\" />\n <span className=\"text-xs font-medium\">Reviews</span>\n </div>\n <div className=\"mt-2 text-xl font-bold text-text-primary\">{service.reviewCount}</div>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4\">\n <div className=\"flex items-center gap-2 text-text-secondary\">\n <Clock className=\"h-4 w-4\" />\n <span className=\"text-xs font-medium\">Response Time</span>\n </div>\n <div className=\"mt-2 text-sm font-bold text-text-primary\">{service.responseTime ?? '—'}</div>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4\">\n <div className=\"flex items-center gap-2 text-text-secondary\">\n <MapPin className=\"h-4 w-4\" />\n <span className=\"text-xs font-medium\">Coverage</span>\n </div>\n <div className=\"mt-2 text-sm font-bold text-text-primary\">\n {areas.length} area{areas.length !== 1 ? 's' : ''}\n </div>\n </div>\n </div>\n </EmphasisPanel>\n\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-3\">\n {/* Overview */}\n <div className=\"space-y-6 lg:col-span-2\">\n {service.imageUrl && (\n <div className=\"overflow-hidden rounded-xl border border-border-subtle\">\n <img src={service.imageUrl} alt={service.name} className=\"h-64 w-full object-cover\" />\n </div>\n )}\n\n {service.description && (\n <GlassCard treatment=\"plain\" className=\"border-border-seam p-6\">\n <h2 className=\"mb-3 text-base font-semibold text-text-primary\">About this provider</h2>\n <p className=\"text-sm leading-relaxed text-text-secondary\">{service.description}</p>\n </GlassCard>\n )}\n\n <GlassCard treatment=\"plain\" className=\"border-border-seam p-6\">\n <h2 className=\"mb-4 flex items-center gap-2 text-base font-semibold text-text-primary\">\n <MapPin className=\"h-5 w-5\" />\n Service Areas\n </h2>\n {areas.length > 0 ? (\n <div className=\"flex flex-wrap gap-2\">\n {areas.map((area, i) => (\n <span key={i} className=\"rounded-full bg-bg-sunken px-3 py-1 text-xs text-text-primary\">\n {area}\n </span>\n ))}\n </div>\n ) : (\n <p className=\"text-sm text-text-secondary\">Service areas not specified — ask the provider directly.</p>\n )}\n </GlassCard>\n </div>\n\n {/* Provider card */}\n <div className=\"space-y-6\">\n <GlassCard treatment=\"plain\" className=\"border-border-seam p-5\">\n <h3 className=\"mb-4 text-base font-semibold text-text-primary\">Provider</h3>\n <dl className=\"space-y-3 text-sm\">\n <div className=\"flex items-center justify-between\">\n <dt className=\"text-text-secondary\">Name</dt>\n <dd className=\"font-medium text-text-primary\">{service.providerName}</dd>\n </div>\n <div className=\"flex items-center justify-between\">\n <dt className=\"text-text-secondary\">Category</dt>\n <dd className=\"font-medium capitalize text-text-primary\">{service.category.replace(/_/g, ' ')}</dd>\n </div>\n <div className=\"flex items-center justify-between\">\n <dt className=\"text-text-secondary\">Price Range</dt>\n <dd className=\"font-medium text-text-primary\">{service.priceRange ?? '—'}</dd>\n </div>\n <div className=\"flex items-center justify-between\">\n <dt className=\"text-text-secondary\">Verified</dt>\n <dd>\n {service.verified ? (\n <span className=\"inline-flex items-center gap-1 text-status-success-text\">\n <CheckCircle className=\"h-4 w-4\" />\n Yes\n </span>\n ) : (\n <span className=\"text-text-secondary\">Not verified</span>\n )}\n </dd>\n </div>\n </dl>\n <Button\n type=\"button\"\n variant=\"default\"\n className=\"mt-4 w-full justify-center\"\n onClick={() => setContactOpen(true)}\n >\n <Phone className=\"mr-1.5 h-4 w-4\" />\n Contact provider\n </Button>\n </GlassCard>\n </div>\n </div>\n\n {/* Reviews — real, backed by EntityComments */}\n <ReviewsSection\n entityId={service.id}\n entityType=\"housingvista-marketplace-service\"\n aggregateRating={service.rating}\n reviewCount={service.reviewCount}\n />\n\n <ContactOwnerDialog\n open={contactOpen}\n onOpenChange={setContactOpen}\n entityId={service.id}\n entityType=\"housingvista-marketplace-service\"\n title={service.name}\n pagePath={location.pathname}\n heading={`Contact ${service.providerName}`}\n description={`Start a conversation about ${service.name}. Messages are saved and delivered in your inbox.`}\n />\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ServiceDetailPage.js","names":[],"sources":["../../../../src/housingvista/pages/marketplace/ServiceDetailPage.tsx"],"sourcesContent":["/**\n * HousingVista Marketplace Service Detail Page\n * Single service provider backed by `housingvistaMarketplaceService(id)` —\n * rating, review count, response time, service areas, verified status.\n *\n * \"Contact\" opens the real `ContactOwnerDialog` — a persisted conversation with\n * the provider. Reviews are real, backed by EntityComments; the denormalized\n * rating/reviewCount stays for at-a-glance display.\n * @module housingvista\n */\n\nimport { useState } from 'react';\nimport { useNavigate, useParams, useLocation } from 'react-router-dom';\nimport {\n ArrowLeft,\n Star,\n MapPin,\n Clock,\n CheckCircle,\n MessageCircle,\n Phone,\n Wrench,\n Zap,\n SprayCanIcon,\n Paintbrush,\n Shield,\n ShieldCheck,\n Trees,\n Users,\n} from 'lucide-react';\nimport { Button, EmphasisPanel, GlassCard, PagePurpose } from '@burdenoff/fe-libs/ui';\nimport {\n Breadcrumbs,\n StatusBadge,\n EmptyState,\n LoadingSkeleton,\n ContactOwnerDialog,\n ReviewsSection,\n} from '../../components';\nimport type { BreadcrumbItem } from '../../components';\nimport { useMarketplaceService } from '../../hooks';\nimport { cn } from '../../utils/helpers';\nimport { useTrackPageView } from '../../hooks/useHousingVistaAnalytics';\n\nfunction getCategoryIcon(category: string) {\n switch (category) {\n case 'repair':\n return <Wrench className=\"h-5 w-5\" />;\n case 'maintenance':\n return <Zap className=\"h-5 w-5\" />;\n case 'cleaning':\n return <SprayCanIcon className=\"h-5 w-5\" />;\n case 'renovation':\n return <Paintbrush className=\"h-5 w-5\" />;\n case 'security':\n return <Shield className=\"h-5 w-5\" />;\n case 'landscaping':\n return <Trees className=\"h-5 w-5\" />;\n case 'pest_control':\n return <ShieldCheck className=\"h-5 w-5\" />;\n default:\n return <Wrench className=\"h-5 w-5\" />;\n }\n}\n\nfunction RatingStars({ rating }: { rating: number }) {\n return (\n <div className=\"flex items-center gap-0.5 text-status-warning-text\">\n {Array.from({ length: 5 }).map((_, i) => (\n <Star\n key={i}\n className={cn(\n 'h-4 w-4',\n i < Math.floor(rating)\n ? 'fill-current'\n : i < rating\n ? 'fill-current opacity-50'\n : 'fill-none text-text-secondary/30'\n )}\n />\n ))}\n </div>\n );\n}\n\nexport function ServiceDetailPage() {\n const { id } = useParams<{ id: string }>();\n\n useTrackPageView('housingvista.marketplace.viewed', id);\n const navigate = useNavigate();\n const location = useLocation();\n const [contactOpen, setContactOpen] = useState(false);\n const { data: service, loading } = useMarketplaceService(id);\n\n if (loading) {\n return (\n <div className=\"p-6\">\n <LoadingSkeleton variant=\"detail\" />\n </div>\n );\n }\n\n if (!service) {\n return (\n <div className=\"p-6\">\n <EmptyState\n illustration=\"empty-search\"\n icon={<Users className=\"h-12 w-12\" />}\n title=\"Service Not Found\"\n description=\"The service provider you're looking for doesn't exist or is no longer listed.\"\n action={\n <button\n onClick={() => navigate('../marketplace')}\n className=\"inline-flex items-center gap-2 rounded-md bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text transition-colors hover:bg-action-primary-bg-hover\"\n >\n <ArrowLeft className=\"h-4 w-4\" />\n Back to Marketplace\n </button>\n }\n />\n </div>\n );\n }\n\n const areas = service.availableAreas ?? [];\n const breadcrumbs: BreadcrumbItem[] = [{ label: 'Marketplace', href: '../' }, { label: service.name }];\n\n return (\n <div className=\"flex flex-col gap-6 p-6\">\n <Breadcrumbs items={breadcrumbs} />\n\n {/* Header */}\n <div className=\"flex flex-col gap-4 lg:flex-row lg:items-start lg:justify-between\">\n <div className=\"flex items-start gap-4\">\n <div className=\"flex h-12 w-12 shrink-0 items-center justify-center rounded-lg bg-bg-sunken text-text-secondary\">\n {getCategoryIcon(service.category)}\n </div>\n <div>\n <button\n onClick={() => navigate('../marketplace')}\n className=\"mb-2 inline-flex items-center gap-2 rounded-md px-2 py-1 text-sm text-text-secondary transition-colors hover:bg-bg-sunken hover:text-text-primary\"\n >\n <ArrowLeft className=\"h-4 w-4\" />\n Back to Marketplace\n </button>\n <h1 className=\"text-2xl font-semibold text-text-primary\">{service.name}</h1>\n <div className=\"mt-2 flex flex-wrap items-center gap-2\">\n <StatusBadge label={service.category.replace(/_/g, ' ')} variant=\"muted\" />\n {service.verified && <StatusBadge label=\"Verified\" variant=\"success\" dot />}\n {service.featured && <StatusBadge label=\"Featured\" variant=\"warning\" />}\n <span className=\"text-sm text-text-secondary\">{service.providerName}</span>\n </div>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <Button type=\"button\" variant=\"default\" onClick={() => setContactOpen(true)}>\n <MessageCircle className=\"mr-1.5 h-4 w-4\" />\n Contact\n </Button>\n </div>\n </div>\n\n <PagePurpose className=\"max-w-3xl\">\n Everything you need to decide whether to hire this provider — their rating and reviews, how fast they respond,\n the areas they cover, and whether they're verified. When you're ready, contact them through Messages.\n </PagePurpose>\n\n {/* Key facts — primary insight zone (one EmphasisPanel per page) */}\n <EmphasisPanel className=\"p-4\">\n <div className=\"grid grid-cols-2 gap-4 lg:grid-cols-4\">\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4\">\n <div className=\"flex items-center gap-2 text-text-secondary\">\n <Star className=\"h-4 w-4\" />\n <span className=\"text-xs font-medium\">Rating</span>\n </div>\n <div className=\"mt-2 flex items-center gap-2\">\n <span className=\"text-xl font-bold text-text-primary\">{service.rating ?? '—'}</span>\n {service.rating != null && <RatingStars rating={service.rating} />}\n </div>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4\">\n <div className=\"flex items-center gap-2 text-text-secondary\">\n <Users className=\"h-4 w-4\" />\n <span className=\"text-xs font-medium\">Reviews</span>\n </div>\n <div className=\"mt-2 text-xl font-bold text-text-primary\">{service.reviewCount}</div>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4\">\n <div className=\"flex items-center gap-2 text-text-secondary\">\n <Clock className=\"h-4 w-4\" />\n <span className=\"text-xs font-medium\">Response Time</span>\n </div>\n <div className=\"mt-2 text-sm font-bold text-text-primary\">{service.responseTime ?? '—'}</div>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4\">\n <div className=\"flex items-center gap-2 text-text-secondary\">\n <MapPin className=\"h-4 w-4\" />\n <span className=\"text-xs font-medium\">Coverage</span>\n </div>\n <div className=\"mt-2 text-sm font-bold text-text-primary\">\n {areas.length} area{areas.length !== 1 ? 's' : ''}\n </div>\n </div>\n </div>\n </EmphasisPanel>\n\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-3\">\n {/* Overview */}\n <div className=\"space-y-6 lg:col-span-2\">\n {service.imageUrl && (\n <div className=\"overflow-hidden rounded-xl border border-border-subtle\">\n <img src={service.imageUrl} alt={service.name} className=\"h-64 w-full object-cover\" />\n </div>\n )}\n\n {service.description && (\n <GlassCard treatment=\"plain\" className=\"border-border-seam p-6\">\n <h2 className=\"mb-3 text-base font-semibold text-text-primary\">About this provider</h2>\n <p className=\"text-sm leading-relaxed text-text-secondary\">{service.description}</p>\n </GlassCard>\n )}\n\n <GlassCard treatment=\"plain\" className=\"border-border-seam p-6\">\n <h2 className=\"mb-4 flex items-center gap-2 text-base font-semibold text-text-primary\">\n <MapPin className=\"h-5 w-5\" />\n Service Areas\n </h2>\n {areas.length > 0 ? (\n <div className=\"flex flex-wrap gap-2\">\n {areas.map((area, i) => (\n <span key={i} className=\"rounded-full bg-bg-sunken px-3 py-1 text-xs text-text-primary\">\n {area}\n </span>\n ))}\n </div>\n ) : (\n <p className=\"text-sm text-text-secondary\">Service areas not specified — ask the provider directly.</p>\n )}\n </GlassCard>\n </div>\n\n {/* Provider card */}\n <div className=\"space-y-6\">\n <GlassCard treatment=\"plain\" className=\"border-border-seam p-5\">\n <h3 className=\"mb-4 text-base font-semibold text-text-primary\">Provider</h3>\n <dl className=\"space-y-3 text-sm\">\n <div className=\"flex items-center justify-between\">\n <dt className=\"text-text-secondary\">Name</dt>\n <dd className=\"font-medium text-text-primary\">{service.providerName}</dd>\n </div>\n <div className=\"flex items-center justify-between\">\n <dt className=\"text-text-secondary\">Category</dt>\n <dd className=\"font-medium capitalize text-text-primary\">{service.category.replace(/_/g, ' ')}</dd>\n </div>\n <div className=\"flex items-center justify-between\">\n <dt className=\"text-text-secondary\">Price Range</dt>\n <dd className=\"font-medium text-text-primary\">{service.priceRange ?? '—'}</dd>\n </div>\n <div className=\"flex items-center justify-between\">\n <dt className=\"text-text-secondary\">Verified</dt>\n <dd>\n {service.verified ? (\n <span className=\"inline-flex items-center gap-1 text-status-success-text\">\n <CheckCircle className=\"h-4 w-4\" />\n Yes\n </span>\n ) : (\n <span className=\"text-text-secondary\">Not verified</span>\n )}\n </dd>\n </div>\n </dl>\n <Button\n type=\"button\"\n variant=\"default\"\n className=\"mt-4 w-full justify-center\"\n onClick={() => setContactOpen(true)}\n >\n <Phone className=\"mr-1.5 h-4 w-4\" />\n Contact provider\n </Button>\n </GlassCard>\n </div>\n </div>\n\n {/* Reviews — real, backed by EntityComments */}\n <ReviewsSection\n entityId={service.id}\n entityType=\"housingvista-marketplace-service\"\n aggregateRating={service.rating}\n reviewCount={service.reviewCount}\n />\n\n <ContactOwnerDialog\n open={contactOpen}\n onOpenChange={setContactOpen}\n entityId={service.id}\n entityType=\"housingvista-marketplace-service\"\n title={service.name}\n pagePath={location.pathname}\n heading={`Contact ${service.providerName}`}\n description={`Start a conversation about ${service.name}. Messages are saved and delivered in your inbox.`}\n />\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OffersPage.d.ts","sourceRoot":"","sources":["../../../../src/housingvista/pages/offers/OffersPage.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"OffersPage.d.ts","sourceRoot":"","sources":["../../../../src/housingvista/pages/offers/OffersPage.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAqIH,wBAAgB,UAAU,gCAwSzB"}
|