@burdenoff/microfe-eventfullymanaged 2026.703.2 → 2026.704.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 (74) hide show
  1. package/dist/eventfullymanaged/EventfullyManagedRoutes.js +154 -66
  2. package/dist/eventfullymanaged/EventfullyManagedRoutes.js.map +1 -1
  3. package/dist/eventfullymanaged/api/eventApi.js +546 -67
  4. package/dist/eventfullymanaged/api/eventApi.js.map +1 -1
  5. package/dist/eventfullymanaged/components/ActionMenu.js +113 -0
  6. package/dist/eventfullymanaged/components/ActionMenu.js.map +1 -0
  7. package/dist/eventfullymanaged/components/EntityFormShell.js +51 -0
  8. package/dist/eventfullymanaged/components/EntityFormShell.js.map +1 -0
  9. package/dist/eventfullymanaged/components/EntityTagsField.js +146 -0
  10. package/dist/eventfullymanaged/components/EntityTagsField.js.map +1 -0
  11. package/dist/eventfullymanaged/components/Pagination.js +84 -0
  12. package/dist/eventfullymanaged/components/Pagination.js.map +1 -0
  13. package/dist/eventfullymanaged/components/SafeLink.js +32 -0
  14. package/dist/eventfullymanaged/components/SafeLink.js.map +1 -0
  15. package/dist/eventfullymanaged/components/index.js +7 -0
  16. package/dist/eventfullymanaged/pages/events/EventDetailPage.js +458 -0
  17. package/dist/eventfullymanaged/pages/events/EventDetailPage.js.map +1 -0
  18. package/dist/eventfullymanaged/pages/events/EventFormPage.js +267 -0
  19. package/dist/eventfullymanaged/pages/events/EventFormPage.js.map +1 -0
  20. package/dist/eventfullymanaged/pages/events/SessionFormPage.js +308 -0
  21. package/dist/eventfullymanaged/pages/events/SessionFormPage.js.map +1 -0
  22. package/dist/eventfullymanaged/pages/events/TicketTypeFormPage.js +214 -0
  23. package/dist/eventfullymanaged/pages/events/TicketTypeFormPage.js.map +1 -0
  24. package/dist/eventfullymanaged/pages/events/eventFormUtils.js +128 -0
  25. package/dist/eventfullymanaged/pages/events/eventFormUtils.js.map +1 -0
  26. package/dist/eventfullymanaged/pages/exhibitors/ExhibitorFormPage.js +233 -0
  27. package/dist/eventfullymanaged/pages/exhibitors/ExhibitorFormPage.js.map +1 -0
  28. package/dist/eventfullymanaged/pages/exhibitors/ExhibitorsPage.js +165 -0
  29. package/dist/eventfullymanaged/pages/exhibitors/ExhibitorsPage.js.map +1 -0
  30. package/dist/eventfullymanaged/pages/leads/LeadCaptureDialog.js +141 -0
  31. package/dist/eventfullymanaged/pages/leads/LeadCaptureDialog.js.map +1 -0
  32. package/dist/eventfullymanaged/pages/modules/AnalyticsPage.js +178 -45
  33. package/dist/eventfullymanaged/pages/modules/AnalyticsPage.js.map +1 -1
  34. package/dist/eventfullymanaged/pages/modules/CommunicationPage.js +240 -70
  35. package/dist/eventfullymanaged/pages/modules/CommunicationPage.js.map +1 -1
  36. package/dist/eventfullymanaged/pages/modules/EventsPage.js +133 -97
  37. package/dist/eventfullymanaged/pages/modules/EventsPage.js.map +1 -1
  38. package/dist/eventfullymanaged/pages/modules/KioskPage.js +746 -36
  39. package/dist/eventfullymanaged/pages/modules/KioskPage.js.map +1 -1
  40. package/dist/eventfullymanaged/pages/modules/NetworkingPage.js +210 -69
  41. package/dist/eventfullymanaged/pages/modules/NetworkingPage.js.map +1 -1
  42. package/dist/eventfullymanaged/pages/modules/RegistrationPage.js +289 -77
  43. package/dist/eventfullymanaged/pages/modules/RegistrationPage.js.map +1 -1
  44. package/dist/eventfullymanaged/pages/modules/RoadmapPanel.js +95 -0
  45. package/dist/eventfullymanaged/pages/modules/RoadmapPanel.js.map +1 -0
  46. package/dist/eventfullymanaged/pages/modules/SponsorDetailsPage.js +77 -56
  47. package/dist/eventfullymanaged/pages/modules/SponsorDetailsPage.js.map +1 -1
  48. package/dist/eventfullymanaged/pages/modules/SponsorLeadsPage.js +70 -36
  49. package/dist/eventfullymanaged/pages/modules/SponsorLeadsPage.js.map +1 -1
  50. package/dist/eventfullymanaged/pages/networking/MeetingFormPage.js +343 -0
  51. package/dist/eventfullymanaged/pages/networking/MeetingFormPage.js.map +1 -0
  52. package/dist/eventfullymanaged/pages/networking/NetworkingProfileFormPage.js +236 -0
  53. package/dist/eventfullymanaged/pages/networking/NetworkingProfileFormPage.js.map +1 -0
  54. package/dist/eventfullymanaged/pages/registration/AttendeeFormPage.js +181 -0
  55. package/dist/eventfullymanaged/pages/registration/AttendeeFormPage.js.map +1 -0
  56. package/dist/eventfullymanaged/pages/registration/PromoCodeFormPage.js +262 -0
  57. package/dist/eventfullymanaged/pages/registration/PromoCodeFormPage.js.map +1 -0
  58. package/dist/eventfullymanaged/pages/registration/RegisterAttendeePage.js +414 -0
  59. package/dist/eventfullymanaged/pages/registration/RegisterAttendeePage.js.map +1 -0
  60. package/dist/eventfullymanaged/pages/speakers/SpeakerFormPage.js +224 -0
  61. package/dist/eventfullymanaged/pages/speakers/SpeakerFormPage.js.map +1 -0
  62. package/dist/eventfullymanaged/pages/speakers/SpeakersPage.js +96 -0
  63. package/dist/eventfullymanaged/pages/speakers/SpeakersPage.js.map +1 -0
  64. package/dist/eventfullymanaged/pages/sponsors/SponsorFormPage.js +149 -140
  65. package/dist/eventfullymanaged/pages/sponsors/SponsorFormPage.js.map +1 -1
  66. package/dist/eventfullymanaged/pages/sponsors/SponsorsListPage.js +97 -67
  67. package/dist/eventfullymanaged/pages/sponsors/SponsorsListPage.js.map +1 -1
  68. package/dist/eventfullymanaged/pages/venues/VenueDetailPage.js +93 -72
  69. package/dist/eventfullymanaged/pages/venues/VenueDetailPage.js.map +1 -1
  70. package/dist/eventfullymanaged/pages/venues/VenueFormPage.js +91 -89
  71. package/dist/eventfullymanaged/pages/venues/VenueFormPage.js.map +1 -1
  72. package/dist/eventfullymanaged/pages/venues/VenueListPage.js +83 -53
  73. package/dist/eventfullymanaged/pages/venues/VenueListPage.js.map +1 -1
  74. package/package.json +1 -1
