@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/api.d.cts +4 -19
- package/api.d.ts +4 -19
- package/api.js.flow +3 -26
- package/entities.cjs +572 -7
- package/entities.d.cts +535 -7
- package/entities.d.ts +535 -7
- package/entities.js +572 -7
- package/entities.js.flow +577 -7
- package/index.cjs +572 -7
- package/index.d.cts +710 -187
- package/index.d.ts +710 -187
- package/index.js +572 -7
- package/index.js.flow +829 -262
- package/package.json +5 -3
- package/plugins/autocomplete-email.d.cts +1 -1
- package/plugins/confirm-phone.d.cts +1 -1
- package/plugins/types-sRHKQ8xU.d.cts +1269 -0
- package/plugins/types-sRHKQ8xU.d.ts +1269 -0
- package/types-3Yq2Uj51.d.cts +33 -0
- package/types-BrKJGAOa.d.ts +33 -0
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
|
-
*
|
|
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
|
-
*
|
|
164
|
-
* @
|
|
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,9 +923,24 @@ 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
|
}
|
|
934
|
+
/**
|
|
935
|
+
* Форма посетителя по умолчанию ДАННЫМИ — гость со всеми полями: тому, кто отдаёт `UserDTO`
|
|
936
|
+
* наружу (хост — приложениям), нужна полная форма, а не сущность с методами. Своя копия на
|
|
937
|
+
* вызов: умолчания общие на процесс, и правка чужой копии их не тронет.
|
|
938
|
+
*
|
|
939
|
+
* @returns Новая копия умолчаний на каждый вызов
|
|
940
|
+
*/
|
|
941
|
+
static defaultDto() {
|
|
942
|
+
return this.deepClone(DEFAULT_USER);
|
|
943
|
+
}
|
|
410
944
|
/**
|
|
411
945
|
* Санитизирует строку: удаляет null-байты и обрезает пробелы
|
|
412
946
|
* @private
|
|
@@ -420,6 +954,13 @@ var _User = class _User {
|
|
|
420
954
|
}
|
|
421
955
|
return str.replace(/\x00/g, "").trim();
|
|
422
956
|
}
|
|
957
|
+
/**
|
|
958
|
+
* Сущность из профиля бэкенда (`UserDTO` в camelCase): строковые поля чистятся от null-байтов
|
|
959
|
+
* и пробелов по краям, остальное берётся как есть.
|
|
960
|
+
*
|
|
961
|
+
* @param input - Профиль в форме `UserDTO`
|
|
962
|
+
* @returns Сущность над копией профиля: исходный объект не трогается
|
|
963
|
+
*/
|
|
423
964
|
static fromApi(input) {
|
|
424
965
|
const sanitizedData = this.sanitizeUserData(this.deepClone(input));
|
|
425
966
|
return new _User(sanitizedData);
|
|
@@ -440,16 +981,26 @@ var _User = class _User {
|
|
|
440
981
|
shortName: this.sanitizeString(data.shortName)
|
|
441
982
|
});
|
|
442
983
|
}
|
|
984
|
+
/**
|
|
985
|
+
* Сущность собрана из умолчаний (`createDefault`), а не из профиля бэкенда.
|
|
986
|
+
*
|
|
987
|
+
* @returns `true` у гостя по умолчанию
|
|
988
|
+
*/
|
|
443
989
|
isDefaultUser() {
|
|
444
990
|
return this.isDefault;
|
|
445
991
|
}
|
|
992
|
+
/**
|
|
993
|
+
* Посетитель вошёл — у него есть идентификатор на бэкенде.
|
|
994
|
+
*
|
|
995
|
+
* @returns `true`, если `id` задан и положителен
|
|
996
|
+
*/
|
|
446
997
|
isLoggedIn() {
|
|
447
998
|
return this.id && this.id > 0 ? true : false;
|
|
448
999
|
}
|
|
449
1000
|
/**
|
|
450
|
-
*
|
|
1001
|
+
* Роль либо класс словом — для подписи в интерфейсе.
|
|
451
1002
|
*
|
|
452
|
-
* @returns
|
|
1003
|
+
* @returns «Дошкольник» для нулевого класса, «Выпускник» без класса, иначе класс («5 класс»)
|
|
453
1004
|
*/
|
|
454
1005
|
getPupilRole() {
|
|
455
1006
|
if (this.grade.index === 0) {
|
|
@@ -458,9 +1009,23 @@ var _User = class _User {
|
|
|
458
1009
|
if (this.grade.index == null) return "\u0412\u044B\u043F\u0443\u0441\u043A\u043D\u0438\u043A";
|
|
459
1010
|
return _User.getGradeString(this.grade.index);
|
|
460
1011
|
}
|
|
1012
|
+
/**
|
|
1013
|
+
* Профиль строкой JSON — для печати в документ и передачи по сети.
|
|
1014
|
+
*
|
|
1015
|
+
* @returns JSON полей сущности
|
|
1016
|
+
*/
|
|
461
1017
|
toJson() {
|
|
462
1018
|
return JSON.stringify(this.props);
|
|
463
1019
|
}
|
|
1020
|
+
/**
|
|
1021
|
+
* Посетитель данными — то, что едет по сети и в состояние: сущность с методами не
|
|
1022
|
+
* сериализуется. Своя копия на вызов: сущность неизменяема, и правка копии её не тронет.
|
|
1023
|
+
*
|
|
1024
|
+
* @returns Копия полей сущности данными
|
|
1025
|
+
*/
|
|
1026
|
+
toDto() {
|
|
1027
|
+
return _User.deepClone(this.props);
|
|
1028
|
+
}
|
|
464
1029
|
};
|
|
465
1030
|
_User.getGradeString = (index) => GRADE_MAP[index] || GRADE_MAP[1];
|
|
466
1031
|
var User = _User;
|