@foxford/sdk 8.0.1 → 8.1.0

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/index.d.cts CHANGED
@@ -1,9 +1,189 @@
1
1
  import { ApiInstance, ApiConfig, CaptchaConfig, ApiResponse, ApiService, CaptchaService } from '@foxford/services';
2
2
  export { ApiAdapter, ApiBasicCredentials, ApiConfig, ApiError, ApiErrorExtended, ApiInstance, ApiInterceptorManager, ApiMethod, ApiPromise, ApiProxyConfig, ApiRequestConfig, ApiRequestConfigExtended, ApiResponse, ApiResponseType, ApiRetryConfig, ApiService, ApiServiceInterface, ApiStatic, ApiTransformer, Cancel, CancelStatic, CancelToken, CancelTokenSource, CancelTokenStatic, Canceler, CaptchaError, CaptchaService, RequestPlugin, RequestPluginInterface, ResponseError, ResponseFailPlugin, ResponseSuccessPlugin, ResponseSuccessPluginInterface } from '@foxford/services';
3
- import { CartItemResourceType, BusinessUnitAbbreviation, Course } from '@foxford/types';
3
+ import { BusinessUnitAbbreviation, CartItemResourceType, Course } from '@foxford/types';
4
+
5
+ interface FoxfordAntibotConfig {
6
+ antibotFrameSrc?: string;
7
+ antibotOnload?: (e: Event) => void;
8
+ antibotOnerror?: () => void;
9
+ debug?: boolean;
10
+ }
11
+ declare class FoxfordAntibot {
12
+ private config;
13
+ static FOXFORD_ANTIBOT_URL: string;
14
+ static DEFAULT_CONFIG: {
15
+ antibotFrameSrc: string;
16
+ };
17
+ static FRAME_CLASSNAME: string;
18
+ constructor(config?: FoxfordAntibotConfig);
19
+ private static antibotIsInitialized;
20
+ private static createFrame;
21
+ createAntibotFrame: (params: {
22
+ src: string;
23
+ onload?: (_e: Event) => void;
24
+ onerror?: () => void;
25
+ }) => void;
26
+ }
27
+
28
+ type Widget = {
29
+ name: 'menu' | 'reviews' | 'featuredCoaches' | 'coachEnrollment' | 'shortForm' | 'userTypePrompt' | 'teachersSlider' | 'externshipFormats';
30
+ options: Record<string, any>;
31
+ container?: HTMLElement;
32
+ };
33
+ type WidgetsInitConfig = {
34
+ version?: 'latest' | string;
35
+ locale?: 'ru';
36
+ };
37
+ interface WidgetsConfig extends WidgetsInitConfig {
38
+ analyticContext?: {
39
+ prefix: string;
40
+ module: string;
41
+ payload?: Record<any, any>;
42
+ };
43
+ rootColors?: boolean;
44
+ loadFonts?: boolean;
45
+ widgets: Array<Widget>;
46
+ }
47
+ declare class Widgets {
48
+ private config;
49
+ private api;
50
+ private manifest;
51
+ static ENTRY: string[];
52
+ static DEFAULT_CONFIG: WidgetsInitConfig;
53
+ constructor(config: WidgetsInitConfig | undefined, apiInstance: ApiInstance);
54
+ create(config: WidgetsConfig): Promise<void>;
55
+ update(name: string, config: Widget): Promise<void>;
56
+ private loadManifest;
57
+ static appendScript(src: string): Promise<unknown>;
58
+ private loadAssets;
59
+ }
60
+
61
+ type ProductTypeItem = {
62
+ type: string;
63
+ id: number;
64
+ description: string;
65
+ title: string;
66
+ discipline: {
67
+ id: number;
68
+ name: string;
69
+ };
70
+ teacher: {
71
+ id: number;
72
+ long_name: string;
73
+ description: string;
74
+ experience: number;
75
+ photo_url: string;
76
+ photo_large_url: string;
77
+ };
78
+ levels: Array<{
79
+ id: number;
80
+ name: string;
81
+ }>;
82
+ };
83
+ type ProductPack = {
84
+ name: string;
85
+ description: string;
86
+ meta_title: string;
87
+ meta_description: string;
88
+ published: true;
89
+ content_description: string;
90
+ disciplines_scope: string;
91
+ guaranteed_admission: true;
92
+ grade_names: string;
93
+ is_purchased: false;
94
+ learning_flow: {
95
+ title: string;
96
+ steps: Array<{
97
+ header: string;
98
+ description: string;
99
+ }>;
100
+ };
101
+ offers: {
102
+ intro: string;
103
+ items: Array<{
104
+ title: string;
105
+ description: string;
106
+ }>;
107
+ };
108
+ price_block: {
109
+ price: number;
110
+ initial_price: number;
111
+ title: string;
112
+ description: string;
113
+ points: Array<string>;
114
+ price_per_month: number;
115
+ initial_price_per_month: number;
116
+ };
117
+ product_pack_items: Array<ProductTypeItem>;
118
+ faq_items: Array<{
119
+ question: string;
120
+ answer: string;
121
+ }>;
122
+ landing_image_urls: Array<string>;
123
+ };
124
+ interface CartItemDTO {
125
+ cart_item_type: CartItemResourceType;
126
+ resource_id: number;
127
+ }
128
+ type FoxfordConfig = {
129
+ host?: string;
130
+ /** @deprecated */
131
+ widgetsVersion?: 'latest' | string;
132
+ antibot?: boolean;
133
+ antibotConfig?: FoxfordAntibotConfig;
134
+ api?: ApiConfig;
135
+ captchaConfig?: () => CaptchaConfig;
136
+ /** @deprecated Не используйте инициализацию виджетов через SDK */
137
+ widgetsConfig?: WidgetsInitConfig;
138
+ };
139
+ 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';
140
+ type ProductFormats = 'coach_course' | 'course' | 'event' | 'exam_rehearsal' | 'externship' | 'game' | 'interactive_trainings' | 'mini_group' | 'olympiad' | 'product_pack' | 'teacher_course' | 'trainings';
141
+ type UserInterests = {
142
+ businessUnitAbbrs?: BusinessUnitAbbreviation[] | null;
143
+ disciplineId?: number | number[] | null;
144
+ gradeId?: number | number[] | null;
145
+ levelId?: number | number[] | null;
146
+ productId?: number | null;
147
+ productFormat?: ProductFormats | null;
148
+ reason?: Reasons | null;
149
+ };
150
+ interface CommunicationSubscriptions {
151
+ subscriptionNews?: boolean;
152
+ subscriptionMaterials?: boolean;
153
+ subscriptionEvents?: boolean;
154
+ subscriptionPromos?: boolean;
155
+ subscriptionReminders?: boolean;
156
+ subscriptionMedia?: boolean;
157
+ subscriptionExternship?: boolean;
158
+ subscriptionExternal?: boolean;
159
+ }
160
+ interface LoginByPhoneParams {
161
+ onEmailRequest: (phoneCheckResponse: {
162
+ email?: string;
163
+ fakeEmail?: boolean;
164
+ state: 'new' | 'confirmed' | 'not_confirmed';
165
+ }) => Promise<string>;
166
+ onCodeRequest: () => Promise<string>;
167
+ onNameRequest: () => Promise<{
168
+ first_name: string;
169
+ last_name: string;
170
+ }>;
171
+ onConfirmationCodeResponse: (confirmationCodeResponse: {
172
+ nextDeliveryAt: string;
173
+ }) => void;
174
+ onConfirmationCodeError: (error: Error) => void;
175
+ }
176
+ interface LoginOrRegistrationResponse {
177
+ redirectUrl?: string;
178
+ registered?: boolean;
179
+ type?: string;
180
+ }
4
181
 
