kandanapp/kandan

View on GitHub
app/assets/javascripts/backbone/views/channel_pane.js.coffee

Summary

Maintainability
Test Coverage
class Kandan.Views.ChannelPane extends Backbone.View
  tagName: 'div'

  render: (container) ->
    $container = $(container || @el)
    $container.html @paginatedActivitiesView()
    $paginated_activities = $container.find(".paginated-activities")

    # Flag to avoid pulling new messages when we already requested new messages from the server
    @loading_new_messages = false

    if !$paginated_activities.hasScrollBar()
      @loading_new_messages = true;
      @loadMoreActivities($container)

    $paginated_activities.bind 'scroll', =>
      if $paginated_activities.scrollTop() <= 100 && !@loading_new_messages
        @loading_new_messages = true
        @loadMoreActivities($paginated_activities)
      return

    $container.append @chatboxView()
    @setIdAndData($container)
    @renderNav()
    Kandan.Helpers.Audio.createAudioChannel(@options.channel.get('id'))
    @

  setIdAndData: (container) ->
    $(container).attr "id", "channels-#{@options.channel.get("id")}"
    $(container).attr "class", "channels-pane"
    $(container).data "channel-id", @options.channel.get('id')

  paginatedActivitiesView: ->
    view = new Kandan.Views.PaginatedActivities(channel: @options.channel)
    view.render().el

  chatboxView: ->
    view = new Kandan.Views.Chatbox(channel: @options.channel)
    view.render().el

  renderNav: ->
    @nav = new Kandan.Views.ChannelNav(channel: @options.channel)
    @nav.pane = @

    unless $('#channel_nav #create_channel').length
      create = new Kandan.Views.CreateChannel
      $('#channel_nav').append(create.render().el)

    $('#create_channel').parents('li').before(@nav.render().el)

  loadMoreActivities: ($container) ->
    $channel_activities = $container.find(".channel-activities")

    # Keeping a reference of the first child to find the offset after the elements are added
    $current_top_element = $channel_activities.children().first()

    $pagination = $container.find(".pagination")
    oldest = $pagination.data("oldest")

    activities = new Kandan.Collections.Activities([], channel_id: @options.channel.get("id"))
    activities.fetch
      data: { oldest: oldest },
      success: (collection) =>
        if collection.length > 0
          for activity in collection.models.reverse()
            activityView = new Kandan.Views.ShowActivity(activity: activity, silence_mentions: true, silence_music: true)
            $container.find(".channel-activities").prepend(activityView.render().el)
  
          if $current_top_element.length != 0
            $container.scrollTop($current_top_element.offset().top)
  
          Kandan.Helpers.Channels.setPaginationState(
            collection.channelId,
            collection.moreActivities,
            _.last(collection.models),
            $container
          )
  
          @loading_new_messages = false