package com.socialapp.presentation.ui.screens 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.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize 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.width import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyRow import androidx.compose.foundation.lazy.items import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.FavoriteBorder import androidx.compose.material.icons.filled.Favorite import androidx.compose.material.icons.filled.ChatBubbleOutline import androidx.compose.material.icons.filled.Share import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text 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.layout.ContentScale import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.hilt.navigation.compose.hiltViewModel import coil.compose.AsyncImage import com.socialapp.data.api.Post import com.socialapp.data.api.Story import com.socialapp.presentation.ui.theme.AccentMagenta import com.socialapp.presentation.ui.theme.PrimaryBlue import com.socialapp.presentation.viewmodel.PostViewModel @Composable fun HomeScreen( viewModel: PostViewModel = hiltViewModel(), onPostClick: (Int) -> Unit = {}, onProfileClick: (Int) -> Unit = {} ) { val posts = viewModel.posts.value val isLoading = viewModel.isLoading.value Column( modifier = Modifier .fillMaxSize() .background(MaterialTheme.colorScheme.background) ) { // Header with Logo and Icons Row( modifier = Modifier .fillMaxWidth() .padding(16.dp), horizontalArrangement = androidx.compose.foundation.layout.Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically ) { Text( text = "Hopenity", fontSize = 28.sp, fontWeight = FontWeight.Bold, color = AccentMagenta ) Row( horizontalArrangement = androidx.compose.foundation.layout.Arrangement.spacedBy(12.dp) ) { IconButton(onClick = { /* Location */ }, modifier = Modifier.size(36.dp)) { Icon( imageVector = Icons.Default.FavoriteBorder, contentDescription = "Location", tint = MaterialTheme.colorScheme.onBackground, modifier = Modifier.size(20.dp) ) } IconButton(onClick = { /* Search */ }, modifier = Modifier.size(36.dp)) { Icon( imageVector = Icons.Default.ChatBubbleOutline, contentDescription = "Search", tint = MaterialTheme.colorScheme.onBackground, modifier = Modifier.size(20.dp) ) } } } // Category Pills LazyRow( modifier = Modifier .fillMaxWidth() .padding(horizontal = 8.dp), contentPadding = PaddingValues(horizontal = 8.dp), horizontalArrangement = androidx.compose.foundation.layout.Arrangement.spacedBy(8.dp) ) { items(listOf("Feed", "Nearby", "Art & Creativity", "Astrology & Spirituality")) { category -> CategoryPill( text = category, isSelected = category == "Feed" ) } } Spacer(modifier = Modifier.height(12.dp)) LazyColumn( modifier = Modifier.fillMaxSize(), contentPadding = PaddingValues(vertical = 8.dp) ) { // What's on your mind input item { WhatsOnYourMindRow(onPostClick = { onPostClick(-1) }) Spacer(modifier = Modifier.height(16.dp)) } // Story Ring item { StoryRingRow(onStoryClick = { /* Handle story click */ }) Spacer(modifier = Modifier.height(16.dp)) } // Posts Feed items(posts) { post -> PostCard( post = post, onLikeClick = { if (post.isLiked) { viewModel.unlikePost(post.id) } else { viewModel.likePost(post.id) } }, onCommentClick = { onPostClick(post.id) }, onProfileClick = { onProfileClick(post.userId) } ) Spacer(modifier = Modifier.height(12.dp)) } // Load More Button if (!isLoading && posts.isNotEmpty()) { item { Box( modifier = Modifier .fillMaxWidth() .padding(16.dp) .clickable { viewModel.loadMorePosts() }, contentAlignment = Alignment.Center ) { Text("Load More Posts", color = PrimaryBlue) } } } } } } @Composable private fun CategoryPill(text: String, isSelected: Boolean) { Box( modifier = Modifier .clip(RoundedCornerShape(20.dp)) .background( if (isSelected) MaterialTheme.colorScheme.onBackground.copy(alpha = 0.2f) else MaterialTheme.colorScheme.surface ) .padding(horizontal = 16.dp, vertical = 8.dp), contentAlignment = Alignment.Center ) { Text( text = text, fontSize = 13.sp, color = if (isSelected) MaterialTheme.colorScheme.onBackground else MaterialTheme.colorScheme.onSurface.copy(alpha = 0.6f), fontWeight = if (isSelected) FontWeight.SemiBold else FontWeight.Normal ) } } @Composable private fun WhatsOnYourMindRow(onPostClick: () -> Unit) { Row( modifier = Modifier .fillMaxWidth() .padding(horizontal = 12.dp), verticalAlignment = Alignment.CenterVertically, horizontalArrangement = androidx.compose.foundation.layout.Arrangement.spacedBy(8.dp) ) { // Profile Avatar Box( modifier = Modifier .size(40.dp) .clip(CircleShape) .background(AccentMagenta.copy(alpha = 0.3f)), contentAlignment = Alignment.Center ) { Text( text = "U", fontSize = 18.sp, fontWeight = FontWeight.Bold, color = AccentMagenta ) } // Input Field Box( modifier = Modifier .weight(1f) .height(40.dp) .clip(RoundedCornerShape(20.dp)) .background(MaterialTheme.colorScheme.surface) .clickable { onPostClick() } .padding(horizontal = 12.dp), contentAlignment = Alignment.CenterStart ) { Text( text = "What's on your mind?", fontSize = 13.sp, color = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.5f) ) } // Image Icon IconButton(onClick = { /* Pick image */ }, modifier = Modifier.size(40.dp)) { Icon( imageVector = Icons.Default.FavoriteBorder, contentDescription = "Add Image", tint = PrimaryBlue, modifier = Modifier.size(20.dp) ) } } } @Composable private fun StoryRingRow(onStoryClick: (Int) -> Unit) { // Mock stories for now val mockStories = listOf( Story(1, 1, "User1", null, "", "", ""), Story(2, 2, "User2", null, "", "", ""), Story(3, 3, "User3", null, "", "", ""), Story(4, 4, "User4", null, "", "", ""), ) LazyRow( modifier = Modifier .fillMaxWidth() .padding(horizontal = 8.dp), contentPadding = PaddingValues(horizontal = 8.dp), horizontalArrangement = androidx.compose.foundation.layout.Arrangement.spacedBy(8.dp) ) { items(mockStories) { story -> StoryAvatar( name = story.username, onStoryClick = { onStoryClick(story.id) } ) } } } @Composable private fun StoryAvatar(name: String, onStoryClick: () -> Unit) { Column( modifier = Modifier .width(80.dp) .clickable { onStoryClick() }, horizontalAlignment = Alignment.CenterHorizontally ) { Box( modifier = Modifier .size(64.dp) .clip(CircleShape) .background(AccentMagenta) .padding(2.dp) .clip(CircleShape) .background(MaterialTheme.colorScheme.background), contentAlignment = Alignment.Center ) { Box( modifier = Modifier .size(60.dp) .clip(CircleShape) .background(AccentMagenta.copy(alpha = 0.3f)) ) } Spacer(modifier = Modifier.height(4.dp)) Text( text = name, fontSize = 10.sp, maxLines = 1, overflow = TextOverflow.Ellipsis, modifier = Modifier.width(64.dp) ) } } @Composable fun PostCard( post: Post, onLikeClick: () -> Unit, onCommentClick: () -> Unit, onProfileClick: () -> Unit ) { Column( modifier = Modifier .fillMaxWidth() .padding(horizontal = 8.dp) .clip(RoundedCornerShape(20.dp)) .background(MaterialTheme.colorScheme.surface) ) { // Post Header Row( modifier = Modifier .fillMaxWidth() .padding(12.dp), verticalAlignment = Alignment.CenterVertically ) { Box( modifier = Modifier .size(40.dp) .clip(CircleShape) .background(PrimaryBlue) .clickable { onProfileClick() } ) Spacer(modifier = Modifier.width(12.dp)) Column(modifier = Modifier.weight(1f)) { Text( text = post.username, fontWeight = FontWeight.SemiBold, fontSize = 14.sp ) Text( text = "Just now", fontSize = 12.sp, color = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.6f) ) } } // Post Content if (post.content.isNotEmpty()) { Text( text = post.content, modifier = Modifier.padding(horizontal = 12.dp), fontSize = 14.sp ) } // Post Media if (!post.mediaUrl.isNullOrEmpty()) { Spacer(modifier = Modifier.height(8.dp)) Box( modifier = Modifier .fillMaxWidth() .height(300.dp) .background(MaterialTheme.colorScheme.onBackground.copy(alpha = 0.1f)), contentAlignment = Alignment.Center ) { AsyncImage( model = post.mediaUrl.firstOrNull(), contentDescription = null, modifier = Modifier.fillMaxSize(), contentScale = ContentScale.Crop ) } } // Engagement Metrics Row( modifier = Modifier .fillMaxWidth() .padding(12.dp), horizontalArrangement = androidx.compose.foundation.layout.Arrangement.SpaceBetween ) { Text( text = "${post.likesCount} Likes", fontSize = 12.sp, color = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.6f) ) Text( text = "${post.commentsCount} Comments", fontSize = 12.sp, color = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.6f) ) } // Action Buttons Row( modifier = Modifier .fillMaxWidth() .padding(horizontal = 4.dp), horizontalArrangement = androidx.compose.foundation.layout.Arrangement.SpaceEvenly ) { IconButton(onClick = onLikeClick) { Icon( imageVector = if (post.isLiked) Icons.Filled.Favorite else Icons.Default.FavoriteBorder, contentDescription = "Like", tint = if (post.isLiked) AccentMagenta else MaterialTheme.colorScheme.onSurface, modifier = Modifier.size(20.dp) ) } IconButton(onClick = onCommentClick) { Icon( imageVector = Icons.Default.ChatBubbleOutline, contentDescription = "Comment", tint = MaterialTheme.colorScheme.onSurface, modifier = Modifier.size(20.dp) ) } IconButton(onClick = { /* Share */ }) { Icon( imageVector = Icons.Default.Share, contentDescription = "Share", tint = MaterialTheme.colorScheme.onSurface, modifier = Modifier.size(20.dp) ) } } } }