5
182
  type PupilRole = '11 класс' | '10 класс' | '9 класс' | '8 класс' | '7 класс' | '6 класс' | '5 класс' | '4 класс' | '3 класс' | '2 класс' | '1 класс';
6
183
  type UserRole = 'Ученик' | 'Репетитор' | 'Учитель' | 'Родитель' | 'Выпускник' | 'Дошкольник' | PupilRole;
184
+ type LeaderboardAccessState = 'unavailable' | 'available' | 'vacation' | 'disabled';
185
+ type LeaderboardReadinessState = 'changeable_course_selection' | 'ready' | 'unready' | 'waiting_course_selection';
186
+ type LearningGoalsAccessState = 'enabled' | 'disabled' | 'optional' | 'required';
7
187
  interface UserDTO {
8
188
  id: null | number;
9
189
  email: string;
@@ -114,79 +294,556 @@ interface UserDTO {
114
294
  startsAt: null | string;
115
295
  yearName: string;
116
296
  } | null;
297
+ /** Текущий интерес посетителя — та же форма, что у `GET /api/user/user_interest`, но из профиля. */
298
+ currentInterest: UserInterests | null;
299
+ /** До какой даты открыт приём в домашнюю школу. */
300
+ admissionFinishesOn: null | string;
301
+ /** Посетитель пришёл из Алгоритмики. */
302
+ algoritmika: boolean;
303
+ bonusesPageVisited: boolean;
304
+ canChangeSchoolInfo: boolean;
305
+ externshipDemoAccessActive: boolean;
306
+ /** Экстернат ждёт оплаты: когда закроется доступ и по какому договору. */
307
+ externshipPaymentRequired: {
308
+ accessClosingDate: string;
309
+ contractId: number;
310
+ } | null;
311
+ externshipPromoHeaderOn: boolean;
312
+ hasExamProgressAccess: boolean;
313
+ hasYearlyRecapAccess: boolean;
314
+ isAttestationSchoolManager: null | boolean;
315
+ isMentor: boolean;
316
+ isXpStreakAvailable: boolean;
317
+ leaderboard: {
318
+ accessState: LeaderboardAccessState;
319
+ readinessState: LeaderboardReadinessState;
320
+ } | null;
321
+ leaderboardAccessState: LeaderboardAccessState;
322
+ learningGoalsAccessState: LearningGoalsAccessState;
323
+ /** Мессенджеры, на которые подписан посетитель; `null` — бэкенд не считал. */
324
+ messengerSubscriptions: null | string[];
325
+ needToPromoteRenewalWithCoach: boolean;
326
+ nextYearCoursesBannerAvailable: boolean;
327
+ passwordSet: null | boolean;
328
+ referralCode: null | string;
329
+ targetActionsOnboardingAvailable: boolean;
117
330
  }
