useManualHistory
A hook for manually managing Observable change history. It only records a snapshot when commit() is called, and allows navigating previous states via undo/redo. Useful when auto-tracking is not needed, or when you want to record history only on explicit "save" actions.
Counter draft
Saved
Increment or decrement first, then decide when that state deserves a place in history.
0
Saved timeline
Newest snapshot is pinned at the top.
#1
0
import { import useManualHistory
useManualHistory, import useObservable
useObservable } from "@usels/web";
function function Component(): JSX.Element
Component() { const const counter$: any
counter$ = import useObservable
useObservable(0); const { const commit: any
commit, const undo: any
undo, const redo: any
redo, const canUndo$: any
canUndo$, const canRedo$: any
canRedo$ } = import useManualHistory
useManualHistory(const counter$: any
counter$);
return ( <JSX.IntrinsicElements.div: DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>
div> <JSX.IntrinsicElements.button: DetailedHTMLProps<ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>
button DOMAttributes<HTMLButtonElement>.onClick?: MouseEventHandler<HTMLButtonElement> | undefined
onClick={() => { const counter$: any
counter$.any
set((v: any
v) => v: any
v + 1); const commit: any
commit(); }}>Save</JSX.IntrinsicElements.button: DetailedHTMLProps<ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>
button> <JSX.IntrinsicElements.button: DetailedHTMLProps<ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>
button DOMAttributes<HTMLButtonElement>.onClick?: MouseEventHandler<HTMLButtonElement> | undefined
onClick={const undo: any
undo} ButtonHTMLAttributes<HTMLButtonElement>.disabled?: boolean | undefined
disabled={!const canUndo$: any
canUndo$.any
get()}>Undo</JSX.IntrinsicElements.button: DetailedHTMLProps<ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>
button> <JSX.IntrinsicElements.button: DetailedHTMLProps<ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>
button DOMAttributes<HTMLButtonElement>.onClick?: MouseEventHandler<HTMLButtonElement> | undefined
onClick={const redo: any
redo} ButtonHTMLAttributes<HTMLButtonElement>.disabled?: boolean | undefined
disabled={!const canRedo$: any
canRedo$.any
get()}>Redo</JSX.IntrinsicElements.button: DetailedHTMLProps<ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>
button> </JSX.IntrinsicElements.div: DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>
div> );}import { createManualHistory, observable } from "@usels/web";
function Component() { "use scope" const counter$ = observable(0); const { commit, undo, redo, canUndo$, canRedo$ } = createManualHistory(counter$);
return ( <div> <button onClick={() => { counter$.set((v) => v + 1); commit(); }}>Save</button> <button onClick={undo} disabled={!canUndo$.get()}>Undo</button> <button onClick={redo} disabled={!canRedo$.get()}>Redo</button> </div> );}capacity — limit history size
Section titled “capacity — limit history size”import { useManualHistory, useObservable } from "@usels/web";
function Component() { const value$ = useObservable(0); // Keep at most 10 undo steps; older records are discarded automatically const { commit, undo } = useManualHistory(value$, { capacity: 10 });}import { createManualHistory, observable } from "@usels/web";
function Component() { "use scope" const value$ = observable(0); const { commit, undo } = createManualHistory(value$, { capacity: 10 });}dump / parse — custom serialization
Section titled “dump / parse — custom serialization”Use dump and parse to store a compact or transformed representation instead of raw value clones.
import { useManualHistory, useObservable } from "@usels/web";
function Component() { const items$ = useObservable<string[]>([]); const { commit, undo, history$ } = useManualHistory(items$, { // Store as comma-separated string to save memory dump: (arr) => arr.join(","), parse: (str) => (str ? str.split(",") : []), });}import { createManualHistory, observable } from "@usels/web";
function Component() { "use scope" const items$ = observable<string[]>([]); const { commit, undo } = createManualHistory(items$, { dump: (arr) => arr.join(","), parse: (str) => (str ? str.split(",") : []), });}reset — revert uncommitted changes
Section titled “reset — revert uncommitted changes”reset() restores the source to the last committed value without touching the undo/redo stacks.
import { useManualHistory, useObservable } from "@usels/web";
function Component() { const text$ = useObservable("saved"); const { commit, reset } = useManualHistory(text$);}import { createManualHistory, observable } from "@usels/web";
function Component() { "use scope" const text$ = observable("saved"); const { commit, reset } = createManualHistory(text$);}clear — wipe all history
Section titled “clear — wipe all history”import { useManualHistory, useObservable } from "@usels/web";
function Component() { const value$ = useObservable(0); const { commit, clear, history$ } = useManualHistory(value$);}import { createManualHistory, observable } from "@usels/web";
function Component() { "use scope" const value$ = observable(0); const { commit, clear, history$ } = createManualHistory(value$);}Parameters
Section titled “Parameters”| Parameter | Type | Description |
|---|---|---|
source$ | Observable<Raw> | - The Observable to track. |
options | ManualHistoryOptions<Raw, Serialized> (optional) | - Configuration for capacity, cloning, and serialization. |
ManualHistoryOptions
Section titled “ManualHistoryOptions”Returns
Section titled “Returns”ManualHistoryReturn<Raw, Serialized>
| Name | Type | Description |
|---|---|---|
canUndo$ | ReadonlyObservable<boolean> | Whether undo is possible (undoStack is non-empty). |
canRedo$ | ReadonlyObservable<boolean> | Whether redo is possible (redoStack is non-empty). |
history$ | ReadonlyObservable<UseHistoryRecord<Serialized>[]> | Full history array, newest first: [current, previous, ...]. |
last$ | ReadonlyObservable<UseHistoryRecord<Serialized>> | The most recent (current) history record. |
commit | Fn | Record the current source value as a new history point. Clears redo stack. |
undo | Fn | Restore the previous committed value. |
redo | Fn | Re-apply the next value after an undo. |
clear | Fn | Wipe all history and create a fresh initial record from current source. |
reset | Fn | Restore source to the last committed value without modifying stacks. |