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

<Meta title='@dxtmisha/ru/functional-basic/# Хранение данных'/>

# Хранение данных

Библиотека предоставляет набор инструментов для долговременного хранения данных, включая работу с LocalStorage, SessionStorage, Cookie и управление Хэшем URL.

## Локальное и сессионное хранилище (DataStorage)

Класс `DataStorage` упрощает работу с хранилищами браузера, обеспечивая автоматическую сериализацию объектов в JSON, управление глобальными префиксами через `setPrefix` (по умолчанию `ui-storage`) и механизм контроля TTL. Он гарантирует синхронизацию данных в рамках приложения за счет возврата единого инстанса для каждого ключа и корректно обрабатывает отсутствие DOM в SSR-окружениях.


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

// Установка глобального префикса (необязательно)
DataStorage.setPrefix('my-project')

// 1. Инициализация (по умолчанию localStorage)
const storage = new DataStorage('user_settings')

// 2. Сохранение данных (автоматически переводится в JSON)
storage.set({ theme: 'dark', language: 'ru' })

// 3. Получение данных со значением по умолчанию
const settings = storage.get({ theme: 'light' })
```

### Сессионное хранилище

Для использования `sessionStorage` (данные очищаются при закрытии вкладки) передайте `true` вторым аргументом в конструктор:

```javascript
const session = new DataStorage('temp_data', true)
```

### Кэширование (TTL)

Вы можете ограничить актуальность данных, указав время жизни кэша (в секундах) при вызове `get`. Это позволяет автоматически считать данные устаревшими без их явного удаления.

```javascript
// Получить данные, только если они были сохранены не более часа назад (3600 сек)
const recentData = storage.get(undefined, 3600)
```

## Cookie (Cookie)

Класс `Cookie` предоставляет удобный интерфейс для управления куками, скрывая сложности работы со строкой `document.cookie`. Он автоматически считывает текущие данные браузера при инициализации, поддерживает настройки безопасности `SameSite` и позволяет корректно удалять записи через метод `remove()`.

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

const myCookie = new Cookie('auth_token')

// Установка куки с дополнительными параметрами
myCookie.set('secure_value', { 
  age: 3600 * 24, // 1 день
  sameSite: 'lax'
})

// Получение значения
const token = myCookie.get()
```

## URL Хэш (Hash)

Класс `Hash` превращает URL-адрес в реактивное хранилище состояния (`#key:value;`), что идеально подходит для сохранения фильтров или открытых вкладок. Данные автоматически синхронизируются с внутренним объектом `Hash`, позволяя мгновенно обновлять интерфейс при изменениях в строке браузера без перезагрузки страницы.

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

// 1. Установка значений: URL изменится на ...#tab:profile;filter:active
Hash.set('tab', 'profile')
Hash.set('filter', 'active')

// 2. Получение значения (с необязательным значением по умолчанию)
const currentTab = Hash.get('tab', 'home')
```

### Отслеживание изменений

Метод `addWatch` позволяет подписаться на изменение конкретных параметров в URL. Это удобно для выполнения действий при смене вкладок или применении фильтров пользователем.

```javascript
// 1. Реактивное отслеживание
const onTabChange = (newTab) => {
  console.log('Пользователь переключился на:', newTab)
}

Hash.addWatch('tab', onTabChange)

// 2. Удаление слушателя при необходимости
// Hash.removeWatch('tab', onTabChange)
```
