@letar/forms

Отмена / Повтор

Ctrl+Z/Ctrl+Y история для форм с useFormHistory

Обзор

Ни одна библиотека форм не предоставляет встроенный undo/redo. useFormHistory() решает это — снимки с debounce, горячие клавиши и визуальный компонент управления.

import { HistoryControls, useFormHistory } from '@letar/forms'

function ProductEditor() {
  const form = useDeclarativeForm()
  const history = useFormHistory(form)

  return (
    <Form schema={ProductSchema} onSubmit={save}>
      <HistoryControls history={history} />
      <Form.Field.String name="title" />
      <Form.Field.RichText name="description" />
      <Form.Field.Currency name="price" />
      <Form.Button.Submit>Сохранить</Form.Button.Submit>
    </Form>
  )
}

Как это работает

  1. Подписывается на form.store (реактивный стор TanStack Form)
  2. При изменении → debounce 500мс → structuredClone снимок
  3. Undo/Redo применяет снимок через form.setFieldValue для каждого поля
  4. Изменения от undo/redo не записываются в историю (предотвращение рекурсии)
  5. Ветвление (undo → правка) обрезает будущие записи

API: useFormHistory(form, config?)

const history = useFormHistory(form, {
  maxHistory: 50, // Макс. снимков (по умолчанию: 50)
  debounceMs: 500, // Задержка перед записью (по умолчанию: 500мс)
  keyboard: true, // Горячие клавиши Ctrl+Z/Y (по умолчанию: true)
  persist: false, // sessionStorage (по умолчанию: false)
  persistKey: 'form-history',
})

Возвращает:

ПолеТипОписание
undo() => voidОтменить последнее изменение
redo() => voidПовторить отменённое
canUndobooleanЕсть история отмен
canRedobooleanЕсть история повторов
currentIndexnumberПозиция в стеке
historyLengthnumberВсего снимков
clear() => voidОчистить историю

Горячие клавиши

КлавишиДействие
Ctrl+Z / Cmd+ZОтмена
Ctrl+Shift+Z / Ctrl+YПовтор

Отключить: keyboard: false.

HistoryControls

<HistoryControls
  history={historyApi}
  showCounter // Показывать счётчик "3/7"
  size="sm" // xs | sm | md
/>

Когда использовать

  • CMS / редакторы контента (много полей, частые правки)
  • Конфигураторы товаров
  • Формы с RichText (пользователи ожидают Ctrl+Z)
  • Длинные формы (10+ полей), где ошибки дорого обходятся

On this page