forked from cybrespace/pinafore
108 lines
3.9 KiB
JavaScript
108 lines
3.9 KiB
JavaScript
import { store } from '../_store/store'
|
|
import { toast } from '../_utils/toast'
|
|
import { postStatus as postStatusToServer } from '../_api/statuses'
|
|
import { addStatusOrNotification } from './addStatusOrNotification'
|
|
import { getStatus as getStatusFromDatabase } from '../_database/timelines/getStatusOrNotification'
|
|
import { emit } from '../_utils/eventBus'
|
|
import { putMediaDescription } from '../_api/media'
|
|
|
|
export async function insertHandleForReply (statusId) {
|
|
let { currentInstance } = store.get()
|
|
let status = await getStatusFromDatabase(currentInstance, statusId)
|
|
let { currentVerifyCredentials } = store.get()
|
|
let originalStatus = status.reblog || status
|
|
let accounts = [originalStatus.account].concat(originalStatus.mentions || [])
|
|
.filter(account => account.id !== currentVerifyCredentials.id)
|
|
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,
|
|
sensitive, spoilerText, visibility,
|
|
mediaDescriptions = [], inReplyToUuid) {
|
|
let { currentInstance, accessToken, online } = store.get()
|
|
|
|
if (!online) {
|
|
toast.say('You cannot post while offline')
|
|
return
|
|
}
|
|
|
|
store.set({
|
|
postingStatus: true
|
|
})
|
|
try {
|
|
await Promise.all(mediaDescriptions.map(async (description, i) => {
|
|
return description && putMediaDescription(currentInstance, accessToken, mediaIds[i], description)
|
|
}))
|
|
let status = await postStatusToServer(currentInstance, accessToken, text,
|
|
inReplyToId, mediaIds, sensitive, spoilerText, visibility)
|
|
addStatusOrNotification(currentInstance, 'home', status)
|
|
store.clearComposeData(realm)
|
|
emit('postedStatus', realm, inReplyToUuid)
|
|
} catch (e) {
|
|
console.error(e)
|
|
toast.say('Unable to post status: ' + (e.message || ''))
|
|
} finally {
|
|
store.set({postingStatus: false})
|
|
}
|
|
}
|
|
|
|
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
|
|
await insertUsername(realm, account.acct, startIndex, endIndex)
|
|
}
|
|
|
|
export function setReplySpoiler (realm, spoiler) {
|
|
let contentWarning = store.getComposeData(realm, 'contentWarning')
|
|
let contentWarningShown = store.getComposeData(realm, 'contentWarningShown')
|
|
if (typeof contentWarningShown !== 'undefined' || contentWarning) {
|
|
return // user has already interacted with the CW
|
|
}
|
|
store.setComposeData(realm, {
|
|
contentWarning: spoiler,
|
|
contentWarningShown: true
|
|
})
|
|
}
|
|
|
|
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
|
|
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
|
|
let visibility = PRIVACY_LEVEL[replyVisibility] < PRIVACY_LEVEL[defaultVisibility]
|
|
? replyVisibility
|
|
: defaultVisibility
|
|
store.setComposeData(realm, {postPrivacy: visibility})
|
|
}
|