@burdenoff/microfe-store 2026.805.1 → 2026.819.2

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 (67) hide show
  1. package/dist/StoreAdminRoutes.js +27 -27
  2. package/dist/StoreRoot.js +78 -45
  3. package/dist/StoreRoot.js.map +1 -1
  4. package/dist/StoreRoutes.js +163 -85
  5. package/dist/StoreRoutes.js.map +1 -1
  6. package/dist/components/sourcing/SourcingConfirmationDialog.d.ts +15 -0
  7. package/dist/components/sourcing/SourcingConfirmationDialog.js +61 -0
  8. package/dist/components/sourcing/SourcingConfirmationDialog.js.map +1 -0
  9. package/dist/components/sourcing/SourcingUi.d.ts +51 -0
  10. package/dist/components/sourcing/SourcingUi.js +176 -0
  11. package/dist/components/sourcing/SourcingUi.js.map +1 -0
  12. package/dist/generated/global-operations.d.ts +713 -0
  13. package/dist/generated/global-operations.js +557 -175
  14. package/dist/generated/global-operations.js.map +1 -1
  15. package/dist/generated/global-types.d.ts +2152 -2159
  16. package/dist/generated/global-types.js +8 -2
  17. package/dist/generated/global-types.js.map +1 -1
  18. package/dist/hooks/useBackendCart.js +17 -17
  19. package/dist/hooks/useInstallations.js +32 -32
  20. package/dist/hooks/useOrders.js +7 -7
  21. package/dist/hooks/useSourcing.d.ts +319 -0
  22. package/dist/hooks/useSourcing.js +87 -0
  23. package/dist/hooks/useSourcing.js.map +1 -0
  24. package/dist/hooks/useStoreGraphQL.js +163 -163
  25. package/dist/index.js +12 -12
  26. package/dist/pages/AdminDashboardPage.js +132 -132
  27. package/dist/pages/AdminReviewModerationPage.js +55 -55
  28. package/dist/pages/AdminStoresPage.js +95 -95
  29. package/dist/pages/AdminSubmissionsQueuePage.js +297 -297
  30. package/dist/pages/AdminSubmissionsQueuePage.js.map +1 -1
  31. package/dist/pages/AppDetailPage.js +65 -65
  32. package/dist/pages/AppSettingsPage.js +32 -32
  33. package/dist/pages/CartPage.js +66 -66
  34. package/dist/pages/CreateSourcingRequestPage.d.ts +3 -0
  35. package/dist/pages/CreateSourcingRequestPage.js +439 -0
  36. package/dist/pages/CreateSourcingRequestPage.js.map +1 -0
  37. package/dist/pages/InstalledAppsPage.js +15 -15
  38. package/dist/pages/InstalledAppsPage.js.map +1 -1
  39. package/dist/pages/MarketplaceHomePage.js +384 -384
  40. package/dist/pages/MarketplaceHomePage.js.map +1 -1
  41. package/dist/pages/MyLicensesPage.js +39 -39
  42. package/dist/pages/OrderConfirmationPage.js +57 -57
  43. package/dist/pages/OrdersPage.js +3 -3
  44. package/dist/pages/OrdersPage.js.map +1 -1
  45. package/dist/pages/ProductDetailPage.js +6 -6
  46. package/dist/pages/SellerSourcingOffersPage.d.ts +3 -0
  47. package/dist/pages/SellerSourcingOffersPage.js +284 -0
  48. package/dist/pages/SellerSourcingOffersPage.js.map +1 -0
  49. package/dist/pages/SellerSourcingOpportunitiesPage.d.ts +3 -0
  50. package/dist/pages/SellerSourcingOpportunitiesPage.js +272 -0
  51. package/dist/pages/SellerSourcingOpportunitiesPage.js.map +1 -0
  52. package/dist/pages/SellerSourcingOpportunityDetailPage.d.ts +3 -0
  53. package/dist/pages/SellerSourcingOpportunityDetailPage.js +465 -0
  54. package/dist/pages/SellerSourcingOpportunityDetailPage.js.map +1 -0
  55. package/dist/pages/SourcingRequestDetailPage.d.ts +3 -0
  56. package/dist/pages/SourcingRequestDetailPage.js +447 -0
  57. package/dist/pages/SourcingRequestDetailPage.js.map +1 -0
  58. package/dist/pages/SourcingRequestsPage.d.ts +3 -0
  59. package/dist/pages/SourcingRequestsPage.js +272 -0
  60. package/dist/pages/SourcingRequestsPage.js.map +1 -0
  61. package/dist/providers/SourcingAccessProvider.d.ts +21 -0
  62. package/dist/providers/SourcingAccessProvider.js +95 -0
  63. package/dist/providers/SourcingAccessProvider.js.map +1 -0
  64. package/dist/translations/en.d.ts +3 -0
  65. package/dist/translations/en.js +3 -0
  66. package/dist/translations/en.js.map +1 -1
  67. package/package.json +1 -1
