Skip to content

Commit

Permalink
implement useClickAway
Browse files Browse the repository at this point in the history
  • Loading branch information
heyjul3s committed Mar 29, 2021
1 parent 164e32e commit 3fd902f
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 9 deletions.
7 changes: 0 additions & 7 deletions packages/useclickaway/__tests__/useclickaway.test.ts

This file was deleted.

37 changes: 37 additions & 0 deletions packages/useclickaway/__tests__/useclickaway.test.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import React from 'react';
import { render, screen } from '@testing-library/react';
import { useClickAway } from '../src';

describe('@artifak/useclickaway', () => {
const onClickAway = jest.fn();

const Dummy = () => {
const ref: React.RefObject<HTMLDivElement> = React.createRef();

useClickAway(ref, onClickAway);

const onClick = () => {
console.log('Clicked');
};

return (
<div>
Wrapper
<div ref={ref} onClick={onClick}>
Click Me
</div>
</div>
);
};

it('calls the clickAway callback when click event occurs on non-target ref', () => {
render(<Dummy />);

const Wrapper = screen.getByText('Wrapper');

Wrapper.focus();
Wrapper.click();

expect(onClickAway).toHaveBeenCalled();
});
});
19 changes: 17 additions & 2 deletions packages/useclickaway/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,18 @@
export function useClickAway() {
// TODO
import { useEffect, RefObject } from 'react';

export function useClickAway(
ref: RefObject<HTMLElement | null>,
onClickAway: (e: Event) => void
) {
const handleClick = (e: Event) => {
ref.current && !ref.current.contains(e.target as Node) && onClickAway(e);
};

useEffect(() => {
document.addEventListener('click', handleClick);

return function unmountUseClickAway() {
document.removeEventListener('click', handleClick);
};
}, [ref]);
}

0 comments on commit 3fd902f

Please sign in to comment.