118
331
 
119
332
  declare class User {
120
333
  private readonly props;
121
334
  private readonly isDefault;
122
335
  private constructor();
336
+ /**
337
+ * Идентификатор посетителя на бэкенде.
338
+ *
339
+ * @returns Число либо `null` у гостя.
340
+ */
123
341
  get id(): UserDTO['id'];
342
+ /**
343
+ * Почта посетителя.
344
+ *
345
+ * @returns Строка; пустая, если почты нет.
346
+ */
124
347
  get email(): UserDTO['email'];
348
+ /**
349
+ * Имя.
350
+ *
351
+ * @returns Строка; пустая, если не заполнено.
352
+ */
125
353
  get firstName(): UserDTO['firstName'];
354
+ /**
355
+ * Отчество.
356
+ *
357
+ * @returns Строка; пустая, если не заполнено.
358
+ */
126
359
  get middleName(): UserDTO['middleName'];
360
+ /**
361
+ * Фамилия.
362
+ *
363
+ * @returns Строка; пустая, если не заполнено.
364
+ */
127
365
  get lastName(): UserDTO['lastName'];
366
+ /**
367
+ * Полное имя, каким его собрал бэкенд.
368
+ *
369
+ * @returns Строка; пустая у гостя.
370
+ */
128
371
  get fullName(): UserDTO['fullName'];
372
+ /**
373
+ * Короткое имя для обращения в интерфейсе.
374
+ *
375
+ * @returns Строка; пустая у гостя.
376
+ */
129
377
  get shortName(): UserDTO['shortName'];
378
+ /**
379
+ * Когда заведён профиль.
380
+ *
381
+ * @returns Дата ISO либо `null` у гостя.
382
+ */
130
383
  get createdAt(): UserDTO['createdAt'];
384
+ /**
385
+ * Часовой пояс посетителя.
386
+ *
387
+ * @returns Имя пояса либо `null`, если не задан.
388
+ */
131
389
  get timezone(): UserDTO['timezone'];
390
+ /**
391
+ * Локаль интерфейса.
392
+ *
393
+ * @returns Код локали либо `null`, если не задана.
394
+ */
132
395
  get locale(): UserDTO['locale'];
396
+ /**
397
+ * Класс посетителя: id, порядковый номер, имя и транслит.
398
+ *
399
+ * @returns Объект класса; у гостя поля `null` и пустые строки.
400
+ */
133
401
  get grade(): UserDTO['grade'];
402
+ /**
403
+ * Телефон посетителя.
404
+ *
405
+ * @returns Строка либо `null`, если не указан.
406
+ */
134
407
  get phone(): UserDTO['phone'];
408
+ /**
409
+ * Адрес аватара.
410
+ *
411
+ * @returns Строка; пустая, если аватара нет.
412
+ */
135
413
  get avatarUrl(): UserDTO['avatarUrl'];
414
+ /**
415
+ * Посетитель — родитель.
416
+ *
417
+ * @returns `true`, если роль родительская.
418
+ */
136
419
  get isParent(): UserDTO['isParent'];
420
+ /**
421
+ * Посетитель — выпускник.
422
+ *
423
+ * @returns `true`, если школу закончил.
424
+ */
137
425
  get isGraduated(): UserDTO['isGraduated'];
426
+ /**
427
+ * Класс подтверждён посетителем.
428
+ *
429
+ * @returns `true`, если класс проверен.
430
+ */
138
431
  get gradeChecked(): UserDTO['gradeChecked'];
432
+ /**
433
+ * Тип учётной записи на бэкенде.
434
+ *
435
+ * @returns `pupil`, `agent` либо `null` у гостя.
436
+ */
139
437
  get type(): UserDTO['type'];
438
+ /**
439
+ * Посетитель — репетитор.
440
+ *
441
+ * @returns `true`, если роль репетитора.
442
+ */
140
443
  get isCoach(): UserDTO['isCoach'];
444
+ /**
445
+ * Ведёт мини-группы.
446
+ *
447
+ * @returns `true`, если ведёт.
448
+ */
141
449
  get isMiniGroupTeacher(): UserDTO['isMiniGroupTeacher'];
450
+ /**
451
+ * Репетитор экстерната.
452
+ *
453
+ * @returns `true`, если ведёт экстернат.
454
+ */
142
455
  get isExternshipCoach(): UserDTO['isExternshipCoach'];
456
+ /**
457
+ * Посетитель — учитель.
458
+ *
459
+ * @returns `true`, если роль учителя.
460
+ */
143
461
  get isAgent(): UserDTO['isAgent'];
462
+ /**
463
+ * Посетитель — методист.
464
+ *
465
+ * @returns `true`, если методист.
466
+ */
144
467
  get methodist(): UserDTO['methodist'];
468
+ /**
469
+ * Почтовый адрес: страна, регион, город, улица, дом.
470
+ *
471
+ * @returns Объект адреса либо `null`, если не заполнен.
472
+ */
145
473
  get address(): UserDTO['address'];
474
+ /**
475
+ * Привязанные соцсети.
476
+ *
477
+ * @returns Список провайдеров с идентификаторами; пустой, если привязок нет.
478
+ */
146
479
  get socialNets(): UserDTO['socialNets'];
480
+ /**
481
+ * Логин в Skype.
482
+ *
483
+ * @returns Строка либо `null`.
484
+ */
147
485
  get skype(): UserDTO['skype'];
486
+ /**
487
+ * Настройки интерфейса: показанные подсказки и скрытые баннеры.
488
+ *
489
+ * @returns Объект флагов либо `undefined`, если бэкенд их не прислал.
490
+ */
148
491
  get settings(): UserDTO['settings'];
492
+ /**
493
+ * Бонусный счёт: подарочные и реальные бонусы.
494
+ *
495
+ * @returns Объект с суммами.
496
+ */
149
497
  get bonus(): UserDTO['bonus'];
498
+ /**
499
+ * Сумма бонусов на счёте.
500
+ *
501
+ * @returns Число.
502
+ */
150
503
  get bonusAmount(): UserDTO['bonusAmount'];
504
+ /**
505
+ * Есть действующие покупки.
506
+ *
507
+ * @returns `true`, если есть.
508
+ */
151
509
  get hasActivePurchases(): UserDTO['hasActivePurchases'];
510
+ /**
511
+ * Остались попытки пробных экзаменов.
512
+ *
513
+ * @returns `true`, если остались.
514
+ */
152
515
  get hasAttemptsSolveExamRehearsals(): UserDTO['hasAttemptsSolveExamRehearsals'];
516
+ /**
517
+ * Есть закладки.
518
+ *
519
+ * @returns `true`, если есть.
520
+ */
153
521
  get hasBookmarks(): UserDTO['hasBookmarks'];
522
+ /**
523
+ * Метки посетителя на бэкенде.
524
+ *
525
+ * @returns Список строк либо `null`.
526
+ */
154
527
  get tags(): UserDTO['tags'];
528
+ /**
529
+ * Шаблон корзины.
530
+ *
531
+ * @returns Число либо `null`.
532
+ */
155
533
  get cartTemplateId(): UserDTO['cartTemplateId'];
534
+ /**
535
+ * Сколько позиций в корзине.
536
+ *
537
+ * @returns Число.
538
+ */
156
539
  get cartItemsCount(): UserDTO['cartItemsCount'];
540
+ /**
541
+ * Онбординг пройден.
542
+ *
543
+ * @returns `true`, если пройден.
544
+ */
157
545
  get onboardingFinished(): UserDTO['onboardingFinished'];
546
+ /**
547
+ * Когда пройден онбординг.
548
+ *
549
+ * @returns Дата ISO либо `null`, пока не пройден.
550
+ */
158
551
  get onboardingFinishedAt(): UserDTO['onboardingFinishedAt'];
552
+ /**
553
+ * Почта подтверждена.
554
+ *
555
+ * @returns `true`, если подтверждена.
556
+ */
159
557
  get emailConfirmed(): UserDTO['emailConfirmed'];
558
+ /**
559
+ * Телефон подтверждён.
560
+ *
561
+ * @returns `true`, если подтверждён.
562
+ */
160
563
  get phoneConfirmed(): UserDTO['phoneConfirmed'];
564
+ /**
565
+ * Почта выдумана бэкендом при регистрации без почты.
566
+ *
567
+ * @returns `true`, если почта ненастоящая.
568
+ */
161
569
  get fakeEmail(): UserDTO['fakeEmail'];
570
+ /**
571
+ * Посетитель заведён бэкендом без его участия (например, по заявке).
572
+ *
573
+ * @returns `true`, если учётная запись ненастоящая.
574
+ */
162
575
  get fakeUser(): UserDTO['fakeUser'];
576
+ /**
577
+ * Профиль дополнен данными после регистрации.
578
+ *
579
+ * @returns `true`, если дополнен.
580
+ */
163
581
  get profileEnriched(): UserDTO['profileEnriched'];
582
+ /**
583
+ * Идентификатор итогов года.
584
+ *
585
+ * @returns Строка либо `null`, если итогов нет.
586
+ */
164
587
  get recapUuid(): UserDTO['recapUuid'];
588
+ /**
589
+ * Дисциплины, которые изучает посетитель.
590
+ *
591
+ * @returns Список id; пустой, если не выбраны.
592
+ */
165
593
  get disciplineIds(): UserDTO['disciplineIds'];
594
+ /**
595
+ * Настройки приватности.
596
+ *
597
+ * @returns Объект с флагом публичного профиля.
598
+ */
166
599
  get privacy(): UserDTO['privacy'];
600
+ /**
601
+ * Телефон родителя.
602
+ *
603
+ * @returns Строка либо `null`.
604
+ */
167
605
  get parentPhone(): UserDTO['parentPhone'];
606
+ /**
607
+ * Телефон родителя подтверждён.
608
+ *
609
+ * @returns `true`, если подтверждён.
610
+ */
168
611
  get parentPhoneConfirmed(): UserDTO['parentPhoneConfirmed'];
612
+ /**
613
+ * Посетитель что-то покупал.
614
+ *
615
+ * @returns `true`, `false` либо `null`, если бэкенд не считал.
616
+ */
169
617
  get isCustomer(): UserDTO['isCustomer'];
618
+ /**
619
+ * Доступны многодневные серии занятий.
620
+ *
621
+ * @returns `true`, если доступны.
622
+ */
170
623
  get hasAccessToMultiDaysStreaks(): UserDTO['hasAccessToMultiDaysStreaks'];
624
+ /**
625
+ * Ученик начальной школы.
626
+ *
627
+ * @returns `true`, если начальная школа.
628
+ */
171
629
  get isElementaryPupil(): UserDTO['isElementaryPupil'];
630
+ /**
631
+ * Токен для канала уведомлений по WebSocket.
632
+ *
633
+ * @returns Строка либо `null`, если канала нет.
634
+ */
172
635
  get webSocketNotificationsJwt(): UserDTO['webSocketNotificationsJwt'];
636
+ /**
637
+ * Доступны аттестационные листы.
638
+ *
639
+ * @returns `true`, если доступны.
640
+ */
173
641
  get hasAccessToAttestationSheets(): UserDTO['hasAccessToAttestationSheets'];
642
+ /**
643
+ * Посетитель учится в экстернате.
644
+ *
645
+ * @returns `true`, если экстернат.
646
+ */
174
647
  get externshipUser(): UserDTO['externshipUser'];
648
+ /**
649
+ * Есть оплаченные договоры экстерната.
650
+ *
651
+ * @returns `true`, если есть.
652
+ */
175
653
  get hasPurchasedExternshipContracts(): UserDTO['hasPurchasedExternshipContracts'];
654
+ /**
655
+ * Доступна аттестация экстерната.
656
+ *
657
+ * @returns `true`, если доступна.
658
+ */
176
659
  get hasExternshipAttestationAccess(): UserDTO['hasExternshipAttestationAccess'];
660
+ /**
661
+ * Профиль в разделе социализации.
662
+ *
663
+ * @returns Объект с id и состоянием либо `null`, если профиля нет.
664
+ */
177
665
  get socializationProfile(): UserDTO['socializationProfile'];
666
+ /**
667
+ * Когда заканчивается бесплатный доступ.
668
+ *
669
+ * @returns Дата ISO либо `null`, если доступа нет.
670
+ */
178
671
  get freeAccessFinishesAt(): UserDTO['freeAccessFinishesAt'];
672
+ /**
673
+ * В комнате начальной школы есть непросмотренные новинки.
674
+ *
675
+ * @returns `true`, если есть; `undefined`, если бэкенд не прислал.
676
+ */
179
677
  get hasUnseenRoomFeatures(): UserDTO['hasUnseenRoomFeatures'];
678
+ /**
679
+ * Покупал договоры экстерната.
680
+ *
681
+ * @returns `true`, если покупал.
682
+ */
180
683
  get purchaseAnyExternshipContracts(): UserDTO['purchaseAnyExternshipContracts'];
684
+ /**
685
+ * Связан с экстернатом: ученик, родитель либо репетитор.
686
+ *
687
+ * @returns `true`, если связан; `undefined`, если бэкенд не прислал.
688
+ */
181
689
  get hasExternshipRelation(): UserDTO['hasExternshipRelation'];
690
+ /**
691
+ * Есть действующий договор экстерната.
692
+ *
693
+ * @returns `true`, если есть; `undefined`, если бэкенд не прислал.
694
+ */
182
695
  get hasExternshipActiveContract(): UserDTO['hasExternshipActiveContract'];
696
+ /**
697
+ * Можно продлить договор домашней школы.
698
+ *
699
+ * @returns `true`, если можно; `undefined`, если бэкенд не прислал.
700
+ */
183
701
  get canProlongateContract(): UserDTO['canProlongateContract'];
702
+ /**
703
+ * Окно пролонгации договора: даты, скидка, заголовок следующего года.
704
+ *
705
+ * @returns Объект окна, `null` либо `undefined`, если окна нет.
706
+ */
184
707
  get prolongation(): UserDTO['prolongation'];
708
+ /**
709
+ * Текущий интерес посетителя: класс, дисциплина, уровень, формат и причина. Та же форма, что у `GET /api/user/user_interest`, но из профиля, без похода.
710
+ *
711
+ * @returns Объект интереса либо `null`, если бэкенд не считал.
712
+ */
713
+ get currentInterest(): UserDTO['currentInterest'];
714
+ /**
715
+ * До какой даты открыт приём в домашнюю школу.
716
+ *
717
+ * @returns Дата либо `null`, если приём не идёт.
718
+ */
719
+ get admissionFinishesOn(): UserDTO['admissionFinishesOn'];
720
+ /**
721
+ * Посетитель пришёл из Алгоритмики — партнёрский вход с другой площадки.
722
+ *
723
+ * @returns `true`, если из Алгоритмики.
724
+ */
725
+ get algoritmika(): UserDTO['algoritmika'];
726
+ /**
727
+ * Страница бонусов уже открывалась — подсказки на ней больше не показываются.
728
+ *
729
+ * @returns `true`, если открывалась.
730
+ */
731
+ get bonusesPageVisited(): UserDTO['bonusesPageVisited'];
732
+ /**
733
+ * Посетителю разрешено менять школу и класс в профиле.
734
+ *
735
+ * @returns `true`, если разрешено.
736
+ */
737
+ get canChangeSchoolInfo(): UserDTO['canChangeSchoolInfo'];
738
+ /**
739
+ * Идёт демо-доступ к экстернату.
740
+ *
741
+ * @returns `true`, пока демо активно.
742
+ */
743
+ get externshipDemoAccessActive(): UserDTO['externshipDemoAccessActive'];
744
+ /**
745
+ * Экстернат ждёт оплаты: когда закроется доступ и по какому договору.
746
+ *
747
+ * @returns Объект с датой и id договора либо `null`, если долга нет.
748
+ */
749
+ get externshipPaymentRequired(): UserDTO['externshipPaymentRequired'];
750
+ /**
751
+ * Показывать промо-шапку экстерната.
752
+ *
753
+ * @returns `true`, если показывать.
754
+ */
755
+ get externshipPromoHeaderOn(): UserDTO['externshipPromoHeaderOn'];
756
+ /**
757
+ * Доступен раздел прогресса подготовки к экзаменам.
758
+ *
759
+ * @returns `true`, если доступен.
760
+ */
761
+ get hasExamProgressAccess(): UserDTO['hasExamProgressAccess'];
762
+ /**
763
+ * Доступны итоги года; их адрес — `recapUuid`.
764
+ *
765
+ * @returns `true`, если доступны.
766
+ */
767
+ get hasYearlyRecapAccess(): UserDTO['hasYearlyRecapAccess'];
768
+ /**
769
+ * Управляет аттестационной школой.
770
+ *
771
+ * @returns `true`, `false` либо `null`, если бэкенд не считал.
772
+ */
773
+ get isAttestationSchoolManager(): UserDTO['isAttestationSchoolManager'];
774
+ /**
775
+ * Посетитель — наставник.
776
+ *
777
+ * @returns `true`, если наставник.
778
+ */
779
+ get isMentor(): UserDTO['isMentor'];
780
+ /**
781
+ * Доступна серия ежедневных занятий с опытом (XP-стрик).
782
+ *
783
+ * @returns `true`, если доступна.
784
+ */
785
+ get isXpStreakAvailable(): UserDTO['isXpStreakAvailable'];
786
+ /**
787
+ * Таблица лидеров: доступна ли посетителю и готов ли он к ней (выбор курса).
788
+ *
789
+ * @returns Объект состояний либо `null`, если посетитель вне программы.
790
+ */
791
+ get leaderboard(): UserDTO['leaderboard'];
792
+ /**
793
+ * Состояние доступа к таблице лидеров.
794
+ *
795
+ * @returns `unavailable`, `available`, `vacation` либо `disabled`.
796
+ */
797
+ get leaderboardAccessState(): UserDTO['leaderboardAccessState'];
798
+ /**
799
+ * Как устроены учебные цели у посетителя.
800
+ *
801
+ * @returns `enabled`, `disabled`, `optional` либо `required`.
802
+ */
803
+ get learningGoalsAccessState(): UserDTO['learningGoalsAccessState'];
804
+ /**
805
+ * Мессенджеры, на которые посетитель подписан на уведомления.
806
+ *
807
+ * @returns Список либо `null`, если бэкенд не считал.
808
+ */
809
+ get messengerSubscriptions(): UserDTO['messengerSubscriptions'];
810
+ /**
811
+ * Пора предлагать продление занятий с репетитором.
812
+ *
813
+ * @returns `true`, если пора.
814
+ */
815
+ get needToPromoteRenewalWithCoach(): UserDTO['needToPromoteRenewalWithCoach'];
816
+ /**
817
+ * Показывать баннер курсов следующего учебного года.
818
+ *
819
+ * @returns `true`, если показывать.
820
+ */
821
+ get nextYearCoursesBannerAvailable(): UserDTO['nextYearCoursesBannerAvailable'];
822
+ /**
823
+ * Пароль задан — вход не только через код или соцсеть.
824
+ *
825
+ * @returns `true`, `false` либо `null`, если бэкенд не считал.
826
+ */
827
+ get passwordSet(): UserDTO['passwordSet'];
828
+ /**
829
+ * Реферальный код для программы «приведи друга».
830
+ *
831
+ * @returns Строка либо `null`, если код не выдан.
832
+ */
833
+ get referralCode(): UserDTO['referralCode'];
834
+ /**
835
+ * Доступен онбординг целевых действий.
836
+ *
837
+ * @returns `true`, если доступен.
838
+ */
839
+ get targetActionsOnboardingAvailable(): UserDTO['targetActionsOnboardingAvailable'];
185
840
  /**
186
841
  * Идёт ли сейчас окно пролонгации договора домашней школы.
187
842
  *
188
843
  * Границы включаются: последний день окна ещё считается пролонгацией. Не заданная граница
189
844
  * означает, что окна нет вовсе, а не что оно бесконечно.
845
+ *
846
+ * @returns `true`, если сегодня внутри окна включительно
190
847
  */
191
848
  isProlongationBetweenDates(): boolean;
192
849
  /**
@@ -197,11 +854,18 @@ declare class User {
197
854
  * @returns клонированный объект
198
855
  */
199
856
  private static deepClone;
857
+ /**
858
+ * Гость — сущность с умолчаниями всех полей и признаком `isDefaultUser()`.
859
+ *
860
+ * @returns Новая сущность на каждый вызов: умолчания общие на процесс, копия своя.
861
+ */
200
862
  static createDefault(): User;
201
863
  /**
202
864
  * Форма посетителя по умолчанию ДАННЫМИ — гость со всеми полями: тому, кто отдаёт `UserDTO`
203
865
  * наружу (хост — приложениям), нужна полная форма, а не сущность с методами. Своя копия на
204
866
  * вызов: умолчания общие на процесс, и правка чужой копии их не тронет.
867
+ *
868
+ * @returns Новая копия умолчаний на каждый вызов
205
869
  */
206
870
  static defaultDto(): UserDTO;
207
871
  /**
@@ -211,6 +875,13 @@ declare class User {
211
875
  * @returns санитизированная строка
212
876
  */
213
877
  private static sanitizeString;
878
+ /**
879
+ * Сущность из профиля бэкенда (`UserDTO` в camelCase): строковые поля чистятся от null-байтов
880
+ * и пробелов по краям, остальное берётся как есть.
881
+ *
882
+ * @param input - Профиль в форме `UserDTO`
883
+ * @returns Сущность над копией профиля: исходный объект не трогается
884
+ */
214
885
  static fromApi(input: unknown): User;
215
886
  /**
216
887
  * Санитизирует данные пользователя
@@ -219,30 +890,48 @@ declare class User {
219
890
  * @returns санитизированные данные
220
891
  */
221
892
  private static sanitizeUserData;
893
+ /**
894
+ * Сущность собрана из умолчаний (`createDefault`), а не из профиля бэкенда.
895
+ *
896
+ * @returns `true` у гостя по умолчанию
897
+ */
222
898
  isDefaultUser(): boolean;
899
+ /**
900
+ * Посетитель вошёл — у него есть идентификатор на бэкенде.
901
+ *
902
+ * @returns `true`, если `id` задан и положителен
903
+ */
223
904
  isLoggedIn(): boolean;
224
905
  private static getGradeString;
225
906
  /**
226
- * Возвращает тектовое представление роли / класса пользователя
907
+ * Роль либо класс словом — для подписи в интерфейсе.
227
908
  *
228
- * @returns {UserRole}
909
+ * @returns «Дошкольник» для нулевого класса, «Выпускник» без класса, иначе класс («5 класс»)
229
910
  */
230
911
  getPupilRole(): UserRole;
231
912
  /**
232
- * Возвращает роль пользователя
233
- * @returns {UserRole} роль как строка
913
+ * Роль словом — по флагам профиля, первый совпавший: репетитор, учитель, родитель.
914
+ *
915
+ * @returns «Репетитор», «Учитель», «Родитель», иначе роль ученика из `getPupilRole()`
234
916
  */
235
917
  getRole: () => UserRole;
236
918
  /**
237
- * Возвращает фамилию и инициалы юзера
238
- * @param {User} user
239
- * @return {string} 'Пупкин В.'
919
+ * Фамилия с инициалами имени и отчества — подпись в списках.
920
+ *
921
+ * @returns Строка вида «Пупкин В. И.»; без отчества — «Пупкин В.»
240
922
  */
241
923
  getInitials: () => string;
924
+ /**
925
+ * Профиль строкой JSON — для печати в документ и передачи по сети.
926
+ *
927
+ * @returns JSON полей сущности
928
+ */
242
929
  toJson(): string;
243
930
  /**
244
931
  * Посетитель данными — то, что едет по сети и в состояние: сущность с методами не
245
932
  * сериализуется. Своя копия на вызов: сущность неизменяема, и правка копии её не тронет.
933
+ *
934
+ * @returns Копия полей сущности данными
246
935
  */
247
936
  toDto(): UserDTO;
248
937
  }
