Skip to content

Commit

Permalink
fix: emit endStroke on pointerup outside of canvas (#604)
Browse files Browse the repository at this point in the history
  • Loading branch information
UziTech committed Mar 18, 2022
1 parent 878786e commit 29b80dd
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 16 deletions.
5 changes: 2 additions & 3 deletions src/signature_pad.ts
Original file line number Diff line number Diff line change
Expand Up @@ -276,10 +276,9 @@ export default class SignaturePad extends SignatureEventTarget {
};

private _handlePointerEnd = (event: PointerEvent): void => {
this._drawningStroke = false;
const wasCanvasTouched = event.target === this.canvas;
if (wasCanvasTouched) {
if (this._drawningStroke) {
event.preventDefault();
this._drawningStroke = false;
this._strokeEnd(event);
}
};
Expand Down
56 changes: 43 additions & 13 deletions tests/signature_pad.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -137,11 +137,39 @@ describe('user interactions', () => {
);
expect(pad.toDataURL('image/svg+xml')).toMatchSnapshot();
});

it('call endStroke on pointerup outside canvas', () => {
const pad = new SignaturePad(canvas);
const endStroke = jest.fn();
pad.addEventListener('endStroke', endStroke);
canvas.dispatchEvent(
new PointerEvent('pointerdown', {
clientX: 50,
clientY: 30,
pressure: 1,
}),
);
canvas.dispatchEvent(
new PointerEvent('pointermove', {
clientX: 240,
clientY: 30,
pressure: 1,
}),
);
document.dispatchEvent(
new PointerEvent('pointerup', {
clientX: 150,
clientY: 120,
pressure: 1,
}),
);
expect(endStroke).toHaveBeenCalled();
});
});

describe('Signature events.', () => {
let signpad: SignaturePad;
let eventDispatched: Event;
let eventDispatched: Event | undefined;

const eventHandler: EventListener = (evt: Event): void => {
eventDispatched = evt;
Expand All @@ -152,20 +180,22 @@ describe('Signature events.', () => {

// to make this test works, canvas must be added to the document body.
document.body.insertAdjacentElement('afterbegin', canvas);

eventDispatched = undefined;
});

afterEach(() => {
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
eventDispatched = undefined!;

document.body.removeChild(canvas);
});

[
{ eventName: 'beginStroke', dispatchedEventName: 'pointerdown' },
{ eventName: 'beforeUpdateStroke', dispatchedEventName: 'pointerdown' },
{ eventName: 'afterUpdateStroke', dispatchedEventName: 'pointerdown' },
{ eventName: 'endStroke', dispatchedEventName: 'pointerup' },
{ eventName: 'beginStroke', dispatchedEventName: ['pointerdown'] },
{ eventName: 'beforeUpdateStroke', dispatchedEventName: ['pointerdown'] },
{ eventName: 'afterUpdateStroke', dispatchedEventName: ['pointerdown'] },
{
eventName: 'endStroke',
dispatchedEventName: ['pointerdown', 'pointerup'],
},
].forEach((param) => {
describe(`${param.eventName}.`, () => {
beforeEach(() => {
Expand All @@ -187,11 +217,11 @@ describe('Signature events.', () => {
pressure: 1,
bubbles: true,
};
const pointerEvent = new PointerEvent(
param.dispatchedEventName,
eventInitObj,
);
canvas.dispatchEvent(pointerEvent);
let pointerEvent;
for (const dispatchedEventName of param.dispatchedEventName) {
pointerEvent = new PointerEvent(dispatchedEventName, eventInitObj);
canvas.dispatchEvent(pointerEvent);
}

expect(eventDispatched).toBeTruthy();
expect(eventDispatched).toBeInstanceOf(CustomEvent);
Expand Down

0 comments on commit 29b80dd

Please sign in to comment.