aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/modules/statuses.js50
-rw-r--r--src/services/api/api.service.js97
2 files changed, 103 insertions, 44 deletions
diff --git a/src/modules/statuses.js b/src/modules/statuses.js
index 33804d39..b4d61b13 100644
--- a/src/modules/statuses.js
+++ b/src/modules/statuses.js
@@ -1,4 +1,4 @@
-import { includes, remove, slice, sortBy, toInteger, each, find, flatten, maxBy, minBy, merge, last, isArray } from 'lodash'
+import { remove, slice, sortBy, toInteger, each, find, flatten, maxBy, minBy, merge, last, isArray } from 'lodash'
import apiService from '../services/api/api.service.js'
// import parse from '../services/status_parser/status_parser.js'
@@ -43,20 +43,7 @@ export const defaultState = {
}
}
-const isNsfw = (status) => {
- const nsfwRegex = /#nsfw/i
- return includes(status.tags, 'nsfw') || !!status.text.match(nsfwRegex)
-}
-
export const prepareStatus = (status) => {
- // Parse nsfw tags
- if (status.nsfw === undefined) {
- status.nsfw = isNsfw(status)
- if (status.retweeted_status) {
- status.nsfw = status.retweeted_status.nsfw
- }
- }
-
// Set deleted flag
status.deleted = false
@@ -75,31 +62,6 @@ const visibleNotificationTypes = (rootState) => {
].filter(_ => _)
}
-export const statusType = (status) => {
- if (status.is_post_verb) {
- return 'status'
- }
-
- if (status.retweeted_status) {
- return 'retweet'
- }
-
- if ((typeof status.uri === 'string' && status.uri.match(/(fave|objectType=Favourite)/)) ||
- (typeof status.text === 'string' && status.text.match(/favorited/))) {
- return 'favorite'
- }
-
- if (status.text.match(/deleted notice {{tag/) || status.qvitter_delete_notice) {
- return 'deletion'
- }
-
- if (status.text.match(/started following/) || status.activity_type === 'follow') {
- return 'follow'
- }
-
- return 'unknown'
-}
-
export const findMaxId = (...args) => {
return (maxBy(flatten(args), 'id') || {}).id
}
@@ -153,13 +115,13 @@ const addNewStatuses = (state, { statuses, showImmediately = false, timeline, us
return
}
- const addStatus = (status, showImmediately, addToTimeline = true) => {
- const result = mergeOrAdd(allStatuses, allStatusesObject, status)
- status = result.item
+ const addStatus = (data, showImmediately, addToTimeline = true) => {
+ const result = mergeOrAdd(allStatuses, allStatusesObject, data)
+ const status = result.item
if (result.new) {
// We are mentioned in a post
- if (statusType(status) === 'status' && find(status.attentions, { id: user.id })) {
+ if (status.type === 'status' && find(status.attentions, { id: user.id })) {
const mentions = state.timelines.mentions
// Add the mention to the mentions timeline
@@ -270,7 +232,7 @@ const addNewStatuses = (state, { statuses, showImmediately = false, timeline, us
}
each(statuses, (status) => {
- const type = statusType(status)
+ const type = status.type
const processor = processors[type] || processors['default']
processor(status)
})
diff --git a/src/services/api/api.service.js b/src/services/api/api.service.js
index 24b38dfd..ff36a59b 100644
--- a/src/services/api/api.service.js
+++ b/src/services/api/api.service.js
@@ -72,6 +72,7 @@ const updateAvatar = ({credentials, params}) => {
form.append(key, value)
}
})
+
return fetch(url, {
headers: authHeaders(credentials),
method: 'POST',
@@ -89,6 +90,7 @@ const updateBg = ({credentials, params}) => {
form.append(key, value)
}
})
+
return fetch(url, {
headers: authHeaders(credentials),
method: 'POST',
@@ -112,6 +114,7 @@ const updateBanner = ({credentials, params}) => {
form.append(key, value)
}
})
+
return fetch(url, {
headers: authHeaders(credentials),
method: 'POST',
@@ -293,6 +296,99 @@ const setUserMute = ({id, credentials, muted = true}) => {
})
}
+export const statusType = (status) => {
+ if (status.is_post_verb) {
+ return 'status'
+ }
+
+ if (status.retweeted_status) {
+ return 'retweet'
+ }
+
+ if ((typeof status.uri === 'string' && status.uri.match(/(fave|objectType=Favourite)/)) ||
+ (typeof status.text === 'string' && status.text.match(/favorited/))) {
+ return 'favorite'
+ }
+
+ if (status.text.match(/deleted notice {{tag/) || status.qvitter_delete_notice) {
+ return 'deletion'
+ }
+
+ if (status.text.match(/started following/) || status.activity_type === 'follow') {
+ return 'follow'
+ }
+
+ return 'unknown'
+}
+
+const isMastoAPI = (status) => {
+ return status.hasOwnProperty('account')
+}
+
+const parseUser = (data) => {
+ return {
+ id: data.id,
+ screen_name: data.screen_name || data.acct
+ }
+}
+
+const parseAttachment = (data) => {
+ return {
+ ...data,
+ mimetype: data.mimetype || data.type
+ }
+}
+
+const parseData = (data) => {
+ const output = {}
+ const masto = isMastoAPI(data)
+ output.raw = data
+ output.id = data.id
+
+ output.user = parseUser(masto ? data.account : data.user)
+
+ output.attentions = ((masto ? data.mentions : data.attentions) || []).map(_ => ({
+ id: _.id,
+ following: _.following // FIXME: MastoAPI doesn't have this
+ }))
+
+ // FIXME: Masto doesn't have "raw text" data, using html data...
+ output.text = masto ? data.content : data.text
+
+ output.attachments = ((masto ? data.media_attachments : data.attachments) || []).map(parseAttachment)
+
+ const retweetedStatus = masto ? data.reblog : data.retweeted_status
+ if (retweetedStatus) {
+ output.retweeted_status = parseData(retweetedStatus)
+ }
+
+ if (masto) {
+ output.type = data.reblog ? 'retweet' : 'status'
+ output.nsfw = data.sensitive
+ output.statusnet_html = data.content
+ } else {
+ // catchall, temporary
+ Object.assign(output, data)
+
+ // QVitterAPI
+ output.type = statusType(data)
+
+ if (data.nsfw === undefined) {
+ output.nsfw = isNsfw(data)
+ if (data.retweeted_status) {
+ output.nsfw = data.retweeted_status.nsfw
+ }
+ }
+ }
+
+ return output
+}
+
+const isNsfw = (status) => {
+ const nsfwRegex = /#nsfw/i
+ return (status.tags || []).includes('nsfw') || !!status.text.match(nsfwRegex)
+}
+
const fetchTimeline = ({timeline, credentials, since = false, until = false, userId = false, tag = false}) => {
const timelineUrls = {
public: PUBLIC_TIMELINE_URL,
@@ -336,6 +432,7 @@ const fetchTimeline = ({timeline, credentials, since = false, until = false, use
throw new Error('Error fetching timeline')
})
.then((data) => data.json())
+ .then((data) => data.map(parseData))
}
const verifyCredentials = (user) => {