kaafil-react-uikit 0.1.0-beta.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 (79) hide show
  1. package/CHANGELOG.md +70 -0
  2. package/LICENSE +21 -0
  3. package/README.md +187 -0
  4. package/dist/OfflineFallbackScreen-B5dfaJBN.d.ts +37 -0
  5. package/dist/OfflineFallbackScreen-Ctm7nBa-.d.cts +37 -0
  6. package/dist/SessionExpiredScreen-CytQNuak.d.cts +50 -0
  7. package/dist/SessionExpiredScreen-D8GHyZc3.d.ts +50 -0
  8. package/dist/admin/index.cjs +23779 -0
  9. package/dist/admin/index.cjs.map +1 -0
  10. package/dist/admin/index.d.cts +1157 -0
  11. package/dist/admin/index.d.ts +1157 -0
  12. package/dist/admin/index.js +23724 -0
  13. package/dist/admin/index.js.map +1 -0
  14. package/dist/chunk-6FPAGGFL.js +6028 -0
  15. package/dist/chunk-6FPAGGFL.js.map +1 -0
  16. package/dist/chunk-ACVU55PZ.cjs +294 -0
  17. package/dist/chunk-ACVU55PZ.cjs.map +1 -0
  18. package/dist/chunk-EM7JV3D7.cjs +6051 -0
  19. package/dist/chunk-EM7JV3D7.cjs.map +1 -0
  20. package/dist/chunk-IIPQ4JNC.js +287 -0
  21. package/dist/chunk-IIPQ4JNC.js.map +1 -0
  22. package/dist/chunk-LL243STJ.cjs +2195 -0
  23. package/dist/chunk-LL243STJ.cjs.map +1 -0
  24. package/dist/chunk-PJRZCOFF.cjs +958 -0
  25. package/dist/chunk-PJRZCOFF.cjs.map +1 -0
  26. package/dist/chunk-PTQ2CJKE.cjs +40 -0
  27. package/dist/chunk-PTQ2CJKE.cjs.map +1 -0
  28. package/dist/chunk-PZKXLQSU.js +10 -0
  29. package/dist/chunk-PZKXLQSU.js.map +1 -0
  30. package/dist/chunk-QHUDOVKW.cjs +111 -0
  31. package/dist/chunk-QHUDOVKW.cjs.map +1 -0
  32. package/dist/chunk-TOBZFADB.cjs +12 -0
  33. package/dist/chunk-TOBZFADB.cjs.map +1 -0
  34. package/dist/chunk-UUGMNP27.js +936 -0
  35. package/dist/chunk-UUGMNP27.js.map +1 -0
  36. package/dist/chunk-UYJ6LIWP.js +2154 -0
  37. package/dist/chunk-UYJ6LIWP.js.map +1 -0
  38. package/dist/chunk-VHTSTUCJ.cjs +346 -0
  39. package/dist/chunk-VHTSTUCJ.cjs.map +1 -0
  40. package/dist/chunk-WUAFL77X.js +340 -0
  41. package/dist/chunk-WUAFL77X.js.map +1 -0
  42. package/dist/chunk-XI7MK4Y7.js +38 -0
  43. package/dist/chunk-XI7MK4Y7.js.map +1 -0
  44. package/dist/chunk-YDGR7JSY.js +107 -0
  45. package/dist/chunk-YDGR7JSY.js.map +1 -0
  46. package/dist/core/index.cjs +1254 -0
  47. package/dist/core/index.cjs.map +1 -0
  48. package/dist/core/index.d.cts +1267 -0
  49. package/dist/core/index.d.ts +1267 -0
  50. package/dist/core/index.js +995 -0
  51. package/dist/core/index.js.map +1 -0
  52. package/dist/index.css +1 -0
  53. package/dist/manager/index.cjs +13562 -0
  54. package/dist/manager/index.cjs.map +1 -0
  55. package/dist/manager/index.d.cts +1054 -0
  56. package/dist/manager/index.d.ts +1054 -0
  57. package/dist/manager/index.js +13518 -0
  58. package/dist/manager/index.js.map +1 -0
  59. package/dist/testing/index.cjs +221 -0
  60. package/dist/testing/index.cjs.map +1 -0
  61. package/dist/testing/index.d.cts +269 -0
  62. package/dist/testing/index.d.ts +269 -0
  63. package/dist/testing/index.js +208 -0
  64. package/dist/testing/index.js.map +1 -0
  65. package/dist/tokenStyle-CToG5oOS.d.cts +3 -0
  66. package/dist/tokenStyle-CToG5oOS.d.ts +3 -0
  67. package/dist/traveller/index.cjs +1799 -0
  68. package/dist/traveller/index.cjs.map +1 -0
  69. package/dist/traveller/index.d.cts +58 -0
  70. package/dist/traveller/index.d.ts +58 -0
  71. package/dist/traveller/index.js +1789 -0
  72. package/dist/traveller/index.js.map +1 -0
  73. package/dist/useAgencyTrip-BUYSIaC2.d.cts +454 -0
  74. package/dist/useAgencyTrip-BzyJB1D9.d.ts +454 -0
  75. package/dist/useNotifications-BZW1Z_ur.d.cts +356 -0
  76. package/dist/useNotifications-D262i5BQ.d.ts +356 -0
  77. package/dist/useVendors-DXOuZWhZ.d.cts +784 -0
  78. package/dist/useVendors-DXOuZWhZ.d.ts +784 -0
  79. package/package.json +95 -0
