feat: add task details
This commit is contained in:
@ -1,9 +1,10 @@
|
||||
import React, { useRef } from 'react';
|
||||
import React, { useRef, useEffect, useState } from 'react';
|
||||
import ReactDOM from 'react-dom';
|
||||
|
||||
import useOnOutsideClick from 'shared/hooks/onOutsideClick';
|
||||
import useOnEscapeKeyDown from 'shared/hooks/onEscapeKeyDown';
|
||||
|
||||
import useWindowSize from 'shared/hooks/useWindowSize';
|
||||
import styled from 'styled-components';
|
||||
import { Cross } from 'shared/icons';
|
||||
import { ScrollOverlay, ClickableOverlay, StyledModal } from './Styles';
|
||||
|
||||
const $root: HTMLElement = document.getElementById('root')!; // eslint-disable-line @typescript-eslint/no-non-null-assertion
|
||||
@ -14,21 +15,50 @@ type ModalProps = {
|
||||
renderContent: () => JSX.Element;
|
||||
};
|
||||
|
||||
const Modal: React.FC<ModalProps> = ({ width, onClose: tellParentToClose, renderContent }) => {
|
||||
function getAdjustedHeight(height: number) {
|
||||
if (height >= 900) {
|
||||
return height - 150;
|
||||
}
|
||||
if (height >= 800) {
|
||||
return height - 125;
|
||||
}
|
||||
return height - 70;
|
||||
}
|
||||
|
||||
const CloseIcon = styled(Cross)`
|
||||
position: absolute;
|
||||
top: 16px;
|
||||
right: -32px;
|
||||
cursor: pointer;
|
||||
fill: rgba(${props => props.theme.colors.text.primary});
|
||||
&:hover {
|
||||
fill: rgba(${props => props.theme.colors.text.secondary});
|
||||
}
|
||||
`;
|
||||
|
||||
const InnerModal: React.FC<ModalProps> = ({ width, onClose: tellParentToClose, renderContent }) => {
|
||||
const $modalRef = useRef<HTMLDivElement>(null);
|
||||
const $clickableOverlayRef = useRef<HTMLDivElement>(null);
|
||||
const [_width, height] = useWindowSize();
|
||||
|
||||
useOnOutsideClick($modalRef, true, tellParentToClose, $clickableOverlayRef);
|
||||
useOnEscapeKeyDown(true, tellParentToClose);
|
||||
|
||||
return ReactDOM.createPortal(
|
||||
return (
|
||||
<ScrollOverlay>
|
||||
<ClickableOverlay ref={$clickableOverlayRef}>
|
||||
<StyledModal width={width} ref={$modalRef}>
|
||||
<StyledModal width={width} height={getAdjustedHeight(height)} ref={$modalRef}>
|
||||
{renderContent()}
|
||||
<CloseIcon onClick={() => tellParentToClose()} width={20} height={20} />
|
||||
</StyledModal>
|
||||
</ClickableOverlay>
|
||||
</ScrollOverlay>,
|
||||
</ScrollOverlay>
|
||||
);
|
||||
};
|
||||
|
||||
const Modal: React.FC<ModalProps> = ({ width, onClose: tellParentToClose, renderContent }) => {
|
||||
return ReactDOM.createPortal(
|
||||
<InnerModal width={width} onClose={tellParentToClose} renderContent={renderContent} />,
|
||||
$root,
|
||||
);
|
||||
};
|
||||
|
Reference in New Issue
Block a user