diff --git a/client/src/components/Card/Card.jsx b/client/src/components/Card/Card.jsx index f7f06ab0..ef066c55 100755 --- a/client/src/components/Card/Card.jsx +++ b/client/src/components/Card/Card.jsx @@ -1,16 +1,17 @@ -import React, { useCallback, useRef, useState } from 'react'; +import React, { useCallback, useRef } from 'react'; import PropTypes from 'prop-types'; import classNames from 'classnames'; import { Button, Icon } from 'semantic-ui-react'; import { Link } from 'react-router-dom'; import { Draggable } from 'react-beautiful-dnd'; -import { ControlledMenu, useMenuState } from '@szhsin/react-menu'; +import BoardMembershipsStep from '../BoardMembershipsStep'; + +import usePopupMenu from '../../lib/hooks/use-popup-menu'; import { startTimer, stopTimer } from '../../utils/timer'; import Paths from '../../constants/Paths'; import Tasks from './Tasks'; import NameEdit from './NameEdit'; -import { ActionsStep } from './ActionsPopup'; import User from '../User'; import Label from '../Label'; import DueDate from '../DueDate'; @@ -53,8 +54,6 @@ const Card = React.memo( onLabelDelete, }) => { const nameEdit = useRef(null); - const [menuProps, toggleMenu] = useMenuState(); - const [anchorPoint, setAnchorPoint] = useState({ x: 0, y: 0 }); const handleClick = useCallback(() => { if (document.activeElement) { @@ -86,14 +85,33 @@ const Card = React.memo( nameEdit.current.open(); }, []); - const handleContextMenu = useCallback( - (e) => { - e.preventDefault(); - setAnchorPoint({ x: e.clientX, y: e.clientY }); - toggleMenu(true); + const { + handleContextMenu, + element: popupElement, + setElement, + toggleMenu, + } = usePopupMenu('test', [ + { + title: 'Edit Title', + onClick: () => { + handleNameEdit(); + toggleMenu(false); + }, }, - [toggleMenu], - ); + { + title: 'Edit Members', + onClick: () => { + setElement( + user.id)} + onUserSelect={onUserAdd} + onUserDeselect={onUserRemove} + />, + ); + }, + }, + ]); const contentNode = ( <> @@ -191,43 +209,7 @@ const Card = React.memo( - {canEdit && ( - toggleMenu(false)} - > - user.id)} - labels={allLabels} - currentLabelIds={labels.map((label) => label.id)} - onNameEdit={handleNameEdit} - onUpdate={onUpdate} - onMove={onMove} - onTransfer={onTransfer} - onDelete={onDelete} - onUserAdd={onUserAdd} - onUserRemove={onUserRemove} - onBoardFetch={onBoardFetch} - onLabelAdd={onLabelAdd} - onLabelRemove={onLabelRemove} - onLabelCreate={onLabelCreate} - onLabelUpdate={onLabelUpdate} - onLabelDelete={onLabelDelete} - /> - - )} + {canEdit && popupElement} ) : ( {contentNode} diff --git a/client/src/lib/hooks/use-popup-menu.jsx b/client/src/lib/hooks/use-popup-menu.jsx new file mode 100644 index 00000000..9617d3c0 --- /dev/null +++ b/client/src/lib/hooks/use-popup-menu.jsx @@ -0,0 +1,68 @@ +import React, { useState, useCallback } from 'react'; +import { ControlledMenu, useMenuState } from '@szhsin/react-menu'; +import { Menu } from 'semantic-ui-react'; +import { Popup } from '../custom-ui'; + +import '@szhsin/react-menu/dist/index.css'; + +/** + * hooks for popup menu + * + * @param {string} title Title of the popup + * @param {{ + * title: string, + * onClick: () => void, + * }[]} list Menu list to shown + */ +export default function usePopupMenu(title, list) { + const [menuProps, toggleMenu] = useMenuState(); + const [anchorPoint, setAnchorPoint] = useState({ x: 0, y: 0 }); + const [customElement, setElement] = useState(null); + + const handleContextMenu = useCallback( + (e) => { + e.preventDefault(); + setAnchorPoint({ x: e.clientX, y: e.clientY }); + toggleMenu(true); + }, + [toggleMenu], + ); + + const handleClose = useCallback(() => { + toggleMenu(false); + setElement(null); + }, [toggleMenu]); + + const element = ( + + {customElement || ( + <> + {title} + + + + {list.map(({ title: itemTitle, onClick }) => ( + + {itemTitle} + + ))} + + + + )} + + ); + + return { + handleContextMenu, + toggleMenu, + element, + setElement, + }; +}