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