aboutsummaryrefslogtreecommitdiff
path: root/src/services
diff options
context:
space:
mode:
authorHenry Jameson <me@hjkos.com>2018-11-26 04:38:44 +0300
committerHenry Jameson <me@hjkos.com>2018-11-26 04:38:44 +0300
commite06717fd0dfa4b37ebf481d5f4cd7ce8ef0034d0 (patch)
tree7f3f7d27ac932e72ec9b5fbdb41b7c8efb210396 /src/services
parent0ca42bd3d63e209f9c1354a30a3123c1f7317579 (diff)
parentf1a23f2b6edb0858890c82cf42c8b6d835102d56 (diff)
Merge remote-tracking branch 'upstream/develop' into feature/scope_preferences
* upstream/develop: DM timeline: stream new statuses update-japanese-translation Add actual user search. incorporate most translation changes from MR 368 update french translation Always show dm panel. Add direct message tab. api service url On logout switch to public timeline. Put oauth text into description. Display OAuth login on login form button. Add login form back in. Linting. Re-activate registration, use oauth password flow to fetch token. Fix typo. Remove gonsole.logg :DD Fix linting. Move login to oauth.
Diffstat (limited to 'src/services')
-rw-r--r--src/services/api/api.service.js18
-rw-r--r--src/services/new_api/oauth.js82
-rw-r--r--src/services/new_api/user_search.js16
-rw-r--r--src/services/new_api/utils.js36
4 files changed, 139 insertions, 13 deletions
diff --git a/src/services/api/api.service.js b/src/services/api/api.service.js
index ab746918..714c0fc7 100644
--- a/src/services/api/api.service.js
+++ b/src/services/api/api.service.js
@@ -15,6 +15,7 @@ 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 DM_TIMELINE_URL = '/api/statuses/dm_timeline.json'
const FOLLOWERS_URL = '/api/statuses/followers.json'
const FRIENDS_URL = '/api/statuses/friends.json'
const FOLLOWING_URL = '/api/friendships/create.json'
@@ -52,16 +53,6 @@ let fetch = (url, options) => {
return oldfetch(fullUrl, options)
}
-// from https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding
-let utoa = (str) => {
- // first we use encodeURIComponent to get percent-encoded UTF-8,
- // then we convert the percent encodings into raw bytes which
- // can be fed into btoa.
- return btoa(encodeURIComponent(str)
- .replace(/%([0-9A-F]{2})/g,
- (match, p1) => { return String.fromCharCode('0x' + p1) }))
-}
-
// Params
// cropH
// cropW
@@ -175,9 +166,9 @@ const register = (params) => {
})
}
-const authHeaders = (user) => {
- if (user && user.username && user.password) {
- return { 'Authorization': `Basic ${utoa(`${user.username}:${user.password}`)}` }
+const authHeaders = (accessToken) => {
+ if (accessToken) {
+ return { 'Authorization': `Bearer ${accessToken}` }
} else {
return { }
}
@@ -302,6 +293,7 @@ const fetchTimeline = ({timeline, credentials, since = false, until = false, use
public: PUBLIC_TIMELINE_URL,
friends: FRIENDS_TIMELINE_URL,
mentions: MENTIONS_URL,
+ dms: DM_TIMELINE_URL,
notifications: QVITTER_USER_NOTIFICATIONS_URL,
'publicAndExternal': PUBLIC_AND_EXTERNAL_TIMELINE_URL,
user: QVITTER_USER_TIMELINE_URL,
diff --git a/src/services/new_api/oauth.js b/src/services/new_api/oauth.js
new file mode 100644
index 00000000..9e656507
--- /dev/null
+++ b/src/services/new_api/oauth.js
@@ -0,0 +1,82 @@
+import {reduce} from 'lodash'
+
+const getOrCreateApp = ({oauth, instance}) => {
+ const url = `${instance}/api/v1/apps`
+ const form = new window.FormData()
+
+ form.append('client_name', `PleromaFE_${Math.random()}`)
+ form.append('redirect_uris', `${window.location.origin}/oauth-callback`)
+ form.append('scopes', 'read write follow')
+
+ return window.fetch(url, {
+ method: 'POST',
+ body: form
+ }).then((data) => data.json())
+}
+const login = (args) => {
+ getOrCreateApp(args).then((app) => {
+ args.commit('setClientData', app)
+
+ const data = {
+ response_type: 'code',
+ client_id: app.client_id,
+ redirect_uri: app.redirect_uri,
+ scope: 'read write follow'
+ }
+
+ const dataString = reduce(data, (acc, v, k) => {
+ const encoded = `${k}=${encodeURIComponent(v)}`
+ if (!acc) {
+ return encoded
+ } else {
+ return `${acc}&${encoded}`
+ }
+ }, false)
+
+ // Do the redirect...
+ const url = `${args.instance}/oauth/authorize?${dataString}`
+
+ window.location.href = url
+ })
+}
+
+const getTokenWithCredentials = ({app, instance, username, password}) => {
+ const url = `${instance}/oauth/token`
+ const form = new window.FormData()
+
+ form.append('client_id', app.client_id)
+ form.append('client_secret', app.client_secret)
+ form.append('grant_type', 'password')
+ form.append('username', username)
+ form.append('password', password)
+
+ return window.fetch(url, {
+ method: 'POST',
+ body: form
+ }).then((data) => data.json())
+}
+
+const getToken = ({app, instance, code}) => {
+ const url = `${instance}/oauth/token`
+ const form = new window.FormData()
+
+ form.append('client_id', app.client_id)
+ form.append('client_secret', app.client_secret)
+ form.append('grant_type', 'authorization_code')
+ form.append('code', code)
+ form.append('redirect_uri', `${window.location.origin}/oauth-callback`)
+
+ return window.fetch(url, {
+ method: 'POST',
+ body: form
+ }).then((data) => data.json())
+}
+
+const oauth = {
+ login,
+ getToken,
+ getTokenWithCredentials,
+ getOrCreateApp
+}
+
+export default oauth
diff --git a/src/services/new_api/user_search.js b/src/services/new_api/user_search.js
new file mode 100644
index 00000000..ce7da88e
--- /dev/null
+++ b/src/services/new_api/user_search.js
@@ -0,0 +1,16 @@
+import utils from './utils.js'
+
+const search = ({query, store}) => {
+ return utils.request({
+ store,
+ url: '/api/pleroma/search_user',
+ params: {
+ query
+ }
+ }).then((data) => data.json())
+}
+const UserSearch = {
+ search
+}
+
+export default UserSearch
diff --git a/src/services/new_api/utils.js b/src/services/new_api/utils.js
new file mode 100644
index 00000000..078f392f
--- /dev/null
+++ b/src/services/new_api/utils.js
@@ -0,0 +1,36 @@
+const queryParams = (params) => {
+ return Object.keys(params)
+ .map(k => encodeURIComponent(k) + '=' + encodeURIComponent(params[k]))
+ .join('&')
+}
+
+const headers = (store) => {
+ const accessToken = store.state.oauth.token
+ if (accessToken) {
+ return {'Authorization': `Bearer ${accessToken}`}
+ } else {
+ return {}
+ }
+}
+
+const request = ({method = 'GET', url, params, store}) => {
+ const instance = store.state.instance.server
+ let fullUrl = `${instance}${url}`
+
+ if (method === 'GET' && params) {
+ fullUrl = fullUrl + `?${queryParams(params)}`
+ }
+
+ return window.fetch(fullUrl, {
+ method,
+ headers: headers(store),
+ credentials: 'same-origin'
+ })
+}
+
+const utils = {
+ queryParams,
+ request
+}
+
+export default utils