diff --git a/client/src/components/Card/Card.jsx b/client/src/components/Card/Card.jsx index 262b09b1..e769262c 100755 --- a/client/src/components/Card/Card.jsx +++ b/client/src/components/Card/Card.jsx @@ -5,6 +5,7 @@ import { Button, Icon } from 'semantic-ui-react'; import { Link } from 'react-router-dom'; import { Draggable } from 'react-beautiful-dnd'; +import { startTimer, stopTimer } from '../../utils/timer'; import Paths from '../../constants/Paths'; import Tasks from './Tasks'; import NameEdit from './NameEdit'; @@ -57,6 +58,17 @@ const Card = React.memo( } }, []); + const handleToggleTimerClick = useCallback( + (event) => { + event.preventDefault(); + + onUpdate({ + timer: timer.startedAt ? stopTimer(timer) : startTimer(timer), + }); + }, + [timer, onUpdate], + ); + const handleNameUpdate = useCallback( (newName) => { onUpdate({ @@ -108,7 +120,13 @@ const Card = React.memo( )} {timer && ( - + )} diff --git a/client/src/components/CardModal/CardModal.jsx b/client/src/components/CardModal/CardModal.jsx index cabdc587..d9554fb5 100755 --- a/client/src/components/CardModal/CardModal.jsx +++ b/client/src/components/CardModal/CardModal.jsx @@ -5,6 +5,7 @@ import { useTranslation } from 'react-i18next'; import { Button, Grid, Icon, Modal } from 'semantic-ui-react'; import { Markdown } from '../../lib/custom-ui'; +import { startTimer, stopTimer } from '../../utils/timer'; import NameField from './NameField'; import DescriptionEdit from './DescriptionEdit'; import Tasks from './Tasks'; @@ -80,6 +81,12 @@ const CardModal = React.memo( const isGalleryOpened = useRef(false); + const handleToggleTimerClick = useCallback(() => { + onUpdate({ + timer: timer.startedAt ? stopTimer(timer) : startTimer(timer), + }); + }, [timer, onUpdate]); + const handleNameUpdate = useCallback( (newName) => { onUpdate({ @@ -291,6 +298,17 @@ const CardModal = React.memo( )} + )} diff --git a/client/src/components/Timer/Timer.jsx b/client/src/components/Timer/Timer.jsx index 62ea4ca1..3f3a2812 100644 --- a/client/src/components/Timer/Timer.jsx +++ b/client/src/components/Timer/Timer.jsx @@ -14,7 +14,7 @@ const SIZES = { MEDIUM: 'medium', }; -const Timer = React.memo(({ startedAt, total, size, isDisabled, onClick }) => { +const Timer = React.memo(({ as, startedAt, total, size, isDisabled, onClick }) => { const prevStartedAt = usePrevious(startedAt); const forceUpdate = useForceUpdate(); @@ -52,6 +52,7 @@ const Timer = React.memo(({ startedAt, total, size, isDisabled, onClick }) => { className={classNames( styles.wrapper, styles[`wrapper${upperFirst(size)}`], + startedAt && styles.wrapperActive, onClick && styles.wrapperHoverable, )} > @@ -59,16 +60,19 @@ const Timer = React.memo(({ startedAt, total, size, isDisabled, onClick }) => { ); + const ElementType = as; + return onClick ? ( - + ) : ( contentNode ); }); Timer.propTypes = { + as: PropTypes.elementType, startedAt: PropTypes.instanceOf(Date), total: PropTypes.number.isRequired, // eslint-disable-line react/no-unused-prop-types size: PropTypes.oneOf(Object.values(SIZES)), @@ -77,6 +81,7 @@ Timer.propTypes = { }; Timer.defaultProps = { + as: 'button', startedAt: undefined, size: SIZES.MEDIUM, isDisabled: false, diff --git a/client/src/components/Timer/Timer.module.scss b/client/src/components/Timer/Timer.module.scss index a873fde0..ce765315 100644 --- a/client/src/components/Timer/Timer.module.scss +++ b/client/src/components/Timer/Timer.module.scss @@ -9,10 +9,10 @@ } .wrapper { - background: #f3f4f6; + background: #dce0e4; border: none; border-radius: 3px; - color: #7e8ea3; + color: #6a808b; display: inline-block; font-variant-numeric: tabular-nums; outline: none; @@ -21,6 +21,16 @@ vertical-align: top; } + .wrapperActive { + background: #21ba45; + color: #fff; + + &.wrapperHoverable:hover { + background: #16ab39; + color: #fff; + } + } + .wrapperHoverable:hover { background: #d2d8dc; color: #17394d; @@ -43,6 +53,5 @@ .wrapperMedium { line-height: 20px; padding: 6px 12px; - text-decoration: underline; } }