import * as React from 'react';
import classNames from 'classnames';
import { observer } from 'mobx-react';
import { computed, makeObservable } from 'mobx';
import { default as DefaultTooltip } from '../defaultTooltip/DefaultTooltip';
export interface ITruncatedTextProps {
text: string;
className?: string;
maxLength?: number; // max allowed length of the text
buffer?: number; // buffer length before considering truncating the text
suffix?: string; // will be added to the end of the text if truncated
addTooltip?: 'truncated' | 'always' | 'never'; // when to add the tooltip
tooltip?: JSX.Element; // tooltip content
}
export function isTooLong(
text: string,
maxLength: number,
buffer?: number
): boolean {
return text != null && text.length > maxLength + (buffer || 0);
}
export function truncateText(
text: string,
suffix: string,
maxLength: number,
buffer?: number
) {
if (isTooLong(text, maxLength, buffer)) {
return text.substring(0, maxLength) + suffix;
} else {
return text;
}
}
/**
* @author Selcuk Onur Sumer
*/
@observer
export default class TruncatedText extends React.Component<
ITruncatedTextProps,
{}
> {
constructor(props: any) {
super(props);
makeObservable(this);
}
public static defaultProps = {
maxLength: 50,
buffer: 2,
suffix: '...',
addTooltip: 'truncated',
};
public render() {
let content = (
{this.truncatedText}
);
if (this.needsTooltip) {
content = (
this.props.tooltip || (
{this.props.text}
)
}
placement="right"
destroyTooltipOnHide={true}
>
{content}
);
}
return content;
}
@computed get needsTooltip(): boolean {
return (
this.props.addTooltip !== 'never' &&
(this.props.addTooltip === 'always' ||
(this.props.addTooltip === 'truncated' && this.isTooLong))
);
}
@computed get isTooLong(): boolean {
return isTooLong(
this.props.text,
this.props.maxLength || TruncatedText.defaultProps.maxLength,
this.props.buffer
);
}
@computed get truncatedText(): string {
return truncateText(
this.props.text,
this.props.suffix || TruncatedText.defaultProps.suffix,
this.props.maxLength || TruncatedText.defaultProps.maxLength,
this.props.buffer
);
}
}