From 63650aec29effef1e5c78d953d078ae4a12cb09f Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Sun, 12 Aug 2018 14:14:34 +0300 Subject: Added support for qvitter api fetching of notifications --- src/services/api/api.service.js | 2 ++ 1 file changed, 2 insertions(+) (limited to 'src/services/api/api.service.js') diff --git a/src/services/api/api.service.js b/src/services/api/api.service.js index adf598b7..9a09e503 100644 --- a/src/services/api/api.service.js +++ b/src/services/api/api.service.js @@ -27,6 +27,7 @@ const BANNER_UPDATE_URL = '/api/account/update_profile_banner.json' const PROFILE_UPDATE_URL = '/api/account/update_profile.json' const EXTERNAL_PROFILE_URL = '/api/externalprofile/show.json' const QVITTER_USER_TIMELINE_URL = '/api/qvitter/statuses/user_timeline.json' +const QVITTER_USER_NOTIFICATIONS_URL = '/api/qvitter/statuses/notifications.json' const BLOCKING_URL = '/api/blocks/create.json' const UNBLOCKING_URL = '/api/blocks/destroy.json' const USER_URL = '/api/users/show.json' @@ -301,6 +302,7 @@ const fetchTimeline = ({timeline, credentials, since = false, until = false, use public: PUBLIC_TIMELINE_URL, friends: FRIENDS_TIMELINE_URL, mentions: MENTIONS_URL, + notifications: QVITTER_USER_NOTIFICATIONS_URL, 'publicAndExternal': PUBLIC_AND_EXTERNAL_TIMELINE_URL, user: QVITTER_USER_TIMELINE_URL, tag: TAG_TIMELINE_URL -- cgit v1.2.3-70-g09d2 From ef04a786344ff50cdfeefc79722dafd9c52dbf86 Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Thu, 16 Aug 2018 13:12:31 +0300 Subject: added workaround for broken favorites --- src/modules/api.js | 4 +++ src/modules/statuses.js | 37 +++++++++++++++++----- src/modules/users.js | 2 ++ src/services/api/api.service.js | 3 ++ .../backend_interactor_service.js | 11 +++++++ .../timeline_fetcher/timeline_fetcher.service.js | 4 +-- 6 files changed, 51 insertions(+), 10 deletions(-) (limited to 'src/services/api/api.service.js') diff --git a/src/modules/api.js b/src/modules/api.js index a61340c2..20586f5c 100644 --- a/src/modules/api.js +++ b/src/modules/api.js @@ -46,6 +46,10 @@ const api = { store.commit('addFetcher', {timeline, fetcher}) } }, + fetchOldPost (store, { postId }) { + console.log(store) + store.state.backendInteractor.fetchOldPost({ store, postId }) + }, stopFetching (store, timeline) { const fetcher = store.state.fetchers[timeline] window.clearInterval(fetcher) diff --git a/src/modules/statuses.js b/src/modules/statuses.js index bc3799dd..bd6b968f 100644 --- a/src/modules/statuses.js +++ b/src/modules/statuses.js @@ -27,7 +27,8 @@ export const defaultState = { maxId: 0, maxSavedId: 0, minId: Number.POSITIVE_INFINITY, - data: [] + data: [], + brokenFavorites: {} }, favorites: new Set(), error: false, @@ -35,6 +36,7 @@ export const defaultState = { mentions: emptyTl(), public: emptyTl(), user: emptyTl(), + own: emptyTl(), publicAndExternal: emptyTl(), friends: emptyTl(), tag: emptyTl() @@ -140,6 +142,12 @@ const addNewStatuses = (state, { statuses, showImmediately = false, timeline, us const result = mergeOrAdd(allStatuses, allStatusesObject, status) status = result.item + const brokenFavorites = state.notifications.brokenFavorites[status.id] || [] + brokenFavorites.forEach((fav) => { + fav.status = status + }) + delete state.notifications.brokenFavorites[status.id] + if (result.new) { // We are mentioned in a post if (statusType(status) === 'status' && find(status.attentions, { id: user.id })) { @@ -174,7 +182,7 @@ const addNewStatuses = (state, { statuses, showImmediately = false, timeline, us return status } - const favoriteStatus = (favorite) => { + const favoriteStatus = (favorite, counter) => { const status = find(allStatuses, { id: toInteger(favorite.in_reply_to_status_id) }) if (status) { status.fave_num += 1 @@ -258,7 +266,7 @@ const addNewStatuses = (state, { statuses, showImmediately = false, timeline, us } } -const addNewNotifications = (state, { notifications, older }) => { +const addNewNotifications = (state, { dispatch, notifications, older }) => { const allStatuses = state.allStatuses each(notifications, (notification) => { const action = notification.notice @@ -267,18 +275,31 @@ const addNewNotifications = (state, { notifications, older }) => { state.notifications.maxId = Math.max(notification.id, state.notifications.maxId) state.notifications.minId = Math.min(notification.id, state.notifications.minId) - console.log(notification) const fresh = !older && !notification.is_seen && notification.id > state.notifications.maxSavedId const status = notification.ntype === 'like' ? find(allStatuses, { id: action.in_reply_to_status_id }) : action - state.notifications.data.push({ + + const result = { type: notification.ntype, status, action, // Always assume older notifications as seen seen: !fresh - }) + } + + if (notification.ntype === 'like' && !status) { + let broken = state.notifications.brokenFavorites[action.in_reply_to_status_id] + if (broken) { + broken.push(result) + } else { + dispatch('fetchOldPost', { postId: action.in_reply_to_status_id }) + broken = [ result ] + state.notifications.brokenFavorites[action.in_reply_to_status_id] = broken + } + } + + state.notifications.data.push(result) if ('Notification' in window && window.Notification.permission === 'granted') { const title = action.user.name @@ -370,8 +391,8 @@ const statuses = { addNewStatuses ({ rootState, commit }, { statuses, showImmediately = false, timeline = false, noIdUpdate = false }) { commit('addNewStatuses', { statuses, showImmediately, timeline, noIdUpdate, user: rootState.users.currentUser }) }, - addNewNotifications ({ rootState, commit }, { notifications, older }) { - commit('addNewNotifications', { notifications, older }) + addNewNotifications ({ rootState, commit, dispatch }, { notifications, older }) { + commit('addNewNotifications', { dispatch, notifications, older }) }, setError ({ rootState, commit }, { value }) { commit('setError', { value }) diff --git a/src/modules/users.js b/src/modules/users.js index 8303ecc1..03686c60 100644 --- a/src/modules/users.js +++ b/src/modules/users.js @@ -103,6 +103,8 @@ const users = { // Start getting fresh tweets. store.dispatch('startFetching', 'friends') + // Start getting our own posts, only really needed for mitigating broken favorites + store.dispatch('startFetching', ['own', user.id]) // Get user mutes and follower info store.rootState.api.backendInteractor.fetchMutes().then((mutedUsers) => { diff --git a/src/services/api/api.service.js b/src/services/api/api.service.js index 9a09e503..351f88ca 100644 --- a/src/services/api/api.service.js +++ b/src/services/api/api.service.js @@ -305,6 +305,9 @@ const fetchTimeline = ({timeline, credentials, since = false, until = false, use notifications: QVITTER_USER_NOTIFICATIONS_URL, 'publicAndExternal': PUBLIC_AND_EXTERNAL_TIMELINE_URL, user: QVITTER_USER_TIMELINE_URL, + // separate timeline for own posts, so it won't break due to user timeline bugs + // really needed only for broken favorites + own: QVITTER_USER_TIMELINE_URL, tag: TAG_TIMELINE_URL } diff --git a/src/services/backend_interactor_service/backend_interactor_service.js b/src/services/backend_interactor_service/backend_interactor_service.js index dbfb54f9..f65ad43e 100644 --- a/src/services/backend_interactor_service/backend_interactor_service.js +++ b/src/services/backend_interactor_service/backend_interactor_service.js @@ -54,6 +54,16 @@ const backendInteractorService = (credentials) => { return timelineFetcherService.startFetching({timeline, store, credentials, userId}) } + const fetchOldPost = ({store, postId}) => { + return timelineFetcherService.fetchAndUpdate({ + store, + credentials, + timeline: 'own', + older: true, + until: postId + }) + } + const setUserMute = ({id, muted = true}) => { return apiService.setUserMute({id, muted, credentials}) } @@ -86,6 +96,7 @@ const backendInteractorService = (credentials) => { fetchAllFollowing, verifyCredentials: apiService.verifyCredentials, startFetching, + fetchOldPost, setUserMute, fetchMutes, register, diff --git a/src/services/timeline_fetcher/timeline_fetcher.service.js b/src/services/timeline_fetcher/timeline_fetcher.service.js index bb5fdc2e..0e3e32d2 100644 --- a/src/services/timeline_fetcher/timeline_fetcher.service.js +++ b/src/services/timeline_fetcher/timeline_fetcher.service.js @@ -14,13 +14,13 @@ const update = ({store, statuses, timeline, showImmediately}) => { }) } -const fetchAndUpdate = ({store, credentials, timeline = 'friends', older = false, showImmediately = false, userId = false, tag = false}) => { +const fetchAndUpdate = ({store, credentials, timeline = 'friends', older = false, showImmediately = false, userId = false, tag = false, until}) => { const args = { timeline, credentials } const rootState = store.rootState || store.state const timelineData = rootState.statuses.timelines[camelCase(timeline)] if (older) { - args['until'] = timelineData.minVisibleId + args['until'] = until || timelineData.minVisibleId } else { args['since'] = timelineData.maxId } -- cgit v1.2.3-70-g09d2 From 612aa56c8b2d6bae75bd47ff1846dfcfb012d525 Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Mon, 20 Aug 2018 19:01:54 +0300 Subject: Drop the entire thing about hidden "own" timeline since it doesn't necessarily contain all of the users posts (it doesn't contain DMs) even though it's "us". Since this is a workaround anyway just fetch home timeline instead. It could end up making more queries if user doesn't post that often. --- src/modules/statuses.js | 1 - src/modules/users.js | 2 -- src/services/api/api.service.js | 3 --- src/services/backend_interactor_service/backend_interactor_service.js | 4 ++-- 4 files changed, 2 insertions(+), 8 deletions(-) (limited to 'src/services/api/api.service.js') diff --git a/src/modules/statuses.js b/src/modules/statuses.js index 45dd3afa..1e1bf72f 100644 --- a/src/modules/statuses.js +++ b/src/modules/statuses.js @@ -36,7 +36,6 @@ export const defaultState = { mentions: emptyTl(), public: emptyTl(), user: emptyTl(), - own: emptyTl(), publicAndExternal: emptyTl(), friends: emptyTl(), tag: emptyTl() diff --git a/src/modules/users.js b/src/modules/users.js index c592fe4e..ba548765 100644 --- a/src/modules/users.js +++ b/src/modules/users.js @@ -107,8 +107,6 @@ const users = { // Start getting fresh tweets. store.dispatch('startFetching', 'friends') - // Start getting our own posts, only really needed for mitigating broken favorites - store.dispatch('startFetching', ['own', user.id]) // Get user mutes and follower info store.rootState.api.backendInteractor.fetchMutes().then((mutedUsers) => { diff --git a/src/services/api/api.service.js b/src/services/api/api.service.js index 1cb5e0b8..4f6af06d 100644 --- a/src/services/api/api.service.js +++ b/src/services/api/api.service.js @@ -306,9 +306,6 @@ const fetchTimeline = ({timeline, credentials, since = false, until = false, use notifications: QVITTER_USER_NOTIFICATIONS_URL, 'publicAndExternal': PUBLIC_AND_EXTERNAL_TIMELINE_URL, user: QVITTER_USER_TIMELINE_URL, - // separate timeline for own posts, so it won't break due to user timeline bugs - // really needed only for broken favorites - own: QVITTER_USER_TIMELINE_URL, tag: TAG_TIMELINE_URL } diff --git a/src/services/backend_interactor_service/backend_interactor_service.js b/src/services/backend_interactor_service/backend_interactor_service.js index c84373ac..5742441c 100644 --- a/src/services/backend_interactor_service/backend_interactor_service.js +++ b/src/services/backend_interactor_service/backend_interactor_service.js @@ -54,11 +54,11 @@ const backendInteractorService = (credentials) => { return timelineFetcherService.startFetching({timeline, store, credentials, userId}) } - const fetchOldPost = ({store, postId}) => { + const fetchOldPost = ({store, postId, timeline = 'friends'}) => { return timelineFetcherService.fetchAndUpdate({ store, credentials, - timeline: 'own', + timeline, older: true, until: postId + 1 }) -- cgit v1.2.3-70-g09d2 From a196c3551a1a44660c2f9c4ee940bb988782e929 Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Tue, 21 Aug 2018 00:21:35 +0300 Subject: Revert "Drop the entire thing about hidden "own" timeline since it doesn't necessarily" This reverts commit 612aa56c8b2d6bae75bd47ff1846dfcfb012d525. --- src/modules/statuses.js | 1 + src/modules/users.js | 2 ++ src/services/api/api.service.js | 3 +++ src/services/backend_interactor_service/backend_interactor_service.js | 4 ++-- 4 files changed, 8 insertions(+), 2 deletions(-) (limited to 'src/services/api/api.service.js') diff --git a/src/modules/statuses.js b/src/modules/statuses.js index 8e1e7fe7..ff2cb098 100644 --- a/src/modules/statuses.js +++ b/src/modules/statuses.js @@ -38,6 +38,7 @@ export const defaultState = { mentions: emptyTl(), public: emptyTl(), user: emptyTl(), + own: emptyTl(), publicAndExternal: emptyTl(), friends: emptyTl(), tag: emptyTl() diff --git a/src/modules/users.js b/src/modules/users.js index ba548765..c592fe4e 100644 --- a/src/modules/users.js +++ b/src/modules/users.js @@ -107,6 +107,8 @@ const users = { // Start getting fresh tweets. store.dispatch('startFetching', 'friends') + // Start getting our own posts, only really needed for mitigating broken favorites + store.dispatch('startFetching', ['own', user.id]) // Get user mutes and follower info store.rootState.api.backendInteractor.fetchMutes().then((mutedUsers) => { diff --git a/src/services/api/api.service.js b/src/services/api/api.service.js index 4f6af06d..1cb5e0b8 100644 --- a/src/services/api/api.service.js +++ b/src/services/api/api.service.js @@ -306,6 +306,9 @@ const fetchTimeline = ({timeline, credentials, since = false, until = false, use notifications: QVITTER_USER_NOTIFICATIONS_URL, 'publicAndExternal': PUBLIC_AND_EXTERNAL_TIMELINE_URL, user: QVITTER_USER_TIMELINE_URL, + // separate timeline for own posts, so it won't break due to user timeline bugs + // really needed only for broken favorites + own: QVITTER_USER_TIMELINE_URL, tag: TAG_TIMELINE_URL } diff --git a/src/services/backend_interactor_service/backend_interactor_service.js b/src/services/backend_interactor_service/backend_interactor_service.js index 5742441c..c84373ac 100644 --- a/src/services/backend_interactor_service/backend_interactor_service.js +++ b/src/services/backend_interactor_service/backend_interactor_service.js @@ -54,11 +54,11 @@ const backendInteractorService = (credentials) => { return timelineFetcherService.startFetching({timeline, store, credentials, userId}) } - const fetchOldPost = ({store, postId, timeline = 'friends'}) => { + const fetchOldPost = ({store, postId}) => { return timelineFetcherService.fetchAndUpdate({ store, credentials, - timeline, + timeline: 'own', older: true, until: postId + 1 }) -- cgit v1.2.3-70-g09d2