@@ -0,0 +1,447 @@
1
+ import { useStore as e } from "../providers/StoreProvider.js";
2
+ import { useSourcingApi as t } from "../hooks/useSourcing.js";
3
+ import { SourcingOfferStatus as n, SourcingRequestStatus as r } from "../generated/global-types.js";
4
+ import { ContextRequiredPanel as i, SourcingEmptyState as ee, SourcingErrorState as te, SourcingLoadingState as ne, SourcingPageHeader as re, SourcingStatusBadge as a, dangerButtonClassName as o, formatDate as s, formatDateTime as c, formatLocation as ie, formatMoney as l, formatSourcingUnit as u, joinStorePath as d, primaryButtonClassName as f, secondaryButtonClassName as p, toErrorMessage as m } from "../components/sourcing/SourcingUi.js";
5
+ import { SourcingConfirmationDialog as h } from "../components/sourcing/SourcingConfirmationDialog.js";
6
+ import { useCallback as g, useEffect as _, useMemo as v, useRef as ae, useState as y } from "react";
7
+ import { useNavigate as oe, useParams as se } from "react-router";
8
+ import { BadgeCheck as ce, CalendarDays as le, Check as ue, CircleDollarSign as de, FileText as b, MapPin as x, PackageSearch as fe, Receipt as pe, ShoppingBag as S, Trash2 as me, UserRound as he } from "lucide-react";
9
+ import { Fragment as C, jsx as w, jsxs as T } from "react/jsx-runtime";
10
+ import { EmphasisPanel as ge, GlassCard as E, PagePurpose as D } from "@burdenoff/fe-libs/ui";
11
+ //#region src/pages/SourcingRequestDetailPage.tsx
12
+ var O = () => {
13
+ let O = oe(), { requestId: k } = se(), { basePath: A } = e(), { hasOrganizationContext: j, getBuyerRequest: M, acceptOffer: N, cancelBuyerRequest: P } = t(), [F, I] = y(null), [L, R] = y(!1), [z, B] = y(null), [V, H] = y(null), [U, W] = y(null), [_e, G] = y(!1), [K, q] = y(!1), [ve, ye] = y(null), J = ae(null), be = d(A, "sourcing/requests"), Y = g(async () => {
14
+ if (!(!j || !k)) {
15
+ R(!0), B(null);
16
+ try {
17
+ let e = await M(k);
18
+ I(e), e || B("This sourcing request was not found in the active organization.");
19
+ } catch (e) {
20
+ B(m(e, "The sourcing request could not be loaded."));
21
+ } finally {
22
+ R(!1);
23
+ }
24
+ }
25
+ }, [
26
+ M,
27
+ j,
28
+ k
29
+ ]);
30
+ _(() => {
31
+ Y();
32
+ }, [Y]);
33
+ let X = () => {
34
+ W(null), window.requestAnimationFrame(() => J.current?.focus());
35
+ }, Z = v(() => {
36
+ if (!F) return [];
37
+ let e = {
38
+ [n.Accepted]: 0,
39
+ [n.Active]: 1,
40
+ [n.Rejected]: 2
41
+ };
42
+ return [...F.offers].sort((t, n) => e[t.status] - e[n.status]);
43
+ }, [F]), Q = U ? Z.find((e) => e.id === U) : void 0, xe = async (e) => {
44
+ if (!K) {
45
+ q(!0), H(null);
46
+ try {
47
+ ye(await N(e)), W(null), await Y();
48
+ } catch (e) {
49
+ X(), H(m(e, "This offer could not be accepted. The request may already have been matched."));
50
+ } finally {
51
+ q(!1);
52
+ }
53
+ }
54
+ }, Se = async () => {
55
+ if (!(!F || K)) {
56
+ q(!0), H(null);
57
+ try {
58
+ await P(F.id), G(!1), await Y();
59
+ } catch (e) {
60
+ G(!1), H(m(e, "This sourcing request could not be canceled."));
61
+ } finally {
62
+ q(!1);
63
+ }
64
+ }
65
+ }, $ = ve ?? F?.acceptedOrder ?? null;
66
+ return /* @__PURE__ */ T("div", {
67
+ className: "min-h-full bg-surface-default",
68
+ children: [
69
+ /* @__PURE__ */ w(re, {
70
+ title: F?.productName ?? "Sourcing request",
71
+ description: "Review request details and compare offers visible only to the owning buyer organization.",
72
+ icon: /* @__PURE__ */ w(b, {
73
+ className: "size-5",
74
+ "aria-hidden": "true"
75
+ }),
76
+ onBack: () => O(be),
77
+ actions: F?.status === r.Open ? /* @__PURE__ */ T("button", {
78
+ type: "button",
79
+ onClick: () => G(!0),
80
+ disabled: K,
81
+ className: o,
82
+ children: [/* @__PURE__ */ w(me, {
83
+ className: "size-4",
84
+ "aria-hidden": "true"
85
+ }), "Cancel request"]
86
+ }) : void 0
87
+ }),
88
+ /* @__PURE__ */ w(h, {
89
+ open: _e,
90
+ title: "Cancel this open request?",
91
+ description: "Publishers will no longer be able to discover it or submit offers. Existing active offers will be rejected. This action cannot be undone.",
92
+ confirmLabel: "Confirm cancellation",
93
+ cancelLabel: "Keep request open",
94
+ busy: K,
95
+ destructive: !0,
96
+ onConfirm: () => void Se(),
97
+ onCancel: () => G(!1)
98
+ }),
99
+ /* @__PURE__ */ w(h, {
100
+ open: !!Q,
101
+ title: "Accept this offer?",
102
+ description: Q ? /* @__PURE__ */ T(C, { children: [
103
+ "Accept ",
104
+ Q.publisher?.name ?? "this verified publisher",
105
+ "’s offer for",
106
+ " ",
107
+ Q.quantity.toLocaleString(),
108
+ " ",
109
+ u(Q.unit),
110
+ " ",
111
+ "at ",
112
+ l(Q.unitPrice, Q.currency),
113
+ " per",
114
+ " ",
115
+ u(Q.unit),
116
+ "? Store will calculate the authoritative total from this persisted offer, create one unpaid order, and reject all competing offers. You cannot choose another offer afterward."
117
+ ] }) : null,
118
+ confirmLabel: "Confirm and create order",
119
+ cancelLabel: "Not yet",
120
+ busy: K,
121
+ onConfirm: () => {
122
+ Q && xe(Q.id);
123
+ },
124
+ onCancel: X
125
+ }),
126
+ /* @__PURE__ */ w("main", {
127
+ className: "mx-auto max-w-6xl px-4 py-6 sm:px-6",
128
+ children: j ? L && !F ? /* @__PURE__ */ w(ne, { label: "Loading request and offers…" }) : z && !F ? /* @__PURE__ */ w(te, {
129
+ title: "Sourcing request unavailable",
130
+ message: z,
131
+ onRetry: k ? () => void Y() : void 0
132
+ }) : F ? /* @__PURE__ */ T(C, { children: [
133
+ /* @__PURE__ */ w(D, {
134
+ className: "mb-6",
135
+ children: "Compare the seller's unit price, promised delivery date, and message. Acceptance is atomic: Store claims this open request, creates exactly one order from the persisted offer, accepts the winner, and rejects every sibling offer."
136
+ }),
137
+ V ? /* @__PURE__ */ w("div", {
138
+ role: "alert",
139
+ className: "mb-5 rounded-lg border border-border-danger bg-surface-danger-muted px-4 py-3 text-sm text-text-danger",
140
+ children: V
141
+ }) : null,
142
+ $ ? /* @__PURE__ */ w(ge, {
143
+ className: "mb-6",
144
+ children: /* @__PURE__ */ T("div", {
145
+ "aria-live": "polite",
146
+ className: "flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between",
147
+ children: [/* @__PURE__ */ T("div", {
148
+ className: "flex items-start gap-3",
149
+ children: [/* @__PURE__ */ w("span", {
150
+ className: "flex size-10 shrink-0 items-center justify-center rounded-full bg-status-success-bg-subtle text-status-success-text",
151
+ children: /* @__PURE__ */ w(ue, {
152
+ className: "size-5",
153
+ "aria-hidden": "true"
154
+ })
155
+ }), /* @__PURE__ */ T("div", { children: [/* @__PURE__ */ w("h2", {
156
+ className: "font-semibold text-text-primary",
157
+ children: "Offer accepted and order created"
158
+ }), /* @__PURE__ */ T("p", {
159
+ className: "mt-1 text-sm text-text-secondary",
160
+ children: [
161
+ "Order ",
162
+ $.id,
163
+ " · ",
164
+ l($.total, $.currency),
165
+ " ·",
166
+ " ",
167
+ $.status
168
+ ]
169
+ })] })]
170
+ }), /* @__PURE__ */ T("div", {
171
+ className: "flex flex-wrap gap-2",
172
+ children: [$.status === "PENDING" ? /* @__PURE__ */ T("button", {
173
+ type: "button",
174
+ onClick: () => O(`/billing/checkout/store/${$.id}`),
175
+ className: f,
176
+ children: [/* @__PURE__ */ w(S, {
177
+ className: "size-4",
178
+ "aria-hidden": "true"
179
+ }), "Continue to checkout"]
180
+ }) : null, /* @__PURE__ */ T("button", {
181
+ type: "button",
182
+ onClick: () => O(d(A, "orders")),
183
+ className: p,
184
+ children: [/* @__PURE__ */ w(pe, {
185
+ className: "size-4",
186
+ "aria-hidden": "true"
187
+ }), "View my orders"]
188
+ })]
189
+ })]
190
+ })
191
+ }) : null,
192
+ /* @__PURE__ */ T("div", {
193
+ className: "grid gap-6 lg:grid-cols-[minmax(0,2fr)_minmax(280px,1fr)]",
194
+ children: [/* @__PURE__ */ T(E, {
195
+ className: "p-5 sm:p-6",
196
+ children: [
197
+ /* @__PURE__ */ T("div", {
198
+ className: "flex flex-wrap items-start justify-between gap-3",
199
+ children: [/* @__PURE__ */ T("div", { children: [/* @__PURE__ */ w("p", {
200
+ className: "text-sm font-medium text-text-accent",
201
+ children: F.category
202
+ }), /* @__PURE__ */ w("h2", {
203
+ className: "mt-1 text-xl font-semibold text-text-primary",
204
+ children: F.productName
205
+ })] }), /* @__PURE__ */ w(a, { status: F.status })]
206
+ }),
207
+ F.summary ? /* @__PURE__ */ w("p", {
208
+ className: "mt-4 whitespace-pre-wrap text-sm leading-6 text-text-secondary",
209
+ children: F.summary
210
+ }) : null,
211
+ /* @__PURE__ */ T("dl", {
212
+ className: "mt-6 grid gap-5 border-t border-border-seam pt-5 sm:grid-cols-2",
213
+ children: [
214
+ /* @__PURE__ */ T("div", {
215
+ className: "flex gap-3",
216
+ children: [/* @__PURE__ */ w(fe, {
217
+ className: "mt-0.5 size-5 shrink-0 text-text-tertiary",
218
+ "aria-hidden": "true"
219
+ }), /* @__PURE__ */ T("div", { children: [/* @__PURE__ */ w("dt", {
220
+ className: "text-xs text-text-tertiary",
221
+ children: "Quantity"
222
+ }), /* @__PURE__ */ T("dd", {
223
+ className: "mt-0.5 font-medium text-text-primary",
224
+ children: [
225
+ F.quantity.toLocaleString(),
226
+ " ",
227
+ u(F.unit)
228
+ ]
229
+ })] })]
230
+ }),
231
+ /* @__PURE__ */ T("div", {
232
+ className: "flex gap-3",
233
+ children: [/* @__PURE__ */ w(de, {
234
+ className: "mt-0.5 size-5 shrink-0 text-text-tertiary",
235
+ "aria-hidden": "true"
236
+ }), /* @__PURE__ */ T("div", { children: [/* @__PURE__ */ w("dt", {
237
+ className: "text-xs text-text-tertiary",
238
+ children: "Target unit price"
239
+ }), /* @__PURE__ */ w("dd", {
240
+ className: "mt-0.5 font-medium text-text-primary",
241
+ children: l(F.targetUnitPrice, F.targetCurrency)
242
+ })] })]
243
+ }),
244
+ /* @__PURE__ */ T("div", {
245
+ className: "flex gap-3",
246
+ children: [/* @__PURE__ */ w(le, {
247
+ className: "mt-0.5 size-5 shrink-0 text-text-tertiary",
248
+ "aria-hidden": "true"
249
+ }), /* @__PURE__ */ T("div", { children: [/* @__PURE__ */ w("dt", {
250
+ className: "text-xs text-text-tertiary",
251
+ children: "Delivery window"
252
+ }), /* @__PURE__ */ T("dd", {
253
+ className: "mt-0.5 font-medium text-text-primary",
254
+ children: [
255
+ c(F.deliveryWindowStart),
256
+ " –",
257
+ " ",
258
+ c(F.deliveryWindowEnd)
259
+ ]
260
+ })] })]
261
+ }),
262
+ /* @__PURE__ */ T("div", {
263
+ className: "flex gap-3",
264
+ children: [/* @__PURE__ */ w(x, {
265
+ className: "mt-0.5 size-5 shrink-0 text-text-tertiary",
266
+ "aria-hidden": "true"
267
+ }), /* @__PURE__ */ T("div", { children: [/* @__PURE__ */ w("dt", {
268
+ className: "text-xs text-text-tertiary",
269
+ children: "Destination"
270
+ }), /* @__PURE__ */ w("dd", {
271
+ className: "mt-0.5 font-medium text-text-primary",
272
+ children: ie({
273
+ country: F.deliveryCountry,
274
+ region: F.deliveryRegion,
275
+ city: F.deliveryCity
276
+ })
277
+ })] })]
278
+ })
279
+ ]
280
+ })
281
+ ]
282
+ }), /* @__PURE__ */ T(E, {
283
+ className: "p-5",
284
+ children: [/* @__PURE__ */ w("h2", {
285
+ className: "font-semibold text-text-primary",
286
+ children: "Request timeline"
287
+ }), /* @__PURE__ */ T("dl", {
288
+ className: "mt-4 space-y-4 text-sm",
289
+ children: [
290
+ /* @__PURE__ */ T("div", { children: [/* @__PURE__ */ w("dt", {
291
+ className: "text-text-tertiary",
292
+ children: "Created"
293
+ }), /* @__PURE__ */ w("dd", {
294
+ className: "font-medium text-text-primary",
295
+ children: c(F.createdAt)
296
+ })] }),
297
+ /* @__PURE__ */ T("div", { children: [/* @__PURE__ */ w("dt", {
298
+ className: "text-text-tertiary",
299
+ children: "Last updated"
300
+ }), /* @__PURE__ */ w("dd", {
301
+ className: "font-medium text-text-primary",
302
+ children: c(F.updatedAt)
303
+ })] }),
304
+ F.matchedAt ? /* @__PURE__ */ T("div", { children: [/* @__PURE__ */ w("dt", {
305
+ className: "text-text-tertiary",
306
+ children: "Matched"
307
+ }), /* @__PURE__ */ w("dd", {
308
+ className: "font-medium text-text-primary",
309
+ children: c(F.matchedAt)
310
+ })] }) : null,
311
+ F.canceledAt ? /* @__PURE__ */ T("div", { children: [/* @__PURE__ */ w("dt", {
312
+ className: "text-text-tertiary",
313
+ children: "Canceled"
314
+ }), /* @__PURE__ */ w("dd", {
315
+ className: "font-medium text-text-primary",
316
+ children: c(F.canceledAt)
317
+ })] }) : null
318
+ ]
319
+ })]
320
+ })]
321
+ }),
322
+ /* @__PURE__ */ T("section", {
323
+ "aria-labelledby": "sourcing-offers-heading",
324
+ className: "mt-8",
325
+ children: [/* @__PURE__ */ T("div", {
326
+ className: "flex flex-wrap items-end justify-between gap-3",
327
+ children: [/* @__PURE__ */ T("div", { children: [/* @__PURE__ */ w("h2", {
328
+ id: "sourcing-offers-heading",
329
+ className: "text-xl font-semibold text-text-primary",
330
+ children: "Publisher offers"
331
+ }), /* @__PURE__ */ T("p", {
332
+ className: "mt-1 text-sm text-text-secondary",
333
+ children: [
334
+ Z.length,
335
+ " ",
336
+ Z.length === 1 ? "offer" : "offers",
337
+ " received"
338
+ ]
339
+ })] }), /* @__PURE__ */ w("button", {
340
+ type: "button",
341
+ onClick: () => void Y(),
342
+ disabled: L || K,
343
+ className: p,
344
+ children: "Refresh offers"
345
+ })]
346
+ }), Z.length === 0 ? /* @__PURE__ */ w("div", {
347
+ className: "mt-5",
348
+ children: /* @__PURE__ */ w(ee, {
349
+ title: F.status === r.Open ? "No offers yet" : "No offers were received",
350
+ description: F.status === r.Open ? "Eligible verified publishers can discover this request while it remains open." : "This request closed without any publisher offers."
351
+ })
352
+ }) : /* @__PURE__ */ w("ul", {
353
+ className: "mt-5 grid gap-4 lg:grid-cols-2",
354
+ children: Z.map((e) => {
355
+ let t = F.status === r.Open && e.status === n.Active;
356
+ return /* @__PURE__ */ w("li", { children: /* @__PURE__ */ T(E, {
357
+ className: "h-full p-5",
358
+ children: [
359
+ /* @__PURE__ */ T("div", {
360
+ className: "flex items-start justify-between gap-3",
361
+ children: [/* @__PURE__ */ T("div", {
362
+ className: "flex min-w-0 items-center gap-3",
363
+ children: [e.publisher?.logoUrl ? /* @__PURE__ */ w("img", {
364
+ src: e.publisher.logoUrl,
365
+ alt: "",
366
+ className: "size-11 shrink-0 rounded-lg object-cover"
367
+ }) : /* @__PURE__ */ w("span", {
368
+ className: "flex size-11 shrink-0 items-center justify-center rounded-lg bg-surface-muted text-text-tertiary",
369
+ children: /* @__PURE__ */ w(he, {
370
+ className: "size-5",
371
+ "aria-hidden": "true"
372
+ })
373
+ }), /* @__PURE__ */ T("div", {
374
+ className: "min-w-0",
375
+ children: [/* @__PURE__ */ T("div", {
376
+ className: "flex items-center gap-1.5",
377
+ children: [/* @__PURE__ */ w("h3", {
378
+ className: "truncate font-semibold text-text-primary",
379
+ children: e.publisher?.name ?? "Verified publisher"
380
+ }), e.publisher?.isVerified ? /* @__PURE__ */ w(ce, {
381
+ className: "size-4 shrink-0 text-text-accent",
382
+ "aria-label": "Verified publisher"
383
+ }) : null]
384
+ }), /* @__PURE__ */ T("p", {
385
+ className: "text-xs text-text-tertiary",
386
+ children: ["Offered ", s(e.createdAt)]
387
+ })]
388
+ })]
389
+ }), /* @__PURE__ */ w(a, { status: e.status })]
390
+ }),
391
+ /* @__PURE__ */ T("dl", {
392
+ className: "mt-5 grid grid-cols-2 gap-4 text-sm",
393
+ children: [/* @__PURE__ */ T("div", { children: [/* @__PURE__ */ w("dt", {
394
+ className: "text-xs text-text-tertiary",
395
+ children: "Unit price"
396
+ }), /* @__PURE__ */ w("dd", {
397
+ className: "mt-0.5 text-lg font-semibold text-text-primary",
398
+ children: l(e.unitPrice, e.currency)
399
+ })] }), /* @__PURE__ */ T("div", { children: [/* @__PURE__ */ w("dt", {
400
+ className: "text-xs text-text-tertiary",
401
+ children: "Delivery date"
402
+ }), /* @__PURE__ */ w("dd", {
403
+ className: "mt-0.5 font-medium text-text-primary",
404
+ children: c(e.deliveryDate)
405
+ })] })]
406
+ }),
407
+ e.message ? /* @__PURE__ */ w("p", {
408
+ className: "mt-4 rounded-lg bg-surface-muted p-3 text-sm leading-6 text-text-secondary",
409
+ children: e.message
410
+ }) : null,
411
+ t ? /* @__PURE__ */ T("button", {
412
+ type: "button",
413
+ onClick: (t) => {
414
+ J.current = t.currentTarget, H(null), W(e.id);
415
+ },
416
+ className: `${f} mt-5 w-full`,
417
+ children: [/* @__PURE__ */ w(S, {
418
+ className: "size-4",
419
+ "aria-hidden": "true"
420
+ }), "Accept offer"]
421
+ }) : e.order ? /* @__PURE__ */ T("div", {
422
+ className: "mt-5 rounded-lg border border-status-success-border bg-status-success-bg-subtle px-4 py-3 text-sm text-status-success-text",
423
+ children: [
424
+ "Order ",
425
+ e.order.id,
426
+ " ·",
427
+ " ",
428
+ l(e.order.total, e.order.currency)
429
+ ]
430
+ }) : null
431
+ ]
432
+ }) }, e.id);
433
+ })
434
+ })]
435
+ })
436
+ ] }) : null : /* @__PURE__ */ w(i, {
437
+ title: "Choose the request's organization",
438
+ description: "Select the global organization that owns this sourcing request. A farm workspace is not required."
439
+ })
440
+ })
441
+ ]
442
+ });
443
+ };
444
+ //#endregion
445
+ export { O as SourcingRequestDetailPage };
446
+
447
+ //# sourceMappingURL=SourcingRequestDetailPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SourcingRequestDetailPage.js","names":[],"sources":["../../src/pages/SourcingRequestDetailPage.tsx"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { FC } from 'react';\nimport { useNavigate, useParams } from 'react-router';\nimport {\n BadgeCheck,\n CalendarDays,\n Check,\n CircleDollarSign,\n FileText,\n MapPin,\n PackageSearch,\n Receipt,\n ShoppingBag,\n Trash2,\n UserRound,\n} from 'lucide-react';\nimport { EmphasisPanel, GlassCard, PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { SourcingOfferStatus, SourcingRequestStatus } from '../generated/global-types';\nimport { useStore } from '../providers/StoreProvider';\nimport {\n type AcceptedSourcingOrder,\n type BuyerSourcingRequestDetail,\n useSourcingApi,\n} from '../hooks/useSourcing';\nimport {\n ContextRequiredPanel,\n dangerButtonClassName,\n formatDate,\n formatDateTime,\n formatLocation,\n formatMoney,\n formatSourcingUnit,\n joinStorePath,\n primaryButtonClassName,\n secondaryButtonClassName,\n SourcingEmptyState,\n SourcingErrorState,\n SourcingLoadingState,\n SourcingPageHeader,\n SourcingStatusBadge,\n toErrorMessage,\n} from '../components/sourcing/SourcingUi';\nimport { SourcingConfirmationDialog } from '../components/sourcing/SourcingConfirmationDialog';\n\nexport const SourcingRequestDetailPage: FC = () => {\n const navigate = useNavigate();\n const { requestId } = useParams<{ requestId: string }>();\n const { basePath } = useStore();\n const { hasOrganizationContext, getBuyerRequest, acceptOffer, cancelBuyerRequest } =\n useSourcingApi();\n const [request, setRequest] = useState<BuyerSourcingRequestDetail | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [actionError, setActionError] = useState<string | null>(null);\n const [confirmOfferId, setConfirmOfferId] = useState<string | null>(null);\n const [confirmCancel, setConfirmCancel] = useState(false);\n const [acting, setActing] = useState(false);\n const [acceptedOrder, setAcceptedOrder] = useState<AcceptedSourcingOrder | null>(null);\n const acceptTriggerRef = useRef<HTMLButtonElement | null>(null);\n\n const listPath = joinStorePath(basePath, 'sourcing/requests');\n\n const load = useCallback(async () => {\n if (!hasOrganizationContext || !requestId) return;\n setLoading(true);\n setError(null);\n try {\n const result = await getBuyerRequest(requestId);\n setRequest(result);\n if (!result) setError('This sourcing request was not found in the active organization.');\n } catch (loadError) {\n setError(toErrorMessage(loadError, 'The sourcing request could not be loaded.'));\n } finally {\n setLoading(false);\n }\n }, [getBuyerRequest, hasOrganizationContext, requestId]);\n\n useEffect(() => {\n void load();\n }, [load]);\n\n const closeOfferConfirmation = () => {\n setConfirmOfferId(null);\n window.requestAnimationFrame(() => acceptTriggerRef.current?.focus());\n };\n\n const offers = useMemo(() => {\n if (!request) return [];\n const rank: Record<SourcingOfferStatus, number> = {\n [SourcingOfferStatus.Accepted]: 0,\n [SourcingOfferStatus.Active]: 1,\n [SourcingOfferStatus.Rejected]: 2,\n };\n return [...request.offers].sort((left, right) => rank[left.status] - rank[right.status]);\n }, [request]);\n\n const confirmingOffer = confirmOfferId\n ? offers.find((offer) => offer.id === confirmOfferId)\n : undefined;\n\n const handleAccept = async (offerId: string) => {\n if (acting) return;\n setActing(true);\n setActionError(null);\n try {\n const order = await acceptOffer(offerId);\n setAcceptedOrder(order);\n setConfirmOfferId(null);\n await load();\n } catch (acceptError) {\n closeOfferConfirmation();\n setActionError(\n toErrorMessage(\n acceptError,\n 'This offer could not be accepted. The request may already have been matched.'\n )\n );\n } finally {\n setActing(false);\n }\n };\n\n const handleCancel = async () => {\n if (!request || acting) return;\n setActing(true);\n setActionError(null);\n try {\n await cancelBuyerRequest(request.id);\n setConfirmCancel(false);\n await load();\n } catch (cancelError) {\n setConfirmCancel(false);\n setActionError(toErrorMessage(cancelError, 'This sourcing request could not be canceled.'));\n } finally {\n setActing(false);\n }\n };\n\n const order = acceptedOrder ?? request?.acceptedOrder ?? null;\n\n return (\n <div className=\"min-h-full bg-surface-default\">\n <SourcingPageHeader\n title={request?.productName ?? 'Sourcing request'}\n description=\"Review request details and compare offers visible only to the owning buyer organization.\"\n icon={<FileText className=\"size-5\" aria-hidden=\"true\" />}\n onBack={() => navigate(listPath)}\n actions={\n request?.status === SourcingRequestStatus.Open ? (\n <button\n type=\"button\"\n onClick={() => setConfirmCancel(true)}\n disabled={acting}\n className={dangerButtonClassName}\n >\n <Trash2 className=\"size-4\" aria-hidden=\"true\" />\n Cancel request\n </button>\n ) : undefined\n }\n />\n\n <SourcingConfirmationDialog\n open={confirmCancel}\n title=\"Cancel this open request?\"\n description=\"Publishers will no longer be able to discover it or submit offers. Existing active offers will be rejected. This action cannot be undone.\"\n confirmLabel=\"Confirm cancellation\"\n cancelLabel=\"Keep request open\"\n busy={acting}\n destructive\n onConfirm={() => void handleCancel()}\n onCancel={() => setConfirmCancel(false)}\n />\n\n <SourcingConfirmationDialog\n open={Boolean(confirmingOffer)}\n title=\"Accept this offer?\"\n description={\n confirmingOffer ? (\n <>\n Accept {confirmingOffer.publisher?.name ?? 'this verified publisher'}’s offer for{' '}\n {confirmingOffer.quantity.toLocaleString()} {formatSourcingUnit(confirmingOffer.unit)}{' '}\n at {formatMoney(confirmingOffer.unitPrice, confirmingOffer.currency)} per{' '}\n {formatSourcingUnit(confirmingOffer.unit)}? Store will calculate the authoritative\n total from this persisted offer, create one unpaid order, and reject all competing\n offers. You cannot choose another offer afterward.\n </>\n ) : null\n }\n confirmLabel=\"Confirm and create order\"\n cancelLabel=\"Not yet\"\n busy={acting}\n onConfirm={() => {\n if (confirmingOffer) void handleAccept(confirmingOffer.id);\n }}\n onCancel={closeOfferConfirmation}\n />\n\n <main className=\"mx-auto max-w-6xl px-4 py-6 sm:px-6\">\n {!hasOrganizationContext ? (\n <ContextRequiredPanel\n title=\"Choose the request's organization\"\n description=\"Select the global organization that owns this sourcing request. A farm workspace is not required.\"\n />\n ) : loading && !request ? (\n <SourcingLoadingState label=\"Loading request and offers…\" />\n ) : error && !request ? (\n <SourcingErrorState\n title=\"Sourcing request unavailable\"\n message={error}\n onRetry={requestId ? () => void load() : undefined}\n />\n ) : request ? (\n <>\n <PagePurpose className=\"mb-6\">\n Compare the seller's unit price, promised delivery date, and message. Acceptance is\n atomic: Store claims this open request, creates exactly one order from the persisted\n offer, accepts the winner, and rejects every sibling offer.\n </PagePurpose>\n\n {actionError ? (\n <div\n role=\"alert\"\n className=\"mb-5 rounded-lg border border-border-danger bg-surface-danger-muted px-4 py-3 text-sm text-text-danger\"\n >\n {actionError}\n </div>\n ) : null}\n\n {order ? (\n <EmphasisPanel className=\"mb-6\">\n <div\n aria-live=\"polite\"\n className=\"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between\"\n >\n <div className=\"flex items-start gap-3\">\n <span className=\"flex size-10 shrink-0 items-center justify-center rounded-full bg-status-success-bg-subtle text-status-success-text\">\n <Check className=\"size-5\" aria-hidden=\"true\" />\n </span>\n <div>\n <h2 className=\"font-semibold text-text-primary\">\n Offer accepted and order created\n </h2>\n <p className=\"mt-1 text-sm text-text-secondary\">\n Order {order.id} · {formatMoney(order.total, order.currency)} ·{' '}\n {order.status}\n </p>\n </div>\n </div>\n <div className=\"flex flex-wrap gap-2\">\n {order.status === 'PENDING' ? (\n <button\n type=\"button\"\n onClick={() => navigate(`/billing/checkout/store/${order.id}`)}\n className={primaryButtonClassName}\n >\n <ShoppingBag className=\"size-4\" aria-hidden=\"true\" />\n Continue to checkout\n </button>\n ) : null}\n <button\n type=\"button\"\n onClick={() => navigate(joinStorePath(basePath, 'orders'))}\n className={secondaryButtonClassName}\n >\n <Receipt className=\"size-4\" aria-hidden=\"true\" />\n View my orders\n </button>\n </div>\n </div>\n </EmphasisPanel>\n ) : null}\n\n <div className=\"grid gap-6 lg:grid-cols-[minmax(0,2fr)_minmax(280px,1fr)]\">\n <GlassCard className=\"p-5 sm:p-6\">\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div>\n <p className=\"text-sm font-medium text-text-accent\">{request.category}</p>\n <h2 className=\"mt-1 text-xl font-semibold text-text-primary\">\n {request.productName}\n </h2>\n </div>\n <SourcingStatusBadge status={request.status} />\n </div>\n {request.summary ? (\n <p className=\"mt-4 whitespace-pre-wrap text-sm leading-6 text-text-secondary\">\n {request.summary}\n </p>\n ) : null}\n\n <dl className=\"mt-6 grid gap-5 border-t border-border-seam pt-5 sm:grid-cols-2\">\n <div className=\"flex gap-3\">\n <PackageSearch\n className=\"mt-0.5 size-5 shrink-0 text-text-tertiary\"\n aria-hidden=\"true\"\n />\n <div>\n <dt className=\"text-xs text-text-tertiary\">Quantity</dt>\n <dd className=\"mt-0.5 font-medium text-text-primary\">\n {request.quantity.toLocaleString()} {formatSourcingUnit(request.unit)}\n </dd>\n </div>\n </div>\n <div className=\"flex gap-3\">\n <CircleDollarSign\n className=\"mt-0.5 size-5 shrink-0 text-text-tertiary\"\n aria-hidden=\"true\"\n />\n <div>\n <dt className=\"text-xs text-text-tertiary\">Target unit price</dt>\n <dd className=\"mt-0.5 font-medium text-text-primary\">\n {formatMoney(request.targetUnitPrice, request.targetCurrency)}\n </dd>\n </div>\n </div>\n <div className=\"flex gap-3\">\n <CalendarDays\n className=\"mt-0.5 size-5 shrink-0 text-text-tertiary\"\n aria-hidden=\"true\"\n />\n <div>\n <dt className=\"text-xs text-text-tertiary\">Delivery window</dt>\n <dd className=\"mt-0.5 font-medium text-text-primary\">\n {formatDateTime(request.deliveryWindowStart)} –{' '}\n {formatDateTime(request.deliveryWindowEnd)}\n </dd>\n </div>\n </div>\n <div className=\"flex gap-3\">\n <MapPin\n className=\"mt-0.5 size-5 shrink-0 text-text-tertiary\"\n aria-hidden=\"true\"\n />\n <div>\n <dt className=\"text-xs text-text-tertiary\">Destination</dt>\n <dd className=\"mt-0.5 font-medium text-text-primary\">\n {formatLocation({\n country: request.deliveryCountry,\n region: request.deliveryRegion,\n city: request.deliveryCity,\n })}\n </dd>\n </div>\n </div>\n </dl>\n </GlassCard>\n\n <GlassCard className=\"p-5\">\n <h2 className=\"font-semibold text-text-primary\">Request timeline</h2>\n <dl className=\"mt-4 space-y-4 text-sm\">\n <div>\n <dt className=\"text-text-tertiary\">Created</dt>\n <dd className=\"font-medium text-text-primary\">\n {formatDateTime(request.createdAt)}\n </dd>\n </div>\n <div>\n <dt className=\"text-text-tertiary\">Last updated</dt>\n <dd className=\"font-medium text-text-primary\">\n {formatDateTime(request.updatedAt)}\n </dd>\n </div>\n {request.matchedAt ? (\n <div>\n <dt className=\"text-text-tertiary\">Matched</dt>\n <dd className=\"font-medium text-text-primary\">\n {formatDateTime(request.matchedAt)}\n </dd>\n </div>\n ) : null}\n {request.canceledAt ? (\n <div>\n <dt className=\"text-text-tertiary\">Canceled</dt>\n <dd className=\"font-medium text-text-primary\">\n {formatDateTime(request.canceledAt)}\n </dd>\n </div>\n ) : null}\n </dl>\n </GlassCard>\n </div>\n\n <section aria-labelledby=\"sourcing-offers-heading\" className=\"mt-8\">\n <div className=\"flex flex-wrap items-end justify-between gap-3\">\n <div>\n <h2\n id=\"sourcing-offers-heading\"\n className=\"text-xl font-semibold text-text-primary\"\n >\n Publisher offers\n </h2>\n <p className=\"mt-1 text-sm text-text-secondary\">\n {offers.length} {offers.length === 1 ? 'offer' : 'offers'} received\n </p>\n </div>\n <button\n type=\"button\"\n onClick={() => void load()}\n disabled={loading || acting}\n className={secondaryButtonClassName}\n >\n Refresh offers\n </button>\n </div>\n\n {offers.length === 0 ? (\n <div className=\"mt-5\">\n <SourcingEmptyState\n title={\n request.status === SourcingRequestStatus.Open\n ? 'No offers yet'\n : 'No offers were received'\n }\n description={\n request.status === SourcingRequestStatus.Open\n ? 'Eligible verified publishers can discover this request while it remains open.'\n : 'This request closed without any publisher offers.'\n }\n />\n </div>\n ) : (\n <ul className=\"mt-5 grid gap-4 lg:grid-cols-2\">\n {offers.map((offer) => {\n const canAccept =\n request.status === SourcingRequestStatus.Open &&\n offer.status === SourcingOfferStatus.Active;\n return (\n <li key={offer.id}>\n <GlassCard className=\"h-full p-5\">\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"flex min-w-0 items-center gap-3\">\n {offer.publisher?.logoUrl ? (\n <img\n src={offer.publisher.logoUrl}\n alt=\"\"\n className=\"size-11 shrink-0 rounded-lg object-cover\"\n />\n ) : (\n <span className=\"flex size-11 shrink-0 items-center justify-center rounded-lg bg-surface-muted text-text-tertiary\">\n <UserRound className=\"size-5\" aria-hidden=\"true\" />\n </span>\n )}\n <div className=\"min-w-0\">\n <div className=\"flex items-center gap-1.5\">\n <h3 className=\"truncate font-semibold text-text-primary\">\n {offer.publisher?.name ?? 'Verified publisher'}\n </h3>\n {offer.publisher?.isVerified ? (\n <BadgeCheck\n className=\"size-4 shrink-0 text-text-accent\"\n aria-label=\"Verified publisher\"\n />\n ) : null}\n </div>\n <p className=\"text-xs text-text-tertiary\">\n Offered {formatDate(offer.createdAt)}\n </p>\n </div>\n </div>\n <SourcingStatusBadge status={offer.status} />\n </div>\n\n <dl className=\"mt-5 grid grid-cols-2 gap-4 text-sm\">\n <div>\n <dt className=\"text-xs text-text-tertiary\">Unit price</dt>\n <dd className=\"mt-0.5 text-lg font-semibold text-text-primary\">\n {formatMoney(offer.unitPrice, offer.currency)}\n </dd>\n </div>\n <div>\n <dt className=\"text-xs text-text-tertiary\">Delivery date</dt>\n <dd className=\"mt-0.5 font-medium text-text-primary\">\n {formatDateTime(offer.deliveryDate)}\n </dd>\n </div>\n </dl>\n\n {offer.message ? (\n <p className=\"mt-4 rounded-lg bg-surface-muted p-3 text-sm leading-6 text-text-secondary\">\n {offer.message}\n </p>\n ) : null}\n\n {canAccept ? (\n <button\n type=\"button\"\n onClick={(event) => {\n acceptTriggerRef.current = event.currentTarget;\n setActionError(null);\n setConfirmOfferId(offer.id);\n }}\n className={`${primaryButtonClassName} mt-5 w-full`}\n >\n <ShoppingBag className=\"size-4\" aria-hidden=\"true\" />\n Accept offer\n </button>\n ) : offer.order ? (\n <div className=\"mt-5 rounded-lg border border-status-success-border bg-status-success-bg-subtle px-4 py-3 text-sm text-status-success-text\">\n Order {offer.order.id} ·{' '}\n {formatMoney(offer.order.total, offer.order.currency)}\n </div>\n ) : null}\n </GlassCard>\n </li>\n );\n })}\n </ul>\n )}\n </section>\n </>\n ) : null}\n </main>\n </div>\n );\n};\n"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { FC } from 'react';
2
+
3
+ export declare const SourcingRequestsPage: FC;