Skip to content

Commit 8339be1

Browse files
committed
♻️ create useHideOnBlur hook
1 parent b8bdfd9 commit 8339be1

File tree

3 files changed

+25
-18
lines changed

3 files changed

+25
-18
lines changed

client/components/OverlayManager.jsx

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,10 @@ import { createPortal } from 'react-dom';
55
import Dropdown from './Dropdown';
66

77
import { PreferencesIcon } from '../common/icons';
8+
import { useHideOnBlur } from '../utils/custom-hooks';
89

9-
const OverlayManager = ({ overlay, hideOverlay }) => {
10-
const ref = useRef({});
11-
12-
const handleClickOutside = ({ target }) => {
13-
if (ref && ref.current && !ref.current.contains(target)) {
14-
hideOverlay();
15-
}
16-
};
17-
18-
useEffect(() => {
19-
document.addEventListener('mousedown', handleClickOutside);
20-
21-
return () => document.removeEventListener('mousedown', handleClickOutside);
22-
}, [ref]);
2310

11+
const OverlayManager = ({ overlay, hideOverlay }) => {
2412
const headerNavOptions = [
2513
{
2614
icon: PreferencesIcon,
@@ -35,9 +23,11 @@ const OverlayManager = ({ overlay, hideOverlay }) => {
3523
},
3624
];
3725

26+
const setRef = useHideOnBlur(hideOverlay);
27+
3828
const jsx = (
3929
<React.Fragment>
40-
<div ref={(r) => { ref.current = r; }} >
30+
<div ref={setRef} >
4131
{overlay === 'dropdown' && <Dropdown items={headerNavOptions} />}
4232
</div>
4333
</React.Fragment>

client/modules/Mobile/MobileSketchView.jsx

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import React from 'react';
2-
import PropTypes from 'prop-types';
32
import { bindActionCreators } from 'redux';
4-
import { connect, useSelector, useDispatch } from 'react-redux';
3+
import { useSelector, useDispatch } from 'react-redux';
54
import styled from 'styled-components';
65
import Header from '../../components/mobile/Header';
76
import IconButton from '../../components/mobile/IconButton';
@@ -25,7 +24,7 @@ const Content = styled.div`
2524
margin-top: ${remSize(68)};
2625
`;
2726

28-
const MobileSketchView = (props) => {
27+
const MobileSketchView = () => {
2928
const { files, ide, preferences } = useSelector(state => state);
3029

3130
const htmlFile = useSelector(state => getHTMLFile(state.files));

client/utils/custom-hooks.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,21 @@ export const useDidUpdate = (callback, deps) => {
1313
}
1414
}, deps);
1515
};
16+
17+
export const useHideOnBlur = (hideOverlay) => {
18+
const ref = useRef({});
19+
const setRef = (r) => { ref.current = r; };
20+
21+
const handleClickOutside = ({ target }) => {
22+
if (ref && ref.current && !ref.current.contains(target)) {
23+
hideOverlay();
24+
}
25+
};
26+
27+
useEffect(() => {
28+
document.addEventListener('mousedown', handleClickOutside);
29+
return () => document.removeEventListener('mousedown', handleClickOutside);
30+
}, [ref]);
31+
32+
return setRef;
33+
};

0 commit comments

Comments
 (0)