Skip to content

⏳ Time Travel (Undo & Redo)

withHistory lets you undo, redo, and track all changes made to a chunk.
It’s perfect for forms, editors, or anywhere you want “go back” and “go forward” behavior.

⚙️ Basic Example

ts
import { chunk } from "stunk";
import { withHistory } from "stunk/middleware";

const counterChunk = withHistory(chunk(0));

counterChunk.set(1);
counterChunk.set(2);

counterChunk.undo(); // → goes back to 1
counterChunk.undo(); // → goes back to 0
counterChunk.redo(); // → moves forward to 1

🔍 Checking History

ts
counterChunk.canUndo(); // true if you can go back
counterChunk.canRedo(); // true if you can go forward

📜 View or Clear History

ts
counterChunk.getHistory(); 
// [0, 1, 2] — full list of past values

counterChunk.clearHistory(); 
// clears all history, keeps current value only

🎚️ Limit History Size

To prevent memory issues, you can limit how many changes to store:

ts
const counter = withHistory(chunk(0), { maxHistory: 5 });
// Keeps only the last 5 states (default is 100)

🧠 Real Example — Form Undo/Redo

ts
const formChunk = withHistory(chunk({
  name: "Aduke",
  age: 24,
}));

formChunk.set({ name: "Asake", age: 24 });
formChunk.set({ name: "Fola", age: 25 });

formChunk.undo(); // back to Asake
formChunk.undo(); // back to Aduke
formChunk.redo(); // forward to Asake

🧩 API Overview

MethodDescription
set(value)Update the chunk and push to history
undo()Move to previous value
redo()Move to next value
canUndo()Check if undo is possible
canRedo()Check if redo is possible
getHistory()Returns all past values
clearHistory()Clears all past values
destroy()Destroys chunk and history

✅ Why Use withHistory

  • Undo mistakes easily
  • Improve UX — users can go back to previous input
  • Debugging — track how state changed step-by-step
  • Simple integration — wrap any chunk instantly

⚡ Example: Text Editor Undo/Redo

ts
const textChunk = withHistory(chunk("Hello"));

textChunk.set("Hello Abdulzeez");
textChunk.set("Hello Qudus");

textChunk.undo(); // back to "Hello Abdulzeez"
textChunk.undo(); // back to "Hello"
textChunk.redo(); // forward to "Hello Abdulzeez"

💡 Tip: Combine withHistory with withPersistence to get undo + localStorage support.

Next: Learn how to persist state across reloads with withPersistence 💾