logo

pleroma-fe

My custom branche(s) on git.pleroma.social/pleroma/pleroma-fe git clone https://hacktivis.me/git/pleroma-fe.git
commit: 3abd357694c29c84d213d7d2a7a954ab2a591da0
parent 0583a6b8638afc6b3ea07adceecdb42ca9188251
Author: Henry Jameson <me@hjkos.com>
Date:   Tue,  8 Jun 2021 11:38:44 +0300

moving mentions into separate row

Diffstat:

Msrc/components/mention_link/mention_link.js20++++++++++++++++++--
Msrc/components/mention_link/mention_link.scss5+++++
Msrc/components/mention_link/mention_link.vue2+-
Msrc/components/rich_content/rich_content.jsx19+++++++++++++++----
Msrc/components/status/status.js22++++++++++++++++------
Msrc/components/status/status.scss3++-
Msrc/components/status/status.vue43++++++++++++++++++++++++++++++++++++-------
Msrc/i18n/en.json1+
8 files changed, 94 insertions(+), 21 deletions(-)

diff --git a/src/components/mention_link/mention_link.js b/src/components/mention_link/mention_link.js @@ -14,8 +14,14 @@ const MentionLink = { type: String }, origattrs: { - required: true, - type: Object + required: false, + type: Object, + default: {} + }, + firstMention: { + required: false, + type: Boolean, + default: false } }, methods: { @@ -61,6 +67,16 @@ const MentionLink = { return rest } }, + classnames () { + return [ + { + '-you': this.isYou, + '-highlighted': this.highlight, + '-firstMention': this.firstMention + }, + this.highlightType + ] + }, ...mapGetters(['mergedConfig']), ...mapState({ currentUser: state => state.users.currentUser diff --git a/src/components/mention_link/mention_link.scss b/src/components/mention_link/mention_link.scss @@ -39,10 +39,15 @@ } .new { + &.-firstMention { + display: none; + } + &, &.-highlighted { .short { line-height: 1.5; + font-size: inherit; &::before { display: inline-block; diff --git a/src/components/mention_link/mention_link.vue b/src/components/mention_link/mention_link.vue @@ -12,7 +12,7 @@ v-if="user" class="new" :style="style" - :class="[{ '-you': isYou, '-highlighted': highlight }, highlightType]" + :class="classnames" > <button class="short button-default" diff --git a/src/components/rich_content/rich_content.jsx b/src/components/rich_content/rich_content.jsx @@ -33,21 +33,32 @@ export default Vue.component('RichContent', { class="img" /> } - const renderMention = (attrs, children) => { + const renderMention = (attrs, children, encounteredText) => { return <MentionLink url={attrs.href} content={flattenDeep(children).join('')} + firstMention={!encounteredText} origattrs={attrs} /> } + let encounteredText = false // Processor to use with mini_html_converter const processItem = (item) => { // Handle text noes - just add emoji if (typeof item === 'string') { + const emptyText = item.trim() + if (!emptyText) { + return encounteredText ? item : item.trim() + } + let unescapedItem = unescape(item) + if (!encounteredText) { + unescapedItem = unescapedItem.trimStart() + encounteredText = true + } if (item.includes(':')) { return processTextForEmoji( - unescape(item), + unescapedItem, this.emoji, ({ shortcode, url }) => { return <StillImage @@ -59,7 +70,7 @@ export default Vue.component('RichContent', { } ) } else { - return unescape(item) + return unescapedItem } } // Handle tag nodes @@ -73,7 +84,7 @@ export default Vue.component('RichContent', { if (!this.handleLinks) break const attrs = getAttrs(opener) if (attrs['class'] && attrs['class'].includes('mention')) { - return renderMention(attrs, children) + return renderMention(attrs, children, encounteredText) } } // Render tag as is diff --git a/src/components/status/status.js b/src/components/status/status.js @@ -13,6 +13,7 @@ import RichContent from 'src/components/rich_content/rich_content.jsx' import StatusPopover from '../status_popover/status_popover.vue' import UserListPopover from '../user_list_popover/user_list_popover.vue' import EmojiReactions from '../emoji_reactions/emoji_reactions.vue' +import MentionLink from 'src/components/mention_link/mention_link.vue' import generateProfileLink from 'src/services/user_profile_link_generator/user_profile_link_generator' import { highlightClass, highlightStyle } from '../../services/user_highlighter/user_highlighter.js' import { muteWordHits } from '../../services/status_parser/status_parser.js' @@ -33,7 +34,8 @@ import { faStar, faEyeSlash, faEye, - faThumbtack + faThumbtack, + faAt, } from '@fortawesome/free-solid-svg-icons' library.add( @@ -50,7 +52,8 @@ library.add( faEllipsisH, faEyeSlash, faEye, - faThumbtack + faThumbtack, + faAt ) const Status = { @@ -70,7 +73,8 @@ const Status = { UserListPopover, EmojiReactions, StatusContent, - RichContent + RichContent, + MentionLink }, props: [ 'statusoid', @@ -133,9 +137,7 @@ const Status = { return this.generateUserProfileLink(this.status.user.id, this.status.user.screen_name) }, replyProfileLink () { - if (this.isReply) { - return this.generateUserProfileLink(this.status.in_reply_to_user_id, this.replyToName) - } + return this.$store.getters.findUser(this.status.in_reply_to_screen_name).statusnet_profile_url }, retweet () { return !!this.statusoid.retweeted_status }, retweeterUser () { return this.statusoid.user }, @@ -159,6 +161,14 @@ const Status = { muteWordHits () { return muteWordHits(this.status, this.muteWords) }, + mentions () { + return this.statusoid.attentions.filter(attn => { + return attn.screen_name !== this.replyToName + }) + }, + hasMentions () { + return this.mentions.length > 0 + }, muted () { if (this.statusoid.user.id === this.currentUser.id) return false const { status } = this diff --git a/src/components/status/status.scss b/src/components/status/status.scss @@ -155,7 +155,8 @@ $status-margin: 0.75em; margin-right: 0.2em; } - .heading-reply-row { + & .heading-mentions-row, + & .heading-reply-row { position: relative; align-content: baseline; font-size: 12px; diff --git a/src/components/status/status.vue b/src/components/status/status.vue @@ -222,6 +222,35 @@ </span> </div> + <div v-if="hasMentions" class="heading-mentions-row"> + <div + class="mentions" + > + <span + class="button-unstyled reply-to" + :aria-label="$t('tool_tip.reply')" + @click.prevent="gotoOriginal(status.in_reply_to_status_id)" + > + <FAIcon + class="fa-scale-110 fa-old-padding" + icon="at" + /> + <span + class="faint-link reply-to-text" + > + {{ $t('status.mentions') }} + </span> + </span> + <MentionLink + v-for="mention in mentions" + class="mention-link" + :key="mention.statusnet_profile_url" + :content="mention.statusnet_profile_url" + :url="mention.statusnet_profile_url" + :first-mention="false" + /> + </div> + </div> <div class="heading-reply-row"> <div v-if="isReply" @@ -258,13 +287,13 @@ > <span class="reply-to-text">{{ $t('status.reply_to') }}</span> </span> - <router-link - class="reply-to-link" - :title="replyToName" - :to="replyProfileLink" - > - {{ replyToName }} - </router-link> + + <MentionLink + class="mention-link" + :content="replyToName" + :url="replyProfileLink" + :first-mention="false" + /> <span v-if="replies && replies.length" class="faint replies-separator" diff --git a/src/i18n/en.json b/src/i18n/en.json @@ -697,6 +697,7 @@ "unbookmark": "Unbookmark", "delete_confirm": "Do you really want to delete this status?", "reply_to": "Reply to", + "mentions": "Mentions", "replies_list": "Replies:", "mute_conversation": "Mute conversation", "unmute_conversation": "Unmute conversation",