@almatar/smart-booking-dashboard 0.0.2-alpha.2 → 0.0.2-alpha.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/components/almatar-aside/aside.component.mjs +6 -7
- package/esm2022/lib/components/hotel-cancel/almatar-hotel-auto-cancellation.component.mjs +17 -12
- package/esm2022/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-refund-summary/almatar-hotel-auto-cancellation-refund-summary.component.mjs +9 -3
- package/esm2022/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-result-overlay/almatar-hotel-auto-cancellation-result-overlay.component.mjs +210 -0
- package/esm2022/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-select-rooms/almatar-hotel-auto-cancellation-select-rooms.component.mjs +3 -3
- package/esm2022/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-select-rooms/components/almatar-hotel-auto-cancellation-non-refundable-room/almatar-hotel-auto-cancellation-non-refundable-room.component.mjs +4 -4
- package/esm2022/lib/components/hotel-cancel/components/hotel-content/hotel-content.component.mjs +11 -4
- package/esm2022/lib/components/hotel-cancel/components/hotel-refund-method-selector/hotel-refund-method-selector.component.mjs +23 -21
- package/esm2022/lib/components/hotel-cancel/services/almatar-hotel-auto-cancellation-endpoints.service.mjs +42 -34
- package/esm2022/lib/components/reissue-dialog/reissue-dialog.component.mjs +135 -0
- package/esm2022/lib/components/reissue-dialog/reissue-upgrade.store.mjs +305 -0
- package/esm2022/lib/components/reissue-dialog/reissue.store.mjs +349 -0
- package/esm2022/lib/components/reissue-dialog/steps/reissue-date-step/reissue-date-step.component.mjs +45 -0
- package/esm2022/lib/components/reissue-dialog/steps/reissue-legs-step/reissue-legs-step.component.mjs +140 -0
- package/esm2022/lib/components/reissue-dialog/steps/reissue-notice/reissue-notice.component.mjs +16 -0
- package/esm2022/lib/components/reissue-dialog/steps/reissue-route-step/reissue-route-step.component.mjs +104 -0
- package/esm2022/lib/components/reissue-dialog/steps/reissue-service-step/reissue-service-step.component.mjs +44 -0
- package/esm2022/lib/components/reissue-dialog/steps/reissue-upgrade-confirm-step/reissue-upgrade-confirm-step.component.mjs +193 -0
- package/esm2022/lib/components/reissue-dialog/steps/reissue-upgrade-step/reissue-upgrade-step.component.mjs +88 -0
- package/esm2022/lib/components/workflow-actions/workflow-actions.component.mjs +5 -3
- package/esm2022/lib/config/dashboard.config.mjs +3 -1
- package/esm2022/lib/models/reissue.types.mjs +2 -0
- package/esm2022/lib/pages/smart-booking-dashboard/smart-booking-dashboard.component.mjs +9 -3
- package/esm2022/lib/services/reissue.service.mjs +142 -0
- package/esm2022/lib/services/toast.service.mjs +15 -7
- package/esm2022/lib/utils/reissue-format.mjs +64 -0
- package/esm2022/lib/utils/reissue-url.builder.mjs +314 -0
- package/esm2022/public-api.mjs +3 -1
- package/fesm2022/almatar-smart-booking-dashboard.mjs +2211 -102
- package/fesm2022/almatar-smart-booking-dashboard.mjs.map +1 -1
- package/lib/components/action-dialog/action-dialog.component.d.ts +1 -1
- package/lib/components/almatar-aside/aside.component.d.ts +1 -2
- package/lib/components/hotel-cancel/almatar-hotel-auto-cancellation.component.d.ts +3 -0
- package/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-refund-summary/almatar-hotel-auto-cancellation-refund-summary.component.d.ts +1 -0
- package/lib/components/hotel-cancel/components/almatar-hotel-auto-cancellation-result-overlay/almatar-hotel-auto-cancellation-result-overlay.component.d.ts +46 -0
- package/lib/components/hotel-cancel/components/hotel-content/hotel-content.component.d.ts +2 -1
- package/lib/components/hotel-cancel/services/almatar-hotel-auto-cancellation-endpoints.service.d.ts +6 -0
- package/lib/components/reissue-dialog/reissue-dialog.component.d.ts +34 -0
- package/lib/components/reissue-dialog/reissue-upgrade.store.d.ts +96 -0
- package/lib/components/reissue-dialog/reissue.store.d.ts +124 -0
- package/lib/components/reissue-dialog/steps/reissue-date-step/reissue-date-step.component.d.ts +11 -0
- package/lib/components/reissue-dialog/steps/reissue-legs-step/reissue-legs-step.component.d.ts +16 -0
- package/lib/components/reissue-dialog/steps/reissue-notice/reissue-notice.component.d.ts +8 -0
- package/lib/components/reissue-dialog/steps/reissue-route-step/reissue-route-step.component.d.ts +21 -0
- package/lib/components/reissue-dialog/steps/reissue-service-step/reissue-service-step.component.d.ts +17 -0
- package/lib/components/reissue-dialog/steps/reissue-upgrade-confirm-step/reissue-upgrade-confirm-step.component.d.ts +28 -0
- package/lib/components/reissue-dialog/steps/reissue-upgrade-step/reissue-upgrade-step.component.d.ts +13 -0
- package/lib/components/result-panel/result-panel.component.d.ts +1 -1
- package/lib/components/workflow-actions/workflow-actions.component.d.ts +3 -1
- package/lib/config/dashboard.config.d.ts +29 -0
- package/lib/models/reissue.types.d.ts +147 -0
- package/lib/pages/smart-booking-dashboard/smart-booking-dashboard.component.d.ts +4 -1
- package/lib/services/reissue.service.d.ts +45 -0
- package/lib/services/toast.service.d.ts +14 -1
- package/lib/utils/reissue-format.d.ts +28 -0
- package/lib/utils/reissue-url.builder.d.ts +24 -0
- package/package.json +9 -7
- package/public-api.d.ts +5 -1
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { Injectable, inject } from '@angular/core';
|
|
2
|
+
import { HttpClient } from '@angular/common/http';
|
|
3
|
+
import { of } from 'rxjs';
|
|
4
|
+
import { catchError, map } from 'rxjs/operators';
|
|
5
|
+
import { SBD_CONFIG } from '../config/dashboard.config';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
/**
|
|
8
|
+
* Query params the web always sends on `create-post-booking` (`getEntrySourceDeviceBrand()`): where the flow started
|
|
9
|
+
* and on which device. Same defaults as the web; ask the backend which values BO should send.
|
|
10
|
+
*/
|
|
11
|
+
const POST_BOOKING_PARAMS = { entrySource: 'navigation bar', device: 'web' };
|
|
12
|
+
/**
|
|
13
|
+
* Reissue APIs — the same endpoints the consumer web uses (the backend opens them for BO).
|
|
14
|
+
*/
|
|
15
|
+
export class SbdReissueService {
|
|
16
|
+
constructor() {
|
|
17
|
+
this.http = inject(HttpClient);
|
|
18
|
+
this.config = inject(SBD_CONFIG);
|
|
19
|
+
this.base = this.config.apiBase;
|
|
20
|
+
}
|
|
21
|
+
get headers() {
|
|
22
|
+
return { platform: this.config.platform };
|
|
23
|
+
}
|
|
24
|
+
/** `POST /v2/manage-booking/flight/create-post-booking/{bookingId}` -> `postBookingId`. */
|
|
25
|
+
createPostBooking(bookingId) {
|
|
26
|
+
return this.http
|
|
27
|
+
.post(`${this.base}/v2/manage-booking/flight/create-post-booking/${bookingId}`, null, // the web sends no body on this call
|
|
28
|
+
{ headers: this.headers, params: POST_BOOKING_PARAMS })
|
|
29
|
+
.pipe(map(res => res?.data?.postBookingId ?? ''));
|
|
30
|
+
}
|
|
31
|
+
/** `GET /v3/manage-booking/flight/reissue/availability/{bookingId}/{postBookingId}` -> `data.legs[]`. */
|
|
32
|
+
getAvailability(bookingId, postBookingId, ctx) {
|
|
33
|
+
return this.http.get(`${this.base}/v3/manage-booking/flight/reissue/availability/${bookingId}/${postBookingId}`, { headers: this.headers });
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* `POST /v3/manage-booking/flight/reissue/upgrade-class/{bookingId}/{postBookingId}` — same call (and body) the
|
|
37
|
+
* web makes to decide whether the "Upgrade Class" option is shown. Returns the unwrapped `data`.
|
|
38
|
+
*/
|
|
39
|
+
getUpgradeClassOptions(bookingId, postBookingId, ctx) {
|
|
40
|
+
const body = {
|
|
41
|
+
serviceName: 'change-flight-class',
|
|
42
|
+
legs: ctx.legs.map(l => ({
|
|
43
|
+
legId: l.legId,
|
|
44
|
+
legDepartureAirportCode: l.originCode,
|
|
45
|
+
legArrivalAirportCode: l.destinationCode,
|
|
46
|
+
legDepartureDate: l.departure,
|
|
47
|
+
})),
|
|
48
|
+
};
|
|
49
|
+
return this.http
|
|
50
|
+
.post(`${this.base}/v3/manage-booking/flight/reissue/upgrade-class/${bookingId}/${postBookingId}`, body, { headers: this.headers })
|
|
51
|
+
.pipe(map(res => (res?.data ?? res) ?? null));
|
|
52
|
+
}
|
|
53
|
+
/** Same rule as the web's `hasUpgradeOptions()`: at least one option in any section. */
|
|
54
|
+
hasUpgradeOptions(data) {
|
|
55
|
+
if (!data)
|
|
56
|
+
return false;
|
|
57
|
+
if (data.fareOptionScope === 'leg')
|
|
58
|
+
return (data.legs ?? []).some(l => (l.options?.length ?? 0) > 0);
|
|
59
|
+
return (data.options?.length ?? 0) > 0;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Airport picker for Change Route. Same typeahead endpoint the web and the backoffice already use
|
|
63
|
+
* (`StaticDataService.getAirports`) — no extra backend work needed. Response: `data[].items[].items[]`.
|
|
64
|
+
* An empty term makes no request (the dialog lists the booking's own airports meanwhile).
|
|
65
|
+
*/
|
|
66
|
+
searchAirports(term) {
|
|
67
|
+
const q = term.trim();
|
|
68
|
+
if (!q)
|
|
69
|
+
return of([]);
|
|
70
|
+
return this.http
|
|
71
|
+
.get(`${this.base}/v1/typeahead-search-service/suggestion/suggest/flights`, { params: { q }, headers: this.headers })
|
|
72
|
+
.pipe(map(res => {
|
|
73
|
+
const out = [];
|
|
74
|
+
for (const group of res?.data ?? []) {
|
|
75
|
+
for (const item of group.items ?? []) {
|
|
76
|
+
if (item.items)
|
|
77
|
+
out.push(...item.items);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return out.map(a => ({
|
|
81
|
+
id: a.id,
|
|
82
|
+
name: a.name,
|
|
83
|
+
city_name: a.city_name,
|
|
84
|
+
country_name: a.country_name,
|
|
85
|
+
type: a.type === 'airport' ? 'airport' : 'city',
|
|
86
|
+
}));
|
|
87
|
+
}), catchError(() => of([])));
|
|
88
|
+
}
|
|
89
|
+
// ── Upgrade Class ──────────────────────────────────────────────────────────
|
|
90
|
+
/**
|
|
91
|
+
* `POST /v3/manage-booking/flight/reissue/choose-flight/{bookingId}/{postBookingId}` — prices the chosen upgrade
|
|
92
|
+
* option. Same endpoint/body the web uses; response `data` carries `itineraryAvailable`, `priceChanged`, `price`, `currency`.
|
|
93
|
+
*/
|
|
94
|
+
chooseFlight(bookingId, postBookingId, body) {
|
|
95
|
+
return this.http
|
|
96
|
+
.post(`${this.base}/v3/manage-booking/flight/reissue/choose-flight/${bookingId}/${postBookingId}`, body, { headers: this.headers })
|
|
97
|
+
.pipe(map(res => res?.data ?? {}));
|
|
98
|
+
}
|
|
99
|
+
/** `POST /v2/manage-booking/flight/book-now` — places a zero-total reissue (no payment needed). */
|
|
100
|
+
bookNow(postBookingId) {
|
|
101
|
+
return this.http.post(`${this.base}/v2/manage-booking/flight/book-now`, { postBookingId }, { headers: this.headers });
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Payment link of a reissue with an amount to pay. There is no separate API: the backend puts the link in the
|
|
105
|
+
* cart of the post-booking (`GET /v2/manage-booking/flight/cart/{postBookingId}`, the call the web checkout reads).
|
|
106
|
+
* The name of the field is not final yet: the first of the names below that exists is used, and the call fails
|
|
107
|
+
* with a clear message when the cart has none.
|
|
108
|
+
*/
|
|
109
|
+
getPaymentLink(postBookingId, amount = 0, currency = '') {
|
|
110
|
+
return this.http
|
|
111
|
+
.get(`${this.base}/v2/manage-booking/flight/cart/${postBookingId}`, {
|
|
112
|
+
headers: this.headers,
|
|
113
|
+
})
|
|
114
|
+
.pipe(map(res => {
|
|
115
|
+
const cart = res?.data ?? {};
|
|
116
|
+
let url = cart['paymentLink'] ?? cart['link'] ?? cart['payment']?.link ?? cart['payment']?.paymentLink ?? cart['payment']?.url;
|
|
117
|
+
if (!url)
|
|
118
|
+
throw new Error('The cart has no payment link yet.');
|
|
119
|
+
// The cart returns only a path ("/<paymentId>"): the customer page base comes from the host config.
|
|
120
|
+
if (!/^https?:\/\//i.test(url)) {
|
|
121
|
+
const linkBase = this.config.paymentLinkBase?.replace(/\/+$/, '');
|
|
122
|
+
if (!linkBase) {
|
|
123
|
+
throw new Error(`The cart returned a relative link (${url}) and no paymentLinkBase is configured.`);
|
|
124
|
+
}
|
|
125
|
+
url = `${linkBase}${url.startsWith('/') ? '' : '/'}${url}`;
|
|
126
|
+
}
|
|
127
|
+
return {
|
|
128
|
+
url,
|
|
129
|
+
amount: cart['payment']?.amount ?? amount,
|
|
130
|
+
currency: cart['payment']?.currency ?? currency,
|
|
131
|
+
expiresAt: cart['payment']?.expiryDate ?? cart['expiryDate'],
|
|
132
|
+
};
|
|
133
|
+
}));
|
|
134
|
+
}
|
|
135
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SbdReissueService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
136
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SbdReissueService, providedIn: 'root' }); }
|
|
137
|
+
}
|
|
138
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SbdReissueService, decorators: [{
|
|
139
|
+
type: Injectable,
|
|
140
|
+
args: [{ providedIn: 'root' }]
|
|
141
|
+
}] });
|
|
142
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVpc3N1ZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtYm9va2luZy1kYXNoYm9hcmQvc3JjL2xpYi9zZXJ2aWNlcy9yZWlzc3VlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7O0FBV3hEOzs7R0FHRztBQUNILE1BQU0sbUJBQW1CLEdBQUcsRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDO0FBRTdFOztHQUVHO0FBRUgsTUFBTSxPQUFPLGlCQUFpQjtJQUQ5QjtRQUVVLFNBQUksR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDMUIsV0FBTSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM1QixTQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7S0E0SnBDO0lBMUpDLElBQVksT0FBTztRQUNqQixPQUFPLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDNUMsQ0FBQztJQUVELDJGQUEyRjtJQUMzRixpQkFBaUIsQ0FBQyxTQUFpQjtRQUNqQyxPQUFPLElBQUksQ0FBQyxJQUFJO2FBQ2IsSUFBSSxDQUNILEdBQUcsSUFBSSxDQUFDLElBQUksaURBQWlELFNBQVMsRUFBRSxFQUN4RSxJQUFJLEVBQUUscUNBQXFDO1FBQzND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LEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQztZQUM3RCxDQUFDO1lBQ0QsT0FBTztnQkFDTCxHQUFHO2dCQUNILE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsTUFBTSxJQUFJLE1BQU07Z0JBQ3pDLFFBQVEsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsUUFBUSxJQUFJLFFBQVE7Z0JBQy9DLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsVUFBVSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUM7YUFDN0QsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDTixDQUFDOytHQTlKVSxpQkFBaUI7bUhBQWpCLGlCQUFpQixjQURKLE1BQU07OzRGQUNuQixpQkFBaUI7a0JBRDdCLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGNhdGNoRXJyb3IsIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFNCRF9DT05GSUcgfSBmcm9tICcuLi9jb25maWcvZGFzaGJvYXJkLmNvbmZpZyc7XG5pbXBvcnQge1xuICBSZWlzc3VlQWlycG9ydCxcbiAgUmVpc3N1ZUF2YWlsYWJpbGl0eVJlc3BvbnNlLFxuICBSZWlzc3VlQm9va2luZ0NvbnRleHQsXG4gIFJlaXNzdWVDaG9vc2VGbGlnaHRSZXF1ZXN0LFxuICBSZWlzc3VlQ2hvb3NlRmxpZ2h0UmVzcG9uc2UsXG4gIFJlaXNzdWVQYXltZW50TGluayxcbiAgUmVpc3N1ZVVwZ3JhZGVPcHRpb25zUmVzcG9uc2UsXG59IGZyb20gJy4uL21vZGVscy9yZWlzc3VlLnR5cGVzJztcblxuLyoqXG4gKiBRdWVyeSBwYXJhbXMgdGhlIHdlYiBhbHdheXMgc2VuZHMgb24gYGNyZWF0ZS1wb3N0LWJvb2tpbmdgIChgZ2V0RW50cnlTb3VyY2VEZXZpY2VCcmFuZCgpYCk6IHdoZXJlIHRoZSBmbG93IHN0YXJ0ZWRcbiAqIGFuZCBvbiB3aGljaCBkZXZpY2UuIFNhbWUgZGVmYXVsdHMgYXMgdGhlIHdlYjsgYXNrIHRoZSBiYWNrZW5kIHdoaWNoIHZhbHVlcyBCTyBzaG91bGQgc2VuZC5cbiAqL1xuY29uc3QgUE9TVF9CT09LSU5HX1BBUkFNUyA9IHsgZW50cnlTb3VyY2U6ICduYXZpZ2F0aW9uIGJhcicsIGRldmljZTogJ3dlYicgfTtcblxuLyoqXG4gKiBSZWlzc3VlIEFQSXMg4oCUIHRoZSBzYW1lIGVuZHBvaW50cyB0aGUgY29uc3VtZXIgd2ViIHVzZXMgKHRoZSBiYWNrZW5kIG9wZW5zIHRoZW0gZm9yIEJPKS5cbiAqL1xuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBTYmRSZWlzc3VlU2VydmljZSB7XG4gIHByaXZhdGUgaHR0cCA9IGluamVjdChIdHRwQ2xpZW50KTtcbiAgcHJpdmF0ZSBjb25maWcgPSBpbmplY3QoU0JEX0NPTkZJRyk7XG4gIHByaXZhdGUgYmFzZSA9IHRoaXMuY29uZmlnLmFwaUJhc2U7XG5cbiAgcHJpdmF0ZSBnZXQgaGVhZGVycygpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICByZXR1cm4geyBwbGF0Zm9ybTogdGhpcy5jb25maWcucGxhdGZvcm0gfTtcbiAgfVxuXG4gIC8qKiBgUE9TVCAvdjIvbWFuYWdlLWJvb2tpbmcvZmxpZ2h0L2NyZWF0ZS1wb3N0LWJvb2tpbmcve2Jvb2tpbmdJZH1gIC0+IGBwb3N0Qm9va2luZ0lkYC4gKi9cbiAgY3JlYXRlUG9zdEJvb2tpbmcoYm9va2luZ0lkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0PHsgZGF0YT86IHsgcG9zdEJvb2tpbmdJZD86IHN0cmluZyB9IH0+KFxuICAgICAgICBgJHt0aGlzLmJhc2V9L3YyL21hbmFnZS1ib29raW5nL2ZsaWdodC9jcmVhdGUtcG9zdC1ib29raW5nLyR7Ym9va2luZ0lkfWAsXG4gICAgICAgIG51bGwsIC8vIHRoZSB3ZWIgc2VuZHMgbm8gYm9keSBvbiB0aGlzIGNhbGxcbiAgICAgICAgeyBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsIHBhcmFtczogUE9TVF9CT09LSU5HX1BBUkFNUyB9LFxuICAgICAgKVxuICAgICAgLnBpcGUobWFwKHJlcyA9PiByZXM/LmRhdGE/LnBvc3RCb29raW5nSWQgPz8gJycpKTtcbiAgfVxuXG4gIC8qKiBgR0VUIC92My9tYW5hZ2UtYm9va2luZy9mbGlnaHQvcmVpc3N1ZS9hdmFpbGFiaWxpdHkve2Jvb2tpbmdJZH0ve3Bvc3RCb29raW5nSWR9YCAtPiBgZGF0YS5sZWdzW11gLiAqL1xuICBnZXRBdmFpbGFiaWxpdHkoXG4gICAgYm9va2luZ0lkOiBzdHJpbmcsXG4gICAgcG9zdEJvb2tpbmdJZDogc3RyaW5nLFxuICAgIGN0eD86IFJlaXNzdWVCb29raW5nQ29udGV4dCxcbiAgKTogT2JzZXJ2YWJsZTxSZWlzc3VlQXZhaWxhYmlsaXR5UmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxSZWlzc3VlQXZhaWxhYmlsaXR5UmVzcG9uc2U+KFxuICAgICAgYCR7dGhpcy5iYXNlfS92My9tYW5hZ2UtYm9va2luZy9mbGlnaHQvcmVpc3N1ZS9hdmFpbGFiaWxpdHkvJHtib29raW5nSWR9LyR7cG9zdEJvb2tpbmdJZH1gLFxuICAgICAgeyBoZWFkZXJzOiB0aGlzLmhlYWRlcnMgfSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIGBQT1NUIC92My9tYW5hZ2UtYm9va2luZy9mbGlnaHQvcmVpc3N1ZS91cGdyYWRlLWNsYXNzL3tib29raW5nSWR9L3twb3N0Qm9va2luZ0lkfWAg4oCUIHNhbWUgY2FsbCAoYW5kIGJvZHkpIHRoZVxuICAgKiB3ZWIgbWFrZXMgdG8gZGVjaWRlIHdoZXRoZXIgdGhlIFwiVXBncmFkZSBDbGFzc1wiIG9wdGlvbiBpcyBzaG93bi4gUmV0dXJucyB0aGUgdW53cmFwcGVkIGBkYXRhYC5cbiAgICovXG4gIGdldFVwZ3JhZGVDbGFzc09wdGlvbnMoXG4gICAgYm9va2luZ0lkOiBzdHJpbmcsXG4gICAgcG9zdEJvb2tpbmdJZDogc3RyaW5nLFxuICAgIGN0eDogUmVpc3N1ZUJvb2tpbmdDb250ZXh0LFxuICApOiBPYnNlcnZhYmxlPFJlaXNzdWVVcGdyYWRlT3B0aW9uc1Jlc3BvbnNlIHwgbnVsbD4ge1xuICAgIGNvbnN0IGJvZHkgPSB7XG4gICAgICBzZXJ2aWNlTmFtZTogJ2NoYW5nZS1mbGlnaHQtY2xhc3MnLFxuICAgICAgbGVnczogY3R4LmxlZ3MubWFwKGwgPT4gKHtcbiAgICAgICAgbGVnSWQ6IGwubGVnSWQsXG4gICAgICAgIGxlZ0RlcGFydHVyZUFpcnBvcnRDb2RlOiBsLm9yaWdpbkNvZGUsXG4gICAgICAgIGxlZ0Fycml2YWxBaXJwb3J0Q29kZTogbC5kZXN0aW5hdGlvbkNvZGUsXG4gICAgICAgIGxlZ0RlcGFydHVyZURhdGU6IGwuZGVwYXJ0dXJlLFxuICAgICAgfSkpLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3Q8eyBkYXRhPzogUmVpc3N1ZVVwZ3JhZGVPcHRpb25zUmVzcG9uc2UgfT4oXG4gICAgICAgIGAke3RoaXMuYmFzZX0vdjMvbWFuYWdlLWJvb2tpbmcvZmxpZ2h0L3JlaXNzdWUvdXBncmFkZS1jbGFzcy8ke2Jvb2tpbmdJZH0vJHtwb3N0Qm9va2luZ0lkfWAsXG4gICAgICAgIGJvZHksXG4gICAgICAgIHsgaGVhZGVyczogdGhpcy5oZWFkZXJzIH0sXG4gICAgICApXG4gICAgICAucGlwZShtYXAocmVzID0+IChyZXM/LmRhdGEgPz8gKHJlcyBhcyBSZWlzc3VlVXBncmFkZU9wdGlvbnNSZXNwb25zZSkpID8/IG51bGwpKTtcbiAgfVxuXG4gIC8qKiBTYW1lIHJ1bGUgYXMgdGhlIHdlYidzIGBoYXNVcGdyYWRlT3B0aW9ucygpYDogYXQgbGVhc3Qgb25lIG9wdGlvbiBpbiBhbnkgc2VjdGlvbi4gKi9cbiAgaGFzVXBncmFkZU9wdGlvbnMoZGF0YTogUmVpc3N1ZVVwZ3JhZGVPcHRpb25zUmVzcG9uc2UgfCBudWxsKTogYm9vbGVhbiB7XG4gICAgaWYgKCFkYXRhKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGRhdGEuZmFyZU9wdGlvblNjb3BlID09PSAnbGVnJykgcmV0dXJuIChkYXRhLmxlZ3MgPz8gW10pLnNvbWUobCA9PiAobC5vcHRpb25zPy5sZW5ndGggPz8gMCkgPiAwKTtcbiAgICByZXR1cm4gKGRhdGEub3B0aW9ucz8ubGVuZ3RoID8/IDApID4gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBaXJwb3J0IHBpY2tlciBmb3IgQ2hhbmdlIFJvdXRlLiBTYW1lIHR5cGVhaGVhZCBlbmRwb2ludCB0aGUgd2ViIGFuZCB0aGUgYmFja29mZmljZSBhbHJlYWR5IHVzZVxuICAgKiAoYFN0YXRpY0RhdGFTZXJ2aWNlLmdldEFpcnBvcnRzYCkg4oCUIG5vIGV4dHJhIGJhY2tlbmQgd29yayBuZWVkZWQuIFJlc3BvbnNlOiBgZGF0YVtdLml0ZW1zW10uaXRlbXNbXWAuXG4gICAqIEFuIGVtcHR5IHRlcm0gbWFrZXMgbm8gcmVxdWVzdCAodGhlIGRpYWxvZyBsaXN0cyB0aGUgYm9va2luZydzIG93biBhaXJwb3J0cyBtZWFud2hpbGUpLlxuICAgKi9cbiAgc2VhcmNoQWlycG9ydHModGVybTogc3RyaW5nKTogT2JzZXJ2YWJsZTxSZWlzc3VlQWlycG9ydFtdPiB7XG4gICAgY29uc3QgcSA9IHRlcm0udHJpbSgpO1xuICAgIGlmICghcSkgcmV0dXJuIG9mKFtdKTtcblxuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5nZXQ8eyBkYXRhPzogeyBpdGVtcz86IHsgaXRlbXM/OiBSZWlzc3VlQWlycG9ydFtdIH1bXSB9W10gfT4oXG4gICAgICAgIGAke3RoaXMuYmFzZX0vdjEvdHlwZWFoZWFkLXNlYXJjaC1zZXJ2aWNlL3N1Z2dlc3Rpb24vc3VnZ2VzdC9mbGlnaHRzYCxcbiAgICAgICAgeyBwYXJhbXM6IHsgcSB9LCBoZWFkZXJzOiB0aGlzLmhlYWRlcnMgfSxcbiAgICAgIClcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAocmVzID0+IHtcbiAgICAgICAgICBjb25zdCBvdXQ6IFJlaXNzdWVBaXJwb3J0W10gPSBbXTtcbiAgICAgICAgICBmb3IgKGNvbnN0IGdyb3VwIG9mIHJlcz8uZGF0YSA/PyBbXSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGdyb3VwLml0ZW1zID8/IFtdKSB7XG4gICAgICAgICAgICAgIGlmIChpdGVtLml0ZW1zKSBvdXQucHVzaCguLi5pdGVtLml0ZW1zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG91dC5tYXAoYSA9PiAoe1xuICAgICAgICAgICAgaWQ6IGEuaWQsXG4gICAgICAgICAgICBuYW1lOiBhLm5hbWUsXG4gICAgICAgICAgICBjaXR5X25hbWU6IGEuY2l0eV9uYW1lLFxuICAgICAgICAgICAgY291bnRyeV9uYW1lOiBhLmNvdW50cnlfbmFtZSxcbiAgICAgICAgICAgIHR5cGU6IGEudHlwZSA9PT0gJ2FpcnBvcnQnID8gKCdhaXJwb3J0JyBhcyBjb25zdCkgOiAoJ2NpdHknIGFzIGNvbnN0KSxcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH0pLFxuICAgICAgICBjYXRjaEVycm9yKCgpID0+IG9mKFtdIGFzIFJlaXNzdWVBaXJwb3J0W10pKSxcbiAgICAgICk7XG4gIH1cblxuICAvLyDilIDilIAgVXBncmFkZSBDbGFzcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogYFBPU1QgL3YzL21hbmFnZS1ib29raW5nL2ZsaWdodC9yZWlzc3VlL2Nob29zZS1mbGlnaHQve2Jvb2tpbmdJZH0ve3Bvc3RCb29raW5nSWR9YCDigJQgcHJpY2VzIHRoZSBjaG9zZW4gdXBncmFkZVxuICAgKiBvcHRpb24uIFNhbWUgZW5kcG9pbnQvYm9keSB0aGUgd2ViIHVzZXM7IHJlc3BvbnNlIGBkYXRhYCBjYXJyaWVzIGBpdGluZXJhcnlBdmFpbGFibGVgLCBgcHJpY2VDaGFuZ2VkYCwgYHByaWNlYCwgYGN1cnJlbmN5YC5cbiAgICovXG4gIGNob29zZUZsaWdodChcbiAgICBib29raW5nSWQ6IHN0cmluZyxcbiAgICBwb3N0Qm9va2luZ0lkOiBzdHJpbmcsXG4gICAgYm9keTogUmVpc3N1ZUNob29zZUZsaWdodFJlcXVlc3QsXG4gICk6IE9ic2VydmFibGU8UmVpc3N1ZUNob29zZUZsaWdodFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3Q8eyBkYXRhPzogUmVpc3N1ZUNob29zZUZsaWdodFJlc3BvbnNlIH0+KFxuICAgICAgICBgJHt0aGlzLmJhc2V9L3YzL21hbmFnZS1ib29raW5nL2ZsaWdodC9yZWlzc3VlL2Nob29zZS1mbGlnaHQvJHtib29raW5nSWR9LyR7cG9zdEJvb2tpbmdJZH1gLFxuICAgICAgICBib2R5LFxuICAgICAgICB7IGhlYWRlcnM6IHRoaXMuaGVhZGVycyB9LFxuICAgICAgKVxuICAgICAgLnBpcGUobWFwKHJlcyA9PiByZXM/LmRhdGEgPz8ge30pKTtcbiAgfVxuXG4gIC8qKiBgUE9TVCAvdjIvbWFuYWdlLWJvb2tpbmcvZmxpZ2h0L2Jvb2stbm93YCDigJQgcGxhY2VzIGEgemVyby10b3RhbCByZWlzc3VlIChubyBwYXltZW50IG5lZWRlZCkuICovXG4gIGJvb2tOb3cocG9zdEJvb2tpbmdJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGAke3RoaXMuYmFzZX0vdjIvbWFuYWdlLWJvb2tpbmcvZmxpZ2h0L2Jvb2stbm93YCwgeyBwb3N0Qm9va2luZ0lkIH0sIHsgaGVhZGVyczogdGhpcy5oZWFkZXJzIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFBheW1lbnQgbGluayBvZiBhIHJlaXNzdWUgd2l0aCBhbiBhbW91bnQgdG8gcGF5LiBUaGVyZSBpcyBubyBzZXBhcmF0ZSBBUEk6IHRoZSBiYWNrZW5kIHB1dHMgdGhlIGxpbmsgaW4gdGhlXG4gICAqIGNhcnQgb2YgdGhlIHBvc3QtYm9va2luZyAoYEdFVCAvdjIvbWFuYWdlLWJvb2tpbmcvZmxpZ2h0L2NhcnQve3Bvc3RCb29raW5nSWR9YCwgdGhlIGNhbGwgdGhlIHdlYiBjaGVja291dCByZWFkcykuXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBmaWVsZCBpcyBub3QgZmluYWwgeWV0OiB0aGUgZmlyc3Qgb2YgdGhlIG5hbWVzIGJlbG93IHRoYXQgZXhpc3RzIGlzIHVzZWQsIGFuZCB0aGUgY2FsbCBmYWlsc1xuICAgKiB3aXRoIGEgY2xlYXIgbWVzc2FnZSB3aGVuIHRoZSBjYXJ0IGhhcyBub25lLlxuICAgKi9cbiAgZ2V0UGF5bWVudExpbmsocG9zdEJvb2tpbmdJZDogc3RyaW5nLCBhbW91bnQgPSAwLCBjdXJyZW5jeSA9ICcnKTogT2JzZXJ2YWJsZTxSZWlzc3VlUGF5bWVudExpbms+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAuZ2V0PHsgZGF0YT86IFJlY29yZDxzdHJpbmcsIGFueT4gfT4oYCR7dGhpcy5iYXNlfS92Mi9tYW5hZ2UtYm9va2luZy9mbGlnaHQvY2FydC8ke3Bvc3RCb29raW5nSWR9YCwge1xuICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXG4gICAgICB9KVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcChyZXMgPT4ge1xuICAgICAgICAgIGNvbnN0IGNhcnQgPSByZXM/LmRhdGEgPz8ge307XG4gICAgICAgICAgbGV0IHVybDogc3RyaW5nIHwgdW5kZWZpbmVkID1cbiAgICAgICAgICAgIGNhcnRbJ3BheW1lbnRMaW5rJ10gPz8gY2FydFsnbGluayddID8/IGNhcnRbJ3BheW1lbnQnXT8ubGluayA/PyBjYXJ0WydwYXltZW50J10/LnBheW1lbnRMaW5rID8/IGNhcnRbJ3BheW1lbnQnXT8udXJsO1xuICAgICAgICAgIGlmICghdXJsKSB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBjYXJ0IGhhcyBubyBwYXltZW50IGxpbmsgeWV0LicpO1xuICAgICAgICAgIC8vIFRoZSBjYXJ0IHJldHVybnMgb25seSBhIHBhdGggKFwiLzxwYXltZW50SWQ+XCIpOiB0aGUgY3VzdG9tZXIgcGFnZSBiYXNlIGNvbWVzIGZyb20gdGhlIGhvc3QgY29uZmlnLlxuICAgICAgICAgIGlmICghL15odHRwcz86XFwvXFwvL2kudGVzdCh1cmwpKSB7XG4gICAgICAgICAgICBjb25zdCBsaW5rQmFzZSA9IHRoaXMuY29uZmlnLnBheW1lbnRMaW5rQmFzZT8ucmVwbGFjZSgvXFwvKyQvLCAnJyk7XG4gICAgICAgICAgICBpZiAoIWxpbmtCYXNlKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIGNhcnQgcmV0dXJuZWQgYSByZWxhdGl2ZSBsaW5rICgke3VybH0pIGFuZCBubyBwYXltZW50TGlua0Jhc2UgaXMgY29uZmlndXJlZC5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHVybCA9IGAke2xpbmtCYXNlfSR7dXJsLnN0YXJ0c1dpdGgoJy8nKSA/ICcnIDogJy8nfSR7dXJsfWA7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB1cmwsXG4gICAgICAgICAgICBhbW91bnQ6IGNhcnRbJ3BheW1lbnQnXT8uYW1vdW50ID8/IGFtb3VudCxcbiAgICAgICAgICAgIGN1cnJlbmN5OiBjYXJ0WydwYXltZW50J10/LmN1cnJlbmN5ID8/IGN1cnJlbmN5LFxuICAgICAgICAgICAgZXhwaXJlc0F0OiBjYXJ0WydwYXltZW50J10/LmV4cGlyeURhdGUgPz8gY2FydFsnZXhwaXJ5RGF0ZSddLFxuICAgICAgICAgIH07XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgfVxufVxuIl19
|
|
@@ -1,14 +1,22 @@
|
|
|
1
|
-
import { Injectable, inject } from '@angular/core';
|
|
1
|
+
import { Injectable, InjectionToken, inject } from '@angular/core';
|
|
2
2
|
import { ToastrService } from 'ngx-toastr';
|
|
3
3
|
import * as i0 from "@angular/core";
|
|
4
|
+
export const SBD_TOAST_HANDLER = new InjectionToken('SBD_TOAST_HANDLER');
|
|
4
5
|
export class SbdToastService {
|
|
5
6
|
constructor() {
|
|
6
|
-
|
|
7
|
+
// The host's handler wins; ngx-toastr is the fallback and is optional, so a host that never configured it still works.
|
|
8
|
+
this.handler = inject(SBD_TOAST_HANDLER, { optional: true }) ?? inject(ToastrService, { optional: true });
|
|
9
|
+
}
|
|
10
|
+
success(msg) { this.show('success', msg); }
|
|
11
|
+
error(msg) { this.show('error', msg); }
|
|
12
|
+
info(msg) { this.show('info', msg); }
|
|
13
|
+
warning(msg) { this.show('warning', msg); }
|
|
14
|
+
show(kind, msg) {
|
|
15
|
+
if (this.handler)
|
|
16
|
+
this.handler[kind](msg);
|
|
17
|
+
else
|
|
18
|
+
console.warn(`[smart-booking-dashboard] ${kind}: ${msg}`);
|
|
7
19
|
}
|
|
8
|
-
success(msg) { this.toastr.success(msg); }
|
|
9
|
-
error(msg) { this.toastr.error(msg); }
|
|
10
|
-
info(msg) { this.toastr.info(msg); }
|
|
11
|
-
warning(msg) { this.toastr.warning(msg); }
|
|
12
20
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SbdToastService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
13
21
|
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SbdToastService, providedIn: 'root' }); }
|
|
14
22
|
}
|
|
@@ -16,4 +24,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
16
24
|
type: Injectable,
|
|
17
25
|
args: [{ providedIn: 'root' }]
|
|
18
26
|
}] });
|
|
19
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
27
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9hc3Quc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LWJvb2tpbmctZGFzaGJvYXJkL3NyYy9saWIvc2VydmljZXMvdG9hc3Quc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFlBQVksQ0FBQzs7QUFhM0MsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxjQUFjLENBQWtCLG1CQUFtQixDQUFDLENBQUM7QUFHMUYsTUFBTSxPQUFPLGVBQWU7SUFENUI7UUFFRSx1SEFBdUg7UUFDL0csWUFBTyxHQUNiLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxhQUFhLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztLQVc5RjtJQVRDLE9BQU8sQ0FBQyxHQUFXLElBQVUsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pELEtBQUssQ0FBQyxHQUFXLElBQVksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3ZELElBQUksQ0FBQyxHQUFXLElBQWEsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RELE9BQU8sQ0FBQyxHQUFXLElBQVUsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRWpELElBQUksQ0FBQyxJQUEyQixFQUFFLEdBQVc7UUFDbkQsSUFBSSxJQUFJLENBQUMsT0FBTztZQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7O1lBQ3JDLE9BQU8sQ0FBQyxJQUFJLENBQUMsNkJBQTZCLElBQUksS0FBSyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7K0dBYlUsZUFBZTttSEFBZixlQUFlLGNBREYsTUFBTTs7NEZBQ25CLGVBQWU7a0JBRDNCLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0aW9uVG9rZW4sIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVG9hc3RyU2VydmljZSB9IGZyb20gJ25neC10b2FzdHInO1xuXG4vKipcbiAqIEhvdyB0aGUgZGFzaGJvYXJkIHNob3dzIG1lc3NhZ2VzLiBUaGUgYmFja29mZmljZSB1c2VzIG5neC10b2FzdHIgKHRoZSBkZWZhdWx0KTsgYSBob3N0IHRoYXQgaGFzIGl0cyBvd24gdG9hc3RcbiAqIHN5c3RlbSAoZS5nLiBIZWxpeCB3aXRoIFByaW1lTkcncyBgTWVzc2FnZVNlcnZpY2VgKSBwcm92aWRlcyB0aGlzIHRva2VuIGFuZCB0aGUgZGFzaGJvYXJkIHVzZXMgaXQgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYmRUb2FzdEhhbmRsZXIge1xuICBzdWNjZXNzKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQ7XG4gIGVycm9yKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQ7XG4gIGluZm8obWVzc2FnZTogc3RyaW5nKTogdm9pZDtcbiAgd2FybmluZyhtZXNzYWdlOiBzdHJpbmcpOiB2b2lkO1xufVxuXG5leHBvcnQgY29uc3QgU0JEX1RPQVNUX0hBTkRMRVIgPSBuZXcgSW5qZWN0aW9uVG9rZW48U2JkVG9hc3RIYW5kbGVyPignU0JEX1RPQVNUX0hBTkRMRVInKTtcblxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBTYmRUb2FzdFNlcnZpY2Uge1xuICAvLyBUaGUgaG9zdCdzIGhhbmRsZXIgd2luczsgbmd4LXRvYXN0ciBpcyB0aGUgZmFsbGJhY2sgYW5kIGlzIG9wdGlvbmFsLCBzbyBhIGhvc3QgdGhhdCBuZXZlciBjb25maWd1cmVkIGl0IHN0aWxsIHdvcmtzLlxuICBwcml2YXRlIGhhbmRsZXI6IFNiZFRvYXN0SGFuZGxlciB8IG51bGwgPVxuICAgIGluamVjdChTQkRfVE9BU1RfSEFORExFUiwgeyBvcHRpb25hbDogdHJ1ZSB9KSA/PyBpbmplY3QoVG9hc3RyU2VydmljZSwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcblxuICBzdWNjZXNzKG1zZzogc3RyaW5nKTogdm9pZCB7IHRoaXMuc2hvdygnc3VjY2VzcycsIG1zZyk7IH1cbiAgZXJyb3IobXNnOiBzdHJpbmcpOiB2b2lkICAgeyB0aGlzLnNob3coJ2Vycm9yJywgbXNnKTsgfVxuICBpbmZvKG1zZzogc3RyaW5nKTogdm9pZCAgICB7IHRoaXMuc2hvdygnaW5mbycsIG1zZyk7IH1cbiAgd2FybmluZyhtc2c6IHN0cmluZyk6IHZvaWQgeyB0aGlzLnNob3coJ3dhcm5pbmcnLCBtc2cpOyB9XG5cbiAgcHJpdmF0ZSBzaG93KGtpbmQ6IGtleW9mIFNiZFRvYXN0SGFuZGxlciwgbXNnOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5oYW5kbGVyKSB0aGlzLmhhbmRsZXJba2luZF0obXNnKTtcbiAgICBlbHNlIGNvbnNvbGUud2FybihgW3NtYXJ0LWJvb2tpbmctZGFzaGJvYXJkXSAke2tpbmR9OiAke21zZ31gKTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/** Today as `YYYY-MM-DD` in the agent's timezone (what `<input type="date">` compares against). */
|
|
2
|
+
export function todayIso() {
|
|
3
|
+
return new Date().toLocaleDateString('en-CA');
|
|
4
|
+
}
|
|
5
|
+
export function formatReissueDate(value) {
|
|
6
|
+
if (!value)
|
|
7
|
+
return '—';
|
|
8
|
+
const date = new Date(value);
|
|
9
|
+
return Number.isNaN(date.getTime())
|
|
10
|
+
? value
|
|
11
|
+
: date.toLocaleDateString('en-GB', { day: '2-digit', month: 'short', year: 'numeric' });
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Expiry of the payment link as epoch ms. The backend sends `YYYY-MM-DD HH:mm:ss` with no timezone, read as UTC (to
|
|
15
|
+
* be confirmed with the backend); a value that carries `Z` or an offset is read as it is. `null` when missing/invalid.
|
|
16
|
+
*/
|
|
17
|
+
export function parseLinkExpiry(value) {
|
|
18
|
+
if (!value)
|
|
19
|
+
return null;
|
|
20
|
+
const hasZone = /(Z|[+-]\d{2}:?\d{2})$/i.test(value.trim());
|
|
21
|
+
const ms = Date.parse(hasZone ? value : `${value.trim().replace(' ', 'T')}Z`);
|
|
22
|
+
return Number.isNaN(ms) ? null : ms;
|
|
23
|
+
}
|
|
24
|
+
/** `mm:ss` (or `h:mm:ss` from one hour up) for a countdown. */
|
|
25
|
+
export function formatCountdown(ms) {
|
|
26
|
+
const total = Math.max(0, Math.floor(ms / 1000));
|
|
27
|
+
const h = Math.floor(total / 3600);
|
|
28
|
+
const m = Math.floor((total % 3600) / 60);
|
|
29
|
+
const s = total % 60;
|
|
30
|
+
const pad = (n) => String(n).padStart(2, '0');
|
|
31
|
+
return h > 0 ? `${h}:${pad(m)}:${pad(s)}` : `${pad(m)}:${pad(s)}`;
|
|
32
|
+
}
|
|
33
|
+
export function legTitle(leg) {
|
|
34
|
+
return `${leg.direction || 'Leg'} · ${leg.originCode} → ${leg.destinationCode}`;
|
|
35
|
+
}
|
|
36
|
+
export function airportOf(id, name, city, country) {
|
|
37
|
+
return { id, name: name || city || id, city_name: city || id, country_name: country, type: 'airport' };
|
|
38
|
+
}
|
|
39
|
+
export const originAirport = (l) => airportOf(l.originCode, l.originName, l.originCityName, l.originCountryName);
|
|
40
|
+
export const destinationAirport = (l) => airportOf(l.destinationCode, l.destinationName, l.destinationCityName, l.destinationCountryName);
|
|
41
|
+
export const compareAirports = (a, b) => a?.id === b?.id;
|
|
42
|
+
export function formatMoney(amount, currency) {
|
|
43
|
+
return `${amount.toLocaleString('en-US', { maximumFractionDigits: 2 })} ${currency}`.trim();
|
|
44
|
+
}
|
|
45
|
+
/** `21 Oct` — same short date the cancel dialog shows on a leg card. */
|
|
46
|
+
export function formatShortDate(value) {
|
|
47
|
+
if (!value)
|
|
48
|
+
return '—';
|
|
49
|
+
const date = new Date(value);
|
|
50
|
+
return Number.isNaN(date.getTime()) ? value : date.toLocaleDateString('en-GB', { day: '2-digit', month: 'short' });
|
|
51
|
+
}
|
|
52
|
+
/** `01:55` straight from the `YYYY-MM-DDTHH:mm:ss` string (no timezone conversion). */
|
|
53
|
+
export function formatTime(value) {
|
|
54
|
+
return value && value.length >= 16 && value[10] === 'T' ? value.slice(11, 16) : '—';
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* The leg already departed. The booking gives no timezone for `LegDepartureDateTime` (airport local time), so this
|
|
58
|
+
* compares with the agent's clock: it can be off by a few hours on the day of the flight, never by a day.
|
|
59
|
+
*/
|
|
60
|
+
export function isLegFlown(leg) {
|
|
61
|
+
const time = leg.departure ? Date.parse(leg.departure) : NaN;
|
|
62
|
+
return !Number.isNaN(time) && time < Date.now();
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVpc3N1ZS1mb3JtYXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC1ib29raW5nLWRhc2hib2FyZC9zcmMvbGliL3V0aWxzL3JlaXNzdWUtZm9ybWF0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLG1HQUFtRztBQUNuRyxNQUFNLFVBQVUsUUFBUTtJQUN0QixPQUFPLElBQUksSUFBSSxFQUFFLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDaEQsQ0FBQztBQUVELE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxLQUFhO0lBQzdDLElBQUksQ0FBQyxLQUFLO1FBQUUsT0FBTyxHQUFHLENBQUM7SUFDdkIsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDN0IsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNqQyxDQUFDLENBQUMsS0FBSztRQUNQLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxFQUFFLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO0FBQzVGLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUFDLEtBQXFCO0lBQ25ELElBQUksQ0FBQyxLQUFLO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDeEIsTUFBTSxPQUFPLEdBQUcsd0JBQXdCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzVELE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FB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Q0FBQyxLQUFLLENBQUMsQ0FBQztJQUM3QixPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7QUFDckgsQ0FBQztBQUVELHVGQUF1RjtBQUN2RixNQUFNLFVBQVUsVUFBVSxDQUFDLEtBQWE7SUFDdEMsT0FBTyxLQUFLLElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxFQUFFLElBQUksS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztBQUN0RixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLFVBQVUsQ0FBQyxHQUEwQjtJQUNuRCxNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0lBQzdELE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlaXNzdWVBaXJwb3J0LCBSZWlzc3VlTGVnIH0gZnJvbSAnLi4vbW9kZWxzL3JlaXNzdWUudHlwZXMnO1xuXG4vKiogVG9kYXkgYXMgYFlZWVktTU0tRERgIGluIHRoZSBhZ2VudCdzIHRpbWV6b25lICh3aGF0IGA8aW5wdXQgdHlwZT1cImRhdGVcIj5gIGNvbXBhcmVzIGFnYWluc3QpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvZGF5SXNvKCk6IHN0cmluZyB7XG4gIHJldHVybiBuZXcgRGF0ZSgpLnRvTG9jYWxlRGF0ZVN0cmluZygnZW4tQ0EnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFJlaXNzdWVEYXRlKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoIXZhbHVlKSByZXR1cm4gJ+KAlCc7XG4gIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh2YWx1ZSk7XG4gIHJldHVybiBOdW1iZXIuaXNOYU4oZGF0ZS5nZXRUaW1lKCkpXG4gICAgPyB2YWx1ZVxuICAgIDogZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcoJ2VuLUdCJywgeyBkYXk6ICcyLWRpZ2l0JywgbW9udGg6ICdzaG9ydCcsIHllYXI6ICdudW1lcmljJyB9KTtcbn1cblxuLyoqXG4gKiBFeHBpcnkgb2YgdGhlIHBheW1lbnQgbGluayBhcyBlcG9jaCBtcy4gVGhlIGJhY2tlbmQgc2VuZHMgYFlZWVktTU0tREQgSEg6bW06c3NgIHdpdGggbm8gdGltZXpvbmUsIHJlYWQgYXMgVVRDICh0b1xuICogYmUgY29uZmlybWVkIHdpdGggdGhlIGJhY2tlbmQpOyBhIHZhbHVlIHRoYXQgY2FycmllcyBgWmAgb3IgYW4gb2Zmc2V0IGlzIHJlYWQgYXMgaXQgaXMuIGBudWxsYCB3aGVuIG1pc3NpbmcvaW52YWxpZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTGlua0V4cGlyeSh2YWx1ZT86IHN0cmluZyB8IG51bGwpOiBudW1iZXIgfCBudWxsIHtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IGhhc1pvbmUgPSAvKFp8WystXVxcZHsyfTo/XFxkezJ9KSQvaS50ZXN0KHZhbHVlLnRyaW0oKSk7XG4gIGNvbnN0IG1zID0gRGF0ZS5wYXJzZShoYXNab25lID8gdmFsdWUgOiBgJHt2YWx1ZS50cmltKCkucmVwbGFjZSgnICcsICdUJyl9WmApO1xuICByZXR1cm4gTnVtYmVyLmlzTmFOKG1zKSA/IG51bGwgOiBtcztcbn1cblxuLyoqIGBtbTpzc2AgKG9yIGBoOm1tOnNzYCBmcm9tIG9uZSBob3VyIHVwKSBmb3IgYSBjb3VudGRvd24uICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0Q291bnRkb3duKG1zOiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCB0b3RhbCA9IE1hdGgubWF4KDAsIE1hdGguZmxvb3IobXMgLyAxMDAwKSk7XG4gIGNvbnN0IGggPSBNYXRoLmZsb29yKHRvdGFsIC8gMzYwMCk7XG4gIGNvbnN0IG0gPSBNYXRoLmZsb29yKCh0b3RhbCAlIDM2MDApIC8gNjApO1xuICBjb25zdCBzID0gdG90YWwgJSA2MDtcbiAgY29uc3QgcGFkID0gKG46IG51bWJlcikgPT4gU3RyaW5nKG4pLnBhZFN0YXJ0KDIsICcwJyk7XG4gIHJldHVybiBoID4gMCA/IGAke2h9OiR7cGFkKG0pfToke3BhZChzKX1gIDogYCR7cGFkKG0pfToke3BhZChzKX1gO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbGVnVGl0bGUobGVnOiBSZWlzc3VlTGVnKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke2xlZy5kaXJlY3Rpb24gfHwgJ0xlZyd9IMK3ICR7bGVnLm9yaWdpbkNvZGV9IOKGkiAke2xlZy5kZXN0aW5hdGlvbkNvZGV9YDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFpcnBvcnRPZihpZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIGNpdHk6IHN0cmluZywgY291bnRyeTogc3RyaW5nKTogUmVpc3N1ZUFpcnBvcnQge1xuICByZXR1cm4geyBpZCwgbmFtZTogbmFtZSB8fCBjaXR5IHx8IGlkLCBjaXR5X25hbWU6IGNpdHkgfHwgaWQsIGNvdW50cnlfbmFtZTogY291bnRyeSwgdHlwZTogJ2FpcnBvcnQnIH07XG59XG5cbmV4cG9ydCBjb25zdCBvcmlnaW5BaXJwb3J0ID0gKGw6IFJlaXNzdWVMZWcpOiBSZWlzc3VlQWlycG9ydCA9PlxuICBhaXJwb3J0T2YobC5vcmlnaW5Db2RlLCBsLm9yaWdpbk5hbWUsIGwub3JpZ2luQ2l0eU5hbWUsIGwub3JpZ2luQ291bnRyeU5hbWUpO1xuXG5leHBvcnQgY29uc3QgZGVzdGluYXRpb25BaXJwb3J0ID0gKGw6IFJlaXNzdWVMZWcpOiBSZWlzc3VlQWlycG9ydCA9PlxuICBhaXJwb3J0T2YobC5kZXN0aW5hdGlvbkNvZGUsIGwuZGVzdGluYXRpb25OYW1lLCBsLmRlc3RpbmF0aW9uQ2l0eU5hbWUsIGwuZGVzdGluYXRpb25Db3VudHJ5TmFtZSk7XG5cbmV4cG9ydCBjb25zdCBjb21wYXJlQWlycG9ydHMgPSAoYTogUmVpc3N1ZUFpcnBvcnQsIGI6IFJlaXNzdWVBaXJwb3J0KTogYm9vbGVhbiA9PiBhPy5pZCA9PT0gYj8uaWQ7XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRNb25leShhbW91bnQ6IG51bWJlciwgY3VycmVuY3k6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgJHthbW91bnQudG9Mb2NhbGVTdHJpbmcoJ2VuLVVTJywgeyBtYXhpbXVtRnJhY3Rpb25EaWdpdHM6IDIgfSl9ICR7Y3VycmVuY3l9YC50cmltKCk7XG59XG5cbi8qKiBgMjEgT2N0YCDigJQgc2FtZSBzaG9ydCBkYXRlIHRoZSBjYW5jZWwgZGlhbG9nIHNob3dzIG9uIGEgbGVnIGNhcmQuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0U2hvcnREYXRlKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoIXZhbHVlKSByZXR1cm4gJ+KAlCc7XG4gIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh2YWx1ZSk7XG4gIHJldHVybiBOdW1iZXIuaXNOYU4oZGF0ZS5nZXRUaW1lKCkpID8gdmFsdWUgOiBkYXRlLnRvTG9jYWxlRGF0ZVN0cmluZygnZW4tR0InLCB7IGRheTogJzItZGlnaXQnLCBtb250aDogJ3Nob3J0JyB9KTtcbn1cblxuLyoqIGAwMTo1NWAgc3RyYWlnaHQgZnJvbSB0aGUgYFlZWVktTU0tRERUSEg6bW06c3NgIHN0cmluZyAobm8gdGltZXpvbmUgY29udmVyc2lvbikuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0VGltZSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHZhbHVlICYmIHZhbHVlLmxlbmd0aCA+PSAxNiAmJiB2YWx1ZVsxMF0gPT09ICdUJyA/IHZhbHVlLnNsaWNlKDExLCAxNikgOiAn4oCUJztcbn1cblxuLyoqXG4gKiBUaGUgbGVnIGFscmVhZHkgZGVwYXJ0ZWQuIFRoZSBib29raW5nIGdpdmVzIG5vIHRpbWV6b25lIGZvciBgTGVnRGVwYXJ0dXJlRGF0ZVRpbWVgIChhaXJwb3J0IGxvY2FsIHRpbWUpLCBzbyB0aGlzXG4gKiBjb21wYXJlcyB3aXRoIHRoZSBhZ2VudCdzIGNsb2NrOiBpdCBjYW4gYmUgb2ZmIGJ5IGEgZmV3IGhvdXJzIG9uIHRoZSBkYXkgb2YgdGhlIGZsaWdodCwgbmV2ZXIgYnkgYSBkYXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0xlZ0Zsb3duKGxlZzogeyBkZXBhcnR1cmU6IHN0cmluZyB9KTogYm9vbGVhbiB7XG4gIGNvbnN0IHRpbWUgPSBsZWcuZGVwYXJ0dXJlID8gRGF0ZS5wYXJzZShsZWcuZGVwYXJ0dXJlKSA6IE5hTjtcbiAgcmV0dXJuICFOdW1iZXIuaXNOYU4odGltZSkgJiYgdGltZSA8IERhdGUubm93KCk7XG59XG4iXX0=
|