# @notix-hub/sdk

JavaScript SDK для **Notix (Нотикс)** — сервиса агрегации уведомлений.

## Установка

### npm

```bash
npm install @notix-hub/sdk
```

```js
import { Notix } from '@notix-hub/sdk';

const notix = new Notix({ token: 'ntx_xxxxxxxxxx' });

await notix.notify({
  title: 'Новый заказ',
  body: 'Клиент оформил заказ на 12 000 ₽',
  type: 'order',
  priority: 'high',
});
```

### CDN

```html
<script src="https://notix-hub.ru/js/notify.js" data-token="ntx_..."></script>
```

Скрипт автоматически инициализирует `window.notix` и включает захват форм.

Без своего домена — через jsdelivr:

```html
<script src="https://cdn.jsdelivr.net/npm/@notix-hub/sdk/dist/notify.min.js" data-token="ntx_..."></script>
```

## API

### `new Notix(config)`

| Параметр | Тип | По умолчанию | Описание |
|----------|-----|-------------|----------|
| `token` | `string` | — | API-токен (префикс `ntx_`) |
| `endpoint` | `string` | `https://notix-hub.ru/api/v1/webhook` | URL вебхука |
| `autoCapture` | `boolean` | `true` | Автозахват форм при создании |
| `timeout` | `number` | `10000` | Таймаут запроса (мс) |
| `debug` | `boolean` | `false` | Логирование в консоль |
| `metrika` | `MetrikaConfig` | `{ enabled: auto }` | Настройки Яндекс.Метрики |

### `notix.notify(payload)`

Отправляет уведомление. Возвращает `Promise<{ message, id }>`.

| Поле | Тип | Обязательно | Описание |
|------|-----|------------|----------|
| `title` | `string` | Да | Заголовок |
| `body` | `string` | Нет | Текст |
| `type` | `string` | Нет | Slug типа уведомления (lead, order, message...) |
| `priority` | `string` | Нет | `low`, `normal`, `high`, `urgent` |
| `payload` | `object` | Нет | Произвольный JSON |

### `notix.capture(root?)`

Вручную активирует захват форм. `root` — элемент, в котором искать формы (по умолчанию `document`).

### `notix.destroy()`

Отключает захват форм.

## Автозахват форм

Добавьте `data-notify` к форме, и SDK перехватит `submit`.

### Шаблон (рекомендуется)

```html
<form data-notify
      data-notify-type="lead"
      data-notify-tag="Сайт"
      data-notify-title="Новая заявка"
      data-notify-template="Имя: {name}\nТелефон: {phone}\nСообщение: {message}">
  <input name="name" placeholder="Ваше имя" required>
  <input name="phone" placeholder="Телефон">
  <textarea name="message" placeholder="Сообщение"></textarea>
  <button type="submit">Отправить</button>
</form>
```

### Поля с метками

```html
<form data-notify data-notify-title="Заявка">
  <input name="name" data-notify-label="Имя">
  <input name="phone" data-notify-label="Телефон">
  <button type="submit">Отправить</button>
</form>
```

### Без шаблона и меток

SDK соберёт все поля как `name: value`.

Атрибуты:

| Атрибут | Описание |
|---------|----------|
| `data-notify` | Включает захват формы |
| `data-notify-title` | Заголовок уведомления (по умолчанию `document.title`) |
| `data-notify-type` | Тип уведомления (lead, order, message, crm, alert) |
| `data-notify-tag` | Тег уведомления |
| `data-notify-priority` | Приоритет (low, normal, high, urgent) |
| `data-notify-template` | Шаблон тела с `{field_name}` |
| `data-notify-body` | Статичный текст (если не нужен шаблон) |
| `data-notify-fields` | Имена полей через запятую |
| `data-notify-label` | Человекочитаемое название поля |
| `data-notify-field` | Пометить конкретное поле |

## Яндекс.Метрика

SDK автоматически определяет наличие `window.ym` и отправляет события:

- `notix_sent` — уведомление отправлено
- `notix_error` — ошибка отправки
- `notix_form_captured` — захвачена форма

Отключить:

```js
new Notix({ token: '...', metrika: { enabled: false } });
```

## Разработка

```bash
npm install
npm run build    # сборка в dist/
npm run typecheck # проверка типов
```

## Публикация

1. Создать `.env` с токеном npm:
   ```
   NPM_TOKEN=npm_xxxxxxxxxxxxxxxxxxxx
   ```

2. Опубликовать:
   ```bash
   source .env && npm publish --access public
   ```

После публикации пакет доступен:
- **npm**: `npm install @notix-hub/sdk`
- **jsdelivr (CDN)**: `https://cdn.jsdelivr.net/npm/@notix-hub/sdk/dist/notify.min.js`

## Лицензия

MIT
