From 5775145a690e8feffa60161dbc8808dfd422ad0c Mon Sep 17 00:00:00 2001 From: erik-everardo Date: Mon, 27 Jan 2025 00:17:02 -0600 Subject: [PATCH] WIP posts en compose --- .../posting/posts/components/Post.kt | 126 ++++++++++++++++++ .../posting/posts/domain/entity/Post.kt | 6 +- 2 files changed, 129 insertions(+), 3 deletions(-) create mode 100644 app/src/main/java/com/isolaatti/posting/posts/components/Post.kt diff --git a/app/src/main/java/com/isolaatti/posting/posts/components/Post.kt b/app/src/main/java/com/isolaatti/posting/posts/components/Post.kt new file mode 100644 index 0000000..19c8114 --- /dev/null +++ b/app/src/main/java/com/isolaatti/posting/posts/components/Post.kt @@ -0,0 +1,126 @@ +package com.isolaatti.posting.posts.components + +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.aspectRatio +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.wrapContentHeight +import androidx.compose.foundation.layout.wrapContentSize +import androidx.compose.foundation.pager.HorizontalPager +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.icons.Icons +import androidx.compose.material3.Button +import androidx.compose.material3.Card +import androidx.compose.material3.FilledTonalButton +import androidx.compose.material3.FilledTonalIconButton +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.tooling.preview.Devices +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import coil3.compose.AsyncImage +import com.isolaatti.R +import com.isolaatti.posting.posts.domain.entity.Post +import com.isolaatti.utils.UrlGen.userProfileImage + +@Composable +fun Post( + post: Post, + onClick: () -> Unit = {}, + onLike: () -> Unit = {}, + onComments: () -> Unit = {}, + onShare: () -> Unit = {}, + onInfo: () -> Unit = {}, + onOptions: () -> Unit = {}, + onUsernameClick: () -> Unit = {} +) { + Card { + Row(modifier = Modifier.fillMaxWidth().padding(8.dp), verticalAlignment = Alignment.CenterVertically) { + AsyncImage( + model = userProfileImage(post.userId), + modifier = Modifier + .padding(horizontal = 4.dp) + .size(40.dp) + .clip(RoundedCornerShape(50)) + .clickable { + onUsernameClick() + }, + contentDescription = stringResource(R.string.profile_photo) + ) + Column(modifier = Modifier.weight(1f)) { + Box(Modifier.clickable { onUsernameClick() }){ + Text(post.userName, fontWeight = FontWeight.Bold, maxLines = 1, modifier = Modifier.padding(4.dp)) + } + Text(post.date, maxLines = 1, modifier = Modifier.padding(horizontal = 4.dp)) + } + FilledTonalIconButton(onClick = onOptions) { + Icon(painterResource(R.drawable.baseline_more_horiz_24), null) + } + } + + post.audio?.let { + // TODO audio player here + } + + Text(post.textContent, modifier = Modifier.padding(8.dp)) + + // TODO pager + if(post.images.isNotEmpty()) { + Box(Modifier.fillMaxWidth().aspectRatio(1f)) + } + + Row(modifier = Modifier.height(50.dp).padding(4.dp)) { + FilledTonalIconButton(onClick = onLike, modifier = Modifier.padding(4.dp).weight(1f)) { + Row(verticalAlignment = Alignment.CenterVertically) { + Icon(painterResource(R.drawable.hands_clapping_solid), null, modifier = Modifier.size(30.dp)) + Column(horizontalAlignment = Alignment.CenterHorizontally) { + Text("Clap") + Text(post.numberOfLikes.toString()) + } + } + } + FilledTonalIconButton(onClick = onComments, modifier = Modifier.padding(4.dp).weight(1f)) { + Row(verticalAlignment = Alignment.CenterVertically) { + Icon(painterResource(R.drawable.comments_solid), null, modifier = Modifier.size(30.dp)) + Column(horizontalAlignment = Alignment.CenterHorizontally) { + Text("Comments") + Text(post.numberOfComments.toString()) + } + } + } + FilledTonalIconButton(onClick = onShare, modifier = Modifier.padding(4.dp).weight(1f)) { + Row(verticalAlignment = Alignment.CenterVertically) { + Icon(painterResource(R.drawable.baseline_share_24), null, modifier = Modifier.size(30.dp)) + Text("Share") + } + } + FilledTonalIconButton(onClick = onInfo, modifier = Modifier.padding(4.dp)) { + Icon(painterResource(R.drawable.baseline_info_24), null) + } + } + + } +} + + +@Composable +@Preview(device = Devices.PIXEL_5) +fun PostPreview() { + Post(Post(id = 0L, textContent = "Test", userId = 1, privacy = 2, date = "Date", images = emptyList(), liked = false, userName = "Username", numberOfLikes = 1, numberOfComments = 2)) +} \ No newline at end of file diff --git a/app/src/main/java/com/isolaatti/posting/posts/domain/entity/Post.kt b/app/src/main/java/com/isolaatti/posting/posts/domain/entity/Post.kt index ef997ca..2480a66 100644 --- a/app/src/main/java/com/isolaatti/posting/posts/domain/entity/Post.kt +++ b/app/src/main/java/com/isolaatti/posting/posts/domain/entity/Post.kt @@ -14,12 +14,12 @@ data class Post( override val userId: Int, val privacy: Int, val date: String, - var audioId: String?, - val squadId: String?, + var audioId: String? = null, + val squadId: String? = null, var numberOfLikes: Int, var numberOfComments: Int, val userName: String, - val squadName: String?, + val squadName: String? = null, var liked: Boolean, val audio: Audio? = null, val images: List