pleroma-fe/src/components/status/status.vue

367 lines
9.6 KiB
Vue
Raw Normal View History

2016-10-29 00:19:42 +11:00
<template>
<div class="status-el base00-background" v-if="compact">
<div @click.prevent="linkClicked" class="status-content" v-html="status.statusnet_html"></div>
<div v-if="loggedIn">
<div class='status-actions'>
<div>
<a href="#" v-on:click.prevent="toggleReplying">
<i class="fa icon-reply" :class="{'icon-reply-active': replying}"></i>
</a>
</div>
<retweet-button :status=status></retweet-button>
<favorite-button :status=status></favorite-button>
</div>
</div>
<post-status-form class="reply-body" :reply-to="status.id" :attentions="status.attentions" :repliedUser="status.user" v-on:posted="toggleReplying" v-if="replying"/>
</div>
<div class="status-el base00-background base03-border status-fadein" v-else-if="!status.deleted" v-bind:class="[{ 'base01-background': isFocused }, { 'status-conversation': inConversation }]" >
2017-02-14 10:01:50 +11:00
<template v-if="muted">
<div class="media status container muted">
<small><router-link :to="{ name: 'user-profile', params: { id: status.user.id } }">{{status.user.screen_name}}</router-link></small>
<small class="muteWords">{{muteWordHits.join(', ')}}</small>
<a href="#" class="unmute" @click.prevent="toggleMute"><i class="fa icon-eye-off"></i></a>
2016-10-29 00:19:42 +11:00
</div>
2017-02-14 10:01:50 +11:00
</template>
<template v-if="!muted">
<div v-if="retweet" class="media container retweet-info">
<div class="media-left">
<i class='fa icon-retweet retweeted'></i>
</div>
<div class="media-body">
Repeated by <a :href="statusoid.user.statusnet_profile_url" style="font-weight: bold;" :title="'@'+statusoid.user.screen_name">{{retweeter}}</a>
2017-02-14 10:01:50 +11:00
</div>
2016-10-29 00:19:42 +11:00
</div>
2017-02-14 10:01:50 +11:00
<div class="media status container">
<div class="media-left">
<a :href="status.user.statusnet_profile_url">
2017-05-22 21:50:10 +10:00
<img @click.prevent="toggleUserExpanded" :class="{retweeted: retweet}" class='avatar' :src="status.user.profile_image_url_original">
<img v-if="retweet" class='avatar-retweeter' :src="statusoid.user.profile_image_url_original"></img>
2017-02-14 10:01:50 +11:00
</a>
</div>
<div class="media-body">
2017-02-17 01:58:49 +11:00
<div class="base05 base05=border usercard" v-if="userExpanded">
2017-08-22 03:25:01 +10:00
<user-card-content :user="status.user" :switcher="false"></user-card-content>
2017-02-17 01:58:49 +11:00
</div>
2017-02-14 10:01:50 +11:00
<div class="user-content">
<div class="media-heading">
<div class="name-and-links">
2017-06-02 00:35:00 +10:00
<h4 class="user-name">{{status.user.name}}</h4>
<div class="links">
<h4>
<small><router-link :to="{ name: 'user-profile', params: { id: status.user.id } }">{{status.user.screen_name}}</router-link></small>
<small v-if="status.in_reply_to_screen_name"> &gt;
<router-link :to="{ name: 'user-profile', params: { id: status.in_reply_to_user_id } }">
{{status.in_reply_to_screen_name}}
</router-link>
</small>
<template v-if="isReply && !expandable">
<small>
<a href="#" @click.prevent="gotoOriginal(status.in_reply_to_status_id)"><i class="icon-reply" @mouseenter="replyEnter(status.in_reply_to_status_id, $event)" @mouseout="replyLeave()"></i></a>
</small>
</template>
-
<small>
<router-link :to="{ name: 'conversation', params: { id: status.id } }">
<timeago :since="status.created_at" :auto-update="60"></timeago>
</router-link>
</small>
</h4>
</div>
<h4 class="replies" v-if="inConversation">
<small v-if="replies.length">Replies:</small>
<small v-for="reply in replies">
<a href="#" @click.prevent="gotoOriginal(reply.id)" @mouseenter="replyEnter(reply.id, $event)" @mouseout="replyLeave()">{{reply.name}}&nbsp;</a>
</small>
</h4>
</div>
<div class="heading-icons">
<a href="#" @click.prevent="toggleMute" v-if="unmuted"><i class="fa icon-eye-off"></i></a>
<a :href="status.external_url" target="_blank" v-if="!status.is_local" class="source_url"><i class="fa icon-binoculars"></i></a>
<template v-if="expandable">
<a href="#" @click.prevent="toggleExpanded" class="expand"><i class="fa icon-plus-squared"></i></a>
</template>
</div>
</div>
<div @click.prevent="linkClicked" class="status-content" v-html="status.statusnet_html"></div>
2017-02-14 10:01:50 +11:00
<div v-if='status.attachments' class='attachments'>
2017-02-23 10:04:47 +11:00
<attachment v-if="!hideAttachments" :status-id="status.id" :nsfw="status.nsfw" :attachment="attachment" v-for="attachment in status.attachments">
2017-02-14 10:01:50 +11:00
</attachment>
</div>
</div>
2016-10-29 00:19:42 +11:00
2017-02-14 10:01:50 +11:00
<div v-if="loggedIn">
<div class='status-actions'>
<div>
<a href="#" v-on:click.prevent="toggleReplying">
<i class="fa icon-reply" :class="{'icon-reply-active': replying}"></i>
2017-02-14 10:01:50 +11:00
</a>
</div>
<retweet-button :status=status></retweet-button>
<favorite-button :status=status></favorite-button>
<delete-button :status=status></delete-button>
2016-10-29 00:19:42 +11:00
</div>
2017-02-14 10:01:50 +11:00
</div>
2016-10-29 00:19:42 +11:00
</div>
</div>
<div class="status base00-background container" v-if="replying">
<div class="reply-left"/>
<post-status-form class="reply-body" :reply-to="status.id" :attentions="status.attentions" :repliedUser="status.user" v-on:posted="toggleReplying"/>
</div>
2017-02-14 10:01:50 +11:00
</template>
2016-10-29 00:19:42 +11:00
</div>
</template>
<script src="./status.js" ></script>
2016-10-29 10:38:41 +11:00
<style lang="scss">
2016-11-26 03:19:46 +11:00
@import '../../_variables.scss';
status-text-container {
display: block;
}
2016-11-26 03:19:46 +11:00
.status-el {
2016-11-13 06:57:54 +11:00
hyphens: auto;
overflow-wrap: break-word;
2016-10-29 10:38:41 +11:00
word-wrap: break-word;
2016-11-04 02:59:27 +11:00
word-break: break-word;
border-left-width: 0px;
line-height: 18px;
.notify {
.avatar {
border-width: 3px;
border-style: solid;
}
}
.media-body {
flex: 1;
padding-left: 0.5em;
}
2016-10-29 10:38:41 +11:00
.user-content {
min-height: 52px;
2017-02-18 18:48:35 +11:00
padding-top: 1px;
}
.media-heading {
display: flex;
min-height: 1.4em;
margin-bottom: 0.3em;
small {
font-weight: lighter;
}
h4 {
margin-right: 0.4em;
}
.name-and-links {
flex: 1 0;
display: flex;
flex-wrap: wrap;
}
.replies {
flex-basis: 100%;
}
}
2016-11-26 03:34:41 +11:00
.source_url {
}
.expand {
margin-right: -0.3em;
2016-11-26 03:34:41 +11:00
}
2016-10-29 10:38:41 +11:00
a {
2016-11-13 06:57:54 +11:00
display: inline-block;
word-break: break-all;
2016-10-29 10:38:41 +11:00
}
.status-content {
2017-02-18 18:48:35 +11:00
margin: 3px 15px 4px 0;
img, video {
max-width: 100%;
max-height: 400px;
}
blockquote {
margin: 0.2em 0 0.2em 2em;
font-style: italic;
}
}
p {
2016-11-26 03:19:46 +11:00
margin: 0;
margin-top: 0.2em;
margin-bottom: 0.5em;
}
.media-left {
margin: 0.2em 0.3em 0 0;
img {
float: right;
border-radius: 5px;
}
}
.retweet-info {
padding: 0.7em 0 0 0.6em;
.media-left {
display: flex;
i {
align-self: center;
text-align: right;
flex: 1;
padding-right: 0.3em;
}
}
}
2016-11-26 03:19:46 +11:00
}
2016-11-03 04:38:30 +11:00
.status-fadein {
animation-duration: 0.5s;
animation-name: fadein;
}
@keyframes fadein {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
.greentext {
color: green;
}
2017-03-06 00:34:14 +11:00
.status-conversation {
border-left-style: solid;
}
2016-11-26 03:19:46 +11:00
.status-actions {
padding-top: 0.15em;
width: 100%;
display: flex;
div, favorite-button {
2017-06-02 00:35:00 +10:00
max-width: 6em;
flex: 1;
}
2016-11-26 03:19:46 +11:00
}
2016-11-26 03:19:46 +11:00
.icon-reply:hover {
color: $blue;
2016-11-26 03:19:46 +11:00
}
.icon-reply-active {
color: $blue;
}
2016-11-26 03:19:46 +11:00
.status .avatar {
2017-05-22 21:50:10 +10:00
width: 48px;
height: 48px;
&.retweeted {
width: 40px;
height: 40px;
margin-right: 8px;
margin-bottom: 8px;
}
}
.status img.avatar-retweeter {
width: 24px;
height: 24px;
position: absolute;
margin-left: 24px;
margin-top: 24px;
2016-11-26 03:19:46 +11:00
}
2016-11-26 03:19:46 +11:00
.status.compact .avatar {
width: 32px;
}
2016-11-26 03:19:46 +11:00
.status {
padding: 0.4em 0.7em 0.45em 0.7em;
border-bottom: 1px solid;
border-bottom-color: inherit;
border-left: 4px rgba(255, 48, 16, 0.65);
border-left-style: inherit;
2016-11-26 03:19:46 +11:00
}
.muted {
padding: 0.1em 0.4em 0.1em 0.8em;
button {
margin-left: auto;
}
.muteWords {
margin-left: 10px;
}
2017-02-14 10:01:50 +11:00
}
a.unmute {
display: block;
margin-left: auto;
}
2017-02-17 01:58:49 +11:00
.usercard {
border-style: solid;
border-width: 1px;
border-radius: 10px;
2017-02-17 01:58:49 +11:00
margin-bottom: 1em;
margin-top: 0.2em;
2017-02-17 01:58:49 +11:00
}
.reply-left {
flex: 0;
min-width: 48px;
}
.reply-body {
flex: 1;
}
2017-06-02 00:35:00 +10:00
@media all and (max-width: 960px) {
.status-el {
.name-and-links {
margin-left: -0.25em;
}
}
.status {
max-width: 100%;
}
.status .avatar {
width: 40px;
height: 40px;
&.retweeted {
width: 34px;
height: 34px;
margin-right: 8px;
margin-bottom: 8px;
}
}
.status img.avatar-retweeter {
width: 22px;
height: 22px;
position: absolute;
margin-left: 18px;
margin-top: 18px;
}
}
2016-10-29 10:38:41 +11:00
</style>