From 82f1f2d1b10e619e5756930cd1964a7d580aecb8 Mon Sep 17 00:00:00 2001 From: Vincent Date: Wed, 26 Feb 2020 10:33:32 +1100 Subject: [PATCH] More scroll management --- background.html | 1 - stylesheets/_conversation.scss | 6 +- ts/components/conversation/FriendRequest.tsx | 2 +- ts/components/conversation/Message.tsx | 3 +- ts/components/conversation/TypingBubble.tsx | 2 +- ts/components/session/SessionConversation.tsx | 73 ++++++++++++++----- 6 files changed, 62 insertions(+), 25 deletions(-) diff --git a/background.html b/background.html index 2e75ea205..785d40ec2 100644 --- a/background.html +++ b/background.html @@ -472,7 +472,6 @@ - diff --git a/stylesheets/_conversation.scss b/stylesheets/_conversation.scss index fba978b8a..17f36e0a5 100644 --- a/stylesheets/_conversation.scss +++ b/stylesheets/_conversation.scss @@ -169,14 +169,14 @@ opacity: 1; } -.loki-message-wrapper { +.session-message-wrapper { .react-contextmenu-wrapper { display: inline-flex; width: 100%; } } -.loki-message-wrapper { +.session-message-wrapper { padding-left: 16px; padding-right: 16px; } @@ -186,7 +186,7 @@ padding-right: 10px; } -.loki-message-wrapper { +.session-message-wrapper { display: flow-root; padding-bottom: 4px; padding-top: 4px; diff --git a/ts/components/conversation/FriendRequest.tsx b/ts/components/conversation/FriendRequest.tsx index 4033ec7fb..7998ec859 100644 --- a/ts/components/conversation/FriendRequest.tsx +++ b/ts/components/conversation/FriendRequest.tsx @@ -176,7 +176,7 @@ export class FriendRequest extends React.Component { const { direction } = this.props; return ( -
+
{ const isIncoming = direction === 'incoming'; const shouldHightlight = mentionMe && isIncoming && this.props.isPublic; - const divClasses = ['loki-message-wrapper']; + const divClasses = ['session-message-wrapper']; if (shouldHightlight) { //divClasses.push('message-highlighted'); @@ -1108,6 +1108,7 @@ export class Message extends React.PureComponent { return (
{ const selection = window.getSelection(); diff --git a/ts/components/conversation/TypingBubble.tsx b/ts/components/conversation/TypingBubble.tsx index 53229f985..18ea4a759 100644 --- a/ts/components/conversation/TypingBubble.tsx +++ b/ts/components/conversation/TypingBubble.tsx @@ -52,7 +52,7 @@ export class TypingBubble extends React.Component { const { i18n, color } = this.props; return ( -
+
diff --git a/ts/components/session/SessionConversation.tsx b/ts/components/session/SessionConversation.tsx index 20db0cd8b..474cc8ab8 100644 --- a/ts/components/session/SessionConversation.tsx +++ b/ts/components/session/SessionConversation.tsx @@ -22,12 +22,14 @@ interface State { sendingProgess: number; prevSendingProgess: number; conversationKey: string; + unreadCount: number; messages: Array; // Scroll position as percentage of message-list scrollPositionPc: number; // Scroll position in pixels scrollPositionPx: number; doneInitialScroll: boolean; + messageFetchTimestamp: number; } export class SessionConversation extends React.Component { @@ -35,16 +37,24 @@ export class SessionConversation extends React.Component { constructor(props: any) { super(props); + const conversationKey = this.props.conversations.selectedConversation; + + const conversation = this.props.conversations.conversationLookup[conversationKey]; + const unreadCount = conversation.unreadCount; + + console.log(`[vince][info] Conversation: `, conversation); this.state = { sendingProgess: 0, prevSendingProgess: 0, conversationKey, + unreadCount, messages: [], doneInitialScroll: false, scrollPositionPc: 0, scrollPositionPx: 0, + messageFetchTimestamp: 0, }; this.scrollToUnread = this.scrollToUnread.bind(this); @@ -60,7 +70,8 @@ export class SessionConversation extends React.Component { public async componentWillMount() { const { conversationKey } = this.state; await this.getMessages(conversationKey); - + + // Inside a setTimeout to simultate onready() setTimeout(() => { this.scrollToBottom(true); }, 0); @@ -74,7 +85,15 @@ export class SessionConversation extends React.Component { public async componentWillReceiveProps() { const { conversationKey } = this.state; - await this.getMessages(conversationKey); + const timestamp = this.getTimestamp(); + + // If we have pulled messages in the last second, don't bother rescanning + // This avoids getting messages on every re-render. + if (timestamp > this.state.messageFetchTimestamp) { + await this.getMessages(conversationKey); + } else{ + console.log(`[vince][info] Messages recieved in last second, stream`); + } } render() { @@ -115,11 +134,11 @@ export class SessionConversation extends React.Component { )}
- {this.renderMessages(conversationKey)} + {this.renderMessages()}
- +
@@ -208,20 +227,13 @@ export class SessionConversation extends React.Component { ); } - public scrollToUnread() { - - } - - public scrollToBottom(firstLoad = false) { - this.messagesEndRef.current?.scrollIntoView( - { behavior: firstLoad ? 'auto' : 'smooth' } - ); - } - public async getMessages(conversationKey: string, limit = window.CONSTANTS.DEFAULT_MESSAGE_FETCH_COUNT){ + public async getMessages(conversationKey: string){ + const msgCount = window.CONSTANTS.DEFAULT_MESSAGE_FETCH_COUNT + this.state.unreadCount; + const messageSet = await window.Signal.Data.getMessagesByConversation( conversationKey, - { limit, MessageCollection: window.Whisper.MessageCollection }, + { msgCount, MessageCollection: window.Whisper.MessageCollection }, ); // Set first member of series here. @@ -229,17 +241,20 @@ export class SessionConversation extends React.Component { let messages = []; let previousSender; for (let i = 0; i < messageModels.length; i++){ + // Handle firstMessageOfSeries for conditional avatar rendering let firstMessageOfSeries = true; if (i > 0 && previousSender === messageModels[i].authorPhoneNumber){ firstMessageOfSeries = false; } + messages.push({...messageModels[i], firstMessageOfSeries}); previousSender = messageModels[i].authorPhoneNumber; } - console.log(`[vince][messages] Messages`, messages); - - this.setState({ messages }); + const messageFetchTimestamp = this.getTimestamp(); + + console.log(`[vince][messages] Messages Set`, messageModels); + this.setState({ messages, messageFetchTimestamp }); } public renderMessage(messageProps: any, firstMessageOfSeries: boolean, quoteProps?: any) { @@ -326,5 +341,27 @@ export class SessionConversation extends React.Component { /> ); } + + public getTimestamp() { + return Math.floor(Date.now() / 1000); + } + + public handleScroll() { + // Update unread count + + // Get id of message at bottom of screen in full view. This is scroll position by messageID + + } + + public scrollToUnread() { + const topUnreadMessage = document.getElementById('70fd6220-5292-43d8-9e0d-f98bf4792f43'); + topUnreadMessage?.scrollIntoView(false); + } + + public scrollToBottom(firstLoad = false) { + this.messagesEndRef.current?.scrollIntoView( + { behavior: firstLoad ? 'auto' : 'smooth' } + ); + } }