Skip to content

Commit

Permalink
Fetch more messages if oldest unread
Browse files Browse the repository at this point in the history
- If we are fetching older messages for buddy, then keep fetching until
  oldest is not unread
  • Loading branch information
rottabonus committed Apr 28, 2024
1 parent 6c4d038 commit 4c71a49
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 4 deletions.
10 changes: 10 additions & 0 deletions src/api/messages.ts
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,16 @@ const sortSentTime = (a: Message, b: Message) => {
return a.sentTime < b.sentTime ? -1 : 1;
};

export const getIsOldestFetchedMessageUnread = (
fetchedBuddyMessages: Record<string, Message>,
) => {
const sorted = Object.keys(fetchedBuddyMessages)
.map(msgId => fetchedBuddyMessages[msgId])
.sort(sortSentTime);

return !sorted[sorted.length - 1].isSeen;
};

export const extractMostRecentId = (messages: MessageMapping) => {
const flattenedMessages = Object.keys(messages).reduce<
Record<string, Message>
Expand Down
24 changes: 20 additions & 4 deletions src/state/reducers/messages.ts
Original file line number Diff line number Diff line change
Expand Up @@ -93,16 +93,32 @@ export const reducer: automaton.Reducer<State, actions.Action> = (

const previousMsgId = messageApi.extractMostRecentId(nextMessages);

const [pollingParams, nextPollingParams] = messageApi.getNextParams(
const isFetchingOlderMessagesAndIsOldestFetchedUnread =
state.currentParams.type === 'OlderThan'
? messageApi.getIsOldestFetchedMessageUnread(
newMessages[state.currentParams.buddyId],
)
: false;

const [first, rest] = messageApi.getNextParams(
action.payload,
state.pollingQueue,
state.currentParams,
previousMsgId,
);

const { nextFetch, nextCurrent, nextQueue } =
isFetchingOlderMessagesAndIsOldestFetchedUnread
? {
nextCurrent: state.currentParams,
nextFetch: state.currentParams,
nextQueue: [first, ...rest],
}
: { nextCurrent: first, nextFetch: first, nextQueue: rest };

const nextCmd = withToken(
flow(
messageApi.fetchMessages(pollingParams),
messageApi.fetchMessages(nextFetch),
T.delay(config.messageFetchDelay),
),
actions.make('messages/get/completed'),
Expand All @@ -113,8 +129,8 @@ export const reducer: automaton.Reducer<State, actions.Action> = (
...state,
messages: RD.success(nextMessages),
previousMsgId,
pollingQueue: nextPollingParams,
currentParams: pollingParams,
pollingQueue: nextQueue,
currentParams: nextCurrent,
},
nextCmd,
);
Expand Down

0 comments on commit 4c71a49

Please sign in to comment.