You are here

class HeartbeatBlock in Heartbeat 8

Provides a 'HeartbeatBlock' block.

Plugin annotation


@Block(
 id = "heartbeat_block",
 admin_label = @Translation("Heartbeat block"),
)

Hierarchy

Expanded class hierarchy of HeartbeatBlock

1 file declares its use of HeartbeatBlock
StatusForm.php in modules/statusmessage/src/Form/StatusForm.php

File

src/Plugin/Block/HeartbeatBlock.php, line 35

Namespace

Drupal\heartbeat\Plugin\Block
View source
class HeartbeatBlock extends BlockBase implements ContainerFactoryPluginInterface {

  /**
   * Drupal\heartbeat\HeartbeatTypeService definition.
   *
   * @var \Drupal\heartbeat\HeartbeatTypeService
   */
  protected $heartbeatTypeService;

  /**
   * Drupal\heartbeat\HeartbeatStreamServices definition.
   *
   * @var \Drupal\heartbeat\HeartbeatStreamServices
   */
  protected $heartbeatStreamServices;

  /**
   * Drupal\heartbeat\HeartbeatService definition.
   *
   * @var \Drupal\heartbeat\HeartbeatService
   */
  protected $heartbeatService;
  protected $entityTypeManager;
  protected $dateFormatter;
  protected $flagService;
  protected $formBuilder;
  protected $configFactory;
  protected $timestamp;

  /**
   * Construct.
   *
   * @param array $configuration
   *   A configuration array containing information about the plugin instance.
   * @param string $plugin_id
   *   The plugin_id for the plugin instance.
   * @param string $plugin_definition
   *   The plugin implementation definition.
   */
  public function __construct(array $configuration, $plugin_id, $plugin_definition, HeartbeatTypeService $heartbeat_heartbeattype, HeartbeatStreamServices $heartbeatstream, HeartbeatService $heartbeat, EntityTypeManager $entity_type_manager, DateFormatter $date_formatter, FlagService $flag_service, FormBuilder $form_builder, ConfigFactory $configFactory) {
    parent::__construct($configuration, $plugin_id, $plugin_definition);
    $this->heartbeatTypeService = $heartbeat_heartbeattype;
    $this->heartbeatStreamServices = $heartbeatstream;
    $this->heartbeatService = $heartbeat;
    $this->entityTypeManager = $entity_type_manager;
    $this->dateFormatter = $date_formatter;
    $this->flagService = $flag_service;
    $this->formBuilder = $form_builder;
    $this->configFactory = $configFactory;
    $this->timestamp = time();
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
    return new static($configuration, $plugin_id, $plugin_definition, $container
      ->get('heartbeat.heartbeattype'), $container
      ->get('heartbeatstream'), $container
      ->get('heartbeat'), $container
      ->get('entity_type.manager'), $container
      ->get('date.formatter'), $container
      ->get('flag'), $container
      ->get('form_builder'), $container
      ->get('config.factory'));
  }

