import {Meta} from '@storybook/addon-docs/blocks'

<Meta title='@dxtmisha/ru/functional-basic/Classes/ErrorCenter - Управление ошибками'/>

# Класс ErrorCenter

`ErrorCenter` — это центральный инструмент для управления всеми ошибками в приложении. Он позволяет в одном месте регистрировать возможные причины ошибок, настраивать реакцию на них (например, показ уведомлений) и вызывать их из любой части кода.

Класс работает как статическая обертка (Static Bridge), направляя все запросы к единственному экземпляру `ErrorCenterInstance`.

## Методы

### Действие
- `on(cause: ErrorCenterCauseItem): void` — Запускает процесс обработки. Ищет данные в реестре, объединяет их и вызывает нужные функции обратного вызова.

### Проверка
- `has(code: string, group?: string): boolean` — Проверяет, зарегистрирована ли ошибка.
- `get(code: string, group?: string): ErrorCenterCauseItem | undefined` — Возвращает данные ошибки из реестра.

### Конфигурация
- `add(cause: ErrorCenterCauseItem): void` — Добавляет одну причину ошибки.
- `addList(causes: ErrorCenterCauseList): void` — Добавляет список ошибок (массовая регистрация).
- `addHandler(group: ErrorCenterGroup, handler: ErrorCenterHandlerCallback): void` — Регистрирует реакцию на группу ошибок.
- `addHandlerList(handlers: ErrorCenterHandlerList): void` — Пакетная регистрация нескольких обработчиков.

### Вспомогательные
- `getItem(): ErrorCenterInstance` — Возвращает внутренний экземпляр класса.

## Типы

#### `ErrorCenterGroup`
Имя группы (например, 'api', 'auth') или `undefined` для общего обработчика.

#### `ErrorCenterCauseItem`
Объект, описывающий ошибку: `group`, `code` (обязательно), `priority`, `label`, `message`, `details`.

## Руководство по работе

### Шаг 1: Регистрация (Registry)
Составьте словарь ошибок, чтобы хранить тексты отдельно от кода.
```typescript
ErrorCenter.add({
  group: 'auth',
  code: 'LOGIN_FAILED',
  label: 'Ошибка входа',
  message: 'Неверный пароль.'
})
```

### Шаг 2: Подписка (Handlers)
Укажите, как приложение должно реагировать на группу ошибок.
```typescript
ErrorCenter.addHandler('auth', (cause) => {
  alert(cause.message);
});
```

### Шаг 3: Вызов (Execution)
Вызовите ошибку по её коду и группе.
```typescript
ErrorCenter.on({ group: 'auth', code: 'LOGIN_FAILED' });
```

## Стандартные причины ошибок

Класс уже содержит готовые описания для частых ситуаций.

#### Группа API (`api`)
Используется для ошибок сетевых запросов.
- **forbidden** — Доступ запрещен (403).
- **notFound** — Ресурс не найден (404).
- **offline** — Нет интернет-соединения.
- **server** — Внутренняя ошибка сервера (500).
- **timeout** — Тайм-аут запроса.
- **unauthorized** — Ошибка авторизации (401).
- **unknown** — Неизвестная ошибка.
- **cacheClear**, **cacheGet**, **cacheRemove**, **cacheSet** — Ошибки при работе с кэшем.

#### Группа Intl (`intl`)
Ошибки при форматировании данных (даты, числа и т.д.).
- **datetime**, **display**, **number**, **plural**, **relative**.
- **invalid** — Невалидная дата или неверный формат.

#### Группа Storage (`storage`)
Ошибки при работе с локальным или серверным хранилищем.
- **context** — Отсутствует контекст.
- **error** — Общий сбой записи/чтения.

#### Прочие группы
Для данных групп предусмотрен универсальный код ошибки `error`. Вызов осуществляется через `ErrorCenter.on({ group: 'название_группы', code: 'error' })`.
- **broadcast** — Ошибки при обмене данными между вкладками браузера.
- **hydration** — Ошибка при синхронизации данных между сервером и клиентом.
- **share** — Ошибка при попытке поделиться контентом (Sharing API).
- **transformation** — Ошибка при преобразовании или парсинге данных.

## Примеры

### Интеграция с системой уведомлений
```typescript
import { ErrorCenter } from '@dxtmisha/functional-basic'

// Настраиваем один раз при старте приложения
ErrorCenter.addHandler('api', (cause) => {
  Toast.show(cause.label || 'Ошибка', cause.message);
});

// Используем в любом сервисе
async function loadData() {
  try {
    const data = await fetch('/api');
  } catch (e) {
    ErrorCenter.on({ group: 'api', code: 'server', details: e });
  }
}
```

### Работа с кастомными группами
```typescript
// Регистрация на лету
ErrorCenter.on({
  group: 'upload',
  code: 'SIZE_LIMIT',
  label: 'Файл слишком велик',
  message: 'Максимум 5МБ'
});
```
