Skip to content

Commit

Permalink
feat(patches): implement merge patches when archive() (#3)
Browse files Browse the repository at this point in the history
  • Loading branch information
unadlib authored Mar 24, 2024
1 parent 823ccb5 commit cce9783
Show file tree
Hide file tree
Showing 2 changed files with 120 additions and 2 deletions.
12 changes: 10 additions & 2 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
110 changes: 110 additions & 0 deletions test/index.test.ts
Original file line number Diff line number Diff line change
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 @@ -1374,5 +1425,64 @@ describe('useTravel', () => {
],
}
`);

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

expect(nextState).toEqual(8);
expect(controls.position).toEqual(3);
expect(controls.getHistory()).toEqual([3, 4, 5, 8]);
expect(controls.canBack()).toBe(true);
expect(controls.canForward()).toBe(false);
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 cce9783

Please sign in to comment.