diff --git a/src/components/timeline/timeline.js b/src/components/timeline/timeline.js index 98da8660..23d2c1e8 100644 --- a/src/components/timeline/timeline.js +++ b/src/components/timeline/timeline.js @@ -7,7 +7,6 @@ import { throttle } from 'lodash' const Timeline = { props: [ 'timeline', - 'timelineName', 'title', 'userId', 'tag', @@ -55,7 +54,7 @@ const Timeline = { timelineFetcher.fetchAndUpdate({ store, credentials, - timeline: this.timelineName, + timeline: this.timeline, showImmediately, userId: this.userId, tag: this.tag @@ -70,32 +69,32 @@ const Timeline = { destroyed () { window.removeEventListener('scroll', this.scrollLoad) if (typeof document.hidden !== 'undefined') document.removeEventListener('visibilitychange', this.handleVisibilityChange, false) - this.$store.commit('setLoading', { timeline: this.timelineName, value: false }) + this.$store.commit('setLoading', { timeline: this.timeline, value: false }) }, methods: { showNewStatuses () { if (this.timeline.flushMarker !== 0) { - this.$store.commit('clearTimeline', { timeline: this.timelineName }) - this.$store.commit('queueFlush', { timeline: this.timelineName, id: 0 }) + this.$store.commit('clearTimeline', { timeline: this.timeline }) + this.$store.commit('queueFlush', { timeline: this.timeline, id: 0 }) this.fetchOlderStatuses() } else { - this.$store.commit('showNewStatuses', { timeline: this.timelineName }) + this.$store.commit('showNewStatuses', { timeline: this.timeline }) this.paused = false } }, fetchOlderStatuses: throttle(function () { const store = this.$store const credentials = store.state.users.currentUser.credentials - store.commit('setLoading', { timeline: this.timelineName, value: true }) + store.commit('setLoading', { timeline: this.timeline, value: true }) timelineFetcher.fetchAndUpdate({ store, credentials, - timeline: this.timelineName, + timeline: this.timeline, older: true, showImmediately: true, userId: this.userId, tag: this.tag - }).then(() => store.commit('setLoading', { timeline: this.timelineName, value: false })) + }).then(() => store.commit('setLoading', { timeline: this.timeline, value: false })) }, 1000, this), scrollLoad (e) { const bodyBRect = document.body.getBoundingClientRect() diff --git a/src/components/user_profile/user_profile.js b/src/components/user_profile/user_profile.js index 2ca09817..d6edd25a 100644 --- a/src/components/user_profile/user_profile.js +++ b/src/components/user_profile/user_profile.js @@ -1,6 +1,7 @@ import UserCardContent from '../user_card_content/user_card_content.vue' import UserCard from '../user_card/user_card.vue' import Timeline from '../timeline/timeline.vue' +import { emptyTl } from '../../modules/statuses.js' const UserProfile = { created () { @@ -13,6 +14,11 @@ const UserProfile = { destroyed () { this.$store.dispatch('stopFetching', 'user') }, + data () { + return { + favorites: emptyTl({ type: 'favorites', userId: this.userId }) + } + }, computed: { timeline () { return this.$store.state.statuses.timelines.user diff --git a/src/components/user_profile/user_profile.vue b/src/components/user_profile/user_profile.vue index a46befa5..15f7d44f 100644 --- a/src/components/user_profile/user_profile.vue +++ b/src/components/user_profile/user_profile.vue @@ -20,6 +20,7 @@ +
diff --git a/src/modules/api.js b/src/modules/api.js index a61340c2..b85b24be 100644 --- a/src/modules/api.js +++ b/src/modules/api.js @@ -5,7 +5,7 @@ import { Socket } from 'phoenix' const api = { state: { backendInteractor: backendInteractorService(), - fetchers: {}, + fetchers: new Map(), socket: null, chatDisabled: false, followRequests: [] @@ -15,10 +15,10 @@ const api = { state.backendInteractor = backendInteractor }, addFetcher (state, {timeline, fetcher}) { - state.fetchers[timeline] = fetcher + state.fetchers.set(timeline, fetcher) }, removeFetcher (state, {timeline}) { - delete state.fetchers[timeline] + delete state.fetchers.delete(timeline) }, setSocket (state, socket) { state.socket = socket @@ -41,13 +41,13 @@ const api = { } // Don't start fetching if we already are. - if (!store.state.fetchers[timeline]) { + if (!store.state.fetchers.has(timeline)) { const fetcher = store.state.backendInteractor.startFetching({timeline, store, userId}) store.commit('addFetcher', {timeline, fetcher}) } }, stopFetching (store, timeline) { - const fetcher = store.state.fetchers[timeline] + const fetcher = store.state.fetchers.get(timeline) window.clearInterval(fetcher) store.commit('removeFetcher', {timeline}) }, diff --git a/src/modules/statuses.js b/src/modules/statuses.js index dccccf72..33804d39 100644 --- a/src/modules/statuses.js +++ b/src/modules/statuses.js @@ -2,7 +2,7 @@ import { includes, remove, slice, sortBy, toInteger, each, find, flatten, maxBy, import apiService from '../services/api/api.service.js' // import parse from '../services/status_parser/status_parser.js' -const emptyTl = () => ({ +export const emptyTl = (tl) => (Object.assign(tl, { statuses: [], statusesObject: {}, faves: [], @@ -16,7 +16,7 @@ const emptyTl = () => ({ friends: [], userId: 0, flushMarker: 0 -}) +})) export const defaultState = { allStatuses: [], @@ -33,13 +33,13 @@ export const defaultState = { favorites: new Set(), error: false, timelines: { - mentions: emptyTl(), - public: emptyTl(), - user: emptyTl(), - publicAndExternal: emptyTl(), - friends: emptyTl(), - tag: emptyTl(), - dms: emptyTl() + mentions: emptyTl({ type: 'mentions' }), + public: emptyTl({ type: 'public' }), + user: emptyTl({ type: 'user' }), // TODO: switch to unregistered + publicAndExternal: emptyTl({ type: 'publicAndExternal' }), + friends: emptyTl({ type: 'friends' }), + tag: emptyTl({ type: 'tag' }), + dms: emptyTl({ type: 'dms' }) } } @@ -137,7 +137,7 @@ const addNewStatuses = (state, { statuses, showImmediately = false, timeline, us const allStatuses = state.allStatuses const allStatusesObject = state.allStatusesObject - const timelineObject = state.timelines[timeline] + const timelineObject = typeof timeline === 'object' ? timeline : state.timelines[timeline] const maxNew = statuses.length > 0 ? maxBy(statuses, 'id').id : 0 const older = timeline && maxNew < timelineObject.maxId @@ -337,7 +337,7 @@ export const mutations = { addNewStatuses, addNewNotifications, showNewStatuses (state, { timeline }) { - const oldTimeline = (state.timelines[timeline]) + const oldTimeline = (typeof timeline === 'object' ? timeline : state.timelines[timeline]) oldTimeline.newStatusCount = 0 oldTimeline.visibleStatuses = slice(oldTimeline.statuses, 0, 50) @@ -346,7 +346,8 @@ export const mutations = { each(oldTimeline.visibleStatuses, (status) => { oldTimeline.visibleStatusesObject[status.id] = status }) }, clearTimeline (state, { timeline }) { - state.timelines[timeline] = emptyTl() + const timelineObject = typeof timeline === 'object' ? timeline : state.timelines[timeline] + emptyTl(timelineObject) }, setFavorited (state, { status, value }) { const newStatus = state.allStatusesObject[status.id] @@ -366,7 +367,8 @@ export const mutations = { newStatus.deleted = true }, setLoading (state, { timeline, value }) { - state.timelines[timeline].loading = value + const timelineObject = typeof timeline === 'object' ? timeline : state.timelines[timeline] + timelineObject.loading = value }, setNsfw (state, { id, nsfw }) { const newStatus = state.allStatusesObject[id] @@ -387,7 +389,8 @@ export const mutations = { }) }, queueFlush (state, { timeline, id }) { - state.timelines[timeline].flushMarker = id + const timelineObject = typeof timeline === 'object' ? timeline : state.timelines[timeline] + timelineObject.flushMarker = id } } diff --git a/src/services/api/api.service.js b/src/services/api/api.service.js index 4ee95bd1..24b38dfd 100644 --- a/src/services/api/api.service.js +++ b/src/services/api/api.service.js @@ -41,6 +41,8 @@ const APPROVE_USER_URL = '/api/pleroma/friendships/approve' const DENY_USER_URL = '/api/pleroma/friendships/deny' const SUGGESTIONS_URL = '/api/v1/suggestions' +const MASTODON_USER_FAVORITES_TIMELINE_URL = '/api/v1/favourites' + import { each, map } from 'lodash' import 'whatwg-fetch' @@ -300,10 +302,11 @@ 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, + favorites: MASTODON_USER_FAVORITES_TIMELINE_URL, tag: TAG_TIMELINE_URL } - let url = timelineUrls[timeline] + let url = timelineUrls[timeline.type || timeline] let params = [] diff --git a/src/services/timeline_fetcher/timeline_fetcher.service.js b/src/services/timeline_fetcher/timeline_fetcher.service.js index c2a7de56..6c9d59ff 100644 --- a/src/services/timeline_fetcher/timeline_fetcher.service.js +++ b/src/services/timeline_fetcher/timeline_fetcher.service.js @@ -3,7 +3,7 @@ import { camelCase } from 'lodash' import apiService from '../api/api.service.js' const update = ({store, statuses, timeline, showImmediately, userId}) => { - const ccTimeline = camelCase(timeline) + const ccTimeline = typeof timeline === 'object' ? timeline : camelCase(timeline) store.dispatch('setError', { value: false }) @@ -18,7 +18,7 @@ const update = ({store, statuses, timeline, showImmediately, userId}) => { 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)] + const timelineData = typeof timeline === 'object' ? timeline : rootState.statuses.timelines[camelCase(timeline)] if (older) { args['until'] = until || timelineData.minVisibleId