npm package: @foxford/foxford-js-sdk
Description: Foxford sdk for external projects
Latest version: 3.4.18

# Foxford-js-sdk

Набор методом для работы с Фоксфорд

## Использование

```js
// @flow
import { Foxford } from '@foxford/foxford-js-sdk'
import type { User } from '@foxford/foxford-js-sdk'

const foxSdk = new Foxford()

const getUser = async function () {
  const user: User = await foxSdk.user.getUser()
}
```

### Сервисы

- user - для работы с юзером фокса
- promo - для работы с промокодами
- tag - для работы с тэгами
- cart - для работы с корзиной
- course - для работы с курсами
- widgets - для работы с виджетами
- productPack - для работы с продукт-паками
- leadrequest - для работы с лидреквестами
- api, foxApi, staticApi - для работы с HTTP-запросами
- captcha - для работы с капчей
- analytics - для работы с аналитикой

Описание интерфейсов можно глянуть в `index.d.ts` или `index.js.flow`

## Виджеты

Библиотека сама сходит на скриптом по нужному адресу и вставит его в ваш DOM.
После чего проинициализирует виджеты с заданными конфигом.
Теперь нет необходимости инициализировать библиотеку виджетов вручную.

Пример инициализации виджетов

```js
const WIDGETS_CONFIG = Object.freeze({
  analyticContext: { prefix: 'app', module: '' },
  widgets: [
    {
      name: 'menu',
      options: {
        header: true,
        footer: true,
        headerContainer: document.getElementById(HEADER_CONTAINER_NAME),
        footerContainer: document.getElementById(FOOTER_CONTAINER_NAME),
      },
    },
  ],
})

const sdk = new Foxford()

sdk.widgets.create(WIDGETS_CONFIG)
```

## Корзина

Саздаем `cartItem` и добавляем его в корзину

```js
const sdk = new Foxford()

async function addCourseToCart(id: number) {
  try {
    const course = await sdk.course.getCourse(id)
    // создаем cart-item
    const cartItem = sdk.cart.createCartItem(course.id, course.cartItem.type)
    // добавляем cart-item в корзину
    await sdk.cart.addCartItemToCart(cartItem)
    // redirect
  } catch (error) {
    // error
  }
}
```

## Курс

Получение информации по курсу

```js
const sdk = new Foxford()

async function getCourse(id: number): Course {
  const course = await sdk.course.getCourse(id)
  return course
}
```

## Лидрееквест

Создаем лидреквест и отсылаем его

```js
const sdk = new Foxford()

async function sendLeadRequest({ email, phone, name }) {
  const lrData = {
    email: email,
    phone_number: phone,
    name: name,
  }

  const leadRequest = sdk.leadrequest.createLeadRequest(LEAD_REQUEST_TYPE, 'express.foxford.ru | offer', lrData)

  await sdk.leadrequest.send(leadRequest, search)
}
```

## User identity event

Для отправки юзер эвентов нужно выполнить

```js
const sdk = new Foxford()

async function sendUserEvent(event: 'experiment' | 'funnel' | 'conversion'): void {
  await sdk.user.pushEvent(event) // отправка события
}

sendUserEvent('conversion')
```

## Api

В случае крайней необходимости есть возможность делать прямые запросы через настроенный api клиент.

```js
const sdk = new Foxford()
const api = sdk.api
const foxApi = sdk.foxApi
const api = sdk.api
const staticApi = sdk.staticApi

foxApi.post(`/api/${endpoint}`, { data })

// ---------------------------------------------------------------------------------------- //

// Выполняем запрос к внешнему ресурсу
api.get(`https://some.external.source`).then(({ data }) => data)

// ---------------------------------------------------------------------------------------- //

/*
    `staticApi` можно использовать для доступа к статичным методам и свойствам апи

    * staticApi.create() - для создания нового инстанса
    * staticApi.isCancel() - для проверки был ли запрос отменен пользователем
    * staticApi.CancelToken - для отмены запросов
  */

// Отмена запроса
const CancelToken = staticApi.CancelToken
const source = CancelToken.source()

staticApi
  .get('/user/12345', {
    cancelToken: source.token,
  })
  .catch(function (thrown) {
    if (staticApi.isCancel(thrown)) {
      console.log('Request canceled', thrown.message)
    } else {
      // обработка ошибки
    }
  })

staticApi.post(
  '/user/12345',
  {
    name: 'new name',
  },
  {
    cancelToken: source.token,
  }
)

// Отмена запроса (параметр сообщения опциональный)
source.cancel('Operation canceled by the user.')

// Создание инстанса
const customClient = staticApi.create({
  baseURL: someCustomURL,
  responseType: 'text',
})
```

## Плагины

Данные плагины могут быть использованы в любой экосистеме(react, vanilla js)

Ознакомьтесь подробнее с документацией по каждому плагину.

- [Email Autocomplete](./src/plugins/autocomplete-email/README.md)