@foxford/sdk 8.0.1 → 8.1.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.
@@ -0,0 +1,1269 @@
1
+ import { ApiInstance, ApiConfig, CaptchaConfig, ApiResponse, ApiService, CaptchaService } from '@foxford/services';
2
+ import { BusinessUnitAbbreviation, CartItemResourceType, Course } from '@foxford/types';
3
+
4
+ interface FoxfordAntibotConfig {
5
+ antibotFrameSrc?: string;
6
+ antibotOnload?: (e: Event) => void;
7
+ antibotOnerror?: () => void;
8
+ debug?: boolean;
9
+ }
10
+
11
+ type Widget = {
12
+ name: 'menu' | 'reviews' | 'featuredCoaches' | 'coachEnrollment' | 'shortForm' | 'userTypePrompt' | 'teachersSlider' | 'externshipFormats';
13
+ options: Record<string, any>;
14
+ container?: HTMLElement;
15
+ };
16
+ type WidgetsInitConfig = {
17
+ version?: 'latest' | string;
18
+ locale?: 'ru';
19
+ };
20
+ interface WidgetsConfig extends WidgetsInitConfig {
21
+ analyticContext?: {
22
+ prefix: string;
23
+ module: string;
24
+ payload?: Record<any, any>;
25
+ };
26
+ rootColors?: boolean;
27
+ loadFonts?: boolean;
28
+ widgets: Array<Widget>;
29
+ }
30
+ declare class Widgets {
31
+ private config;
32
+ private api;
33
+ private manifest;
34
+ static ENTRY: string[];
35
+ static DEFAULT_CONFIG: WidgetsInitConfig;
36
+ constructor(config: WidgetsInitConfig | undefined, apiInstance: ApiInstance);
37
+ create(config: WidgetsConfig): Promise<void>;
38
+ update(name: string, config: Widget): Promise<void>;
39
+ private loadManifest;
40
+ static appendScript(src: string): Promise<unknown>;
41
+ private loadAssets;
42
+ }
43
+
44
+ type ProductTypeItem = {
45
+ type: string;
46
+ id: number;
47
+ description: string;
48
+ title: string;
49
+ discipline: {
50
+ id: number;
51
+ name: string;
52
+ };
53
+ teacher: {
54
+ id: number;
55
+ long_name: string;
56
+ description: string;
57
+ experience: number;
58
+ photo_url: string;
59
+ photo_large_url: string;
60
+ };
61
+ levels: Array<{
62
+ id: number;
63
+ name: string;
64
+ }>;
65
+ };
66
+ type ProductPack = {
67
+ name: string;
68
+ description: string;
69
+ meta_title: string;
70
+ meta_description: string;
71
+ published: true;
72
+ content_description: string;
73
+ disciplines_scope: string;
74
+ guaranteed_admission: true;
75
+ grade_names: string;
76
+ is_purchased: false;
77
+ learning_flow: {
78
+ title: string;
79
+ steps: Array<{
80
+ header: string;
81
+ description: string;
82
+ }>;
83
+ };
84
+ offers: {
85
+ intro: string;
86
+ items: Array<{
87
+ title: string;
88
+ description: string;
89
+ }>;
90
+ };
91
+ price_block: {
92
+ price: number;
93
+ initial_price: number;
94
+ title: string;
95
+ description: string;
96
+ points: Array<string>;
97
+ price_per_month: number;
98
+ initial_price_per_month: number;
99
+ };
100
+ product_pack_items: Array<ProductTypeItem>;
101
+ faq_items: Array<{
102
+ question: string;
103
+ answer: string;
104
+ }>;
105
+ landing_image_urls: Array<string>;
106
+ };
107
+ interface CartItemDTO {
108
+ cart_item_type: CartItemResourceType;
109
+ resource_id: number;
110
+ }
111
+ type FoxfordConfig = {
112
+ host?: string;
113
+ /** @deprecated */
114
+ widgetsVersion?: 'latest' | string;
115
+ antibot?: boolean;
116
+ antibotConfig?: FoxfordAntibotConfig;
117
+ api?: ApiConfig;
118
+ captchaConfig?: () => CaptchaConfig;
119
+ /** @deprecated Не используйте инициализацию виджетов через SDK */
120
+ widgetsConfig?: WidgetsInitConfig;
121
+ };
122
+ type Reasons = 'additional_education_free_period_started' | 'announcement_clicked' | 'catalog_filtered' | 'coach_intro_lesson_scheduled' | 'coach_landing_visited' | 'course_conspect_visited' | 'course_landing_visited' | 'event_scheduled' | 'event_visited' | 'exam_rehearsal_page_visited' | 'exam_rehearsal_passed' | 'externship_contract_draft_created' | 'externship_demo_access' | 'externship_iep_selected' | 'externship_intendance_expressed' | 'interactive_training_course_visited' | 'externship_landing_visited' | 'externship_lead_request' | 'mini_group_landing_visited' | 'olympiad_page_visited' | 'onboarding' | 'onboarding_finished' | 'product_pack_landing_visited' | 'promos_coach_recommendation_clicked' | 'promos_course_recommendation_clicked' | 'promos_results_filtered' | 'subscription_landing_visited' | 'teacher_course_visited' | 'training_page_visited' | 'training_passed' | 'wiki_visited' | 'project_landing_cta_clicked';
123
+ type ProductFormats = 'coach_course' | 'course' | 'event' | 'exam_rehearsal' | 'externship' | 'game' | 'interactive_trainings' | 'mini_group' | 'olympiad' | 'product_pack' | 'teacher_course' | 'trainings';
124
+ type UserInterests = {
125
+ businessUnitAbbrs?: BusinessUnitAbbreviation[] | null;
126
+ disciplineId?: number | number[] | null;
127
+ gradeId?: number | number[] | null;
128
+ levelId?: number | number[] | null;
129
+ productId?: number | null;
130
+ productFormat?: ProductFormats | null;
131
+ reason?: Reasons | null;
132
+ };
133
+ interface CommunicationSubscriptions {
134
+ subscriptionNews?: boolean;
135
+ subscriptionMaterials?: boolean;
136
+ subscriptionEvents?: boolean;
137
+ subscriptionPromos?: boolean;
138
+ subscriptionReminders?: boolean;
139
+ subscriptionMedia?: boolean;
140
+ subscriptionExternship?: boolean;
141
+ subscriptionExternal?: boolean;
142
+ }
143
+ interface LoginByPhoneParams {
144
+ onEmailRequest: (phoneCheckResponse: {
145
+ email?: string;
146
+ fakeEmail?: boolean;
147
+ state: 'new' | 'confirmed' | 'not_confirmed';
148
+ }) => Promise<string>;
149
+ onCodeRequest: () => Promise<string>;
150
+ onNameRequest: () => Promise<{
151
+ first_name: string;
152
+ last_name: string;
153
+ }>;
154
+ onConfirmationCodeResponse: (confirmationCodeResponse: {
155
+ nextDeliveryAt: string;
156
+ }) => void;
157
+ onConfirmationCodeError: (error: Error) => void;
158
+ }
159
+ interface LoginOrRegistrationResponse {
160
+ redirectUrl?: string;
161
+ registered?: boolean;
162
+ type?: string;
163
+ }
164
+
165
+ type PupilRole = '11 класс' | '10 класс' | '9 класс' | '8 класс' | '7 класс' | '6 класс' | '5 класс' | '4 класс' | '3 класс' | '2 класс' | '1 класс';
166
+ type UserRole = 'Ученик' | 'Репетитор' | 'Учитель' | 'Родитель' | 'Выпускник' | 'Дошкольник' | PupilRole;
167
+ type LeaderboardAccessState = 'unavailable' | 'available' | 'vacation' | 'disabled';
168
+ type LeaderboardReadinessState = 'changeable_course_selection' | 'ready' | 'unready' | 'waiting_course_selection';
169
+ type LearningGoalsAccessState = 'enabled' | 'disabled' | 'optional' | 'required';
170
+ interface UserDTO {
171
+ id: null | number;
172
+ email: string;
173
+ firstName: string;
174
+ middleName: string;
175
+ lastName: string;
176
+ fullName: string;
177
+ shortName: string;
178
+ createdAt: null | string;
179
+ timezone: null | string;
180
+ locale: null | string;
181
+ grade: {
182
+ id: null | number;
183
+ index: null | number;
184
+ name: null | string;
185
+ translit: null | string;
186
+ };
187
+ phone: null | string;
188
+ avatarUrl: string;
189
+ isParent: boolean;
190
+ isGraduated: boolean;
191
+ gradeChecked: boolean;
192
+ type: null | 'pupil' | 'agent';
193
+ isCoach: boolean;
194
+ isMiniGroupTeacher: boolean;
195
+ isExternshipCoach: boolean;
196
+ isAgent: boolean;
197
+ methodist: boolean;
198
+ address: {
199
+ index: null | string;
200
+ countryId: null | number;
201
+ countryName: null | string;
202
+ regionId: null | number;
203
+ regionName: null | string;
204
+ cityId: null | number;
205
+ cityName: null | string;
206
+ street: null | string;
207
+ house: null | string;
208
+ building: null | string;
209
+ room: null | string;
210
+ } | null;
211
+ socialNets: Array<{
212
+ provider: 'facebook' | 'google_oauth2' | 'mailru_oauth2' | 'odnoklassniki' | 'vkontakte' | 'yandex';
213
+ uid: number;
214
+ }>;
215
+ skype: null | string;
216
+ settings?: {
217
+ calendarUserExperienceFeedback?: boolean;
218
+ elementaryDashboardUserExperienceFeedback?: boolean;
219
+ homeSchoolFamilyEducationGuideHidden?: boolean;
220
+ pageBonusesVisited?: boolean;
221
+ pageDashboardPaymentsVisited?: boolean;
222
+ pageSocializationLandingVisited?: boolean;
223
+ pageSocializationVisited?: boolean;
224
+ supportButtonIndicatorHidden?: boolean;
225
+ };
226
+ bonus: {
227
+ giftAmount: number;
228
+ realMoneyAmount: number;
229
+ };
230
+ bonusAmount: number;
231
+ hasActivePurchases: boolean;
232
+ hasAttemptsSolveExamRehearsals: boolean;
233
+ hasBookmarks: boolean;
234
+ tags: null | string[];
235
+ cartTemplateId: null | number;
236
+ cartItemsCount: number;
237
+ onboardingFinished: boolean;
238
+ onboardingFinishedAt: null | string;
239
+ emailConfirmed: boolean;
240
+ phoneConfirmed: boolean;
241
+ fakeEmail: boolean;
242
+ fakeUser: boolean;
243
+ profileEnriched: boolean;
244
+ recapUuid: string | null;
245
+ disciplineIds: number[];
246
+ privacy: {
247
+ publicProfile: boolean;
248
+ };
249
+ parentPhone: null | string;
250
+ parentPhoneConfirmed: boolean;
251
+ isCustomer: null | boolean;
252
+ hasAccessToMultiDaysStreaks: boolean;
253
+ isElementaryPupil: boolean;
254
+ webSocketNotificationsJwt: null | string;
255
+ hasAccessToAttestationSheets: boolean;
256
+ externshipUser: boolean;
257
+ hasPurchasedExternshipContracts: boolean;
258
+ hasExternshipAttestationAccess: boolean;
259
+ appearanceId?: null | number;
260
+ hasUnseenRoomFeatures?: boolean;
261
+ unconfirmedEmail?: null | string;
262
+ socializationProfile: {
263
+ id: number;
264
+ state: 'active' | 'draft' | 'banned';
265
+ } | null;
266
+ freeAccessFinishesAt: null | string;
267
+ purchaseAnyExternshipContracts: boolean;
268
+ hasExternshipRelation?: boolean;
269
+ hasExternshipActiveContract?: boolean;
270
+ canProlongateContract?: boolean;
271
+ /** Окно пролонгации договора домашней школы: даты, скидка и заголовок следующего года. */
272
+ prolongation?: {
273
+ dailyPlanBannerText?: string;
274
+ endsAt: null | string;
275
+ maxDiscount: number;
276
+ prolongationMenuTitleOn: boolean;
277
+ startsAt: null | string;
278
+ yearName: string;
279
+ } | null;
280
+ /** Текущий интерес посетителя — та же форма, что у `GET /api/user/user_interest`, но из профиля. */
281
+ currentInterest: UserInterests | null;
282
+ /** До какой даты открыт приём в домашнюю школу. */
283
+ admissionFinishesOn: null | string;
284
+ /** Посетитель пришёл из Алгоритмики. */
285
+ algoritmika: boolean;
286
+ bonusesPageVisited: boolean;
287
+ canChangeSchoolInfo: boolean;
288
+ externshipDemoAccessActive: boolean;
289
+ /** Экстернат ждёт оплаты: когда закроется доступ и по какому договору. */
290
+ externshipPaymentRequired: {
291
+ accessClosingDate: string;
292
+ contractId: number;
293
+ } | null;
294
+ externshipPromoHeaderOn: boolean;
295
+ hasExamProgressAccess: boolean;
296
+ hasYearlyRecapAccess: boolean;
297
+ isAttestationSchoolManager: null | boolean;
298
+ isMentor: boolean;
299
+ isXpStreakAvailable: boolean;
300
+ leaderboard: {
301
+ accessState: LeaderboardAccessState;
302
+ readinessState: LeaderboardReadinessState;
303
+ } | null;
304
+ leaderboardAccessState: LeaderboardAccessState;
305
+ learningGoalsAccessState: LearningGoalsAccessState;
306
+ /** Мессенджеры, на которые подписан посетитель; `null` — бэкенд не считал. */
307
+ messengerSubscriptions: null | string[];
308
+ needToPromoteRenewalWithCoach: boolean;
309
+ nextYearCoursesBannerAvailable: boolean;
310
+ passwordSet: null | boolean;
311
+ referralCode: null | string;
312
+ targetActionsOnboardingAvailable: boolean;
313
+ }
314
+
315
+ declare class User {
316
+ private readonly props;
317
+ private readonly isDefault;
318
+ private constructor();
319
+ /**
320
+ * Идентификатор посетителя на бэкенде.
321
+ *
322
+ * @returns Число либо `null` у гостя.
323
+ */
324
+ get id(): UserDTO['id'];
325
+ /**
326
+ * Почта посетителя.
327
+ *
328
+ * @returns Строка; пустая, если почты нет.
329
+ */
330
+ get email(): UserDTO['email'];
331
+ /**
332
+ * Имя.
333
+ *
334
+ * @returns Строка; пустая, если не заполнено.
335
+ */
336
+ get firstName(): UserDTO['firstName'];
337
+ /**
338
+ * Отчество.
339
+ *
340
+ * @returns Строка; пустая, если не заполнено.
341
+ */
342
+ get middleName(): UserDTO['middleName'];
343
+ /**
344
+ * Фамилия.
345
+ *
346
+ * @returns Строка; пустая, если не заполнено.
347
+ */
348
+ get lastName(): UserDTO['lastName'];
349
+ /**
350
+ * Полное имя, каким его собрал бэкенд.
351
+ *
352
+ * @returns Строка; пустая у гостя.
353
+ */
354
+ get fullName(): UserDTO['fullName'];
355
+ /**
356
+ * Короткое имя для обращения в интерфейсе.
357
+ *
358
+ * @returns Строка; пустая у гостя.
359
+ */
360
+ get shortName(): UserDTO['shortName'];
361
+ /**
362
+ * Когда заведён профиль.
363
+ *
364
+ * @returns Дата ISO либо `null` у гостя.
365
+ */
366
+ get createdAt(): UserDTO['createdAt'];
367
+ /**
368
+ * Часовой пояс посетителя.
369
+ *
370
+ * @returns Имя пояса либо `null`, если не задан.
371
+ */
372
+ get timezone(): UserDTO['timezone'];
373
+ /**
374
+ * Локаль интерфейса.
375
+ *
376
+ * @returns Код локали либо `null`, если не задана.
377
+ */
378
+ get locale(): UserDTO['locale'];
379
+ /**
380
+ * Класс посетителя: id, порядковый номер, имя и транслит.
381
+ *
382
+ * @returns Объект класса; у гостя поля `null` и пустые строки.
383
+ */
384
+ get grade(): UserDTO['grade'];
385
+ /**
386
+ * Телефон посетителя.
387
+ *
388
+ * @returns Строка либо `null`, если не указан.
389
+ */
390
+ get phone(): UserDTO['phone'];
391
+ /**
392
+ * Адрес аватара.
393
+ *
394
+ * @returns Строка; пустая, если аватара нет.
395
+ */
396
+ get avatarUrl(): UserDTO['avatarUrl'];
397
+ /**
398
+ * Посетитель — родитель.
399
+ *
400
+ * @returns `true`, если роль родительская.
401
+ */
402
+ get isParent(): UserDTO['isParent'];
403
+ /**
404
+ * Посетитель — выпускник.
405
+ *
406
+ * @returns `true`, если школу закончил.
407
+ */
408
+ get isGraduated(): UserDTO['isGraduated'];
409
+ /**
410
+ * Класс подтверждён посетителем.
411
+ *
412
+ * @returns `true`, если класс проверен.
413
+ */
414
+ get gradeChecked(): UserDTO['gradeChecked'];
415
+ /**
416
+ * Тип учётной записи на бэкенде.
417
+ *
418
+ * @returns `pupil`, `agent` либо `null` у гостя.
419
+ */
420
+ get type(): UserDTO['type'];
421
+ /**
422
+ * Посетитель — репетитор.
423
+ *
424
+ * @returns `true`, если роль репетитора.
425
+ */
426
+ get isCoach(): UserDTO['isCoach'];
427
+ /**
428
+ * Ведёт мини-группы.
429
+ *
430
+ * @returns `true`, если ведёт.
431
+ */
432
+ get isMiniGroupTeacher(): UserDTO['isMiniGroupTeacher'];
433
+ /**
434
+ * Репетитор экстерната.
435
+ *
436
+ * @returns `true`, если ведёт экстернат.
437
+ */
438
+ get isExternshipCoach(): UserDTO['isExternshipCoach'];
439
+ /**
440
+ * Посетитель — учитель.
441
+ *
442
+ * @returns `true`, если роль учителя.
443
+ */
444
+ get isAgent(): UserDTO['isAgent'];
445
+ /**
446
+ * Посетитель — методист.
447
+ *
448
+ * @returns `true`, если методист.
449
+ */
450
+ get methodist(): UserDTO['methodist'];
451
+ /**
452
+ * Почтовый адрес: страна, регион, город, улица, дом.
453
+ *
454
+ * @returns Объект адреса либо `null`, если не заполнен.
455
+ */
456
+ get address(): UserDTO['address'];
457
+ /**
458
+ * Привязанные соцсети.
459
+ *
460
+ * @returns Список провайдеров с идентификаторами; пустой, если привязок нет.
461
+ */
462
+ get socialNets(): UserDTO['socialNets'];
463
+ /**
464
+ * Логин в Skype.
465
+ *
466
+ * @returns Строка либо `null`.
467
+ */
468
+ get skype(): UserDTO['skype'];
469
+ /**
470
+ * Настройки интерфейса: показанные подсказки и скрытые баннеры.
471
+ *
472
+ * @returns Объект флагов либо `undefined`, если бэкенд их не прислал.
473
+ */
474
+ get settings(): UserDTO['settings'];
475
+ /**
476
+ * Бонусный счёт: подарочные и реальные бонусы.
477
+ *
478
+ * @returns Объект с суммами.
479
+ */
480
+ get bonus(): UserDTO['bonus'];
481
+ /**
482
+ * Сумма бонусов на счёте.
483
+ *
484
+ * @returns Число.
485
+ */
486
+ get bonusAmount(): UserDTO['bonusAmount'];
487
+ /**
488
+ * Есть действующие покупки.
489
+ *
490
+ * @returns `true`, если есть.
491
+ */
492
+ get hasActivePurchases(): UserDTO['hasActivePurchases'];
493
+ /**
494
+ * Остались попытки пробных экзаменов.
495
+ *
496
+ * @returns `true`, если остались.
497
+ */
498
+ get hasAttemptsSolveExamRehearsals(): UserDTO['hasAttemptsSolveExamRehearsals'];
499
+ /**
500
+ * Есть закладки.
501
+ *
502
+ * @returns `true`, если есть.
503
+ */
504
+ get hasBookmarks(): UserDTO['hasBookmarks'];
505
+ /**
506
+ * Метки посетителя на бэкенде.
507
+ *
508
+ * @returns Список строк либо `null`.
509
+ */
510
+ get tags(): UserDTO['tags'];
511
+ /**
512
+ * Шаблон корзины.
513
+ *
514
+ * @returns Число либо `null`.
515
+ */
516
+ get cartTemplateId(): UserDTO['cartTemplateId'];
517
+ /**
518
+ * Сколько позиций в корзине.
519
+ *
520
+ * @returns Число.
521
+ */
522
+ get cartItemsCount(): UserDTO['cartItemsCount'];
523
+ /**
524
+ * Онбординг пройден.
525
+ *
526
+ * @returns `true`, если пройден.
527
+ */
528
+ get onboardingFinished(): UserDTO['onboardingFinished'];
529
+ /**
530
+ * Когда пройден онбординг.
531
+ *
532
+ * @returns Дата ISO либо `null`, пока не пройден.
533
+ */
534
+ get onboardingFinishedAt(): UserDTO['onboardingFinishedAt'];
535
+ /**
536
+ * Почта подтверждена.
537
+ *
538
+ * @returns `true`, если подтверждена.
539
+ */
540
+ get emailConfirmed(): UserDTO['emailConfirmed'];
541
+ /**
542
+ * Телефон подтверждён.
543
+ *
544
+ * @returns `true`, если подтверждён.
545
+ */
546
+ get phoneConfirmed(): UserDTO['phoneConfirmed'];
547
+ /**
548
+ * Почта выдумана бэкендом при регистрации без почты.
549
+ *
550
+ * @returns `true`, если почта ненастоящая.
551
+ */
552
+ get fakeEmail(): UserDTO['fakeEmail'];
553
+ /**
554
+ * Посетитель заведён бэкендом без его участия (например, по заявке).
555
+ *
556
+ * @returns `true`, если учётная запись ненастоящая.
557
+ */
558
+ get fakeUser(): UserDTO['fakeUser'];
559
+ /**
560
+ * Профиль дополнен данными после регистрации.
561
+ *
562
+ * @returns `true`, если дополнен.
563
+ */
564
+ get profileEnriched(): UserDTO['profileEnriched'];
565
+ /**
566
+ * Идентификатор итогов года.
567
+ *
568
+ * @returns Строка либо `null`, если итогов нет.
569
+ */
570
+ get recapUuid(): UserDTO['recapUuid'];
571
+ /**
572
+ * Дисциплины, которые изучает посетитель.
573
+ *
574
+ * @returns Список id; пустой, если не выбраны.
575
+ */
576
+ get disciplineIds(): UserDTO['disciplineIds'];
577
+ /**
578
+ * Настройки приватности.
579
+ *
580
+ * @returns Объект с флагом публичного профиля.
581
+ */
582
+ get privacy(): UserDTO['privacy'];
583
+ /**
584
+ * Телефон родителя.
585
+ *
586
+ * @returns Строка либо `null`.
587
+ */
588
+ get parentPhone(): UserDTO['parentPhone'];
589
+ /**
590
+ * Телефон родителя подтверждён.
591
+ *
592
+ * @returns `true`, если подтверждён.
593
+ */
594
+ get parentPhoneConfirmed(): UserDTO['parentPhoneConfirmed'];
595
+ /**
596
+ * Посетитель что-то покупал.
597
+ *
598
+ * @returns `true`, `false` либо `null`, если бэкенд не считал.
599
+ */
600
+ get isCustomer(): UserDTO['isCustomer'];
601
+ /**
602
+ * Доступны многодневные серии занятий.
603
+ *
604
+ * @returns `true`, если доступны.
605
+ */
606
+ get hasAccessToMultiDaysStreaks(): UserDTO['hasAccessToMultiDaysStreaks'];
607
+ /**
608
+ * Ученик начальной школы.
609
+ *
610
+ * @returns `true`, если начальная школа.
611
+ */
612
+ get isElementaryPupil(): UserDTO['isElementaryPupil'];
613
+ /**
614
+ * Токен для канала уведомлений по WebSocket.
615
+ *
616
+ * @returns Строка либо `null`, если канала нет.
617
+ */
618
+ get webSocketNotificationsJwt(): UserDTO['webSocketNotificationsJwt'];
619
+ /**
620
+ * Доступны аттестационные листы.
621
+ *
622
+ * @returns `true`, если доступны.
623
+ */
624
+ get hasAccessToAttestationSheets(): UserDTO['hasAccessToAttestationSheets'];
625
+ /**
626
+ * Посетитель учится в экстернате.
627
+ *
628
+ * @returns `true`, если экстернат.
629
+ */
630
+ get externshipUser(): UserDTO['externshipUser'];
631
+ /**
632
+ * Есть оплаченные договоры экстерната.
633
+ *
634
+ * @returns `true`, если есть.
635
+ */
636
+ get hasPurchasedExternshipContracts(): UserDTO['hasPurchasedExternshipContracts'];
637
+ /**
638
+ * Доступна аттестация экстерната.
639
+ *
640
+ * @returns `true`, если доступна.
641
+ */
642
+ get hasExternshipAttestationAccess(): UserDTO['hasExternshipAttestationAccess'];
643
+ /**
644
+ * Профиль в разделе социализации.
645
+ *
646
+ * @returns Объект с id и состоянием либо `null`, если профиля нет.
647
+ */
648
+ get socializationProfile(): UserDTO['socializationProfile'];
649
+ /**
650
+ * Когда заканчивается бесплатный доступ.
651
+ *
652
+ * @returns Дата ISO либо `null`, если доступа нет.
653
+ */
654
+ get freeAccessFinishesAt(): UserDTO['freeAccessFinishesAt'];
655
+ /**
656
+ * В комнате начальной школы есть непросмотренные новинки.
657
+ *
658
+ * @returns `true`, если есть; `undefined`, если бэкенд не прислал.
659
+ */
660
+ get hasUnseenRoomFeatures(): UserDTO['hasUnseenRoomFeatures'];
661
+ /**
662
+ * Покупал договоры экстерната.
663
+ *
664
+ * @returns `true`, если покупал.
665
+ */
666
+ get purchaseAnyExternshipContracts(): UserDTO['purchaseAnyExternshipContracts'];
667
+ /**
668
+ * Связан с экстернатом: ученик, родитель либо репетитор.
669
+ *
670
+ * @returns `true`, если связан; `undefined`, если бэкенд не прислал.
671
+ */
672
+ get hasExternshipRelation(): UserDTO['hasExternshipRelation'];
673
+ /**
674
+ * Есть действующий договор экстерната.
675
+ *
676
+ * @returns `true`, если есть; `undefined`, если бэкенд не прислал.
677
+ */
678
+ get hasExternshipActiveContract(): UserDTO['hasExternshipActiveContract'];
679
+ /**
680
+ * Можно продлить договор домашней школы.
681
+ *
682
+ * @returns `true`, если можно; `undefined`, если бэкенд не прислал.
683
+ */
684
+ get canProlongateContract(): UserDTO['canProlongateContract'];
685
+ /**
686
+ * Окно пролонгации договора: даты, скидка, заголовок следующего года.
687
+ *
688
+ * @returns Объект окна, `null` либо `undefined`, если окна нет.
689
+ */
690
+ get prolongation(): UserDTO['prolongation'];
691
+ /**
692
+ * Текущий интерес посетителя: класс, дисциплина, уровень, формат и причина. Та же форма, что у `GET /api/user/user_interest`, но из профиля, без похода.
693
+ *
694
+ * @returns Объект интереса либо `null`, если бэкенд не считал.
695
+ */
696
+ get currentInterest(): UserDTO['currentInterest'];
697
+ /**
698
+ * До какой даты открыт приём в домашнюю школу.
699
+ *
700
+ * @returns Дата либо `null`, если приём не идёт.
701
+ */
702
+ get admissionFinishesOn(): UserDTO['admissionFinishesOn'];
703
+ /**
704
+ * Посетитель пришёл из Алгоритмики — партнёрский вход с другой площадки.
705
+ *
706
+ * @returns `true`, если из Алгоритмики.
707
+ */
708
+ get algoritmika(): UserDTO['algoritmika'];
709
+ /**
710
+ * Страница бонусов уже открывалась — подсказки на ней больше не показываются.
711
+ *
712
+ * @returns `true`, если открывалась.
713
+ */
714
+ get bonusesPageVisited(): UserDTO['bonusesPageVisited'];
715
+ /**
716
+ * Посетителю разрешено менять школу и класс в профиле.
717
+ *
718
+ * @returns `true`, если разрешено.
719
+ */
720
+ get canChangeSchoolInfo(): UserDTO['canChangeSchoolInfo'];
721
+ /**
722
+ * Идёт демо-доступ к экстернату.
723
+ *
724
+ * @returns `true`, пока демо активно.
725
+ */
726
+ get externshipDemoAccessActive(): UserDTO['externshipDemoAccessActive'];
727
+ /**
728
+ * Экстернат ждёт оплаты: когда закроется доступ и по какому договору.
729
+ *
730
+ * @returns Объект с датой и id договора либо `null`, если долга нет.
731
+ */
732
+ get externshipPaymentRequired(): UserDTO['externshipPaymentRequired'];
733
+ /**
734
+ * Показывать промо-шапку экстерната.
735
+ *
736
+ * @returns `true`, если показывать.
737
+ */
738
+ get externshipPromoHeaderOn(): UserDTO['externshipPromoHeaderOn'];
739
+ /**
740
+ * Доступен раздел прогресса подготовки к экзаменам.
741
+ *
742
+ * @returns `true`, если доступен.
743
+ */
744
+ get hasExamProgressAccess(): UserDTO['hasExamProgressAccess'];
745
+ /**
746
+ * Доступны итоги года; их адрес — `recapUuid`.
747
+ *
748
+ * @returns `true`, если доступны.
749
+ */
750
+ get hasYearlyRecapAccess(): UserDTO['hasYearlyRecapAccess'];
751
+ /**
752
+ * Управляет аттестационной школой.
753
+ *
754
+ * @returns `true`, `false` либо `null`, если бэкенд не считал.
755
+ */
756
+ get isAttestationSchoolManager(): UserDTO['isAttestationSchoolManager'];
757
+ /**
758
+ * Посетитель — наставник.
759
+ *
760
+ * @returns `true`, если наставник.
761
+ */
762
+ get isMentor(): UserDTO['isMentor'];
763
+ /**
764
+ * Доступна серия ежедневных занятий с опытом (XP-стрик).
765
+ *
766
+ * @returns `true`, если доступна.
767
+ */
768
+ get isXpStreakAvailable(): UserDTO['isXpStreakAvailable'];
769
+ /**
770
+ * Таблица лидеров: доступна ли посетителю и готов ли он к ней (выбор курса).
771
+ *
772
+ * @returns Объект состояний либо `null`, если посетитель вне программы.
773
+ */
774
+ get leaderboard(): UserDTO['leaderboard'];
775
+ /**
776
+ * Состояние доступа к таблице лидеров.
777
+ *
778
+ * @returns `unavailable`, `available`, `vacation` либо `disabled`.
779
+ */
780
+ get leaderboardAccessState(): UserDTO['leaderboardAccessState'];
781
+ /**
782
+ * Как устроены учебные цели у посетителя.
783
+ *
784
+ * @returns `enabled`, `disabled`, `optional` либо `required`.
785
+ */
786
+ get learningGoalsAccessState(): UserDTO['learningGoalsAccessState'];
787
+ /**
788
+ * Мессенджеры, на которые посетитель подписан на уведомления.
789
+ *
790
+ * @returns Список либо `null`, если бэкенд не считал.
791
+ */
792
+ get messengerSubscriptions(): UserDTO['messengerSubscriptions'];
793
+ /**
794
+ * Пора предлагать продление занятий с репетитором.
795
+ *
796
+ * @returns `true`, если пора.
797
+ */
798
+ get needToPromoteRenewalWithCoach(): UserDTO['needToPromoteRenewalWithCoach'];
799
+ /**
800
+ * Показывать баннер курсов следующего учебного года.
801
+ *
802
+ * @returns `true`, если показывать.
803
+ */
804
+ get nextYearCoursesBannerAvailable(): UserDTO['nextYearCoursesBannerAvailable'];
805
+ /**
806
+ * Пароль задан — вход не только через код или соцсеть.
807
+ *
808
+ * @returns `true`, `false` либо `null`, если бэкенд не считал.
809
+ */
810
+ get passwordSet(): UserDTO['passwordSet'];
811
+ /**
812
+ * Реферальный код для программы «приведи друга».
813
+ *
814
+ * @returns Строка либо `null`, если код не выдан.
815
+ */
816
+ get referralCode(): UserDTO['referralCode'];
817
+ /**
818
+ * Доступен онбординг целевых действий.
819
+ *
820
+ * @returns `true`, если доступен.
821
+ */
822
+ get targetActionsOnboardingAvailable(): UserDTO['targetActionsOnboardingAvailable'];
823
+ /**
824
+ * Идёт ли сейчас окно пролонгации договора домашней школы.
825
+ *
826
+ * Границы включаются: последний день окна ещё считается пролонгацией. Не заданная граница
827
+ * означает, что окна нет вовсе, а не что оно бесконечно.
828
+ *
829
+ * @returns `true`, если сегодня внутри окна включительно
830
+ */
831
+ isProlongationBetweenDates(): boolean;
832
+ /**
833
+ * Глубокое клонирование объекта с защитой от циклических ссылок
834
+ * @private
835
+ * @param obj - объект для клонирования
836
+ * @param hash - WeakMap для отслеживания уже клонированных объектов
837
+ * @returns клонированный объект
838
+ */
839
+ private static deepClone;
840
+ /**
841
+ * Гость — сущность с умолчаниями всех полей и признаком `isDefaultUser()`.
842
+ *
843
+ * @returns Новая сущность на каждый вызов: умолчания общие на процесс, копия своя.
844
+ */
845
+ static createDefault(): User;
846
+ /**
847
+ * Форма посетителя по умолчанию ДАННЫМИ — гость со всеми полями: тому, кто отдаёт `UserDTO`
848
+ * наружу (хост — приложениям), нужна полная форма, а не сущность с методами. Своя копия на
849
+ * вызов: умолчания общие на процесс, и правка чужой копии их не тронет.
850
+ *
851
+ * @returns Новая копия умолчаний на каждый вызов
852
+ */
853
+ static defaultDto(): UserDTO;
854
+ /**
855
+ * Санитизирует строку: удаляет null-байты и обрезает пробелы
856
+ * @private
857
+ * @param str - исходная строка
858
+ * @returns санитизированная строка
859
+ */
860
+ private static sanitizeString;
861
+ /**
862
+ * Сущность из профиля бэкенда (`UserDTO` в camelCase): строковые поля чистятся от null-байтов
863
+ * и пробелов по краям, остальное берётся как есть.
864
+ *
865
+ * @param input - Профиль в форме `UserDTO`
866
+ * @returns Сущность над копией профиля: исходный объект не трогается
867
+ */
868
+ static fromApi(input: unknown): User;
869
+ /**
870
+ * Санитизирует данные пользователя
871
+ * @private
872
+ * @param data - исходные данные
873
+ * @returns санитизированные данные
874
+ */
875
+ private static sanitizeUserData;
876
+ /**
877
+ * Сущность собрана из умолчаний (`createDefault`), а не из профиля бэкенда.
878
+ *
879
+ * @returns `true` у гостя по умолчанию
880
+ */
881
+ isDefaultUser(): boolean;
882
+ /**
883
+ * Посетитель вошёл — у него есть идентификатор на бэкенде.
884
+ *
885
+ * @returns `true`, если `id` задан и положителен
886
+ */
887
+ isLoggedIn(): boolean;
888
+ private static getGradeString;
889
+ /**
890
+ * Роль либо класс словом — для подписи в интерфейсе.
891
+ *
892
+ * @returns «Дошкольник» для нулевого класса, «Выпускник» без класса, иначе класс («5 класс»)
893
+ */
894
+ getPupilRole(): UserRole;
895
+ /**
896
+ * Роль словом — по флагам профиля, первый совпавший: репетитор, учитель, родитель.
897
+ *
898
+ * @returns «Репетитор», «Учитель», «Родитель», иначе роль ученика из `getPupilRole()`
899
+ */
900
+ getRole: () => UserRole;
901
+ /**
902
+ * Фамилия с инициалами имени и отчества — подпись в списках.
903
+ *
904
+ * @returns Строка вида «Пупкин В. И.»; без отчества — «Пупкин В.»
905
+ */
906
+ getInitials: () => string;
907
+ /**
908
+ * Профиль строкой JSON — для печати в документ и передачи по сети.
909
+ *
910
+ * @returns JSON полей сущности
911
+ */
912
+ toJson(): string;
913
+ /**
914
+ * Посетитель данными — то, что едет по сети и в состояние: сущность с методами не
915
+ * сериализуется. Своя копия на вызов: сущность неизменяема, и правка копии её не тронет.
916
+ *
917
+ * @returns Копия полей сущности данными
918
+ */
919
+ toDto(): UserDTO;
920
+ }
921
+
922
+ type AppOptions = {
923
+ activePromoBanner?: number;
924
+ captcha?: {
925
+ provider: 'recaptcha';
926
+ siteKey: string;
927
+ };
928
+ contactPhoneNumber: null | string;
929
+ currency: {
930
+ code: 'RUB';
931
+ exchangeRate: number;
932
+ };
933
+ currentSchoolYear: null | {
934
+ current: boolean;
935
+ id: number;
936
+ startsFrom: number;
937
+ translit: string;
938
+ };
939
+ experiments?: Array<{
940
+ name: string;
941
+ value: string;
942
+ }>;
943
+ externalReviews?: {
944
+ pageAvailable: boolean;
945
+ };
946
+ featureFlags?: Array<string>;
947
+ feedbackThemes?: {
948
+ foxford: {
949
+ tasks: number;
950
+ };
951
+ };
952
+ flash: {
953
+ alert?: string;
954
+ notice?: string;
955
+ warning?: string;
956
+ };
957
+ nextSchoolYearProductsExists: boolean;
958
+ paymentMethods?: {
959
+ another?: string;
960
+ cardPayment?: 'Yandex';
961
+ creditExternshipPayment?: 'TinkoffCredit';
962
+ creditPayment?: 'Sberbank' | 'Yandex';
963
+ internationalCardPayment?: 'Payture' | 'Payanyway';
964
+ splitPayment?: 'YandexPay';
965
+ platiChastyamiPayment?: 'PlatiChastyami';
966
+ sberPayPayment?: 'SberbankEcommerce';
967
+ sberSpasiboPayment?: 'SberbankEcommerce';
968
+ sbpPayment?: 'Yandex';
969
+ };
970
+ phoneConfirmationType: 'sms' | 'phone_call' | 'cascade_by_call' | 'telegram_cascade';
971
+ popupAlerts?: number[];
972
+ prerender?: boolean;
973
+ requestMetaTags?: boolean;
974
+ rootMenuItems: Array<{
975
+ contextOfUse?: 'externat' | 'media' | 'portal';
976
+ id: number;
977
+ title: string;
978
+ url: string;
979
+ }>;
980
+ sentry?: {
981
+ dsn: string;
982
+ };
983
+ showPromoBanners: string[];
984
+ user?: UserDTO;
985
+ userIdentity?: string;
986
+ webSocketNotifications?: {
987
+ clientConnection: null | Array<{
988
+ endpoint: string;
989
+ transport: 'websocket' | 'http_stream' | 'sse' | 'sockjs' | 'webtransport';
990
+ }>;
991
+ token: string;
992
+ };
993
+ contacts: {
994
+ email: null | string;
995
+ phone: null | string;
996
+ telegram: null | string;
997
+ vkontakte: null | string;
998
+ whatsapp: null | string;
999
+ };
1000
+ };
1001
+ declare class AppOptionsService {
1002
+ private api;
1003
+ private readonly eventName;
1004
+ private appOptions;
1005
+ constructor(apiInstance: ApiInstance, eventName: string);
1006
+ getCurrentAppOptions(): Promise<AppOptions>;
1007
+ /**
1008
+ * Get app options data from api
1009
+ */
1010
+ getAppOptions(): Promise<AppOptions>;
1011
+ }
1012
+
1013
+ declare class CartService {
1014
+ private api;
1015
+ constructor(apiInstance: ApiInstance);
1016
+ createCartItem(id: number, type: CartItemResourceType): CartItemDTO;
1017
+ addCartItemToCart(cartItem: CartItemDTO): Promise<unknown>;
1018
+ }
1019
+
1020
+ declare class CourseService {
1021
+ private api;
1022
+ constructor(apiInstance: ApiInstance);
1023
+ getCourse(id: number): Promise<Course>;
1024
+ enrollCourse(id: number): Promise<void>;
1025
+ }
1026
+
1027
+ type LeadRequestPayload = {
1028
+ email?: string | null;
1029
+ phone?: string | null;
1030
+ school_id?: number | null;
1031
+ contract_id?: number | null;
1032
+ referrer?: string | null;
1033
+ subscription_external?: 'true' | 'false' | null;
1034
+ user_type?: 'pupil' | 'agent' | 'parent' | null;
1035
+ agent_id?: number | null;
1036
+ agreement?: boolean | null;
1037
+ code?: string | null;
1038
+ communication_method?: 'phone' | 'email' | 'whatsapp' | null;
1039
+ course_name?: string | null;
1040
+ discipline_id?: number | null;
1041
+ free_intro_lesson_group_id?: number | null;
1042
+ free_intro_lesson_mini_group_id?: number | null;
1043
+ grade_id?: number | null;
1044
+ group_template_ids?: Array<number> | null;
1045
+ id?: string | null;
1046
+ interests?: Array<string> | null;
1047
+ level_id?: any | null;
1048
+ name?: string | null;
1049
+ parent_phone?: string | null;
1050
+ phone_number?: string | null;
1051
+ placement?: string | null;
1052
+ product_id?: number | null;
1053
+ product_pack_id?: string | null;
1054
+ product_type?: any | null;
1055
+ source?: string | null;
1056
+ school_entry_year?: number | null;
1057
+ total_balance?: number | null;
1058
+ user_id?: number | null;
1059
+ user_phone_number?: string | null;
1060
+ utm_campaign?: string | null;
1061
+ utm_medium?: string | null;
1062
+ utm_source?: string | null;
1063
+ utm_term?: string | null;
1064
+ };
1065
+ interface LeadRequest extends LeadRequestPayload {
1066
+ type: LeadRequestType;
1067
+ agreement?: boolean;
1068
+ context: 'rep_change_tariff' | 'split_balance' | 'demo_order' | string;
1069
+ }
1070
+ interface LeadRequestApiResponse {
1071
+ id: string;
1072
+ newUser: boolean;
1073
+ }
1074
+ interface LeadRequestResponse {
1075
+ leadRequest: LeadRequest;
1076
+ response: LeadRequestApiResponse;
1077
+ }
1078
+ declare enum LeadRequestType {
1079
+ Algorithmics = "LeadRequests::Algorithmics",
1080
+ External = "LeadRequests::External",
1081
+ Callback = "LeadRequests::Callback",
1082
+ Basic = "LeadRequests::Basic",
1083
+ Main = "LeadRequests::Main",
1084
+ Coach = "LeadRequests::Coach",
1085
+ Media = "LeadRequests::Media",
1086
+ MiniGroup = "LeadRequests::MiniGroup",
1087
+ Externship = "LeadRequests::Externship",
1088
+ CoachUserCoursePlanUpgradeCallback = "LeadRequests::CoachUserCoursePlanUpgradeCallback",
1089
+ ParentCallback = "LeadRequests::ParentCallback",
1090
+ TeacherCallback = "LeadRequests::TeacherCallback",
1091
+ Email = "LeadRequests::EmailSubscription",
1092
+ IThubLead = "LeadRequests::IThubLead"
1093
+ }
1094
+ declare class LeadRequestService {
1095
+ private api;
1096
+ types: typeof LeadRequestType;
1097
+ constructor(apiInstance: ApiInstance);
1098
+ /**
1099
+ * Create lead request
1100
+ * @param {LeadRequestType} type
1101
+ * @param {LeadRequest['context']} context
1102
+ * @param {LeadRequestPayload} data
1103
+ */
1104
+ createLeadRequest(type: LeadRequestType, context: LeadRequest['context'], data?: LeadRequestPayload): LeadRequest;
1105
+ /**
1106
+ * Send lead request with specific data
1107
+ * @param {LeadRequest} leadRequest
1108
+ */
1109
+ send(leadRequest: LeadRequest): Promise<LeadRequestResponse>;
1110
+ /**
1111
+ * Update lead request with specific data
1112
+ * @param {string} id
1113
+ * @param {LeadRequestPayload} lrData
1114
+ */
1115
+ update(id: string, lrData?: Partial<LeadRequest>): Promise<unknown>;
1116
+ }
1117
+
1118
+ declare class ProductPackService {
1119
+ private api;
1120
+ constructor(apiInstance: ApiInstance);
1121
+ getProductPack(id: number): Promise<ProductPack>;
1122
+ }
1123
+
1124
+ declare class PromoService {
1125
+ private api;
1126
+ constructor(apiInstance: ApiInstance);
1127
+ checkPromocode(code: string): Promise<unknown>;
1128
+ /**
1129
+ * Send data if user saw the promo code
1130
+ * @param {string} promoCode
1131
+ * @returns {Promise}
1132
+ */
1133
+ trackCodeCampaign(promoCode: string): Promise<void>;
1134
+ }
1135
+
1136
+ declare class TagService {
1137
+ private api;
1138
+ constructor(apiInstance: ApiInstance);
1139
+ addTag(id: number): Promise<unknown>;
1140
+ }
1141
+
1142
+ declare class UserService {
1143
+ private api;
1144
+ private appOptionsService;
1145
+ constructor(apiInstance: ApiInstance, appOptionsService: AppOptionsService);
1146
+ /**
1147
+ * Create user instance
1148
+ * @param {UserDTO} data data of user
1149
+ */
1150
+ static createUser(data: UserDTO): User;
1151
+ /**
1152
+ * Create default user
1153
+ * @returns {User}
1154
+ */
1155
+ static createDefaultUser(): User;
1156
+ /**
1157
+ * Get current user data
1158
+ * @return {Promise} Server response with user data
1159
+ */
1160
+ getUser(): Promise<User>;
1161
+ /**
1162
+ * Логин или регистрация юзера по email
1163
+ * @param email email юзера
1164
+ * @param password пароль
1165
+ * @returns {Promise<{ user: User; result: LoginOrRegistrationResponse }>}
1166
+ */
1167
+ loginByEmail(email: string, password: string): Promise<{
1168
+ user: User;
1169
+ result: LoginOrRegistrationResponse;
1170
+ }>;
1171
+ /**
1172
+ * Запрос кода на подтвеждение телефона
1173
+ */
1174
+ getConfirmationCode(phone: string): Promise<ApiResponse<{
1175
+ nextDeliveryAt: string;
1176
+ }>>;
1177
+ /**
1178
+ * Логин или регистрация юзера по телефону
1179
+ * @param phone номер телефона
1180
+ * @param params
1181
+ * @returns {Promise<{ user: User; result: LoginOrRegistrationResponse }>}
1182
+ */
1183
+ loginByPhone(phone: string, params: LoginByPhoneParams): Promise<any>;
1184
+ /**
1185
+ * Получение покупок текущего пользователя
1186
+ * @param {Number} params.resourceId Resource ID
1187
+ * @param {String} params.resourceType Resource type
1188
+ * @return {Promise} Server response with user purchases
1189
+ */
1190
+ purchases({ resourceId, resourceType }: {
1191
+ resourceId: number;
1192
+ resourceType: string;
1193
+ }): Promise<unknown>;
1194
+ /**
1195
+ * Навигация на страницу входа и перенаправление на указанный путь после успешного входа.
1196
+ * @param {String} options.redirectUrl URL для редиректа.
1197
+ */
1198
+ signIn({ redirectUrl }: {
1199
+ redirectUrl?: string;
1200
+ }): void;
1201
+ /**
1202
+ * Выход из аккаунта с перезагрузкой страницы
1203
+ */
1204
+ signOut(reloadAfter?: boolean): Promise<unknown>;
1205
+ pushEvent(event: {
1206
+ action: 'experiment' | 'funnel' | 'conversion' | 'click';
1207
+ label: string;
1208
+ }): Promise<void>;
1209
+ /**
1210
+ * Установить подписку пользователю
1211
+ * @param {CommunicationSubscriptions} subscriptions пользовательские подписки
1212
+ */
1213
+ setSubscriptions(subscriptions: CommunicationSubscriptions): Promise<void>;
1214
+ /**
1215
+ * Получение интересов пользователя
1216
+ */
1217
+ getUserInterests(): Promise<UserInterests>;
1218
+ /**
1219
+ * Обновление интересов пользователя
1220
+ * @param {Partial<UserInterests>} data интересы пользователя
1221
+ */
1222
+ updateUserInterests(data: Partial<UserInterests>): Promise<void>;
1223
+ /**
1224
+ * Обновления множества интересов пользователя
1225
+ * @param {Partial<UserInterests>} data интересы пользователя
1226
+ */
1227
+ updateMultipleUserInterests(data: Partial<UserInterests>[]): Promise<void>;
1228
+ }
1229
+
1230
+ declare class Foxford {
1231
+ foxApi: ReturnType<typeof ApiService.createFoxApiInstance>;
1232
+ api: ReturnType<typeof ApiService.createApiInstance>;
1233
+ staticApi: ReturnType<typeof ApiService.createStaticApiInstance>;
1234
+ user: UserService;
1235
+ tag: TagService;
1236
+ cart: CartService;
1237
+ promo: PromoService;
1238
+ course: CourseService;
1239
+ productPack: ProductPackService;
1240
+ leadrequest: LeadRequestService;
1241
+ widgets: Widgets;
1242
+ appOptions: AppOptionsService;
1243
+ captcha: CaptchaService;
1244
+ private readonly config;
1245
+ static events: {
1246
+ readonly FETCH_APP_OPTIONS: "Foxford.app_options.fetch";
1247
+ readonly LR_REGISTRATION_SET: "LeadRequest.registration.set";
1248
+ };
1249
+ static DEFAULT_CONFIG: FoxfordConfig;
1250
+ constructor(config?: FoxfordConfig);
1251
+ private buildFoxApi;
1252
+ /**
1253
+ * Get short link
1254
+ * @param {string} url link for shortening
1255
+ */
1256
+ shortURL(url: string): Promise<ApiResponse<unknown>>;
1257
+ /**
1258
+ * Applies and throwing itself into plugin for access to Api
1259
+ * @param {SdkPlugin} plugin Plugin to apply
1260
+ */
1261
+ applyPlugin(plugin: SdkPlugin): void;
1262
+ }
1263
+
1264
+ interface SdkPlugin {
1265
+ apply(sdk: Foxford): void;
1266
+ destroy(): void;
1267
+ }
1268
+
1269
+ export type { SdkPlugin as S };