1
0
mirror of https://gitlab.nic.cz/turris/reforis/foris-js.git synced 2024-07-02 20:30:27 +00:00

Detect clicks outside element with a hook

This commit is contained in:
Maciej Lenartowicz 2019-12-16 13:44:58 +01:00
parent 73f84a2d81
commit 90509f2a23
No known key found for this signature in database
GPG Key ID: 1ABD2CB41B59B8E4
6 changed files with 24 additions and 15 deletions

2
package-lock.json generated
View File

@ -1,6 +1,6 @@
{ {
"name": "foris", "name": "foris",
"version": "2.0.0", "version": "2.1.0",
"lockfileVersion": 1, "lockfileVersion": 1,
"requires": true, "requires": true,
"dependencies": { "dependencies": {

View File

@ -1,6 +1,6 @@
{ {
"name": "foris", "name": "foris",
"version": "2.0.0", "version": "2.1.0",
"description": "Set of components and utils for Foris and its plugins.", "description": "Set of components and utils for Foris and its plugins.",
"author": "CZ.NIC, z.s.p.o.", "author": "CZ.NIC, z.s.p.o.",
"repository": { "repository": {

View File

@ -5,10 +5,11 @@
* See /LICENSE for more information. * See /LICENSE for more information.
*/ */
import React, { useEffect, useRef } from "react"; import React, { useRef } from "react";
import PropTypes from "prop-types"; import PropTypes from "prop-types";
import { Portal } from "utils/Portal"; import { Portal } from "utils/Portal";
import { useClickOutside } from "utils/hooks";
Modal.propTypes = { Modal.propTypes = {
/** Is modal shown value */ /** Is modal shown value */
@ -26,16 +27,7 @@ Modal.propTypes = {
export function Modal({ shown, setShown, children }) { export function Modal({ shown, setShown, children }) {
const dialogRef = useRef(); const dialogRef = useRef();
useEffect(() => { useClickOutside(dialogRef, () => setShown(false));
function handleClickOutsideDialog(e) {
if (!dialogRef.current.contains(e.target)) setShown(false);
}
document.addEventListener("mousedown", handleClickOutsideDialog);
return () => {
document.removeEventListener("mousedown", handleClickOutsideDialog);
};
}, [setShown]);
return ( return (
<Portal containerId="modal-container"> <Portal containerId="modal-container">

View File

@ -10,6 +10,7 @@ import React from 'react';
import { act, fireEvent, render, waitForElement } from 'customTestRender'; import { act, fireEvent, render, waitForElement } from 'customTestRender';
import mockAxios from 'jest-mock-axios'; import mockAxios from 'jest-mock-axios';
import { ForisForm } from "../components/ForisForm"; import { ForisForm } from "../components/ForisForm";
import { WebSockets } from "webSockets/WebSockets";
// It's possible to unittest each hooks via react-hooks-testing-library. // It's possible to unittest each hooks via react-hooks-testing-library.
@ -30,7 +31,6 @@ describe('useForm hook.', () => {
let mockValidator; let mockValidator;
let mockPrepData; let mockPrepData;
let mockPrepDataToSubmit; let mockPrepDataToSubmit;
let mockWebSockets;
let input; let input;
let form; let form;
const Child = jest.fn(props => <TestForm {...props}/>); const Child = jest.fn(props => <TestForm {...props}/>);
@ -41,7 +41,7 @@ describe('useForm hook.', () => {
mockValidator = jest.fn(data => data.field === 'invalidValue' ? {field: 'Error'} : {}); mockValidator = jest.fn(data => data.field === 'invalidValue' ? {field: 'Error'} : {});
const {getByTestId, container} = render( const {getByTestId, container} = render(
<ForisForm <ForisForm
ws={mockWebSockets} ws={new WebSockets()}
// Just some module which exists... // Just some module which exists...
forisConfig={{ forisConfig={{
endpoint: 'testEndpoint', endpoint: 'testEndpoint',

View File

@ -62,6 +62,7 @@ export {
withEither, withSpinner, withSending, withSpinnerOnSending, withError, withErrorMessage, withEither, withSpinner, withSending, withSpinnerOnSending, withError, withErrorMessage,
} from "utils/conditionalHOCs"; } from "utils/conditionalHOCs";
export { ErrorMessage } from "utils/ErrorMessage"; export { ErrorMessage } from "utils/ErrorMessage";
export { useClickOutside } from "utils/hooks";
// Foris URL // Foris URL
export { ForisURLs, REFORIS_URL_PREFIX } from "forisUrls"; export { ForisURLs, REFORIS_URL_PREFIX } from "forisUrls";

View File

@ -18,3 +18,19 @@ export function useConditionalTimeout({ callback, timeout = 125 }, ...callbackAr
}, [condition, callback, timeout, callbackArgs]); }, [condition, callback, timeout, callbackArgs]);
return setCondition; return setCondition;
} }
/** Execute callback when user clicks outside specified element. */
export function useClickOutside(element, callback) {
function handleClickOutside(event) {
if (element.current && !element.current.contains(event.target)) {
callback(event);
}
}
useEffect(() => {
document.addEventListener("mousedown", handleClickOutside);
return () => {
document.removeEventListener("mousedown", handleClickOutside);
};
});
}