> ## Documentation Index
> Fetch the complete documentation index at: https://ziva.zeleza.ru/llms.txt
> Use this file to discover all available pages before exploring further.

# YesNoTask

> Бинарный выбор с таймаутами и настройкой поведения

# YesNoTask

`YesNoTask` решает типичный сценарий подтверждения: «Да» или «Нет». Задача построена поверх `SingleSelectTask`, поэтому наследует часть его возможностей (дефолтные значения, таймауты, подсказки), но скрывает лишние детали.

## Создание

```go theme={null}
task := ziva.NewYesNoTask("Подтверждение", "Запустить обновление?")
```

Добавьте задачу в очередь и запустите её так же, как любой другой элемент:

```go theme={null}
queue := ziva.NewQueue("Обновление")
queue.AddTasks(task)
_ = queue.Run()
```

## Получение результата

```go theme={null}
if task.IsYes() {
    fmt.Println("Пользователь подтвердил действие")
}

switch task.GetSelectedOption() {
case ziva.YesOption:
    // логика для "Да"
case ziva.NoOption:
    // логика для "Нет"
}
```

## Значения по умолчанию

### Языко-независимые методы

```go theme={null}
task.WithDefaultYes() // подсветить «Да»
task.WithDefaultNo()  // подсветить «Нет»
```

### Универсальный метод

```go theme={null}
task.WithDefaultItem(ziva.YesOption)
task.WithDefaultItem(true)          // эквивалентно YesOption
task.WithDefaultItem("Нет")         // строковое совпадение без учёта регистра
```

## Таймауты

```go theme={null}
task.WithTimeoutYes(5 * time.Second) // через 5 секунд автоматически выбрать «Да»
task.WithTimeoutNo(10 * time.Second) // автоматический «Нет»

// Комбинированные методы
task.WithDefaultYesAndTimeout(3 * time.Second)
task.WithDefaultNoAndTimeout(7 * time.Second)
```

Если нужен кастомный вариант:

```go theme={null}
task.WithTimeout(8*time.Second, ziva.NoOption)
task.WithTimeout(8*time.Second, false)
task.WithTimeout(8*time.Second, "да")
```

## Кастомные подписи

```go theme={null}
task.WithCustomLabels("Продолжить", "Отменить")
```

<Note>
  Текст кнопок обновляется сразу, поэтому добавляйте кастомные лейблы до передачи задачи в очередь.
</Note>

## Вывод итоговой строки

По умолчанию итоговая строка (с выбранным ответом) выводится под заголовком задачи. Если она мешает компактному выводу, её можно скрыть:

```go theme={null}
task.WithoutResultLine() // не показывать строку с выбранным ответом
```

## Обработка выбора «Нет»

Стандартное поведение — считать выбор «Нет» условной ошибкой, чтобы итоговая сводка очереди подсветила отказ. При этом очередь не останавливается. Если «Нет» нужно трактовать как успешный вариант, просто отключите это правило:

```go theme={null}
task.WithNoAsError() // «Нет» больше не считается ошибкой

if task.IsNo() {
    // пользователь отказался, но результат считается успешным
}
```

## Пример: гарантированное подтверждение

```go theme={null}
func mustConfirm(title, question string, timeout time.Duration) bool {
    confirm := ziva.NewYesNoTask(title, question).
        WithDefaultNo().
        WithTimeoutYes(timeout) // по истечении времени всё равно продолжим

    queue := ziva.NewQueue(title)
    queue.AddTasks(confirm)
    _ = queue.Run()

    return confirm.IsYes()
}
```

## Советы

* Используйте `WithTimeoutYes/No`, если интерфейс должен идти дальше без участия пользователя.
* При смене языка UI (через `ziva.SetLanguage`) выбирайте языко-независимые методы — строковые значения могут не совпасть.
* Сохраняйте ссылку на задачу. Результат доступен только после `queue.Run()`.
* Для повторного запроса создайте новую очередь, чтобы не смешивать вывод.

## Связанные материалы

* [SingleSelectTask](/ru/components/singleselect-task) — общие возможности списковых задач
* [FuncTask](/ru/components/func-task) — полезно для действий после подтверждения
