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;
}
}