/*! * Copyright (c) 2024 PLANKA Software GmbH * Licensed under the Fair Use License: https://github.com/plankanban/planka/blob/master/LICENSE.md */ import React, { useMemo } from 'react'; import PropTypes from 'prop-types'; import { useSelector } from 'react-redux'; import { useTranslation, Trans } from 'react-i18next'; import { Link } from 'react-router-dom'; import { Comment } from 'semantic-ui-react'; import selectors from '../../../selectors'; import { isUserStatic } from '../../../utils/record-helpers'; import Paths from '../../../constants/Paths'; import { ActivityTypes } from '../../../constants/Enums'; import TimeAgo from '../../common/TimeAgo'; import UserAvatar from '../../users/UserAvatar'; import styles from './Item.module.scss'; const Item = React.memo(({ id }) => { const selectActivityById = useMemo(() => selectors.makeSelectActivityById(), []); const selectUserById = useMemo(() => selectors.makeSelectUserById(), []); const selectCardById = useMemo(() => selectors.makeSelectCardById(), []); const activity = useSelector((state) => selectActivityById(state, id)); const user = useSelector((state) => selectUserById(state, activity.userId)); const card = useSelector((state) => selectCardById(state, activity.cardId)); const [t] = useTranslation(); const userName = isUserStatic(user) ? t(`common.${user.name}`, { context: 'title', }) : user.name; const cardName = card ? card.name : activity.data.card.name; let contentNode; switch (activity.type) { case ActivityTypes.CREATE_CARD: { const { list } = activity.data; const listName = list.name || t(`common.${list.type}`); contentNode = ( {userName} {' added '} {cardName} {' to '} {listName} ); break; } case ActivityTypes.MOVE_CARD: { const { fromList, toList } = activity.data; const fromListName = fromList.name || t(`common.${fromList.type}`); const toListName = toList.name || t(`common.${toList.type}`); contentNode = ( {userName} {' moved '} {cardName} {' from '} {fromListName} {' to '} {toListName} ); break; } case ActivityTypes.ADD_MEMBER_TO_CARD: contentNode = user.id === activity.data.user.id ? ( {userName} {' joined '} {cardName} ) : ( {userName} {' added '} {activity.data.user.name} {' to '} {cardName} ); break; case ActivityTypes.REMOVE_MEMBER_FROM_CARD: contentNode = user.id === activity.data.user.id ? ( {userName} {' left '} {cardName} ) : ( {userName} {' removed '} {activity.data.user.name} {' from '} {cardName} ); break; case ActivityTypes.COMPLETE_TASK: contentNode = ( {userName} {' completed '} {activity.data.task.name} {' on '} {cardName} ); break; case ActivityTypes.UNCOMPLETE_TASK: contentNode = ( {userName} {' marked '} {activity.data.task.name} {' incomplete on '} {cardName} ); break; default: contentNode = null; } return (
{contentNode}
); }); Item.propTypes = { id: PropTypes.string.isRequired, }; export default Item;