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.
		
		
		
		
		
			
		
			
				
	
	
		
			187 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			TypeScript
		
	
			
		
		
	
	
			187 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			TypeScript
		
	
import React from 'react';
 | 
						|
import styled from 'styled-components';
 | 
						|
 | 
						|
import {
 | 
						|
  SessionButton,
 | 
						|
  SessionButtonColor,
 | 
						|
  SessionButtonShape,
 | 
						|
  SessionButtonType,
 | 
						|
} from '../basic/SessionButton';
 | 
						|
import { SessionToggle } from '../basic/SessionToggle';
 | 
						|
import { SessionConfirmDialogProps } from '../dialog/SessionConfirm';
 | 
						|
import { SessionIconButton } from '../icon';
 | 
						|
import { Noop } from '../../types/Util';
 | 
						|
 | 
						|
type ButtonSettingsProps = {
 | 
						|
  title?: string;
 | 
						|
  description?: string;
 | 
						|
  buttonColor?: SessionButtonColor;
 | 
						|
  buttonType?: SessionButtonType;
 | 
						|
  buttonShape?: SessionButtonShape;
 | 
						|
  buttonText: string;
 | 
						|
  dataTestId?: string;
 | 
						|
  onClick: () => void;
 | 
						|
};
 | 
						|
 | 
						|
export const StyledDescriptionSettingsItem = styled.div`
 | 
						|
  font-family: var(--font-default);
 | 
						|
  font-size: var(--font-size-sm);
 | 
						|
  font-weight: 400;
 | 
						|
  max-width: 700px;
 | 
						|
`;
 | 
						|
 | 
						|
export const StyledTitleSettingsItem = styled.div`
 | 
						|
  line-height: 1.7;
 | 
						|
  font-size: var(--font-size-lg);
 | 
						|
  font-weight: bold;
 | 
						|
`;
 | 
						|
 | 
						|
const StyledInfo = styled.div`
 | 
						|
  padding-inline-end: var(--margins-lg);
 | 
						|
`;
 | 
						|
 | 
						|
const StyledDescriptionContainer = styled(StyledDescriptionSettingsItem)`
 | 
						|
  display: flex;
 | 
						|
  align-items: center;
 | 
						|
`;
 | 
						|
 | 
						|
export const StyledSettingItem = styled.div`
 | 
						|
  font-size: var(--font-size-md);
 | 
						|
  padding: var(--margins-lg);
 | 
						|
  margin-bottom: var(--margins-lg);
 | 
						|
 | 
						|
  background: var(--settings-tab-background-color);
 | 
						|
  color: var(--settings-tab-text-color);
 | 
						|
  border-top: 1px solid var(--border-color);
 | 
						|
  border-bottom: 1px solid var(--border-color);
 | 
						|
`;
 | 
						|
 | 
						|
const StyledSettingItemInline = styled(StyledSettingItem)`
 | 
						|
  display: flex;
 | 
						|
  align-items: center;
 | 
						|
  justify-content: space-between;
 | 
						|
  transition: var(--default-duration);
 | 
						|
`;
 | 
						|
 | 
						|
const StyledSettingItemClickable = styled(StyledSettingItemInline)`
 | 
						|
  cursor: pointer;
 | 
						|
  :hover {
 | 
						|
    background: var(--settings-tab-background-hover-color);
 | 
						|
  }
 | 
						|
  :active {
 | 
						|
    background: var(--settings-tab-background-selected-color);
 | 
						|
  }
 | 
						|
`;
 | 
						|
 | 
						|
export const SettingsTitleAndDescription = (props: {
 | 
						|
  title?: string;
 | 
						|
  description?: string;
 | 
						|
  childrenDescription?: React.ReactNode;
 | 
						|
}) => {
 | 
						|
  const { description, childrenDescription, title } = props;
 | 
						|
  return (
 | 
						|
    <StyledInfo>
 | 
						|
      <StyledTitleSettingsItem>{title}</StyledTitleSettingsItem>
 | 
						|
      <StyledDescriptionContainer>
 | 
						|
        {description && (
 | 
						|
          <StyledDescriptionSettingsItem>{description}</StyledDescriptionSettingsItem>
 | 
						|
        )}
 | 
						|
        <>{childrenDescription}</>
 | 
						|
      </StyledDescriptionContainer>
 | 
						|
    </StyledInfo>
 | 
						|
  );
 | 
						|
};
 | 
						|
 | 
						|
