import Component from 'flarum/Component'; import avatar from 'flarum/helpers/avatar'; import listItems from 'flarum/helpers/listItems'; import highlight from 'flarum/helpers/highlight'; import icon from 'flarum/helpers/icon'; import humanTime from 'flarum/utils/humanTime'; import ItemList from 'flarum/utils/ItemList'; import abbreviateNumber from 'flarum/utils/abbreviateNumber'; import Dropdown from 'flarum/components/Dropdown'; import TerminalPost from 'flarum/components/TerminalPost'; import PostPreview from 'flarum/components/PostPreview'; import SubtreeRetainer from 'flarum/utils/SubtreeRetainer'; import DiscussionControls from 'flarum/utils/DiscussionControls'; import slidable from 'flarum/utils/slidable'; import extractText from 'flarum/utils/extractText'; import classList from 'flarum/utils/classList'; /** * The `DiscussionListItem` component shows a single discussion in the * discussion list. * * ### Props * * - `discussion` * - `params` */ export default class DiscussionListItem extends Component { init() { /** * Set up a subtree retainer so that the discussion will not be redrawn * unless new data comes in. * * @type {SubtreeRetainer} */ this.subtree = new SubtreeRetainer( () => this.props.discussion.freshness, () => { const time = app.session.user && app.session.user.readTime(); return time && time.getTime(); }, () => this.active() ); } attrs() { return { className: classList([ 'DiscussionListItem', this.active() ? 'active' : '', this.props.discussion.isHidden() ? 'DiscussionListItem--hidden' : '' ]) }; } view() { const retain = this.subtree.retain(); if (retain) return retain; const discussion = this.props.discussion; const startUser = discussion.startUser(); const isUnread = discussion.isUnread(); const isRead = discussion.isRead(); const showUnread = !this.showRepliesCount() && isUnread; let jumpTo = 0; const controls = DiscussionControls.controls(discussion, this).toArray(); const attrs = this.attrs(); if (this.props.params.q) { const post = discussion.mostRelevantPost(); if (post) { jumpTo = post.number(); } const phrase = this.props.params.q; this.highlightRegExp = new RegExp(phrase+'|'+phrase.trim().replace(/\s+/g, '|'), 'gi'); } else { jumpTo = Math.min(discussion.lastPostNumber(), (discussion.readNumber() || 0) + 1); } return (