import { useContext, memo } from 'react' import { Flex, Popover, Divider } from 'antd' import { UserOutlined } from '@ant-design/icons' import PropTypes from 'prop-types' import EditIcon from '../../Icons/EditIcon' import { AuthContext } from '../context/AuthContext' import SpotlightTooltip from './SpotlightTooltip' import Thumbnail from './Thumbnail' import { useNavigate } from 'react-router-dom' import { getModelByName } from '../../../database/ObjectModels' const getUserId = (user) => user?._id || user const getProfileImageId = (user) => { const profileImage = user?.profileImage return ( profileImage?._id || (typeof profileImage === 'string' ? profileImage : null) ) } const getProfileImageBlurHash = (user) => { const profileImage = user?.profileImage if (typeof profileImage === 'object' && profileImage !== null) { return profileImage.metaData?.blurHash || null } return null } const getDisplayName = (user) => user?.name || [user?.firstName, user?.lastName].filter(Boolean).join(' ') || user?.username || 'User' const avatarStyle = { width: 32, height: 32, borderRadius: '12px', objectFit: 'cover', border: '1px solid rgb(128, 128, 128, 0.4)' } const UserProfileImage = memo(function UserProfileImage({ profileImageId, displayName, blurHash }) { const file = profileImageId ? { _id: profileImageId, metaData: blurHash ? { blurHash } : undefined } : null return ( } /> ) }) UserProfileImage.propTypes = { profileImageId: PropTypes.string, displayName: PropTypes.string.isRequired, blurHash: PropTypes.string } const UserActivityAvatar = memo( function UserActivityAvatar({ user, mode }) { const profileImageId = getProfileImageId(user) const blurHash = getProfileImageBlurHash(user) const displayName = getDisplayName(user) const navigate = useNavigate() const model = getModelByName('user') // Get hyperlink URL from model's default actions var hyperlink = null const defaultModelActions = model.actions?.filter((action) => action.default == true) || [] if (defaultModelActions.length >= 1 && getUserId(user)) { hyperlink = defaultModelActions[0].url(getUserId(user)) } return ( } placement='bottomLeft' arrow={false} style={{ padding: 0 }} >
{ navigate(hyperlink) }} > {mode === 'editing' && (
)}
) }, (prevProps, nextProps) => { return ( prevProps.mode === nextProps.mode && getUserId(prevProps.user) === getUserId(nextProps.user) && getProfileImageId(prevProps.user) === getProfileImageId(nextProps.user) && getProfileImageBlurHash(prevProps.user) === getProfileImageBlurHash(nextProps.user) ) } ) UserActivityAvatar.propTypes = { user: PropTypes.object, mode: PropTypes.string } const ActivityIndicator = ({ activities = [], showStartingDivider = false }) => { const { userProfile } = useContext(AuthContext) const currentUserId = userProfile?._id const otherActivities = activities.filter((activity) => { if (!activity?.mode) return false const userId = getUserId(activity.user) return userId && userId !== currentUserId }) if (otherActivities.length === 0) { return null } return ( {showStartingDivider && otherActivities.length >= 1 && ( )} {otherActivities.map((activity) => { const userId = getUserId(activity.user) return ( ) })} ) } ActivityIndicator.propTypes = { activities: PropTypes.array, showStartingDivider: PropTypes.bool } export default ActivityIndicator