export const SessionSettingsItemWrapper = (props: {
 | 
						|
  inline: boolean;
 | 
						|
  title?: string;
 | 
						|
  description?: string;
 | 
						|
  children?: React.ReactNode;
 | 
						|
  childrenDescription?: React.ReactNode;
 | 
						|
}) => {
 | 
						|
  const { inline, children, description, title, childrenDescription } = props;
 | 
						|
  const ComponentToRender = inline ? StyledSettingItemInline : StyledSettingItem;
 | 
						|
  return (
 | 
						|
    <ComponentToRender>
 | 
						|
      <SettingsTitleAndDescription
 | 
						|
        title={title}
 | 
						|
        description={description}
 | 
						|
        childrenDescription={childrenDescription}
 | 
						|
      />
 | 
						|
      {children}
 | 
						|
    </ComponentToRender>
 | 
						|
  );
 | 
						|
};
 | 
						|
 | 
						|
export const SessionSettingsTitleWithLink = (props: { title: string; onClick: Noop }) => {
 | 
						|
  const { onClick, title } = props;
 | 
						|
  return (
 | 
						|
    <StyledSettingItemClickable onClick={onClick}>
 | 
						|
      <SettingsTitleAndDescription title={title} />
 | 
						|
      <SessionIconButton iconSize={'medium'} iconType="externalLink" isSelected={true} />
 | 
						|
    </StyledSettingItemClickable>
 | 
						|
  );
 | 
						|
};
 | 
						|
 | 
						|
export const SessionToggleWithDescription = (props: {
 | 
						|
  title?: string;
 | 
						|
  description?: string;
 | 
						|
  active: boolean;
 | 
						|
  onClickToggle: () => void;
 | 
						|
  confirmationDialogParams?: SessionConfirmDialogProps;
 | 
						|
  childrenDescription?: React.ReactNode; // if set, those elements will be appended next to description field (only used for typing message settings as of now)
 | 
						|
  dataTestId?: string;
 | 
						|
}) => {
 | 
						|
  const {
 | 
						|
    title,
 | 
						|
    description,
 | 
						|
    active,
 | 
						|
    onClickToggle,
 | 
						|
    confirmationDialogParams,
 | 
						|
    childrenDescription,
 | 
						|
    dataTestId,
 | 
						|
  } = props;
 | 
						|
 | 
						|
  return (
 | 
						|
    <SessionSettingsItemWrapper
 | 
						|
      title={title}
 | 
						|
      description={description}
 | 
						|
      inline={true}
 | 
						|
      childrenDescription={childrenDescription}
 | 
						|
    >
 | 
						|
      <SessionToggle
 | 
						|
        active={active}
 | 
						|
        onClick={onClickToggle}
 | 
						|
        confirmationDialogParams={confirmationDialogParams}
 | 
						|
        dataTestId={dataTestId}
 | 
						|
      />
 | 
						|
    </SessionSettingsItemWrapper>
 | 
						|
  );
 | 
						|
};
 | 
						|
 | 
						|
export const SessionSettingButtonItem = (props: ButtonSettingsProps) => {
 | 
						|
  const {
 | 
						|
    title,
 | 
						|
    description,
 | 
						|
    buttonColor,
 | 
						|
    buttonType,
 | 
						|
    buttonShape,
 | 
						|
    buttonText,
 | 
						|
    dataTestId,
 | 
						|
    onClick,
 | 
						|
  } = props;
 | 
						|
 | 
						|
  return (
 | 
						|
    <SessionSettingsItemWrapper title={title} description={description} inline={true}>
 | 
						|
      <SessionButton
 | 
						|
        dataTestId={dataTestId}
 | 
						|
        text={buttonText}
 | 
						|
        buttonColor={buttonColor}
 | 
						|
        buttonType={buttonType}
 | 
						|
        buttonShape={buttonShape}
 | 
						|
        onClick={onClick}
 | 
						|
      />
 | 
						|
    </SessionSettingsItemWrapper>
 | 
						|
  );
 | 
						|
};
 |