JulienPradet/react-flip

View on GitHub
src/FlipGroup.js

Summary

Maintainability
A
0 mins
Test Coverage
import Flip from './Flip';

const not = fn => x => !fn(x);
const isDeferred = element =>
  typeof element.defer === 'function' ? element.defer() : element.defer;

class FlipGroup {
  constructor() {
    this.elements = [];
    this.elementsDeferred = [];
  }

  getConcernedElements(defer) {
    if (defer === undefined) {
      return this.elements;
    } else if (defer) {
      return this.elements.filter(isDeferred);
    } else {
      return this.elements.filter(not(isDeferred));
    }
  }

  addElement(element, defer) {
    if (element instanceof Flip) {
      this.elements = [...this.elements, { element, defer }];

      return () => {
        this.elements = this.elements.filter(
          current => current.element !== element
        );
      };
    }
  }

  first({ deferred } = {}) {
    this.getConcernedElements(deferred).forEach(({ element }) =>
      element.first());
  }

  last({ deferred } = {}) {
    this.getConcernedElements(deferred).forEach(({ element }) =>
      element.last());
  }

  invert({ deferred } = {}) {
    return this.getConcernedElements(deferred)
      .map(({ element }) => element.invert())
      .some(hasInverted => hasInverted);
  }

  play() {
    const playPromises = this.getConcernedElements()
      .map(({ element }) => element.play())
      .filter(promise => promise);

    if (playPromises.length === 0) {
      return;
    }
    return Promise.all(playPromises);
  }
}

export default FlipGroup;