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

<Meta title='@dxtmisha/ru/functional-basic/Classes/Loading - Глобальная загрузка'/>

# Класс Loading

Статичный класс для управления глобальным состоянием загрузки (использует `LoadingInstance`). Использует счётчик: загрузка активна, пока хотя бы один процесс её отображает. Оповещает слушателей через кастомное событие `ui-loading`.

## Ключевые особенности

- **Счётчик вложенности** — несколько параллельных вызовов `show()` корректно обрабатываются: загрузка скроется только после одинакового числа вызовов `hide()`.
- **Глобальное событие** — при изменении состояния диспетчеризуется событие `ui-loading` на объекте `window`.
- **Регистрация слушателей** — через `registrationEvent` можно подписаться на изменения состояния из любого компонента.

## Управление состоянием

- `is(): boolean` — возвращает `true`, если загрузка активна (счётчик > 0).
- `get(): number` — возвращает текущее значение счётчика.
- `show(): void` — увеличивает счётчик на 1, оповещает слушателей.
- `hide(): void` — уменьшает счётчик на 1. Если счётчик уже 0 — игнорируется.

## Подписка на события

### `registrationEvent`

Регистрирует слушателя изменений состояния загрузки. Работает через нативное событие `ui-loading` на объекте `window`.

**Параметры:**
- `listener: EventListenerDetail<CustomEvent, { loading: boolean }>` — функция-обработчик, получающая `event.detail.loading: boolean`.
- `element?: ElementOrString<HTMLElement>` — DOM-элемент-триггер: при его удалении из DOM слушатель автоматически останавливается.

### `unregistrationEvent`

Отменяет регистрацию слушателя, добавленного через `registrationEvent`.

**Параметры:**
- `listener: EventListenerDetail<CustomEvent, { loading: boolean }>` — функция-обработчик, которая была использована при регистрации.
- `element?: ElementOrString<HTMLElement>` — DOM-элемент, который был использован при регистрации.

## LoadingInstance
Класс `LoadingInstance` можно использовать для создания отдельного экземпляра для отслеживания загрузки.

## Пример

```javascript
import { Loading } from '@dxtmisha/functional-basic'

Loading.registrationEvent((event) => {
  console.log('Загрузка:', event.detail.loading) // true или false
})

Loading.show()  // счётчик = 1
Loading.show()  // счётчик = 2
Loading.hide()  // счётчик = 1
Loading.hide()  // счётчик = 0 → событие: { loading: false }
```
