2018-02-27 05:54:21 +00:00
|
|
|
<div class="compose-box {{overLimit ? 'over-char-limit' : ''}}">
|
2018-03-03 18:11:32 +00:00
|
|
|
<ComposeAuthor />
|
2018-03-03 23:44:43 +00:00
|
|
|
{{#if contentWarningShown}}
|
2018-03-04 00:25:22 +00:00
|
|
|
<div class="compose-content-warning-wrapper"
|
|
|
|
transition:slide="{duration: 333}">
|
|
|
|
<ComposeContentWarning :realm :contentWarning />
|
|
|
|
</div>
|
2018-03-03 23:44:43 +00:00
|
|
|
{{/if}}
|
2018-03-17 02:04:48 +00:00
|
|
|
<ComposeInput :realm :text :autoFocus />
|
2018-03-04 00:12:48 +00:00
|
|
|
<ComposeLengthGauge :length :overLimit />
|
2018-03-25 01:04:54 +00:00
|
|
|
<ComposeToolbar :realm :postPrivacy :media :contentWarningShown :text />
|
2018-03-04 00:12:48 +00:00
|
|
|
<ComposeLengthIndicator :length :overLimit />
|
2018-03-03 22:51:48 +00:00
|
|
|
<ComposeMedia :realm :media />
|
2018-03-05 00:27:15 +00:00
|
|
|
<ComposeButton :length :overLimit on:click="onClickPostButton()" />
|
2018-02-26 00:26:43 +00:00
|
|
|
</div>
|
|
|
|
<style>
|
2018-02-27 05:54:21 +00:00
|
|
|
.compose-box {
|
2018-02-26 00:26:43 +00:00
|
|
|
border-radius: 4px;
|
|
|
|
padding: 20px;
|
|
|
|
display: grid;
|
|
|
|
align-items: flex-start;
|
|
|
|
grid-template-areas:
|
2018-03-03 23:44:43 +00:00
|
|
|
"avatar name handle handle"
|
|
|
|
"avatar cw cw cw"
|
|
|
|
"avatar input input input"
|
|
|
|
"avatar gauge gauge gauge"
|
|
|
|
"avatar toolbar toolbar length"
|
|
|
|
"avatar media media media"
|
|
|
|
"avatar button button button";
|
2018-02-27 04:55:49 +00:00
|
|
|
grid-template-columns: min-content minmax(0, max-content) 1fr 1fr;
|
2018-02-26 00:26:43 +00:00
|
|
|
border-bottom: 1px solid var(--main-border);
|
|
|
|
width: 560px;
|
|
|
|
max-width: calc(100vw - 40px);
|
|
|
|
}
|
|
|
|
|
2018-03-04 00:25:22 +00:00
|
|
|
.compose-content-warning-wrapper {
|
|
|
|
grid-area: cw;
|
|
|
|
}
|
|
|
|
|
2018-02-26 00:26:43 +00:00
|
|
|
@media (max-width: 767px) {
|
2018-02-27 05:54:21 +00:00
|
|
|
.compose-box {
|
2018-02-26 00:26:43 +00:00
|
|
|
padding: 10px 10px;
|
|
|
|
max-width: calc(100vw - 20px);
|
|
|
|
width: 580px;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
</style>
|
|
|
|
<script>
|
2018-02-27 05:50:03 +00:00
|
|
|
import ComposeToolbar from './ComposeToolbar.html'
|
|
|
|
import ComposeLengthGauge from './ComposeLengthGauge.html'
|
|
|
|
import ComposeLengthIndicator from './ComposeLengthIndicator.html'
|
2018-02-27 05:54:21 +00:00
|
|
|
import ComposeAuthor from './ComposeAuthor.html'
|
2018-02-27 06:22:56 +00:00
|
|
|
import ComposeInput from './ComposeInput.html'
|
|
|
|
import ComposeButton from './ComposeButton.html'
|
2018-03-02 05:21:49 +00:00
|
|
|
import ComposeMedia from './ComposeMedia.html'
|
2018-03-03 23:44:43 +00:00
|
|
|
import ComposeContentWarning from './ComposeContentWarning.html'
|
2018-03-03 22:51:48 +00:00
|
|
|
import { measureText } from '../../_utils/measureText'
|
|
|
|
import { CHAR_LIMIT, POST_PRIVACY_OPTIONS } from '../../_static/statuses'
|
|
|
|
import { store } from '../../_store/store'
|
2018-03-04 00:25:22 +00:00
|
|
|
import { slide } from 'svelte-transitions'
|
2018-03-09 16:45:12 +00:00
|
|
|
import { postStatus, insertHandleForReply } from '../../_actions/compose'
|
2018-02-26 01:21:17 +00:00
|
|
|
|
2018-02-26 00:26:43 +00:00
|
|
|
export default {
|
2018-03-08 02:04:20 +00:00
|
|
|
oncreate() {
|
2018-03-09 16:45:12 +00:00
|
|
|
let realm = this.get('realm')
|
|
|
|
if (realm !== 'home') {
|
|
|
|
// if this is a reply, populate the handle immediately
|
|
|
|
insertHandleForReply(realm)
|
|
|
|
|
2018-03-10 06:31:26 +00:00
|
|
|
// if this is a reply, go back immediately after it's posted
|
|
|
|
this.observe('postedStatusForRealm', postedStatusForRealm => {
|
|
|
|
if (postedStatusForRealm === realm) {
|
|
|
|
window.history.back()
|
|
|
|
}
|
|
|
|
}, {init: false})
|
|
|
|
}
|
2018-03-08 02:04:20 +00:00
|
|
|
},
|
2018-02-26 00:26:43 +00:00
|
|
|
components: {
|
2018-02-27 05:54:21 +00:00
|
|
|
ComposeAuthor,
|
2018-02-27 05:50:03 +00:00
|
|
|
ComposeToolbar,
|
|
|
|
ComposeLengthGauge,
|
2018-02-27 06:22:56 +00:00
|
|
|
ComposeLengthIndicator,
|
|
|
|
ComposeInput,
|
2018-03-02 05:21:49 +00:00
|
|
|
ComposeButton,
|
2018-03-03 23:44:43 +00:00
|
|
|
ComposeMedia,
|
|
|
|
ComposeContentWarning
|
2018-03-03 22:51:48 +00:00
|
|
|
},
|
|
|
|
store: () => store,
|
|
|
|
computed: {
|
|
|
|
composeData: ($currentComposeData, realm) => $currentComposeData[realm] || {},
|
|
|
|
text: (composeData) => composeData.text || '',
|
|
|
|
media: (composeData) => composeData.media || [],
|
|
|
|
postPrivacy: (postPrivacyKey) => POST_PRIVACY_OPTIONS.find(_ => _.key === postPrivacyKey),
|
|
|
|
defaultPostPrivacyKey: ($currentVerifyCredentials) => $currentVerifyCredentials.source.privacy,
|
|
|
|
postPrivacyKey: (composeData, defaultPostPrivacyKey) => composeData.postPrivacy || defaultPostPrivacyKey,
|
|
|
|
textLength: (text) => measureText(text),
|
2018-03-04 00:12:48 +00:00
|
|
|
contentWarningLength: (contentWarning) => measureText(contentWarning),
|
|
|
|
length: (textLength, contentWarningLength, contentWarningShown) => {
|
|
|
|
return textLength + (contentWarningShown ? contentWarningLength : 0)
|
|
|
|
},
|
|
|
|
overLimit: (length) => length > CHAR_LIMIT,
|
2018-03-03 23:44:43 +00:00
|
|
|
contentWarningShown: (composeData) => composeData.contentWarningShown,
|
2018-03-08 02:04:20 +00:00
|
|
|
contentWarning: (composeData) => composeData.contentWarning || '',
|
|
|
|
postedStatusForRealm: ($postedStatusForRealm) => $postedStatusForRealm
|
2018-03-04 00:25:22 +00:00
|
|
|
},
|
|
|
|
transitions: {
|
|
|
|
slide
|
2018-03-05 00:27:15 +00:00
|
|
|
},
|
|
|
|
methods: {
|
|
|
|
onClickPostButton() {
|
|
|
|
let text = this.get('text')
|
|
|
|
let media = this.get('media')
|
|
|
|
let postPrivacyKey = this.get('postPrivacyKey')
|
|
|
|
let contentWarning = this.get('contentWarning')
|
|
|
|
let sensitive = media.length && !!contentWarning
|
|
|
|
let realm = this.get('realm')
|
|
|
|
let mediaIds = media.map(_ => _.data.id)
|
2018-03-08 02:04:20 +00:00
|
|
|
let inReplyTo = realm === 'home' ? null : realm
|
2018-03-23 00:55:35 +00:00
|
|
|
let overLimit = this.get('overLimit')
|
|
|
|
|
|
|
|
if (!text || overLimit) {
|
|
|
|
return // do nothing if invalid
|
|
|
|
}
|
2018-03-08 02:04:20 +00:00
|
|
|
|
|
|
|
/* no await */ postStatus(realm, text, inReplyTo, mediaIds,
|
2018-03-05 00:27:15 +00:00
|
|
|
sensitive, contentWarning, postPrivacyKey)
|
|
|
|
}
|
2018-02-26 00:26:43 +00:00
|
|
|
}
|
|
|
|
}
|
2018-02-26 08:24:28 +00:00
|
|
|
</script>
|