refactor: use strict

This commit is contained in:
Tim 2024-02-22 07:59:39 +01:00
parent ed34415980
commit c460a1edf7
4 changed files with 19 additions and 18 deletions

View file

@ -9,8 +9,8 @@ import styles from './styles.less';
type Props = { type Props = {
children: JSX.Element, children: JSX.Element,
className: string, className: string,
shortcut: string, shortcut?: string,
position: MenuPosition, position?: MenuPosition,
}; };
const createId = () => (Math.random() + 1).toString(36).substring(7); const createId = () => (Math.random() + 1).toString(36).substring(7);
@ -27,22 +27,23 @@ const Menu = ({ children, className, shortcut, position }: Props) => {
useEffect(() => { useEffect(() => {
const parent = element.current?.parentElement; const parent = element.current?.parentElement;
parent.addEventListener('click', onToggle); if (parent) {
parent.addEventListener('click', onToggle);
menu.create({ menu.create({
id: id.current, id: id.current,
className, className,
parent, parent,
position, position,
}); });
}
return () => { return () => {
parent.removeEventListener('click', onToggle); parent && parent.removeEventListener('click', onToggle);
menu.remove(id.current); menu.remove(id.current);
}; };
}, []); }, []);
useKeyboardEvent(shortcut, onToggle, !shortcut); shortcut && useKeyboardEvent(shortcut, onToggle, !shortcut);
return <> return <>
<div ref={element} className={styles['menu-placeholder']} /> <div ref={element} className={styles['menu-placeholder']} />

View file

@ -17,7 +17,7 @@ const MenuProvider = ({ children, className }: Props) => {
const container = useRef<HTMLDivElement>(null); const container = useRef<HTMLDivElement>(null);
const [menus, setMenus] = useState<Menu[]>([]); const [menus, setMenus] = useState<Menu[]>([]);
const [style, setStyle] = useState<React.CSSProperties>(null); const [style, setStyle] = useState<React.CSSProperties>({});
const active = useMemo(() => menus.find(({ open }) => open), [menus]); const active = useMemo(() => menus.find(({ open }) => open), [menus]);
@ -36,7 +36,7 @@ const MenuProvider = ({ children, className }: Props) => {
}; };
const render = (content: JSX.Element) => { const render = (content: JSX.Element) => {
return createPortal(content, container.current); return container.current && createPortal(content, container.current);
}; };
const toggle = (id: string) => { const toggle = (id: string) => {
@ -54,7 +54,7 @@ const MenuProvider = ({ children, className }: Props) => {
}; };
useLayoutEffect(() => { useLayoutEffect(() => {
setStyle(null); setStyle({});
if (container.current && active) { if (container.current && active) {
const menu = container.current.getBoundingClientRect(); const menu = container.current.getBoundingClientRect();
@ -71,7 +71,7 @@ const MenuProvider = ({ children, className }: Props) => {
}, [active]); }, [active]);
useKeyboardEvent('Escape', closeAll); useKeyboardEvent('Escape', closeAll);
useOnClickOutside([container.current, active?.parent], closeAll); useOnClickOutside(container.current && active?.parent ? [container.current, active.parent] : [], closeAll);
return ( return (
<MenuContext.Provider value={{ active, create, remove, render, toggle }}> <MenuContext.Provider value={{ active, create, remove, render, toggle }}>

View file

@ -4,6 +4,6 @@ export type Menu = {
id: string, id: string,
className: string, className: string,
parent: HTMLElement, parent: HTMLElement,
position: MenuPosition, position?: MenuPosition,
open: boolean, open: boolean,
}; };

View file

@ -13,7 +13,7 @@
"allowJs": true, "allowJs": true,
"checkJs": false, "checkJs": false,
"noEmit": false, "noEmit": false,
"strict": false "strict": true
}, },
"include": [ "include": [
"./src", "./src",