Skip to content

Commit

Permalink
Move equality check from observer to notifier
Browse files Browse the repository at this point in the history
  • Loading branch information
clauderic committed Sep 12, 2024
1 parent 94920c8 commit a5933d8
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 8 deletions.
5 changes: 5 additions & 0 deletions .changeset/notifier-observer.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@dnd-kit/abstract': patch
---

Move responsibility from `CollisionObserver` to `CollisionNotifier` to check if the previous collisions are equal to the next collisions.
13 changes: 13 additions & 0 deletions packages/abstract/src/core/collision/notifier.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,17 @@ import {DragDropManager} from '../manager/index.ts';
import {CorePlugin} from '../plugins/index.ts';
import {defaultPreventable} from '../manager/events.ts';

import type {Collision} from './types.ts';

export class CollisionNotifier extends CorePlugin {
constructor(manager: DragDropManager<any, any>) {
super(manager);

const isEqual = (a: Collision[], b: Collision[]) =>
a.map(({id}) => id).join('') === b.map(({id}) => id).join('');

let previousCollisions: Collision[] = [];

this.destroy = effect(() => {
const {collisionObserver, monitor} = manager;
const {collisions} = collisionObserver;
Expand All @@ -26,6 +33,12 @@ export class CollisionNotifier extends CorePlugin {
return;
}

if (isEqual(collisions, previousCollisions)) {
return;
} else {
previousCollisions = collisions;
}

const [firstCollision] = collisions;

untracked(() => {
Expand Down
8 changes: 0 additions & 8 deletions packages/abstract/src/core/collision/observer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,19 +20,11 @@ export class CollisionObserver<
this.computeCollisions = this.computeCollisions.bind(this);
this.#collisions = signal(DEFAULT_VALUE);

const isEqual = (a: Collision[], b: Collision[]) =>
a.map(({id}) => id).join('') === b.map(({id}) => id).join('');

let previousCoordinates: Coordinates = {x: 0, y: 0};

this.destroy = effects(
() => {
const collisions = this.computeCollisions();
const previousCollisions = this.#collisions.peek();

if (isEqual(collisions, previousCollisions)) {
return;
}

const coordinates = untracked(
() => this.manager.dragOperation.position.current
Expand Down

0 comments on commit a5933d8

Please sign in to comment.