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

<Meta title='@dxtmisha/ru/functional/Composables/useApiGet - Выполнение GET-запросов'/>

# `useApiGet`

Возвращает объект с состоянием загрузки и методом `send` для выполнения `GET`-запросов к API. Является удобной оберткой над `useApiRequest` с предустановленным методом `GET`. Принимает настройки в виде единого объекта `UseApiGetSetup`.

**Параметры:**
- `setup: UseApiGetSetup` — Объект настроек запроса:
  - `path?: RefOrNormal<string | undefined>` — Путь к endpoint API (может быть реактивным).
  - `action?: (data: Return | undefined) => Promise<void> | void` — Действие (коллбэк), выполняемое после успешного завершения запроса.
  - `transformation?: (data: T) => Return` — Функция трансформации ответа от сервера перед возвращением или передачей в `action`.
  - `validateRequestContract?: (data: Request) => ApiDataValidation & Return` — Функция валидации контракта отправляемого запроса.
  - `validateResponseContract?: (data: T) => ApiDataValidation & Return` — Функция валидации контракта полученного ответа.
  - `errorContract?: ApiErrorStorageList` — хранилище контрактов ошибок ответа.
  - `toData?: boolean` — Извлекать ли поле `data` из ответа. По умолчанию `true`.
  - `options?: ApiOptions` — Дополнительные опции запроса (объект параметров `ApiFetch`).
  - `apiInstance?: ApiInstance` — Экземпляр API, используемый для выполнения запроса. По умолчанию `Api.getItem()`.

**Возвращает:**
Объект со следующими свойствами:
- `loading: Ref<boolean>` — Реактивное состояние загрузки. Принимает значение `true` во время выполнения запроса и `false` после его завершения или ошибки.
- `send(request?: Request): Promise<Return | undefined>` — Асинхронный метод для отправки `GET`-запроса. Он автоматически управляет состоянием `loading`, проверяет контракты валидации запроса и ответа, применяет функцию трансформации к ответам, вызывает коллбэк `action` при успехе и безопасно обрабатывает ошибки.

```typescript
import { useApiGet } from '@dxtmisha/functional'

const { loading, send } = useApiGet({
  path: '/api/data',
  action: (data) => console.log('Действие завершено:', data),
  transformation: (raw) => ({ ...raw, processed: true }),
  validateResponseContract: (res) => ({ success: true, ...res }),
  toData: true,
  options: { cache: false }
})

const fetchData = async () => {
  const result = await send({ id: 1 })
  console.log('Итоговый результат:', result)
}
```