  /**
   * {@inheritdoc}
   * @throws \Drupal\Core\Database\InvalidQueryException
   */
  public function build() {
    $messages = array();
    if (\Drupal::currentUser()
      ->id() > 0) {
      $myConfig = \Drupal::service('config.factory')
        ->getEditable('heartbeat_feed.settings');
      $friendData = \Drupal::config('heartbeat_friendship.settings')
        ->get('data');

      //TODO Use User IDs from friendData as conditions for heartbeats, rather than retrieving friendships in a separate query as is what follows in the lines ahead
      $feed = $myConfig
        ->get('message');
      if ($feed === null || $feed === 'null') {
        $feed = "Public";
        $myConfig
          ->set('message', $feed)
          ->save();
      }
      $uids = null;
      $query = Database::getConnection()
        ->select('heartbeat_friendship', 'hf')
        ->fields('hf', [
        'uid',
        'uid_target',
      ]);
      $conditionOr = $query
        ->orConditionGroup()
        ->condition('hf.uid', \Drupal::currentUser()
        ->id())
        ->condition('hf.uid_target', \Drupal::currentUser()
        ->id());
      $results = $query
        ->condition($conditionOr)
        ->execute();
      if ($result = $results
        ->fetchAll()) {
        $uids = array();
        foreach ($result as $uid) {
          $uids[] = $uid->uid_target;
          $uids[] = $uid->uid;
        }
      }
      if ($feed !== null && $this->heartbeatStreamServices) {
        $uids = count($uids) > 1 ? array_unique($uids) : $uids;
        if (!empty($uids)) {
          foreach ($this->heartbeatStreamServices
            ->createStreamForUidsByType($uids, $feed) as $heartbeat) {
            $this
              ->renderMessage($messages, $heartbeat);
          }
        }
        else {
          foreach ($this->heartbeatStreamServices
            ->createStreamByType($feed) as $heartbeat) {
            $this
              ->renderMessage($messages, $heartbeat);
          }
        }
      }
      else {
        foreach ($this->heartbeatStreamServices
          ->loadAllStreams() as $heartbeat) {
          $this
            ->renderMessage($messages, $heartbeat);
        }
      }
    }
    else {
      foreach ($this->heartbeatStreamServices
        ->loadAllStreams() as $heartbeat) {
        $this
          ->renderMessage($messages, $heartbeat);
      }
    }
    return [
      '#theme' => 'heartbeat_stream',
      '#messages' => $messages,
      '#attached' => array(
        'library' => 'heartbeat/heartbeat',
        'drupalSettings' => [
          'activeFeed' => 'jigga',
          'friendData' => $friendData,
        ],
      ),
      '#cache' => array(
        'max-age' => 0,
      ),
    ];
  }
  private function renderMessage(array &$messages, $heartbeat) {
    $timeago = null;
    $diff = $this->timestamp - $heartbeat
      ->getCreatedTime();
    switch (true) {
      case $diff < 86400:
        $timeago = $this->dateFormatter
          ->formatInterval(REQUEST_TIME - $heartbeat
          ->getCreatedTime()) . ' ago';
        break;
      case $diff >= 86400 && $diff < 172800:
        $timeago = 'Yesterday at ' . $this->dateFormatter
          ->format($heartbeat
          ->getCreatedTime(), 'heartbeat_time');
        break;
      case $diff >= 172800:
        $timeago = $this->dateFormatter
          ->format($heartbeat
          ->getCreatedTime(), 'heartbeat_short');
        break;
    }
    $user = $heartbeat
      ->getOwner();
    $userView = user_view($user, 'compact');
    $userPic = $user
      ->get('user_picture')
      ->getValue();
    if (!empty($userPic)) {
      $profilePic = $userPic[0]['target_id'];
    }
    if (NULL === $profilePic) {
      $profilePic = 86;
    }
    $pic = File::load($profilePic);
    if ($pic !== NULL) {
      $style = $this->entityTypeManager
        ->getStorage('image_style')
        ->load('thumbnail');
      $rendered = $style
        ->buildUrl($pic
        ->getFileUri());
    }
    $cids = \Drupal::entityQuery('comment')
      ->condition('entity_id', $heartbeat
      ->id())
      ->condition('entity_type', 'heartbeat')
      ->sort('cid', 'ASC')
      ->execute();
    $comments = [];
    foreach ($cids as $cid) {
      $url = Url::fromRoute('heartbeat.sub_comment_request', array(
        'cid' => $cid,
      ));
      $commentLink = Link::fromTextAndUrl(t('Reply'), $url);
      $commentLink = $commentLink
        ->toRenderable();
      $commentLink['#attributes'] = array(
        'class' => array(
          'button',
          'button-action',
          'use-ajax',
        ),
      );
      $comment = Comment::load($cid);
      $commentOwner = user_view($comment
        ->getOwner(), 'comment');
      $subCids = \Drupal::entityQuery('comment')
        ->condition('entity_id', $cid)
        ->condition('entity_type', 'comment')
        ->sort('cid', 'ASC')
        ->execute();
      $subComments = [];
      if (count($subCids) > 0) {
        foreach ($subCids as $subCid) {
          $subComment = Comment::load($subCid);
          $subDiff = $this->timestamp - $subComment
            ->getCreatedTime();
          switch (true) {
            case $subDiff < 86400:
              $timeago = $this->dateFormatter
                ->formatInterval(REQUEST_TIME - $subComment
                ->getCreatedTime()) . ' ago';
              break;
            case $subDiff >= 86400 && $subDiff < 172800:
              $timeago = 'Yesterday at ' . $this->dateFormatter
                ->format($subComment
                ->getCreatedTime(), 'heartbeat_time');
              break;
            case $subDiff >= 172800:
              $timeago = $this->dateFormatter
                ->format($subComment
                ->getCreatedTime(), 'heartbeat_short');
              break;
          }
          $subCommentOwner = user_view($subComment
            ->getOwner(), 'comment');
          $subCommentTime = $this->timestamp - $subComment
            ->getCreatedTime() < 172800 ? $this->dateFormatter
            ->formatInterval(REQUEST_TIME - $subComment
            ->getCreatedTime()) . ' ago' : $this->dateFormatter
            ->format($subComment
            ->getCreatedTime(), 'heartbeat_short');
          $subComments[] = [
            'id' => $subCid,
            'body' => $subComment
              ->get('comment_body')->value,
            'username' => $subComment
              ->getAuthorName(),
            'owner' => $subCommentOwner,
            'timeAgo' => $subCommentTime,
            'commentLike' => Heartbeat::flagAjaxBuilder('heartbeat_like_comment', $subComment, $this->flagService),
          ];
        }
      }
      $commentTimeDiff = $this->timestamp - $comment
        ->getCreatedTime();
      switch (true) {
        case $commentTimeDiff < 86400:
          $cTimeago = $this->dateFormatter
            ->formatInterval(REQUEST_TIME - $comment
            ->getCreatedTime()) . ' ago';
          break;
        case $commentTimeDiff >= 86400 && $commentTimeDiff < 172800:
          $cTimeago = 'Yesterday at ' . $this->dateFormatter
            ->format($comment
            ->getCreatedTime(), 'heartbeat_time');
          break;
        case $commentTimeDiff >= 172800:
          $cTimeago = $this->dateFormatter
            ->format($comment
            ->getCreatedTime(), 'heartbeat_short');
          break;
      }
      $comments[] = [
        'id' => $cid,
        'body' => $comment
          ->get('comment_body')->value,
        'username' => $comment
          ->getAuthorName(),
        'owner' => $commentOwner,
        'timeAgo' => $cTimeago,
        'commentLike' => Heartbeat::flagAjaxBuilder('heartbeat_like_comment', $comment, $this->flagService),
        'reply' => $commentLink,
        'subComments' => $subComments,
      ];
    }
    $form = \Drupal::service('form_builder')
      ->getForm('\\Drupal\\heartbeat\\Form\\HeartbeatCommentForm', $heartbeat);
    $commentCount = count($comments);
    $messages[] = array(
      'heartbeat' => $heartbeat
        ->getMessage()
        ->getValue()[0]['value'],
      'userPicture' => $rendered,
      'userId' => $user
        ->id(),
      'timeAgo' => $timeago,
      'id' => $heartbeat
        ->id(),
      'userName' => $user
        ->getAccountName(),
      'user' => $userView,
      'commentForm' => $form,
      'comments' => array_reverse($comments),
      'commentCount' => $commentCount > 0 ? $commentCount : '',
      'likeFlag' => Heartbeat::flagAjaxBuilder('heartbeat_like', $heartbeat, $this->flagService),
      'unlikeFlag' => Heartbeat::flagAjaxBuilder('heartbeat_unlike', $heartbeat, $this->flagService),
    );
  }
  public static function renderOneHeartbeat(Heartbeat $heartbeat) {
    $timeago = 'Just now';
    $user = $heartbeat
      ->getOwner();
    $userView = user_view($user, 'compact');
    $userPic = $user
      ->get('user_picture')
      ->getValue();
    if (!empty($userPic)) {
      $profilePic = $userPic[0]['target_id'];
    }
    if (NULL === $profilePic) {
      $profilePic = 86;
    }
    $pic = File::load($profilePic);
    if ($pic !== NULL) {
      $style = \Drupal::entityTypeManager()
        ->getStorage('image_style')
        ->load('thumbnail');
      $rendered = $style
        ->buildUrl($pic
        ->getFileUri());
    }
    $flagService = \Drupal::service('flag');
    $form = \Drupal::service('form_builder')
      ->getForm('\\Drupal\\heartbeat\\Form\\HeartbeatCommentForm', $heartbeat);
    return '<div class="heartbeat-message" id="heartbeat-' . $heartbeat
      ->id() . '">
      <div class="heartbeat-message-wrap">
        <div class="heartbeat-owner">
          <a href="/user/' . $user
      ->id() . '"><img src="' . $rendered . '" />
            ' . $user
      ->getAccountName() . '
          </a>
          ' . \Drupal::service('renderer')
      ->render($userView)
      ->__toString() . '
          <div class="time-ago"> . ' . $timeago . '</div>
        </div>
        <div class="heartbeat-content hid-' . $heartbeat
      ->id() . '">
        ' . $heartbeat
      ->getMessage()
      ->getValue()[0]['value'] . '
        </div>
      </div>
      <div class="heartbeat-interaction-wrap">
        <div class="heartbeat-like">
           ' . \Drupal::service('renderer')
      ->renderplain(Heartbeat::flagAjaxBuilder('heartbeat_like', $heartbeat, $flagService))
      ->__toString() . '
        </div>
        <div class="heartbeat-unlike">
          ' . \Drupal::service('renderer')
      ->renderplain(Heartbeat::flagAjaxBuilder('heartbeat_unlike', $heartbeat, $flagService))
      ->__toString() . '
        </div>
        <div class="heartbeat-comment-button">
          Comment
        </div>
        <div class="heartbeat-comment" id="comment-' . $heartbeat
      ->id() . '">
        ' . \Drupal::service('renderer')
      ->renderplain($form)
      ->__toString() . '
        <div class="heartbeat-comments"></div>
        </div>
      </div>
    </div>';
  }

}

