Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

messagelist: use lockedQueuedEffect #3215

Closed
wants to merge 3 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 0 additions & 39 deletions src/renderer/stores/chat/chat_scheduler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,45 +27,6 @@ export class ChatStoreScheduler {
return this.locks[key]
}

/** This effect will only get executed if the lock is unlocked. If it's still locked, this effect
* will get dropped/not executed. If you want the effect to get executed as soon as the lock with
* lockNameis unlocked, use lockedQueuedEffect.*/
lockedEffect<T extends Function>(
lockName: keyof ChatStoreLocks,
effect: T,
effectName: string
): T {
const fn: T = ((async (...args: any) => {
if (this.isLocked(lockName) === true) {
log.debug(`lockedEffect: ${effectName}: We're locked, dropping effect`)
return false
}

//log.debug(`lockedEffect: ${effectName}: locking`)
this.lock(lockName)
let returnValue
try {
returnValue = await effect(...args)
} catch (err) {
log.error(`lockedEffect: ${effectName}: error in called effect: ${err}`)
this.unlock(lockName)
return
}
if (returnValue === false) {
/*log.debug(
`lockedEffect: ${effectName}: return value was false, unlocking`
)*/
this.unlock(lockName)
} else {
/*log.debug(
`lockedEffect: ${effectName}: return value was NOT false, keeping it locked`
)*/
}
return returnValue
}) as unknown) as T
return fn
}

