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.
		
		
		
		
		
			
		
			
				
	
	
		
			87 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			TypeScript
		
	
			
		
		
	
	
			87 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			TypeScript
		
	
import styled from 'styled-components';
 | 
						|
import { Constants } from '../../session';
 | 
						|
 | 
						|
type Props = {
 | 
						|
  overflowingAt: number;
 | 
						|
  centeredOnTop: boolean;
 | 
						|
  count?: number;
 | 
						|
};
 | 
						|
const StyledCountContainer = styled.div<{ centeredOnTop: boolean }>`
 | 
						|
  background: var(--unread-messages-alert-background-color);
 | 
						|
  color: var(--unread-messages-alert-text-color);
 | 
						|
  text-align: center;
 | 
						|
 | 
						|
  padding: ${props => (props.centeredOnTop ? '1px 3px 0' : '1px 4px')};
 | 
						|
 | 
						|
  position: absolute;
 | 
						|
  top: ${props => (props.centeredOnTop ? '-10px' : '27px')};
 | 
						|
  left: ${props => (props.centeredOnTop ? '50%' : '28px')};
 | 
						|
 | 
						|
  font-size: var(--font-size-xs);
 | 
						|
  font-family: var(--font-default);
 | 
						|
  font-weight: 700;
 | 
						|
 | 
						|
  height: 16px;
 | 
						|
  min-width: 16px;
 | 
						|
  line-height: 16px;
 | 
						|
  border-radius: 8px;
 | 
						|
 | 
						|
  display: flex;
 | 
						|
  align-items: center;
 | 
						|
  justify-content: center;
 | 
						|
  flex-shrink: 0;
 | 
						|
 | 
						|
  transition: var(--default-duration);
 | 
						|
  transform: ${props => (props.centeredOnTop ? 'translateX(-50%)' : 'none')};
 | 
						|
  white-space: ${props => (props.centeredOnTop ? 'nowrap' : 'normal')};
 | 
						|
`;
 | 
						|
 | 
						|
const StyledCount = styled.div<{ centeredOnTop: boolean }>`
 | 
						|
  position: relative;
 | 
						|
  font-size: ${props => (props.centeredOnTop ? 'var(--font-size-xs)' : '0.6rem')};
 | 
						|
`;
 | 
						|
 | 
						|
const OverflowingAt = (props: { overflowingAt: number }) => {
 | 
						|
  return (
 | 
						|
    <>
 | 
						|
      {props.overflowingAt}
 | 
						|
      <span>+</span>
 | 
						|
    </>
 | 
						|
  );
 | 
						|
};
 | 
						|
 | 
						|
const NotificationOrUnreadCount = ({ centeredOnTop, overflowingAt, count }: Props) => {
 | 
						|
  if (!count) {
 | 
						|
    return null;
 | 
						|
  }
 | 
						|
  const overflowing = count > overflowingAt;
 | 
						|
 | 
						|
  return (
 | 
						|
    <StyledCountContainer centeredOnTop={centeredOnTop}>
 | 
						|
      <StyledCount centeredOnTop={centeredOnTop}>
 | 
						|
        {overflowing ? <OverflowingAt overflowingAt={overflowingAt} /> : count}
 | 
						|
      </StyledCount>
 | 
						|
    </StyledCountContainer>
 | 
						|
  );
 | 
						|
};
 | 
						|
 | 
						|
export const SessionNotificationCount = (props: Pick<Props, 'count'>) => {
 | 
						|
  return (
 | 
						|
    <NotificationOrUnreadCount
 | 
						|
      centeredOnTop={false}
 | 
						|
      overflowingAt={Constants.CONVERSATION.MAX_GLOBAL_UNREAD_COUNT}
 | 
						|
      count={props.count}
 | 
						|
    />
 | 
						|
  );
 | 
						|
};
 | 
						|
 | 
						|
export const SessionUnreadCount = (props: Pick<Props, 'count'>) => {
 | 
						|
  return (
 | 
						|
    <NotificationOrUnreadCount
 | 
						|
      centeredOnTop={true}
 | 
						|
      overflowingAt={Constants.CONVERSATION.MAX_CONVO_UNREAD_COUNT}
 | 
						|
      count={props.count}
 | 
						|
    />
 | 
						|
  );
 | 
						|
};
 |