Members

Namesort descending Modifiers Type Description Overrides
BlockPluginInterface::BLOCK_LABEL_VISIBLE constant Indicates the block label (title) should be displayed to end users.
BlockPluginTrait::$transliteration protected property The transliteration service.
BlockPluginTrait::access public function
BlockPluginTrait::baseConfigurationDefaults protected function Returns generic default configuration for block plugins.
BlockPluginTrait::blockAccess protected function Indicates whether the block should be shown. 16
BlockPluginTrait::blockForm public function 16
BlockPluginTrait::blockSubmit public function 13
BlockPluginTrait::blockValidate public function 3
BlockPluginTrait::buildConfigurationForm public function Creates a generic configuration form for all block types. Individual block plugins can add elements to this form by overriding BlockBase::blockForm(). Most block plugins should not override this method unless they need to alter the generic form elements. 2
BlockPluginTrait::calculateDependencies public function
BlockPluginTrait::defaultConfiguration public function 19
BlockPluginTrait::getConfiguration public function 1
BlockPluginTrait::getMachineNameSuggestion public function 1
BlockPluginTrait::getPreviewFallbackString public function 3
BlockPluginTrait::label public function
BlockPluginTrait::setConfiguration public function
BlockPluginTrait::setConfigurationValue public function
BlockPluginTrait::setTransliteration public function Sets the transliteration service.
BlockPluginTrait::submitConfigurationForm public function Most block plugins should not override this method. To add submission handling for a specific block type, override BlockBase::blockSubmit().
BlockPluginTrait::transliteration protected function Wraps the transliteration service.
BlockPluginTrait::validateConfigurationForm public function Most block plugins should not override this method. To add validation for a specific block type, override BlockBase::blockValidate(). 1
ContextAwarePluginAssignmentTrait::addContextAssignmentElement protected function Builds a form element for assigning a context to a given slot.
ContextAwarePluginAssignmentTrait::contextHandler protected function Wraps the context handler.
ContextAwarePluginBase::$context protected property The data objects representing the context of this plugin.
ContextAwarePluginBase::$contexts Deprecated private property Data objects representing the contexts passed in the plugin configuration.
ContextAwarePluginBase::createContextFromConfiguration protected function Overrides ContextAwarePluginBase::createContextFromConfiguration
ContextAwarePluginBase::getCacheContexts public function The cache contexts associated with this object. Overrides CacheableDependencyInterface::getCacheContexts 9
ContextAwarePluginBase::getCacheMaxAge public function The maximum age for which this object may be cached. Overrides CacheableDependencyInterface::getCacheMaxAge 7
ContextAwarePluginBase::getCacheTags public function The cache tags associated with this object. Overrides CacheableDependencyInterface::getCacheTags 4
ContextAwarePluginBase::getContext public function This code is identical to the Component in order to pick up a different Context class. Overrides ContextAwarePluginBase::getContext
ContextAwarePluginBase::getContextDefinition public function Overrides ContextAwarePluginBase::getContextDefinition
ContextAwarePluginBase::getContextDefinitions public function Overrides ContextAwarePluginBase::getContextDefinitions
ContextAwarePluginBase::getContextMapping public function Gets a mapping of the expected assignment names to their context names. Overrides ContextAwarePluginInterface::getContextMapping
ContextAwarePluginBase::getContexts public function Gets the defined contexts. Overrides ContextAwarePluginInterface::getContexts
ContextAwarePluginBase::getContextValue public function Gets the value for a defined context. Overrides ContextAwarePluginInterface::getContextValue
ContextAwarePluginBase::getContextValues public function Gets the values for all defined contexts. Overrides ContextAwarePluginInterface::getContextValues
ContextAwarePluginBase::setContext public function Set a context on this plugin. Overrides ContextAwarePluginBase::setContext
ContextAwarePluginBase::setContextMapping public function Sets a mapping of the expected assignment names to their context names. Overrides ContextAwarePluginInterface::setContextMapping
ContextAwarePluginBase::setContextValue public function Sets the value for a defined context. Overrides ContextAwarePluginBase::setContextValue
ContextAwarePluginBase::validateContexts public function Validates the set values for the defined contexts. Overrides ContextAwarePluginInterface::validateContexts
ContextAwarePluginBase::__get public function Implements magic __get() method.
DependencySerializationTrait::$_entityStorages protected property An array of entity type IDs keyed by the property name of their storages.
DependencySerializationTrait::$_serviceIds protected property An array of service IDs keyed by property name used for serialization.
DependencySerializationTrait::__sleep public function 1
DependencySerializationTrait::__wakeup public function 2
HeartbeatBlock::$configFactory protected property
HeartbeatBlock::$dateFormatter protected property
HeartbeatBlock::$entityTypeManager protected property
HeartbeatBlock::$flagService protected property
HeartbeatBlock::$formBuilder protected property
HeartbeatBlock::$heartbeatService protected property Drupal\heartbeat\HeartbeatService definition.
HeartbeatBlock::$heartbeatStreamServices protected property Drupal\heartbeat\HeartbeatStreamServices definition.
HeartbeatBlock::$heartbeatTypeService protected property Drupal\heartbeat\HeartbeatTypeService definition.
HeartbeatBlock::$timestamp protected property
HeartbeatBlock::build public function Overrides BlockPluginInterface::build
HeartbeatBlock::create public static function Creates an instance of the plugin. Overrides ContainerFactoryPluginInterface::create
HeartbeatBlock::renderMessage private function
HeartbeatBlock::renderOneHeartbeat public static function
HeartbeatBlock::__construct public function Construct. Overrides BlockPluginTrait::__construct
MessengerTrait::$messenger protected property The messenger. 29
MessengerTrait::messenger public function Gets the messenger. 29
MessengerTrait::setMessenger public function Sets the messenger.
PluginBase::$configuration protected property Configuration information passed into the plugin. 1
PluginBase::$pluginDefinition protected property The plugin implementation definition. 1
PluginBase::$pluginId protected property The plugin_id.
PluginBase::DERIVATIVE_SEPARATOR constant A string which is used to separate base plugin IDs from the derivative ID.
PluginBase::getBaseId public function Gets the base_plugin_id of the plugin instance. Overrides DerivativeInspectionInterface::getBaseId
PluginBase::getDerivativeId public function Gets the derivative_id of the plugin instance. Overrides DerivativeInspectionInterface::getDerivativeId
PluginBase::getPluginDefinition public function Gets the definition of the plugin implementation. Overrides PluginInspectionInterface::getPluginDefinition 3
PluginBase::getPluginId public function Gets the plugin_id of the plugin instance. Overrides PluginInspectionInterface::getPluginId
PluginBase::isConfigurable public function Determines if the plugin is configurable.
PluginWithFormsTrait::getFormClass public function
PluginWithFormsTrait::hasFormClass public function
StringTranslationTrait::$stringTranslation protected property The string translation service. 1
StringTranslationTrait::formatPlural protected function Formats a string containing a count of items.
StringTranslationTrait::getNumberOfPlurals protected function Returns the number of plurals supported by a given language.
StringTranslationTrait::getStringTranslation protected function Gets the string translation service.
StringTranslationTrait::setStringTranslation public function Sets the string translation service to use. 2
StringTranslationTrait::t protected function Translates a string to the current language or to a given language.
TypedDataTrait::$typedDataManager protected property The typed data manager used for creating the data types.
TypedDataTrait::getTypedDataManager public function Gets the typed data manager. 2
TypedDataTrait::setTypedDataManager public function Sets the typed data manager. 2