1. YCLIENTS
  2. Маркетплейс интеграций
  3. Расширения внутри YCLIENTS
  4. Техническая документация по интеграции расширений внутри YCLIENTS
  5. Вкладки в разделах «Сотрудники»/о клиенте в окне записи/о визите в окне записи

Вкладки в разделах «Сотрудники»/о клиенте в окне записи/о визите в окне записи


Отправка данных

Query params
salon_id={number}&user_id={number}&entity_id={number}&entity_type={'employee' OR 'visit' OR 'client'}
Сообщения от iframe
interface IframeReadyMessage {
  type: 'iframe_ready'
  payload: { 
    success: boolean
  }
}
interface IframeRequestEntityMessage {
  type: 'iframe_request_entity'
}
Сообщение от YCLIENTS
interface IframeResponseEntityMessage {
  type: 'yclients_response_entity'
  payload: {
    entity_type: 'employee' | 'visit' | 'client'
    entity: EntityDataType
  }
}
Общий тип данных Entity
interface IframeResponseEntityMessage {
  type: 'yclients_response_entity'
  payload: {
    entity_type: 'employee' | 'visit' | 'client'
    entity: EntityDataType
  }
}
Тип данных Посетитель
// Посетитель от клиента. Ребенок родителя. Посетитель представителя
interface ComerDataType extends EntityDataType {
  firstname: string
  surname: string | null
  patronymic: string | null
  birthdate: Date('Y-m-d') | null // PHP format
  sex: 0 | 1 | 2 // 0 - Не указано, 1 - М, 2 - Ж, default - 0

  [index: string]: any
}

interface ClientDataType extends EntityDataType {
  firstname: string
  surname: string | null
  patronymic: string | null
  phone: string | null
  birthdate: Date('Y-m-d') | null // PHP format
  sex: 0 | 1 | 2 // 0 - Не указано, 1 - М, 2 - Ж, default - 0

  comer: ComerDataType | null // Посетитель от клиента. Ребенок родителя. Посетитель представителя

  [index: string]: any
}
Тип данных Сотрудник
interface EmployeeDataType extends EntityDataType {
  firstname: string
  surname: string | null
  patronymic: string | null

  [index: string]: any
}
Тип данных Визит
interface VisitDataType extends EntityDataType {
  date: Date('Y-m-d H:i:s') // PHP format

  employee: EmployeeDataType

  client: ClientDataType | null // Может быть визит без Клиента

  [index: string]: any
}

Данные для фреймов @Google Docs

Технические ограничения

  1. В коде виджета должен быть предусмотрен fallback на использование localStorage/sesionStorage/cookie, так как виджет встраивается через iframe и если пользователь сидит в режиме инкогнито, то при попытке обратиться к вышеописанным сервисам может происходить ошибка Access is denied for this document (ссылка на проблему). Самым простым решением будет отказаться от этих сервисов. Если это невозможно, то следует либо предусмотреть fallback для них, либо же показывать соответствующий экран о невозможности работы виджета.

  2. В случае, если авторизация в виджете требует проставление и дальнейшее считывание cookie, то у куки авторизации обязательно должен быть проставлен атрибут SameSite со значением ‘none’. Без этого параметра виджет не сможет достать ее, в связи с кроссдоменным взаимодействием.

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

Требования по производительности

  1. Отсутствие спама запросов в рантайме, необходимо минимизировать их количество.

  2. Суммарный размер production-ready js/css файлов менее 700kb.

  3. Размер отдельно взятого production-ready js/css файла менее 300kb.

  4. Потребление памяти (вкладка Memory, chrome dev-tools), составляет менее 50% от памяти, потребляемой YCLIENTS.

  5. Отсутствие регулярных сложных вычислений, реакций на различные события (работа с API, web-сокетами). Работа виджета не должна блокировать пользовательское взаимодействие с интерфейсом YCLIENTS. Диагностировать длительные «провисания» можно на вкладке «Performance» в chrome dev-tools (они будут помечены красным флагом).

    Более подробно с инструментом можно ознакомиться в статье от гугла.

Особенности жизненного цикла iframe

iframe не инициализируется при открытии базовых страниц (где может быть расположен iframe), а ожидает открытия вкладки на базовой странице. После открытия вкладки с iframe происходит инициализация фрейма.

iframe удаляются сразу при переключении на другой таб (вкладку), в фоне ничего не работает.


Предыдущая статья Чат в окне визита и журнале записи
Следующая статья Требования к дизайну виджетов расширений