import React, { FC, MouseEventHandler, ReactChild, useCallback, useEffect, useState } from "react"; // import { DialogPanel } from '~/components/panels/DialogPanel'; import { Scroll } from "~/components/containers/Scroll"; import * as styles from "./styles.scss"; import classNames from "classnames"; interface IProps { children: React.ReactChild; title?: JSX.Element; buttons?: JSX.Element; size?: "medium" | "big"; width?: number; error?: string; top_sticky?: ReactChild; top_sticky_offset?: number; onOverlayClick?: MouseEventHandler; onRefCapture?: (ref: any) => void; onClose?: () => void; } const ScrollDialog: FC = ({ children, title, buttons, width = 800, top_sticky, top_sticky_offset, error, onOverlayClick, onRefCapture, onClose, }) => { const [height, setHeight] = useState(window.innerHeight - 120); const [show_top_sticky, setShowTopSticky] = useState(false); const [ref, setRef] = useState(null); const onResize = useCallback(() => setHeight(window.innerHeight - 120), []); useEffect(() => { window.addEventListener("resize", onResize); return () => window.removeEventListener("resize", onResize); }, []); const onScroll = useCallback( ({ target: { scrollTop = 0 } = {} } = {}) => { if (!top_sticky || (!top_sticky_offset && top_sticky_offset !== 0)) return; const is_shown = scrollTop >= top_sticky_offset + 20; if (show_top_sticky !== is_shown) setShowTopSticky(is_shown); }, [top_sticky, top_sticky_offset, show_top_sticky, setShowTopSticky] ); useEffect(() => onScroll(), []); useEffect(() => { if (ref && onRefCapture) onRefCapture(ref); }, [ref, onRefCapture]); return (
{!!title && (
{ onClose &&
}
{title} {show_top_sticky && top_sticky && (
{top_sticky}
)}
)} {!title && (
{ onClose &&
}
)} {!!buttons && (
{error}
{buttons}
)}
{children}
); }; export { ScrollDialog };