@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.js CHANGED
@@ -866,18 +866,34 @@ var DEFAULT_USER = {
866
866
  room: null,
867
867
  street: null
868
868
  },
869
+ admissionFinishesOn: null,
870
+ algoritmika: false,
869
871
  avatarUrl: "",
870
872
  bonus: {
871
873
  giftAmount: 0,
872
874
  realMoneyAmount: 0
873
875
  },
874
876
  bonusAmount: 0,
877
+ bonusesPageVisited: false,
878
+ canChangeSchoolInfo: false,
875
879
  cartItemsCount: 0,
876
880
  cartTemplateId: null,
877
881
  createdAt: null,
882
+ currentInterest: {
883
+ businessUnitAbbrs: [],
884
+ disciplineId: null,
885
+ gradeId: null,
886
+ levelId: null,
887
+ productFormat: null,
888
+ productId: null,
889
+ reason: null
890
+ },
878
891
  disciplineIds: [],
879
892
  email: "",
880
893
  emailConfirmed: false,
894
+ externshipDemoAccessActive: false,
895
+ externshipPaymentRequired: null,
896
+ externshipPromoHeaderOn: false,
881
897
  externshipUser: false,
882
898
  fakeEmail: false,
883
899
  fakeUser: false,
@@ -896,25 +912,37 @@ var DEFAULT_USER = {
896
912
  hasActivePurchases: false,
897
913
  hasAttemptsSolveExamRehearsals: false,
898
914
  hasBookmarks: false,
915
+ hasExamProgressAccess: false,
899
916
  hasExternshipAttestationAccess: false,
900
917
  hasPurchasedExternshipContracts: false,
918
+ hasYearlyRecapAccess: false,
901
919
  id: null,
902
920
  isAgent: false,
921
+ isAttestationSchoolManager: null,
903
922
  isCoach: false,
904
923
  isCustomer: null,
905
924
  isElementaryPupil: false,
906
925
  isExternshipCoach: false,
907
926
  isGraduated: false,
927
+ isMentor: false,
908
928
  isMiniGroupTeacher: false,
909
929
  isParent: false,
930
+ isXpStreakAvailable: false,
910
931
  lastName: "",
932
+ leaderboard: null,
933
+ leaderboardAccessState: "unavailable",
934
+ learningGoalsAccessState: "disabled",
911
935
  locale: null,
936
+ messengerSubscriptions: null,
912
937
  methodist: false,
913
938
  middleName: "",
939
+ needToPromoteRenewalWithCoach: false,
940
+ nextYearCoursesBannerAvailable: false,
914
941
  onboardingFinished: false,
915
942
  onboardingFinishedAt: null,
916
943
  parentPhone: null,
917
944
  parentPhoneConfirmed: false,
945
+ passwordSet: null,
918
946
  phone: null,
919
947
  phoneConfirmed: false,
920
948
  privacy: {
@@ -923,11 +951,13 @@ var DEFAULT_USER = {
923
951
  profileEnriched: false,
924
952
  purchaseAnyExternshipContracts: false,
925
953
  recapUuid: null,
954
+ referralCode: null,
926
955
  shortName: "",
927
956
  skype: null,
928
957
  socialNets: [],
929
958
  socializationProfile: null,
930
959
  tags: null,
960
+ targetActionsOnboardingAvailable: false,
931
961
  timezone: null,
932
962
  type: null,
933
963
  webSocketNotificationsJwt: null
@@ -939,8 +969,9 @@ var _User = class _User {
939
969
  this.props = props;
940
970
  this.isDefault = isDefault;
941
971
  /**
942
- * Возвращает роль пользователя
943
- * @returns {UserRole} роль как строка
972
+ * Роль словом — по флагам профиля, первый совпавший: репетитор, учитель, родитель.
973
+ *
974
+ * @returns «Репетитор», «Учитель», «Родитель», иначе роль ученика из `getPupilRole()`
944
975
  */
945
976
  this.getRole = () => {
946
977
  if (this.isCoach) return "\u0420\u0435\u043F\u0435\u0442\u0438\u0442\u043E\u0440";
@@ -956,206 +987,694 @@ var _User = class _User {
956
987
  }
957
988
  };
958
989
  /**
959
- * Возвращает фамилию и инициалы юзера
960
- * @param {User} user
961
- * @return {string} 'Пупкин В.'
990
+ * Фамилия с инициалами имени и отчества — подпись в списках.
991
+ *
992
+ * @returns Строка вида «Пупкин В. И.»; без отчества — «Пупкин В.»
962
993
  */
963
994
  this.getInitials = () => {
964
995
  var _a, _b;
965
996
  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()}.` : ""}`;
966
997
  };
967
998
  }
999
+ /**
1000
+ * Идентификатор посетителя на бэкенде.
1001
+ *
1002
+ * @returns Число либо `null` у гостя.
1003
+ */
968
1004
  get id() {
969
1005
  return this.props.id;
970
1006
  }
1007
+ /**
1008
+ * Почта посетителя.
1009
+ *
1010
+ * @returns Строка; пустая, если почты нет.
1011
+ */
971
1012
  get email() {
972
1013
  return this.props.email;
973
1014
  }
1015
+ /**
1016
+ * Имя.
1017
+ *
1018
+ * @returns Строка; пустая, если не заполнено.
1019
+ */
974
1020
  get firstName() {
975
1021
  return this.props.firstName;
976
1022
  }
1023
+ /**
1024
+ * Отчество.
1025
+ *
1026
+ * @returns Строка; пустая, если не заполнено.
1027
+ */
977
1028
  get middleName() {
978
1029
  return this.props.middleName;
979
1030
  }
1031
+ /**
1032
+ * Фамилия.
1033
+ *
1034
+ * @returns Строка; пустая, если не заполнено.
1035
+ */
980
1036
  get lastName() {
981
1037
  return this.props.lastName;
982
1038
  }
1039
+ /**
1040
+ * Полное имя, каким его собрал бэкенд.
1041
+ *
1042
+ * @returns Строка; пустая у гостя.
1043
+ */
983
1044
  get fullName() {
984
1045
  return this.props.fullName;
985
1046
  }
1047
+ /**
1048
+ * Короткое имя для обращения в интерфейсе.
1049
+ *
1050
+ * @returns Строка; пустая у гостя.
1051
+ */
986
1052
  get shortName() {
987
1053
  return this.props.shortName;
988
1054
  }
1055
+ /**
1056
+ * Когда заведён профиль.
1057
+ *
1058
+ * @returns Дата ISO либо `null` у гостя.
1059
+ */
989
1060
  get createdAt() {
990
1061
  return this.props.createdAt;
991
1062
  }
1063
+ /**
1064
+ * Часовой пояс посетителя.
1065
+ *
1066
+ * @returns Имя пояса либо `null`, если не задан.
1067
+ */
992
1068
  get timezone() {
993
1069
  return this.props.timezone;
994
1070
  }
1071
+ /**
1072
+ * Локаль интерфейса.
1073
+ *
1074
+ * @returns Код локали либо `null`, если не задана.
1075
+ */
995
1076
  get locale() {
996
1077
  return this.props.locale;
997
1078
  }
1079
+ /**
1080
+ * Класс посетителя: id, порядковый номер, имя и транслит.
1081
+ *
1082
+ * @returns Объект класса; у гостя поля `null` и пустые строки.
1083
+ */
998
1084
  get grade() {
999
1085
  return this.props.grade;
1000
1086
  }
1087
+ /**
1088
+ * Телефон посетителя.
1089
+ *
1090
+ * @returns Строка либо `null`, если не указан.
1091
+ */
1001
1092
  get phone() {
1002
1093
  return this.props.phone;
1003
1094
  }
1095
+ /**
1096
+ * Адрес аватара.
1097
+ *
1098
+ * @returns Строка; пустая, если аватара нет.
1099
+ */
1004
1100
  get avatarUrl() {
1005
1101
  return this.props.avatarUrl;
1006
1102
  }
1103
+ /**
1104
+ * Посетитель — родитель.
1105
+ *
1106
+ * @returns `true`, если роль родительская.
1107
+ */
1007
1108
  get isParent() {
1008
1109
  return this.props.isParent;
1009
1110
  }
1111
+ /**
1112
+ * Посетитель — выпускник.
1113
+ *
1114
+ * @returns `true`, если школу закончил.
1115
+ */
1010
1116
  get isGraduated() {
1011
1117
  return this.props.isGraduated;
1012
1118
  }
1119
+ /**
1120
+ * Класс подтверждён посетителем.
1121
+ *
1122
+ * @returns `true`, если класс проверен.
1123
+ */
1013
1124
  get gradeChecked() {
1014
1125
  return this.props.gradeChecked;
1015
1126
  }
1127
+ /**
1128
+ * Тип учётной записи на бэкенде.
1129
+ *
1130
+ * @returns `pupil`, `agent` либо `null` у гостя.
1131
+ */
1016
1132
  get type() {
1017
1133
  return this.props.type;
1018
1134
  }
1135
+ /**
1136
+ * Посетитель — репетитор.
1137
+ *
1138
+ * @returns `true`, если роль репетитора.
1139
+ */
1019
1140
  get isCoach() {
1020
1141
  return this.props.isCoach;
1021
1142
  }
1143
+ /**
1144
+ * Ведёт мини-группы.
1145
+ *
1146
+ * @returns `true`, если ведёт.
1147
+ */
1022
1148
  get isMiniGroupTeacher() {
1023
1149
  return this.props.isMiniGroupTeacher;
1024
1150
  }
1151
+ /**
1152
+ * Репетитор экстерната.
1153
+ *
1154
+ * @returns `true`, если ведёт экстернат.
1155
+ */
1025
1156
  get isExternshipCoach() {
1026
1157
  return this.props.isExternshipCoach;
1027
1158
  }
1159
+ /**
1160
+ * Посетитель — учитель.
1161
+ *
1162
+ * @returns `true`, если роль учителя.
1163
+ */
1028
1164
  get isAgent() {
1029
1165
  return this.props.isAgent;
1030
1166
  }
1167
+ /**
1168
+ * Посетитель — методист.
1169
+ *
1170
+ * @returns `true`, если методист.
1171
+ */
1031
1172
  get methodist() {
1032
1173
  return this.props.methodist;
1033
1174
  }
1175
+ /**
1176
+ * Почтовый адрес: страна, регион, город, улица, дом.
1177
+ *
1178
+ * @returns Объект адреса либо `null`, если не заполнен.
1179
+ */
1034
1180
  get address() {
1035
1181
  return this.props.address;
1036
1182
  }
1183
+ /**
1184
+ * Привязанные соцсети.
1185
+ *
1186
+ * @returns Список провайдеров с идентификаторами; пустой, если привязок нет.
1187
+ */
1037
1188
  get socialNets() {
1038
1189
  return this.props.socialNets;
1039
1190
  }
1191
+ /**
1192
+ * Логин в Skype.
1193
+ *
1194
+ * @returns Строка либо `null`.
1195
+ */
1040
1196
  get skype() {
1041
1197
  return this.props.skype;
1042
1198
  }
1199
+ /**
1200
+ * Настройки интерфейса: показанные подсказки и скрытые баннеры.
1201
+ *
1202
+ * @returns Объект флагов либо `undefined`, если бэкенд их не прислал.
1203
+ */
1043
1204
  get settings() {
1044
1205
  return this.props.settings;
1045
1206
  }
1207
+ /**
1208
+ * Бонусный счёт: подарочные и реальные бонусы.
1209
+ *
1210
+ * @returns Объект с суммами.
1211
+ */
1046
1212
  get bonus() {
1047
1213
  return this.props.bonus;
1048
1214
  }
1215
+ /**
1216
+ * Сумма бонусов на счёте.
1217
+ *
1218
+ * @returns Число.
1219
+ */
1049
1220
  get bonusAmount() {
1050
1221
  return this.props.bonusAmount;
1051
1222
  }
1223
+ /**
1224
+ * Есть действующие покупки.
1225
+ *
1226
+ * @returns `true`, если есть.
1227
+ */
1052
1228
  get hasActivePurchases() {
1053
1229
  return this.props.hasActivePurchases;
1054
1230
  }
1231
+ /**
1232
+ * Остались попытки пробных экзаменов.
1233
+ *
1234
+ * @returns `true`, если остались.
1235
+ */
1055
1236
  get hasAttemptsSolveExamRehearsals() {
1056
1237
  return this.props.hasAttemptsSolveExamRehearsals;
1057
1238
  }
1239
+ /**
1240
+ * Есть закладки.
1241
+ *
1242
+ * @returns `true`, если есть.
1243
+ */
1058
1244
  get hasBookmarks() {
1059
1245
  return this.props.hasBookmarks;
1060
1246
  }
1247
+ /**
1248
+ * Метки посетителя на бэкенде.
1249
+ *
1250
+ * @returns Список строк либо `null`.
1251
+ */
1061
1252
  get tags() {
1062
1253
  return this.props.tags;
1063
1254
  }
1255
+ /**
1256
+ * Шаблон корзины.
1257
+ *
1258
+ * @returns Число либо `null`.
1259
+ */
1064
1260
  get cartTemplateId() {
1065
1261
  return this.props.cartTemplateId;
1066
1262
  }
1263
+ /**
1264
+ * Сколько позиций в корзине.
1265
+ *
1266
+ * @returns Число.
1267
+ */
1067
1268
  get cartItemsCount() {
1068
1269
  return this.props.cartItemsCount;
1069
1270
  }
1271
+ /**
1272
+ * Онбординг пройден.
1273
+ *
1274
+ * @returns `true`, если пройден.
1275
+ */
1070
1276
  get onboardingFinished() {
1071
1277
  return this.props.onboardingFinished;
1072
1278
  }
1279
+ /**
1280
+ * Когда пройден онбординг.
1281
+ *
1282
+ * @returns Дата ISO либо `null`, пока не пройден.
1283
+ */
1073
1284
  get onboardingFinishedAt() {
1074
1285
  return this.props.onboardingFinishedAt;
1075
1286
  }
1287
+ /**
1288
+ * Почта подтверждена.
1289
+ *
1290
+ * @returns `true`, если подтверждена.
1291
+ */
1076
1292
  get emailConfirmed() {
1077
1293
  return this.props.emailConfirmed;
1078
1294
  }
1295
+ /**
1296
+ * Телефон подтверждён.
1297
+ *
1298
+ * @returns `true`, если подтверждён.
1299
+ */
1079
1300
  get phoneConfirmed() {
1080
1301
  return this.props.phoneConfirmed;
1081
1302
  }
1303
+ /**
1304
+ * Почта выдумана бэкендом при регистрации без почты.
1305
+ *
1306
+ * @returns `true`, если почта ненастоящая.
1307
+ */
1082
1308
  get fakeEmail() {
1083
1309
  return this.props.fakeEmail;
1084
1310
  }
1311
+ /**
1312
+ * Посетитель заведён бэкендом без его участия (например, по заявке).
1313
+ *
1314
+ * @returns `true`, если учётная запись ненастоящая.
1315
+ */
1085
1316
  get fakeUser() {
1086
1317
  return this.props.fakeUser;
1087
1318
  }
1319
+ /**
1320
+ * Профиль дополнен данными после регистрации.
1321
+ *
1322
+ * @returns `true`, если дополнен.
1323
+ */
1088
1324
  get profileEnriched() {
1089
1325
  return this.props.profileEnriched;
1090
1326
  }
1327
+ /**
1328
+ * Идентификатор итогов года.
1329
+ *
1330
+ * @returns Строка либо `null`, если итогов нет.
1331
+ */
1091
1332
  get recapUuid() {
1092
1333
  return this.props.recapUuid;
1093
1334
  }
1335
+ /**
1336
+ * Дисциплины, которые изучает посетитель.
1337
+ *
1338
+ * @returns Список id; пустой, если не выбраны.
1339
+ */
1094
1340
  get disciplineIds() {
1095
1341
  return this.props.disciplineIds;
1096
1342
  }
1343
+ /**
1344
+ * Настройки приватности.
1345
+ *
1346
+ * @returns Объект с флагом публичного профиля.
1347
+ */
1097
1348
  get privacy() {
1098
1349
  return this.props.privacy;
1099
1350
  }
1351
+ /**
1352
+ * Телефон родителя.
1353
+ *
1354
+ * @returns Строка либо `null`.
1355
+ */
1100
1356
  get parentPhone() {
1101
1357
  return this.props.parentPhone;
1102
1358
  }
1359
+ /**
1360
+ * Телефон родителя подтверждён.
1361
+ *
1362
+ * @returns `true`, если подтверждён.
1363
+ */
1103
1364
  get parentPhoneConfirmed() {
1104
1365
  return this.props.parentPhoneConfirmed;
1105
1366
  }
1367
+ /**
1368
+ * Посетитель что-то покупал.
1369
+ *
1370
+ * @returns `true`, `false` либо `null`, если бэкенд не считал.
1371
+ */
1106
1372
  get isCustomer() {
1107
1373
  return this.props.isCustomer;
1108
1374
  }
1375
+ /**
1376
+ * Доступны многодневные серии занятий.
1377
+ *
1378
+ * @returns `true`, если доступны.
1379
+ */
1109
1380
  get hasAccessToMultiDaysStreaks() {
1110
1381
  return this.props.hasAccessToMultiDaysStreaks;
1111
1382
  }
1383
+ /**
1384
+ * Ученик начальной школы.
1385
+ *
1386
+ * @returns `true`, если начальная школа.
1387
+ */
1112
1388
  get isElementaryPupil() {
1113
1389
  return this.props.isElementaryPupil;
1114
1390
  }
1391
+ /**
1392
+ * Токен для канала уведомлений по WebSocket.
1393
+ *
1394
+ * @returns Строка либо `null`, если канала нет.
1395
+ */
1115
1396
  get webSocketNotificationsJwt() {
1116
1397
  return this.props.webSocketNotificationsJwt;
1117
1398
  }
1399
+ /**
1400
+ * Доступны аттестационные листы.
1401
+ *
1402
+ * @returns `true`, если доступны.
1403
+ */
1118
1404
  get hasAccessToAttestationSheets() {
1119
1405
  return this.props.hasAccessToAttestationSheets;
1120
1406
  }
1407
+ /**
1408
+ * Посетитель учится в экстернате.
1409
+ *
1410
+ * @returns `true`, если экстернат.
1411
+ */
1121
1412
  get externshipUser() {
1122
1413
  return this.props.externshipUser;
1123
1414
  }
1415
+ /**
1416
+ * Есть оплаченные договоры экстерната.
1417
+ *
1418
+ * @returns `true`, если есть.
1419
+ */
1124
1420
  get hasPurchasedExternshipContracts() {
1125
1421
  return this.props.hasPurchasedExternshipContracts;
1126
1422
  }
1423
+ /**
1424
+ * Доступна аттестация экстерната.
1425
+ *
1426
+ * @returns `true`, если доступна.
1427
+ */
1127
1428
  get hasExternshipAttestationAccess() {
1128
1429
  return this.props.hasExternshipAttestationAccess;
1129
1430
  }
1431
+ /**
1432
+ * Профиль в разделе социализации.
1433
+ *
1434
+ * @returns Объект с id и состоянием либо `null`, если профиля нет.
1435
+ */
1130
1436
  get socializationProfile() {
1131
1437
  return this.props.socializationProfile;
1132
1438
  }
1439
+ /**
1440
+ * Когда заканчивается бесплатный доступ.
1441
+ *
1442
+ * @returns Дата ISO либо `null`, если доступа нет.
1443
+ */
1133
1444
  get freeAccessFinishesAt() {
1134
1445
  return this.props.freeAccessFinishesAt;
1135
1446
  }
1447
+ /**
1448
+ * В комнате начальной школы есть непросмотренные новинки.
1449
+ *
1450
+ * @returns `true`, если есть; `undefined`, если бэкенд не прислал.
1451
+ */
1136
1452
  get hasUnseenRoomFeatures() {
1137
1453
  return this.props.hasUnseenRoomFeatures;
1138
1454
  }
1455
+ /**
1456
+ * Покупал договоры экстерната.
1457
+ *
1458
+ * @returns `true`, если покупал.
1459
+ */
1139
1460
  get purchaseAnyExternshipContracts() {
1140
1461
  return this.props.purchaseAnyExternshipContracts;
1141
1462
  }
1463
+ /**
1464
+ * Связан с экстернатом: ученик, родитель либо репетитор.
1465
+ *
1466
+ * @returns `true`, если связан; `undefined`, если бэкенд не прислал.
1467
+ */
1142
1468
  get hasExternshipRelation() {
1143
1469
  return this.props.hasExternshipRelation;
1144
1470
  }
1471
+ /**
1472
+ * Есть действующий договор экстерната.
1473
+ *
1474
+ * @returns `true`, если есть; `undefined`, если бэкенд не прислал.
1475
+ */
1145
1476
  get hasExternshipActiveContract() {
1146
1477
  return this.props.hasExternshipActiveContract;
1147
1478
  }
1479
+ /**
1480
+ * Можно продлить договор домашней школы.
1481
+ *
1482
+ * @returns `true`, если можно; `undefined`, если бэкенд не прислал.
1483
+ */
1148
1484
  get canProlongateContract() {
1149
1485
  return this.props.canProlongateContract;
1150
1486
  }
1487
+ /**
1488
+ * Окно пролонгации договора: даты, скидка, заголовок следующего года.
1489
+ *
1490
+ * @returns Объект окна, `null` либо `undefined`, если окна нет.
1491
+ */
1151
1492
  get prolongation() {
1152
1493
  return this.props.prolongation;
1153
1494
  }
1495
+ /**
1496
+ * Текущий интерес посетителя: класс, дисциплина, уровень, формат и причина. Та же форма, что у `GET /api/user/user_interest`, но из профиля, без похода.
1497
+ *
1498
+ * @returns Объект интереса либо `null`, если бэкенд не считал.
1499
+ */
1500
+ get currentInterest() {
1501
+ return this.props.currentInterest;
1502
+ }
1503
+ /**
1504
+ * До какой даты открыт приём в домашнюю школу.
1505
+ *
1506
+ * @returns Дата либо `null`, если приём не идёт.
1507
+ */
1508
+ get admissionFinishesOn() {
1509
+ return this.props.admissionFinishesOn;
1510
+ }
1511
+ /**
1512
+ * Посетитель пришёл из Алгоритмики — партнёрский вход с другой площадки.
1513
+ *
1514
+ * @returns `true`, если из Алгоритмики.
1515
+ */
1516
+ get algoritmika() {
1517
+ return this.props.algoritmika;
1518
+ }
1519
+ /**
1520
+ * Страница бонусов уже открывалась — подсказки на ней больше не показываются.
1521
+ *
1522
+ * @returns `true`, если открывалась.
1523
+ */
1524
+ get bonusesPageVisited() {
1525
+ return this.props.bonusesPageVisited;
1526
+ }
1527
+ /**
1528
+ * Посетителю разрешено менять школу и класс в профиле.
1529
+ *
1530
+ * @returns `true`, если разрешено.
1531
+ */
1532
+ get canChangeSchoolInfo() {
1533
+ return this.props.canChangeSchoolInfo;
1534
+ }
1535
+ /**
1536
+ * Идёт демо-доступ к экстернату.
1537
+ *
1538
+ * @returns `true`, пока демо активно.
1539
+ */
1540
+ get externshipDemoAccessActive() {
1541
+ return this.props.externshipDemoAccessActive;
1542
+ }
1543
+ /**
1544
+ * Экстернат ждёт оплаты: когда закроется доступ и по какому договору.
1545
+ *
1546
+ * @returns Объект с датой и id договора либо `null`, если долга нет.
1547
+ */
1548
+ get externshipPaymentRequired() {
1549
+ return this.props.externshipPaymentRequired;
1550
+ }
1551
+ /**
1552
+ * Показывать промо-шапку экстерната.
1553
+ *
1554
+ * @returns `true`, если показывать.
1555
+ */
1556
+ get externshipPromoHeaderOn() {
1557
+ return this.props.externshipPromoHeaderOn;
1558
+ }
1559
+ /**
1560
+ * Доступен раздел прогресса подготовки к экзаменам.
1561
+ *
1562
+ * @returns `true`, если доступен.
1563
+ */
1564
+ get hasExamProgressAccess() {
1565
+ return this.props.hasExamProgressAccess;
1566
+ }
1567
+ /**
1568
+ * Доступны итоги года; их адрес — `recapUuid`.
1569
+ *
1570
+ * @returns `true`, если доступны.
1571
+ */
1572
+ get hasYearlyRecapAccess() {
1573
+ return this.props.hasYearlyRecapAccess;
1574
+ }
1575
+ /**
1576
+ * Управляет аттестационной школой.
1577
+ *
1578
+ * @returns `true`, `false` либо `null`, если бэкенд не считал.
1579
+ */
1580
+ get isAttestationSchoolManager() {
1581
+ return this.props.isAttestationSchoolManager;
1582
+ }
1583
+ /**
1584
+ * Посетитель — наставник.
1585
+ *
1586
+ * @returns `true`, если наставник.
1587
+ */
1588
+ get isMentor() {
1589
+ return this.props.isMentor;
1590
+ }
1591
+ /**
1592
+ * Доступна серия ежедневных занятий с опытом (XP-стрик).
1593
+ *
1594
+ * @returns `true`, если доступна.
1595
+ */
1596
+ get isXpStreakAvailable() {
1597
+ return this.props.isXpStreakAvailable;
1598
+ }
1599
+ /**
1600
+ * Таблица лидеров: доступна ли посетителю и готов ли он к ней (выбор курса).
1601
+ *
1602
+ * @returns Объект состояний либо `null`, если посетитель вне программы.
1603
+ */
1604
+ get leaderboard() {
1605
+ return this.props.leaderboard;
1606
+ }
1607
+ /**
1608
+ * Состояние доступа к таблице лидеров.
1609
+ *
1610
+ * @returns `unavailable`, `available`, `vacation` либо `disabled`.
1611
+ */
1612
+ get leaderboardAccessState() {
1613
+ return this.props.leaderboardAccessState;
1614
+ }
1615
+ /**
1616
+ * Как устроены учебные цели у посетителя.
1617
+ *
1618
+ * @returns `enabled`, `disabled`, `optional` либо `required`.
1619
+ */
1620
+ get learningGoalsAccessState() {
1621
+ return this.props.learningGoalsAccessState;
1622
+ }
1623
+ /**
1624
+ * Мессенджеры, на которые посетитель подписан на уведомления.
1625
+ *
1626
+ * @returns Список либо `null`, если бэкенд не считал.
1627
+ */
1628
+ get messengerSubscriptions() {
1629
+ return this.props.messengerSubscriptions;
1630
+ }
1631
+ /**
1632
+ * Пора предлагать продление занятий с репетитором.
1633
+ *
1634
+ * @returns `true`, если пора.
1635
+ */
1636
+ get needToPromoteRenewalWithCoach() {
1637
+ return this.props.needToPromoteRenewalWithCoach;
1638
+ }
1639
+ /**
1640
+ * Показывать баннер курсов следующего учебного года.
1641
+ *
1642
+ * @returns `true`, если показывать.
1643
+ */
1644
+ get nextYearCoursesBannerAvailable() {
1645
+ return this.props.nextYearCoursesBannerAvailable;
1646
+ }
1647
+ /**
1648
+ * Пароль задан — вход не только через код или соцсеть.
1649
+ *
1650
+ * @returns `true`, `false` либо `null`, если бэкенд не считал.
1651
+ */
1652
+ get passwordSet() {
1653
+ return this.props.passwordSet;
1654
+ }
1655
+ /**
1656
+ * Реферальный код для программы «приведи друга».
1657
+ *
1658
+ * @returns Строка либо `null`, если код не выдан.
1659
+ */
1660
+ get referralCode() {
1661
+ return this.props.referralCode;
1662
+ }
1663
+ /**
1664
+ * Доступен онбординг целевых действий.
1665
+ *
1666
+ * @returns `true`, если доступен.
1667
+ */
1668
+ get targetActionsOnboardingAvailable() {
1669
+ return this.props.targetActionsOnboardingAvailable;
1670
+ }
1154
1671
  /**
1155
1672
  * Идёт ли сейчас окно пролонгации договора домашней школы.
1156
1673
  *
1157
1674
  * Границы включаются: последний день окна ещё считается пролонгацией. Не заданная граница
1158
1675
  * означает, что окна нет вовсе, а не что оно бесконечно.
1676
+ *
1677
+ * @returns `true`, если сегодня внутри окна включительно
1159
1678
  */
1160
1679
  isProlongationBetweenDates() {
1161
1680
  var _a;
@@ -1201,6 +1720,11 @@ var _User = class _User {
1201
1720
  });
1202
1721
  return clonedObj;
1203
1722
  }
1723
+ /**
1724
+ * Гость — сущность с умолчаниями всех полей и признаком `isDefaultUser()`.
1725
+ *
1726
+ * @returns Новая сущность на каждый вызов: умолчания общие на процесс, копия своя.
1727
+ */
1204
1728
  static createDefault() {
1205
1729
  return new _User(this.deepClone(DEFAULT_USER), true);
1206
1730
  }
@@ -1208,6 +1732,8 @@ var _User = class _User {
1208
1732
  * Форма посетителя по умолчанию ДАННЫМИ — гость со всеми полями: тому, кто отдаёт `UserDTO`
1209
1733
  * наружу (хост — приложениям), нужна полная форма, а не сущность с методами. Своя копия на
1210
1734
  * вызов: умолчания общие на процесс, и правка чужой копии их не тронет.
1735
+ *
1736
+ * @returns Новая копия умолчаний на каждый вызов
1211
1737
  */
1212
1738
  static defaultDto() {
1213
1739
  return this.deepClone(DEFAULT_USER);
@@ -1225,6 +1751,13 @@ var _User = class _User {
1225
1751
  }
1226
1752
  return str.replace(/\x00/g, "").trim();
1227
1753
  }
1754
+ /**
1755
+ * Сущность из профиля бэкенда (`UserDTO` в camelCase): строковые поля чистятся от null-байтов
1756
+ * и пробелов по краям, остальное берётся как есть.
1757
+ *
1758
+ * @param input - Профиль в форме `UserDTO`
1759
+ * @returns Сущность над копией профиля: исходный объект не трогается
1760
+ */
1228
1761
  static fromApi(input) {
1229
1762
  const sanitizedData = this.sanitizeUserData(this.deepClone(input));
1230
1763
  return new _User(sanitizedData);
@@ -1245,16 +1778,26 @@ var _User = class _User {
1245
1778
  shortName: this.sanitizeString(data.shortName)
1246
1779
  });
1247
1780
  }
1781
+ /**
1782
+ * Сущность собрана из умолчаний (`createDefault`), а не из профиля бэкенда.
1783
+ *
1784
+ * @returns `true` у гостя по умолчанию
1785
+ */
1248
1786
  isDefaultUser() {
1249
1787
  return this.isDefault;
1250
1788
  }
1789
+ /**
1790
+ * Посетитель вошёл — у него есть идентификатор на бэкенде.
1791
+ *
1792
+ * @returns `true`, если `id` задан и положителен
1793
+ */
1251
1794
  isLoggedIn() {
1252
1795
  return this.id && this.id > 0 ? true : false;
1253
1796
  }
1254
1797
  /**
1255
- * Возвращает тектовое представление роли / класса пользователя
1798
+ * Роль либо класс словом — для подписи в интерфейсе.
1256
1799
  *
1257
- * @returns {UserRole}
1800
+ * @returns «Дошкольник» для нулевого класса, «Выпускник» без класса, иначе класс («5 класс»)
1258
1801
  */
1259
1802
  getPupilRole() {
1260
1803
  if (this.grade.index === 0) {
@@ -1263,12 +1806,19 @@ var _User = class _User {
1263
1806
  if (this.grade.index == null) return "\u0412\u044B\u043F\u0443\u0441\u043A\u043D\u0438\u043A";
1264
1807
  return _User.getGradeString(this.grade.index);
1265
1808
  }
1809
+ /**
1810
+ * Профиль строкой JSON — для печати в документ и передачи по сети.
1811
+ *
1812
+ * @returns JSON полей сущности
1813
+ */
1266
1814
  toJson() {
1267
1815
  return JSON.stringify(this.props);
1268
1816
  }
1269
1817
  /**
1270
1818
  * Посетитель данными — то, что едет по сети и в состояние: сущность с методами не
1271
1819
  * сериализуется. Своя копия на вызов: сущность неизменяема, и правка копии её не тронет.
1820
+ *
1821
+ * @returns Копия полей сущности данными
1272
1822
  */
1273
1823
  toDto() {
1274
1824
  return _User.deepClone(this.props);