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.
		
		
		
		
		
			
		
			
				
	
	
		
			129 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			TypeScript
		
	
			
		
		
	
	
			129 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			TypeScript
		
	
| import React from 'react';
 | |
| import classNames from 'classnames';
 | |
| 
 | |
| import Slider from 'rc-slider';
 | |
| 
 | |
| import { SessionToggle } from '../SessionToggle';
 | |
| import { SessionButton } from '../SessionButton';
 | |
| import { SessionSettingType } from './SessionSettings';
 | |
| import { SessionRadioGroup } from '../SessionRadioGroup';
 | |
| 
 | |
| interface Props {
 | |
|   title: string;
 | |
|   description?: string;
 | |
|   type: SessionSettingType | undefined;
 | |
|   value: any;
 | |
|   options?: Array<any>;
 | |
|   onClick?: any;
 | |
|   onSliderChange?: any;
 | |
|   content: any;
 | |
|   confirmationDialogParams?: any;
 | |
| }
 | |
| 
 | |
| interface State {
 | |
|   sliderValue: number | null;
 | |
| }
 | |
| 
 | |
| export class SessionSettingListItem extends React.Component<Props, State> {
 | |
|   public static defaultProps = {
 | |
|     inline: true,
 | |
|   };
 | |
| 
 | |
|   public constructor(props: Props) {
 | |
|     super(props);
 | |
|     this.state = {
 | |
|       sliderValue: null,
 | |
|     };
 | |
| 
 | |
|     this.handleClick = this.handleClick.bind(this);
 | |
|   }
 | |
| 
 | |
|   public render(): JSX.Element {
 | |
|     const { title, description, type, value, content } = this.props;
 | |
|     const inline =
 | |
|       !!type &&
 | |
|       ![SessionSettingType.Options, SessionSettingType.Slider].includes(type);
 | |
| 
 | |
|     const currentSliderValue =
 | |
|       type === SessionSettingType.Slider && (this.state.sliderValue || value);
 | |
| 
 | |
|     return (
 | |
|       <div className={classNames('session-settings-item', inline && 'inline')}>
 | |
|         <div className="session-settings-item__info">
 | |
|           <div className="session-settings-item__title">{title}</div>
 | |
| 
 | |
|           {description && (
 | |
|             <div className="session-settings-item__description">
 | |
|               {description}
 | |
|             </div>
 | |
|           )}
 | |
|         </div>
 | |
| 
 | |
|         <div className="session-settings-item__content">
 | |
|           {type === SessionSettingType.Toggle && (
 | |
|             <div className="session-sessings-item__selection">
 | |
|               <SessionToggle
 | |
|                 active={Boolean(value)}
 | |
|                 onClick={this.handleClick}
 | |
|                 confirmationDialogParams={this.props.confirmationDialogParams}
 | |
|               />
 | |
|             </div>
 | |
|           )}
 | |
| 
 | |
|           {type === SessionSettingType.Button && (
 | |
|             <SessionButton
 | |
|               text={content.buttonText}
 | |
|               buttonColor={content.buttonColor}
 | |
|               onClick={this.handleClick}
 | |
|             />
 | |
|           )}
 | |
| 
 | |
|           {type === SessionSettingType.Options && (
 | |
|             <SessionRadioGroup
 | |
|               initalItem={content.options.initalItem}
 | |
|               group={content.options.group}
 | |
|               items={content.options.items}
 | |
|               onClick={this.handleClick}
 | |
|             />
 | |
|           )}
 | |
| 
 | |
|           {type === SessionSettingType.Slider && (
 | |
|             <div className="slider-wrapper">
 | |
|               <Slider
 | |
|                 dots={true}
 | |
|                 step={content.step}
 | |
|                 min={content.min}
 | |
|                 max={content.max}
 | |
|                 defaultValue={currentSliderValue}
 | |
|                 onAfterChange={sliderValue => {
 | |
|                   this.handleSlider(sliderValue);
 | |
|                 }}
 | |
|               />
 | |
| 
 | |
|               <div className="slider-info">
 | |
|                 <p>{content.info(currentSliderValue)}</p>
 | |
|               </div>
 | |
|             </div>
 | |
|           )}
 | |
|         </div>
 | |
|       </div>
 | |
|     );
 | |
|   }
 | |
| 
 | |
|   private handleClick() {
 | |
|     if (this.props.onClick) {
 | |
|       this.props.onClick();
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   private handleSlider(value: any) {
 | |
|     if (this.props.onSliderChange) {
 | |
|       this.props.onSliderChange(value);
 | |
|     }
 | |
| 
 | |
|     this.setState({
 | |
|       sliderValue: value,
 | |
|     });
 | |
|   }
 | |
| }
 |