44import * as React from 'react'
55
66// 🐨 wrap this in a React.forwardRef and accept `ref` as the second argument
7- function MessagesDisplay ( { messages} ) {
7+ const MessagesDisplay = React . forwardRef ( ( { messages} , ref ) => {
88 const containerRef = React . useRef ( )
99 React . useLayoutEffect ( ( ) => {
1010 scrollToBottom ( )
1111 } )
1212
13+ React . useImperativeHandle ( ref , ( ) => ( {
14+ scrollToBottom,
15+ scrollToTop,
16+ } ) )
17+
1318 // 💰 you're gonna want this as part of your imperative methods
14- // function scrollToTop() {
15- // containerRef.current.scrollTop = 0
16- // }
19+ function scrollToTop ( ) {
20+ containerRef . current . scrollTop = 0
21+ }
1722 function scrollToBottom ( ) {
1823 containerRef . current . scrollTop = containerRef . current . scrollHeight
1924 }
20-
2125 // 🐨 call useImperativeHandle here with your ref and a callback function
2226 // that returns an object with scrollToTop and scrollToBottom
2327
@@ -31,20 +35,22 @@ function MessagesDisplay({messages}) {
3135 ) ) }
3236 </ div >
3337 )
34- }
38+ } )
3539
3640function App ( ) {
3741 const messageDisplayRef = React . useRef ( )
3842 const [ messages , setMessages ] = React . useState ( allMessages . slice ( 0 , 8 ) )
39- const addMessage = ( ) =>
40- messages . length < allMessages . length
43+
44+ const addMessage = ( ) => {
45+ return messages . length < allMessages . length
4146 ? setMessages ( allMessages . slice ( 0 , messages . length + 1 ) )
4247 : null
43- const removeMessage = ( ) =>
44- messages . length > 0
48+ }
49+ const removeMessage = ( ) => {
50+ return messages . length > 0
4551 ? setMessages ( allMessages . slice ( 0 , messages . length - 1 ) )
4652 : null
47-
53+ }
4854 const scrollToTop = ( ) => messageDisplayRef . current . scrollToTop ( )
4955 const scrollToBottom = ( ) => messageDisplayRef . current . scrollToBottom ( )
5056
0 commit comments