You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
467 lines
17 KiB
467 lines
17 KiB
package com.gyf.csams.activity.ui
|
|
|
|
import android.os.Bundle
|
|
import androidx.activity.ComponentActivity
|
|
import androidx.activity.compose.setContent
|
|
import androidx.compose.foundation.Canvas
|
|
import androidx.compose.foundation.Image
|
|
import androidx.compose.foundation.border
|
|
import androidx.compose.foundation.layout.*
|
|
import androidx.compose.foundation.lazy.LazyColumn
|
|
import androidx.compose.foundation.lazy.rememberLazyListState
|
|
import androidx.compose.material.*
|
|
import androidx.compose.runtime.Composable
|
|
import androidx.compose.runtime.getValue
|
|
import androidx.compose.runtime.livedata.observeAsState
|
|
import androidx.compose.ui.Alignment
|
|
import androidx.compose.ui.Modifier
|
|
import androidx.compose.ui.res.painterResource
|
|
import androidx.compose.ui.unit.dp
|
|
import androidx.lifecycle.viewmodel.compose.viewModel
|
|
import androidx.navigation.compose.NavHost
|
|
import androidx.navigation.compose.composable
|
|
import com.gyf.csams.R
|
|
import com.gyf.csams.activity.model.*
|
|
import com.gyf.csams.uikit.*
|
|
import com.gyf.lib.uikit.Body
|
|
import com.gyf.lib.uikit.MainColumnFrame
|
|
import com.gyf.lib.uikit.ScaffoldModel
|
|
import com.gyf.lib.uikit.ShowSnackbar
|
|
import com.gyf.lib.util.format
|
|
import com.orhanobut.logger.Logger
|
|
|
|
/**
|
|
* 活动详情
|
|
*
|
|
*/
|
|
class ActivityDetailActivity : ComponentActivity() {
|
|
|
|
|
|
override fun onCreate(savedInstanceState: Bundle?) {
|
|
super.onCreate(savedInstanceState)
|
|
|
|
|
|
setContent {
|
|
Body { nav, scaffoldState ->
|
|
val model: ActivityDetailViewModel = viewModel()
|
|
val currentMenuName by model.currentMenu.observeAsState(ActivityDetailMenu.startMenu)
|
|
Column {
|
|
TextTopAppBar(
|
|
nav = nav,
|
|
currentMenuName = currentMenuName.menuName,
|
|
menuNames = ActivityDetailMenu.values()
|
|
)
|
|
NavHost(
|
|
navController = nav,
|
|
startDestination = ActivityDetailMenu.startMenu.name
|
|
) {
|
|
composable(ActivityDetailMenu.Info.name) {
|
|
Info()
|
|
ShowSnackbar(scaffoldState = scaffoldState)
|
|
model.clickMenu(ActivityDetailMenu.Info)
|
|
}
|
|
composable(ActivityDetailMenu.Photo.name) {
|
|
Photo()
|
|
ShowSnackbar(scaffoldState = scaffoldState)
|
|
model.clickMenu(ActivityDetailMenu.Photo)
|
|
}
|
|
composable(ActivityDetailMenu.Member.name) {
|
|
Member()
|
|
ShowSnackbar(scaffoldState = scaffoldState)
|
|
model.clickMenu(ActivityDetailMenu.Member)
|
|
}
|
|
composable(ActivityDetailMenu.BBS.name) {
|
|
BBS()
|
|
ShowSnackbar(scaffoldState = scaffoldState)
|
|
model.clickMenu(ActivityDetailMenu.BBS)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 底部按钮
|
|
*
|
|
* @param modifier
|
|
*/
|
|
@Composable
|
|
private fun BottomButton(
|
|
modifier: Modifier = Modifier,
|
|
model: ActivityInfoViewModel = viewModel(),
|
|
scaffoldModel: ScaffoldModel = viewModel()
|
|
) {
|
|
Row(modifier = modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceEvenly) {
|
|
OutlinedButton(onClick = { model.like { scaffoldModel.update(message = it) } }) {
|
|
Text(text = model.like)
|
|
}
|
|
OutlinedButton(onClick = { model.collect { scaffoldModel.update(message = it) } }) {
|
|
Text(text = model.collect)
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 活动信息
|
|
*
|
|
*/
|
|
@Composable
|
|
private fun Info() {
|
|
MainColumnFrame(background = {
|
|
Background(
|
|
image = BackgroundImage.ActivityInfo,
|
|
alpha = 0.7F
|
|
)
|
|
}) {
|
|
RectList(modifier = Modifier.weight(0.4F))
|
|
ActivityDesc(modifier = Modifier.weight(0.4F))
|
|
Spacer(modifier = Modifier.weight(0.05F))
|
|
BottomButton()
|
|
Spacer(modifier = Modifier.weight(0.05F))
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 活动基础信息
|
|
*
|
|
*/
|
|
@Composable
|
|
private fun RectList(
|
|
modifier: Modifier = Modifier,
|
|
model: ActivityInfoViewModel = viewModel()
|
|
) {
|
|
val activityDetailVo by model.activityDetailVo.observeAsState()
|
|
activityDetailVo?.let {
|
|
Card(modifier = modifier, backgroundColor = MaterialTheme.colors.background) {
|
|
Column(
|
|
modifier = Modifier.fillMaxSize(),
|
|
verticalArrangement = Arrangement.SpaceAround
|
|
) {
|
|
RectListItem(text = it.associationName)
|
|
RectListItem(text = it.activityName)
|
|
RectListItem(text = it.activityTime.format())
|
|
RectListItem(text = it.activityLocation)
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/**
|
|
* 列表项
|
|
*
|
|
* @param text
|
|
*/
|
|
@Composable
|
|
private fun RectListItem(text: String) {
|
|
Row(modifier = Modifier.fillMaxWidth()) {
|
|
val color = MaterialTheme.colors.secondaryVariant
|
|
val canvasSize = 30.dp
|
|
Box(modifier = Modifier.weight(0.5F), contentAlignment = Alignment.Center) {
|
|
Canvas(modifier = Modifier.size(canvasSize)) {
|
|
drawCircle(color = color)
|
|
}
|
|
}
|
|
Text(text = text, style = MaterialTheme.typography.h5, modifier = Modifier.weight(0.5F))
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 活动介绍
|
|
*
|
|
* @param modifier
|
|
* @param model
|
|
*/
|
|
@Composable
|
|
private fun ActivityDesc(
|
|
modifier: Modifier = Modifier,
|
|
model: ActivityInfoViewModel = viewModel()
|
|
) {
|
|
Column(modifier = modifier) {
|
|
val activityDetailVo by model.activityDetailVo.observeAsState()
|
|
activityDetailVo?.let {
|
|
DescCard(modifier = Modifier.weight(0.5F), content = it.activityDesc)
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 相册
|
|
*
|
|
*/
|
|
@Composable
|
|
private fun Photo(
|
|
model: ActivityPhotoViewModel = viewModel(),
|
|
scaffoldModel: ScaffoldModel = viewModel()
|
|
) {
|
|
MainColumnFrame(background = {
|
|
Background(
|
|
image = BackgroundImage.ActivityPhoto,
|
|
alpha = 0.7F
|
|
)
|
|
}) {
|
|
Row(modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.End) {
|
|
IconButton(onClick = { model.upload { scaffoldModel.update(message = it) } }) {
|
|
Icon(
|
|
painter = painterResource(id = R.drawable.ic_upload),
|
|
contentDescription = null
|
|
)
|
|
}
|
|
}
|
|
|
|
Spacer(modifier = Modifier.height(10.dp))
|
|
|
|
Box(
|
|
modifier = Modifier
|
|
.fillMaxSize()
|
|
.padding(10.dp)
|
|
.border(
|
|
width = 1.dp,
|
|
color = MaterialTheme.colors.background
|
|
)
|
|
) {
|
|
val listState = rememberLazyListState()
|
|
val photos by model.data.observeAsState()
|
|
photos?.let {
|
|
LazyColumn(state = listState) {
|
|
it.chunked(2).forEach {
|
|
item {
|
|
Spacer(modifier = Modifier.height(20.dp))
|
|
Row(
|
|
modifier = Modifier.fillMaxWidth(),
|
|
horizontalArrangement = Arrangement.SpaceEvenly
|
|
) {
|
|
Spacer(modifier = Modifier.weight(0.05F))
|
|
PhotoItem(vo = it[0], modifier = Modifier.weight(0.4F))
|
|
Spacer(modifier = Modifier.weight(0.1F))
|
|
if (it.size == 2) {
|
|
PhotoItem(vo = it[1], modifier = Modifier.weight(0.4F))
|
|
} else {
|
|
Spacer(modifier = Modifier.weight(0.4F))
|
|
}
|
|
Spacer(modifier = Modifier.weight(0.05F))
|
|
}
|
|
Spacer(modifier = Modifier.height(20.dp))
|
|
}
|
|
}
|
|
}
|
|
// Logger.i("totalItemsCount=${listState.layoutInfo.totalItemsCount},firstVisibleItemIndex=${listState.firstVisibleItemIndex}")
|
|
if (listState.layoutInfo.totalItemsCount - listState.firstVisibleItemIndex == model.initSize / 2 - 1) {
|
|
model.loadMore { scaffoldModel.update(message = it) }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
@Composable
|
|
private fun PhotoItem(modifier: Modifier = Modifier, vo: ActivityPhotoVo) {
|
|
// TODO 解决Build Warnning
|
|
Logger.i("$vo")
|
|
Box(
|
|
modifier = modifier.border(width = 1.dp, color = MaterialTheme.colors.onBackground),
|
|
contentAlignment = Alignment.Center
|
|
) {
|
|
Image(
|
|
painter = painterResource(id = R.drawable.ic_launcher_foreground),
|
|
contentDescription = null,
|
|
)
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 活动成员
|
|
*
|
|
*/
|
|
@Composable
|
|
private fun Member(
|
|
model: ActivityMemberViewModel = viewModel(),
|
|
scaffoldModel: ScaffoldModel = viewModel()
|
|
) {
|
|
MainColumnFrame(background = {
|
|
Background(
|
|
image = BackgroundImage.ActivityMember,
|
|
alpha = 0.7F
|
|
)
|
|
}) {
|
|
|
|
val data by model.allMember.observeAsState()
|
|
|
|
data?.apply {
|
|
Spacer(modifier = Modifier.height(5.dp))
|
|
Row(
|
|
modifier = Modifier
|
|
.fillMaxWidth()
|
|
.weight(0.2F), horizontalArrangement = Arrangement.Center
|
|
) {
|
|
Box(contentAlignment = Alignment.Center) {
|
|
Image(
|
|
painter = painterResource(id = R.drawable.persion_name_border),
|
|
contentDescription = null
|
|
)
|
|
Text(text = organizer.name)
|
|
}
|
|
}
|
|
Spacer(modifier = Modifier.height(5.dp))
|
|
|
|
|
|
Box(
|
|
modifier = Modifier
|
|
.fillMaxWidth()
|
|
.weight(0.8F)
|
|
.padding(10.dp)
|
|
.border(width = 1.dp, color = MaterialTheme.colors.onBackground)
|
|
) {
|
|
val listState = rememberLazyListState()
|
|
participant?.let {
|
|
LazyColumn(state = listState) {
|
|
it.chunked(2).forEach {
|
|
item {
|
|
Spacer(modifier = Modifier.height(10.dp))
|
|
Row(
|
|
modifier = Modifier.fillMaxWidth(),
|
|
horizontalArrangement = Arrangement.SpaceEvenly
|
|
) {
|
|
Spacer(modifier = Modifier.weight(0.05F))
|
|
Participant(vo = it[0], modifier = Modifier.weight(0.4F))
|
|
Spacer(modifier = Modifier.weight(0.1F))
|
|
if (it.size == 2) {
|
|
Participant(
|
|
vo = it[1],
|
|
modifier = Modifier.weight(0.4F)
|
|
)
|
|
} else {
|
|
Spacer(modifier = Modifier.weight(0.4F))
|
|
}
|
|
Spacer(modifier = Modifier.weight(0.05F))
|
|
}
|
|
Spacer(modifier = Modifier.height(10.dp))
|
|
}
|
|
}
|
|
}
|
|
// Logger.i("totalItemsCount=${listState.layoutInfo.totalItemsCount},firstVisibleItemIndex=${listState.firstVisibleItemIndex}")
|
|
if (listState.layoutInfo.totalItemsCount - listState.firstVisibleItemIndex == model.initSize / 2 - 1) {
|
|
model.loadMore { scaffoldModel.update(message = it) }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
@Composable
|
|
private fun Participant(modifier: Modifier = Modifier, vo: ActivityMemberVo) {
|
|
Box(modifier = modifier, contentAlignment = Alignment.Center) {
|
|
Image(
|
|
painter = painterResource(id = R.drawable.participant_border),
|
|
contentDescription = null,
|
|
// contentScale = ContentScale.FillBounds,
|
|
// modifier = Modifier.fillMaxSize()
|
|
)
|
|
Text(text = vo.name)
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 交流区
|
|
*
|
|
*/
|
|
@Composable
|
|
private fun BBS(model: BBSViewModel = viewModel(), scaffoldModel: ScaffoldModel = viewModel()) {
|
|
MainColumnFrame(background = {
|
|
Background(
|
|
image = BackgroundImage.ActivityBBS,
|
|
alpha = 0.7F
|
|
)
|
|
}) {
|
|
|
|
Row(
|
|
modifier = Modifier
|
|
.fillMaxWidth()
|
|
.padding(horizontal = 10.dp),
|
|
horizontalArrangement = Arrangement.End,
|
|
verticalAlignment = Alignment.CenterVertically
|
|
) {
|
|
// IconToggleButton(checked = false, onCheckedChange = { /*TODO*/ }) {
|
|
// Row(horizontalArrangement = Arrangement.SpaceEvenly) {
|
|
// Icon(painter = painterResource(id = R.drawable.ic_configuration), contentDescription = null)
|
|
// }
|
|
// }
|
|
// Text(text = "")
|
|
|
|
|
|
IconButton(onClick = { model.openDialog() }) {
|
|
Icon(
|
|
painter = painterResource(id = R.drawable.ic_editor),
|
|
contentDescription = null
|
|
)
|
|
}
|
|
}
|
|
|
|
SendComment(model = model)
|
|
|
|
Box(
|
|
modifier = Modifier
|
|
.weight(0.9F)
|
|
.padding(10.dp)
|
|
.border(width = 1.dp, color = MaterialTheme.colors.onBackground)
|
|
) {
|
|
val listState = rememberLazyListState()
|
|
val data by model.data.observeAsState()
|
|
LazyColumn(state = listState) {
|
|
data?.forEach {
|
|
item {
|
|
BBSItem(vo = it)
|
|
Spacer(modifier = Modifier.height(5.dp))
|
|
Divider(color = MaterialTheme.colors.onBackground)
|
|
}
|
|
}
|
|
}
|
|
// Logger.i("totalItemsCount=${listState.layoutInfo.totalItemsCount},firstVisibleItemIndex=${listState.firstVisibleItemIndex}")
|
|
if (listState.layoutInfo.totalItemsCount - listState.firstVisibleItemIndex == model.initSize / 2 - 1) {
|
|
model.loadMore { scaffoldModel.update(message = it) }
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
@Composable
|
|
private fun BBSItem(vo: BBSVo) {
|
|
Column {
|
|
Row(
|
|
modifier = Modifier
|
|
.fillMaxWidth()
|
|
.padding(10.dp)
|
|
) {
|
|
Card(
|
|
backgroundColor = MaterialTheme.colors.secondaryVariant,
|
|
modifier = Modifier.weight(0.5F)
|
|
) {
|
|
Column(
|
|
modifier = Modifier.height(50.dp),
|
|
verticalArrangement = Arrangement.SpaceEvenly
|
|
) {
|
|
Text(text = vo.name)
|
|
Text(text = vo.createTime.format())
|
|
}
|
|
}
|
|
Spacer(modifier = Modifier.weight(0.5F))
|
|
}
|
|
|
|
Card(
|
|
backgroundColor = MaterialTheme.colors.background,
|
|
modifier = Modifier.padding(10.dp)
|
|
) {
|
|
Text(
|
|
text = vo.content, modifier = Modifier
|
|
.fillMaxWidth()
|
|
.height(100.dp)
|
|
)
|
|
}
|
|
}
|
|
}
|
|
} |