@@ -338,183 +1027,6 @@ declare class AppOptionsService {
338
1027
  getAppOptions(): Promise<AppOptions>;
339
1028
  }
340
1029
 
341
- interface FoxfordAntibotConfig {
342
- antibotFrameSrc?: string;
343
- antibotOnload?: (e: Event) => void;
344
- antibotOnerror?: () => void;
345
- debug?: boolean;
346
- }
347
- declare class FoxfordAntibot {
348
- private config;
349
- static FOXFORD_ANTIBOT_URL: string;
350
- static DEFAULT_CONFIG: {
351
- antibotFrameSrc: string;
352
- };
353
- static FRAME_CLASSNAME: string;
354
- constructor(config?: FoxfordAntibotConfig);
355
- private static antibotIsInitialized;
356
- private static createFrame;
357
- createAntibotFrame: (params: {
358
- src: string;
359
- onload?: (_e: Event) => void;
360
- onerror?: () => void;
361
- }) => void;
362
- }
363
-
364
- type Widget = {
365
- name: 'menu' | 'reviews' | 'featuredCoaches' | 'coachEnrollment' | 'shortForm' | 'userTypePrompt' | 'teachersSlider' | 'externshipFormats';
366
- options: Record<string, any>;
367
- container?: HTMLElement;
368
- };
369
- type WidgetsInitConfig = {
370
- version?: 'latest' | string;
371
- locale?: 'ru';
372
- };
373
- interface WidgetsConfig extends WidgetsInitConfig {
374
- analyticContext?: {
375
- prefix: string;
376
- module: string;
377
- payload?: Record<any, any>;
378
- };
379
- rootColors?: boolean;
380
- loadFonts?: boolean;
381
- widgets: Array<Widget>;
382
- }
383
- declare class Widgets {
384
- private config;
385
- private api;
386
- private manifest;
387
- static ENTRY: string[];
388
- static DEFAULT_CONFIG: WidgetsInitConfig;
389
- constructor(config: WidgetsInitConfig | undefined, apiInstance: ApiInstance);
390
- create(config: WidgetsConfig): Promise<void>;
391
- update(name: string, config: Widget): Promise<void>;
392
- private loadManifest;
393
- static appendScript(src: string): Promise<unknown>;
394
- private loadAssets;
395
- }
396
-
397
- type ProductTypeItem = {
398
- type: string;
399
- id: number;
400
- description: string;
401
- title: string;
402
- discipline: {
403
- id: number;
404
- name: string;
405
- };
406
- teacher: {
407
- id: number;
408
- long_name: string;
409
- description: string;
410
- experience: number;
411
- photo_url: string;
412
- photo_large_url: string;
413
- };
414
- levels: Array<{
415
- id: number;
416
- name: string;
417
- }>;
418
- };
419
- type ProductPack = {
420
- name: string;
421
- description: string;
422
- meta_title: string;
423
- meta_description: string;
424
- published: true;
425
- content_description: string;
426
- disciplines_scope: string;
427
- guaranteed_admission: true;
428
- grade_names: string;
429
- is_purchased: false;
430
- learning_flow: {
431
- title: string;
432
- steps: Array<{
433
- header: string;
434
- description: string;
435
- }>;
436
- };
437
- offers: {
438
- intro: string;
439
- items: Array<{
440
- title: string;
441
- description: string;
442
- }>;
443
- };
444
- price_block: {
445
- price: number;
446
- initial_price: number;
447
- title: string;
448
- description: string;
449
- points: Array<string>;
450
- price_per_month: number;
451
- initial_price_per_month: number;
452
- };
453
- product_pack_items: Array<ProductTypeItem>;
454
- faq_items: Array<{
455
- question: string;
456
- answer: string;
457
- }>;
458
- landing_image_urls: Array<string>;
459
- };
460
- interface CartItemDTO {
461
- cart_item_type: CartItemResourceType;
462
- resource_id: number;
463
- }
464
- type FoxfordConfig = {
465
- host?: string;
466
- /** @deprecated */
467
- widgetsVersion?: 'latest' | string;
468
- antibot?: boolean;
469
- antibotConfig?: FoxfordAntibotConfig;
470
- api?: ApiConfig;
471
- captchaConfig?: () => CaptchaConfig;
472
- /** @deprecated Не используйте инициализацию виджетов через SDK */
473
- widgetsConfig?: WidgetsInitConfig;
474
- };
475
- 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';
476
- type ProductFormats = 'coach_course' | 'course' | 'event' | 'exam_rehearsal' | 'externship' | 'game' | 'interactive_trainings' | 'mini_group' | 'olympiad' | 'product_pack' | 'teacher_course' | 'trainings';
477
- type UserInterests = {
478
- businessUnitAbbrs?: BusinessUnitAbbreviation[] | null;
479
- disciplineId?: number | number[] | null;
480
- gradeId?: number | number[] | null;
481
- levelId?: number | number[] | null;
482
- productId?: number | null;
483
- productFormat?: ProductFormats | null;
484
- reason?: Reasons | null;
485
- };
486
- interface CommunicationSubscriptions {
487
- subscriptionNews?: boolean;
488
- subscriptionMaterials?: boolean;
489
- subscriptionEvents?: boolean;
490
- subscriptionPromos?: boolean;
491
- subscriptionReminders?: boolean;
492
- subscriptionMedia?: boolean;
493
- subscriptionExternship?: boolean;
494
- subscriptionExternal?: boolean;
495
- }
496
- interface LoginByPhoneParams {
497
- onEmailRequest: (phoneCheckResponse: {
498
- email?: string;
499
- fakeEmail?: boolean;
500
- state: 'new' | 'confirmed' | 'not_confirmed';
501
- }) => Promise<string>;
502
- onCodeRequest: () => Promise<string>;
503
- onNameRequest: () => Promise<{
504
- first_name: string;
505
- last_name: string;
506
- }>;
507
- onConfirmationCodeResponse: (confirmationCodeResponse: {
508
- nextDeliveryAt: string;
509
- }) => void;
510
- onConfirmationCodeError: (error: Error) => void;
511
- }
512
- interface LoginOrRegistrationResponse {
513
- redirectUrl?: string;
514
- registered?: boolean;
515
- type?: string;
516
- }
517
-
518
1030
  declare class CartService {
519
1031
  private api;
520
1032
  constructor(apiInstance: ApiInstance);