p5.js-web-editor/client/utils/custom-hooks.js

52 lines
1.3 KiB
JavaScript
Raw Normal View History

2020-07-29 21:01:40 +02:00
import React, { useEffect, useRef, useMemo, useState } from 'react';
2020-07-21 00:08:03 +02:00
export const noop = () => {};
export const useDidUpdate = (callback, deps) => {
const hasMount = useRef(false);
useEffect(() => {
if (hasMount.current) {
callback();
} else {
hasMount.current = true;
}
}, deps);
};
2020-07-29 20:15:55 +02:00
2020-07-29 21:01:40 +02:00
// Usage: const ref = useModalBehavior(() => setSomeState(false))
// place this ref on a component
export const useModalBehavior = (hideOverlay) => {
2020-07-29 20:15:55 +02:00
const ref = useRef({});
2020-07-29 21:01:40 +02:00
// Return values
2020-07-29 20:15:55 +02:00
const setRef = (r) => { ref.current = r; };
2020-07-29 21:01:40 +02:00
const [visible, setVisible] = useState(true);
const trigger = () => setVisible(true);
const hide = () => setVisible(false);
2020-07-29 20:15:55 +02:00
const handleClickOutside = ({ target }) => {
if (ref && ref.current && !ref.current.contains(target)) {
2020-07-29 21:01:40 +02:00
hide();
2020-07-29 20:15:55 +02:00
}
};
useEffect(() => {
document.addEventListener('mousedown', handleClickOutside);
return () => document.removeEventListener('mousedown', handleClickOutside);
}, [ref]);
2020-07-29 21:01:40 +02:00
return [visible, trigger, setRef];
};
// TODO: This is HOC, not a hook. Where do we put it?
export const useAsModal = (component) => {
const [visible, trigger, setRef] = useModalBehavior();
const wrapper = () => (<div ref={setRef}> {visible && component} </div>); // eslint-disable-line
return [trigger, wrapper];
2020-07-29 20:15:55 +02:00
};