2021-06-07 08:41:55 -07:00
import fileType from 'src/services/file_type/file_type.service'
2021-06-11 03:38:08 -07:00
import RichContent from 'src/components/rich_content/rich_content.jsx'
2021-06-07 08:41:55 -07:00
import { mapGetters } from 'vuex'
import { library } from '@fortawesome/fontawesome-svg-core'
import {
faFile ,
faMusic ,
faImage ,
faLink ,
faPollH
} from '@fortawesome/free-solid-svg-icons'
library . add (
faFile ,
faMusic ,
faImage ,
faLink ,
faPollH
)
const StatusContent = {
name : 'StatusContent' ,
props : [
2021-06-13 16:52:41 -07:00
'compact' ,
2021-06-07 08:41:55 -07:00
'status' ,
'focused' ,
'noHeading' ,
'fullContent' ,
2021-06-10 02:08:31 -07:00
'singleLine' ,
2021-06-10 17:11:58 -07:00
'hideMentions'
2021-06-07 08:41:55 -07:00
] ,
data ( ) {
return {
showingTall : this . fullContent || ( this . inConversation && this . focused ) ,
showingLongSubject : false ,
// not as computed because it sets the initial state which will be changed later
2021-06-14 00:31:07 -07:00
expandingSubject : ! this . $store . getters . mergedConfig . collapseMessageWithSubject
2021-06-07 08:41:55 -07:00
}
} ,
computed : {
localCollapseSubjectDefault ( ) {
return this . mergedConfig . collapseMessageWithSubject
} ,
// 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.
tallStatus ( ) {
2021-06-12 09:54:03 -07:00
const lengthScore = this . status . raw _html . split ( /<p|<br/ ) . length + this . status . text . length / 80
2021-06-07 08:41:55 -07:00
return lengthScore > 20
} ,
longSubject ( ) {
return this . status . summary . length > 240
} ,
// 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 . localCollapseSubjectDefault
} ,
mightHideBecauseTall ( ) {
return this . tallStatus && ! ( this . status . summary && this . localCollapseSubjectDefault )
} ,
hideSubjectStatus ( ) {
return this . mightHideBecauseSubject && ! this . expandingSubject
} ,
hideTallStatus ( ) {
return this . mightHideBecauseTall && ! this . showingTall
} ,
showingMore ( ) {
return ( this . mightHideBecauseTall && this . showingTall ) || ( this . mightHideBecauseSubject && this . expandingSubject )
} ,
attachmentTypes ( ) {
return this . status . attachments . map ( file => fileType . fileType ( file . mimetype ) )
} ,
2021-06-07 09:50:26 -07:00
... mapGetters ( [ 'mergedConfig' ] )
2021-06-07 08:41:55 -07:00
} ,
components : {
2021-06-14 00:30:08 -07:00
RichContent
2021-06-07 08:41:55 -07:00
} ,
mounted ( ) {
2021-06-07 09:50:26 -07:00
this . status . attentions && this . status . attentions . forEach ( attn => {
2021-06-07 08:41:55 -07:00
const { id } = attn
this . $store . dispatch ( 'fetchUserIfMissing' , id )
} )
} ,
methods : {
2021-06-22 10:16:26 -07:00
onParseReady ( event ) {
this . $emit ( 'parseReady' , event )
const { writtenMentions } = event
writtenMentions
. filter ( mention => ! mention . notifying )
. forEach ( mention => {
const { content , url } = mention
const cleanedString = content . replace ( /<[^>]+?>/gi , '' ) // remove all tags
if ( ! cleanedString . startsWith ( '@' ) ) return
const handle = cleanedString . slice ( 1 )
const host = url . replace ( /^https?:\/\// , '' ) . replace ( /\/.+?$/ , '' )
this . $store . dispatch ( 'fetchUserIfMissing' , ` ${ handle } @ ${ host } ` )
} )
} ,
2021-06-07 08:41:55 -07:00
toggleShowMore ( ) {
if ( this . mightHideBecauseTall ) {
this . showingTall = ! this . showingTall
} else if ( this . mightHideBecauseSubject ) {
this . expandingSubject = ! this . expandingSubject
}
} ,
generateTagLink ( tag ) {
return ` /tag/ ${ tag } `
}
}
}
export default StatusContent