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

<Meta title='@dxtmisha/ru/functional-basic/Classes/Hash - Состояние URL Hash'/>

# Класс Hash

Статический класс-фасад для управления данными, которые хранятся в URL-хэше (`#`). Он делегирует выполнение классу `HashInstance`, обеспечивая централизованный доступ и изоляцию состояния (например, при SSR).

Автоматически синхронизирует состояние приложения с URL — каждый вызов `set` обновляет строку хэша в браузере, а событие `hashchange` обновляет внутреннее состояние.

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

- **Синхронизация с URL** — Данные хранятся в человекочитаемом формате в строке хэша.
- **Реактивность через watchers** — Метод `addWatch` позволяет подписаться на изменение конкретной переменной.
- **Авто-инициализация** — При загрузке страницы данные автоматически считываются из URL.
- **Умный тип** — Значения десериализуются из строки: числа, булевые значения и объекты восстанавливаются.
- **SSR-изоляция** — Через `ServerStorage` обеспечивается уникальный экземпляр данных для каждого запроса на сервере.

## Инициализация

Класс является статическим и инициализируется автоматически при первом обращении.

```javascript
// URL: https://myapp.com/#page=2;filter=active

import { Hash } from '@dxtmisha/functional-basic'

const page = Hash.get('page')    // 2 (number)
const filter = Hash.get('filter') // 'active' (string)
```

## Методы

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

### Чтение и запись
- `static get<T>(name: string, defaultValue?: T | (() => T)): T` — Возвращает значение переменной из хэша.
- `static set<T>(name: string, callback: T | (() => T)): void` — Устанавливает значение переменной и обновляет URL-хэш.

### Наблюдение (Watchers)
- `static addWatch<T>(name: string, callback: (value: T) => void): void` — Подписывается на изменение переменной.
- `static removeWatch<T>(name: string, callback: (value: T) => void): void` — Отписывается от изменений.

### Управление
- `static reload(): void` — Принудительно синхронизирует состояние с текущим URL-хэшем.

## Примеры

### Чтение и запись
```javascript
import { Hash } from '@dxtmisha/functional-basic'

// Чтение с дефолтным значением
const page = Hash.get<number>('page', 1)

// Запись (URL изменится на #page=3)
Hash.set('page', 3)

// Запись через функцию
Hash.set('page', () => page + 1)
```

### Подписка на изменения
```javascript
Hash.addWatch<string>('filter', (newFilter) => {
  console.log('Фильтр изменен на:', newFilter)
})

// Отписка (callback должен быть ссылкой на ту же функцию)
Hash.removeWatch('filter', callback)
```

### Управление состоянием страницы
```javascript
// Инициализация фильтра с дефолтным значением
const filter = Hash.get('filter', 'all')
const sort = Hash.get('sort', 'date')

// Изменение при действии пользователя
Hash.set('filter', 'active')
// URL: #filter=active;sort=date
```
