radioLineComponent.tsx 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. import * as React from "react";
  2. import { Nullable } from "babylonjs/types";
  3. import { Observer, Observable } from "babylonjs/Misc/observable";
  4. interface IRadioButtonLineComponentProps {
  5. onSelectionChangedObservable: Observable<RadioButtonLineComponent>;
  6. label: string;
  7. isSelected: () => boolean;
  8. onSelect: () => void;
  9. }
  10. export class RadioButtonLineComponent extends React.Component<IRadioButtonLineComponentProps, { isSelected: boolean }> {
  11. private _onSelectionChangedObserver: Nullable<Observer<RadioButtonLineComponent>>;
  12. constructor(props: IRadioButtonLineComponentProps) {
  13. super(props);
  14. this.state = { isSelected: this.props.isSelected() };
  15. }
  16. componentDidMount() {
  17. this._onSelectionChangedObserver = this.props.onSelectionChangedObservable.add((value) => {
  18. this.setState({ isSelected: value === this });
  19. });
  20. }
  21. componentWillUnmount() {
  22. if (this._onSelectionChangedObserver) {
  23. this.props.onSelectionChangedObservable.remove(this._onSelectionChangedObserver);
  24. this._onSelectionChangedObserver = null;
  25. }
  26. }
  27. onChange() {
  28. this.props.onSelect();
  29. this.props.onSelectionChangedObservable.notifyObservers(this);
  30. }
  31. render() {
  32. return (
  33. <div className="radioLine">
  34. <div className="label" title={this.props.label}>
  35. {this.props.label}
  36. </div>
  37. <div className="radioContainer">
  38. <input id={this.props.label} className="radio" type="radio" checked={this.state.isSelected} onChange={() => this.onChange()} />
  39. <label htmlFor={this.props.label} className="labelForRadio" />
  40. </div>
  41. </div>
  42. );
  43. }
  44. }