unageanu/jiji2

View on GitHub
sites/src/js/view/components/widgets/abstract-component.js

Summary

Maintainability
A
0 mins
Test Coverage
import React               from "react"

export default class AbstractComponent extends React.Component {

  registerPropertyChangeListener(observable, keys=null) {
    observable.addObserver("propertyChanged",
      this.createObserver(keys), this);
    this.registerObservable(observable);
  }

  createObserver(keys) {
    let base = this.onPropertyChanged.bind(this);
    if (keys) {
      return (k, ev) => {
        if (keys.has(ev.key)) base(k, ev)
      };
    } else {
      return base;
    }
  }

  onPropertyChanged(k, ev) {
    const newState = {};
    newState[ev.key] = ev.newValue;
    this.setState(newState);
  }

  componentWillUnmount() {
    if (!this.observables) return;
    this.observables.forEach((o) => o.removeAllObservers(this));
  }

  collectInitialState(model, keys) {
    const states = {};
    for (var k of keys) {
      states[k] = model[k];
    }
    return states;
  }

  registerObservable(observable) {
    this.observables = this.observables || new Set();
    this.observables.add(observable);
  }

  createErrorContent(error) {
    return error ? <div className="error">{error}</div> : null;
  }

}