@@ -0,0 +1,958 @@
1
+ 'use strict';
2
+
3
+ var chunkLL243STJ_cjs = require('./chunk-LL243STJ.cjs');
4
+ var chunkPTQ2CJKE_cjs = require('./chunk-PTQ2CJKE.cjs');
5
+ var chunkEM7JV3D7_cjs = require('./chunk-EM7JV3D7.cjs');
6
+ var react = require('react');
7
+ var client = require('kaafil-js/client');
8
+
9
+ function useAgencyAdminMe() {
10
+ const client = chunkEM7JV3D7_cjs.useKaafilClient();
11
+ const [result, setResult] = react.useState({ status: "loading" });
12
+ react.useEffect(() => {
13
+ let cancelled = false;
14
+ setResult({ status: "loading" });
15
+ client.agencyAdminMe.read().then((response) => {
16
+ if (cancelled) {
17
+ return;
18
+ }
19
+ setResult({ status: "ready", agencyAdmin: response.agencyAdmin });
20
+ }).catch(() => {
21
+ if (!cancelled) {
22
+ setResult({ status: "error" });
23
+ }
24
+ });
25
+ return () => {
26
+ cancelled = true;
27
+ };
28
+ }, [client]);
29
+ return result;
30
+ }
31
+ function useAgencyChecklistTemplates() {
32
+ const client = chunkEM7JV3D7_cjs.useKaafilClient();
33
+ const [templates, setTemplates] = react.useState([]);
34
+ const [loaded, setLoaded] = react.useState(false);
35
+ const [lastFetchFailed, setLastFetchFailed] = react.useState(false);
36
+ const refresh = react.useCallback(async () => {
37
+ try {
38
+ const response = await client.checklists.agencyTemplates.list({});
39
+ setTemplates(response.templates);
40
+ setLoaded(true);
41
+ setLastFetchFailed(false);
42
+ } catch {
43
+ setLastFetchFailed(true);
44
+ }
45
+ }, [client]);
46
+ react.useEffect(() => {
47
+ void refresh();
48
+ }, [refresh]);
49
+ const createTemplate = react.useCallback(
50
+ async (input) => {
51
+ const response = await client.checklists.agencyTemplates.create(input);
52
+ void refresh();
53
+ return response;
54
+ },
55
+ [client, refresh]
56
+ );
57
+ const patchTemplate = react.useCallback(
58
+ async (input) => {
59
+ const response = await client.checklists.agencyTemplates.patch(input);
60
+ void refresh();
61
+ return response;
62
+ },
63
+ [client, refresh]
64
+ );
65
+ const removeTemplate = react.useCallback(
66
+ async (input) => {
67
+ await client.checklists.agencyTemplates.remove(input);
68
+ void refresh();
69
+ },
70
+ [client, refresh]
71
+ );
72
+ const publishTemplate = react.useCallback(
73
+ async (input) => {
74
+ const response = await client.checklists.agencyTemplates.publish(input);
75
+ void refresh();
76
+ return response;
77
+ },
78
+ [client, refresh]
79
+ );
80
+ return {
81
+ templates,
82
+ loaded,
83
+ lastFetchFailed,
84
+ refresh,
85
+ createTemplate,
86
+ patchTemplate,
87
+ removeTemplate,
88
+ publishTemplate
89
+ };
90
+ }
91
+ function useAgencyForms() {
92
+ const client = chunkEM7JV3D7_cjs.useKaafilClient();
93
+ const [forms, setForms] = react.useState([]);
94
+ const [loaded, setLoaded] = react.useState(false);
95
+ const [lastFetchFailed, setLastFetchFailed] = react.useState(false);
96
+ const refresh = react.useCallback(async () => {
97
+ try {
98
+ const response = await client.forms.list({});
99
+ setForms(response.items);
100
+ setLoaded(true);
101
+ setLastFetchFailed(false);
102
+ } catch {
103
+ setLastFetchFailed(true);
104
+ }
105
+ }, [client]);
106
+ react.useEffect(() => {
107
+ void refresh();
108
+ }, [refresh]);
109
+ const createForm = react.useCallback(
110
+ async (input) => {
111
+ const response = await client.forms.create(input);
112
+ void refresh();
113
+ return response;
114
+ },
115
+ [client, refresh]
116
+ );
117
+ const getForm = react.useCallback(
118
+ async (formId) => client.forms.get({ formId }),
119
+ [client]
120
+ );
121
+ const patchForm = react.useCallback(
122
+ async (input) => {
123
+ const response = await client.forms.patch(input);
124
+ void refresh();
125
+ return response;
126
+ },
127
+ [client, refresh]
128
+ );
129
+ const deleteForm = react.useCallback(
130
+ async (input) => {
131
+ await client.forms.delete(input);
132
+ void refresh();
133
+ },
134
+ [client, refresh]
135
+ );
136
+ const archiveForm = react.useCallback(
137
+ async (formId) => {
138
+ const response = await client.forms.archive({ formId });
139
+ void refresh();
140
+ return response;
141
+ },
142
+ [client, refresh]
143
+ );
144
+ const unarchiveForm = react.useCallback(
145
+ async (formId) => {
146
+ const response = await client.forms.unarchive({ formId });
147
+ void refresh();
148
+ return response;
149
+ },
150
+ [client, refresh]
151
+ );
152
+ const publishForm = react.useCallback(
153
+ async (formId) => {
154
+ const response = await client.forms.publish({ formId });
155
+ void refresh();
156
+ return response;
157
+ },
158
+ [client, refresh]
159
+ );
160
+ const closeForm = react.useCallback(
161
+ async (formId) => {
162
+ const response = await client.forms.close({ formId });
163
+ void refresh();
164
+ return response;
165
+ },
166
+ [client, refresh]
167
+ );
168
+ const reopenForm = react.useCallback(
169
+ async (formId) => {
170
+ const response = await client.forms.reopen({ formId });
171
+ void refresh();
172
+ return response;
173
+ },
174
+ [client, refresh]
175
+ );
176
+ const cloneForm = react.useCallback(
177
+ async (input) => {
178
+ const response = await client.forms.clone(input);
179
+ void refresh();
180
+ return response;
181
+ },
182
+ [client, refresh]
183
+ );
184
+ const reorderForm = react.useCallback(
185
+ async (input) => {
186
+ await client.forms.reorder(input);
187
+ },
188
+ [client]
189
+ );
190
+ const createSection = react.useCallback(
191
+ async (input) => client.forms.sections.create(input),
192
+ [client]
193
+ );
194
+ const patchSection = react.useCallback(
195
+ async (input) => client.forms.sections.patch(input),
196
+ [client]
197
+ );
198
+ const deleteSection = react.useCallback(
199
+ async (input) => {
200
+ await client.forms.sections.delete(input);
201
+ },
202
+ [client]
203
+ );
204
+ const createField = react.useCallback(
205
+ async (input) => client.forms.fields.create(input),
206
+ [client]
207
+ );
208
+ const patchField = react.useCallback(
209
+ async (input) => client.forms.fields.patch(input),
210
+ [client]
211
+ );
212
+ const deleteField = react.useCallback(
213
+ async (input) => {
214
+ await client.forms.fields.delete(input);
215
+ },
216
+ [client]
217
+ );
218
+ const listBindings = react.useCallback(async () => {
219
+ const response = await client.forms.bindings.list();
220
+ return response.items;
221
+ }, [client]);
222
+ return {
223
+ forms,
224
+ loaded,
225
+ lastFetchFailed,
226
+ refresh,
227
+ createForm,
228
+ getForm,
229
+ patchForm,
230
+ deleteForm,
231
+ archiveForm,
232
+ unarchiveForm,
233
+ publishForm,
234
+ closeForm,
235
+ reopenForm,
236
+ cloneForm,
237
+ reorderForm,
238
+ createSection,
239
+ patchSection,
240
+ deleteSection,
241
+ createField,
242
+ patchField,
243
+ deleteField,
244
+ listBindings
245
+ };
246
+ }
247
+ function useAgencyJourneyTriggers() {
248
+ const client = chunkEM7JV3D7_cjs.useKaafilClient();
249
+ const [triggers, setTriggers] = react.useState([]);
250
+ const [loaded, setLoaded] = react.useState(false);
251
+ const [lastFetchFailed, setLastFetchFailed] = react.useState(false);
252
+ const refresh = react.useCallback(async () => {
253
+ try {
254
+ const response = await client.journey.triggers.list({});
255
+ setTriggers(response);
256
+ setLoaded(true);
257
+ setLastFetchFailed(false);
258
+ } catch {
259
+ setLastFetchFailed(true);
260
+ }
261
+ }, [client]);
262
+ react.useEffect(() => {
263
+ void refresh();
264
+ }, [refresh]);
265
+ const patchTrigger = react.useCallback(
266
+ async (input) => {
267
+ const response = await client.journey.triggers.patch(input);
268
+ void refresh();
269
+ return response;
270
+ },
271
+ [client, refresh]
272
+ );
273
+ return { triggers, loaded, lastFetchFailed, refresh, patchTrigger };
274
+ }
275
+ function useAgencyManagerProfile(managerRef) {
276
+ const client = chunkEM7JV3D7_cjs.useKaafilClient();
277
+ const [read, setRead] = react.useState(void 0);
278
+ const [readFailed, setReadFailed] = react.useState(false);
279
+ const refresh = react.useCallback(async () => {
280
+ try {
281
+ const response = await client.agencies.managers.get({ managerRef });
282
+ setRead(response);
283
+ setReadFailed(false);
284
+ } catch {
285
+ setReadFailed(true);
286
+ }
287
+ }, [client, managerRef]);
288
+ react.useEffect(() => {
289
+ void refresh();
290
+ }, [refresh]);
291
+ return { read, readFailed, refresh };
292
+ }
293
+ function useAgencySettings() {
294
+ const client = chunkEM7JV3D7_cjs.useKaafilClient();
295
+ const [document, setDocument] = react.useState(void 0);
296
+ const [loaded, setLoaded] = react.useState(false);
297
+ const [lastFetchFailed, setLastFetchFailed] = react.useState(false);
298
+ const refresh = react.useCallback(async () => {
299
+ try {
300
+ const response = await client.agencies.settings.get({});
301
+ setDocument(response);
302
+ setLoaded(true);
303
+ setLastFetchFailed(false);
304
+ } catch {
305
+ setLastFetchFailed(true);
306
+ }
307
+ }, [client]);
308
+ react.useEffect(() => {
309
+ void refresh();
310
+ }, [refresh]);
311
+ const patchSettings = react.useCallback(
312
+ async (input) => {
313
+ const response = await client.agencies.settings.patch(input);
314
+ void refresh();
315
+ return response;
316
+ },
317
+ [client, refresh]
318
+ );
319
+ return { document, loaded, lastFetchFailed, refresh, patchSettings };
320
+ }
321
+ function useAgencyTrip(tripRef) {
322
+ const client = chunkEM7JV3D7_cjs.useKaafilClient();
323
+ const [read, setRead] = react.useState(void 0);
324
+ const [readFailed, setReadFailed] = react.useState(false);
325
+ const refresh = react.useCallback(async () => {
326
+ try {
327
+ const response = await client.agencies.trips.get({ tripRef });
328
+ setRead(response);
329
+ setReadFailed(false);
330
+ } catch {
331
+ setReadFailed(true);
332
+ }
333
+ }, [client, tripRef]);
334
+ react.useEffect(() => {
335
+ void refresh();
336
+ }, [refresh]);
337
+ return { read, readFailed, refresh };
338
+ }
339
+ var DEFAULT_PAGE_LIMIT = 20;
340
+ var GROUPED_PAGE_LIMIT = 200;
341
+ function useAgencyTripManifest(tripRef) {
342
+ const client = chunkEM7JV3D7_cjs.useKaafilClient();
343
+ const [facets, setFacets] = react.useState(void 0);
344
+ const mountedRef = react.useRef(true);
345
+ react.useEffect(() => {
346
+ mountedRef.current = true;
347
+ return () => {
348
+ mountedRef.current = false;
349
+ };
350
+ }, []);
351
+ const makeManifestFetch = react.useCallback(
352
+ (filters, pageSize) => async (cursor) => {
353
+ const page = await client.agencies.trips.manifest.listPage({
354
+ tripRef,
355
+ ...filters,
356
+ cursor,
357
+ limit: pageSize ?? DEFAULT_PAGE_LIMIT
358
+ });
359
+ if (mountedRef.current) {
360
+ setFacets(page.facets);
361
+ }
362
+ return {
363
+ rows: page,
364
+ nextCursor: page.meta.page.hasNext ? page.meta.page.cursor ?? void 0 : void 0
365
+ };
366
+ },
367
+ [client, tripRef]
368
+ );
369
+ return { makeManifestFetch, facets, groupedPageSize: GROUPED_PAGE_LIMIT };
370
+ }
371
+ var DEFAULT_PAGE_LIMIT2 = 20;
372
+ function useAgencyTrips() {
373
+ const client = chunkEM7JV3D7_cjs.useKaafilClient();
374
+ const [segmentCounts, setSegmentCounts] = react.useState(
375
+ void 0
376
+ );
377
+ const mountedRef = react.useRef(true);
378
+ react.useEffect(() => {
379
+ mountedRef.current = true;
380
+ return () => {
381
+ mountedRef.current = false;
382
+ };
383
+ }, []);
384
+ const makeTripsFetch = react.useCallback(
385
+ (filters) => async (cursor) => {
386
+ const page = await client.agencies.trips.listPage({
387
+ ...filters,
388
+ cursor,
389
+ limit: DEFAULT_PAGE_LIMIT2
390
+ });
391
+ if (mountedRef.current) {
392
+ setSegmentCounts(page.facets.segments);
393
+ }
394
+ return {
395
+ rows: page,
396
+ nextCursor: page.meta.page.hasNext ? page.meta.page.cursor ?? void 0 : void 0
397
+ };
398
+ },
399
+ [client]
400
+ );
401
+ return { makeTripsFetch, segmentCounts };
402
+ }
403
+ var useBookingsInternal = chunkLL243STJ_cjs.createDomainHook("bookings", (tripRef) => {
404
+ const {
405
+ rows: bookings,
406
+ syncedAt,
407
+ refreshLive
408
+ } = chunkLL243STJ_cjs.useSnapshotList(tripRef, "bookings", {
409
+ live: async (liveClient, ref) => {
410
+ const response = await liveClient.bookings.list({ tripRef: ref });
411
+ return { rows: [...response], syncedAt: response.meta.serverTime };
412
+ }
413
+ });
414
+ const vouchersMutation = chunkEM7JV3D7_cjs.useOfflineMutation({
415
+ tripRef,
416
+ enqueue: (engine, input) => engine.enqueue({
417
+ tripRef,
418
+ method: client.SyncOpMethod.Patch,
419
+ path: `/api/v1/trips/${tripRef}/bookings/${input.bookingRef}/vouchers`,
420
+ // Hardcoded literal, not imported: `OperationId` is not exported from
421
+ // `kaafil-js/client`'s public surface (the reasoning `useRooming.ts`
422
+ // documents). Verified against `kaafil-js/src/generated/security.ts`:
423
+ // `OperationId.ReplaceBookingVouchers === 'replaceBookingVouchers'`.
424
+ operationId: "replaceBookingVouchers",
425
+ body: { voucherFileKeys: [...input.voucherFileKeys] }
426
+ }),
427
+ // THE DESK LANE, and the only lane that matters in practice: filing a
428
+ // voucher is desk work and a desk console mounts no `OfflineShell`. The
429
+ // outbox lane above exists because this hook cannot know which shell it
430
+ // is under, not because a manager can call this route — they cannot.
431
+ direct: (liveClient, input) => liveClient.bookings.vouchers.replace({
432
+ tripRef,
433
+ bookingRef: input.bookingRef,
434
+ voucherFileKeys: [...input.voucherFileKeys]
435
+ })
436
+ });
437
+ const mutate = vouchersMutation.mutate;
438
+ const replaceVouchers = react.useCallback(
439
+ async (input) => {
440
+ await mutate(input);
441
+ await refreshLive();
442
+ },
443
+ [mutate, refreshLive]
444
+ );
445
+ return { bookings, syncedAt, refreshLive, replaceVouchers };
446
+ });
447
+ function useBookings(tripRef) {
448
+ return useBookingsInternal(tripRef);
449
+ }
450
+ function useCapabilityStatuses(tripRef) {
451
+ const { rows, loaded } = chunkEM7JV3D7_cjs.useCapabilityRows(tripRef);
452
+ const statuses = react.useMemo(() => {
453
+ const map = /* @__PURE__ */ new Map();
454
+ for (const row of rows) map.set(row.capability, chunkEM7JV3D7_cjs.deriveCapabilityTriple(row).status);
455
+ return map;
456
+ }, [rows]);
457
+ return { statuses, loaded };
458
+ }
459
+ var DEFAULT_PAGE_LIMIT3 = 20;
460
+ var DirectoriesWriteError = class _DirectoriesWriteError extends Error {
461
+ classification;
462
+ constructor(classification) {
463
+ super(
464
+ classification.cause instanceof Error ? classification.cause.message : "The directory write failed."
465
+ );
466
+ this.name = "DirectoriesWriteError";
467
+ Object.setPrototypeOf(this, _DirectoriesWriteError.prototype);
468
+ this.classification = classification;
469
+ }
470
+ };
471
+ function useDirectories(agencyRef) {
472
+ const client = chunkEM7JV3D7_cjs.useKaafilClient();
473
+ const serverTime = chunkPTQ2CJKE_cjs.useServerTime();
474
+ const makeManagersFetch = react.useCallback(
475
+ (filters) => async (cursor) => {
476
+ const page = await client.agencies.managers.listPage({
477
+ ...filters,
478
+ cursor,
479
+ limit: DEFAULT_PAGE_LIMIT3
480
+ });
481
+ return {
482
+ rows: page,
483
+ nextCursor: page.meta.page.hasNext ? page.meta.page.cursor ?? void 0 : void 0
484
+ };
485
+ },
486
+ [client]
487
+ );
488
+ const makeTravellersFetch = react.useCallback(
489
+ (filters) => async (cursor) => {
490
+ const page = await client.travellers.listForAgencyPage({
491
+ ...filters,
492
+ cursor,
493
+ limit: DEFAULT_PAGE_LIMIT3
494
+ });
495
+ return {
496
+ rows: page,
497
+ nextCursor: page.meta.page.hasNext ? page.meta.page.cursor ?? void 0 : void 0
498
+ };
499
+ },
500
+ [client]
501
+ );
502
+ const listTripManifest = react.useCallback(
503
+ async (tripRef) => {
504
+ const response = await client.travellers.listForTrip({ tripRef });
505
+ return response;
506
+ },
507
+ [client]
508
+ );
509
+ const promoteManager = react.useCallback(
510
+ async (input) => {
511
+ try {
512
+ return await client.trips.managers.patch({
513
+ tripRef: input.tripRef,
514
+ managerRef: input.managerRef,
515
+ version: input.version,
516
+ role: input.role,
517
+ isLead: input.isLead
518
+ });
519
+ } catch (error) {
520
+ throw new DirectoriesWriteError(chunkLL243STJ_cjs.classifyError(error));
521
+ }
522
+ },
523
+ [client]
524
+ );
525
+ const assignManager = react.useCallback(
526
+ async (input) => {
527
+ try {
528
+ await client.trips.managers.assign({
529
+ tripRef: input.tripRef,
530
+ managerRef: input.managerRef,
531
+ ...input.role === void 0 ? {} : { role: input.role },
532
+ ...input.isLead === void 0 ? {} : { isLead: input.isLead }
533
+ });
534
+ } catch (error) {
535
+ throw new DirectoriesWriteError(chunkLL243STJ_cjs.classifyError(error));
536
+ }
537
+ },
538
+ [client]
539
+ );
540
+ const unassignManager = react.useCallback(
541
+ async (input) => {
542
+ try {
543
+ await client.trips.managers.unassign({
544
+ tripRef: input.tripRef,
545
+ managerRef: input.managerRef
546
+ });
547
+ } catch (error) {
548
+ throw new DirectoriesWriteError(chunkLL243STJ_cjs.classifyError(error));
549
+ }
550
+ },
551
+ [client]
552
+ );
553
+ const addTraveller = react.useCallback(
554
+ async (input) => {
555
+ try {
556
+ const response = await client.trips.travellers.pushManifest({
557
+ tripRef: input.tripRef,
558
+ travellers: [
559
+ {
560
+ externalTravellerId: input.externalTravellerId,
561
+ fullName: input.fullName,
562
+ phone: input.phone,
563
+ sourceUpdatedAt: serverTime.now()
564
+ }
565
+ ]
566
+ });
567
+ const item = response.items.find(
568
+ (entry) => entry.externalTravellerId === input.externalTravellerId
569
+ );
570
+ if (item === void 0 || item.verdict !== "applied") {
571
+ throw new DirectoriesWriteError({
572
+ path: "surface-to-user",
573
+ code: item?.verdict === "rejected" ? "BUSINESS_RULE_VIOLATION" : void 0,
574
+ status: void 0,
575
+ unsatisfiableScheme: false,
576
+ cause: void 0
577
+ });
578
+ }
579
+ return item.externalTravellerId;
580
+ } catch (error) {
581
+ if (error instanceof DirectoriesWriteError) {
582
+ throw error;
583
+ }
584
+ throw new DirectoriesWriteError(chunkLL243STJ_cjs.classifyError(error));
585
+ }
586
+ },
587
+ [client, serverTime]
588
+ );
589
+ const createAgencyTraveller = react.useCallback(
590
+ async (input) => {
591
+ try {
592
+ return await client.travellers.create({
593
+ fullName: input.fullName,
594
+ phone: input.phone,
595
+ email: input.email,
596
+ locale: input.locale,
597
+ externalTravellerId: input.externalTravellerId
598
+ });
599
+ } catch (error) {
600
+ throw new DirectoriesWriteError(chunkLL243STJ_cjs.classifyError(error));
601
+ }
602
+ },
603
+ [client]
604
+ );
605
+ const removeFromManifest = react.useCallback(
606
+ async (input) => {
607
+ try {
608
+ await client.trips.travellers.remove({
609
+ tripRef: input.tripRef,
610
+ travellerRef: input.travellerRef
611
+ });
612
+ } catch (error) {
613
+ throw new DirectoriesWriteError(chunkLL243STJ_cjs.classifyError(error));
614
+ }
615
+ },
616
+ [client]
617
+ );
618
+ const createParty = react.useCallback(
619
+ async (input) => {
620
+ try {
621
+ return await client.trips.parties.add({
622
+ tripRef: input.tripRef,
623
+ kind: input.kind,
624
+ ...input.label !== void 0 ? { label: input.label } : {},
625
+ travellerRefs: [...input.travellerRefs]
626
+ });
627
+ } catch (error) {
628
+ throw new DirectoriesWriteError(chunkLL243STJ_cjs.classifyError(error));
629
+ }
630
+ },
631
+ [client]
632
+ );
633
+ const patchParty = react.useCallback(
634
+ async (input) => {
635
+ try {
636
+ return await client.trips.parties.patch({
637
+ tripRef: input.tripRef,
638
+ partyId: input.partyId,
639
+ version: input.version,
640
+ ...input.kind !== void 0 ? { kind: input.kind } : {},
641
+ ...input.label !== void 0 ? { label: input.label } : {},
642
+ ...input.travellerRefs !== void 0 ? { travellerRefs: [...input.travellerRefs] } : {}
643
+ });
644
+ } catch (error) {
645
+ throw new DirectoriesWriteError(chunkLL243STJ_cjs.classifyError(error));
646
+ }
647
+ },
648
+ [client]
649
+ );
650
+ const deleteParty = react.useCallback(
651
+ async (input) => {
652
+ try {
653
+ await client.trips.parties.remove({ tripRef: input.tripRef, partyId: input.partyId });
654
+ } catch (error) {
655
+ throw new DirectoriesWriteError(chunkLL243STJ_cjs.classifyError(error));
656
+ }
657
+ },
658
+ [client]
659
+ );
660
+ const addTravellerNote = react.useCallback(
661
+ async (input) => {
662
+ try {
663
+ await client.travellers.addNote({
664
+ tripRef: input.tripRef,
665
+ travellerRef: input.travellerRef,
666
+ body: input.body
667
+ });
668
+ } catch (error) {
669
+ throw new DirectoriesWriteError(chunkLL243STJ_cjs.classifyError(error));
670
+ }
671
+ },
672
+ [client]
673
+ );
674
+ return {
675
+ makeManagersFetch,
676
+ makeTravellersFetch,
677
+ listTripManifest,
678
+ promoteManager,
679
+ assignManager,
680
+ unassignManager,
681
+ addTraveller,
682
+ createAgencyTraveller,
683
+ removeFromManifest,
684
+ createParty,
685
+ patchParty,
686
+ deleteParty,
687
+ addTravellerNote
688
+ };
689
+ }
690
+ function usePaginatedList(fetch, options) {
691
+ const [rows, setRows] = react.useState([]);
692
+ const [hasNext, setHasNext] = react.useState(false);
693
+ const [pageIndex, setPageIndex] = react.useState(0);
694
+ const fetchRef = react.useRef(fetch);
695
+ fetchRef.current = fetch;
696
+ const cursorsRef = react.useRef([void 0]);
697
+ const loadPage = react.useCallback(async (index) => {
698
+ const cursor = cursorsRef.current[index];
699
+ const result = await fetchRef.current(cursor);
700
+ cursorsRef.current = cursorsRef.current.slice(0, index + 1);
701
+ if (result.nextCursor !== void 0) {
702
+ cursorsRef.current[index + 1] = result.nextCursor;
703
+ }
704
+ setRows(result.rows);
705
+ setHasNext(result.nextCursor !== void 0);
706
+ setPageIndex(index);
707
+ }, []);
708
+ react.useEffect(() => {
709
+ void loadPage(0);
710
+ }, [loadPage]);
711
+ const loadNext = react.useCallback(async () => {
712
+ if (!hasNext) {
713
+ return;
714
+ }
715
+ await loadPage(pageIndex + 1);
716
+ }, [hasNext, pageIndex, loadPage]);
717
+ const loadPrev = react.useCallback(async () => {
718
+ if (pageIndex === 0) {
719
+ return;
720
+ }
721
+ await loadPage(pageIndex - 1);
722
+ }, [pageIndex, loadPage]);
723
+ return { rows, hasNext, hasPrev: pageIndex > 0, loadNext, loadPrev };
724
+ }
725
+ var SHARE_SECTION_KEYS = [
726
+ "itinerary",
727
+ "rooming",
728
+ "seating",
729
+ "checklists",
730
+ "pickup",
731
+ "accommodation",
732
+ "transport",
733
+ "activities",
734
+ "documents",
735
+ "money",
736
+ "managerContact",
737
+ "agencyContact",
738
+ "household",
739
+ "forms"
740
+ ];
741
+ function familySafeSections(isFamilyLink) {
742
+ return isFamilyLink ? SHARE_SECTION_KEYS.filter((key) => key !== "money") : SHARE_SECTION_KEYS;
743
+ }
744
+ var ShareLinkWriteError = class extends Error {
745
+ classification;
746
+ constructor(classification) {
747
+ super("Share-link write failed");
748
+ this.name = "ShareLinkWriteError";
749
+ this.classification = classification;
750
+ }
751
+ };
752
+ function useShareLinks(tripRef, travellerRef) {
753
+ const client = chunkEM7JV3D7_cjs.useKaafilClient();
754
+ const [links, setLinks] = react.useState(void 0);
755
+ const [readFailed, setReadFailed] = react.useState(false);
756
+ const refresh = react.useCallback(async () => {
757
+ try {
758
+ const response = await client.shareTokens.list({
759
+ tripRef,
760
+ ...travellerRef !== null ? { travellerRef } : {}
761
+ });
762
+ setLinks(response);
763
+ setReadFailed(false);
764
+ } catch (error) {
765
+ setReadFailed(true);
766
+ }
767
+ }, [client, tripRef, travellerRef]);
768
+ react.useEffect(() => {
769
+ void refresh();
770
+ }, [refresh]);
771
+ const mint = react.useCallback(
772
+ async (input) => {
773
+ try {
774
+ const minted = await client.shareTokens.create({
775
+ tripRef,
776
+ ...input.travellerRef !== void 0 ? { travellerRef: input.travellerRef } : {},
777
+ ...input.sections !== void 0 ? { config: { sections: input.sections } } : {},
778
+ ...input.ttlDays !== void 0 ? { ttlDays: input.ttlDays } : {},
779
+ ...input.expiresAt !== void 0 ? { expiresAt: input.expiresAt } : {}
780
+ });
781
+ await refresh();
782
+ return minted;
783
+ } catch (error) {
784
+ throw new ShareLinkWriteError(chunkLL243STJ_cjs.classifyError(error));
785
+ }
786
+ },
787
+ [client, tripRef, refresh]
788
+ );
789
+ const revoke = react.useCallback(
790
+ async (id) => {
791
+ try {
792
+ await client.shareTokens.revoke({ id });
793
+ await refresh();
794
+ } catch (error) {
795
+ throw new ShareLinkWriteError(chunkLL243STJ_cjs.classifyError(error));
796
+ }
797
+ },
798
+ [client, refresh]
799
+ );
800
+ const patch = react.useCallback(
801
+ async (input) => {
802
+ try {
803
+ await client.shareTokens.patch({
804
+ id: input.id,
805
+ version: input.version,
806
+ ...input.sections !== void 0 ? { config: { sections: input.sections } } : {},
807
+ ...input.expiresAt !== void 0 ? { expiresAt: input.expiresAt } : {}
808
+ });
809
+ await refresh();
810
+ } catch (error) {
811
+ throw new ShareLinkWriteError(chunkLL243STJ_cjs.classifyError(error));
812
+ }
813
+ },
814
+ [client, refresh]
815
+ );
816
+ const regenerate = react.useCallback(
817
+ async (id) => {
818
+ try {
819
+ const minted = await client.shareTokens.regenerate({ id });
820
+ await refresh();
821
+ return minted;
822
+ } catch (error) {
823
+ throw new ShareLinkWriteError(chunkLL243STJ_cjs.classifyError(error));
824
+ }
825
+ },
826
+ [client, refresh]
827
+ );
828
+ return { links, readFailed, refresh, mint, revoke, patch, regenerate };
829
+ }
830
+ function useTravellerFormResponses(tripRef, travellerRef) {
831
+ const client = chunkEM7JV3D7_cjs.useKaafilClient();
832
+ const [responses, setResponses] = react.useState(
833
+ void 0
834
+ );
835
+ const [readFailed, setReadFailed] = react.useState(false);
836
+ const refresh = react.useCallback(async () => {
837
+ if (travellerRef === null) {
838
+ setResponses(void 0);
839
+ setReadFailed(false);
840
+ return;
841
+ }
842
+ try {
843
+ const response = await client.forms.trip.travellerResponses.list({ tripRef, travellerRef });
844
+ setResponses(response.items);
845
+ setReadFailed(false);
846
+ } catch {
847
+ setReadFailed(true);
848
+ }
849
+ }, [client, tripRef, travellerRef]);
850
+ react.useEffect(() => {
851
+ void refresh();
852
+ }, [refresh]);
853
+ return { responses, readFailed, refresh };
854
+ }
855
+
856
+ // src/core/routing/deepLinks.ts
857
+ var CLOSEOUT_ACTION_TAB = {
858
+ open_collections: "payments",
859
+ open_expenses: "expenses",
860
+ open_float: "float",
861
+ open_checklist: "checklist",
862
+ open_mandatory_checklist: "checklist",
863
+ open_forms: "forms",
864
+ open_rooming: "rooming",
865
+ open_seating: "vehicles",
866
+ open_pickups: "pickups",
867
+ open_itinerary: "itinerary",
868
+ open_past_itinerary: "itinerary",
869
+ open_vendors: "vendors"
870
+ };
871
+ var BLOCKER_PRESET_FILTER = {
872
+ balance_due: "outstanding",
873
+ missing_receipt: "missing-receipt",
874
+ open_mandatory_checklist: "open-mandatory",
875
+ required_form_gap: "outstanding-respondents",
876
+ unassigned_rooming: "unassigned",
877
+ // Mirrors `unassigned_rooming` — the spec gives seating the identical
878
+ // arrival contract, pointed at the seating pool instead of the bed pool.
879
+ unseated_travellers: "unassigned"
880
+ // DELIBERATELY ABSENT, each for its own reason:
881
+ // `float_not_returned`, `pickup_no_show`, `open_past_itinerary` — these
882
+ // arrive by `highlightId` on a single row, not by narrowing a list.
883
+ // `reimbursements_pending` — see this map's header; filtering the
884
+ // expense ledger to missing receipts would be actively wrong here.
885
+ // `unrated_vendors` — see `resolveBlockerDeepLink`.
886
+ };
887
+ function resolveBlockerDeepLink(input) {
888
+ const tab = CLOSEOUT_ACTION_TAB[input.actionKey];
889
+ if (tab === void 0) return null;
890
+ const presetFilter = input.key === void 0 ? void 0 : BLOCKER_PRESET_FILTER[input.key];
891
+ return {
892
+ tab,
893
+ ...presetFilter !== void 0 ? { presetFilter } : {},
894
+ ...input.highlightId !== void 0 ? { highlightId: input.highlightId } : {}
895
+ };
896
+ }
897
+ var PARAM_TAB = "kfTab";
898
+ var PARAM_HIGHLIGHT = "kfHighlight";
899
+ var PARAM_FILTER = "kfFilter";
900
+ function toSearchParams(link) {
901
+ const params = new URLSearchParams();
902
+ if (link.tab !== void 0) params.set(PARAM_TAB, link.tab);
903
+ if (link.highlightId !== void 0) params.set(PARAM_HIGHLIGHT, link.highlightId);
904
+ if (link.presetFilter !== void 0) params.set(PARAM_FILTER, link.presetFilter);
905
+ return params;
906
+ }
907
+ function fromSearchParams(params) {
908
+ const rawTab = params.get(PARAM_TAB);
909
+ const highlightId = params.get(PARAM_HIGHLIGHT);
910
+ const presetFilter = params.get(PARAM_FILTER);
911
+ if (rawTab === null && highlightId === null && presetFilter === null) return null;
912
+ const initialTab = isTripTabKey(rawTab) ? rawTab : void 0;
913
+ return {
914
+ ...initialTab !== void 0 ? { initialTab } : {},
915
+ ...highlightId !== null ? { highlightId } : {},
916
+ ...presetFilter !== null ? { presetFilter } : {}
917
+ };
918
+ }
919
+ function isTripTabKey(value) {
920
+ if (value === null || value === void 0) return false;
921
+ return Object.hasOwn(TRIP_TAB_KEY_SET, value);
922
+ }
923
+ var TRIP_TAB_KEY_SET = {
924
+ itinerary: true,
925
+ pickups: true,
926
+ rooming: true,
927
+ vehicles: true,
928
+ vendors: true,
929
+ payments: true,
930
+ expenses: true,
931
+ float: true,
932
+ checklist: true,
933
+ forms: true
934
+ };
935
+
936
+ exports.CLOSEOUT_ACTION_TAB = CLOSEOUT_ACTION_TAB;
937
+ exports.familySafeSections = familySafeSections;
938
+ exports.fromSearchParams = fromSearchParams;
939
+ exports.isTripTabKey = isTripTabKey;
940
+ exports.resolveBlockerDeepLink = resolveBlockerDeepLink;
941
+ exports.toSearchParams = toSearchParams;
942
+ exports.useAgencyAdminMe = useAgencyAdminMe;
943
+ exports.useAgencyChecklistTemplates = useAgencyChecklistTemplates;
944
+ exports.useAgencyForms = useAgencyForms;
945
+ exports.useAgencyJourneyTriggers = useAgencyJourneyTriggers;
946
+ exports.useAgencyManagerProfile = useAgencyManagerProfile;
947
+ exports.useAgencySettings = useAgencySettings;
948
+ exports.useAgencyTrip = useAgencyTrip;
949
+ exports.useAgencyTripManifest = useAgencyTripManifest;
950
+ exports.useAgencyTrips = useAgencyTrips;
951
+ exports.useBookings = useBookings;
952
+ exports.useCapabilityStatuses = useCapabilityStatuses;
953
+ exports.useDirectories = useDirectories;
954
+ exports.usePaginatedList = usePaginatedList;
955
+ exports.useShareLinks = useShareLinks;
956
+ exports.useTravellerFormResponses = useTravellerFormResponses;
957
+ //# sourceMappingURL=chunk-PJRZCOFF.cjs.map
958
+ //# sourceMappingURL=chunk-PJRZCOFF.cjs.map