@@ -0,0 +1,343 @@
1
+ import { useEventfullyManaged as e } from "../../context/EventfullyManagedContext.js";
2
+ import { notify as t } from "../../lib/toast.js";
3
+ import { useAttendeesQuery as n, useCreateMeetingMutation as r, useEventsQuery as i, useMeetingsQuery as a, useNetworkingProfilesQuery as o, useUpdateMeetingMutation as s } from "../../api/eventApi.js";
4
+ import { EntityFormShell as c } from "../../components/EntityFormShell.js";
5
+ import { describeError as l, mutationSucceeded as u } from "../../lib/mutationResult.js";
6
+ import { useEffect as d, useMemo as f, useState as p } from "react";
7
+ import { useParams as m } from "react-router-dom";
8
+ import { jsx as h, jsxs as g } from "react/jsx-runtime";
9
+ import { Input as _, Select as v, SelectContent as y, SelectItem as b, SelectTrigger as x, SelectValue as S, Textarea as C } from "@burdenoff/fe-libs/ui";
10
+ //#region src/eventfullymanaged/pages/networking/MeetingFormPage.tsx
11
+ var w = {
12
+ eventId: "",
13
+ title: "",
14
+ sourceProfileId: "",
15
+ targetProfileId: "",
16
+ startsAt: "",
17
+ endsAt: "",
18
+ location: "",
19
+ bookingPageId: "",
20
+ bookerName: "",
21
+ bookerEmail: "",
22
+ notes: "",
23
+ status: "SCHEDULED"
24
+ }, T = [
25
+ {
26
+ value: "SCHEDULED",
27
+ label: "Scheduled"
28
+ },
29
+ {
30
+ value: "CONFIRMED",
31
+ label: "Confirmed"
32
+ },
33
+ {
34
+ value: "COMPLETED",
35
+ label: "Completed"
36
+ },
37
+ {
38
+ value: "CANCELLED",
39
+ label: "Cancelled"
40
+ }
41
+ ];
42
+ function E(e) {
43
+ if (!e) return "";
44
+ let t = new Date(e);
45
+ if (Number.isNaN(t.getTime())) return "";
46
+ let n = t.getTimezoneOffset() * 60 * 1e3;
47
+ return new Date(t.getTime() - n).toISOString().slice(0, 16);
48
+ }
49
+ function D(e) {
50
+ if (!e) return null;
51
+ let t = new Date(e);
52
+ return Number.isNaN(t.getTime()) ? null : t.toISOString();
53
+ }
54
+ function O(e, t) {
55
+ let n = e?.[t];
56
+ return typeof n == "string" ? n : "";
57
+ }
58
+ function k() {
59
+ let { id: k = "" } = m(), A = f(() => !!k, [k]), { navigate: j } = e(), { data: M } = i({
60
+ limit: 100,
61
+ offset: 0
62
+ }), { data: N } = a({
63
+ limit: 100,
64
+ offset: 0
65
+ }), P = f(() => (N?.meetings?.items ?? []).find((e) => e.id === k), [N, k]), [F, { loading: I }] = r(), [L, { loading: R }] = s(), [z, B] = p(w), { data: V } = o({
66
+ eventId: z.eventId || void 0,
67
+ limit: 100,
68
+ offset: 0
69
+ }), { data: H } = n({
70
+ eventId: z.eventId || void 0,
71
+ limit: 100,
72
+ offset: 0
73
+ }), U = f(() => {
74
+ let e = /* @__PURE__ */ new Map();
75
+ for (let t of H?.attendees?.items ?? []) e.set(t.id, t.fullName);
76
+ return e;
77
+ }, [H]), W = f(() => (V?.networkingProfiles?.items ?? []).map((e) => ({
78
+ id: e.id,
79
+ label: U.get(e.attendeeId) ?? e.role ?? `Profile ${e.id.slice(0, 8)}`
80
+ })), [V, U]);
81
+ d(() => {
82
+ if (!A || !P) return;
83
+ let e = P.metadata ?? {};
84
+ B({
85
+ eventId: P.eventId ?? O(e, "eventId"),
86
+ title: P.title ?? P.name ?? O(e, "title"),
87
+ sourceProfileId: O(e, "sourceProfileId"),
88
+ targetProfileId: O(e, "targetProfileId"),
89
+ startsAt: E(O(e, "startsAt")),
90
+ endsAt: E(O(e, "endsAt")),
91
+ location: O(e, "location"),
92
+ bookingPageId: O(e, "bookingPageId"),
93
+ bookerName: O(e, "bookerName"),
94
+ bookerEmail: O(e, "bookerEmail"),
95
+ notes: O(e, "notes"),
96
+ status: P.status ?? "SCHEDULED"
97
+ });
98
+ }, [P, A]);
99
+ let G = (e, t) => {
100
+ B((n) => ({
101
+ ...n,
102
+ [e]: t
103
+ }));
104
+ }, K = async (e) => {
105
+ if (e.preventDefault(), !z.eventId) {
106
+ t.error("Event required", "Choose the event this meeting belongs to.");
107
+ return;
108
+ }
109
+ let n = D(z.startsAt), r = D(z.endsAt);
110
+ if (!n || !r) {
111
+ t.error("Time required", "Set both a start and end time for the meeting.");
112
+ return;
113
+ }
114
+ if (new Date(r).getTime() <= new Date(n).getTime()) {
115
+ t.error("Invalid time range", "The meeting must end after it starts.");
116
+ return;
117
+ }
118
+ let i = {
119
+ startsAt: n,
120
+ endsAt: r,
121
+ location: z.location,
122
+ notes: z.notes,
123
+ title: z.title,
124
+ sourceProfileId: z.sourceProfileId,
125
+ targetProfileId: z.targetProfileId
126
+ };
127
+ z.bookingPageId.trim() && (i.bookingPageId = z.bookingPageId.trim()), z.bookerName.trim() && (i.bookerName = z.bookerName.trim()), z.bookerEmail.trim() && (i.bookerEmail = z.bookerEmail.trim());
128
+ let a = {
129
+ eventId: z.eventId,
130
+ title: z.title,
131
+ startsAt: n,
132
+ endsAt: r,
133
+ location: z.location,
134
+ notes: z.notes,
135
+ status: z.status,
136
+ metadata: i
137
+ };
138
+ z.sourceProfileId && (a.sourceProfileId = z.sourceProfileId), z.targetProfileId && (a.targetProfileId = z.targetProfileId), z.bookingPageId.trim() && (a.bookingPageId = z.bookingPageId.trim());
139
+ try {
140
+ if (A) {
141
+ let e = await L({ variables: {
142
+ id: k,
143
+ input: a
144
+ } });
145
+ if (!u(e, e.data?.updateMeeting?.id, "Could not update meeting")) return;
146
+ j("/networking");
147
+ return;
148
+ }
149
+ let e = await F({ variables: { input: a } });
150
+ if (!u(e, e.data?.createMeeting?.id, "Could not book meeting")) return;
151
+ j("/networking");
152
+ } catch (e) {
153
+ t.error("Could not save meeting", l(e));
154
+ }
155
+ }, q = I || R, J = M?.events?.items ?? [];
156
+ return /* @__PURE__ */ g(c, {
157
+ title: A ? "Edit Meeting" : "Book a Meeting",
158
+ description: "Schedule a 1:1 between two networking profiles.",
159
+ purpose: "Meetings are the 1:1s attendees book with each other. Pick the two participants, set a time and place, and — if you use a shared booking page — link it so the meeting mirrors into the calendar service. Everyone sees the same schedule without a separate calendar here.",
160
+ backLabel: "Back to Networking",
161
+ onBack: () => j("/networking"),
162
+ onSubmit: K,
163
+ submitLabel: A ? "Save Meeting" : "Book Meeting",
164
+ saving: q,
165
+ children: [
166
+ /* @__PURE__ */ g("div", {
167
+ className: "grid grid-cols-1 gap-4 md:grid-cols-2",
168
+ children: [/* @__PURE__ */ g("label", {
169
+ className: "space-y-1 text-sm",
170
+ children: [/* @__PURE__ */ h("span", {
171
+ className: "font-medium text-text-primary",
172
+ children: "Event"
173
+ }), /* @__PURE__ */ g(v, {
174
+ value: z.eventId,
175
+ onValueChange: (e) => G("eventId", e),
176
+ children: [/* @__PURE__ */ h(x, {
177
+ "aria-label": "Event",
178
+ children: /* @__PURE__ */ h(S, { placeholder: "Select event" })
179
+ }), /* @__PURE__ */ h(y, { children: J.map((e) => /* @__PURE__ */ h(b, {
180
+ value: e.id,
181
+ children: e.name
182
+ }, e.id)) })]
183
+ })]
184
+ }), /* @__PURE__ */ g("label", {
185
+ className: "space-y-1 text-sm",
186
+ children: [/* @__PURE__ */ h("span", {
187
+ className: "font-medium text-text-primary",
188
+ children: "Title"
189
+ }), /* @__PURE__ */ h(_, {
190
+ value: z.title,
191
+ onChange: (e) => G("title", e.target.value),
192
+ required: !0
193
+ })]
194
+ })]
195
+ }),
196
+ /* @__PURE__ */ g("div", {
197
+ className: "grid grid-cols-1 gap-4 md:grid-cols-2",
198
+ children: [/* @__PURE__ */ g("label", {
199
+ className: "space-y-1 text-sm",
200
+ children: [/* @__PURE__ */ h("span", {
201
+ className: "font-medium text-text-primary",
202
+ children: "Participant A"
203
+ }), /* @__PURE__ */ g(v, {
204
+ value: z.sourceProfileId,
205
+ onValueChange: (e) => G("sourceProfileId", e),
206
+ disabled: !z.eventId,
207
+ children: [/* @__PURE__ */ h(x, {
208
+ "aria-label": "Participant A",
209
+ children: /* @__PURE__ */ h(S, { placeholder: z.eventId ? "Select profile" : "Select an event first" })
210
+ }), /* @__PURE__ */ h(y, { children: W.map((e) => /* @__PURE__ */ h(b, {
211
+ value: e.id,
212
+ children: e.label
213
+ }, e.id)) })]
214
+ })]
215
+ }), /* @__PURE__ */ g("label", {
216
+ className: "space-y-1 text-sm",
217
+ children: [/* @__PURE__ */ h("span", {
218
+ className: "font-medium text-text-primary",
219
+ children: "Participant B"
220
+ }), /* @__PURE__ */ g(v, {
221
+ value: z.targetProfileId,
222
+ onValueChange: (e) => G("targetProfileId", e),
223
+ disabled: !z.eventId,
224
+ children: [/* @__PURE__ */ h(x, {
225
+ "aria-label": "Participant B",
226
+ children: /* @__PURE__ */ h(S, { placeholder: z.eventId ? "Select profile" : "Select an event first" })
227
+ }), /* @__PURE__ */ h(y, { children: W.map((e) => /* @__PURE__ */ h(b, {
228
+ value: e.id,
229
+ children: e.label
230
+ }, e.id)) })]
231
+ })]
232
+ })]
233
+ }),
234
+ /* @__PURE__ */ g("div", {
235
+ className: "grid grid-cols-1 gap-4 md:grid-cols-3",
236
+ children: [
237
+ /* @__PURE__ */ g("label", {
238
+ className: "space-y-1 text-sm",
239
+ children: [/* @__PURE__ */ h("span", {
240
+ className: "font-medium text-text-primary",
241
+ children: "Starts at"
242
+ }), /* @__PURE__ */ h(_, {
243
+ type: "datetime-local",
244
+ value: z.startsAt,
245
+ onChange: (e) => G("startsAt", e.target.value)
246
+ })]
247
+ }),
248
+ /* @__PURE__ */ g("label", {
249
+ className: "space-y-1 text-sm",
250
+ children: [/* @__PURE__ */ h("span", {
251
+ className: "font-medium text-text-primary",
252
+ children: "Ends at"
253
+ }), /* @__PURE__ */ h(_, {
254
+ type: "datetime-local",
255
+ value: z.endsAt,
256
+ onChange: (e) => G("endsAt", e.target.value)
257
+ })]
258
+ }),
259
+ /* @__PURE__ */ g("label", {
260
+ className: "space-y-1 text-sm",
261
+ children: [/* @__PURE__ */ h("span", {
262
+ className: "font-medium text-text-primary",
263
+ children: "Status"
264
+ }), /* @__PURE__ */ g(v, {
265
+ value: z.status,
266
+ onValueChange: (e) => G("status", e),
267
+ children: [/* @__PURE__ */ h(x, {
268
+ "aria-label": "Status",
269
+ children: /* @__PURE__ */ h(S, {})
270
+ }), /* @__PURE__ */ h(y, { children: T.map((e) => /* @__PURE__ */ h(b, {
271
+ value: e.value,
272
+ children: e.label
273
+ }, e.value)) })]
274
+ })]
275
+ })
276
+ ]
277
+ }),
278
+ /* @__PURE__ */ g("label", {
279
+ className: "block space-y-1 text-sm",
280
+ children: [/* @__PURE__ */ h("span", {
281
+ className: "font-medium text-text-primary",
282
+ children: "Location"
283
+ }), /* @__PURE__ */ h(_, {
284
+ value: z.location,
285
+ onChange: (e) => G("location", e.target.value),
286
+ placeholder: "Networking lounge, Table 4"
287
+ })]
288
+ }),
289
+ /* @__PURE__ */ g("div", {
290
+ className: "grid grid-cols-1 gap-4 md:grid-cols-3",
291
+ children: [
292
+ /* @__PURE__ */ g("label", {
293
+ className: "space-y-1 text-sm",
294
+ children: [/* @__PURE__ */ h("span", {
295
+ className: "font-medium text-text-primary",
296
+ children: "Booking page ID"
297
+ }), /* @__PURE__ */ h(_, {
298
+ value: z.bookingPageId,
299
+ onChange: (e) => G("bookingPageId", e.target.value),
300
+ placeholder: "Optional — mirrors to calendar"
301
+ })]
302
+ }),
303
+ /* @__PURE__ */ g("label", {
304
+ className: "space-y-1 text-sm",
305
+ children: [/* @__PURE__ */ h("span", {
306
+ className: "font-medium text-text-primary",
307
+ children: "Booker name"
308
+ }), /* @__PURE__ */ h(_, {
309
+ value: z.bookerName,
310
+ onChange: (e) => G("bookerName", e.target.value)
311
+ })]
312
+ }),
313
+ /* @__PURE__ */ g("label", {
314
+ className: "space-y-1 text-sm",
315
+ children: [/* @__PURE__ */ h("span", {
316
+ className: "font-medium text-text-primary",
317
+ children: "Booker email"
318
+ }), /* @__PURE__ */ h(_, {
319
+ type: "email",
320
+ value: z.bookerEmail,
321
+ onChange: (e) => G("bookerEmail", e.target.value)
322
+ })]
323
+ })
324
+ ]
325
+ }),
326
+ /* @__PURE__ */ g("label", {
327
+ className: "block space-y-1 text-sm",
328
+ children: [/* @__PURE__ */ h("span", {
329
+ className: "font-medium text-text-primary",
330
+ children: "Notes"
331
+ }), /* @__PURE__ */ h(C, {
332
+ value: z.notes,
333
+ onChange: (e) => G("notes", e.target.value),
334
+ rows: 3
335
+ })]
336
+ })
337
+ ]
338
+ });
339
+ }
340
+ //#endregion
341
+ export { k as default };
342
+
343
+ //# sourceMappingURL=MeetingFormPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MeetingFormPage.js","names":[],"sources":["../../../../src/eventfullymanaged/pages/networking/MeetingFormPage.tsx"],"sourcesContent":["/* eslint-disable react-hooks/set-state-in-effect */\nimport {\n Input,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Textarea,\n} from '@burdenoff/fe-libs/ui';\nimport { useEffect, useMemo, useState } from 'react';\nimport { useParams } from 'react-router-dom';\n\nimport {\n useAttendeesQuery,\n useCreateMeetingMutation,\n useEventsQuery,\n useMeetingsQuery,\n useNetworkingProfilesQuery,\n useUpdateMeetingMutation,\n} from '../../api/eventApi';\nimport { EntityFormShell } from '../../components/EntityFormShell';\nimport { useEventfullyManaged } from '../../context/EventfullyManagedContext';\nimport { describeError, mutationSucceeded } from '../../lib/mutationResult';\nimport { notify } from '../../lib/toast';\n\ntype MeetingFormState = {\n eventId: string;\n title: string;\n sourceProfileId: string;\n targetProfileId: string;\n startsAt: string;\n endsAt: string;\n location: string;\n bookingPageId: string;\n bookerName: string;\n bookerEmail: string;\n notes: string;\n status: string;\n};\n\nconst initialState: MeetingFormState = {\n eventId: '',\n title: '',\n sourceProfileId: '',\n targetProfileId: '',\n startsAt: '',\n endsAt: '',\n location: '',\n bookingPageId: '',\n bookerName: '',\n bookerEmail: '',\n notes: '',\n status: 'SCHEDULED',\n};\n\nconst STATUS_OPTIONS = [\n { value: 'SCHEDULED', label: 'Scheduled' },\n { value: 'CONFIRMED', label: 'Confirmed' },\n { value: 'COMPLETED', label: 'Completed' },\n { value: 'CANCELLED', label: 'Cancelled' },\n];\n\n/** Convert an ISO timestamp to the local `datetime-local` input format. */\nfunction isoToLocalInput(iso: string | undefined): string {\n if (!iso) {\n return '';\n }\n const date = new Date(iso);\n if (Number.isNaN(date.getTime())) {\n return '';\n }\n const offsetMs = date.getTimezoneOffset() * 60 * 1000;\n return new Date(date.getTime() - offsetMs).toISOString().slice(0, 16);\n}\n\n/** Convert a `datetime-local` value to an ISO timestamp for the DateTime scalar. */\nfunction localInputToIso(value: string): string | null {\n if (!value) {\n return null;\n }\n const date = new Date(value);\n return Number.isNaN(date.getTime()) ? null : date.toISOString();\n}\n\nfunction readString(metadata: Record<string, unknown> | null | undefined, key: string): string {\n const value = metadata?.[key];\n return typeof value === 'string' ? value : '';\n}\n\nexport default function MeetingFormPage() {\n const { id = '' } = useParams<{ id: string }>();\n const isEdit = useMemo(() => Boolean(id), [id]);\n const { navigate } = useEventfullyManaged();\n\n const { data: eventsData } = useEventsQuery({ limit: 100, offset: 0 });\n // The meetings list resolver returns title/status/metadata only (no by-id\n // resolver), so create/update mirror scheduling detail into metadata and the\n // edit initial-state is rehydrated from there.\n const { data: meetingsData } = useMeetingsQuery({ limit: 100, offset: 0 });\n\n const existing = useMemo(\n () => (meetingsData?.meetings?.items ?? []).find((item) => item.id === id),\n [meetingsData, id]\n );\n\n const [createMeeting, { loading: creating }] = useCreateMeetingMutation();\n const [updateMeeting, { loading: updating }] = useUpdateMeetingMutation();\n const [form, setForm] = useState<MeetingFormState>(initialState);\n\n const { data: profilesData } = useNetworkingProfilesQuery({\n eventId: form.eventId || undefined,\n limit: 100,\n offset: 0,\n });\n const { data: attendeesData } = useAttendeesQuery({\n eventId: form.eventId || undefined,\n limit: 100,\n offset: 0,\n });\n\n const attendeeNames = useMemo(() => {\n const map = new Map<string, string>();\n for (const attendee of attendeesData?.attendees?.items ?? []) {\n map.set(attendee.id, attendee.fullName);\n }\n return map;\n }, [attendeesData]);\n\n const profiles = useMemo(\n () =>\n (profilesData?.networkingProfiles?.items ?? []).map((profile) => ({\n id: profile.id,\n label: attendeeNames.get(profile.attendeeId) ?? profile.role ?? `Profile ${profile.id.slice(0, 8)}`,\n })),\n [profilesData, attendeeNames]\n );\n\n useEffect(() => {\n if (!isEdit || !existing) {\n return;\n }\n const metadata = existing.metadata ?? {};\n setForm({\n eventId: existing.eventId ?? readString(metadata, 'eventId'),\n title: existing.title ?? existing.name ?? readString(metadata, 'title'),\n sourceProfileId: readString(metadata, 'sourceProfileId'),\n targetProfileId: readString(metadata, 'targetProfileId'),\n startsAt: isoToLocalInput(readString(metadata, 'startsAt')),\n endsAt: isoToLocalInput(readString(metadata, 'endsAt')),\n location: readString(metadata, 'location'),\n bookingPageId: readString(metadata, 'bookingPageId'),\n bookerName: readString(metadata, 'bookerName'),\n bookerEmail: readString(metadata, 'bookerEmail'),\n notes: readString(metadata, 'notes'),\n status: existing.status ?? 'SCHEDULED',\n });\n }, [existing, isEdit]);\n\n const onChange = (field: keyof MeetingFormState, value: string) => {\n setForm((prev) => ({ ...prev, [field]: value }));\n };\n\n const onSubmit = async (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n\n if (!form.eventId) {\n notify.error('Event required', 'Choose the event this meeting belongs to.');\n return;\n }\n const startsAtIso = localInputToIso(form.startsAt);\n const endsAtIso = localInputToIso(form.endsAt);\n if (!startsAtIso || !endsAtIso) {\n notify.error('Time required', 'Set both a start and end time for the meeting.');\n return;\n }\n if (new Date(endsAtIso).getTime() <= new Date(startsAtIso).getTime()) {\n notify.error('Invalid time range', 'The meeting must end after it starts.');\n return;\n }\n\n // Mirror scheduling detail into metadata so the calendar-svc integration and\n // the edit form (list resolver returns metadata only) both round-trip.\n const metadata: Record<string, unknown> = {\n startsAt: startsAtIso,\n endsAt: endsAtIso,\n location: form.location,\n notes: form.notes,\n title: form.title,\n sourceProfileId: form.sourceProfileId,\n targetProfileId: form.targetProfileId,\n };\n if (form.bookingPageId.trim()) {\n metadata.bookingPageId = form.bookingPageId.trim();\n }\n if (form.bookerName.trim()) {\n metadata.bookerName = form.bookerName.trim();\n }\n if (form.bookerEmail.trim()) {\n metadata.bookerEmail = form.bookerEmail.trim();\n }\n\n const input: Record<string, unknown> = {\n eventId: form.eventId,\n title: form.title,\n startsAt: startsAtIso,\n endsAt: endsAtIso,\n location: form.location,\n notes: form.notes,\n status: form.status,\n metadata,\n };\n if (form.sourceProfileId) {\n input.sourceProfileId = form.sourceProfileId;\n }\n if (form.targetProfileId) {\n input.targetProfileId = form.targetProfileId;\n }\n // Passing a booking-page id lets the backend mirror the meeting into\n // wspace-calendar-svc rather than the MFE managing a local calendar.\n if (form.bookingPageId.trim()) {\n input.bookingPageId = form.bookingPageId.trim();\n }\n\n try {\n if (isEdit) {\n const response = await updateMeeting({ variables: { id, input } });\n if (!mutationSucceeded(response, response.data?.updateMeeting?.id, 'Could not update meeting')) {\n return;\n }\n navigate('/networking');\n return;\n }\n\n const response = await createMeeting({ variables: { input } });\n if (!mutationSucceeded(response, response.data?.createMeeting?.id, 'Could not book meeting')) {\n return;\n }\n navigate('/networking');\n } catch (error) {\n notify.error('Could not save meeting', describeError(error));\n }\n };\n\n const saving = creating || updating;\n const events = eventsData?.events?.items ?? [];\n\n return (\n <EntityFormShell\n title={isEdit ? 'Edit Meeting' : 'Book a Meeting'}\n description=\"Schedule a 1:1 between two networking profiles.\"\n purpose=\"Meetings are the 1:1s attendees book with each other. Pick the two participants, set a time and place, and — if you use a shared booking page — link it so the meeting mirrors into the calendar service. Everyone sees the same schedule without a separate calendar here.\"\n backLabel=\"Back to Networking\"\n onBack={() => navigate('/networking')}\n onSubmit={onSubmit}\n submitLabel={isEdit ? 'Save Meeting' : 'Book Meeting'}\n saving={saving}\n >\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-2\">\n <label className=\"space-y-1 text-sm\">\n <span className=\"font-medium text-text-primary\">Event</span>\n <Select value={form.eventId} onValueChange={(value) => onChange('eventId', value)}>\n <SelectTrigger aria-label=\"Event\">\n <SelectValue placeholder=\"Select event\" />\n </SelectTrigger>\n <SelectContent>\n {events.map((eventItem) => (\n <SelectItem key={eventItem.id} value={eventItem.id}>\n {eventItem.name}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </label>\n <label className=\"space-y-1 text-sm\">\n <span className=\"font-medium text-text-primary\">Title</span>\n <Input value={form.title} onChange={(e) => onChange('title', e.target.value)} required />\n </label>\n </div>\n\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-2\">\n <label className=\"space-y-1 text-sm\">\n <span className=\"font-medium text-text-primary\">Participant A</span>\n <Select\n value={form.sourceProfileId}\n onValueChange={(value) => onChange('sourceProfileId', value)}\n disabled={!form.eventId}\n >\n <SelectTrigger aria-label=\"Participant A\">\n <SelectValue placeholder={form.eventId ? 'Select profile' : 'Select an event first'} />\n </SelectTrigger>\n <SelectContent>\n {profiles.map((profile) => (\n <SelectItem key={profile.id} value={profile.id}>\n {profile.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </label>\n <label className=\"space-y-1 text-sm\">\n <span className=\"font-medium text-text-primary\">Participant B</span>\n <Select\n value={form.targetProfileId}\n onValueChange={(value) => onChange('targetProfileId', value)}\n disabled={!form.eventId}\n >\n <SelectTrigger aria-label=\"Participant B\">\n <SelectValue placeholder={form.eventId ? 'Select profile' : 'Select an event first'} />\n </SelectTrigger>\n <SelectContent>\n {profiles.map((profile) => (\n <SelectItem key={profile.id} value={profile.id}>\n {profile.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </label>\n </div>\n\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-3\">\n <label className=\"space-y-1 text-sm\">\n <span className=\"font-medium text-text-primary\">Starts at</span>\n <Input type=\"datetime-local\" value={form.startsAt} onChange={(e) => onChange('startsAt', e.target.value)} />\n </label>\n <label className=\"space-y-1 text-sm\">\n <span className=\"font-medium text-text-primary\">Ends at</span>\n <Input type=\"datetime-local\" value={form.endsAt} onChange={(e) => onChange('endsAt', e.target.value)} />\n </label>\n <label className=\"space-y-1 text-sm\">\n <span className=\"font-medium text-text-primary\">Status</span>\n <Select value={form.status} onValueChange={(value) => onChange('status', value)}>\n <SelectTrigger aria-label=\"Status\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {STATUS_OPTIONS.map((option) => (\n <SelectItem key={option.value} value={option.value}>\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </label>\n </div>\n\n <label className=\"block space-y-1 text-sm\">\n <span className=\"font-medium text-text-primary\">Location</span>\n <Input\n value={form.location}\n onChange={(e) => onChange('location', e.target.value)}\n placeholder=\"Networking lounge, Table 4\"\n />\n </label>\n\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-3\">\n <label className=\"space-y-1 text-sm\">\n <span className=\"font-medium text-text-primary\">Booking page ID</span>\n <Input\n value={form.bookingPageId}\n onChange={(e) => onChange('bookingPageId', e.target.value)}\n placeholder=\"Optional — mirrors to calendar\"\n />\n </label>\n <label className=\"space-y-1 text-sm\">\n <span className=\"font-medium text-text-primary\">Booker name</span>\n <Input value={form.bookerName} onChange={(e) => onChange('bookerName', e.target.value)} />\n </label>\n <label className=\"space-y-1 text-sm\">\n <span className=\"font-medium text-text-primary\">Booker email</span>\n <Input\n type=\"email\"\n value={form.bookerEmail}\n onChange={(e) => onChange('bookerEmail', e.target.value)}\n />\n </label>\n </div>\n\n <label className=\"block space-y-1 text-sm\">\n <span className=\"font-medium text-text-primary\">Notes</span>\n <Textarea value={form.notes} onChange={(e) => onChange('notes', e.target.value)} rows={3} />\n </label>\n </EntityFormShell>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,236 @@
1
+ import { useEventfullyManaged as e } from "../../context/EventfullyManagedContext.js";
2
+ import { notify as t } from "../../lib/toast.js";
3
+ import { useAttendeesQuery as n, useCreateNetworkingProfileMutation as r, useEventsQuery as i, useNetworkingProfilesQuery as a, useUpdateNetworkingProfileMutation as o } from "../../api/eventApi.js";
4
+ import { EntityFormShell as s } from "../../components/EntityFormShell.js";
5
+ import { describeError as c, mutationSucceeded as l } from "../../lib/mutationResult.js";
6
+ import { useEffect as u, useMemo as d, useState as f } from "react";
7
+ import { useParams as p } from "react-router-dom";
8
+ import { jsx as m, jsxs as h } from "react/jsx-runtime";
9
+ import { Input as g, Select as _, SelectContent as v, SelectItem as y, SelectTrigger as b, SelectValue as x, Textarea as S } from "@burdenoff/fe-libs/ui";
10
+ //#region src/eventfullymanaged/pages/networking/NetworkingProfileFormPage.tsx
11
+ var C = {
12
+ eventId: "",
13
+ attendeeId: "",
14
+ interests: "",
15
+ goals: "",
16
+ availability: "",
17
+ industry: "",
18
+ role: "",
19
+ visibility: "ATTENDEES"
20
+ }, w = [
21
+ {
22
+ value: "PUBLIC",
23
+ label: "Public"
24
+ },
25
+ {
26
+ value: "ATTENDEES",
27
+ label: "Attendees only"
28
+ },
29
+ {
30
+ value: "PRIVATE",
31
+ label: "Private"
32
+ }
33
+ ];
34
+ function T(e) {
35
+ return e.split(",").map((e) => e.trim()).filter(Boolean);
36
+ }
37
+ function E() {
38
+ let { id: E = "" } = p(), D = d(() => !!E, [E]), { navigate: O } = e(), { data: k } = i({
39
+ limit: 100,
40
+ offset: 0
41
+ }), { data: A } = a({
42
+ limit: 100,
43
+ offset: 0
44
+ }), j = d(() => (A?.networkingProfiles?.items ?? []).find((e) => e.id === E), [A, E]), [M, { loading: N }] = r(), [P, { loading: F }] = o(), [I, L] = f(C), { data: R } = n({
45
+ eventId: I.eventId || void 0,
46
+ limit: 100,
47
+ offset: 0
48
+ }), z = R?.attendees?.items ?? [];
49
+ u(() => {
50
+ if (!D || !j) return;
51
+ let e = j.metadata ?? {}, t = typeof e.availability == "string" ? e.availability : "";
52
+ L({
53
+ eventId: j.eventId ?? "",
54
+ attendeeId: j.attendeeId ?? "",
55
+ interests: (j.interests ?? []).join(", "),
56
+ goals: (j.lookingFor ?? []).join(", "),
57
+ availability: t,
58
+ industry: j.industry ?? "",
59
+ role: j.role ?? "",
60
+ visibility: j.visibility ?? "ATTENDEES"
61
+ });
62
+ }, [j, D]);
63
+ let B = (e, t) => {
64
+ L((n) => ({
65
+ ...n,
66
+ [e]: t
67
+ }));
68
+ }, V = async (e) => {
69
+ if (e.preventDefault(), !I.eventId) {
70
+ t.error("Event required", "Choose the event this profile is opting into.");
71
+ return;
72
+ }
73
+ if (!I.attendeeId) {
74
+ t.error("Attendee required", "Choose the attendee this profile represents.");
75
+ return;
76
+ }
77
+ let n = j?.metadata ?? {}, r = {
78
+ eventId: I.eventId,
79
+ attendeeId: I.attendeeId,
80
+ interests: T(I.interests),
81
+ lookingFor: T(I.goals),
82
+ industry: I.industry,
83
+ role: I.role,
84
+ visibility: I.visibility,
85
+ metadata: {
86
+ ...n,
87
+ availability: I.availability
88
+ }
89
+ };
90
+ try {
91
+ if (D) {
92
+ let e = await P({ variables: {
93
+ id: E,
94
+ input: r
95
+ } });
96
+ if (!l(e, e.data?.updateNetworkingProfile?.id, "Could not update profile")) return;
97
+ O("/networking");
98
+ return;
99
+ }
100
+ let e = await M({ variables: { input: r } });
101
+ if (!l(e, e.data?.createNetworkingProfile?.id, "Could not create profile")) return;
102
+ O("/networking");
103
+ } catch (e) {
104
+ t.error("Could not save profile", c(e));
105
+ }
106
+ }, H = N || F, U = k?.events?.items ?? [];
107
+ return /* @__PURE__ */ h(s, {
108
+ title: D ? "Edit Networking Profile" : "Opt in to Networking",
109
+ description: "Describe an attendee so the matchmaking engine can suggest the right connections.",
110
+ purpose: "A networking profile is how an attendee tells the matchmaking engine who they are and who they want to meet. Interests and goals drive the suggested matches, availability tells others when to book time, and visibility controls who can see the profile.",
111
+ backLabel: "Back to Networking",
112
+ onBack: () => O("/networking"),
113
+ onSubmit: V,
114
+ submitLabel: D ? "Save Profile" : "Opt in",
115
+ saving: H,
116
+ children: [
117
+ /* @__PURE__ */ h("div", {
118
+ className: "grid grid-cols-1 gap-4 md:grid-cols-2",
119
+ children: [/* @__PURE__ */ h("label", {
120
+ className: "space-y-1 text-sm",
121
+ children: [/* @__PURE__ */ m("span", {
122
+ className: "font-medium text-text-primary",
123
+ children: "Event"
124
+ }), /* @__PURE__ */ h(_, {
125
+ value: I.eventId,
126
+ onValueChange: (e) => B("eventId", e),
127
+ children: [/* @__PURE__ */ m(b, {
128
+ "aria-label": "Event",
129
+ children: /* @__PURE__ */ m(x, { placeholder: "Select event" })
130
+ }), /* @__PURE__ */ m(v, { children: U.map((e) => /* @__PURE__ */ m(y, {
131
+ value: e.id,
132
+ children: e.name
133
+ }, e.id)) })]
134
+ })]
135
+ }), /* @__PURE__ */ h("label", {
136
+ className: "space-y-1 text-sm",
137
+ children: [/* @__PURE__ */ m("span", {
138
+ className: "font-medium text-text-primary",
139
+ children: "Attendee"
140
+ }), /* @__PURE__ */ h(_, {
141
+ value: I.attendeeId,
142
+ onValueChange: (e) => B("attendeeId", e),
143
+ disabled: !I.eventId,
144
+ children: [/* @__PURE__ */ m(b, {
145
+ "aria-label": "Attendee",
146
+ children: /* @__PURE__ */ m(x, { placeholder: I.eventId ? "Select attendee" : "Select an event first" })
147
+ }), /* @__PURE__ */ m(v, { children: z.map((e) => /* @__PURE__ */ m(y, {
148
+ value: e.id,
149
+ children: e.fullName
150
+ }, e.id)) })]
151
+ })]
152
+ })]
153
+ }),
154
+ /* @__PURE__ */ h("label", {
155
+ className: "block space-y-1 text-sm",
156
+ children: [/* @__PURE__ */ m("span", {
157
+ className: "font-medium text-text-primary",
158
+ children: "Interests (comma separated)"
159
+ }), /* @__PURE__ */ m(g, {
160
+ value: I.interests,
161
+ onChange: (e) => B("interests", e.target.value),
162
+ placeholder: "AI, fintech, design"
163
+ })]
164
+ }),
165
+ /* @__PURE__ */ h("label", {
166
+ className: "block space-y-1 text-sm",
167
+ children: [/* @__PURE__ */ m("span", {
168
+ className: "font-medium text-text-primary",
169
+ children: "Goals — who they want to meet (comma separated)"
170
+ }), /* @__PURE__ */ m(g, {
171
+ value: I.goals,
172
+ onChange: (e) => B("goals", e.target.value),
173
+ placeholder: "investors, hiring partners, mentors"
174
+ })]
175
+ }),
176
+ /* @__PURE__ */ h("label", {
177
+ className: "block space-y-1 text-sm",
178
+ children: [/* @__PURE__ */ m("span", {
179
+ className: "font-medium text-text-primary",
180
+ children: "Availability"
181
+ }), /* @__PURE__ */ m(S, {
182
+ value: I.availability,
183
+ onChange: (e) => B("availability", e.target.value),
184
+ rows: 2,
185
+ placeholder: "Free during lunch and after the keynote"
186
+ })]
187
+ }),
188
+ /* @__PURE__ */ h("div", {
189
+ className: "grid grid-cols-1 gap-4 md:grid-cols-3",
190
+ children: [
191
+ /* @__PURE__ */ h("label", {
192
+ className: "space-y-1 text-sm",
193
+ children: [/* @__PURE__ */ m("span", {
194
+ className: "font-medium text-text-primary",
195
+ children: "Industry"
196
+ }), /* @__PURE__ */ m(g, {
197
+ value: I.industry,
198
+ onChange: (e) => B("industry", e.target.value)
199
+ })]
200
+ }),
201
+ /* @__PURE__ */ h("label", {
202
+ className: "space-y-1 text-sm",
203
+ children: [/* @__PURE__ */ m("span", {
204
+ className: "font-medium text-text-primary",
205
+ children: "Role"
206
+ }), /* @__PURE__ */ m(g, {
207
+ value: I.role,
208
+ onChange: (e) => B("role", e.target.value)
209
+ })]
210
+ }),
211
+ /* @__PURE__ */ h("label", {
212
+ className: "space-y-1 text-sm",
213
+ children: [/* @__PURE__ */ m("span", {
214
+ className: "font-medium text-text-primary",
215
+ children: "Visibility"
216
+ }), /* @__PURE__ */ h(_, {
217
+ value: I.visibility,
218
+ onValueChange: (e) => B("visibility", e),
219
+ children: [/* @__PURE__ */ m(b, {
220
+ "aria-label": "Visibility",
221
+ children: /* @__PURE__ */ m(x, {})
222
+ }), /* @__PURE__ */ m(v, { children: w.map((e) => /* @__PURE__ */ m(y, {
223
+ value: e.value,
224
+ children: e.label
225
+ }, e.value)) })]
226
+ })]
227
+ })
228
+ ]
229
+ })
230
+ ]
231
+ });
232
+ }
233
+ //#endregion
234
+ export { E as default };
235
+
236
+ //# sourceMappingURL=NetworkingProfileFormPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NetworkingProfileFormPage.js","names":[],"sources":["../../../../src/eventfullymanaged/pages/networking/NetworkingProfileFormPage.tsx"],"sourcesContent":["/* eslint-disable react-hooks/set-state-in-effect */\nimport {\n Input,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Textarea,\n} from '@burdenoff/fe-libs/ui';\nimport { useEffect, useMemo, useState } from 'react';\nimport { useParams } from 'react-router-dom';\n\nimport {\n useAttendeesQuery,\n useCreateNetworkingProfileMutation,\n useEventsQuery,\n useNetworkingProfilesQuery,\n useUpdateNetworkingProfileMutation,\n} from '../../api/eventApi';\nimport { EntityFormShell } from '../../components/EntityFormShell';\nimport { useEventfullyManaged } from '../../context/EventfullyManagedContext';\nimport { describeError, mutationSucceeded } from '../../lib/mutationResult';\nimport { notify } from '../../lib/toast';\n\ntype ProfileFormState = {\n eventId: string;\n attendeeId: string;\n interests: string;\n goals: string;\n availability: string;\n industry: string;\n role: string;\n visibility: string;\n};\n\nconst initialState: ProfileFormState = {\n eventId: '',\n attendeeId: '',\n interests: '',\n goals: '',\n availability: '',\n industry: '',\n role: '',\n visibility: 'ATTENDEES',\n};\n\nconst VISIBILITY_OPTIONS = [\n { value: 'PUBLIC', label: 'Public' },\n { value: 'ATTENDEES', label: 'Attendees only' },\n { value: 'PRIVATE', label: 'Private' },\n];\n\nfunction splitList(value: string): string[] {\n return value\n .split(',')\n .map((item) => item.trim())\n .filter(Boolean);\n}\n\nexport default function NetworkingProfileFormPage() {\n const { id = '' } = useParams<{ id: string }>();\n const isEdit = useMemo(() => Boolean(id), [id]);\n const { navigate } = useEventfullyManaged();\n\n const { data: eventsData } = useEventsQuery({ limit: 100, offset: 0 });\n // No by-id resolver for profiles — derive edit state from the list row.\n const { data: profilesData } = useNetworkingProfilesQuery({ limit: 100, offset: 0 });\n\n const existing = useMemo(\n () => (profilesData?.networkingProfiles?.items ?? []).find((item) => item.id === id),\n [profilesData, id]\n );\n\n const [createProfile, { loading: creating }] = useCreateNetworkingProfileMutation();\n const [updateProfile, { loading: updating }] = useUpdateNetworkingProfileMutation();\n const [form, setForm] = useState<ProfileFormState>(initialState);\n\n const { data: attendeesData } = useAttendeesQuery({\n eventId: form.eventId || undefined,\n limit: 100,\n offset: 0,\n });\n const attendees = attendeesData?.attendees?.items ?? [];\n\n useEffect(() => {\n if (!isEdit || !existing) {\n return;\n }\n const metadata = existing.metadata ?? {};\n const availability = typeof metadata.availability === 'string' ? metadata.availability : '';\n setForm({\n eventId: existing.eventId ?? '',\n attendeeId: existing.attendeeId ?? '',\n interests: (existing.interests ?? []).join(', '),\n goals: (existing.lookingFor ?? []).join(', '),\n availability,\n industry: existing.industry ?? '',\n role: existing.role ?? '',\n visibility: existing.visibility ?? 'ATTENDEES',\n });\n }, [existing, isEdit]);\n\n const onChange = (field: keyof ProfileFormState, value: string) => {\n setForm((prev) => ({ ...prev, [field]: value }));\n };\n\n const onSubmit = async (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n\n if (!form.eventId) {\n notify.error('Event required', 'Choose the event this profile is opting into.');\n return;\n }\n if (!form.attendeeId) {\n notify.error('Attendee required', 'Choose the attendee this profile represents.');\n return;\n }\n\n const existingMetadata = existing?.metadata ?? {};\n const input = {\n eventId: form.eventId,\n attendeeId: form.attendeeId,\n interests: splitList(form.interests),\n lookingFor: splitList(form.goals),\n industry: form.industry,\n role: form.role,\n visibility: form.visibility,\n metadata: { ...existingMetadata, availability: form.availability },\n };\n\n try {\n if (isEdit) {\n const response = await updateProfile({ variables: { id, input } });\n if (!mutationSucceeded(response, response.data?.updateNetworkingProfile?.id, 'Could not update profile')) {\n return;\n }\n navigate('/networking');\n return;\n }\n\n const response = await createProfile({ variables: { input } });\n if (!mutationSucceeded(response, response.data?.createNetworkingProfile?.id, 'Could not create profile')) {\n return;\n }\n navigate('/networking');\n } catch (error) {\n notify.error('Could not save profile', describeError(error));\n }\n };\n\n const saving = creating || updating;\n const events = eventsData?.events?.items ?? [];\n\n return (\n <EntityFormShell\n title={isEdit ? 'Edit Networking Profile' : 'Opt in to Networking'}\n description=\"Describe an attendee so the matchmaking engine can suggest the right connections.\"\n purpose=\"A networking profile is how an attendee tells the matchmaking engine who they are and who they want to meet. Interests and goals drive the suggested matches, availability tells others when to book time, and visibility controls who can see the profile.\"\n backLabel=\"Back to Networking\"\n onBack={() => navigate('/networking')}\n onSubmit={onSubmit}\n submitLabel={isEdit ? 'Save Profile' : 'Opt in'}\n saving={saving}\n >\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-2\">\n <label className=\"space-y-1 text-sm\">\n <span className=\"font-medium text-text-primary\">Event</span>\n <Select value={form.eventId} onValueChange={(value) => onChange('eventId', value)}>\n <SelectTrigger aria-label=\"Event\">\n <SelectValue placeholder=\"Select event\" />\n </SelectTrigger>\n <SelectContent>\n {events.map((eventItem) => (\n <SelectItem key={eventItem.id} value={eventItem.id}>\n {eventItem.name}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </label>\n <label className=\"space-y-1 text-sm\">\n <span className=\"font-medium text-text-primary\">Attendee</span>\n <Select\n value={form.attendeeId}\n onValueChange={(value) => onChange('attendeeId', value)}\n disabled={!form.eventId}\n >\n <SelectTrigger aria-label=\"Attendee\">\n <SelectValue placeholder={form.eventId ? 'Select attendee' : 'Select an event first'} />\n </SelectTrigger>\n <SelectContent>\n {attendees.map((attendee) => (\n <SelectItem key={attendee.id} value={attendee.id}>\n {attendee.fullName}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </label>\n </div>\n\n <label className=\"block space-y-1 text-sm\">\n <span className=\"font-medium text-text-primary\">Interests (comma separated)</span>\n <Input\n value={form.interests}\n onChange={(e) => onChange('interests', e.target.value)}\n placeholder=\"AI, fintech, design\"\n />\n </label>\n\n <label className=\"block space-y-1 text-sm\">\n <span className=\"font-medium text-text-primary\">Goals — who they want to meet (comma separated)</span>\n <Input\n value={form.goals}\n onChange={(e) => onChange('goals', e.target.value)}\n placeholder=\"investors, hiring partners, mentors\"\n />\n </label>\n\n <label className=\"block space-y-1 text-sm\">\n <span className=\"font-medium text-text-primary\">Availability</span>\n <Textarea\n value={form.availability}\n onChange={(e) => onChange('availability', e.target.value)}\n rows={2}\n placeholder=\"Free during lunch and after the keynote\"\n />\n </label>\n\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-3\">\n <label className=\"space-y-1 text-sm\">\n <span className=\"font-medium text-text-primary\">Industry</span>\n <Input value={form.industry} onChange={(e) => onChange('industry', e.target.value)} />\n </label>\n <label className=\"space-y-1 text-sm\">\n <span className=\"font-medium text-text-primary\">Role</span>\n <Input value={form.role} onChange={(e) => onChange('role', e.target.value)} />\n </label>\n <label className=\"space-y-1 text-sm\">\n <span className=\"font-medium text-text-primary\">Visibility</span>\n <Select value={form.visibility} onValueChange={(value) => onChange('visibility', value)}>\n <SelectTrigger aria-label=\"Visibility\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {VISIBILITY_OPTIONS.map((option) => (\n <SelectItem key={option.value} value={option.value}>\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </label>\n </div>\n </EntityFormShell>\n );\n}\n"],"mappings":"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"}