2016-10-29 03:08:03 +11:00
import Attachment from '../attachment/attachment.vue'
2016-10-31 02:12:35 +11:00
import FavoriteButton from '../favorite_button/favorite_button.vue'
2019-11-16 01:29:25 +11:00
import ReactButton from '../react_button/react_button.vue'
2016-11-14 02:42:56 +11:00
import RetweetButton from '../retweet_button/retweet_button.vue'
2019-06-19 06:28:31 +10:00
import Poll from '../poll/poll.vue'
2019-04-13 05:35:29 +10:00
import ExtraButtons from '../extra_buttons/extra_buttons.vue'
2016-11-04 02:59:27 +11:00
import PostStatusForm from '../post_status_form/post_status_form.vue'
2019-03-06 06:01:49 +11:00
import UserCard from '../user_card/user_card.vue'
2019-02-03 06:11:36 +11:00
import UserAvatar from '../user_avatar/user_avatar.vue'
2019-01-27 02:45:03 +11:00
import Gallery from '../gallery/gallery.vue'
2019-01-28 00:47:30 +11:00
import LinkPreview from '../link-preview/link-preview.vue'
2019-04-02 13:29:45 +11:00
import AvatarList from '../avatar_list/avatar_list.vue'
2019-06-19 06:28:31 +10:00
import Timeago from '../timeago/timeago.vue'
2019-10-25 07:53:36 +11:00
import StatusPopover from '../status_popover/status_popover.vue'
2020-01-14 19:06:14 +11:00
import EmojiReactions from '../emoji_reactions/emoji_reactions.vue'
2018-12-14 03:57:11 +11:00
import generateProfileLink from 'src/services/user_profile_link_generator/user_profile_link_generator'
2019-01-27 02:45:03 +11:00
import fileType from 'src/services/file_type/file_type.service'
2019-11-14 09:18:14 +11:00
import { processHtml } from 'src/services/tiny_post_html_processor/tiny_post_html_processor.service.js'
2019-01-31 05:49:24 +11:00
import { highlightClass , highlightStyle } from '../../services/user_highlighter/user_highlighter.js'
2019-02-08 08:54:49 +11:00
import { mentionMatchesUrl , extractTagFromUrl } from 'src/services/matcher/matcher.service.js'
2019-10-25 07:53:36 +11:00
import { filter , unescape , uniqBy } from 'lodash'
2019-11-14 09:18:14 +11:00
import { mapGetters , mapState } from 'vuex'
2016-10-29 03:08:03 +11:00
2016-10-29 00:19:42 +11:00
const Status = {
2018-04-10 02:43:31 +10:00
name : 'Status' ,
2017-02-04 23:53:28 +11:00
props : [
'statusoid' ,
2019-05-07 11:36:55 +10:00
'expandable' ,
2017-03-09 19:19:40 +11:00
'inConversation' ,
2017-04-13 01:25:19 +10:00
'focused' ,
2017-05-31 18:47:18 +10:00
'highlight' ,
2017-06-05 06:58:15 +10:00
'compact' ,
2018-04-10 02:43:31 +10:00
'replies' ,
2019-03-03 03:35:38 +11:00
'isPreview' ,
2018-04-10 02:43:31 +10:00
'noHeading' ,
2019-05-01 01:06:22 +10:00
'inlineExpanded' ,
2019-09-14 05:34:17 +10:00
'showPinned' ,
2019-11-26 04:25:01 +11:00
'inProfile' ,
'profileUserId'
2017-02-04 23:53:28 +11:00
] ,
2018-08-20 11:59:06 +10:00
data ( ) {
return {
2019-03-12 07:24:37 +11:00
replying : false ,
2018-08-20 11:59:06 +10:00
unmuted : false ,
userExpanded : false ,
2019-01-29 06:59:17 +11:00
showingTall : this . inConversation && this . focused ,
2019-02-05 01:28:14 +11:00
showingLongSubject : false ,
2019-04-08 01:38:16 +10:00
error : null ,
2019-11-14 09:41:14 +11:00
// not as computed because it sets the initial state which will be changed later
2019-11-14 09:52:38 +11:00
expandingSubject : ! this . $store . getters . mergedConfig . collapseMessageWithSubject
2018-08-20 11:59:06 +10:00
}
} ,
2016-10-29 03:08:03 +11:00
computed : {
2018-10-22 04:04:23 +11:00
localCollapseSubjectDefault ( ) {
2019-09-30 05:33:15 +10:00
return this . mergedConfig . collapseMessageWithSubject
2018-10-22 04:04:23 +11:00
} ,
2017-04-09 23:53:23 +10:00
muteWords ( ) {
2019-09-30 05:33:15 +10:00
return this . mergedConfig . muteWords
2017-04-09 23:53:23 +10:00
} ,
2018-06-18 18:36:58 +10:00
repeaterClass ( ) {
const user = this . statusoid . user
2018-06-19 23:17:50 +10:00
return highlightClass ( user )
2018-06-18 18:36:58 +10:00
} ,
2018-04-26 00:35:25 +10:00
userClass ( ) {
2018-06-18 18:36:58 +10:00
const user = this . retweet ? ( this . statusoid . retweeted _status . user ) : this . statusoid . user
2018-06-19 23:17:50 +10:00
return highlightClass ( user )
2018-06-18 18:36:58 +10:00
} ,
2018-12-05 05:49:00 +11:00
deleted ( ) {
2018-12-05 05:45:08 +11:00
return this . statusoid . deleted
} ,
2018-06-18 18:36:58 +10:00
repeaterStyle ( ) {
const user = this . statusoid . user
2019-09-30 05:33:15 +10:00
const highlight = this . mergedConfig . highlight
2018-08-05 12:18:04 +10:00
return highlightStyle ( highlight [ user . screen _name ] )
2018-06-18 18:36:58 +10:00
} ,
userStyle ( ) {
2018-08-05 12:41:37 +10:00
if ( this . noHeading ) return
2018-06-18 18:36:58 +10:00
const user = this . retweet ? ( this . statusoid . retweeted _status . user ) : this . statusoid . user
2019-09-30 05:33:15 +10:00
const highlight = this . mergedConfig . highlight
2018-08-05 12:18:04 +10:00
return highlightStyle ( highlight [ user . screen _name ] )
2018-04-26 00:35:25 +10:00
} ,
2017-03-05 07:25:59 +11:00
hideAttachments ( ) {
2019-09-30 05:33:15 +10:00
return ( this . mergedConfig . hideAttachments && ! this . inConversation ) ||
( this . mergedConfig . hideAttachmentsInConv && this . inConversation )
2017-03-05 07:25:59 +11:00
} ,
2019-01-23 07:57:51 +11:00
userProfileLink ( ) {
return this . generateUserProfileLink ( this . status . user . id , this . status . user . screen _name )
} ,
replyProfileLink ( ) {
if ( this . isReply ) {
2019-01-31 01:57:19 +11:00
return this . generateUserProfileLink ( this . status . in _reply _to _user _id , this . replyToName )
2019-01-23 07:57:51 +11:00
}
} ,
2016-10-29 03:08:03 +11:00
retweet ( ) { return ! ! this . statusoid . retweeted _status } ,
2019-02-02 09:40:06 +11:00
retweeter ( ) { return this . statusoid . user . name || this . statusoid . user . screen _name } ,
2018-08-09 19:52:34 +10:00
retweeterHtml ( ) { return this . statusoid . user . name _html } ,
2019-02-04 06:08:04 +11:00
retweeterProfileLink ( ) { return this . generateUserProfileLink ( this . statusoid . user . id , this . statusoid . user . screen _name ) } ,
2016-10-29 03:08:03 +11:00
status ( ) {
if ( this . retweet ) {
return this . statusoid . retweeted _status
} else {
return this . statusoid
}
2016-11-07 06:45:26 +11:00
} ,
2019-04-10 01:45:33 +10:00
statusFromGlobalRepository ( ) {
// NOTE: Consider to replace status with statusFromGlobalRepository
return this . $store . state . statuses . allStatusesObject [ this . status . id ]
} ,
2016-11-07 06:45:26 +11:00
loggedIn ( ) {
2019-11-14 09:18:14 +11:00
return ! ! this . currentUser
2017-02-14 10:01:50 +11:00
} ,
2017-04-09 23:53:23 +10:00
muteWordHits ( ) {
const statusText = this . status . text . toLowerCase ( )
2019-07-21 03:06:54 +10:00
const statusSummary = this . status . summary . toLowerCase ( )
2017-04-09 23:53:23 +10:00
const hits = filter ( this . muteWords , ( muteWord ) => {
2019-07-21 03:06:54 +10:00
return statusText . includes ( muteWord . toLowerCase ( ) ) || statusSummary . includes ( muteWord . toLowerCase ( ) )
2017-04-09 23:53:23 +10:00
} )
return hits
} ,
2019-11-26 04:25:01 +11:00
muted ( ) { return ! this . unmuted && ( ( ! ( this . inProfile && this . status . user . id === this . profileUserId ) && this . status . user . muted ) || ( ! this . inConversation && this . status . thread _muted ) || this . muteWordHits . length > 0 ) } ,
2019-02-07 05:18:13 +11:00
hideFilteredStatuses ( ) {
2019-09-30 05:33:15 +10:00
return this . mergedConfig . hideFilteredStatuses
2019-02-07 05:18:13 +11:00
} ,
2019-02-08 23:25:56 +11:00
hideStatus ( ) {
2019-02-09 00:17:20 +11:00
return ( this . hideReply || this . deleted ) || ( this . muted && this . hideFilteredStatuses )
2019-02-08 23:25:56 +11:00
} ,
2017-04-13 01:25:19 +10:00
isFocused ( ) {
// retweet or root of an expanded conversation
2017-04-13 02:07:55 +10:00
if ( this . focused ) {
2017-04-13 01:25:19 +10:00
return true
2017-04-13 02:07:55 +10:00
} else if ( ! this . inConversation ) {
2017-04-13 01:25:19 +10:00
return false
2017-04-13 02:07:55 +10:00
}
// use conversation highlight only when in conversation
return this . status . id === this . highlight
2018-04-10 02:43:31 +10:00
} ,
// This is a bit hacky, but we want to approximate post height before rendering
// so we count newlines (masto uses <p> for paragraphs, GS uses <br> between them)
// as well as approximate line count by counting characters and approximating ~80
// per line.
//
// Using max-height + overflow: auto for status components resulted in false positives
// very often with japanese characters, and it was very annoying.
2018-08-20 11:59:06 +10:00
tallStatus ( ) {
const lengthScore = this . status . statusnet _html . split ( /<p|<br/ ) . length + this . status . text . length / 80
return lengthScore > 20
} ,
2019-02-05 01:28:14 +11:00
longSubject ( ) {
return this . status . summary . length > 900
2019-02-04 15:47:26 +11:00
} ,
2018-08-25 05:04:26 +10:00
isReply ( ) {
2019-01-27 20:31:23 +11:00
return ! ! ( this . status . in _reply _to _status _id && this . status . in _reply _to _user _id )
2018-08-25 05:04:26 +10:00
} ,
2019-01-23 07:57:51 +11:00
replyToName ( ) {
2019-03-09 10:34:15 +11:00
if ( this . status . in _reply _to _screen _name ) {
2019-01-25 04:27:20 +11:00
return this . status . in _reply _to _screen _name
2019-03-09 10:34:15 +11:00
} else {
2019-03-09 10:36:35 +11:00
const user = this . $store . getters . findUser ( this . status . in _reply _to _user _id )
return user && user . screen _name
2019-01-23 07:57:51 +11:00
}
} ,
2018-08-25 05:04:26 +10:00
hideReply ( ) {
2019-09-30 05:33:15 +10:00
if ( this . mergedConfig . replyVisibility === 'all' ) {
2018-08-25 05:04:26 +10:00
return false
}
2019-05-07 06:17:29 +10:00
if ( this . inConversation || ! this . isReply ) {
2018-08-25 05:04:26 +10:00
return false
}
2019-11-14 09:18:14 +11:00
if ( this . status . user . id === this . currentUser . id ) {
2018-08-25 05:04:26 +10:00
return false
}
2019-01-18 07:44:31 +11:00
if ( this . status . type === 'retweet' ) {
2018-08-25 05:04:26 +10:00
return false
}
2019-09-30 05:33:15 +10:00
const checkFollowing = this . mergedConfig . replyVisibility === 'following'
2018-08-25 05:04:26 +10:00
for ( var i = 0 ; i < this . status . attentions . length ; ++ i ) {
if ( this . status . user . id === this . status . attentions [ i ] . id ) {
continue
}
2019-07-08 05:23:04 +10:00
const taggedUser = this . $store . getters . findUser ( this . status . attentions [ i ] . id )
if ( checkFollowing && taggedUser && taggedUser . following ) {
2018-08-25 05:04:26 +10:00
return false
}
2019-11-14 09:18:14 +11:00
if ( this . status . attentions [ i ] . id === this . currentUser . id ) {
2018-08-25 05:04:26 +10:00
return false
}
}
return this . status . attentions . length > 0
} ,
2020-02-25 10:10:15 +11:00
// When a status has a subject and is also tall, we should only have one show more/less button. If the default is to collapse statuses with subjects, we just treat it like a status with a subject; otherwise, we just treat it like a tall status.
mightHideBecauseSubject ( ) {
return this . status . summary && ( ! this . tallStatus || this . localCollapseSubjectDefault )
} ,
mightHideBecauseTall ( ) {
return this . tallStatus && ( ! this . status . summary || ! this . localCollapseSubjectDefault )
} ,
2018-08-20 12:41:40 +10:00
hideSubjectStatus ( ) {
2020-02-25 10:10:15 +11:00
return this . mightHideBecauseSubject && ! this . expandingSubject
2018-08-20 11:59:06 +10:00
} ,
2018-04-10 02:43:31 +10:00
hideTallStatus ( ) {
2020-02-25 10:10:15 +11:00
return this . mightHideBecauseTall && ! this . showingTall
2018-08-20 11:59:06 +10:00
} ,
showingMore ( ) {
2020-02-25 10:10:15 +11:00
return ( this . mightHideBecauseTall && this . showingTall ) || ( this . mightHideBecauseSubject && this . expandingSubject )
2018-04-10 02:43:31 +10:00
} ,
2018-08-26 09:21:54 +10:00
nsfwClickthrough ( ) {
if ( ! this . status . nsfw ) {
return false
}
2018-10-22 04:04:23 +11:00
if ( this . status . summary && this . localCollapseSubjectDefault ) {
2018-08-26 09:21:54 +10:00
return false
}
return true
} ,
2018-08-26 10:50:11 +10:00
replySubject ( ) {
2018-09-25 22:21:47 +10:00
if ( ! this . status . summary ) return ''
2019-02-09 23:13:52 +11:00
const decodedSummary = unescape ( this . status . summary )
2019-09-30 05:33:15 +10:00
const behavior = this . mergedConfig . subjectLineBehavior
2019-02-09 03:25:53 +11:00
const startsWithRe = decodedSummary . match ( /^re[: ]/i )
2019-07-07 07:54:17 +10:00
if ( ( behavior !== 'noop' && startsWithRe ) || behavior === 'masto' ) {
2019-02-09 03:25:53 +11:00
return decodedSummary
2018-09-25 22:16:26 +10:00
} else if ( behavior === 'email' ) {
2019-02-09 03:25:53 +11:00
return 're: ' . concat ( decodedSummary )
2018-09-25 22:16:26 +10:00
} else if ( behavior === 'noop' ) {
return ''
2018-08-26 10:50:11 +10:00
}
} ,
2018-04-10 02:43:31 +10:00
attachmentSize ( ) {
2019-09-30 05:33:15 +10:00
if ( ( this . mergedConfig . hideAttachments && ! this . inConversation ) ||
( this . mergedConfig . hideAttachmentsInConv && this . inConversation ) ||
2019-02-28 01:38:58 +11:00
( this . status . attachments . length > this . maxThumbnails ) ) {
2018-04-10 02:43:31 +10:00
return 'hide'
} else if ( this . compact ) {
return 'small'
}
return 'normal'
2019-01-27 02:45:03 +11:00
} ,
galleryTypes ( ) {
if ( this . attachmentSize === 'hide' ) {
return [ ]
}
2019-09-30 05:33:15 +10:00
return this . mergedConfig . playVideosInModal
2019-02-01 06:19:41 +11:00
? [ 'image' , 'video' ]
: [ 'image' ]
2019-01-27 02:45:03 +11:00
} ,
galleryAttachments ( ) {
return this . status . attachments . filter (
file => fileType . fileMatchesSomeType ( this . galleryTypes , file )
)
} ,
nonGalleryAttachments ( ) {
return this . status . attachments . filter (
file => ! fileType . fileMatchesSomeType ( this . galleryTypes , file )
)
2019-02-28 01:38:58 +11:00
} ,
2020-02-09 08:01:01 +11:00
hasImageAttachments ( ) {
return this . status . attachments . some (
file => fileType . fileType ( file . mimetype ) === 'image'
)
} ,
hasVideoAttachments ( ) {
return this . status . attachments . some (
file => fileType . fileType ( file . mimetype ) === 'video'
)
} ,
2019-02-28 01:38:58 +11:00
maxThumbnails ( ) {
2019-09-30 05:33:15 +10:00
return this . mergedConfig . maxThumbnails
2019-04-02 03:54:34 +11:00
} ,
2019-11-14 09:18:14 +11:00
postBodyHtml ( ) {
const html = this . status . statusnet _html
2019-11-14 09:47:20 +11:00
if ( this . mergedConfig . greentext ) {
try {
if ( html . includes ( '>' ) ) {
// This checks if post has '>' at the beginning, excluding mentions so that @mention >impying works
return processHtml ( html , ( string ) => {
if ( string . includes ( '>' ) &&
string
2019-11-14 09:52:38 +11:00
. replace ( /<[^>]+?>/gi , '' ) // remove all tags
. replace ( /@\w+/gi , '' ) // remove mentions (even failed ones)
. trim ( )
. startsWith ( '>' ) ) {
2019-11-14 09:47:20 +11:00
return ` <span class='greentext'> ${ string } </span> `
} else {
return string
}
} )
} else {
return html
}
} catch ( e ) {
console . err ( 'Failed to process status html' , e )
2019-11-14 09:18:14 +11:00
return html
}
2019-11-14 09:47:20 +11:00
} else {
2019-11-14 09:18:14 +11:00
return html
}
} ,
2019-04-02 03:54:34 +11:00
contentHtml ( ) {
2019-04-02 04:01:28 +11:00
if ( ! this . status . summary _html ) {
2019-11-14 09:18:14 +11:00
return this . postBodyHtml
2019-04-02 04:01:28 +11:00
}
2019-11-14 09:18:14 +11:00
return this . status . summary _html + '<br />' + this . postBodyHtml
2019-04-02 13:29:45 +11:00
} ,
2019-05-02 00:33:56 +10:00
combinedFavsAndRepeatsUsers ( ) {
2019-04-10 01:45:33 +10:00
// Use the status from the global status repository since favs and repeats are saved in it
2019-05-02 00:33:56 +10:00
const combinedUsers = [ ] . concat (
2019-04-30 05:36:39 +10:00
this . statusFromGlobalRepository . favoritedBy ,
this . statusFromGlobalRepository . rebloggedBy
)
2019-05-02 00:33:56 +10:00
return uniqBy ( combinedUsers , 'id' )
2019-04-05 03:56:13 +11:00
} ,
ownStatus ( ) {
2019-11-14 09:18:14 +11:00
return this . status . user . id === this . currentUser . id
2019-05-21 05:23:36 +10:00
} ,
tags ( ) {
return this . status . tags . filter ( tagObj => tagObj . hasOwnProperty ( 'name' ) ) . map ( tagObj => tagObj . name ) . join ( ' ' )
2019-07-09 23:50:23 +10:00
} ,
hidePostStats ( ) {
2019-09-30 05:33:15 +10:00
return this . mergedConfig . hidePostStats
} ,
2019-11-14 09:18:14 +11:00
... mapGetters ( [ 'mergedConfig' ] ) ,
... mapState ( {
betterShadow : state => state . interface . browserSupport . cssFilter ,
currentUser : state => state . users . currentUser
} )
2016-10-29 03:08:03 +11:00
} ,
components : {
2016-10-31 02:12:35 +11:00
Attachment ,
2016-11-04 02:59:27 +11:00
FavoriteButton ,
2019-11-16 01:29:25 +11:00
ReactButton ,
2016-11-14 02:42:56 +11:00
RetweetButton ,
2019-04-13 05:35:29 +10:00
ExtraButtons ,
2017-02-17 01:58:49 +11:00
PostStatusForm ,
2019-06-19 06:28:31 +10:00
Poll ,
2019-03-06 06:01:49 +11:00
UserCard ,
2019-02-03 06:11:36 +11:00
UserAvatar ,
2019-01-31 05:49:24 +11:00
Gallery ,
2019-04-02 13:29:45 +11:00
LinkPreview ,
2019-06-19 06:28:31 +10:00
AvatarList ,
2019-10-25 07:53:36 +11:00
Timeago ,
2020-01-14 19:06:14 +11:00
StatusPopover ,
EmojiReactions
2016-11-04 02:59:27 +11:00
} ,
methods : {
2018-05-22 08:01:33 +10:00
visibilityIcon ( visibility ) {
switch ( visibility ) {
case 'private' :
return 'icon-lock'
case 'unlisted' :
return 'icon-lock-open-alt'
case 'direct' :
return 'icon-mail-alt'
default :
return 'icon-globe'
2018-05-21 02:28:01 +10:00
}
} ,
2019-04-13 05:35:29 +10:00
showError ( error ) {
this . error = error
2019-04-27 23:36:10 +10:00
} ,
clearError ( ) {
this . error = undefined
2019-04-13 05:35:29 +10:00
} ,
2019-01-31 04:15:35 +11:00
linkClicked ( event ) {
2019-07-24 10:59:37 +10:00
const target = event . target . closest ( '.status-content a' )
2019-07-24 05:43:03 +10:00
if ( target ) {
2019-01-31 04:15:35 +11:00
if ( target . className . match ( /mention/ ) ) {
2019-02-08 08:54:49 +11:00
const href = target . href
2019-01-31 04:15:35 +11:00
const attn = this . status . attentions . find ( attn => mentionMatchesUrl ( attn , href ) )
if ( attn ) {
event . stopPropagation ( )
event . preventDefault ( )
const link = this . generateUserProfileLink ( attn . id , attn . screen _name )
this . $router . push ( link )
return
}
2019-02-08 08:54:49 +11:00
}
2019-08-14 03:11:37 +10:00
if ( target . rel . match ( /(?:^|\s)tag(?:$|\s)/ ) || target . className . match ( /hashtag/ ) ) {
2019-02-08 08:54:49 +11:00
// Extract tag name from link url
const tag = extractTagFromUrl ( target . href )
if ( tag ) {
const link = this . generateTagLink ( tag )
this . $router . push ( link )
2019-02-12 01:45:22 +11:00
return
2019-02-08 08:54:49 +11:00
}
2019-01-31 04:15:35 +11:00
}
2019-02-12 01:38:12 +11:00
window . open ( target . href , '_blank' )
2017-02-19 22:58:25 +11:00
}
} ,
2016-11-04 02:59:27 +11:00
toggleReplying ( ) {
2019-03-12 07:24:37 +11:00
this . replying = ! this . replying
2017-02-04 23:53:28 +11:00
} ,
2017-06-05 06:58:15 +10:00
gotoOriginal ( id ) {
2017-11-14 17:55:21 +11:00
if ( this . inConversation ) {
2017-11-14 01:33:54 +11:00
this . $emit ( 'goto' , id )
}
2017-04-13 01:25:19 +10:00
} ,
2017-02-04 23:53:28 +11:00
toggleExpanded ( ) {
this . $emit ( 'toggleExpanded' )
2017-02-14 10:01:50 +11:00
} ,
toggleMute ( ) {
this . unmuted = ! this . unmuted
2017-02-17 01:58:49 +11:00
} ,
toggleUserExpanded ( ) {
this . userExpanded = ! this . userExpanded
2017-06-08 00:58:24 +10:00
} ,
2018-08-20 11:59:06 +10:00
toggleShowMore ( ) {
2020-02-25 10:10:15 +11:00
if ( this . mightHideBecauseTall ) {
this . showingTall = ! this . showingTall
} else if ( this . mightHideBecauseSubject ) {
this . expandingSubject = ! this . expandingSubject
2018-08-20 11:59:06 +10:00
}
2018-04-10 02:43:31 +10:00
} ,
2019-01-23 07:57:51 +11:00
generateUserProfileLink ( id , name ) {
2018-12-27 00:50:48 +11:00
return generateProfileLink ( id , name , this . $store . state . instance . restrictedNicknames )
2019-01-15 04:23:13 +11:00
} ,
2019-02-08 08:54:49 +11:00
generateTagLink ( tag ) {
return ` /tag/ ${ tag } `
} ,
2019-01-15 04:23:13 +11:00
setMedia ( ) {
2019-01-27 02:45:03 +11:00
const attachments = this . attachmentSize === 'hide' ? this . status . attachments : this . galleryAttachments
2019-01-15 04:23:13 +11:00
return ( ) => this . $store . dispatch ( 'setMedia' , attachments )
2018-08-05 12:44:02 +10:00
}
2017-04-13 01:25:19 +10:00
} ,
watch : {
2017-04-13 02:07:55 +10:00
'highlight' : function ( id ) {
if ( this . status . id === id ) {
2017-04-13 01:25:19 +10:00
let rect = this . $el . getBoundingClientRect ( )
2017-04-13 02:07:55 +10:00
if ( rect . top < 100 ) {
2019-01-31 01:38:28 +11:00
// Post is above screen, match its top to screen top
window . scrollBy ( 0 , rect . top - 100 )
} else if ( rect . height >= ( window . innerHeight - 50 ) ) {
// Post we want to see is taller than screen so match its top to screen top
window . scrollBy ( 0 , rect . top - 100 )
2017-06-05 06:58:15 +10:00
} else if ( rect . bottom > window . innerHeight - 50 ) {
2019-01-31 01:38:28 +11:00
// Post is below screen, match its bottom to screen bottom
2017-06-05 06:58:15 +10:00
window . scrollBy ( 0 , rect . bottom - window . innerHeight + 50 )
2017-04-13 02:07:55 +10:00
}
2017-04-13 01:25:19 +10:00
}
2019-06-24 19:19:43 +10:00
} ,
'status.repeat_num' : function ( num ) {
2019-06-27 22:19:35 +10:00
// refetch repeats when repeat_num is changed in any way
2019-06-24 19:19:43 +10:00
if ( this . isFocused && this . statusFromGlobalRepository . rebloggedBy && this . statusFromGlobalRepository . rebloggedBy . length !== num ) {
2019-06-27 22:14:54 +10:00
this . $store . dispatch ( 'fetchRepeats' , this . status . id )
2019-06-24 19:19:43 +10:00
}
} ,
'status.fave_num' : function ( num ) {
2019-06-27 22:19:35 +10:00
// refetch favs when fave_num is changed in any way
2019-06-24 19:19:43 +10:00
if ( this . isFocused && this . statusFromGlobalRepository . favoritedBy && this . statusFromGlobalRepository . favoritedBy . length !== num ) {
2019-06-27 22:14:54 +10:00
this . $store . dispatch ( 'fetchFavs' , this . status . id )
2019-06-24 19:19:43 +10:00
}
2017-04-13 01:25:19 +10:00
}
2018-08-27 19:51:30 +10:00
} ,
filters : {
capitalize : function ( str ) {
return str . charAt ( 0 ) . toUpperCase ( ) + str . slice ( 1 )
}
2016-10-29 03:08:03 +11:00
}
2016-10-29 00:19:42 +11:00
}
export default Status