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