diff options
Diffstat (limited to 'src/services')
| -rw-r--r-- | src/services/api/api.service.js | 184 | ||||
| -rw-r--r-- | src/services/backend_interactor_service/backend_interactor_service.js | 142 | ||||
| -rw-r--r-- | src/services/date_utils/date_utils.js | 45 | ||||
| -rw-r--r-- | src/services/entity_normalizer/entity_normalizer.service.js | 1 | ||||
| -rw-r--r-- | src/services/status_poster/status_poster.service.js | 13 | ||||
| -rw-r--r-- | src/services/style_setter/style_setter.js | 1 |
6 files changed, 255 insertions, 131 deletions
diff --git a/src/services/api/api.service.js b/src/services/api/api.service.js index ab1fc0b2..d5fc418d 100644 --- a/src/services/api/api.service.js +++ b/src/services/api/api.service.js @@ -1,3 +1,8 @@ +import { each, map, concat, last } from 'lodash' +import { parseStatus, parseUser, parseNotification, parseAttachment } from '../entity_normalizer/entity_normalizer.service.js' +import 'whatwg-fetch' +import { StatusCodeError } from '../errors/errors' + /* eslint-env browser */ const EXTERNAL_PROFILE_URL = '/api/externalprofile/show.json' const QVITTER_USER_NOTIFICATIONS_READ_URL = '/api/qvitter/statuses/notifications/read.json' @@ -52,6 +57,8 @@ const MASTODON_MUTE_USER_URL = id => `/api/v1/accounts/${id}/mute` const MASTODON_UNMUTE_USER_URL = id => `/api/v1/accounts/${id}/unmute` const MASTODON_POST_STATUS_URL = '/api/v1/statuses' const MASTODON_MEDIA_UPLOAD_URL = '/api/v1/media' +const MASTODON_VOTE_URL = id => `/api/v1/polls/${id}/votes` +const MASTODON_POLL_URL = id => `/api/v1/polls/${id}` const MASTODON_STATUS_FAVORITEDBY_URL = id => `/api/v1/statuses/${id}/favourited_by` const MASTODON_STATUS_REBLOGGEDBY_URL = id => `/api/v1/statuses/${id}/reblogged_by` const MASTODON_PROFILE_UPDATE_URL = '/api/v1/accounts/update_credentials' @@ -59,11 +66,6 @@ const MASTODON_REPORT_USER_URL = '/api/v1/reports' const MASTODON_PIN_OWN_STATUS = id => `/api/v1/statuses/${id}/pin` const MASTODON_UNPIN_OWN_STATUS = id => `/api/v1/statuses/${id}/unpin` -import { each, map, concat, last } from 'lodash' -import { parseStatus, parseUser, parseNotification, parseAttachment } from '../entity_normalizer/entity_normalizer.service.js' -import 'whatwg-fetch' -import { StatusCodeError } from '../errors/errors' - const oldfetch = window.fetch let fetch = (url, options) => { @@ -104,7 +106,7 @@ const promisedRequest = ({ method, url, payload, credentials, headers = {} }) => }) } -const updateNotificationSettings = ({credentials, settings}) => { +const updateNotificationSettings = ({ credentials, settings }) => { const form = new FormData() each(settings, (value, key) => { @@ -115,20 +117,18 @@ const updateNotificationSettings = ({credentials, settings}) => { headers: authHeaders(credentials), method: 'PUT', body: form - }) - .then((data) => data.json()) + }).then((data) => data.json()) } -const updateAvatar = ({credentials, avatar}) => { +const updateAvatar = ({ credentials, avatar }) => { const form = new FormData() form.append('avatar', avatar) return fetch(MASTODON_PROFILE_UPDATE_URL, { headers: authHeaders(credentials), method: 'PATCH', body: form - }) - .then((data) => data.json()) - .then((data) => parseUser(data)) + }).then((data) => data.json()) + .then((data) => parseUser(data)) } const updateBg = ({ credentials, background }) => { @@ -143,26 +143,24 @@ const updateBg = ({ credentials, background }) => { .then((data) => parseUser(data)) } -const updateBanner = ({credentials, banner}) => { +const updateBanner = ({ credentials, banner }) => { const form = new FormData() form.append('header', banner) return fetch(MASTODON_PROFILE_UPDATE_URL, { headers: authHeaders(credentials), method: 'PATCH', body: form - }) - .then((data) => data.json()) - .then((data) => parseUser(data)) + }).then((data) => data.json()) + .then((data) => parseUser(data)) } -const updateProfile = ({credentials, params}) => { +const updateProfile = ({ credentials, params }) => { return promisedRequest({ url: MASTODON_PROFILE_UPDATE_URL, method: 'PATCH', payload: params, credentials - }) - .then((data) => parseUser(data)) + }).then((data) => parseUser(data)) } // Params needed: @@ -212,7 +210,7 @@ const authHeaders = (accessToken) => { } } -const externalProfile = ({profileUrl, credentials}) => { +const externalProfile = ({ profileUrl, credentials }) => { let url = `${EXTERNAL_PROFILE_URL}?profileurl=${profileUrl}` return fetch(url, { headers: authHeaders(credentials), @@ -220,7 +218,7 @@ const externalProfile = ({profileUrl, credentials}) => { }).then((data) => data.json()) } -const followUser = ({id, credentials}) => { +const followUser = ({ id, credentials }) => { let url = MASTODON_FOLLOW_URL(id) return fetch(url, { headers: authHeaders(credentials), @@ -228,7 +226,7 @@ const followUser = ({id, credentials}) => { }).then((data) => data.json()) } -const unfollowUser = ({id, credentials}) => { +const unfollowUser = ({ id, credentials }) => { let url = MASTODON_UNFOLLOW_URL(id) return fetch(url, { headers: authHeaders(credentials), @@ -246,21 +244,21 @@ const unpinOwnStatus = ({ id, credentials }) => { .then((data) => parseStatus(data)) } -const blockUser = ({id, credentials}) => { +const blockUser = ({ id, credentials }) => { return fetch(MASTODON_BLOCK_USER_URL(id), { headers: authHeaders(credentials), method: 'POST' }).then((data) => data.json()) } -const unblockUser = ({id, credentials}) => { +const unblockUser = ({ id, credentials }) => { return fetch(MASTODON_UNBLOCK_USER_URL(id), { headers: authHeaders(credentials), method: 'POST' }).then((data) => data.json()) } -const approveUser = ({id, credentials}) => { +const approveUser = ({ id, credentials }) => { let url = `${APPROVE_USER_URL}?user_id=${id}` return fetch(url, { headers: authHeaders(credentials), @@ -268,7 +266,7 @@ const approveUser = ({id, credentials}) => { }).then((data) => data.json()) } -const denyUser = ({id, credentials}) => { +const denyUser = ({ id, credentials }) => { let url = `${DENY_USER_URL}?user_id=${id}` return fetch(url, { headers: authHeaders(credentials), @@ -276,13 +274,13 @@ const denyUser = ({id, credentials}) => { }).then((data) => data.json()) } -const fetchUser = ({id, credentials}) => { +const fetchUser = ({ id, credentials }) => { let url = `${MASTODON_USER_URL}/${id}` return promisedRequest({ url, credentials }) .then((data) => parseUser(data)) } -const fetchUserRelationship = ({id, credentials}) => { +const fetchUserRelationship = ({ id, credentials }) => { let url = `${MASTODON_USER_RELATIONSHIPS_URL}/?id=${id}` return fetch(url, { headers: authHeaders(credentials) }) .then((response) => { @@ -296,7 +294,7 @@ const fetchUserRelationship = ({id, credentials}) => { }) } -const fetchFriends = ({id, maxId, sinceId, limit = 20, credentials}) => { +const fetchFriends = ({ id, maxId, sinceId, limit = 20, credentials }) => { let url = MASTODON_FOLLOWING_URL(id) const args = [ maxId && `max_id=${maxId}`, @@ -310,7 +308,7 @@ const fetchFriends = ({id, maxId, sinceId, limit = 20, credentials}) => { .then((data) => data.map(parseUser)) } -const exportFriends = ({id, credentials}) => { +const exportFriends = ({ id, credentials }) => { return new Promise(async (resolve, reject) => { try { let friends = [] @@ -330,7 +328,7 @@ const exportFriends = ({id, credentials}) => { }) } -const fetchFollowers = ({id, maxId, sinceId, limit = 20, credentials}) => { +const fetchFollowers = ({ id, maxId, sinceId, limit = 20, credentials }) => { let url = MASTODON_FOLLOWERS_URL(id) const args = [ maxId && `max_id=${maxId}`, @@ -344,13 +342,13 @@ const fetchFollowers = ({id, maxId, sinceId, limit = 20, credentials}) => { .then((data) => data.map(parseUser)) } -const fetchFollowRequests = ({credentials}) => { +const fetchFollowRequests = ({ credentials }) => { const url = FOLLOW_REQUESTS_URL return fetch(url, { headers: authHeaders(credentials) }) .then((data) => data.json()) } -const fetchConversation = ({id, credentials}) => { +const fetchConversation = ({ id, credentials }) => { let urlContext = MASTODON_STATUS_CONTEXT_URL(id) return fetch(urlContext, { headers: authHeaders(credentials) }) .then((data) => { @@ -360,13 +358,13 @@ const fetchConversation = ({id, credentials}) => { throw new Error('Error fetching timeline', data) }) .then((data) => data.json()) - .then(({ancestors, descendants}) => ({ + .then(({ ancestors, descendants }) => ({ ancestors: ancestors.map(parseStatus), descendants: descendants.map(parseStatus) })) } -const fetchStatus = ({id, credentials}) => { +const fetchStatus = ({ id, credentials }) => { let url = MASTODON_STATUS_URL(id) return fetch(url, { headers: authHeaders(credentials) }) .then((data) => { @@ -379,7 +377,7 @@ const fetchStatus = ({id, credentials}) => { .then((data) => parseStatus(data)) } -const tagUser = ({tag, credentials, ...options}) => { +const tagUser = ({ tag, credentials, ...options }) => { const screenName = options.screen_name const form = { nicknames: [screenName], @@ -396,7 +394,7 @@ const tagUser = ({tag, credentials, ...options}) => { }) } -const untagUser = ({tag, credentials, ...options}) => { +const untagUser = ({ tag, credentials, ...options }) => { const screenName = options.screen_name const body = { nicknames: [screenName], @@ -413,7 +411,7 @@ const untagUser = ({tag, credentials, ...options}) => { }) } -const addRight = ({right, credentials, ...user}) => { +const addRight = ({ right, credentials, ...user }) => { const screenName = user.screen_name return fetch(PERMISSION_GROUP_URL(screenName, right), { @@ -423,7 +421,7 @@ const addRight = ({right, credentials, ...user}) => { }) } -const deleteRight = ({right, credentials, ...user}) => { +const deleteRight = ({ right, credentials, ...user }) => { const screenName = user.screen_name return fetch(PERMISSION_GROUP_URL(screenName, right), { @@ -433,7 +431,7 @@ const deleteRight = ({right, credentials, ...user}) => { }) } -const setActivationStatus = ({status, credentials, ...user}) => { +const setActivationStatus = ({ status, credentials, ...user }) => { const screenName = user.screen_name const body = { status: status @@ -449,7 +447,7 @@ const setActivationStatus = ({status, credentials, ...user}) => { }) } -const deleteUser = ({credentials, ...user}) => { +const deleteUser = ({ credentials, ...user }) => { const screenName = user.screen_name const headers = authHeaders(credentials) @@ -459,7 +457,15 @@ const deleteUser = ({credentials, ...user}) => { }) } -const fetchTimeline = ({timeline, credentials, since = false, until = false, userId = false, tag = false, withMuted = false}) => { +const fetchTimeline = ({ + timeline, + credentials, + since = false, + until = false, + userId = false, + tag = false, + withMuted = false +}) => { const timelineUrls = { public: MASTODON_PUBLIC_TIMELINE, friends: MASTODON_USER_HOME_TIMELINE_URL, @@ -558,8 +564,19 @@ const unretweet = ({ id, credentials }) => { .then((data) => parseStatus(data)) } -const postStatus = ({credentials, status, spoilerText, visibility, sensitive, mediaIds = [], inReplyToStatusId, contentType}) => { +const postStatus = ({ + credentials, + status, + spoilerText, + visibility, + sensitive, + poll, + mediaIds = [], + inReplyToStatusId, + contentType +}) => { const form = new FormData() + const pollOptions = poll.options || [] form.append('status', status) form.append('source', 'Pleroma FE') @@ -570,6 +587,19 @@ const postStatus = ({credentials, status, spoilerText, visibility, sensitive, me mediaIds.forEach(val => { form.append('media_ids[]', val) }) + if (pollOptions.some(option => option !== '')) { + const normalizedPoll = { + expires_in: poll.expiresIn, + multiple: poll.multiple + } + Object.keys(normalizedPoll).forEach(key => { + form.append(`poll[${key}]`, normalizedPoll[key]) + }) + + pollOptions.forEach(option => { + form.append('poll[options][]', option) + }) + } if (inReplyToStatusId) { form.append('in_reply_to_id', inReplyToStatusId) } @@ -598,7 +628,7 @@ const deleteStatus = ({ id, credentials }) => { }) } -const uploadMedia = ({formData, credentials}) => { +const uploadMedia = ({ formData, credentials }) => { return fetch(MASTODON_MEDIA_UPLOAD_URL, { body: formData, method: 'POST', @@ -608,7 +638,7 @@ const uploadMedia = ({formData, credentials}) => { .then((data) => parseAttachment(data)) } -const importBlocks = ({file, credentials}) => { +const importBlocks = ({ file, credentials }) => { const formData = new FormData() formData.append('list', file) return fetch(BLOCKS_IMPORT_URL, { @@ -619,7 +649,7 @@ const importBlocks = ({file, credentials}) => { .then((response) => response.ok) } -const importFollows = ({file, credentials}) => { +const importFollows = ({ file, credentials }) => { const formData = new FormData() formData.append('list', file) return fetch(FOLLOW_IMPORT_URL, { @@ -630,7 +660,7 @@ const importFollows = ({file, credentials}) => { .then((response) => response.ok) } -const deleteAccount = ({credentials, password}) => { +const deleteAccount = ({ credentials, password }) => { const form = new FormData() form.append('password', password) @@ -643,7 +673,7 @@ const deleteAccount = ({credentials, password}) => { .then((response) => response.json()) } -const changePassword = ({credentials, password, newPassword, newPasswordConfirmation}) => { +const changePassword = ({ credentials, password, newPassword, newPasswordConfirmation }) => { const form = new FormData() form.append('password', password) @@ -658,14 +688,14 @@ const changePassword = ({credentials, password, newPassword, newPasswordConfirma .then((response) => response.json()) } -const settingsMFA = ({credentials}) => { +const settingsMFA = ({ credentials }) => { return fetch(MFA_SETTINGS_URL, { headers: authHeaders(credentials), method: 'GET' }).then((data) => data.json()) } -const mfaDisableOTP = ({credentials, password}) => { +const mfaDisableOTP = ({ credentials, password }) => { const form = new FormData() form.append('password', password) @@ -678,7 +708,7 @@ const mfaDisableOTP = ({credentials, password}) => { .then((response) => response.json()) } -const mfaConfirmOTP = ({credentials, password, token}) => { +const mfaConfirmOTP = ({ credentials, password, token }) => { const form = new FormData() form.append('password', password) @@ -690,38 +720,38 @@ const mfaConfirmOTP = ({credentials, password, token}) => { method: 'POST' }).then((data) => data.json()) } -const mfaSetupOTP = ({credentials}) => { +const mfaSetupOTP = ({ credentials }) => { return fetch(MFA_SETUP_OTP_URL, { headers: authHeaders(credentials), method: 'GET' }).then((data) => data.json()) } -const generateMfaBackupCodes = ({credentials}) => { +const generateMfaBackupCodes = ({ credentials }) => { return fetch(MFA_BACKUP_CODES_URL, { headers: authHeaders(credentials), method: 'GET' }).then((data) => data.json()) } -const fetchMutes = ({credentials}) => { +const fetchMutes = ({ credentials }) => { return promisedRequest({ url: MASTODON_USER_MUTES_URL, credentials }) .then((users) => users.map(parseUser)) } -const muteUser = ({id, credentials}) => { +const muteUser = ({ id, credentials }) => { return promisedRequest({ url: MASTODON_MUTE_USER_URL(id), credentials, method: 'POST' }) } -const unmuteUser = ({id, credentials}) => { +const unmuteUser = ({ id, credentials }) => { return promisedRequest({ url: MASTODON_UNMUTE_USER_URL(id), credentials, method: 'POST' }) } -const fetchBlocks = ({credentials}) => { +const fetchBlocks = ({ credentials }) => { return promisedRequest({ url: MASTODON_USER_BLOCKS_URL, credentials }) .then((users) => users.map(parseUser)) } -const fetchOAuthTokens = ({credentials}) => { +const fetchOAuthTokens = ({ credentials }) => { const url = '/api/oauth_tokens.json' return fetch(url, { @@ -734,7 +764,7 @@ const fetchOAuthTokens = ({credentials}) => { }) } -const revokeOAuthToken = ({id, credentials}) => { +const revokeOAuthToken = ({ id, credentials }) => { const url = `/api/oauth_tokens/${id}` return fetch(url, { @@ -743,13 +773,13 @@ const revokeOAuthToken = ({id, credentials}) => { }) } -const suggestions = ({credentials}) => { +const suggestions = ({ credentials }) => { return fetch(SUGGESTIONS_URL, { headers: authHeaders(credentials) }).then((data) => data.json()) } -const markNotificationsAsSeen = ({id, credentials}) => { +const markNotificationsAsSeen = ({ id, credentials }) => { const body = new FormData() body.append('latest_id', id) @@ -761,15 +791,39 @@ const markNotificationsAsSeen = ({id, credentials}) => { }).then((data) => data.json()) } -const fetchFavoritedByUsers = ({id}) => { +const vote = ({ pollId, choices, credentials }) => { + const form = new FormData() + form.append('choices', choices) + + return promisedRequest({ + url: MASTODON_VOTE_URL(encodeURIComponent(pollId)), + method: 'POST', + credentials, + payload: { + choices: choices + } + }) +} + +const fetchPoll = ({ pollId, credentials }) => { + return promisedRequest( + { + url: MASTODON_POLL_URL(encodeURIComponent(pollId)), + method: 'GET', + credentials + } + ) +} + +const fetchFavoritedByUsers = ({ id }) => { return promisedRequest({ url: MASTODON_STATUS_FAVORITEDBY_URL(id) }).then((users) => users.map(parseUser)) } -const fetchRebloggedByUsers = ({id}) => { +const fetchRebloggedByUsers = ({ id }) => { return promisedRequest({ url: MASTODON_STATUS_REBLOGGEDBY_URL(id) }).then((users) => users.map(parseUser)) } -const reportUser = ({credentials, userId, statusIds, comment, forward}) => { +const reportUser = ({ credentials, userId, statusIds, comment, forward }) => { return promisedRequest({ url: MASTODON_REPORT_USER_URL, method: 'POST', @@ -840,6 +894,8 @@ const apiService = { denyUser, suggestions, markNotificationsAsSeen, + vote, + fetchPoll, fetchFavoritedByUsers, fetchRebloggedByUsers, reportUser, diff --git a/src/services/backend_interactor_service/backend_interactor_service.js b/src/services/backend_interactor_service/backend_interactor_service.js index 8614a0f2..e095d3d2 100644 --- a/src/services/backend_interactor_service/backend_interactor_service.js +++ b/src/services/backend_interactor_service/backend_interactor_service.js @@ -2,57 +2,57 @@ import apiService from '../api/api.service.js' import timelineFetcherService from '../timeline_fetcher/timeline_fetcher.service.js' import notificationsFetcher from '../notifications_fetcher/notifications_fetcher.service.js' -const backendInteractorService = (credentials) => { - const fetchStatus = ({id}) => { - return apiService.fetchStatus({id, credentials}) +const backendInteractorService = credentials => { + const fetchStatus = ({ id }) => { + return apiService.fetchStatus({ id, credentials }) } - const fetchConversation = ({id}) => { - return apiService.fetchConversation({id, credentials}) + const fetchConversation = ({ id }) => { + return apiService.fetchConversation({ id, credentials }) } - const fetchFriends = ({id, maxId, sinceId, limit}) => { - return apiService.fetchFriends({id, maxId, sinceId, limit, credentials}) + const fetchFriends = ({ id, maxId, sinceId, limit }) => { + return apiService.fetchFriends({ id, maxId, sinceId, limit, credentials }) } - const exportFriends = ({id}) => { - return apiService.exportFriends({id, credentials}) + const exportFriends = ({ id }) => { + return apiService.exportFriends({ id, credentials }) } - const fetchFollowers = ({id, maxId, sinceId, limit}) => { - return apiService.fetchFollowers({id, maxId, sinceId, limit, credentials}) + const fetchFollowers = ({ id, maxId, sinceId, limit }) => { + return apiService.fetchFollowers({ id, maxId, sinceId, limit, credentials }) } - const fetchUser = ({id}) => { - return apiService.fetchUser({id, credentials}) + const fetchUser = ({ id }) => { + return apiService.fetchUser({ id, credentials }) } - const fetchUserRelationship = ({id}) => { - return apiService.fetchUserRelationship({id, credentials}) + const fetchUserRelationship = ({ id }) => { + return apiService.fetchUserRelationship({ id, credentials }) } const followUser = (id) => { - return apiService.followUser({credentials, id}) + return apiService.followUser({ credentials, id }) } const unfollowUser = (id) => { - return apiService.unfollowUser({credentials, id}) + return apiService.unfollowUser({ credentials, id }) } const blockUser = (id) => { - return apiService.blockUser({credentials, id}) + return apiService.blockUser({ credentials, id }) } const unblockUser = (id) => { - return apiService.unblockUser({credentials, id}) + return apiService.unblockUser({ credentials, id }) } const approveUser = (id) => { - return apiService.approveUser({credentials, id}) + return apiService.approveUser({ credentials, id }) } const denyUser = (id) => { - return apiService.denyUser({credentials, id}) + return apiService.denyUser({ credentials, id }) } const startFetchingTimeline = ({ timeline, store, userId = false, tag }) => { @@ -63,73 +63,83 @@ const backendInteractorService = (credentials) => { return notificationsFetcher.startFetching({ store, credentials }) } - const tagUser = ({screen_name}, tag) => { - return apiService.tagUser({screen_name, tag, credentials}) + const tagUser = ({ screen_name }, tag) => { + return apiService.tagUser({ screen_name, tag, credentials }) } - const untagUser = ({screen_name}, tag) => { - return apiService.untagUser({screen_name, tag, credentials}) + const untagUser = ({ screen_name }, tag) => { + return apiService.untagUser({ screen_name, tag, credentials }) } - const addRight = ({screen_name}, right) => { - return apiService.addRight({screen_name, right, credentials}) + const addRight = ({ screen_name }, right) => { + return apiService.addRight({ screen_name, right, credentials }) } - const deleteRight = ({screen_name}, right) => { - return apiService.deleteRight({screen_name, right, credentials}) + const deleteRight = ({ screen_name }, right) => { + return apiService.deleteRight({ screen_name, right, credentials }) } - const setActivationStatus = ({screen_name}, status) => { - return apiService.setActivationStatus({screen_name, status, credentials}) + const setActivationStatus = ({ screen_name }, status) => { + return apiService.setActivationStatus({ screen_name, status, credentials }) } - const deleteUser = ({screen_name}) => { - return apiService.deleteUser({screen_name, credentials}) + const deleteUser = ({ screen_name }) => { + return apiService.deleteUser({ screen_name, credentials }) } - const updateNotificationSettings = ({settings}) => { - return apiService.updateNotificationSettings({credentials, settings}) + const vote = (pollId, choices) => { + return apiService.vote({ credentials, pollId, choices }) } - const fetchMutes = () => apiService.fetchMutes({credentials}) - const muteUser = (id) => apiService.muteUser({credentials, id}) - const unmuteUser = (id) => apiService.unmuteUser({credentials, id}) - const fetchBlocks = () => apiService.fetchBlocks({credentials}) - const fetchFollowRequests = () => apiService.fetchFollowRequests({credentials}) - const fetchOAuthTokens = () => apiService.fetchOAuthTokens({credentials}) - const revokeOAuthToken = (id) => apiService.revokeOAuthToken({id, credentials}) - const fetchPinnedStatuses = (id) => apiService.fetchPinnedStatuses({credentials, id}) - const pinOwnStatus = (id) => apiService.pinOwnStatus({credentials, id}) - const unpinOwnStatus = (id) => apiService.unpinOwnStatus({credentials, id}) + const fetchPoll = (pollId) => { + return apiService.fetchPoll({ credentials, pollId }) + } + + const updateNotificationSettings = ({ settings }) => { + return apiService.updateNotificationSettings({ credentials, settings }) + } + + const fetchMutes = () => apiService.fetchMutes({ credentials }) + const muteUser = (id) => apiService.muteUser({ credentials, id }) + const unmuteUser = (id) => apiService.unmuteUser({ credentials, id }) + const fetchBlocks = () => apiService.fetchBlocks({ credentials }) + const fetchFollowRequests = () => apiService.fetchFollowRequests({ credentials }) + const fetchOAuthTokens = () => apiService.fetchOAuthTokens({ credentials }) + const revokeOAuthToken = (id) => apiService.revokeOAuthToken({ id, credentials }) + const fetchPinnedStatuses = (id) => apiService.fetchPinnedStatuses({ credentials, id }) + const pinOwnStatus = (id) => apiService.pinOwnStatus({ credentials, id }) + const unpinOwnStatus = (id) => apiService.unpinOwnStatus({ credentials, id }) const getCaptcha = () => apiService.getCaptcha() const register = (params) => apiService.register({ credentials, params }) - const updateAvatar = ({avatar}) => apiService.updateAvatar({credentials, avatar}) + const updateAvatar = ({ avatar }) => apiService.updateAvatar({ credentials, avatar }) const updateBg = ({ background }) => apiService.updateBg({ credentials, background }) - const updateBanner = ({banner}) => apiService.updateBanner({credentials, banner}) - const updateProfile = ({params}) => apiService.updateProfile({credentials, params}) + const updateBanner = ({ banner }) => apiService.updateBanner({ credentials, banner }) + const updateProfile = ({ params }) => apiService.updateProfile({ credentials, params }) + + const externalProfile = (profileUrl) => apiService.externalProfile({ profileUrl, credentials }) - const externalProfile = (profileUrl) => apiService.externalProfile({profileUrl, credentials}) - const importBlocks = (file) => apiService.importBlocks({file, credentials}) - const importFollows = (file) => apiService.importFollows({file, credentials}) + const importBlocks = (file) => apiService.importBlocks({ file, credentials }) + const importFollows = (file) => apiService.importFollows({ file, credentials }) - const deleteAccount = ({password}) => apiService.deleteAccount({credentials, password}) - const changePassword = ({password, newPassword, newPasswordConfirmation}) => apiService.changePassword({credentials, password, newPassword, newPasswordConfirmation}) + const deleteAccount = ({ password }) => apiService.deleteAccount({ credentials, password }) + const changePassword = ({ password, newPassword, newPasswordConfirmation }) => + apiService.changePassword({ credentials, password, newPassword, newPasswordConfirmation }) - const fetchSettingsMFA = () => apiService.settingsMFA({credentials}) - const generateMfaBackupCodes = () => apiService.generateMfaBackupCodes({credentials}) - const mfaSetupOTP = () => apiService.mfaSetupOTP({credentials}) - const mfaConfirmOTP = ({password, token}) => apiService.mfaConfirmOTP({credentials, password, token}) - const mfaDisableOTP = ({password}) => apiService.mfaDisableOTP({credentials, password}) + const fetchSettingsMFA = () => apiService.settingsMFA({ credentials }) + const generateMfaBackupCodes = () => apiService.generateMfaBackupCodes({ credentials }) + const mfaSetupOTP = () => apiService.mfaSetupOTP({ credentials }) + const mfaConfirmOTP = ({ password, token }) => apiService.mfaConfirmOTP({ credentials, password, token }) + const mfaDisableOTP = ({ password }) => apiService.mfaDisableOTP({ credentials, password }) - const fetchFavoritedByUsers = (id) => apiService.fetchFavoritedByUsers({id}) - const fetchRebloggedByUsers = (id) => apiService.fetchRebloggedByUsers({id}) - const reportUser = (params) => apiService.reportUser({credentials, ...params}) + const fetchFavoritedByUsers = (id) => apiService.fetchFavoritedByUsers({ id }) + const fetchRebloggedByUsers = (id) => apiService.fetchRebloggedByUsers({ id }) + const reportUser = (params) => apiService.reportUser({ credentials, ...params }) - const favorite = (id) => apiService.favorite({id, credentials}) - const unfavorite = (id) => apiService.unfavorite({id, credentials}) - const retweet = (id) => apiService.retweet({id, credentials}) - const unretweet = (id) => apiService.unretweet({id, credentials}) + const favorite = (id) => apiService.favorite({ id, credentials }) + const unfavorite = (id) => apiService.unfavorite({ id, credentials }) + const retweet = (id) => apiService.retweet({ id, credentials }) + const unretweet = (id) => apiService.unretweet({ id, credentials }) const backendInteractorServiceInstance = { fetchStatus, @@ -180,6 +190,8 @@ const backendInteractorService = (credentials) => { fetchFollowRequests, approveUser, denyUser, + vote, + fetchPoll, fetchFavoritedByUsers, fetchRebloggedByUsers, reportUser, diff --git a/src/services/date_utils/date_utils.js b/src/services/date_utils/date_utils.js new file mode 100644 index 00000000..32e13bca --- /dev/null +++ b/src/services/date_utils/date_utils.js @@ -0,0 +1,45 @@ +export const SECOND = 1000 +export const MINUTE = 60 * SECOND +export const HOUR = 60 * MINUTE +export const DAY = 24 * HOUR +export const WEEK = 7 * DAY +export const MONTH = 30 * DAY +export const YEAR = 365.25 * DAY + +export const relativeTime = (date, nowThreshold = 1) => { + if (typeof date === 'string') date = Date.parse(date) + const round = Date.now() > date ? Math.floor : Math.ceil + const d = Math.abs(Date.now() - date) + let r = { num: round(d / YEAR), key: 'time.years' } + if (d < nowThreshold * SECOND) { + r.num = 0 + r.key = 'time.now' + } else if (d < MINUTE) { + r.num = round(d / SECOND) + r.key = 'time.seconds' + } else if (d < HOUR) { + r.num = round(d / MINUTE) + r.key = 'time.minutes' + } else if (d < DAY) { + r.num = round(d / HOUR) + r.key = 'time.hours' + } else if (d < WEEK) { + r.num = round(d / DAY) + r.key = 'time.days' + } else if (d < MONTH) { + r.num = round(d / WEEK) + r.key = 'time.weeks' + } else if (d < YEAR) { + r.num = round(d / MONTH) + r.key = 'time.months' + } + // Remove plural form when singular + if (r.num === 1) r.key = r.key.slice(0, -1) + return r +} + +export const relativeTimeShort = (date, nowThreshold = 1) => { + const r = relativeTime(date, nowThreshold) + r.key += '_short' + return r +} diff --git a/src/services/entity_normalizer/entity_normalizer.service.js b/src/services/entity_normalizer/entity_normalizer.service.js index cdce1538..9af71e4f 100644 --- a/src/services/entity_normalizer/entity_normalizer.service.js +++ b/src/services/entity_normalizer/entity_normalizer.service.js @@ -234,6 +234,7 @@ export const parseStatus = (data) => { output.summary_html = addEmojis(data.spoiler_text, data.emojis) output.external_url = data.url + output.poll = data.poll output.pinned = data.pinned } else { output.favorited = data.favorited diff --git a/src/services/status_poster/status_poster.service.js b/src/services/status_poster/status_poster.service.js index e70b0f26..1efecf90 100644 --- a/src/services/status_poster/status_poster.service.js +++ b/src/services/status_poster/status_poster.service.js @@ -1,10 +1,19 @@ import { map } from 'lodash' import apiService from '../api/api.service.js' -const postStatus = ({ store, status, spoilerText, visibility, sensitive, media = [], inReplyToStatusId = undefined, contentType = 'text/plain' }) => { +const postStatus = ({ store, status, spoilerText, visibility, sensitive, poll, media = [], inReplyToStatusId = undefined, contentType = 'text/plain' }) => { const mediaIds = map(media, 'id') - return apiService.postStatus({credentials: store.state.users.currentUser.credentials, status, spoilerText, visibility, sensitive, mediaIds, inReplyToStatusId, contentType}) + return apiService.postStatus({ + credentials: store.state.users.currentUser.credentials, + status, + spoilerText, + visibility, + sensitive, + mediaIds, + inReplyToStatusId, + contentType, + poll}) .then((data) => { if (!data.error) { store.dispatch('addNewStatuses', { diff --git a/src/services/style_setter/style_setter.js b/src/services/style_setter/style_setter.js index d0b6ccbf..d73106b8 100644 --- a/src/services/style_setter/style_setter.js +++ b/src/services/style_setter/style_setter.js @@ -202,6 +202,7 @@ const generateColors = (input) => { colors.topBarLink = col.topBarLink || getTextColor(colors.topBar, colors.fgLink) colors.faintLink = col.faintLink || Object.assign({}, col.link) + colors.linkBg = alphaBlend(colors.link, 0.4, colors.bg) colors.icon = mixrgb(colors.bg, colors.text) |
