+
+ /**
+ * "New Item View" on network page or search page results
+ * - just loop through the items and format them minimally for display
+ *
+ * @param array $items
+ * @param string $mode One of self::MODE_*
+ * @param bool $preview Whether the display is a preview
+ * @param bool $pagedrop Whether the user can select the threads for deletion
+ * @param string $formSecurityToken A 'contact_action' form security token
+ * @return array
+ * @throws InternalServerErrorException
+ * @throws \ImagickException
+ */
+ public function getContextLessThreadList(array $items, string $mode, bool $preview, bool $pagedrop, string $formSecurityToken): array
+ {
+ $threads = [];
+ $uriids = [];
+
+ foreach ($items as $item) {
+ if (in_array($item['uri-id'], $uriids)) {
+ continue;
+ }
+
+ $uriids[] = $item['uri-id'];
+
+ if (!$this->item->isVisibleActivity($item)) {
+ continue;
+ }
+
+ if (in_array($item['author-id'], $this->getBlocklist())) {
+ continue;
+ }
+
+ $threadsid++;
+
+ // prevent private email from leaking.
+ if ($item['network'] === Protocol::MAIL && $this->session->getLocalUserId() != $item['uid']) {
+ continue;
+ }
+
+ $profile_name = $item['author-name'];
+ if (!empty($item['author-link']) && empty($item['author-name'])) {
+ $profile_name = $item['author-link'];
+ }
+
+ $tags = Tag::populateFromItem($item);
+
+ $author = [
+ 'uid' => 0,
+ 'id' => $item['author-id'],
+ 'network' => $item['author-network'],
+ 'url' => $item['author-link'],
+ 'alias' => $item['author-alias'],
+ ];
+ $profile_link = Contact::magicLinkByContact($author);
+
+ $sparkle = '';
+ if (strpos($profile_link, 'contact/redir/') === 0) {
+ $sparkle = ' sparkle';
+ }
+
+ $locate = ['location' => $item['location'], 'coord' => $item['coord'], 'html' => ''];
+ Hook::callAll('render_location', $locate);
+ $location_html = $locate['html'] ?: Strings::escapeHtml($locate['location'] ?: $locate['coord'] ?: '');
+
+ $this->item->localize($item);
+ if ($mode === self::MODE_FILED) {
+ $dropping = true;
+ } else {
+ $dropping = false;
+ }
+
+ $drop = [
+ 'dropping' => $dropping,
+ 'pagedrop' => $pagedrop,
+ 'select' => $this->l10n->t('Select'),
+ 'delete' => $this->l10n->t('Delete'),
+ ];
+
+ $likebuttons = [
+ 'like' => null,
+ 'dislike' => null,
+ 'share' => null,
+ 'announce' => null,
+ ];
+
+ if ($this->pConfig->get($this->session->getLocalUserId(), 'system', 'hide_dislike')) {
+ unset($likebuttons['dislike']);
+ }
+
+ $body_html = ItemModel::prepareBody($item, true, $preview);
+
+ [$categories, $folders] = $this->item->determineCategoriesTerms($item, $this->session->getLocalUserId());
+
+ if (!empty($item['title'])) {
+ $title = $item['title'];
+ } elseif (!empty($item['content-warning']) && $this->pConfig->get($this->session->getLocalUserId(), 'system', 'disable_cw', false)) {
+ $title = ucfirst($item['content-warning']);
+ } else {
+ $title = '';
+ }
+
+ if (!empty($item['featured'])) {
+ $pinned = $this->l10n->t('Pinned item');
+ } else {
+ $pinned = '';
+ }
+
+ $tmp_item = [
+ 'template' => 'search_item.tpl',
+ 'id' => ($preview ? 'P0' : $item['id']),
+ 'guid' => ($preview ? 'Q0' : $item['guid']),
+ 'commented' => $item['commented'],
+ 'received' => $item['received'],
+ 'created_date' => $item['created'],
+ 'uriid' => $item['uri-id'],
+ 'network' => $item['network'],
+ 'network_name' => ContactSelector::networkToName($item['author-network'], $item['author-link'], $item['network'], $item['author-gsid']),
+ 'network_icon' => ContactSelector::networkToIcon($item['network'], $item['author-link'], $item['author-gsid']),
+ 'linktitle' => $this->l10n->t('View %s\'s profile @ %s', $profile_name, $item['author-link']),
+ 'profile_url' => $profile_link,
+ 'item_photo_menu_html' => $this->item->photoMenu($item, $formSecurityToken),
+ 'name' => $profile_name,
+ 'sparkle' => $sparkle,
+ 'lock' => false,
+ 'thumb' => $this->baseURL->remove($this->item->getAuthorAvatar($item)),
+ 'title' => $title,
+ 'body_html' => $body_html,
+ 'tags' => $tags['tags'],
+ 'hashtags' => $tags['hashtags'],
+ 'mentions' => $tags['mentions'],
+ 'implicit_mentions' => $tags['implicit_mentions'],
+ 'txt_cats' => $this->l10n->t('Categories:'),
+ 'txt_folders' => $this->l10n->t('Filed under:'),
+ 'has_cats' => ((count($categories)) ? 'true' : ''),
+ 'has_folders' => ((count($folders)) ? 'true' : ''),
+ 'categories' => $categories,
+ 'folders' => $folders,
+ 'text' => strip_tags($body_html),
+ 'localtime' => DateTimeFormat::local($item['created'], 'r'),
+ 'utc' => DateTimeFormat::utc($item['created'], 'c'),
+ 'ago' => (($item['app']) ? $this->l10n->t('%s from %s', Temporal::getRelativeDate($item['created']), $item['app']) : Temporal::getRelativeDate($item['created'])),
+ 'location_html' => $location_html,
+ 'indent' => '',
+ 'owner_name' => '',
+ 'owner_url' => '',
+ 'owner_photo' => $this->baseURL->remove($this->item->getOwnerAvatar($item)),
+ 'plink' => ItemModel::getPlink($item),
+ 'edpost' => false,
+ 'pinned' => $pinned,
+ 'isstarred' => 'unstarred',
+ 'star' => false,
+ 'drop' => $drop,
+ 'vote' => $likebuttons,
+ 'like_html' => '',
+ 'dislike_html ' => '',
+ 'comment_html' => '',
+ 'conv' => $preview ? '' : ['href' => 'display/' . $item['guid'], 'title' => $this->l10n->t('View in context')],
+ 'previewing' => $preview ? ' preview ' : '',
+ 'wait' => $this->l10n->t('Please wait'),
+ 'thread_level' => 1,
+ ];
+
+ $arr = ['item' => $item, 'output' => $tmp_item];
+ Hook::callAll('display_item', $arr);
+
+ $threads[] = [
+ 'id' => $item['id'],
+ 'network' => $item['network'],
+ 'items' => [$arr['output']],
+ ];
+ }
+
+ return $threads;
+ }