import Component from 'flarum/component';
import UserCard from 'flarum/components/user-card';
import avatar from 'flarum/helpers/avatar';
import username from 'flarum/helpers/username';
import listItems from 'flarum/helpers/list-items';

/**
  Component for the username/avatar in a post header.
 */
export default class PostHeaderUser extends Component {
  constructor(props) {
    super(props);

    this.showCard = m.prop(false);
  }

  view() {
    var post = this.props.post;
    var user = post.user();

    return m('div.post-user', {config: this.onload.bind(this)}, [
      m('h3',
        user ? [
          m('a', {href: app.route('user', {username: user.username()}), config: m.route}, [
            avatar(user),
            username(user)
          ]),
          m('ul.badges', listItems(user.badges().toArray()))
        ] : [
          avatar(),
          username()
        ]
      ),
      user && this.showCard()
        ? UserCard.component({user, className: 'user-card-popover fade', controlsButtonClass: 'btn btn-default btn-icon btn-sm btn-naked'})
        : ''
    ]);
  }

  onload(element, isInitialized) {
    if (isInitialized) { return; }

    this.element(element);

    var component = this;
    var timeout;
    this.$().bind('mouseover', '> a, .user-card', function() {
      clearTimeout(timeout);
      timeout = setTimeout(function() {
        component.showCard(true);
        m.redraw();
        setTimeout(() => component.$('.user-card').addClass('in'));
      }, 250);
    }).bind('mouseout', '> a, .user-card', function() {
      clearTimeout(timeout);
      timeout = setTimeout(function() {
        component.$('.user-card').removeClass('in').one('transitionend webkitTransitionEnd oTransitionEnd MSTransitionEnd', function() {
          component.showCard(false);
        });
      }, 250);
    });
  }
}