Skip to content

Commit

Permalink
feat(patches): implement merge patches when archive()
Browse files Browse the repository at this point in the history
  • Loading branch information
unadlib committed Mar 24, 2024
1 parent 08e79b3 commit b1c059e
Show file tree
Hide file tree
Showing 2 changed files with 130 additions and 8 deletions.
14 changes: 11 additions & 3 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -198,8 +198,16 @@ export const useTravel = <S, F extends boolean, A extends boolean>(
}
if (!tempPatches.patches.length) return;
setAllPatches((allPatchesDraft) => {
allPatchesDraft.patches.push(tempPatches.patches.flat());
allPatchesDraft.inversePatches.push(tempPatches.inversePatches.flat());
// All patches will be merged, it helps to minimize the patch structure
const [, patches, inversePatches] = create(
state as object,
(draft) => apply(draft, tempPatches.inversePatches.flat().reverse()),
{
enablePatches: true,
}
);
allPatchesDraft.patches.push(inversePatches);
allPatchesDraft.inversePatches.push(patches);
if (maxHistory < allPatchesDraft.patches.length) {
allPatchesDraft.patches = allPatchesDraft.patches.slice(-maxHistory);
allPatchesDraft.inversePatches = allPatchesDraft.inversePatches.slice(
Expand Down Expand Up @@ -290,7 +298,7 @@ export const useTravel = <S, F extends boolean, A extends boolean>(
}
return cachedHistory;
},
patches: allPatches,
patches: shouldArchive ? _allPatches : allPatches,
back: (amount = 1) => {
go(position - amount);
},
Expand Down
124 changes: 119 additions & 5 deletions test/index.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -416,7 +416,9 @@ describe('useTravel', () => {
//@ts-expect-error
act(() => controls.archive());
[nextState, setState, controls] = result.current;
expect(fnWarning).toHaveBeenCalledWith(`Auto archive is enabled, no need to archive manually`);
expect(fnWarning).toHaveBeenCalledWith(
`Auto archive is enabled, no need to archive manually`
);
});

it('[useTravel] with normal init state and disable autoArchive', () => {
Expand Down Expand Up @@ -450,7 +452,7 @@ describe('useTravel', () => {
},
],
});
expect(controls.patches.patches.length).toBe(0);
expect(controls.patches.patches.length).toBe(1);
expect(controls.position).toBe(1);
expect(controls.getHistory()).toEqual([
{ todos: [] },
Expand All @@ -475,7 +477,7 @@ describe('useTravel', () => {
);
[nextState, setState, controls] = result.current;

expect(controls.patches.patches.length).toBe(0);
expect(controls.patches.patches.length).toBe(1);
expect(controls.position).toBe(1);
expect(controls.getHistory()).toEqual([
{ todos: [] },
Expand Down Expand Up @@ -1024,7 +1026,6 @@ describe('useTravel', () => {
expect(controls.position).toEqual(2);
expect(controls.getHistory()).toEqual([0, 1, 2]);


act(() => controls.archive());
[nextState, setState, controls] = result.current;
expect(nextState).toEqual(2);
Expand All @@ -1037,7 +1038,6 @@ describe('useTravel', () => {
expect(controls.position).toEqual(3);
expect(controls.getHistory()).toEqual([0, 1, 2, 3]);


act(() => controls.archive());
[nextState, setState, controls] = result.current;
expect(nextState).toEqual(3);
Expand Down Expand Up @@ -1169,6 +1169,57 @@ describe('useTravel', () => {
expect(controls.canBack()).toBe(true);
expect(controls.canForward()).toBe(true);

expect(controls.patches).toMatchInlineSnapshot(`
{
"inversePatches": [
[
{
"op": "replace",
"path": [],
"value": 3,
},
],
[
{
"op": "replace",
"path": [],
"value": 4,
},
],
[
{
"op": "replace",
"path": [],
"value": 5,
},
],
],
"patches": [
[
{
"op": "replace",
"path": [],
"value": 4,
},
],
[
{
"op": "replace",
"path": [],
"value": 5,
},
],
[
{
"op": "replace",
"path": [],
"value": 6,
},
],
],
}
`);

result = renderHook(() =>
useTravel(nextState, {
maxHistory: 3,
Expand Down Expand Up @@ -1205,5 +1256,68 @@ describe('useTravel', () => {
expect(controls.getHistory()).toEqual([3, 4, 5, 7]);
expect(controls.canBack()).toBe(true);
expect(controls.canForward()).toBe(false);

act(() => setState(() => 8));
[nextState, setState, controls] = result.current;

expect(nextState).toEqual(8);
expect(controls.position).toEqual(3);
expect(controls.getHistory()).toEqual([3, 4, 7, 8]);
expect(controls.canBack()).toBe(true);
expect(controls.canForward()).toBe(false);

act(() => controls.archive());
[nextState, setState, controls] = result.current;

expect(controls.patches).toMatchInlineSnapshot(`
{
"inversePatches": [
[
{
"op": "replace",
"path": [],
"value": 3,
},
],
[
{
"op": "replace",
"path": [],
"value": 4,
},
],
[
{
"op": "replace",
"path": [],
"value": 5,
},
],
],
"patches": [
[
{
"op": "replace",
"path": [],
"value": 4,
},
],
[
{
"op": "replace",
"path": [],
"value": 5,
},
],
[
{
"op": "replace",
"path": [],
"value": 8,
},
],
],
}
`);
});
});

0 comments on commit b1c059e

Please sign in to comment.