diff options
Diffstat (limited to 'src/services')
| -rw-r--r-- | src/services/api/api.service.js | 101 | ||||
| l--------- | src/services/timeline_fetcher/.#timeline_fetcher.service.js | 1 | ||||
| -rw-r--r-- | src/services/timeline_fetcher/timeline_fetcher.service.js | 53 |
3 files changed, 155 insertions, 0 deletions
diff --git a/src/services/api/api.service.js b/src/services/api/api.service.js new file mode 100644 index 00000000..3eb8c62a --- /dev/null +++ b/src/services/api/api.service.js @@ -0,0 +1,101 @@ +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 CONVERSATION_URL = '/api/statusnet/conversation/'; +const STATUS_UPDATE_URL = '/api/statuses/update.json'; +const MEDIA_UPLOAD_URL = '/api/statusnet/media/upload'; +const FAVORITE_URL = '/api/favorites/create'; +const UNFAVORITE_URL = '/api/favorites/destroy'; + +const FORM_CONTENT_TYPE = {'Content-Type': 'application/x-www-form-urlencoded'}; + +import { param, ajax } from 'jquery'; +import { merge } from 'lodash'; + +// TODO: This should probably be in redux. +let authHeaders = {}; + +const apiServiceFactory = ($http) => { + // Public + const fetchConversation = (id) => { + return $http.get(`${CONVERSATION_URL}/${id}.json?count=100`); + }; + + const fetchTimeline = ({timeline, since = false, until = false}) => { + const timelineUrls = { + public: PUBLIC_TIMELINE_URL, + friends: FRIENDS_TIMELINE_URL, + 'public-and-external': 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 }).then((data) => data.json()); + }; + + // Need credentials + const verifyCredentials = (user) => { + const base64 = btoa(`${user.username}:${user.password}`); + authHeaders = { "Authorization": `Basic ${base64}` }; + return $http.post(LOGIN_URL, null, { headers: authHeaders }); + }; + + const postStatus = ({status, mediaIds, in_reply_to_status_id}) => { + const idsText = mediaIds.join(','); + const form = new FormData(); + + form.append('status', status); + form.append('source', 'The Wired FE'); + form.append('media_ids', idsText); + if(in_reply_to_status_id) { + form.append('in_reply_to_status_id', in_reply_to_status_id); + }; + + return fetch(STATUS_UPDATE_URL, { + body: form, + method: 'POST', + headers: authHeaders + }); + }; + + const favorite = (id) => $http.post(`${FAVORITE_URL}/${id}.json`, null, {headers: authHeaders}); + const unfavorite = (id) => $http.post(`${UNFAVORITE_URL}/${id}.json`, null, {headers: authHeaders}); + + // This was impossible to get to work with $http. You're supposed to set Content-Type + // undefined in the header so it sends the correct header. It would always send a json + // content type. This method from jQuery worked right away... + // Also, this method is only available as XML output. OLOLOLOLO + const uploadMedia = (formData) => ajax({ + url: MEDIA_UPLOAD_URL, + data: formData, + type: 'POST', + processData: false, + contentType: false, + headers: authHeaders + }); + + const apiService = { + verifyCredentials, + fetchConversation, + postStatus, + uploadMedia, + favorite, + unfavorite, + fetchTimeline + }; + + return apiService; +}; + +apiServiceFactory.$inject = ['$http']; + +export default apiServiceFactory; diff --git a/src/services/timeline_fetcher/.#timeline_fetcher.service.js b/src/services/timeline_fetcher/.#timeline_fetcher.service.js new file mode 120000 index 00000000..8315cdae --- /dev/null +++ b/src/services/timeline_fetcher/.#timeline_fetcher.service.js @@ -0,0 +1 @@ +roger@yuuyuu.18961
\ No newline at end of file diff --git a/src/services/timeline_fetcher/timeline_fetcher.service.js b/src/services/timeline_fetcher/timeline_fetcher.service.js new file mode 100644 index 00000000..9013c82e --- /dev/null +++ b/src/services/timeline_fetcher/timeline_fetcher.service.js @@ -0,0 +1,53 @@ +import { upperFirst, camelCase } from 'lodash'; + +const timelineFetcherServiceFactory = ($ngRedux, apiService, $interval) => { + let fetcher; + + const update = ({statuses, timeline, showImmediately}) => { + const ccTimeline = camelCase(timeline); + + const action = { + type: 'ADD_NEW_STATUSES', + data: { + statuses, + timeline: ccTimeline, + showImmediately + } + }; + + $ngRedux.dispatch(action); + $ngRedux.dispatch({type: 'UPDATE_TIMESTAMPS'}); + }; + + const fetchAndUpdate = ({timeline = 'friends', older = false, showImmediately = false}) => { + const args = { timeline }; + const timelineData = $ngRedux.getState().statuses.timelines[camelCase(timeline)]; + + if(older) { + args['until'] = timelineData.minVisibleId; + } else { + args['since'] = timelineData.maxId; + } + + apiService.fetchTimeline(args). + then((statuses) => update({statuses, timeline, showImmediately})); + }; + + const startFetching = ({timeline = 'friends'}) => { + fetchAndUpdate({timeline, showImmediately: true}); + + const boundFetchAndUpdate = () => fetchAndUpdate({timeline}); + fetcher = $interval(boundFetchAndUpdate, 10000); + }; + + const timelineFetcherService = { + startFetching, + fetchAndUpdate + }; + + return timelineFetcherService; +}; + +timelineFetcherServiceFactory.$inject = ['$ngRedux', 'apiService', '$interval']; + +export default timelineFetcherServiceFactory; |
