@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/entities.cjs CHANGED
@@ -69,18 +69,34 @@ var DEFAULT_USER = {
69
69
  room: null,
70
70
  street: null
71
71
  },
72
+ admissionFinishesOn: null,
73
+ algoritmika: false,
72
74
  avatarUrl: "",
73
75
  bonus: {
74
76
  giftAmount: 0,
75
77
  realMoneyAmount: 0
76
78
  },
77
79
  bonusAmount: 0,
80
+ bonusesPageVisited: false,
81
+ canChangeSchoolInfo: false,
78
82
  cartItemsCount: 0,
79
83
  cartTemplateId: null,
80
84
  createdAt: null,
85
+ currentInterest: {
86
+ businessUnitAbbrs: [],
87
+ disciplineId: null,
88
+ gradeId: null,
89
+ levelId: null,
90
+ productFormat: null,
91
+ productId: null,
92
+ reason: null
93
+ },
81
94
  disciplineIds: [],
82
95
  email: "",
83
96
  emailConfirmed: false,
97
+ externshipDemoAccessActive: false,
98
+ externshipPaymentRequired: null,
99
+ externshipPromoHeaderOn: false,
84
100
  externshipUser: false,
85
101
  fakeEmail: false,
86
102
  fakeUser: false,
@@ -99,25 +115,37 @@ var DEFAULT_USER = {
99
115
  hasActivePurchases: false,
100
116
  hasAttemptsSolveExamRehearsals: false,
101
117
  hasBookmarks: false,
118
+ hasExamProgressAccess: false,
102
119
  hasExternshipAttestationAccess: false,
103
120
  hasPurchasedExternshipContracts: false,
121
+ hasYearlyRecapAccess: false,
104
122
  id: null,
105
123
  isAgent: false,
124
+ isAttestationSchoolManager: null,
106
125
  isCoach: false,
107
126
  isCustomer: null,
108
127
  isElementaryPupil: false,
109
128
  isExternshipCoach: false,
110
129
  isGraduated: false,
130
+ isMentor: false,
111
131
  isMiniGroupTeacher: false,
112
132
  isParent: false,
133
+ isXpStreakAvailable: false,
113
134
  lastName: "",
135
+ leaderboard: null,
136
+ leaderboardAccessState: "unavailable",
137
+ learningGoalsAccessState: "disabled",
114
138
  locale: null,
139
+ messengerSubscriptions: null,
115
140
  methodist: false,
116
141
  middleName: "",
142
+ needToPromoteRenewalWithCoach: false,
143
+ nextYearCoursesBannerAvailable: false,
117
144
  onboardingFinished: false,
118
145
  onboardingFinishedAt: null,
119
146
  parentPhone: null,
120
147
  parentPhoneConfirmed: false,
148
+ passwordSet: null,
121
149
  phone: null,
122
150
  phoneConfirmed: false,
123
151
  privacy: {
@@ -126,11 +154,13 @@ var DEFAULT_USER = {
126
154
  profileEnriched: false,
127
155
  purchaseAnyExternshipContracts: false,
128
156
  recapUuid: null,
157
+ referralCode: null,
129
158
  shortName: "",
130
159
  skype: null,
131
160
  socialNets: [],
132
161
  socializationProfile: null,
133
162
  tags: null,
163
+ targetActionsOnboardingAvailable: false,
134
164
  timezone: null,
135
165
  type: null,
136
166
  webSocketNotificationsJwt: null
@@ -142,8 +172,9 @@ var _User = class _User {
142
172
  this.props = props;
143
173
  this.isDefault = isDefault;
144
174
  /**
145
- * Возвращает роль пользователя
146
- * @returns {UserRole} роль как строка
175
+ * Роль словом — по флагам профиля, первый совпавший: репетитор, учитель, родитель.
176
+ *
177
+ * @returns «Репетитор», «Учитель», «Родитель», иначе роль ученика из `getPupilRole()`
147
178
  */
148
179
  this.getRole = () => {
149
180
  if (this.isCoach) return "\u0420\u0435\u043F\u0435\u0442\u0438\u0442\u043E\u0440";
@@ -159,206 +190,694 @@ var _User = class _User {
159
190
  }
160
191
  };
161
192
  /**
162
- * Возвращает фамилию и инициалы юзера
163
- * @param {User} user
164
- * @return {string} 'Пупкин В.'
193
+ * Фамилия с инициалами имени и отчества — подпись в списках.
194
+ *
195
+ * @returns Строка вида «Пупкин В. И.»; без отчества — «Пупкин В.»
165
196
  */
166
197
  this.getInitials = () => {
167
198
  var _a, _b;
168
199
  return `${this.lastName}${this.firstName ? ` ${(_a = this.firstName[0]) == null ? void 0 : _a.toUpperCase()}.` : ""}${this.middleName !== "" && this.middleName !== null ? ` ${(_b = this.middleName[0]) == null ? void 0 : _b.toUpperCase()}.` : ""}`;
169
200
  };
170
201
  }
202
+ /**
203
+ * Идентификатор посетителя на бэкенде.
204
+ *
205
+ * @returns Число либо `null` у гостя.
206
+ */
171
207
  get id() {
172
208
  return this.props.id;
173
209
  }
210
+ /**
211
+ * Почта посетителя.
212
+ *
213
+ * @returns Строка; пустая, если почты нет.
214
+ */
174
215
  get email() {
175
216
  return this.props.email;
176
217
  }
218
+ /**
219
+ * Имя.
220
+ *
221
+ * @returns Строка; пустая, если не заполнено.
222
+ */
177
223
  get firstName() {
178
224
  return this.props.firstName;
179
225
  }
226
+ /**
227
+ * Отчество.
228
+ *
229
+ * @returns Строка; пустая, если не заполнено.
230
+ */
180
231
  get middleName() {
181
232
  return this.props.middleName;
182
233
  }
234
+ /**
235
+ * Фамилия.
236
+ *
237
+ * @returns Строка; пустая, если не заполнено.
238
+ */
183
239
  get lastName() {
184
240
  return this.props.lastName;
185
241
  }
242
+ /**
243
+ * Полное имя, каким его собрал бэкенд.
244
+ *
245
+ * @returns Строка; пустая у гостя.
246
+ */
186
247
  get fullName() {
187
248
  return this.props.fullName;
188
249
  }
250
+ /**
251
+ * Короткое имя для обращения в интерфейсе.
252
+ *
253
+ * @returns Строка; пустая у гостя.
254
+ */
189
255
  get shortName() {
190
256
  return this.props.shortName;
191
257
  }
258
+ /**
259
+ * Когда заведён профиль.
260
+ *
261
+ * @returns Дата ISO либо `null` у гостя.
262
+ */
192
263
  get createdAt() {
193
264
  return this.props.createdAt;
194
265
  }
266
+ /**
267
+ * Часовой пояс посетителя.
268
+ *
269
+ * @returns Имя пояса либо `null`, если не задан.
270
+ */
195
271
  get timezone() {
196
272
  return this.props.timezone;
197
273
  }
274
+ /**
275
+ * Локаль интерфейса.
276
+ *
277
+ * @returns Код локали либо `null`, если не задана.
278
+ */
198
279
  get locale() {
199
280
  return this.props.locale;
200
281
  }
282
+ /**
283
+ * Класс посетителя: id, порядковый номер, имя и транслит.
284
+ *
285
+ * @returns Объект класса; у гостя поля `null` и пустые строки.
286
+ */
201
287
  get grade() {
202
288
  return this.props.grade;
203
289
  }
290
+ /**
291
+ * Телефон посетителя.
292
+ *
293
+ * @returns Строка либо `null`, если не указан.
294
+ */
204
295
  get phone() {
205
296
  return this.props.phone;
206
297
  }
298
+ /**
299
+ * Адрес аватара.
300
+ *
301
+ * @returns Строка; пустая, если аватара нет.
302
+ */
207
303
  get avatarUrl() {
208
304
  return this.props.avatarUrl;
209
305
  }
306
+ /**
307
+ * Посетитель — родитель.
308
+ *
309
+ * @returns `true`, если роль родительская.
310
+ */
210
311
  get isParent() {
211
312
  return this.props.isParent;
212
313
  }
314
+ /**
315
+ * Посетитель — выпускник.
316
+ *
317
+ * @returns `true`, если школу закончил.
318
+ */
213
319
  get isGraduated() {
214
320
  return this.props.isGraduated;
215
321
  }
322
+ /**
323
+ * Класс подтверждён посетителем.
324
+ *
325
+ * @returns `true`, если класс проверен.
326
+ */
216
327
  get gradeChecked() {
217
328
  return this.props.gradeChecked;
218
329
  }
330
+ /**
331
+ * Тип учётной записи на бэкенде.
332
+ *
333
+ * @returns `pupil`, `agent` либо `null` у гостя.
334
+ */
219
335
  get type() {
220
336
  return this.props.type;
221
337
  }
338
+ /**
339
+ * Посетитель — репетитор.
340
+ *
341
+ * @returns `true`, если роль репетитора.
342
+ */
222
343
  get isCoach() {
223
344
  return this.props.isCoach;
224
345
  }
346
+ /**
347
+ * Ведёт мини-группы.
348
+ *
349
+ * @returns `true`, если ведёт.
350
+ */
225
351
  get isMiniGroupTeacher() {
226
352
  return this.props.isMiniGroupTeacher;
227
353
  }
354
+ /**
355
+ * Репетитор экстерната.
356
+ *
357
+ * @returns `true`, если ведёт экстернат.
358
+ */
228
359
  get isExternshipCoach() {
229
360
  return this.props.isExternshipCoach;
230
361
  }
362
+ /**
363
+ * Посетитель — учитель.
364
+ *
365
+ * @returns `true`, если роль учителя.
366
+ */
231
367
  get isAgent() {
232
368
  return this.props.isAgent;
233
369
  }
370
+ /**
371
+ * Посетитель — методист.
372
+ *
373
+ * @returns `true`, если методист.
374
+ */
234
375
  get methodist() {
235
376
  return this.props.methodist;
236
377
  }
378
+ /**
379
+ * Почтовый адрес: страна, регион, город, улица, дом.
380
+ *
381
+ * @returns Объект адреса либо `null`, если не заполнен.
382
+ */
237
383
  get address() {
238
384
  return this.props.address;
239
385
  }
386
+ /**
387
+ * Привязанные соцсети.
388
+ *
389
+ * @returns Список провайдеров с идентификаторами; пустой, если привязок нет.
390
+ */
240
391
  get socialNets() {
241
392
  return this.props.socialNets;
242
393
  }
394
+ /**
395
+ * Логин в Skype.
396
+ *
397
+ * @returns Строка либо `null`.
398
+ */
243
399
  get skype() {
244
400
  return this.props.skype;
245
401
  }
402
+ /**
403
+ * Настройки интерфейса: показанные подсказки и скрытые баннеры.
404
+ *
405
+ * @returns Объект флагов либо `undefined`, если бэкенд их не прислал.
406
+ */
246
407
  get settings() {
247
408
  return this.props.settings;
248
409
  }
410
+ /**
411
+ * Бонусный счёт: подарочные и реальные бонусы.
412
+ *
413
+ * @returns Объект с суммами.
414
+ */
249
415
  get bonus() {
250
416
  return this.props.bonus;
251
417
  }
418
+ /**
419
+ * Сумма бонусов на счёте.
420
+ *
421
+ * @returns Число.
422
+ */
252
423
  get bonusAmount() {
253
424
  return this.props.bonusAmount;
254
425
  }
426
+ /**
427
+ * Есть действующие покупки.
428
+ *
429
+ * @returns `true`, если есть.
430
+ */
255
431
  get hasActivePurchases() {
256
432
  return this.props.hasActivePurchases;
257
433
  }
434
+ /**
435
+ * Остались попытки пробных экзаменов.
436
+ *
437
+ * @returns `true`, если остались.
438
+ */
258
439
  get hasAttemptsSolveExamRehearsals() {
259
440
  return this.props.hasAttemptsSolveExamRehearsals;
260
441
  }
442
+ /**
443
+ * Есть закладки.
444
+ *
445
+ * @returns `true`, если есть.
446
+ */
261
447
  get hasBookmarks() {
262
448
  return this.props.hasBookmarks;
263
449
  }
450
+ /**
451
+ * Метки посетителя на бэкенде.
452
+ *
453
+ * @returns Список строк либо `null`.
454
+ */
264
455
  get tags() {
265
456
  return this.props.tags;
266
457
  }
458
+ /**
459
+ * Шаблон корзины.
460
+ *
461
+ * @returns Число либо `null`.
462
+ */
267
463
  get cartTemplateId() {
268
464
  return this.props.cartTemplateId;
269
465
  }
466
+ /**
467
+ * Сколько позиций в корзине.
468
+ *
469
+ * @returns Число.
470
+ */
270
471
  get cartItemsCount() {
271
472
  return this.props.cartItemsCount;
272
473
  }
474
+ /**
475
+ * Онбординг пройден.
476
+ *
477
+ * @returns `true`, если пройден.
478
+ */
273
479
  get onboardingFinished() {
274
480
  return this.props.onboardingFinished;
275
481
  }
482
+ /**
483
+ * Когда пройден онбординг.
484
+ *
485
+ * @returns Дата ISO либо `null`, пока не пройден.
486
+ */
276
487
  get onboardingFinishedAt() {
277
488
  return this.props.onboardingFinishedAt;
278
489
  }
490
+ /**
491
+ * Почта подтверждена.
492
+ *
493
+ * @returns `true`, если подтверждена.
494
+ */
279
495
  get emailConfirmed() {
280
496
  return this.props.emailConfirmed;
281
497
  }
498
+ /**
499
+ * Телефон подтверждён.
500
+ *
501
+ * @returns `true`, если подтверждён.
502
+ */
282
503
  get phoneConfirmed() {
283
504
  return this.props.phoneConfirmed;
284
505
  }
506
+ /**
507
+ * Почта выдумана бэкендом при регистрации без почты.
508
+ *
509
+ * @returns `true`, если почта ненастоящая.
510
+ */
285
511
  get fakeEmail() {
286
512
  return this.props.fakeEmail;
287
513
  }
514
+ /**
515
+ * Посетитель заведён бэкендом без его участия (например, по заявке).
516
+ *
517
+ * @returns `true`, если учётная запись ненастоящая.
518
+ */
288
519
  get fakeUser() {
289
520
  return this.props.fakeUser;
290
521
  }
522
+ /**
523
+ * Профиль дополнен данными после регистрации.
524
+ *
525
+ * @returns `true`, если дополнен.
526
+ */
291
527
  get profileEnriched() {
292
528
  return this.props.profileEnriched;
293
529
  }
530
+ /**
531
+ * Идентификатор итогов года.
532
+ *
533
+ * @returns Строка либо `null`, если итогов нет.
534
+ */
294
535
  get recapUuid() {
295
536
  return this.props.recapUuid;
296
537
  }
538
+ /**
539
+ * Дисциплины, которые изучает посетитель.
540
+ *
541
+ * @returns Список id; пустой, если не выбраны.
542
+ */
297
543
  get disciplineIds() {
298
544
  return this.props.disciplineIds;
299
545
  }
546
+ /**
547
+ * Настройки приватности.
548
+ *
549
+ * @returns Объект с флагом публичного профиля.
550
+ */
300
551
  get privacy() {
301
552
  return this.props.privacy;
302
553
  }
554
+ /**
555
+ * Телефон родителя.
556
+ *
557
+ * @returns Строка либо `null`.
558
+ */
303
559
  get parentPhone() {
304
560
  return this.props.parentPhone;
305
561
  }
562
+ /**
563
+ * Телефон родителя подтверждён.
564
+ *
565
+ * @returns `true`, если подтверждён.
566
+ */
306
567
  get parentPhoneConfirmed() {
307
568
  return this.props.parentPhoneConfirmed;
308
569
  }
570
+ /**
571
+ * Посетитель что-то покупал.
572
+ *
573
+ * @returns `true`, `false` либо `null`, если бэкенд не считал.
574
+ */
309
575
  get isCustomer() {
310
576
  return this.props.isCustomer;
311
577
  }
578
+ /**
579
+ * Доступны многодневные серии занятий.
580
+ *
581
+ * @returns `true`, если доступны.
582
+ */
312
583
  get hasAccessToMultiDaysStreaks() {
313
584
  return this.props.hasAccessToMultiDaysStreaks;
314
585
  }
586
+ /**
587
+ * Ученик начальной школы.
588
+ *
589
+ * @returns `true`, если начальная школа.
590
+ */
315
591
  get isElementaryPupil() {
316
592
  return this.props.isElementaryPupil;
317
593
  }
594
+ /**
595
+ * Токен для канала уведомлений по WebSocket.
596
+ *
597
+ * @returns Строка либо `null`, если канала нет.
598
+ */
318
599
  get webSocketNotificationsJwt() {
319
600
  return this.props.webSocketNotificationsJwt;
320
601
  }
602
+ /**
603
+ * Доступны аттестационные листы.
604
+ *
605
+ * @returns `true`, если доступны.
606
+ */
321
607
  get hasAccessToAttestationSheets() {
322
608
  return this.props.hasAccessToAttestationSheets;
323
609
  }
610
+ /**
611
+ * Посетитель учится в экстернате.
612
+ *
613
+ * @returns `true`, если экстернат.
614
+ */
324
615
  get externshipUser() {
325
616
  return this.props.externshipUser;
326
617
  }
618
+ /**
619
+ * Есть оплаченные договоры экстерната.
620
+ *
621
+ * @returns `true`, если есть.
622
+ */
327
623
  get hasPurchasedExternshipContracts() {
328
624
  return this.props.hasPurchasedExternshipContracts;
329
625
  }
626
+ /**
627
+ * Доступна аттестация экстерната.
628
+ *
629
+ * @returns `true`, если доступна.
630
+ */
330
631
  get hasExternshipAttestationAccess() {
331
632
  return this.props.hasExternshipAttestationAccess;
332
633
  }
634
+ /**
635
+ * Профиль в разделе социализации.
636
+ *
637
+ * @returns Объект с id и состоянием либо `null`, если профиля нет.
638
+ */
333
639
  get socializationProfile() {
334
640
  return this.props.socializationProfile;
335
641
  }
642
+ /**
643
+ * Когда заканчивается бесплатный доступ.
644
+ *
645
+ * @returns Дата ISO либо `null`, если доступа нет.
646
+ */
336
647
  get freeAccessFinishesAt() {
337
648
  return this.props.freeAccessFinishesAt;
338
649
  }
650
+ /**
651
+ * В комнате начальной школы есть непросмотренные новинки.
652
+ *
653
+ * @returns `true`, если есть; `undefined`, если бэкенд не прислал.
654
+ */
339
655
  get hasUnseenRoomFeatures() {
340
656
  return this.props.hasUnseenRoomFeatures;
341
657
  }
658
+ /**
659
+ * Покупал договоры экстерната.
660
+ *
661
+ * @returns `true`, если покупал.
662
+ */
342
663
  get purchaseAnyExternshipContracts() {
343
664
  return this.props.purchaseAnyExternshipContracts;
344
665
  }
666
+ /**
667
+ * Связан с экстернатом: ученик, родитель либо репетитор.
668
+ *
669
+ * @returns `true`, если связан; `undefined`, если бэкенд не прислал.
670
+ */
345
671
  get hasExternshipRelation() {
346
672
  return this.props.hasExternshipRelation;
347
673
  }
674
+ /**
675
+ * Есть действующий договор экстерната.
676
+ *
677
+ * @returns `true`, если есть; `undefined`, если бэкенд не прислал.
678
+ */
348
679
  get hasExternshipActiveContract() {
349
680
  return this.props.hasExternshipActiveContract;
350
681
  }
682
+ /**
683
+ * Можно продлить договор домашней школы.
684
+ *
685
+ * @returns `true`, если можно; `undefined`, если бэкенд не прислал.
686
+ */
351
687
  get canProlongateContract() {
352
688
  return this.props.canProlongateContract;
353
689
  }
690
+ /**
691
+ * Окно пролонгации договора: даты, скидка, заголовок следующего года.
692
+ *
693
+ * @returns Объект окна, `null` либо `undefined`, если окна нет.
694
+ */
354
695
  get prolongation() {
355
696
  return this.props.prolongation;
356
697
  }
698
+ /**
699
+ * Текущий интерес посетителя: класс, дисциплина, уровень, формат и причина. Та же форма, что у `GET /api/user/user_interest`, но из профиля, без похода.
700
+ *
701
+ * @returns Объект интереса либо `null`, если бэкенд не считал.
702
+ */
703
+ get currentInterest() {
704
+ return this.props.currentInterest;
705
+ }
706
+ /**
707
+ * До какой даты открыт приём в домашнюю школу.
708
+ *
709
+ * @returns Дата либо `null`, если приём не идёт.
710
+ */
711
+ get admissionFinishesOn() {
712
+ return this.props.admissionFinishesOn;
713
+ }
714
+ /**
715
+ * Посетитель пришёл из Алгоритмики — партнёрский вход с другой площадки.
716
+ *
717
+ * @returns `true`, если из Алгоритмики.
718
+ */
719
+ get algoritmika() {
720
+ return this.props.algoritmika;
721
+ }
722
+ /**
723
+ * Страница бонусов уже открывалась — подсказки на ней больше не показываются.
724
+ *
725
+ * @returns `true`, если открывалась.
726
+ */
727
+ get bonusesPageVisited() {
728
+ return this.props.bonusesPageVisited;
729
+ }
730
+ /**
731
+ * Посетителю разрешено менять школу и класс в профиле.
732
+ *
733
+ * @returns `true`, если разрешено.
734
+ */
735
+ get canChangeSchoolInfo() {
736
+ return this.props.canChangeSchoolInfo;
737
+ }
738
+ /**
739
+ * Идёт демо-доступ к экстернату.
740
+ *
741
+ * @returns `true`, пока демо активно.
742
+ */
743
+ get externshipDemoAccessActive() {
744
+ return this.props.externshipDemoAccessActive;
745
+ }
746
+ /**
747
+ * Экстернат ждёт оплаты: когда закроется доступ и по какому договору.
748
+ *
749
+ * @returns Объект с датой и id договора либо `null`, если долга нет.
750
+ */
751
+ get externshipPaymentRequired() {
752
+ return this.props.externshipPaymentRequired;
753
+ }
754
+ /**
755
+ * Показывать промо-шапку экстерната.
756
+ *
757
+ * @returns `true`, если показывать.
758
+ */
759
+ get externshipPromoHeaderOn() {
760
+ return this.props.externshipPromoHeaderOn;
761
+ }
762
+ /**
763
+ * Доступен раздел прогресса подготовки к экзаменам.
764
+ *
765
+ * @returns `true`, если доступен.
766
+ */
767
+ get hasExamProgressAccess() {
768
+ return this.props.hasExamProgressAccess;
769
+ }
770
+ /**
771
+ * Доступны итоги года; их адрес — `recapUuid`.
772
+ *
773
+ * @returns `true`, если доступны.
774
+ */
775
+ get hasYearlyRecapAccess() {
776
+ return this.props.hasYearlyRecapAccess;
777
+ }
778
+ /**
779
+ * Управляет аттестационной школой.
780
+ *
781
+ * @returns `true`, `false` либо `null`, если бэкенд не считал.
782
+ */
783
+ get isAttestationSchoolManager() {
784
+ return this.props.isAttestationSchoolManager;
785
+ }
786
+ /**
787
+ * Посетитель — наставник.
788
+ *
789
+ * @returns `true`, если наставник.
790
+ */
791
+ get isMentor() {
792
+ return this.props.isMentor;
793
+ }
794
+ /**
795
+ * Доступна серия ежедневных занятий с опытом (XP-стрик).
796
+ *
797
+ * @returns `true`, если доступна.
798
+ */
799
+ get isXpStreakAvailable() {
800
+ return this.props.isXpStreakAvailable;
801
+ }
802
+ /**
803
+ * Таблица лидеров: доступна ли посетителю и готов ли он к ней (выбор курса).
804
+ *
805
+ * @returns Объект состояний либо `null`, если посетитель вне программы.
806
+ */
807
+ get leaderboard() {
808
+ return this.props.leaderboard;
809
+ }
810
+ /**
811
+ * Состояние доступа к таблице лидеров.
812
+ *
813
+ * @returns `unavailable`, `available`, `vacation` либо `disabled`.
814
+ */
815
+ get leaderboardAccessState() {
816
+ return this.props.leaderboardAccessState;
817
+ }
818
+ /**
819
+ * Как устроены учебные цели у посетителя.
820
+ *
821
+ * @returns `enabled`, `disabled`, `optional` либо `required`.
822
+ */
823
+ get learningGoalsAccessState() {
824
+ return this.props.learningGoalsAccessState;
825
+ }
826
+ /**
827
+ * Мессенджеры, на которые посетитель подписан на уведомления.
828
+ *
829
+ * @returns Список либо `null`, если бэкенд не считал.
830
+ */
831
+ get messengerSubscriptions() {
832
+ return this.props.messengerSubscriptions;
833
+ }
834
+ /**
835
+ * Пора предлагать продление занятий с репетитором.
836
+ *
837
+ * @returns `true`, если пора.
838
+ */
839
+ get needToPromoteRenewalWithCoach() {
840
+ return this.props.needToPromoteRenewalWithCoach;
841
+ }
842
+ /**
843
+ * Показывать баннер курсов следующего учебного года.
844
+ *
845
+ * @returns `true`, если показывать.
846
+ */
847
+ get nextYearCoursesBannerAvailable() {
848
+ return this.props.nextYearCoursesBannerAvailable;
849
+ }
850
+ /**
851
+ * Пароль задан — вход не только через код или соцсеть.
852
+ *
853
+ * @returns `true`, `false` либо `null`, если бэкенд не считал.
854
+ */
855
+ get passwordSet() {
856
+ return this.props.passwordSet;
857
+ }
858
+ /**
859
+ * Реферальный код для программы «приведи друга».
860
+ *
861
+ * @returns Строка либо `null`, если код не выдан.
862
+ */
863
+ get referralCode() {
864
+ return this.props.referralCode;
865
+ }
866
+ /**
867
+ * Доступен онбординг целевых действий.
868
+ *
869
+ * @returns `true`, если доступен.
870
+ */
871
+ get targetActionsOnboardingAvailable() {
872
+ return this.props.targetActionsOnboardingAvailable;
873
+ }
357
874
  /**
358
875
  * Идёт ли сейчас окно пролонгации договора домашней школы.
359
876
  *
360
877
  * Границы включаются: последний день окна ещё считается пролонгацией. Не заданная граница
361
878
  * означает, что окна нет вовсе, а не что оно бесконечно.
879
+ *
880
+ * @returns `true`, если сегодня внутри окна включительно
362
881
  */
363
882
  isProlongationBetweenDates() {
364
883
  var _a;
@@ -404,6 +923,11 @@ var _User = class _User {
404
923
  });
405
924
  return clonedObj;
406
925
  }
926
+ /**
927
+ * Гость — сущность с умолчаниями всех полей и признаком `isDefaultUser()`.
928
+ *
929
+ * @returns Новая сущность на каждый вызов: умолчания общие на процесс, копия своя.
930
+ */
407
931
  static createDefault() {
408
932
  return new _User(this.deepClone(DEFAULT_USER), true);
409
933
  }
@@ -411,6 +935,8 @@ var _User = class _User {
411
935
  * Форма посетителя по умолчанию ДАННЫМИ — гость со всеми полями: тому, кто отдаёт `UserDTO`
412
936
  * наружу (хост — приложениям), нужна полная форма, а не сущность с методами. Своя копия на
413
937
  * вызов: умолчания общие на процесс, и правка чужой копии их не тронет.
938
+ *
939
+ * @returns Новая копия умолчаний на каждый вызов
414
940
  */
415
941
  static defaultDto() {
416
942
  return this.deepClone(DEFAULT_USER);
@@ -428,6 +954,13 @@ var _User = class _User {
428
954
  }
429
955
  return str.replace(/\x00/g, "").trim();
430
956
  }
957
+ /**
958
+ * Сущность из профиля бэкенда (`UserDTO` в camelCase): строковые поля чистятся от null-байтов
959
+ * и пробелов по краям, остальное берётся как есть.
960
+ *
961
+ * @param input - Профиль в форме `UserDTO`
962
+ * @returns Сущность над копией профиля: исходный объект не трогается
963
+ */
431
964
  static fromApi(input) {
432
965
  const sanitizedData = this.sanitizeUserData(this.deepClone(input));
433
966
  return new _User(sanitizedData);
@@ -448,16 +981,26 @@ var _User = class _User {
448
981
  shortName: this.sanitizeString(data.shortName)
449
982
  });
450
983
  }
984
+ /**
985
+ * Сущность собрана из умолчаний (`createDefault`), а не из профиля бэкенда.
986
+ *
987
+ * @returns `true` у гостя по умолчанию
988
+ */
451
989
  isDefaultUser() {
452
990
  return this.isDefault;
453
991
  }
992
+ /**
993
+ * Посетитель вошёл — у него есть идентификатор на бэкенде.
994
+ *
995
+ * @returns `true`, если `id` задан и положителен
996
+ */
454
997
  isLoggedIn() {
455
998
  return this.id && this.id > 0 ? true : false;
456
999
  }
457
1000
  /**
458
- * Возвращает тектовое представление роли / класса пользователя
1001
+ * Роль либо класс словом — для подписи в интерфейсе.
459
1002
  *
460
- * @returns {UserRole}
1003
+ * @returns «Дошкольник» для нулевого класса, «Выпускник» без класса, иначе класс («5 класс»)
461
1004
  */
462
1005
  getPupilRole() {
463
1006
  if (this.grade.index === 0) {
@@ -466,12 +1009,19 @@ var _User = class _User {
466
1009
  if (this.grade.index == null) return "\u0412\u044B\u043F\u0443\u0441\u043A\u043D\u0438\u043A";
467
1010
  return _User.getGradeString(this.grade.index);
468
1011
  }
1012
+ /**
1013
+ * Профиль строкой JSON — для печати в документ и передачи по сети.
1014
+ *
1015
+ * @returns JSON полей сущности
1016
+ */
469
1017
  toJson() {
470
1018
  return JSON.stringify(this.props);
471
1019
  }
472
1020
  /**
473
1021
  * Посетитель данными — то, что едет по сети и в состояние: сущность с методами не
474
1022
  * сериализуется. Своя копия на вызов: сущность неизменяема, и правка копии её не тронет.
1023
+ *
1024
+ * @returns Копия полей сущности данными
475
1025
  */
476
1026
  toDto() {
477
1027
  return _User.deepClone(this.props);