Merge branch 'users-statuses-pinia' into weight-removal
This commit is contained in:
commit
0b8ca8aeb0
22 changed files with 126 additions and 83 deletions
|
|
@ -36,7 +36,7 @@ const notificationsFetcher = (credentials) => {
|
|||
const notifications = response.data
|
||||
if (older && notifications.length === 0) bottomedOut.value = true
|
||||
|
||||
useNotificationsStore().addNewNotifications(response)
|
||||
useNotificationsStore().addNewNotifications(response, older)
|
||||
} catch (error) {
|
||||
if (
|
||||
error.statusCode === 400 &&
|
||||
|
|
@ -78,16 +78,13 @@ const notificationsFetcher = (credentials) => {
|
|||
|
||||
args.timeline = 'notifications'
|
||||
if (older) {
|
||||
if (timelineData.minId !== Number.POSITIVE_INFINITY) {
|
||||
if (timelineData.minId !== '') {
|
||||
args.maxId = timelineData.minId
|
||||
}
|
||||
return await fetchNotifications({ args, older })
|
||||
} else {
|
||||
// fetch new notifications
|
||||
if (
|
||||
sinceId === undefined &&
|
||||
timelineData.maxId !== Number.POSITIVE_INFINITY
|
||||
) {
|
||||
if (sinceId === undefined && timelineData.maxId !== '') {
|
||||
args.sinceId = timelineData.maxId
|
||||
} else if (sinceId !== null) {
|
||||
args.sinceId = sinceId
|
||||
|
|
|
|||
|
|
@ -52,7 +52,11 @@ const timelineFetcher = (timeline, argument, credentials) => {
|
|||
|
||||
const numStatusesBeforeFetch = timeline.statusIds.size
|
||||
|
||||
if (older && bottomedOut.value) return
|
||||
if (older && bottomedOut.value) {
|
||||
loadingOlder.value = false
|
||||
return
|
||||
}
|
||||
|
||||
return fetchTimeline(args)
|
||||
.then(({ data, pagination, timestamp }) => {
|
||||
// No statuses for timeline, ever.
|
||||
|
|
@ -135,6 +139,9 @@ const timelineFetcher = (timeline, argument, credentials) => {
|
|||
loadingOlder,
|
||||
loadingNewer,
|
||||
bottomedOut,
|
||||
resetBottomedOut: () => {
|
||||
bottomedOut.value = false
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -134,14 +134,7 @@ export const useInterfaceStore = defineStore('interface', {
|
|||
1001, // Going away
|
||||
])
|
||||
const { code } = closeEvent.original
|
||||
if (intendedCodes.has(code)) {
|
||||
this.pushGlobalNotice({
|
||||
level: 'success',
|
||||
messageKey: 'timeline.socket_closed',
|
||||
messageArgs: [code],
|
||||
timeout: 5000,
|
||||
})
|
||||
} else {
|
||||
if (!intendedCodes.has(code)) {
|
||||
this.pushGlobalNotice({
|
||||
level: 'error',
|
||||
messageKey: 'timeline.socket_broke',
|
||||
|
|
|
|||
|
|
@ -108,6 +108,8 @@ export const useStreamingStore = defineStore('streaming', {
|
|||
}
|
||||
},
|
||||
initSocket(initial) {
|
||||
if (this.socket) throw new Error('Socket already exists!')
|
||||
|
||||
this.state = initial
|
||||
? WSConnectionStatus.STARTING_INITIAL
|
||||
: WSConnectionStatus.STARTING
|
||||
|
|
@ -129,7 +131,11 @@ export const useStreamingStore = defineStore('streaming', {
|
|||
},
|
||||
stopSocket() {
|
||||
this.socket.close()
|
||||
this.socket = null
|
||||
this.state = WSConnectionStatus.CLOSED
|
||||
this.retrying = false
|
||||
this.retryMultiplier = 1
|
||||
this.error = null
|
||||
},
|
||||
|
||||
getSubArgs(stream) {
|
||||
|
|
@ -229,6 +235,8 @@ export const useStreamingStore = defineStore('streaming', {
|
|||
)
|
||||
|
||||
setTimeout(() => {
|
||||
if (this.retrying) return // retry aborted (i.e. due to logout)
|
||||
|
||||
this.initSocket()
|
||||
}, retryTimeout(this.retryMultiplier))
|
||||
|
||||
|
|
|
|||
|
|
@ -81,6 +81,7 @@ export const ARGUMENT_MAP = {
|
|||
user: 'userId',
|
||||
userPinned: 'userId',
|
||||
media: 'userId',
|
||||
favorites: 'userId',
|
||||
}
|
||||
|
||||
const TIMELINES = new Set([
|
||||
|
|
@ -180,7 +181,7 @@ export const useTimelinesStore = defineStore('timelines', {
|
|||
timeline.socket.handlers
|
||||
timeline.socket.et.removeEventListener('open', openHandler)
|
||||
timeline.socket.et.removeEventListener('close', closeHandler)
|
||||
timeline.socket.et.removeEventListener('message', messageHandler)
|
||||
timeline.socket.et.removeEventListener('update', messageHandler)
|
||||
}
|
||||
|
||||
this[timelineName] = emptyTl(timelineName)
|
||||
|
|
@ -196,6 +197,7 @@ export const useTimelinesStore = defineStore('timelines', {
|
|||
timeline.maxId = ''
|
||||
timeline.minId = ''
|
||||
timeline.reloadNeeded = false
|
||||
timeline.fetcher.resetBottomedOut()
|
||||
},
|
||||
activatePersistents() {
|
||||
TIMELINES.forEach((name) => {
|
||||
|
|
@ -266,8 +268,6 @@ export const useTimelinesStore = defineStore('timelines', {
|
|||
if (statuses.length === 0) return
|
||||
const timeline = this[timelineName]
|
||||
|
||||
this.populateRepeats(timeline, repeats)
|
||||
|
||||
// This makes sure that user timeline won't get data meant for other
|
||||
// user. I.e. opening different user profiles makes request which could
|
||||
// return data late after user already viewing different user profile
|
||||
|
|
@ -278,9 +278,7 @@ export const useTimelinesStore = defineStore('timelines', {
|
|||
return
|
||||
}
|
||||
|
||||
if (!noIdUpdate) {
|
||||
this.updateTimelineExtremes(timeline, pagination)
|
||||
}
|
||||
this.populateRepeats(timeline, repeats)
|
||||
|
||||
const filtered = statuses.filter((id) => !timeline.statusIds.has(id))
|
||||
if (older) {
|
||||
|
|
@ -289,26 +287,36 @@ export const useTimelinesStore = defineStore('timelines', {
|
|||
timeline.order.unshift(...filtered)
|
||||
}
|
||||
|
||||
const newStatuses = new Set()
|
||||
|
||||
statuses.forEach((statusId) => {
|
||||
const isNew = !timeline.statusIds.has(statusId)
|
||||
timeline.statusIds.add(statusId)
|
||||
|
||||
if (isNew) {
|
||||
const seenBefore = this.checkSeenBefore(timeline, statusId)
|
||||
if (!seenBefore) {
|
||||
if (showImmediately) {
|
||||
// Add it directly to the visibleStatuses, don't change
|
||||
// newStatusCount
|
||||
timeline.visibleStatusIds.add(statusId)
|
||||
} else {
|
||||
// Just change newStatuscount
|
||||
timeline.newStatusCount += 1
|
||||
}
|
||||
} else {
|
||||
timeline.ignoredIds.add(statusId)
|
||||
}
|
||||
newStatuses.add(statusId)
|
||||
}
|
||||
})
|
||||
|
||||
newStatuses.forEach((statusId) => {
|
||||
const seenBefore = this.checkSeenBefore(timeline, statusId)
|
||||
if (!seenBefore) {
|
||||
if (showImmediately) {
|
||||
// Add it directly to the visibleStatuses, don't change
|
||||
// newStatusCount
|
||||
timeline.visibleStatusIds.add(statusId)
|
||||
} else {
|
||||
// Just change newStatuscount
|
||||
timeline.newStatusCount += 1
|
||||
}
|
||||
} else {
|
||||
timeline.ignoredIds.add(statusId)
|
||||
}
|
||||
})
|
||||
|
||||
if (!noIdUpdate) {
|
||||
this.updateTimelineExtremes(timeline, pagination)
|
||||
}
|
||||
},
|
||||
onStreamMessage(timelineName, argument, event) {
|
||||
this.addStatusesToTimeline(timelineName, argument, {
|
||||
|
|
@ -347,7 +355,7 @@ export const useTimelinesStore = defineStore('timelines', {
|
|||
// If it's the only reprööt then we've never seen post before
|
||||
if (knownRepeats.size === 1) return false
|
||||
// If we're working on oldest known reprööt then we've never seen it before
|
||||
return first(knownRepeats) !== statusId
|
||||
return knownRepeats.values().next().value !== statusId
|
||||
},
|
||||
|
||||
// Poll & Push
|
||||
|
|
@ -414,7 +422,7 @@ export const useTimelinesStore = defineStore('timelines', {
|
|||
},
|
||||
|
||||
// Queues & Timeline manip
|
||||
updateTimelineExtremes(timeline, pagination = {}) {
|
||||
updateTimelineExtremes(timeline, pagination = {}, force = false) {
|
||||
// Can't use Math.min/max because it doesn't work with string (duh)
|
||||
const minNew = pagination.maxId ?? last(timeline.order) ?? ''
|
||||
const maxNew = pagination.minId ?? first(timeline.order) ?? ''
|
||||
|
|
@ -422,10 +430,10 @@ export const useTimelinesStore = defineStore('timelines', {
|
|||
const newer = maxNew > timeline.maxId
|
||||
const older = minNew < timeline.minId
|
||||
|
||||
if (newer || timeline.maxId === '') {
|
||||
if (force || newer || timeline.maxId === '') {
|
||||
timeline.maxId = maxNew
|
||||
}
|
||||
if (older || timeline.minId === '') {
|
||||
if (force || older || timeline.minId === '') {
|
||||
timeline.minId = minNew
|
||||
}
|
||||
|
||||
|
|
@ -442,7 +450,8 @@ export const useTimelinesStore = defineStore('timelines', {
|
|||
timeline.visibleStatusIds = new Set([
|
||||
...timeline.order.filter((id) => !timeline.ignoredIds.has(id)),
|
||||
])
|
||||
this.updateTimelineExtremes(timeline)
|
||||
this.updateTimelineExtremes(timeline, {}, true)
|
||||
timeline.fetcher.resetBottomedOut()
|
||||
},
|
||||
syncOrder(timeline) {
|
||||
timeline.order = timeline.order.filter((id) => timeline.statusIds.has(id))
|
||||
|
|
@ -451,8 +460,10 @@ export const useTimelinesStore = defineStore('timelines', {
|
|||
this[timeline].reloadNeeded = true
|
||||
},
|
||||
requireReloadAll() {
|
||||
Object.keys(this).forEach((timeline) => {
|
||||
this[timeline].reloadNeeded = true
|
||||
TIMELINES.forEach((timelineName) => {
|
||||
const timeline = this[timelineName]
|
||||
|
||||
timeline.reloadNeeded = true
|
||||
})
|
||||
},
|
||||
|
||||
|
|
|
|||
|
|
@ -278,15 +278,21 @@ export const useUsersStore = defineStore('users', {
|
|||
|
||||
const result = await promise
|
||||
|
||||
if (result) {
|
||||
const { id, screen_name } = result
|
||||
try {
|
||||
if (result) {
|
||||
const { id, screen_name } = result
|
||||
|
||||
// Save promise for future use
|
||||
this.fetchesIds.set(id, promise)
|
||||
this.fetchesNames.set(screen_name, promise)
|
||||
return this.users.get(id)
|
||||
} else {
|
||||
return null
|
||||
// Save promise for future use
|
||||
this.fetchesIds.set(id, promise)
|
||||
this.fetchesNames.set(screen_name, promise)
|
||||
return this.users.get(id)
|
||||
} else {
|
||||
return null
|
||||
}
|
||||
} catch (e) {
|
||||
console.error(`Failed fetching user ${identifier}`, e)
|
||||
map.delete(identifier)
|
||||
throw e
|
||||
}
|
||||
},
|
||||
async fetchUser(id) {
|
||||
|
|
@ -520,7 +526,7 @@ export const useUsersStore = defineStore('users', {
|
|||
|
||||
/// Mute
|
||||
muteUser(id, expiresIn = 0) {
|
||||
const predictedRelationship = this.relationships[id] || { id }
|
||||
const predictedRelationship = this.relationships.get(id) || { id }
|
||||
predictedRelationship.muting = true
|
||||
this.updateUserRelationships({
|
||||
optimism: true,
|
||||
|
|
@ -539,7 +545,7 @@ export const useUsersStore = defineStore('users', {
|
|||
return Promise.all(data.map((d) => this.muteUser(d)))
|
||||
},
|
||||
unmuteUser(id) {
|
||||
const predictedRelationship = this.relationships[id] || { id }
|
||||
const predictedRelationship = this.relationships.get(id) || { id }
|
||||
predictedRelationship.muting = false
|
||||
this.updateUserRelationships({
|
||||
optimism: true,
|
||||
|
|
@ -556,7 +562,7 @@ export const useUsersStore = defineStore('users', {
|
|||
|
||||
/// Block
|
||||
blockUser(id, expiresIn = 0) {
|
||||
const predictedRelationship = this.relationships[id] || { id }
|
||||
const predictedRelationship = this.relationships.get(id) || { id }
|
||||
this.updateUserRelationships({
|
||||
optimism: true,
|
||||
data: [predictedRelationship],
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue