|
@@ -3,46 +3,60 @@ package com.zaojiao.app.feat.home.course
|
|
|
import androidx.compose.foundation.ExperimentalFoundationApi
|
|
|
import androidx.compose.foundation.Image
|
|
|
import androidx.compose.foundation.background
|
|
|
+import androidx.compose.foundation.border
|
|
|
+import androidx.compose.foundation.gestures.Orientation
|
|
|
+import androidx.compose.foundation.gestures.scrollable
|
|
|
import androidx.compose.foundation.layout.Arrangement
|
|
|
import androidx.compose.foundation.layout.Box
|
|
|
import androidx.compose.foundation.layout.Column
|
|
|
import androidx.compose.foundation.layout.ColumnScope
|
|
|
import androidx.compose.foundation.layout.Row
|
|
|
import androidx.compose.foundation.layout.RowScope
|
|
|
+import androidx.compose.foundation.layout.absoluteOffset
|
|
|
import androidx.compose.foundation.layout.aspectRatio
|
|
|
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.requiredSize
|
|
|
import androidx.compose.foundation.layout.size
|
|
|
import androidx.compose.foundation.layout.width
|
|
|
import androidx.compose.foundation.layout.wrapContentHeight
|
|
|
+import androidx.compose.foundation.layout.wrapContentSize
|
|
|
import androidx.compose.foundation.layout.wrapContentWidth
|
|
|
import androidx.compose.foundation.pager.rememberPagerState
|
|
|
+import androidx.compose.foundation.rememberScrollState
|
|
|
import androidx.compose.foundation.shape.RoundedCornerShape
|
|
|
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.alpha
|
|
|
import androidx.compose.ui.draw.clip
|
|
|
import androidx.compose.ui.geometry.Size
|
|
|
+import androidx.compose.ui.graphics.Brush
|
|
|
import androidx.compose.ui.graphics.Color
|
|
|
import androidx.compose.ui.res.painterResource
|
|
|
import androidx.compose.ui.text.TextStyle
|
|
|
import androidx.compose.ui.text.font.FontWeight
|
|
|
+import androidx.compose.ui.text.style.TextDecoration
|
|
|
import androidx.compose.ui.unit.dp
|
|
|
import androidx.compose.ui.unit.sp
|
|
|
+import com.zaojiao.app.data.model.groupbuy.GroupBuyModel
|
|
|
import com.zaojiao.app.data.model.micropage.MicroPageImageModelItem
|
|
|
-import com.zaojiao.app.feat.home.R
|
|
|
import com.zaojiao.app.feat.design.Colors
|
|
|
import com.zaojiao.app.feat.design.Expanded
|
|
|
import com.zaojiao.app.feat.design.Icons
|
|
|
+import com.zaojiao.app.feat.design.Images
|
|
|
import com.zaojiao.app.feat.design.LJGBanner
|
|
|
import com.zaojiao.app.feat.design.Spacer
|
|
|
+import com.zaojiao.app.feat.home.R
|
|
|
|
|
|
@Composable
|
|
|
internal fun HomeCourseGroupBuy(
|
|
|
activityList: List<MicroPageImageModelItem>,
|
|
|
+ totalCount: Int,
|
|
|
+ groupBuyList: List<GroupBuyModel>,
|
|
|
) {
|
|
|
Row(
|
|
|
modifier = Modifier
|
|
@@ -52,7 +66,7 @@ internal fun HomeCourseGroupBuy(
|
|
|
) {
|
|
|
HomeCourseGroupBuySwiper(activityList)
|
|
|
Spacer(width = 10.dp)
|
|
|
- HomeCourseGroupBuyRecommend()
|
|
|
+ HomeCourseGroupBuyRecommend(totalCount, groupBuyList)
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -108,7 +122,10 @@ private fun RowScope.HomeCourseGroupBuySwiper(
|
|
|
}
|
|
|
|
|
|
@Composable
|
|
|
-private fun RowScope.HomeCourseGroupBuyRecommend() {
|
|
|
+private fun RowScope.HomeCourseGroupBuyRecommend(
|
|
|
+ totalCount: Int,
|
|
|
+ groupBuyList: List<GroupBuyModel>,
|
|
|
+) {
|
|
|
Box(
|
|
|
modifier = Modifier
|
|
|
.weight(1f)
|
|
@@ -121,15 +138,17 @@ private fun RowScope.HomeCourseGroupBuyRecommend() {
|
|
|
Column(
|
|
|
modifier = Modifier.fillMaxSize(),
|
|
|
) {
|
|
|
- HomeCourseGroupBuyRecommendTitle()
|
|
|
+ HomeCourseGroupBuyRecommendTitle(totalCount)
|
|
|
Spacer(height = 10.dp)
|
|
|
- HomeCourseGroupBuyRecommendBody()
|
|
|
+ HomeCourseGroupBuyRecommendBody(groupBuyList)
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@Composable
|
|
|
-private fun ColumnScope.HomeCourseGroupBuyRecommendTitle() {
|
|
|
+private fun ColumnScope.HomeCourseGroupBuyRecommendTitle(
|
|
|
+ totalCount: Int,
|
|
|
+) {
|
|
|
Row(
|
|
|
modifier = Modifier
|
|
|
.weight(1f)
|
|
@@ -150,7 +169,7 @@ private fun ColumnScope.HomeCourseGroupBuyRecommendTitle() {
|
|
|
verticalAlignment = Alignment.CenterVertically,
|
|
|
) {
|
|
|
Text(
|
|
|
- text = "22款上线",
|
|
|
+ text = "${totalCount}款上线",
|
|
|
style = TextStyle(
|
|
|
fontSize = 10.sp,
|
|
|
lineHeight = 11.sp,
|
|
@@ -160,9 +179,9 @@ private fun ColumnScope.HomeCourseGroupBuyRecommendTitle() {
|
|
|
)
|
|
|
Spacer(width = 2.dp)
|
|
|
Icons.Forward(
|
|
|
- size = Size(4f, 6f),
|
|
|
+ size = Size(2f, 5f),
|
|
|
color = Colors.from("#FFFB6C07"),
|
|
|
- width = 0.5.dp,
|
|
|
+ width = 1.dp,
|
|
|
)
|
|
|
}
|
|
|
Spacer(width = 11.dp)
|
|
@@ -170,7 +189,9 @@ private fun ColumnScope.HomeCourseGroupBuyRecommendTitle() {
|
|
|
}
|
|
|
|
|
|
@Composable
|
|
|
-private fun HomeCourseGroupBuyRecommendBody() {
|
|
|
+private fun HomeCourseGroupBuyRecommendBody(
|
|
|
+ groupBuyList: List<GroupBuyModel>,
|
|
|
+) {
|
|
|
Column(
|
|
|
modifier = Modifier
|
|
|
.padding(horizontal = 11.dp)
|
|
@@ -186,16 +207,120 @@ private fun HomeCourseGroupBuyRecommendBody() {
|
|
|
) {
|
|
|
Box(
|
|
|
modifier = Modifier
|
|
|
- .background(color = Color.Blue)
|
|
|
.width(64.dp)
|
|
|
- .height(64.dp),
|
|
|
- )
|
|
|
+ .height(64.dp)
|
|
|
+ .padding(vertical = 2.dp),
|
|
|
+ ) {
|
|
|
+ if (groupBuyList.isNotEmpty()) {
|
|
|
+ Column(
|
|
|
+ modifier = Modifier.fillMaxSize(),
|
|
|
+ verticalArrangement = Arrangement.SpaceBetween,
|
|
|
+ ) {
|
|
|
+ Box(
|
|
|
+ modifier = Modifier
|
|
|
+ .background(
|
|
|
+ brush = Brush.horizontalGradient(
|
|
|
+ colors = listOf(
|
|
|
+ Colors.from("#FFFF9957"),
|
|
|
+ Colors.from("#FFFF7979")
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ shape = RoundedCornerShape(4.dp),
|
|
|
+ )
|
|
|
+ .padding(bottom = 1.dp)
|
|
|
+ .padding(horizontal = 4.dp)
|
|
|
+ .wrapContentSize()
|
|
|
+ ) {
|
|
|
+ Text(
|
|
|
+ text = "¥${groupBuyList[0].population}人拼团价",
|
|
|
+ style = TextStyle(
|
|
|
+ color = Color.White,
|
|
|
+ fontSize = 10.sp,
|
|
|
+ lineHeight = 12.sp,
|
|
|
+ ),
|
|
|
+ )
|
|
|
+ }
|
|
|
+ Spacer(height = 4.dp)
|
|
|
+ Row(
|
|
|
+ modifier = Modifier.wrapContentSize(),
|
|
|
+ verticalAlignment = Alignment.Bottom,
|
|
|
+ ) {
|
|
|
+ Text(
|
|
|
+ text = "¥${groupBuyList[0].groupMinPrice}",
|
|
|
+ style = TextStyle(
|
|
|
+ color = Colors.from("#FFFB6C07"),
|
|
|
+ fontSize = 14.sp,
|
|
|
+ lineHeight = 17.sp,
|
|
|
+ fontWeight = FontWeight.Medium,
|
|
|
+ ),
|
|
|
+ )
|
|
|
+ Text(
|
|
|
+ text = "¥${groupBuyList[0].originalPrice}",
|
|
|
+ style = TextStyle(
|
|
|
+ color = Colors.from("#FFB1B1B1"),
|
|
|
+ fontSize = 10.sp,
|
|
|
+ lineHeight = 12.sp,
|
|
|
+ fontWeight = FontWeight.Normal,
|
|
|
+ textDecoration = TextDecoration.LineThrough,
|
|
|
+ ),
|
|
|
+ )
|
|
|
+ }
|
|
|
+ Expanded()
|
|
|
+ Row(
|
|
|
+ modifier = Modifier
|
|
|
+ .scrollable(
|
|
|
+ state = rememberScrollState(),
|
|
|
+ orientation = Orientation.Horizontal,
|
|
|
+ )
|
|
|
+ .wrapContentHeight()
|
|
|
+ .wrapContentWidth(unbounded = true),
|
|
|
+ ) {
|
|
|
+ val users = groupBuyList[0].userList
|
|
|
+
|
|
|
+ val opacityList = List(users.size) {
|
|
|
+ 0.4f + 0.6f * it.toFloat() / users.size
|
|
|
+ }
|
|
|
+
|
|
|
+ repeat(users.size) {
|
|
|
+ Images.Network(
|
|
|
+ url = users[it].avatar,
|
|
|
+ modifier = Modifier
|
|
|
+ .absoluteOffset(
|
|
|
+ x = -(it * 5).dp,
|
|
|
+ )
|
|
|
+ .alpha(opacityList[it])
|
|
|
+ .border(
|
|
|
+ width = 0.5.dp,
|
|
|
+ brush = Brush.horizontalGradient(
|
|
|
+ colors = listOf(
|
|
|
+ Colors.from("#FFFF6141"),
|
|
|
+ Colors.from("#00FF4D46")
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ shape = RoundedCornerShape(15.dp),
|
|
|
+ )
|
|
|
+ .clip(shape = RoundedCornerShape(15.dp))
|
|
|
+ .requiredSize(14.dp),
|
|
|
+ )
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
Box(
|
|
|
modifier = Modifier
|
|
|
- .background(color = Color.Blue)
|
|
|
.width(64.dp)
|
|
|
.height(64.dp),
|
|
|
- )
|
|
|
+ ) {
|
|
|
+ if (groupBuyList.isNotEmpty()) {
|
|
|
+ Images.Network(
|
|
|
+ url = groupBuyList[0].productImage,
|
|
|
+ modifier = Modifier
|
|
|
+ .clip(RoundedCornerShape(10.dp))
|
|
|
+ .size(64.dp),
|
|
|
+ )
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
Spacer(height = 15.dp)
|
|
|
Row(
|
|
@@ -206,16 +331,76 @@ private fun HomeCourseGroupBuyRecommendBody() {
|
|
|
) {
|
|
|
Box(
|
|
|
modifier = Modifier
|
|
|
- .background(color = Color.Blue)
|
|
|
.width(64.dp)
|
|
|
.height(74.5.dp),
|
|
|
- )
|
|
|
+ ) {
|
|
|
+ if (groupBuyList.size >= 2) {
|
|
|
+ Images.Network(
|
|
|
+ url = groupBuyList[1].productImage,
|
|
|
+ modifier = Modifier
|
|
|
+ .align(Alignment.TopCenter)
|
|
|
+ .clip(RoundedCornerShape(10.dp))
|
|
|
+ .size(64.dp),
|
|
|
+ )
|
|
|
+ Box(
|
|
|
+ modifier = Modifier
|
|
|
+ .border(
|
|
|
+ width = 1.dp,
|
|
|
+ color = Colors.from("#FFFB6C07"),
|
|
|
+ shape = RoundedCornerShape(100.dp),
|
|
|
+ )
|
|
|
+ .padding(horizontal = 8.dp, vertical = 2.dp)
|
|
|
+ .align(Alignment.BottomCenter)
|
|
|
+ .wrapContentSize(),
|
|
|
+ ) {
|
|
|
+ Text(
|
|
|
+ text = "¥${groupBuyList[1].groupMinPrice}",
|
|
|
+ style = TextStyle(
|
|
|
+ color = Colors.from("#FFFB6C07"),
|
|
|
+ fontSize = 14.sp,
|
|
|
+ lineHeight = 17.sp,
|
|
|
+ fontWeight = FontWeight.Medium,
|
|
|
+ ),
|
|
|
+ )
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
Box(
|
|
|
modifier = Modifier
|
|
|
- .background(color = Color.Blue)
|
|
|
.width(64.dp)
|
|
|
.height(74.5.dp),
|
|
|
- )
|
|
|
+ ) {
|
|
|
+ if (groupBuyList.size >= 3) {
|
|
|
+ Images.Network(
|
|
|
+ url = groupBuyList[2].productImage,
|
|
|
+ modifier = Modifier
|
|
|
+ .align(Alignment.TopCenter)
|
|
|
+ .clip(RoundedCornerShape(10.dp))
|
|
|
+ .size(64.dp),
|
|
|
+ )
|
|
|
+ Box(
|
|
|
+ modifier = Modifier
|
|
|
+ .border(
|
|
|
+ width = 1.dp,
|
|
|
+ color = Colors.from("#FFFB6C07"),
|
|
|
+ shape = RoundedCornerShape(100.dp),
|
|
|
+ )
|
|
|
+ .padding(horizontal = 8.dp, vertical = 2.dp)
|
|
|
+ .align(Alignment.BottomCenter)
|
|
|
+ .wrapContentSize(),
|
|
|
+ ) {
|
|
|
+ Text(
|
|
|
+ text = "¥${groupBuyList[2].groupMinPrice}",
|
|
|
+ style = TextStyle(
|
|
|
+ color = Colors.from("#FFFB6C07"),
|
|
|
+ fontSize = 14.sp,
|
|
|
+ lineHeight = 17.sp,
|
|
|
+ fontWeight = FontWeight.Medium,
|
|
|
+ ),
|
|
|
+ )
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|