You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
session-desktop/ts/components/session/SessionNotificationCount.tsx

74 lines
1.5 KiB
TypeScript

import React from 'react';
import classNames from 'classnames';
export enum NotificationCountSize {
// Size in px
ON_ICON = 20,
ON_HEADER = 24,
}
interface Props {
count?: number;
size: number;
onClick?: any;
}
export class SessionNotificationCount extends React.Component<Props> {
public static defaultProps = {
size: NotificationCountSize.ON_ICON,
};
constructor(props: any) {
super(props);
}
public render() {
const { count, size, onClick } = this.props;
const hasHover = !!onClick;
const MAX_SINGLE_DIGIT = 9;
const overflow = typeof count === 'number' && count > MAX_SINGLE_DIGIT;
const bubbleStyle = {
width: `${size}px`,
height: `${size}px`,
fontSize: `${size}px`,
};
const fontSize = overflow ? '0.5em' : '0.6em';
const countStyle = {
fontSize,
marginTop: overflow ? '0.35em' : '0em',
marginLeft: overflow ? '-0.45em' : '0em',
};
const countElement: JSX.Element = overflow ? (
<>
{MAX_SINGLE_DIGIT}
<sup>+</sup>
</>
) : (
<>{count}</>
);
const shouldRender = typeof count === 'number' && count > 0;
return (
<>
{shouldRender && (
<div
className={classNames('notification-count', hasHover && 'hover')}
onClick={onClick}
style={bubbleStyle}
role="button"
>
<div style={countStyle}>{countElement}</div>
</div>
)}
</>
);
}
}