pinafore/routes/_actions/compose.js

108 lines
3.9 KiB
JavaScript
Raw Normal View History

2018-03-09 16:45:12 +00:00
import { store } from '../_store/store'
import { toast } from '../_utils/toast'
2018-03-10 06:31:26 +00:00
import { postStatus as postStatusToServer } from '../_api/statuses'
2018-03-09 16:45:12 +00:00
import { addStatusOrNotification } from './addStatusOrNotification'
import { getStatus as getStatusFromDatabase } from '../_database/timelines/getStatusOrNotification'
2018-04-08 22:08:32 +00:00
import { emit } from '../_utils/eventBus'
import { putMediaDescription } from '../_api/media'
2018-03-09 16:45:12 +00:00
export async function insertHandleForReply (statusId) {
let { currentInstance } = store.get()
let status = await getStatusFromDatabase(currentInstance, statusId)
let { currentVerifyCredentials } = store.get()
2018-03-09 16:45:12 +00:00
let originalStatus = status.reblog || status
let accounts = [originalStatus.account].concat(originalStatus.mentions || [])
.filter(account => account.id !== currentVerifyCredentials.id)
2018-03-09 16:45:12 +00:00
if (!store.getComposeData(statusId, 'text') && accounts.length) {
store.setComposeData(statusId, {
text: accounts.map(account => `@${account.acct} `).join('')
})
}
}
export async function postStatus (realm, text, inReplyToId, mediaIds,
2018-04-19 03:43:13 +00:00
sensitive, spoilerText, visibility,
mediaDescriptions = [], inReplyToUuid) {
let { currentInstance, accessToken, online } = store.get()
2018-03-09 16:45:12 +00:00
if (!online) {
toast.say('You cannot post while offline')
return
}
store.set({
2018-04-08 22:08:32 +00:00
postingStatus: true
2018-03-09 16:45:12 +00:00
})
try {
await Promise.all(mediaDescriptions.map(async (description, i) => {
return description && putMediaDescription(currentInstance, accessToken, mediaIds[i], description)
}))
let status = await postStatusToServer(currentInstance, accessToken, text,
2018-03-09 16:45:12 +00:00
inReplyToId, mediaIds, sensitive, spoilerText, visibility)
addStatusOrNotification(currentInstance, 'home', status)
2018-03-09 16:45:12 +00:00
store.clearComposeData(realm)
emit('postedStatus', realm, inReplyToUuid)
2018-03-09 16:45:12 +00:00
} catch (e) {
2018-04-05 01:33:31 +00:00
console.error(e)
2018-03-09 16:45:12 +00:00
toast.say('Unable to post status: ' + (e.message || ''))
} finally {
store.set({postingStatus: false})
}
}
2018-03-25 01:04:54 +00:00
export async function insertUsername (realm, username, startIndex, endIndex) {
let oldText = store.getComposeData(realm, 'text')
let pre = oldText.substring(0, startIndex)
let post = oldText.substring(endIndex)
let newText = `${pre}@${username} ${post}`
store.setComposeData(realm, {text: newText})
}
export async function clickSelectedAutosuggestionUsername (realm) {
let {
composeSelectionStart,
composeAutosuggestionSearchText,
composeAutosuggestionSelected,
composeAutosuggestionSearchResults
} = store.get()
composeAutosuggestionSelected = composeAutosuggestionSelected || 0
let account = composeAutosuggestionSearchResults[composeAutosuggestionSelected]
let startIndex = composeSelectionStart - composeAutosuggestionSearchText.length
let endIndex = composeSelectionStart
2018-03-25 01:04:54 +00:00
await insertUsername(realm, account.acct, startIndex, endIndex)
}
export function setReplySpoiler (realm, spoiler) {
let contentWarning = store.getComposeData(realm, 'contentWarning')
let contentWarningShown = store.getComposeData(realm, 'contentWarningShown')
2018-04-08 20:42:31 +00:00
if (typeof contentWarningShown !== 'undefined' || contentWarning) {
return // user has already interacted with the CW
}
2018-04-08 20:42:31 +00:00
store.setComposeData(realm, {
contentWarning: spoiler,
contentWarningShown: true
})
}
2018-04-04 00:50:48 +00:00
const PRIVACY_LEVEL = {
'direct': 1,
'private': 2,
'unlisted': 3,
'public': 4
}
export function setReplyVisibility (realm, replyVisibility) {
// return the most private between the user's preferred default privacy
// and the privacy of the status they're replying to
2018-04-08 20:42:31 +00:00
let postPrivacy = store.getComposeData(realm, 'postPrivacy')
if (typeof postPrivacy !== 'undefined') {
return // user has already set the postPrivacy
}
let { currentVerifyCredentials } = store.get()
let defaultVisibility = currentVerifyCredentials.source.privacy
2018-04-04 00:50:48 +00:00
let visibility = PRIVACY_LEVEL[replyVisibility] < PRIVACY_LEVEL[defaultVisibility]
? replyVisibility
: defaultVisibility
store.setComposeData(realm, {postPrivacy: visibility})
}