radioLineComponent.tsx 1.7 KB

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