@foxford/sdk 5.0.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/README.mdx ADDED
@@ -0,0 +1,493 @@
1
+ Пакет SDK для работы с платформой Foxford. Предоставляет типизированный интерфейс для взаимодействия с API Foxford и управление виджетами.
2
+
3
+ ## Основные компоненты
4
+
5
+ ### Foxford - основной класс
6
+
7
+ Класс Foxford является точкой входа в SDK. Инициализируется с конфигурацией и предоставляет доступ ко всем сервисам.
8
+
9
+ **Конструктор:**
10
+ ```typescript
11
+ new Foxford(config?: FoxfordConfig)
12
+ ```
13
+
14
+ **Свойства:**
15
+
16
+ - `user` - UserService для управления пользовательскими данными
17
+ - `cart` - CartService для работы с корзиной
18
+ - `course` - CourseService для получения информации о курсах
19
+ - `promo` - PromoService для работы с промокодами
20
+ - `tag` - TagService для управления тегами
21
+ - `widgets` - Widgets для инициализации виджетов
22
+ - `productPack` - ProductPackService для работы с пакетами продуктов
23
+ - `appOptions` - AppOptionsService для получения опций приложения
24
+ - `captcha` - CaptchaService для работы с капчей
25
+
26
+ **Методы:**
27
+
28
+ - `shortURL(url: string): Promise<ApiResponse<unknown>>` - создание короткой ссылки
29
+ - `applyPlugin(plugin: SdkPlugin): void` - применение плагина к SDK
30
+
31
+ ### Конфигурация (FoxfordConfig)
32
+
33
+ ```typescript
34
+ interface FoxfordConfig {
35
+ host?: string // Базовый URL API (по умолчанию: https://foxford.ru)
36
+ widgetsVersion?: 'latest' | string // Версия виджетов (deprecated)
37
+ antibot?: boolean // Включить антимеханизм защиты (по умолчанию: true)
38
+ antibotConfig?: FoxfordAntibotConfig // Конфигурация антибота
39
+ api?: ApiConfig // Дополнительная конфигурация API
40
+ captchaConfig?: () => CaptchaConfig // Конфигурация капчи
41
+ widgetsConfig?: WidgetsInitConfig // Конфигурация виджетов (deprecated)
42
+ }
43
+ ```
44
+
45
+ ### События SDK
46
+
47
+ ```typescript
48
+ static events = {
49
+ FETCH_APP_OPTIONS: 'Foxford.app_options.fetch',
50
+ LR_REGISTRATION_SET: 'LR_REGISTRATION_SET'
51
+ }
52
+ ```
53
+
54
+ ---
55
+
56
+ ## Сервисы
57
+
58
+ ### UserService
59
+
60
+ Предоставляет методы для работы с пользовательскими данными.
61
+
62
+ **Методы:**
63
+
64
+ - `async addTag(id: number): Promise<unknown>` - добавить тег пользователю
65
+ - `async enrollCourse(id: number): Promise<void>` - записать пользователя на курс (deprecated, используйте CourseService)
66
+
67
+ ### CartService
68
+
69
+ Работа с корзиной.
70
+
71
+ **Методы:**
72
+
73
+ - `createCartItem(id: number, type: CartItemResourceType): CartItemDTO` - создать объект элемента корзины
74
+ - `async addCartItemToCart(cartItem: CartItemDTO): Promise<unknown>` - добавить элемент в корзину
75
+
76
+ ### CourseService
77
+
78
+ Работа с курсами.
79
+
80
+ **Методы:**
81
+
82
+ - `async getCourse(id: number): Promise<Course>` - получить информацию о курсе по ID
83
+ - `async enrollCourse(id: number): Promise<void>` - записать пользователя на курс
84
+
85
+ **Пример:**
86
+ ```typescript
87
+ const course = await sdk.course.getCourse(123)
88
+ await sdk.course.enrollCourse(123)
89
+ ```
90
+
91
+ ### PromoService
92
+
93
+ Работа с промокодами и акциями.
94
+
95
+ **Методы:**
96
+
97
+ - `async checkPromocode(code: string): Promise<unknown>` - проверить валидность промокода
98
+ - `async trackCodeCampaign(promoCode: string): Promise<void>` - записать факт показа промокода
99
+
100
+ ### TagService
101
+
102
+ Управление тегами пользователей.
103
+
104
+ **Методы:**
105
+
106
+ - `async addTag(id: number): Promise<unknown>` - добавить тег пользователю
107
+
108
+ ### WidgetsService
109
+
110
+ Инициализация и управление виджетами Foxford.
111
+
112
+ **Типы:**
113
+
114
+ ```typescript
115
+ type Widget = {
116
+ name: 'menu' | 'reviews' | 'featuredCoaches' | 'coachEnrollment' |
117
+ 'shortForm' | 'userTypePrompt' | 'teachersSlider' | 'externshipFormats'
118
+ options: Record<string, any>
119
+ container?: HTMLElement
120
+ }
121
+
122
+ type WidgetsInitConfig = {
123
+ version?: 'latest' | string
124
+ locale?: 'ru'
125
+ }
126
+ ```
127
+
128
+ **Методы:**
129
+
130
+ - `async create(config: WidgetsConfig): Promise<void>` - инициализировать виджеты
131
+ - `async update(name: string, config: Widget): Promise<void>` - обновить существующий виджет
132
+
133
+ **Пример:**
134
+ ```typescript
135
+ await sdk.widgets.create({
136
+ widgets: [
137
+ {
138
+ name: 'menu',
139
+ options: { /* опции */ }
140
+ }
141
+ ]
142
+ })
143
+ ```
144
+
145
+ ### ProductPackService
146
+
147
+ Работа с пакетами продуктов.
148
+
149
+ **Методы:**
150
+
151
+ - `async getProductPack(id: number): Promise<ProductPack>` - получить информацию о пакете продукта по ID
152
+
153
+ ### AppOptionsService
154
+
155
+ Получение опций приложения (настройки, флаги экспериментов и т.д.).
156
+
157
+ **Методы:**
158
+
159
+ - `async getCurrentAppOptions(): Promise<AppOptions>` - получить текущие опции (с кешированием)
160
+ - `async getAppOptions(): Promise<AppOptions>` - получить опции из API
161
+
162
+ ---
163
+
164
+ ## Сущности и типы данных
165
+
166
+ ### UserDTO
167
+
168
+ ```typescript
169
+ interface UserDTO {
170
+ id: null | number
171
+ email: string
172
+ firstName: string
173
+ middleName: string
174
+ lastName: string
175
+ fullName: string
176
+ shortName: string
177
+ createdAt: null | string
178
+ timezone: null | string
179
+ locale: null | string
180
+ grade: { id: null | number; index: null | number; name: null | string; translit: null | string }
181
+ phone: null | string
182
+ avatarUrl: string
183
+ isParent: boolean
184
+ isGraduated: boolean
185
+ gradeChecked: boolean
186
+ type: null | 'pupil' | 'agent'
187
+ isCoach: boolean
188
+ isMiniGroupTeacher: boolean
189
+ isExternshipCoach: boolean
190
+ isAgent: boolean
191
+ methodist: boolean
192
+ address: { /* адресные данные */ } | null
193
+ socialNets: Array<{ provider: 'facebook' | 'google_oauth2' | ...; uid: number }>
194
+ skype: null | string
195
+ settings?: { /* настройки пользователя */ }
196
+ bonus: { giftAmount: number; realMoneyAmount: number }
197
+ bonusAmount: number
198
+ hasActivePurchases: boolean
199
+ hasAttemptsSolveExamRehearsals: boolean
200
+ hasBookmarks: boolean
201
+ tags: null | string[]
202
+ cartTemplateId: null | number
203
+ cartItemsCount: number
204
+ onboardingFinished: boolean
205
+ emailConfirmed: boolean
206
+ phoneConfirmed: boolean
207
+ // ... и другие поля
208
+ }
209
+ ```
210
+
211
+ ### ProductPack
212
+
213
+ ```typescript
214
+ type ProductPack = {
215
+ name: string
216
+ description: string
217
+ meta_title: string
218
+ meta_description: string
219
+ published: true
220
+ content_description: string
221
+ disciplines_scope: string
222
+ guaranteed_admission: true
223
+ grade_names: string
224
+ is_purchased: false
225
+ learning_flow: { title: string; steps: Array<{ header: string; description: string }> }
226
+ offers: { intro: string; items: Array<{ title: string; description: string }> }
227
+ price_block: {
228
+ price: number
229
+ initial_price: number
230
+ title: string
231
+ description: string
232
+ points: Array<string>
233
+ price_per_month: number
234
+ initial_price_per_month: number
235
+ }
236
+ product_pack_items: Array<ProductTypeItem>
237
+ faq_items: Array<{ question: string; answer: string }>
238
+ landing_image_urls: Array<string>
239
+ }
240
+ ```
241
+
242
+ ---
243
+
244
+ ## Плагины
245
+
246
+ ### ConfirmPhone
247
+
248
+ Плагин для подтверждения номера телефона в формах.
249
+
250
+ **Конструктор:**
251
+ ```typescript
252
+ new ConfirmPhone(node: HTMLInputElement, options?: IConfirmPhoneOptions)
253
+ ```
254
+
255
+ **Методы:**
256
+
257
+ - `apply(sdk: Foxford): void` - применить плагин к SDK
258
+ - `destroy(): void` - удалить плагин
259
+ - `requestCode(payloadData: TRequestData): Promise<TRequestResponse>` - запросить код подтверждения
260
+ - `confirmCode(payloadData: TConfirmData): Promise<TConfirmResponse>` - подтвердить код
261
+
262
+ **Опции конфигурации:**
263
+
264
+ ```typescript
265
+ {
266
+ className?: string // CSS класс контейнера
267
+ confirmCodeInvalidText?: string // Текст ошибки неверного кода
268
+ confirmCodePlaceholderText?: string // Плейсхолдер поля кода
269
+ confirmedInputClassName?: string // CSS класс подтвержденного поля
270
+ disabledClassName?: string // CSS класс отключенного состояния
271
+ errorClassName?: string // CSS класс ошибки
272
+ hiddenClassName?: string // CSS класс скрытого элемента
273
+ inputParentsToHide?: string[] // Элементы-родители для скрытия
274
+ requestButtonText?: string // Текст кнопки запроса кода
275
+ retryButtonText?: string // Текст кнопки повторной отправки
276
+ sendCodeButtonText?: string // Текст кнопки отправки кода
277
+ unconfirmedHintText?: string // Текст подсказки неподтвержденного номера
278
+ untilRetryText?: string // Текст таймера повторной отправки
279
+ userData?: { phone: string; phoneConfirmed: boolean } // Данные пользователя
280
+ }
281
+ ```
282
+
283
+ ### EmailAutocomplete
284
+
285
+ Плагин для автодополнения email-адресов с проверкой на опечатки (используется алгоритм Левенштейна).
286
+
287
+ **Конструктор:**
288
+ ```typescript
289
+ new EmailAutocomplete(node: HTMLInputElement, options?: EacOptions)
290
+ ```
291
+
292
+ **Методы:**
293
+
294
+ - `apply(): void` - применить плагин к полю ввода
295
+ - `destroy(): void` - удалить плагин
296
+ - `clear(): void` - очистить состояние плагина
297
+
298
+ **Опции конфигурации:**
299
+
300
+ ```typescript
301
+ {
302
+ emailDomains?: string[] // Список доменов для автодополнения (по умолчанию: gmail.com, mail.ru, yandex.ru и др.)
303
+ suggestionClass?: string // CSS класс для отображения автодополнения
304
+ suggestionColor?: string // Цвет текста автодополнения
305
+ suitableColor?: string // Цвет сообщения "возможно, вы имели в виду"
306
+ suitableEmailColor?: string // Цвет email-адреса в подсказке
307
+ suitableFontSize?: string // Размер шрифта подсказки
308
+ suitableLineHeight?: string // Высота строки подсказки
309
+ suitableLevenshteinTreshold?: number // Допустимое расстояние Левенштейна (по умолчанию: 5)
310
+
311
+ onAutocomplete?(value: string): void // Коллбек при автодополнении
312
+ onShowSuitableEmail?(): void // Коллбек при показе подсказки
313
+ onClickSuitableEmail?(): void // Коллбек при клике на подсказку
314
+ onHideSuitableEmail?(): void // Коллбек при скрытии подсказки
315
+ }
316
+ ```
317
+
318
+ ---
319
+
320
+ ## Антимеханизм защиты (FoxfordAntibot)
321
+
322
+ Механизм для борьбы с автоматизированными запросами.
323
+
324
+ **Конструктор:**
325
+ ```typescript
326
+ new FoxfordAntibot(config?: FoxfordAntibotConfig)
327
+ ```
328
+
329
+ **Опции конфигурации:**
330
+
331
+ ```typescript
332
+ {
333
+ antibotFrameSrc?: string // URL для антимеханизма (по умолчанию: https://foxford.ru/antibot/ping)
334
+ antibotOnload?(e: Event): void // Коллбек при успешной инициализации
335
+ antibotOnerror?(): void // Коллбек при ошибке инициализации
336
+ debug?: boolean // Режим отладки
337
+ }
338
+ ```
339
+
340
+ ---
341
+
342
+ ## API плагины
343
+
344
+ SDK поставляется с набором встроенных API плагинов:
345
+
346
+ - `CamelizeRequestPlugin` - трансформация snake_case в camelCase для запросов к API
347
+ - `ReferrerRequestPlugin` - добавление реферера в заголовки запросов
348
+ - `DataLayerEventDispatcherPlugin` - отправка событий в dataLayer для Google Analytics
349
+ - `CaptchaPlugin` - интеграция с капчей
350
+
351
+ ---
352
+
353
+ ## Примеры использования
354
+
355
+ ### Инициализация SDK
356
+
357
+ ```typescript
358
+ import { Foxford } from '@foxford/sdk'
359
+
360
+ const sdk = new Foxford({
361
+ host: 'https://foxford.ru',
362
+ antibot: true,
363
+ widgetsConfig: {
364
+ locale: 'ru'
365
+ }
366
+ })
367
+ ```
368
+
369
+ ### Работа с курсами
370
+
371
+ ```typescript
372
+ // Получить информацию о курсе
373
+ const course = await sdk.course.getCourse(123)
374
+ console.log(course)
375
+
376
+ // Записаться на курс
377
+ await sdk.course.enrollCourse(123)
378
+ ```
379
+
380
+ ### Работа с корзиной
381
+
382
+ ```typescript
383
+ // Создать элемент корзины
384
+ const cartItem = sdk.cart.createCartItem(456, 'course')
385
+
386
+ // Добавить в корзину
387
+ await sdk.cart.addCartItemToCart(cartItem)
388
+ ```
389
+
390
+ ### Работа с промокодами
391
+
392
+ ```typescript
393
+ // Проверить промокод
394
+ const result = await sdk.promo.checkPromocode('DISCOUNT2024')
395
+ console.log(result)
396
+
397
+ // Записать факт показа промокода
398
+ await sdk.promo.trackCodeCampaign('DISCOUNT2024')
399
+ ```
400
+
401
+ ### Инициализация виджетов
402
+
403
+ ```typescript
404
+ await sdk.widgets.create({
405
+ locale: 'ru',
406
+ widgets: [
407
+ {
408
+ name: 'menu',
409
+ options: {}
410
+ },
411
+ {
412
+ name: 'reviews',
413
+ options: { limit: 5 }
414
+ },
415
+ {
416
+ name: 'featuredCoaches',
417
+ options: { count: 3 }
418
+ }
419
+ ]
420
+ })
421
+ ```
422
+
423
+ ### Подтверждение телефона
424
+
425
+ ```typescript
426
+ import { ConfirmPhone } from '@foxford/sdk'
427
+
428
+ const phoneInput = document.querySelector('input[type="tel"]') as HTMLInputElement
429
+ const confirmPlugin = new ConfirmPhone(phoneInput, {
430
+ userData: {
431
+ phone: '+79991234567',
432
+ phoneConfirmed: false
433
+ }
434
+ })
435
+
436
+ confirmPlugin.apply(sdk)
437
+ ```
438
+
439
+ ### Автодополнение email
440
+
441
+ ```typescript
442
+ import { EmailAutocomplete } from '@foxford/sdk'
443
+
444
+ const emailInput = document.querySelector('input[type="email"]') as HTMLInputElement
445
+ const autocompletePlugin = new EmailAutocomplete(emailInput, {
446
+ emailDomains: ['gmail.com', 'yandex.ru'],
447
+ onAutocomplete: (value) => {
448
+ console.log('Автодополнено:', value)
449
+ }
450
+ })
451
+
452
+ autocompletePlugin.apply()
453
+ ```
454
+
455
+ ---
456
+
457
+ ## Ошибки
458
+
459
+ ### LogginError
460
+
461
+ Ошибка при работе с авторизацией.
462
+
463
+ ```typescript
464
+ import { LogginError } from '@foxford/sdk'
465
+
466
+ throw new LogginError('Unauthorized', { cause: error })
467
+ ```
468
+
469
+ ### ConfirmationCodeRequestError
470
+
471
+ Ошибка при запросе кода подтверждения.
472
+
473
+ ```typescript
474
+ import { ConfirmationCodeRequestError } from '@foxford/sdk'
475
+
476
+ throw new ConfirmationCodeRequestError('Invalid code', { cause: error })
477
+ ```
478
+
479
+ ---
480
+
481
+ ## Экспортные точки
482
+
483
+ SDK предоставляет следующие экспортные точки:
484
+
485
+ - `@foxford/sdk` - основной пакет с Foxford и всеми сервисами
486
+ - `@foxford/sdk/plugins/confirm-phone` - плагин подтверждения телефона отдельно
487
+ - `@foxford/sdk/plugins/autocomplete-email` - плагин автодополнения email отдельно
488
+
489
+ ---
490
+
491
+ ## Лицензия
492
+
493
+ MIT © Foxford Co