Skip to content

status

Один стор с состоянием эффекта, готовый для компонента: "initial" | "pending" | "done" | "fail".

ts
status(fx);
status(fx, { reset });

Из API самого эффекта такой стор не собрать: состояния «ещё не пробовали» у эффекта нет, а «чем закончилась последняя попытка» — это память между событиями жизненного цикла (done и failed — события, не сторы).

Кнопка отправки

Четыре состояния любой формы — без ручной проводки из стора и трёх реакций:

ts
import { status } from "@virentia/core/utils";

const saveStatus = status(saveFx);
tsx
// во view (пример на React)
const s = useUnit(saveStatus);
return (
  <button disabled={s === "pending"}>
    {s === "pending" ? "Сохраняем…" : s === "fail" ? "Повторить" : "Сохранить"}
  </button>
);

«Не показывай ошибку, пока не было попытки»

Состояние "initial" — главная причина существования оператора. По одному fail не отличить «ещё не пробовали» от «попробовали и сбросили», по status — легко:

ts
const showError = computed(() => saveStatus.value === "fail");
const showHint = computed(() => saveStatus.value === "initial"); // нетронутая форма, без красных рамок

Новая сущность — чистая история

Когда один эффект обслуживает разные сущности, исход прошлой попытки не должен встретить свежеоткрытую:

ts
const saveStatus = status(saveFx, { reset: recordOpened });

Открытие записи возвращает статус в "initial" — ошибка прошлой записи не покажется на новой.

Когда пригодится

  • Кнопки отправки, сохранения, загрузки — любой интерфейс, где нужны все четыре состояния.
  • Логика «нетронутой формы», где "initial" — полноценное состояние, а не отсутствие данных.
  • Экраны успеха: status === "done" сразу после завершения эффекта.

Когда не подходит: если нужен только флаг «идёт запрос» — он уже есть у эффекта, fx.pending.

Поведение

  • Как и всё в Virentia — в каждом скоупе своё: "fail" из теста никогда не покажется в приложении.
  • Побеждает последнее событие. При параллельных вызовах ранний успех даст "done", пока поздний вызов ещё идёт, — там, где это важно, смотрите на status вместе с fx.pending.
  • В reset можно передать любой юнит: событие, стор, done другого эффекта.