@@ -52,8 +52,10 @@ import androidx.compose.runtime.Composable
5252import androidx.compose.runtime.CompositionLocalProvider
5353import androidx.compose.runtime.derivedStateOf
5454import androidx.compose.runtime.getValue
55+ import androidx.compose.runtime.mutableStateOf
5556import androidx.compose.runtime.remember
5657import androidx.compose.runtime.rememberCoroutineScope
58+ import androidx.compose.runtime.setValue
5759import androidx.compose.ui.Alignment
5860import androidx.compose.ui.Modifier
5961import androidx.compose.ui.draw.clip
@@ -68,6 +70,7 @@ import androidx.compose.ui.res.stringResource
6870import androidx.compose.ui.semantics.semantics
6971import androidx.compose.ui.tooling.preview.Preview
7072import androidx.compose.ui.unit.dp
73+ import com.example.compose.jetchat.FunctionalityNotAvailablePopup
7174import com.example.compose.jetchat.R
7275import com.example.compose.jetchat.components.JetchatAppBar
7376import com.example.compose.jetchat.data.exampleUiState
@@ -99,6 +102,7 @@ fun ConversationContent(
99102
100103 val scrollState = rememberLazyListState()
101104 val scope = rememberCoroutineScope()
105+
102106 Surface (modifier = modifier) {
103107 Box (modifier = Modifier .fillMaxSize()) {
104108 Column (Modifier .fillMaxSize()) {
@@ -143,6 +147,10 @@ fun ChannelNameBar(
143147 modifier : Modifier = Modifier ,
144148 onNavIconPressed : () -> Unit = { }
145149) {
150+ var functionalityNotAvailablePopupShown by remember { mutableStateOf(false ) }
151+ if (functionalityNotAvailablePopupShown) {
152+ FunctionalityNotAvailablePopup { functionalityNotAvailablePopupShown = false }
153+ }
146154 JetchatAppBar (
147155 modifier = modifier,
148156 onNavIconPressed = onNavIconPressed,
@@ -171,7 +179,7 @@ fun ChannelNameBar(
171179 Icon (
172180 imageVector = Icons .Outlined .Search ,
173181 modifier = Modifier
174- .clickable(onClick = {}) // TODO: Show not implemented dialog.
182+ .clickable(onClick = { functionalityNotAvailablePopupShown = true })
175183 .padding(horizontal = 12 .dp, vertical = 16 .dp)
176184 .height(24 .dp),
177185 contentDescription = stringResource(id = R .string.search)
@@ -180,7 +188,7 @@ fun ChannelNameBar(
180188 Icon (
181189 imageVector = Icons .Outlined .Info ,
182190 modifier = Modifier
183- .clickable(onClick = {}) // TODO: Show not implemented dialog.
191+ .clickable(onClick = { functionalityNotAvailablePopupShown = true })
184192 .padding(horizontal = 12 .dp, vertical = 16 .dp)
185193 .height(24 .dp),
186194 contentDescription = stringResource(id = R .string.info)
@@ -236,7 +244,7 @@ fun Messages(
236244
237245 item {
238246 Message (
239- onAuthorClick = { navigateToProfile(content.author ) },
247+ onAuthorClick = { name -> navigateToProfile(name ) },
240248 msg = content,
241249 isUserMe = content.author == authorMe,
242250 isFirstMessageByAuthor = isFirstMessageByAuthor,
@@ -265,9 +273,7 @@ fun Messages(
265273 enabled = jumpToBottomButtonEnabled,
266274 onClicked = {
267275 scope.launch {
268- // TODO: Replace with animateScrollToItem
269- // https://issuetracker.google.com/181316785
270- scrollState.scrollToItem(0 )
276+ scrollState.animateScrollToItem(0 )
271277 }
272278 },
273279 modifier = Modifier .align(Alignment .BottomCenter )
@@ -277,18 +283,12 @@ fun Messages(
277283
278284@Composable
279285fun Message (
280- onAuthorClick : () -> Unit ,
286+ onAuthorClick : (String ) -> Unit ,
281287 msg : Message ,
282288 isUserMe : Boolean ,
283289 isFirstMessageByAuthor : Boolean ,
284290 isLastMessageByAuthor : Boolean
285291) {
286- // TODO: get image from msg.author
287- val painter = if (isUserMe) {
288- painterResource(id = R .drawable.ali)
289- } else {
290- painterResource(id = R .drawable.someone_else)
291- }
292292 val borderColor = if (isUserMe) {
293293 MaterialTheme .colors.primary
294294 } else {
@@ -301,14 +301,14 @@ fun Message(
301301 // Avatar
302302 Image (
303303 modifier = Modifier
304- .clickable(onClick = onAuthorClick)
304+ .clickable(onClick = { onAuthorClick(msg.author) } )
305305 .padding(horizontal = 16 .dp)
306306 .size(42 .dp)
307307 .border(1.5 .dp, borderColor, CircleShape )
308308 .border(3 .dp, MaterialTheme .colors.surface, CircleShape )
309309 .clip(CircleShape )
310310 .align(Alignment .Top ),
311- painter = painter ,
311+ painter = painterResource(id = msg.authorImage) ,
312312 contentScale = ContentScale .Crop ,
313313 contentDescription = null ,
314314 )
@@ -320,6 +320,7 @@ fun Message(
320320 msg = msg,
321321 isFirstMessageByAuthor = isFirstMessageByAuthor,
322322 isLastMessageByAuthor = isLastMessageByAuthor,
323+ authorClicked = onAuthorClick,
323324 modifier = Modifier
324325 .padding(end = 16 .dp)
325326 .weight(1f )
@@ -332,13 +333,14 @@ fun AuthorAndTextMessage(
332333 msg : Message ,
333334 isFirstMessageByAuthor : Boolean ,
334335 isLastMessageByAuthor : Boolean ,
336+ authorClicked : (String ) -> Unit ,
335337 modifier : Modifier = Modifier
336338) {
337339 Column (modifier = modifier) {
338340 if (isLastMessageByAuthor) {
339341 AuthorNameTimestamp (msg)
340342 }
341- ChatItemBubble (msg, isFirstMessageByAuthor)
343+ ChatItemBubble (msg, isFirstMessageByAuthor, authorClicked = authorClicked )
342344 if (isFirstMessageByAuthor) {
343345 // Last bubble before next author
344346 Spacer (modifier = Modifier .height(8 .dp))
@@ -406,7 +408,8 @@ private fun RowScope.DayHeaderLine() {
406408@Composable
407409fun ChatItemBubble (
408410 message : Message ,
409- lastMessageByAuthor : Boolean
411+ lastMessageByAuthor : Boolean ,
412+ authorClicked : (String ) -> Unit
410413) {
411414
412415 val backgroundBubbleColor =
@@ -420,7 +423,8 @@ fun ChatItemBubble(
420423 Column {
421424 Surface (color = backgroundBubbleColor, shape = bubbleShape) {
422425 ClickableMessage (
423- message = message
426+ message = message,
427+ authorClicked = authorClicked
424428 )
425429 }
426430
@@ -439,7 +443,7 @@ fun ChatItemBubble(
439443}
440444
441445@Composable
442- fun ClickableMessage (message : Message ) {
446+ fun ClickableMessage (message : Message , authorClicked : ( String ) -> Unit ) {
443447 val uriHandler = LocalUriHandler .current
444448
445449 val styledMessage = messageFormatter(text = message.content)
@@ -455,8 +459,7 @@ fun ClickableMessage(message: Message) {
455459 ?.let { annotation ->
456460 when (annotation.tag) {
457461 SymbolAnnotationType .LINK .name -> uriHandler.openUri(annotation.item)
458- // TODO(yrezgui): Open profile screen when click PERSON tag
459- // (e.g. @aliconors)
462+ SymbolAnnotationType .PERSON .name -> authorClicked(annotation.item)
460463 else -> Unit
461464 }
462465 }
0 commit comments