diff --git a/packages/react/src/components/ChatHeader/ChatHeader.js b/packages/react/src/components/ChatHeader/ChatHeader.js index 08cfdc8bd..263e84b97 100644 --- a/packages/react/src/components/ChatHeader/ChatHeader.js +++ b/packages/react/src/components/ChatHeader/ChatHeader.js @@ -34,6 +34,7 @@ const ChatHeader = ({ styles = {}, anonymousMode, showRoles, + messageListRef, }) => { const { classNames, styleOverrides } = useComponentOverrides('ChatHeader'); const channelInfo = useChannelStore((state) => state.channelInfo); @@ -98,6 +99,14 @@ const ChatHeader = ({ } }, [RCInstance, setIsUserAuthenticated]); + const scrollToTop = useCallback(() => { + if (messageListRef && messageListRef.current) { + requestAnimationFrame(() => { + messageListRef.current.scrollTop = -messageListRef.current.scrollHeight; + }); + } + }, [messageListRef]); + const showStarredMessage = useCallback(async () => { const { messages } = await RCInstance.getStarredMessages(); setMessages(messages); @@ -266,6 +275,12 @@ const ChatHeader = ({ label: 'Room Information', icon: 'info', }, + { + id: 'scroll-to-top', + action: scrollToTop, + label: 'Scroll to Top', + icon: 'arrow-up', + }, ] ); } @@ -292,6 +307,7 @@ const ChatHeader = ({ showPinnedMessage, showSearchMessage, showStarredMessage, + scrollToTop, ]); return ( diff --git a/packages/react/src/components/EmbeddedChat.js b/packages/react/src/components/EmbeddedChat.js index 264786d20..c541203ac 100644 --- a/packages/react/src/components/EmbeddedChat.js +++ b/packages/react/src/components/EmbeddedChat.js @@ -233,6 +233,7 @@ const EmbeddedChat = ({ setFullScreen={setFullScreen} anonymousMode={anonymousMode} showRoles={showRoles} + messageListRef={messageListRef} /> )} diff --git a/packages/react/src/components/Icon/icons/ArrowUp.js b/packages/react/src/components/Icon/icons/ArrowUp.js new file mode 100644 index 000000000..bdb572ba5 --- /dev/null +++ b/packages/react/src/components/Icon/icons/ArrowUp.js @@ -0,0 +1,29 @@ +import React from 'react'; + +const ArrowUp = (props) => ( + + + + + + + +); + +export default ArrowUp; diff --git a/packages/react/src/components/Icon/icons/index.js b/packages/react/src/components/Icon/icons/index.js index 60aed7b64..b6c2385bf 100644 --- a/packages/react/src/components/Icon/icons/index.js +++ b/packages/react/src/components/Icon/icons/index.js @@ -35,6 +35,7 @@ import Kebab from './Kebab'; import Check from './Check'; import ErrorCircle from './ErrorCircle'; import ArrowDown from './ArrowDown'; +import ArrowUp from './ArrowUp'; import PinFilled from './PinFilled'; import VideoRecorder from './VideoRecoder'; import DisabledRecorder from './DisableRecorder'; @@ -87,6 +88,7 @@ const icons = { check: Check, 'error-circle': ErrorCircle, 'arrow-down': ArrowDown, + 'arrow-up': ArrowUp, 'pin-filled': PinFilled, clipboard: Clipboard, download: Download, diff --git a/packages/react/src/components/Menu/Menu.stories.js b/packages/react/src/components/Menu/Menu.stories.js index 92da52d89..c811c83dc 100644 --- a/packages/react/src/components/Menu/Menu.stories.js +++ b/packages/react/src/components/Menu/Menu.stories.js @@ -48,6 +48,11 @@ export const Menu = { label: 'Room Information', icon: 'info', }, + { + id: 'scroll-to-top', + label: 'Scroll to Top', + icon: 'arrow-up', + }, { id: 'logout', label: 'Logout',