halogen icon indicating copy to clipboard operation
halogen copied to clipboard

Halogen Loaders are not working with React 16.0.0

Open hannigand opened this issue 6 years ago • 7 comments

Since the release of React 16.0.0, Both PropTypes and createClass have been moved into separate packages.

I get the following stack trace when using the PulseLoader:

screen shot 2017-11-01 at 09 46 21

I have modified PulseLoader.js with the proposed changes and my file now looks like this:

'use strict';

var React = require('react');
var assign = require('domkit/appendVendorPrefix');
var insertKeyframesRule = require('domkit/insertKeyframesRule');
var PropTypes = require('prop-types');
var createReactClass = require('create-react-class');

/**
 * @type {Object}
 */
var keyframes = {
  '0%': {
    transform: 'scale(1)',
    opacity: 1
  },
  '45%': {
    transform: 'scale(0.1)',
    opacity: 0.7
  },
  '80%': {
    transform: 'scale(1)',
    opacity: 1
  }
};

/**
 * @type {String}
 */
var animationName = insertKeyframesRule(keyframes);

var Loader = createReactClass({
  displayName: 'Loader',

  /**
     * @type {Object}
     */
  propTypes: {
    loading: PropTypes.bool,
    color: PropTypes.string,
    size: PropTypes.string,
    margin: PropTypes.string
  },

  /**
     * @return {Object}
     */
  getDefaultProps: function getDefaultProps () {
    return {
      loading: true,
      color: '#ffffff',
      size: '15px',
      margin: '2px'
    };
  },

  /**
     * @return {Object}
     */
  getBallStyle: function getBallStyle () {
    return {
      backgroundColor: this.props.color,
      width: this.props.size,
      height: this.props.size,
      margin: this.props.margin,
      borderRadius: '100%',
      verticalAlign: this.props.verticalAlign
    };
  },

  /**
     * @param  {Number} i
     * @return {Object}
     */
  getAnimationStyle: function getAnimationStyle (i) {
    var animation = [
      animationName,
      '0.75s',
      i * 0.12 + 's',
      'infinite',
      'cubic-bezier(.2,.68,.18,1.08)'
    ].join(' ');
    var animationFillMode = 'both';

    return {
      animation: animation,
      animationFillMode: animationFillMode
    };
  },

  /**
     * @param  {Number} i
     * @return {Object}
     */
  getStyle: function getStyle (i) {
    return assign(this.getBallStyle(i), this.getAnimationStyle(i), {
      display: 'inline-block'
    });
  },

  /**
     * @param  {Boolean} loading
     * @return {ReactComponent || null}
     */
  renderLoader: function renderLoader (loading) {
    if (loading) {
      return React.createElement(
        'div',
        { id: this.props.id, className: this.props.className },
        React.createElement('div', { style: this.getStyle(1) }),
        React.createElement('div', { style: this.getStyle(2) }),
        React.createElement('div', { style: this.getStyle(3) })
      );
    }

    return null;
  },

  render: function render () {
    return this.renderLoader(this.props.loading);
  }
});

module.exports = Loader;

With these changes, the loader does successfully appear on the page.

hannigand avatar Nov 01 '17 09:11 hannigand

+1

lnmunhoz avatar Nov 17 '17 11:11 lnmunhoz

Blocking issue

Romanow avatar Nov 21 '17 07:11 Romanow

+1

spiderhand avatar Nov 21 '17 13:11 spiderhand

+1

rajatbarman avatar Nov 29 '17 07:11 rajatbarman

+1

Sidhanthsur avatar Nov 29 '17 09:11 Sidhanthsur

fork with a fix (linked from parallel thread https://github.com/yuanyan/halogen/issues/32): https://github.com/kirillDanshin/halogenium

works with React 16.0.0

sadr0b0t avatar Nov 29 '17 21:11 sadr0b0t

can the original developer fix it?

pavanshinde47 avatar May 03 '18 08:05 pavanshinde47