tickRunQueuedEffect() {
setTimeout(async () => {
log.debug('effectQueue: running queued effects')
Expand Down
271 changes: 131 additions & 140 deletions src/renderer/stores/messagelist.ts
Original file line number Diff line number Diff line change
Expand Up @@ -316,10 +316,11 @@ class MessageListStore extends Store<MessageListState> {
true
)

const firstUnreadMsgId = await BackendRemote.rpc.getFirstUnreadMessageOfChat(
this.accountId,
this.chatId
)
const firstUnreadMsgId =
await BackendRemote.rpc.getFirstUnreadMessageOfChat(
this.accountId,
this.chatId
)
if (firstUnreadMsgId !== null) {
setTimeout(() => {
this.effect.jumpToMessage(firstUnreadMsgId, false)
Expand Down Expand Up @@ -393,9 +394,8 @@ class MessageListStore extends Store<MessageListState> {
0,
jumpToMessageStackLength - 1
)
jumpToMessageId = this.state.jumpToMessageStack[
jumpToMessageStackLength - 1
]
jumpToMessageId =
this.state.jumpToMessageStack[jumpToMessageStackLength - 1]
message = await BackendRemote.rpc.getMessage(
accountId,
jumpToMessageId as number
Expand Down Expand Up @@ -572,152 +572,144 @@ class MessageListStore extends Store<MessageListState> {
),
400
),
fetchMoreMessagesTop: this.scheduler.queuedEffect(
this.scheduler.lockedEffect(
'scroll',
async () => {
this.log.debug(`fetchMoreMessagesTop`)
const state = this.state
const id = this.chatId
const oldestFetchedMessageListItemIndex = Math.max(
state.oldestFetchedMessageListItemIndex - PAGE_SIZE,
0
fetchMoreMessagesTop: this.scheduler.lockedQueuedEffect(
'scroll',
async () => {
this.log.debug(`fetchMoreMessagesTop`)
const state = this.state
const id = this.chatId
const oldestFetchedMessageListItemIndex = Math.max(
state.oldestFetchedMessageListItemIndex - PAGE_SIZE,
0
)
const lastMessageIndexOnLastPage =
state.oldestFetchedMessageListItemIndex
if (lastMessageIndexOnLastPage === 0) {
this.log.debug(
'FETCH_MORE_MESSAGES: lastMessageIndexOnLastPage is zero, returning'
)
const lastMessageIndexOnLastPage =
state.oldestFetchedMessageListItemIndex
if (lastMessageIndexOnLastPage === 0) {
this.log.debug(
'FETCH_MORE_MESSAGES: lastMessageIndexOnLastPage is zero, returning'
)
return false
}
const fetchedMessageListItems = state.messageListItems.slice(
oldestFetchedMessageListItemIndex,
lastMessageIndexOnLastPage
return false
}
const fetchedMessageListItems = state.messageListItems.slice(
oldestFetchedMessageListItemIndex,
lastMessageIndexOnLastPage
)
if (fetchedMessageListItems.length === 0) {
this.log.debug(
'fetchMoreMessagesTop: fetchedMessageListItems.length is zero, returning'
)
if (fetchedMessageListItems.length === 0) {
this.log.debug(
'fetchMoreMessagesTop: fetchedMessageListItems.length is zero, returning'
)
return false
}

const newMessageCacheItems =
(await loadMessages(
this.accountId,
state.messageListItems,
oldestFetchedMessageListItemIndex,
lastMessageIndexOnLastPage - 1
).catch(err => this.log.error('loadMessages failed', err))) || {}
return false
}

this.reducer.appendMessagePageTop({
id,
newMessageCacheItems,
const newMessageCacheItems =
(await loadMessages(
this.accountId,
state.messageListItems,
oldestFetchedMessageListItemIndex,
})
return true
},
'fetchMoreMessagesTop'
),
lastMessageIndexOnLastPage - 1
).catch(err => this.log.error('loadMessages failed', err))) || {}

this.reducer.appendMessagePageTop({
id,
newMessageCacheItems,
oldestFetchedMessageListItemIndex,
})
return true
},
'fetchMoreMessagesTop'
),
fetchMoreMessagesBottom: this.scheduler.queuedEffect(
this.scheduler.lockedEffect(
'scroll',
async () => {
const state = this.state
fetchMoreMessagesBottom: this.scheduler.lockedQueuedEffect(
'scroll',
async () => {
const state = this.state

const newestFetchedMessageListItemIndex =
state.newestFetchedMessageListItemIndex + 1
const newNewestFetchedMessageListItemIndex = Math.min(
newestFetchedMessageListItemIndex + PAGE_SIZE,
state.messageListItems.length - 1
)
if (
newestFetchedMessageListItemIndex === state.messageListItems.length
) {
//log.debug('fetchMoreMessagesBottom: no more messages, returning')
return false
}
this.log.debug(`fetchMoreMessagesBottom`)
const newestFetchedMessageListItemIndex =
state.newestFetchedMessageListItemIndex + 1
const newNewestFetchedMessageListItemIndex = Math.min(
newestFetchedMessageListItemIndex + PAGE_SIZE,
state.messageListItems.length - 1
)
if (
newestFetchedMessageListItemIndex === state.messageListItems.length
) {
//log.debug('fetchMoreMessagesBottom: no more messages, returning')
return false
}
this.log.debug(`fetchMoreMessagesBottom`)

const fetchedMessageListItems = state.messageListItems.slice(
newestFetchedMessageListItemIndex,
newNewestFetchedMessageListItemIndex + 1
const fetchedMessageListItems = state.messageListItems.slice(
newestFetchedMessageListItemIndex,
newNewestFetchedMessageListItemIndex + 1
)
if (fetchedMessageListItems.length === 0) {
this.log.debug(
'fetchMoreMessagesBottom: fetchedMessageListItems.length is zero, returning',
JSON.stringify({
newestFetchedMessageIndex: newestFetchedMessageListItemIndex,
newNewestFetchedMessageIndex:
newNewestFetchedMessageListItemIndex,
messageIds: state.messageListItems,
})
)
if (fetchedMessageListItems.length === 0) {
this.log.debug(
'fetchMoreMessagesBottom: fetchedMessageListItems.length is zero, returning',
JSON.stringify({
newestFetchedMessageIndex: newestFetchedMessageListItemIndex,
newNewestFetchedMessageIndex: newNewestFetchedMessageListItemIndex,
messageIds: state.messageListItems,
})
)
return false
}
return false
}

const newMessageCacheItems =
(await loadMessages(
this.accountId,
state.messageListItems,
newestFetchedMessageListItemIndex,
newNewestFetchedMessageListItemIndex
).catch(err => this.log.error('loadMessages failed', err))) || {}
const newMessageCacheItems =
(await loadMessages(
this.accountId,
state.messageListItems,
newestFetchedMessageListItemIndex,
newNewestFetchedMessageListItemIndex
).catch(err => this.log.error('loadMessages failed', err))) || {}

this.reducer.appendMessagePageBottom({
newMessageCacheItems,
newestFetchedMessageIndex: newNewestFetchedMessageListItemIndex,
})
return true
},
'fetchMoreMessagesBottom'
),
this.reducer.appendMessagePageBottom({
newMessageCacheItems,
newestFetchedMessageIndex: newNewestFetchedMessageListItemIndex,
})
return true
},
'fetchMoreMessagesBottom'
),
refresh: this.scheduler.queuedEffect(
this.scheduler.lockedEffect(
'scroll',
async () => {
this.log.debug(`refresh`, this)
const state = this.state
const messageListItems = await BackendRemote.rpc.getMessageListItems(
refresh: this.scheduler.lockedQueuedEffect(
'scroll',
async () => {
this.log.debug(`refresh`, this)
const state = this.state
const messageListItems = await BackendRemote.rpc.getMessageListItems(
this.accountId,
this.chatId,
false,
true
)
let {
newestFetchedMessageListItemIndex,
oldestFetchedMessageListItemIndex,
} = state
newestFetchedMessageListItemIndex = Math.min(
newestFetchedMessageListItemIndex,
messageListItems.length - 1
)
oldestFetchedMessageListItemIndex = Math.max(
oldestFetchedMessageListItemIndex,
0
)

const messageCache =
(await loadMessages(
this.accountId,
this.chatId,
false,
true
)
let {
newestFetchedMessageListItemIndex,
oldestFetchedMessageListItemIndex,
} = state
newestFetchedMessageListItemIndex = Math.min(
newestFetchedMessageListItemIndex,
messageListItems.length - 1
)
oldestFetchedMessageListItemIndex = Math.max(
messageListItems,
oldestFetchedMessageListItemIndex,
0
)
newestFetchedMessageListItemIndex
).catch(err => this.log.error('loadMessages failed', err))) || {}

const messageCache =
(await loadMessages(
this.accountId,
messageListItems,
oldestFetchedMessageListItemIndex,
newestFetchedMessageListItemIndex
).catch(err => this.log.error('loadMessages failed', err))) || {}

this.reducer.refresh(
messageListItems,
messageCache,
newestFetchedMessageListItemIndex,
oldestFetchedMessageListItemIndex
)
return true
},
'refresh'
),
this.reducer.refresh(
messageListItems,
messageCache,
newestFetchedMessageListItemIndex,
oldestFetchedMessageListItemIndex
)
return true
},
'refresh'
),
onEventIncomingMessage: this.scheduler.queuedEffect(async () => {
Expand All @@ -728,9 +720,8 @@ class MessageListStore extends Store<MessageListState> {
true
)
let indexEnd = -1
const last_item = this.state.messageListItems[
this.state.messageListItems.length - 1
]
const last_item =
this.state.messageListItems[this.state.messageListItems.length - 1]

let indexStart = messageListItems.findIndex(item => {
if (last_item.kind !== item.kind) {
Expand Down