@vendasta/meetings 1.9.1 → 1.10.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.
- package/esm2020/lib/_internal/interfaces/index.mjs +1 -1
- package/esm2020/lib/_internal/interfaces/meeting-external.interface.mjs +1 -1
- package/esm2020/lib/_internal/interfaces/meeting-guest.interface.mjs +1 -1
- package/esm2020/lib/_internal/interfaces/meeting-host.interface.mjs +1 -1
- package/esm2020/lib/_internal/interfaces/shared.interface.mjs +1 -1
- package/esm2020/lib/_internal/meeting-host.api.service.mjs +7 -2
- package/esm2020/lib/_internal/objects/annotations.mjs +1 -1
- package/esm2020/lib/_internal/objects/date-range.mjs +1 -1
- package/esm2020/lib/_internal/objects/field-mask.mjs +1 -1
- package/esm2020/lib/_internal/objects/google-meet.mjs +1 -1
- package/esm2020/lib/_internal/objects/groups-and-services.mjs +1 -1
- package/esm2020/lib/_internal/objects/index.mjs +3 -3
- package/esm2020/lib/_internal/objects/meeting-external.mjs +2 -2
- package/esm2020/lib/_internal/objects/meeting-guest.mjs +2 -2
- package/esm2020/lib/_internal/objects/meeting-host.mjs +169 -25
- package/esm2020/lib/_internal/objects/meeting-source.mjs +1 -1
- package/esm2020/lib/_internal/objects/meeting-type.mjs +1 -1
- package/esm2020/lib/_internal/objects/openapiv2.mjs +1 -1
- package/esm2020/lib/_internal/objects/shared.mjs +1 -1
- package/esm2020/lib/_internal/objects/zoom.mjs +1 -1
- package/esm2020/lib/host/host.service.mjs +14 -2
- package/esm2020/lib/index.mjs +1 -1
- package/esm2020/lib/shared/index.mjs +2 -1
- package/esm2020/lib/shared/meeting-stats.mjs +17 -0
- package/fesm2015/vendasta-meetings.mjs +201 -23
- package/fesm2015/vendasta-meetings.mjs.map +1 -1
- package/fesm2020/vendasta-meetings.mjs +201 -23
- package/fesm2020/vendasta-meetings.mjs.map +1 -1
- package/lib/_internal/interfaces/index.d.ts +2 -2
- package/lib/_internal/interfaces/meeting-external.interface.d.ts +1 -1
- package/lib/_internal/interfaces/meeting-guest.interface.d.ts +1 -1
- package/lib/_internal/interfaces/meeting-host.interface.d.ts +30 -8
- package/lib/_internal/meeting-host.api.service.d.ts +3 -2
- package/lib/_internal/objects/annotations.d.ts +1 -1
- package/lib/_internal/objects/date-range.d.ts +1 -1
- package/lib/_internal/objects/field-mask.d.ts +1 -1
- package/lib/_internal/objects/google-meet.d.ts +1 -1
- package/lib/_internal/objects/groups-and-services.d.ts +1 -1
- package/lib/_internal/objects/index.d.ts +2 -2
- package/lib/_internal/objects/meeting-external.d.ts +2 -2
- package/lib/_internal/objects/meeting-guest.d.ts +2 -2
- package/lib/_internal/objects/meeting-host.d.ts +47 -16
- package/lib/_internal/objects/meeting-source.d.ts +1 -1
- package/lib/_internal/objects/meeting-type.d.ts +1 -1
- package/lib/_internal/objects/openapiv2.d.ts +1 -1
- package/lib/_internal/objects/shared.d.ts +1 -1
- package/lib/_internal/objects/zoom.d.ts +1 -1
- package/lib/host/host.service.d.ts +6 -1
- package/lib/index.d.ts +1 -1
- package/lib/shared/index.d.ts +1 -0
- package/lib/shared/meeting-stats.d.ts +17 -0
- package/package.json +1 -1
|
@@ -7330,6 +7330,12 @@ class EventTypeSummary {
|
|
|
7330
7330
|
if (proto.dateRange) {
|
|
7331
7331
|
m.dateRange = EventTypeDateRange.fromProto(proto.dateRange);
|
|
7332
7332
|
}
|
|
7333
|
+
if (proto.bufferDurationBeforeMeeting) {
|
|
7334
|
+
m.bufferDurationBeforeMeeting = parseInt(proto.bufferDurationBeforeMeeting, 10);
|
|
7335
|
+
}
|
|
7336
|
+
if (proto.bufferDurationAfterMeeting) {
|
|
7337
|
+
m.bufferDurationAfterMeeting = parseInt(proto.bufferDurationAfterMeeting, 10);
|
|
7338
|
+
}
|
|
7333
7339
|
return m;
|
|
7334
7340
|
}
|
|
7335
7341
|
constructor(kwargs) {
|
|
@@ -7388,13 +7394,22 @@ class EventTypeSummary {
|
|
|
7388
7394
|
if (typeof this.description !== 'undefined') {
|
|
7389
7395
|
toReturn['description'] = this.description;
|
|
7390
7396
|
}
|
|
7397
|
+
if (typeof this.bufferDurationBeforeMeeting !== 'undefined') {
|
|
7398
|
+
toReturn['bufferDurationBeforeMeeting'] = this.bufferDurationBeforeMeeting;
|
|
7399
|
+
}
|
|
7400
|
+
if (typeof this.bufferDurationAfterMeeting !== 'undefined') {
|
|
7401
|
+
toReturn['bufferDurationAfterMeeting'] = this.bufferDurationAfterMeeting;
|
|
7402
|
+
}
|
|
7391
7403
|
return toReturn;
|
|
7392
7404
|
}
|
|
7393
7405
|
}
|
|
7394
|
-
class
|
|
7406
|
+
class ListBookedMeetingsRequestFilters {
|
|
7395
7407
|
static fromProto(proto) {
|
|
7396
|
-
let m = new
|
|
7408
|
+
let m = new ListBookedMeetingsRequestFilters();
|
|
7397
7409
|
m = Object.assign(m, proto);
|
|
7410
|
+
if (proto.timeSpan) {
|
|
7411
|
+
m.timeSpan = DateRange.fromProto(proto.timeSpan);
|
|
7412
|
+
}
|
|
7398
7413
|
return m;
|
|
7399
7414
|
}
|
|
7400
7415
|
constructor(kwargs) {
|
|
@@ -7405,22 +7420,25 @@ class ListAvailabilityRequestFilters {
|
|
|
7405
7420
|
}
|
|
7406
7421
|
toApiJson() {
|
|
7407
7422
|
const toReturn = {};
|
|
7423
|
+
if (typeof this.meetingTypeIds !== 'undefined') {
|
|
7424
|
+
toReturn['meetingTypeIds'] = this.meetingTypeIds;
|
|
7425
|
+
}
|
|
7408
7426
|
if (typeof this.hostId !== 'undefined') {
|
|
7409
7427
|
toReturn['hostId'] = this.hostId;
|
|
7410
7428
|
}
|
|
7411
|
-
if (typeof this.
|
|
7412
|
-
toReturn['
|
|
7429
|
+
if (typeof this.timeSpan !== 'undefined' && this.timeSpan !== null) {
|
|
7430
|
+
toReturn['timeSpan'] = 'toApiJson' in this.timeSpan ? this.timeSpan.toApiJson() : this.timeSpan;
|
|
7431
|
+
}
|
|
7432
|
+
if (typeof this.userIds !== 'undefined') {
|
|
7433
|
+
toReturn['userIds'] = this.userIds;
|
|
7413
7434
|
}
|
|
7414
7435
|
return toReturn;
|
|
7415
7436
|
}
|
|
7416
7437
|
}
|
|
7417
|
-
class
|
|
7438
|
+
class ListAvailabilityRequestFilters {
|
|
7418
7439
|
static fromProto(proto) {
|
|
7419
|
-
let m = new
|
|
7440
|
+
let m = new ListAvailabilityRequestFilters();
|
|
7420
7441
|
m = Object.assign(m, proto);
|
|
7421
|
-
if (proto.timeSpan) {
|
|
7422
|
-
m.timeSpan = DateRange.fromProto(proto.timeSpan);
|
|
7423
|
-
}
|
|
7424
7442
|
return m;
|
|
7425
7443
|
}
|
|
7426
7444
|
constructor(kwargs) {
|
|
@@ -7431,17 +7449,11 @@ class ListBookedMeetingsRequestFilters {
|
|
|
7431
7449
|
}
|
|
7432
7450
|
toApiJson() {
|
|
7433
7451
|
const toReturn = {};
|
|
7434
|
-
if (typeof this.meetingTypeIds !== 'undefined') {
|
|
7435
|
-
toReturn['meetingTypeIds'] = this.meetingTypeIds;
|
|
7436
|
-
}
|
|
7437
7452
|
if (typeof this.hostId !== 'undefined') {
|
|
7438
7453
|
toReturn['hostId'] = this.hostId;
|
|
7439
7454
|
}
|
|
7440
|
-
if (typeof this.
|
|
7441
|
-
toReturn['
|
|
7442
|
-
}
|
|
7443
|
-
if (typeof this.userIds !== 'undefined') {
|
|
7444
|
-
toReturn['userIds'] = this.userIds;
|
|
7455
|
+
if (typeof this.meetingTypeId !== 'undefined') {
|
|
7456
|
+
toReturn['meetingTypeId'] = this.meetingTypeId;
|
|
7445
7457
|
}
|
|
7446
7458
|
return toReturn;
|
|
7447
7459
|
}
|
|
@@ -7673,6 +7685,109 @@ class GetHostsForCalendarResponse {
|
|
|
7673
7685
|
return toReturn;
|
|
7674
7686
|
}
|
|
7675
7687
|
}
|
|
7688
|
+
class GetMeetingStatsRequest {
|
|
7689
|
+
static fromProto(proto) {
|
|
7690
|
+
let m = new GetMeetingStatsRequest();
|
|
7691
|
+
m = Object.assign(m, proto);
|
|
7692
|
+
if (proto.timeSpan) {
|
|
7693
|
+
m.timeSpan = DateRange.fromProto(proto.timeSpan);
|
|
7694
|
+
}
|
|
7695
|
+
if (proto.timeZone) {
|
|
7696
|
+
m.timeZone = TimeZone.fromProto(proto.timeZone);
|
|
7697
|
+
}
|
|
7698
|
+
return m;
|
|
7699
|
+
}
|
|
7700
|
+
constructor(kwargs) {
|
|
7701
|
+
if (!kwargs) {
|
|
7702
|
+
return;
|
|
7703
|
+
}
|
|
7704
|
+
Object.assign(this, kwargs);
|
|
7705
|
+
}
|
|
7706
|
+
toApiJson() {
|
|
7707
|
+
const toReturn = {};
|
|
7708
|
+
if (typeof this.timeSpan !== 'undefined' && this.timeSpan !== null) {
|
|
7709
|
+
toReturn['timeSpan'] = 'toApiJson' in this.timeSpan ? this.timeSpan.toApiJson() : this.timeSpan;
|
|
7710
|
+
}
|
|
7711
|
+
if (typeof this.timeZone !== 'undefined' && this.timeZone !== null) {
|
|
7712
|
+
toReturn['timeZone'] = 'toApiJson' in this.timeZone ? this.timeZone.toApiJson() : this.timeZone;
|
|
7713
|
+
}
|
|
7714
|
+
if (typeof this.businessId !== 'undefined') {
|
|
7715
|
+
toReturn['businessId'] = this.businessId;
|
|
7716
|
+
}
|
|
7717
|
+
return toReturn;
|
|
7718
|
+
}
|
|
7719
|
+
}
|
|
7720
|
+
class GetMeetingStatsResponse {
|
|
7721
|
+
static fromProto(proto) {
|
|
7722
|
+
let m = new GetMeetingStatsResponse();
|
|
7723
|
+
m = Object.assign(m, proto);
|
|
7724
|
+
if (proto.totalMeetingsScheduled) {
|
|
7725
|
+
m.totalMeetingsScheduled = parseInt(proto.totalMeetingsScheduled, 10);
|
|
7726
|
+
}
|
|
7727
|
+
if (proto.previousTotalMeetingsScheduled) {
|
|
7728
|
+
m.previousTotalMeetingsScheduled = parseInt(proto.previousTotalMeetingsScheduled, 10);
|
|
7729
|
+
}
|
|
7730
|
+
if (proto.dailyMeetingsScheduled) {
|
|
7731
|
+
m.dailyMeetingsScheduled = proto.dailyMeetingsScheduled.map(MeetingStatPoint.fromProto);
|
|
7732
|
+
}
|
|
7733
|
+
if (proto.totalMeetingsCancelled) {
|
|
7734
|
+
m.totalMeetingsCancelled = parseInt(proto.totalMeetingsCancelled, 10);
|
|
7735
|
+
}
|
|
7736
|
+
if (proto.totalMeetingsRescheduled) {
|
|
7737
|
+
m.totalMeetingsRescheduled = parseInt(proto.totalMeetingsRescheduled, 10);
|
|
7738
|
+
}
|
|
7739
|
+
if (proto.totalAbandonedCarts) {
|
|
7740
|
+
m.totalAbandonedCarts = parseInt(proto.totalAbandonedCarts, 10);
|
|
7741
|
+
}
|
|
7742
|
+
if (proto.totalCalendarDisconnected) {
|
|
7743
|
+
m.totalCalendarDisconnected = parseInt(proto.totalCalendarDisconnected, 10);
|
|
7744
|
+
}
|
|
7745
|
+
if (proto.totalBookedByAiChat) {
|
|
7746
|
+
m.totalBookedByAiChat = parseInt(proto.totalBookedByAiChat, 10);
|
|
7747
|
+
}
|
|
7748
|
+
if (proto.totalBookedByAiVoice) {
|
|
7749
|
+
m.totalBookedByAiVoice = parseInt(proto.totalBookedByAiVoice, 10);
|
|
7750
|
+
}
|
|
7751
|
+
return m;
|
|
7752
|
+
}
|
|
7753
|
+
constructor(kwargs) {
|
|
7754
|
+
if (!kwargs) {
|
|
7755
|
+
return;
|
|
7756
|
+
}
|
|
7757
|
+
Object.assign(this, kwargs);
|
|
7758
|
+
}
|
|
7759
|
+
toApiJson() {
|
|
7760
|
+
const toReturn = {};
|
|
7761
|
+
if (typeof this.totalMeetingsScheduled !== 'undefined') {
|
|
7762
|
+
toReturn['totalMeetingsScheduled'] = this.totalMeetingsScheduled;
|
|
7763
|
+
}
|
|
7764
|
+
if (typeof this.previousTotalMeetingsScheduled !== 'undefined') {
|
|
7765
|
+
toReturn['previousTotalMeetingsScheduled'] = this.previousTotalMeetingsScheduled;
|
|
7766
|
+
}
|
|
7767
|
+
if (typeof this.dailyMeetingsScheduled !== 'undefined' && this.dailyMeetingsScheduled !== null) {
|
|
7768
|
+
toReturn['dailyMeetingsScheduled'] = 'toApiJson' in this.dailyMeetingsScheduled ? this.dailyMeetingsScheduled.toApiJson() : this.dailyMeetingsScheduled;
|
|
7769
|
+
}
|
|
7770
|
+
if (typeof this.totalMeetingsCancelled !== 'undefined') {
|
|
7771
|
+
toReturn['totalMeetingsCancelled'] = this.totalMeetingsCancelled;
|
|
7772
|
+
}
|
|
7773
|
+
if (typeof this.totalMeetingsRescheduled !== 'undefined') {
|
|
7774
|
+
toReturn['totalMeetingsRescheduled'] = this.totalMeetingsRescheduled;
|
|
7775
|
+
}
|
|
7776
|
+
if (typeof this.totalAbandonedCarts !== 'undefined') {
|
|
7777
|
+
toReturn['totalAbandonedCarts'] = this.totalAbandonedCarts;
|
|
7778
|
+
}
|
|
7779
|
+
if (typeof this.totalCalendarDisconnected !== 'undefined') {
|
|
7780
|
+
toReturn['totalCalendarDisconnected'] = this.totalCalendarDisconnected;
|
|
7781
|
+
}
|
|
7782
|
+
if (typeof this.totalBookedByAiChat !== 'undefined') {
|
|
7783
|
+
toReturn['totalBookedByAiChat'] = this.totalBookedByAiChat;
|
|
7784
|
+
}
|
|
7785
|
+
if (typeof this.totalBookedByAiVoice !== 'undefined') {
|
|
7786
|
+
toReturn['totalBookedByAiVoice'] = this.totalBookedByAiVoice;
|
|
7787
|
+
}
|
|
7788
|
+
return toReturn;
|
|
7789
|
+
}
|
|
7790
|
+
}
|
|
7676
7791
|
class GetMeetingTypesForCalendarsRequest {
|
|
7677
7792
|
static fromProto(proto) {
|
|
7678
7793
|
let m = new GetMeetingTypesForCalendarsRequest();
|
|
@@ -9088,6 +9203,35 @@ class Meeting {
|
|
|
9088
9203
|
return toReturn;
|
|
9089
9204
|
}
|
|
9090
9205
|
}
|
|
9206
|
+
class MeetingStatPoint {
|
|
9207
|
+
static fromProto(proto) {
|
|
9208
|
+
let m = new MeetingStatPoint();
|
|
9209
|
+
m = Object.assign(m, proto);
|
|
9210
|
+
if (proto.date) {
|
|
9211
|
+
m.date = new Date(proto.date);
|
|
9212
|
+
}
|
|
9213
|
+
if (proto.count) {
|
|
9214
|
+
m.count = parseInt(proto.count, 10);
|
|
9215
|
+
}
|
|
9216
|
+
return m;
|
|
9217
|
+
}
|
|
9218
|
+
constructor(kwargs) {
|
|
9219
|
+
if (!kwargs) {
|
|
9220
|
+
return;
|
|
9221
|
+
}
|
|
9222
|
+
Object.assign(this, kwargs);
|
|
9223
|
+
}
|
|
9224
|
+
toApiJson() {
|
|
9225
|
+
const toReturn = {};
|
|
9226
|
+
if (typeof this.date !== 'undefined' && this.date !== null) {
|
|
9227
|
+
toReturn['date'] = 'toApiJson' in this.date ? this.date.toApiJson() : this.date;
|
|
9228
|
+
}
|
|
9229
|
+
if (typeof this.count !== 'undefined') {
|
|
9230
|
+
toReturn['count'] = this.count;
|
|
9231
|
+
}
|
|
9232
|
+
return toReturn;
|
|
9233
|
+
}
|
|
9234
|
+
}
|
|
9091
9235
|
class MeetingTypeList {
|
|
9092
9236
|
static fromProto(proto) {
|
|
9093
9237
|
let m = new MeetingTypeList();
|
|
@@ -9111,9 +9255,9 @@ class MeetingTypeList {
|
|
|
9111
9255
|
return toReturn;
|
|
9112
9256
|
}
|
|
9113
9257
|
}
|
|
9114
|
-
class
|
|
9258
|
+
class HostBookBatchMeetingRequestMetadataEntry {
|
|
9115
9259
|
static fromProto(proto) {
|
|
9116
|
-
let m = new
|
|
9260
|
+
let m = new HostBookBatchMeetingRequestMetadataEntry();
|
|
9117
9261
|
m = Object.assign(m, proto);
|
|
9118
9262
|
return m;
|
|
9119
9263
|
}
|
|
@@ -9134,9 +9278,9 @@ class UpdateMeetingMetadataRequestMetadataEntry {
|
|
|
9134
9278
|
return toReturn;
|
|
9135
9279
|
}
|
|
9136
9280
|
}
|
|
9137
|
-
class
|
|
9281
|
+
class MeetingMetadataEntry {
|
|
9138
9282
|
static fromProto(proto) {
|
|
9139
|
-
let m = new
|
|
9283
|
+
let m = new MeetingMetadataEntry();
|
|
9140
9284
|
m = Object.assign(m, proto);
|
|
9141
9285
|
return m;
|
|
9142
9286
|
}
|
|
@@ -9157,9 +9301,9 @@ class HostBookBatchMeetingRequestMetadataEntry {
|
|
|
9157
9301
|
return toReturn;
|
|
9158
9302
|
}
|
|
9159
9303
|
}
|
|
9160
|
-
class
|
|
9304
|
+
class UpdateMeetingMetadataRequestMetadataEntry {
|
|
9161
9305
|
static fromProto(proto) {
|
|
9162
|
-
let m = new
|
|
9306
|
+
let m = new UpdateMeetingMetadataRequestMetadataEntry();
|
|
9163
9307
|
m = Object.assign(m, proto);
|
|
9164
9308
|
return m;
|
|
9165
9309
|
}
|
|
@@ -10726,6 +10870,11 @@ class MeetingHostApiService {
|
|
|
10726
10870
|
return this.http.post(this._host + "/meetings.v1.MeetingHost/ListBookedMeetingsV2", request.toApiJson(), this.apiOptions())
|
|
10727
10871
|
.pipe(map(resp => ListBookedMeetingsV2Response.fromProto(resp)));
|
|
10728
10872
|
}
|
|
10873
|
+
getMeetingStats(r) {
|
|
10874
|
+
const request = (r.toApiJson) ? r : new GetMeetingStatsRequest(r);
|
|
10875
|
+
return this.http.post(this._host + "/meetings.v1.MeetingHost/GetMeetingStats", request.toApiJson(), this.apiOptions())
|
|
10876
|
+
.pipe(map(resp => GetMeetingStatsResponse.fromProto(resp)));
|
|
10877
|
+
}
|
|
10729
10878
|
cancelMeeting(r) {
|
|
10730
10879
|
const request = (r.toApiJson) ? r : new CancelMeetingRequest(r);
|
|
10731
10880
|
return this.http.post(this._host + "/meetings.v1.MeetingHost/CancelMeeting", request.toApiJson(), Object.assign(Object.assign({}, this.apiOptions()), { observe: 'response' }));
|
|
@@ -11182,6 +11331,23 @@ var MeetingSourceOrigin;
|
|
|
11182
11331
|
MeetingSourceOrigin["SalesCenter"] = "sales-center";
|
|
11183
11332
|
})(MeetingSourceOrigin || (MeetingSourceOrigin = {}));
|
|
11184
11333
|
|
|
11334
|
+
function meetingStatsFromApi(resp) {
|
|
11335
|
+
return {
|
|
11336
|
+
totalMeetingsScheduled: resp.totalMeetingsScheduled || 0,
|
|
11337
|
+
previousTotalMeetingsScheduled: resp.previousTotalMeetingsScheduled || 0,
|
|
11338
|
+
dailyMeetingsScheduled: (resp.dailyMeetingsScheduled || []).map((point) => ({
|
|
11339
|
+
date: point.date,
|
|
11340
|
+
count: point.count || 0,
|
|
11341
|
+
})),
|
|
11342
|
+
totalMeetingsCancelled: resp.totalMeetingsCancelled || 0,
|
|
11343
|
+
totalMeetingsRescheduled: resp.totalMeetingsRescheduled || 0,
|
|
11344
|
+
totalAbandonedCarts: resp.totalAbandonedCarts || 0,
|
|
11345
|
+
totalCalendarDisconnected: resp.totalCalendarDisconnected || 0,
|
|
11346
|
+
totalBookedByAiChat: resp.totalBookedByAiChat || 0,
|
|
11347
|
+
totalBookedByAiVoice: resp.totalBookedByAiVoice || 0,
|
|
11348
|
+
};
|
|
11349
|
+
}
|
|
11350
|
+
|
|
11185
11351
|
class GuestService {
|
|
11186
11352
|
constructor(guestAPIService) {
|
|
11187
11353
|
this.guestAPIService = guestAPIService;
|
|
@@ -11681,6 +11847,18 @@ class HostService {
|
|
|
11681
11847
|
hostCancelBatchMeeting(req) {
|
|
11682
11848
|
return this.hostAPIService.hostCancelBatchMeeting(req).pipe(mapTo(null));
|
|
11683
11849
|
}
|
|
11850
|
+
// getMeetingStats returns aggregated meeting statistics for the host, backing the
|
|
11851
|
+
// "My Meetings" dashboard card. timeSpan must be expressed in the caller's time zone;
|
|
11852
|
+
// timeZone is used to bucket meetings into days and to align the comparison period.
|
|
11853
|
+
getMeetingStats(req) {
|
|
11854
|
+
return this.hostAPIService
|
|
11855
|
+
.getMeetingStats({
|
|
11856
|
+
timeSpan: req.timeSpan,
|
|
11857
|
+
timeZone: req.timeZone,
|
|
11858
|
+
businessId: req.businessId,
|
|
11859
|
+
})
|
|
11860
|
+
.pipe(map((resp) => meetingStatsFromApi(resp)));
|
|
11861
|
+
}
|
|
11684
11862
|
// hostListBatchAvailableTimeSlots returns valid chain start times for a
|
|
11685
11863
|
// multi-service host booking. Each slot is the start of the first meeting
|
|
11686
11864
|
// in the chain.
|