---
name: MutationState
lang: ts
domain: core
version: "1.0.0"
algebraic: product
definition: |
  interface MutationState<TData, TVariables> {
    mutate: (variables: TVariables) => void
    mutate_async: (variables: TVariables) => Promise<TData>
    data: TData | null
    error: Error | null
    loading: boolean
    reset: () => void
  }
description: "Estado de una mutacion POST/PUT/DELETE. Expone mutate, mutate_async, data, error, loading y reset."
tags: [mutation, state, http, post, put, delete, hook]
uses_types: []
file_path: "frontend/types/core/mutation_state.ts"
---

## Campos

- `mutate` — ejecutar la mutacion de forma fire-and-forget (no lanza excepciones)
- `mutate_async` — ejecutar la mutacion y obtener una Promise (puede rechazar)
- `data` — resultado de la ultima mutacion exitosa, null si aun no hubo exito
- `error` — error de la ultima mutacion fallida, null si fue exitosa o no se ha ejecutado
- `loading` — true mientras la mutacion esta en vuelo
- `reset` — volver al estado inicial (idle, data null, error null)

## Uso

```typescript
import type { MutationState } from '@/types/core/mutation_state'

function useCreateUser(): MutationState<User, CreateUserInput> {
  // ...
}
```

## Notas

Retornado por `use_mutation_ts_core`. El patron `mutate` / `mutate_async` permite usar el hook tanto en event handlers (sin async/await) como en funciones que necesitan esperar el resultado.
