Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F85629492
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Award Token
Flag For Later
Size
8 KB
Referenced Files
None
Subscribers
None
View Options
diff --git a/src/modules/users.js b/src/modules/users.js
index 46a2e087d8..fd2d6e81cf 100644
--- a/src/modules/users.js
+++ b/src/modules/users.js
@@ -1,74 +1,81 @@
import timelineFetcher from '../services/timeline_fetcher/timeline_fetcher.service.js'
import backendInteractorService from '../services/backend_interactor_service/backend_interactor_service.js'
import { map, each, find, merge } from 'lodash'
// TODO: Unify with mergeOrAdd in statuses.js
export const mergeOrAdd = (arr, item) => {
const oldItem = find(arr, {id: item.id})
if (oldItem) {
// We already have this, so only merge the new info.
merge(oldItem, item)
return {item: oldItem, new: false}
} else {
// This is a new item, prepare it
arr.push(item)
return {item, new: true}
}
}
export const mutations = {
setCurrentUser (state, user) {
state.currentUser = user
},
beginLogin (state) {
state.loggingIn = true
},
endLogin (state) {
state.loggingIn = false
},
addNewUsers (state, users) {
each(users, (user) => mergeOrAdd(state.users, user))
}
}
export const defaultState = {
currentUser: false,
loggingIn: false,
users: []
}
const users = {
state: defaultState,
mutations,
actions: {
addNewStatuses (store, { statuses }) {
const users = map(statuses, 'user')
store.commit('addNewUsers', users)
},
loginUser (store, userCredentials) {
const commit = store.commit
commit('beginLogin')
- return store.rootState.api.backendInteractor.verifyCredentials(userCredentials)
+ store.rootState.api.backendInteractor.verifyCredentials(userCredentials)
.then((response) => {
if (response.ok) {
response.json()
.then((user) => {
user.credentials = userCredentials
commit('setCurrentUser', user)
+ commit('addNewUsers', [user])
+
+ // Start getting fresh tweets.
+ timelineFetcher.startFetching({store, credentials: userCredentials})
+
+ // Set our new backend interactor
+ commit('setBackendInteractor', backendInteractorService(userCredentials))
+
+ // Fetch our friends
+ store.rootState.api.backendInteractor.fetchFriends()
+ .then((friends) => commit('addNewUsers', friends))
})
- // Start getting fresh tweets.
- .then(() => timelineFetcher.startFetching({store, credentials: userCredentials}))
- // Set our new backend interactor
- .then(() => commit('setBackendInteractor', backendInteractorService(userCredentials)))
}
commit('endLogin')
})
.catch((error) => {
console.log(error)
commit('endLogin')
})
}
}
}
export default users
diff --git a/src/services/api/api.service.js b/src/services/api/api.service.js
index 0dea2d4697..47895d3b37 100644
--- a/src/services/api/api.service.js
+++ b/src/services/api/api.service.js
@@ -1,138 +1,145 @@
/* eslint-env browser */
const LOGIN_URL = '/api/account/verify_credentials.json'
const FRIENDS_TIMELINE_URL = '/api/statuses/friends_timeline.json'
const PUBLIC_TIMELINE_URL = '/api/statuses/public_timeline.json'
const PUBLIC_AND_EXTERNAL_TIMELINE_URL = '/api/statuses/public_and_external_timeline.json'
const FAVORITE_URL = '/api/favorites/create'
const UNFAVORITE_URL = '/api/favorites/destroy'
const RETWEET_URL = '/api/statuses/retweet'
const STATUS_UPDATE_URL = '/api/statuses/update.json'
const STATUS_URL = '/api/statuses/show'
const MEDIA_UPLOAD_URL = '/api/statusnet/media/upload'
const CONVERSATION_URL = '/api/statusnet/conversation'
const MENTIONS_URL = '/api/statuses/mentions.json'
+const FRIENDS_URL = '/api/statuses/friends.json'
const oldfetch = window.fetch
let fetch = (url, options) => {
const baseUrl = ''
const fullUrl = baseUrl + url
return oldfetch(fullUrl, options)
}
const authHeaders = (user) => {
if (user && user.username && user.password) {
return { 'Authorization': `Basic ${btoa(`${user.username}:${user.password}`)}` }
} else {
return { }
}
}
+const fetchFriends = ({credentials}) => {
+ return fetch(FRIENDS_URL, { headers: authHeaders(credentials) })
+ .then((data) => data.json())
+}
+
const fetchMentions = ({username, sinceId = 0, credentials}) => {
let url = `${MENTIONS_URL}?since_id=${sinceId}&screen_name=${username}`
return fetch(url, { headers: authHeaders(credentials) })
.then((data) => data.json())
}
const fetchConversation = ({id, credentials}) => {
let url = `${CONVERSATION_URL}/${id}.json?count=100`
return fetch(url, { headers: authHeaders(credentials) })
.then((data) => data.json())
}
const fetchStatus = ({id, credentials}) => {
let url = `${STATUS_URL}/${id}.json`
return fetch(url, { headers: authHeaders(credentials) })
.then((data) => data.json())
}
const fetchTimeline = ({timeline, credentials, since = false, until = false}) => {
const timelineUrls = {
public: PUBLIC_TIMELINE_URL,
friends: FRIENDS_TIMELINE_URL,
'publicAndExternal': PUBLIC_AND_EXTERNAL_TIMELINE_URL
}
let url = timelineUrls[timeline]
if (since) {
url += `?since_id=${since}`
}
if (until) {
url += `?max_id=${until}`
}
return fetch(url, { headers: authHeaders(credentials) }).then((data) => data.json())
}
const verifyCredentials = (user) => {
return fetch(LOGIN_URL, {
method: 'POST',
headers: authHeaders(user)
})
}
const favorite = ({ id, credentials }) => {
return fetch(`${FAVORITE_URL}/${id}.json`, {
headers: authHeaders(credentials),
method: 'POST'
})
}
const unfavorite = ({ id, credentials }) => {
return fetch(`${UNFAVORITE_URL}/${id}.json`, {
headers: authHeaders(credentials),
method: 'POST'
})
}
const retweet = ({ id, credentials }) => {
return fetch(`${RETWEET_URL}/${id}.json`, {
headers: authHeaders(credentials),
method: 'POST'
})
}
const postStatus = ({credentials, status, mediaIds, inReplyToStatusId}) => {
const idsText = mediaIds.join(',')
const form = new FormData()
form.append('status', status)
form.append('source', 'Pleroma FE')
form.append('media_ids', idsText)
if (inReplyToStatusId) {
form.append('in_reply_to_status_id', inReplyToStatusId)
}
return fetch(STATUS_UPDATE_URL, {
body: form,
method: 'POST',
headers: authHeaders(credentials)
})
}
const uploadMedia = ({formData, credentials}) => {
return fetch(MEDIA_UPLOAD_URL, {
body: formData,
method: 'POST',
headers: authHeaders(credentials)
})
.then((response) => response.text())
.then((text) => (new DOMParser()).parseFromString(text, 'application/xml'))
}
const apiService = {
verifyCredentials,
fetchTimeline,
fetchConversation,
fetchStatus,
fetchMentions,
+ fetchFriends,
favorite,
unfavorite,
retweet,
postStatus,
uploadMedia
}
export default apiService
diff --git a/src/services/backend_interactor_service/backend_interactor_service.js b/src/services/backend_interactor_service/backend_interactor_service.js
index eff085ae3c..36a1ff3bfd 100644
--- a/src/services/backend_interactor_service/backend_interactor_service.js
+++ b/src/services/backend_interactor_service/backend_interactor_service.js
@@ -1,26 +1,31 @@
import apiService from '../api/api.service.js'
const backendInteractorService = (credentials) => {
const fetchStatus = ({id}) => {
return apiService.fetchStatus({id, credentials})
}
const fetchConversation = ({id}) => {
return apiService.fetchConversation({id, credentials})
}
const fetchMentions = ({sinceId, username}) => {
return apiService.fetchMentions({sinceId, username, credentials})
}
+ const fetchFriends = () => {
+ return apiService.fetchFriends({credentials})
+ }
+
const backendInteractorServiceInstance = {
fetchStatus,
fetchConversation,
fetchMentions,
+ fetchFriends,
verifyCredentials: apiService.verifyCredentials
}
return backendInteractorServiceInstance
}
export default backendInteractorService
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Sat, Aug 8, 10:08 PM (1 d, 14 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
1724011
Default Alt Text
(8 KB)
Attached To
Mode
rPUFE pleroma-fe-upstream
Attached
Detach File
Event Timeline
Log In to Comment