UNPKG

@momentum-ui/react-collaboration

Version:

Cisco Momentum UI Framework for React Collaboration Applications

198 lines (184 loc) 5.54 kB
/** @component content-item */ import React from 'react'; import PropTypes from 'prop-types'; import ChatContentItem from './ChatContent'; import FileContentItem from './FileContent'; import IconContent from './IconContent'; import omit from 'lodash/omit'; /** * @deprecated - Components in the legacy folder (/src/legacy) are deprecated. Please use a component from the components folder (/src/components) instead. Legacy components may not follow accessibility standards. **/ class ContentItem extends React.PureComponent { render() { const { actionNode, aspect, className, content, failedText, fileSize, height, icon, isProtected, loading, loadingText, style, subtitle, title, type, width, ...props } = this.props; const otherProps = omit({ ...props }, ['gifIcon']); const findAspect = (width, height) => { if (width && height) { const aspectRatioObj = { 1: 'oneOne', 0.75: 'threeFour', 0.66: 'twoThree', 0.4: 'tall', 4.35: 'wide', 1.33: 'fourThree', 1.5: 'threeTwo', 1.78: 'sixteenNine', }; const providedAspectRatio = width / height; const closestAspectRatio = Object.keys(aspectRatioObj).reduce((prev, curr) => Math.abs(curr - providedAspectRatio) < Math.abs(prev - providedAspectRatio) ? curr : prev ); return aspectRatioObj[closestAspectRatio]; } return type === 'chat' ? 'sixteenNine' : 'threeTwo'; }; const chosenItem = () => { if (failedText && type === 'chat') { return ( <div className={'md-content md-content--failed' + `${(className && ` ${className}`) || ''}`} > <div className="md-content--failed-container"> <i className="icon icon-warning_28 md-content--failed-warning" /> <p className="md-content--failed-message">{failedText}</p> </div> </div> ); } else if (type === 'chat') { return ( <ChatContentItem actionNode={actionNode} aspect={aspect ? aspect : findAspect(width, height)} className={className} content={content} fileSize={fileSize} height={height} isProtected={isProtected} loading={loading} subtitle={subtitle} style={style} title={title} type={type} width={width} {...props} /> ); } else if (type === 'file' && !icon) { return ( <FileContentItem actionNode={actionNode} aspect={aspect ? aspect : findAspect(width, height)} className={className} content={content} height={height} icon={icon} isProtected={isProtected} loading={loading} loadingText={loadingText} subtitle={subtitle} title={title} type={type} width={width} {...props} /> ); } else if (icon) { return ( <IconContent actionNode={actionNode} className={className} icon={icon} isProtected={isProtected} loading={loading} subtitle={subtitle} title={title} {...otherProps} /> ); } }; return <div>{chosenItem()}</div>; } } ContentItem.displayName = 'ContentItem'; ContentItem.defaultProps = { actionNode: null, aspect: null, className: '', content: null, failedText: '', fileSize: '', icon: '', isProtected: false, loading: false, loadingText: 'Loading', style: null, subtitle: '', title: '', type: 'chat', }; ContentItem.propTypes = { /** @prop Node to render buttons inside Content Item | null */ actionNode: PropTypes.node, /** @prop Set the Content Item's aspect size | null */ aspect: PropTypes.oneOf([ 'fourThree', 'nineSixteen', 'oneOne', 'sixteenNine', 'tall', 'threeFour', 'threeTwo', 'twoThree', 'wide', ]), /** @prop Optional css class string | '' */ className: PropTypes.string, /** @prop Set the image/gif of the Content Item | '' */ content: PropTypes.string, /** @prop Set the failed text to show when content fails to load | '' */ failedText: PropTypes.string, /** @prop Show the size of the file | '' */ fileSize: PropTypes.string, /** @prop Show icon at top right corner of Content Item */ gifIcon: PropTypes.string, /** @prop Height of the image in px */ height: PropTypes.number, /** @prop Set the type of icon to show | '' */ icon: PropTypes.string, /** @prop Show visibility of action node buttons | false */ isProtected: PropTypes.bool, /** @prop Show loading spinner | false */ loading: PropTypes.bool, /** @prop Change loading text */ loadingText: PropTypes.string, /** @prop Additional css styling applied to the button | null */ style: PropTypes.object, /** @prop Set the subtitle of the Content Item | '' */ subtitle: PropTypes.node, /** @prop Set the title of the Content Item | '' */ title: PropTypes.string, /** @prop Set the type of Content Item to display */ type: PropTypes.oneOf(['chat', 'file']), /** @prop Width of the image in px */ width: PropTypes.number, }; export default ContentItem;