|
@@ -3,7 +3,6 @@ package com.iscs.bozzys.ui.pages.message
|
|
|
import android.content.Context
|
|
import android.content.Context
|
|
|
import android.content.Intent
|
|
import android.content.Intent
|
|
|
import androidx.compose.foundation.background
|
|
import androidx.compose.foundation.background
|
|
|
-import androidx.compose.foundation.border
|
|
|
|
|
import androidx.compose.foundation.clickable
|
|
import androidx.compose.foundation.clickable
|
|
|
import androidx.compose.foundation.layout.Box
|
|
import androidx.compose.foundation.layout.Box
|
|
|
import androidx.compose.foundation.layout.Column
|
|
import androidx.compose.foundation.layout.Column
|
|
@@ -23,12 +22,14 @@ import androidx.compose.foundation.lazy.rememberLazyListState
|
|
|
import androidx.compose.foundation.shape.RoundedCornerShape
|
|
import androidx.compose.foundation.shape.RoundedCornerShape
|
|
|
import androidx.compose.material3.ExperimentalMaterial3Api
|
|
import androidx.compose.material3.ExperimentalMaterial3Api
|
|
|
import androidx.compose.material3.Icon
|
|
import androidx.compose.material3.Icon
|
|
|
|
|
+import androidx.compose.material3.MaterialTheme
|
|
|
import androidx.compose.material3.Text
|
|
import androidx.compose.material3.Text
|
|
|
import androidx.compose.material3.pulltorefresh.PullToRefreshBox
|
|
import androidx.compose.material3.pulltorefresh.PullToRefreshBox
|
|
|
import androidx.compose.runtime.Composable
|
|
import androidx.compose.runtime.Composable
|
|
|
|
|
+import androidx.compose.runtime.LaunchedEffect
|
|
|
|
|
+import androidx.compose.runtime.collectAsState
|
|
|
import androidx.compose.runtime.derivedStateOf
|
|
import androidx.compose.runtime.derivedStateOf
|
|
|
import androidx.compose.runtime.getValue
|
|
import androidx.compose.runtime.getValue
|
|
|
-import androidx.compose.runtime.mutableStateOf
|
|
|
|
|
import androidx.compose.runtime.remember
|
|
import androidx.compose.runtime.remember
|
|
|
import androidx.compose.ui.Alignment
|
|
import androidx.compose.ui.Alignment
|
|
|
import androidx.compose.ui.Modifier
|
|
import androidx.compose.ui.Modifier
|
|
@@ -41,9 +42,18 @@ import androidx.compose.ui.text.style.TextAlign
|
|
|
import androidx.compose.ui.text.style.TextOverflow
|
|
import androidx.compose.ui.text.style.TextOverflow
|
|
|
import androidx.compose.ui.unit.dp
|
|
import androidx.compose.ui.unit.dp
|
|
|
import androidx.compose.ui.unit.sp
|
|
import androidx.compose.ui.unit.sp
|
|
|
|
|
+import androidx.lifecycle.viewmodel.compose.viewModel
|
|
|
import com.iscs.bozzys.R
|
|
import com.iscs.bozzys.R
|
|
|
|
|
+import com.iscs.bozzys.api.Message
|
|
|
|
|
+import com.iscs.bozzys.ui.common.Empty
|
|
|
import com.iscs.bozzys.ui.common.PageBase
|
|
import com.iscs.bozzys.ui.common.PageBase
|
|
|
|
|
+import com.iscs.bozzys.ui.common.TipsDialog
|
|
|
|
|
+import com.iscs.bozzys.ui.pages.compose.CardContainer
|
|
|
|
|
+import com.iscs.bozzys.ui.pages.vm.StatePageMessage
|
|
|
|
|
+import com.iscs.bozzys.ui.pages.vm.VMMessage
|
|
|
import com.iscs.bozzys.ui.theme.Text
|
|
import com.iscs.bozzys.ui.theme.Text
|
|
|
|
|
+import com.iscs.bozzys.utils.DateUtil.getShowDate
|
|
|
|
|
+import com.iscs.bozzys.utils.DateUtil.getShowDateOrTime
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* 打开消息中心页面
|
|
* 打开消息中心页面
|
|
@@ -58,10 +68,17 @@ fun Context.openPageMessage() {
|
|
|
class PageMessage : PageBase() {
|
|
class PageMessage : PageBase() {
|
|
|
@Composable
|
|
@Composable
|
|
|
override fun GetViews(pv: PaddingValues) {
|
|
override fun GetViews(pv: PaddingValues) {
|
|
|
|
|
+ val vm: VMMessage = viewModel()
|
|
|
|
|
+ val state by vm.state.collectAsState()
|
|
|
|
|
+ LaunchedEffect(Unit) {
|
|
|
|
|
+ vm.toast.initToast()
|
|
|
|
|
+ vm.loading.initLoading()
|
|
|
|
|
+ vm.init()
|
|
|
|
|
+ }
|
|
|
Box(
|
|
Box(
|
|
|
modifier = Modifier
|
|
modifier = Modifier
|
|
|
.fillMaxSize()
|
|
.fillMaxSize()
|
|
|
- .background(Color.White)
|
|
|
|
|
|
|
+ .background(MaterialTheme.colorScheme.background)
|
|
|
) {
|
|
) {
|
|
|
// 顶部工具栏
|
|
// 顶部工具栏
|
|
|
Column(
|
|
Column(
|
|
@@ -69,9 +86,14 @@ class PageMessage : PageBase() {
|
|
|
.padding(bottom = pv.calculateBottomPadding())
|
|
.padding(bottom = pv.calculateBottomPadding())
|
|
|
.fillMaxSize()
|
|
.fillMaxSize()
|
|
|
) {
|
|
) {
|
|
|
- TopToolBar(pv)
|
|
|
|
|
- MessageList()
|
|
|
|
|
|
|
+ TopToolBar(pv, vm)
|
|
|
|
|
+ MessageList(vm)
|
|
|
}
|
|
}
|
|
|
|
|
+ // 提示弹窗
|
|
|
|
|
+ TipsDialog(
|
|
|
|
|
+ show = state.tips.show, title = state.tips.title, content = state.tips.content,
|
|
|
|
|
+ onCancel = { vm.hideTips() },
|
|
|
|
|
+ onConfirm = { vm.onTipsConfirm() })
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -80,7 +102,7 @@ class PageMessage : PageBase() {
|
|
|
* 顶部工具栏
|
|
* 顶部工具栏
|
|
|
*/
|
|
*/
|
|
|
@Composable
|
|
@Composable
|
|
|
- private fun TopToolBar(pv: PaddingValues) {
|
|
|
|
|
|
|
+ private fun TopToolBar(pv: PaddingValues, vm: VMMessage) {
|
|
|
Column(
|
|
Column(
|
|
|
modifier = Modifier
|
|
modifier = Modifier
|
|
|
.fillMaxWidth()
|
|
.fillMaxWidth()
|
|
@@ -126,7 +148,7 @@ class PageMessage : PageBase() {
|
|
|
modifier = Modifier
|
|
modifier = Modifier
|
|
|
.size(36.dp)
|
|
.size(36.dp)
|
|
|
.clip(RoundedCornerShape(6.dp))
|
|
.clip(RoundedCornerShape(6.dp))
|
|
|
- .clickable(onClick = {})
|
|
|
|
|
|
|
+ .clickable(onClick = { vm.onReadAll() })
|
|
|
.padding(8.dp),
|
|
.padding(8.dp),
|
|
|
tint = Color.White
|
|
tint = Color.White
|
|
|
)
|
|
)
|
|
@@ -136,7 +158,7 @@ class PageMessage : PageBase() {
|
|
|
modifier = Modifier
|
|
modifier = Modifier
|
|
|
.size(36.dp)
|
|
.size(36.dp)
|
|
|
.clip(RoundedCornerShape(6.dp))
|
|
.clip(RoundedCornerShape(6.dp))
|
|
|
- .clickable(onClick = {})
|
|
|
|
|
|
|
+ .clickable(onClick = { vm.onDeleteAll() })
|
|
|
.padding(9.dp),
|
|
.padding(9.dp),
|
|
|
tint = Color.White
|
|
tint = Color.White
|
|
|
)
|
|
)
|
|
@@ -152,9 +174,8 @@ class PageMessage : PageBase() {
|
|
|
*/
|
|
*/
|
|
|
@OptIn(ExperimentalMaterial3Api::class)
|
|
@OptIn(ExperimentalMaterial3Api::class)
|
|
|
@Composable
|
|
@Composable
|
|
|
-private fun MessageList() {
|
|
|
|
|
- val isRefresh = remember { mutableStateOf(false) }
|
|
|
|
|
- val list = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9)
|
|
|
|
|
|
|
+private fun MessageList(vm: VMMessage) {
|
|
|
|
|
+ val state by vm.state.collectAsState()
|
|
|
// 监听顶部Item
|
|
// 监听顶部Item
|
|
|
val listState = rememberLazyListState()
|
|
val listState = rememberLazyListState()
|
|
|
// 当前顶部Item
|
|
// 当前顶部Item
|
|
@@ -163,30 +184,45 @@ private fun MessageList() {
|
|
|
listState.firstVisibleItemIndex
|
|
listState.firstVisibleItemIndex
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
- PullToRefreshBox(isRefresh.value, onRefresh = {
|
|
|
|
|
- isRefresh.value = true
|
|
|
|
|
|
|
+ PullToRefreshBox(state.page.isRefresh, onRefresh = {
|
|
|
|
|
+ vm.getMessage(StatePageMessage(isRefresh = true, page = 1))
|
|
|
}, modifier = Modifier.fillMaxSize()) {
|
|
}, modifier = Modifier.fillMaxSize()) {
|
|
|
Box(
|
|
Box(
|
|
|
modifier = Modifier
|
|
modifier = Modifier
|
|
|
.padding(top = 5.dp)
|
|
.padding(top = 5.dp)
|
|
|
.fillMaxSize()
|
|
.fillMaxSize()
|
|
|
- .padding(horizontal = 16.dp)
|
|
|
|
|
) {
|
|
) {
|
|
|
LazyColumn(
|
|
LazyColumn(
|
|
|
state = listState,
|
|
state = listState,
|
|
|
modifier = Modifier.fillMaxSize()
|
|
modifier = Modifier.fillMaxSize()
|
|
|
) {
|
|
) {
|
|
|
- items(list) { item ->
|
|
|
|
|
- when (item) {
|
|
|
|
|
- 1 -> MessageListItemTitle("今天")
|
|
|
|
|
- 6 -> MessageListItemTitle("昨天")
|
|
|
|
|
- else -> MessageListItemContent(item)
|
|
|
|
|
|
|
+ items(state.messages) { item ->
|
|
|
|
|
+ if (item.isTitle) {
|
|
|
|
|
+ MessageListItemTitle(item)
|
|
|
|
|
+ } else {
|
|
|
|
|
+ MessageListItemContent(vm, item)
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+ // 数据不为空才会显示加载中
|
|
|
|
|
+ if (state.messages.isNotEmpty()) item {
|
|
|
|
|
+ Text(
|
|
|
|
|
+ if (state.page.noMore) "没有更多数据" else "加载更多数据中...",
|
|
|
|
|
+ fontSize = 12.sp,
|
|
|
|
|
+ modifier = Modifier
|
|
|
|
|
+ .fillMaxWidth()
|
|
|
|
|
+ .padding(bottom = 10.dp),
|
|
|
|
|
+ textAlign = TextAlign.Center,
|
|
|
|
|
+ color = Text.copy(alpha = 0.6f)
|
|
|
|
|
+ )
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
+ if (state.messages.isEmpty()) Empty("暂无消息")
|
|
|
// 悬浮在列表的顶部
|
|
// 悬浮在列表的顶部
|
|
|
- Box(Modifier.background(Color.White)) {
|
|
|
|
|
- MessageListItemTitle("${list[topIdx]}")
|
|
|
|
|
|
|
+ if (state.messages.isNotEmpty()) Box(
|
|
|
|
|
+ Modifier.background(MaterialTheme.colorScheme.background),
|
|
|
|
|
+ contentAlignment = Alignment.CenterStart
|
|
|
|
|
+ ) {
|
|
|
|
|
+ MessageListItemTitle(state.messages[topIdx])
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -196,17 +232,17 @@ private fun MessageList() {
|
|
|
* 消息标题
|
|
* 消息标题
|
|
|
*/
|
|
*/
|
|
|
@Composable
|
|
@Composable
|
|
|
-private fun MessageListItemTitle(title: String) {
|
|
|
|
|
|
|
+private fun MessageListItemTitle(message: Message) {
|
|
|
Text(
|
|
Text(
|
|
|
- title,
|
|
|
|
|
|
|
+ message.createTime.getShowDate(),
|
|
|
fontSize = 16.sp,
|
|
fontSize = 16.sp,
|
|
|
- lineHeight = 22.sp,
|
|
|
|
|
|
|
+ lineHeight = 26.sp,
|
|
|
fontWeight = FontWeight.Medium,
|
|
fontWeight = FontWeight.Medium,
|
|
|
color = Text,
|
|
color = Text,
|
|
|
modifier = Modifier
|
|
modifier = Modifier
|
|
|
- .padding(bottom = 10.dp)
|
|
|
|
|
.fillMaxWidth()
|
|
.fillMaxWidth()
|
|
|
- .height(22.dp)
|
|
|
|
|
|
|
+ .height(26.dp)
|
|
|
|
|
+ .padding(horizontal = 16.dp),
|
|
|
)
|
|
)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -214,54 +250,52 @@ private fun MessageListItemTitle(title: String) {
|
|
|
* 消息内容
|
|
* 消息内容
|
|
|
*/
|
|
*/
|
|
|
@Composable
|
|
@Composable
|
|
|
-private fun MessageListItemContent(item: Int) {
|
|
|
|
|
- Row(
|
|
|
|
|
- Modifier
|
|
|
|
|
- .padding(bottom = 15.dp)
|
|
|
|
|
- .fillMaxWidth()
|
|
|
|
|
- .height(122.dp)
|
|
|
|
|
- .border(1.dp, color = Color(0xFFEEEEEE), shape = RoundedCornerShape(12.dp))
|
|
|
|
|
- .clip(RoundedCornerShape(12.dp))
|
|
|
|
|
- .background(Color(0xFFF8F9FA))
|
|
|
|
|
- .clickable(onClick = {})
|
|
|
|
|
- .padding(16.dp)
|
|
|
|
|
- ) {
|
|
|
|
|
- Icon(
|
|
|
|
|
- painterResource(R.drawable.delete_all), contentDescription = null,
|
|
|
|
|
- modifier = Modifier
|
|
|
|
|
- .size(40.dp)
|
|
|
|
|
- .clip(RoundedCornerShape(50))
|
|
|
|
|
- .background(Color(0xFF1E90FF))
|
|
|
|
|
- .padding(12.dp)
|
|
|
|
|
- )
|
|
|
|
|
- Column(
|
|
|
|
|
|
|
+private fun MessageListItemContent(vm: VMMessage, msg: Message) {
|
|
|
|
|
+ CardContainer(modifier = Modifier.padding(vertical = 8.dp, horizontal = 16.dp)) {
|
|
|
|
|
+ Row(
|
|
|
Modifier
|
|
Modifier
|
|
|
- .padding(start = 15.dp, end = 10.dp)
|
|
|
|
|
- .fillMaxHeight()
|
|
|
|
|
- .weight(1f)
|
|
|
|
|
|
|
+ .fillMaxWidth()
|
|
|
|
|
+ .height(122.dp)
|
|
|
|
|
+ .clickable(onClick = { vm.onMessage(msg) })
|
|
|
|
|
+ .padding(16.dp)
|
|
|
) {
|
|
) {
|
|
|
- Text("新任务分配", fontSize = 15.sp, fontWeight = FontWeight.Medium, color = Text)
|
|
|
|
|
- Text(
|
|
|
|
|
- "您有新的作业票待处理,作业票号:WO-2024-003",
|
|
|
|
|
- fontSize = 13.sp,
|
|
|
|
|
- color = Color(0xFF666666),
|
|
|
|
|
- overflow = TextOverflow.Ellipsis,
|
|
|
|
|
- maxLines = 2,
|
|
|
|
|
- modifier = Modifier.fillMaxWidth()
|
|
|
|
|
|
|
+ Icon(
|
|
|
|
|
+ painterResource(R.drawable.delete_all), contentDescription = null,
|
|
|
|
|
+ modifier = Modifier
|
|
|
|
|
+ .size(40.dp)
|
|
|
|
|
+ .clip(RoundedCornerShape(50))
|
|
|
|
|
+ .background(Color(0xFF1E90FF))
|
|
|
|
|
+ .padding(12.dp)
|
|
|
)
|
|
)
|
|
|
- Spacer(Modifier.weight(1f))
|
|
|
|
|
- Row(Modifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically) {
|
|
|
|
|
- Text("10:30", fontSize = 12.sp, color = Color(0xFF999999))
|
|
|
|
|
|
|
+ Column(
|
|
|
|
|
+ Modifier
|
|
|
|
|
+ .padding(start = 15.dp, end = 10.dp)
|
|
|
|
|
+ .fillMaxHeight()
|
|
|
|
|
+ .weight(1f)
|
|
|
|
|
+ ) {
|
|
|
|
|
+ Text("新任务分配", fontSize = 15.sp, fontWeight = FontWeight.Medium, color = Text)
|
|
|
|
|
+ Text(
|
|
|
|
|
+ msg.templateContent,
|
|
|
|
|
+ fontSize = 13.sp,
|
|
|
|
|
+ color = Color(0xFF666666),
|
|
|
|
|
+ overflow = TextOverflow.Ellipsis,
|
|
|
|
|
+ maxLines = 2,
|
|
|
|
|
+ modifier = Modifier.fillMaxWidth()
|
|
|
|
|
+ )
|
|
|
Spacer(Modifier.weight(1f))
|
|
Spacer(Modifier.weight(1f))
|
|
|
- Text("作业管理", fontSize = 12.sp, color = Color(0xFF999999))
|
|
|
|
|
|
|
+ Row(Modifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically) {
|
|
|
|
|
+ Text(msg.createTime.getShowDateOrTime(), fontSize = 12.sp, color = Color(0xFF999999))
|
|
|
|
|
+ Spacer(Modifier.weight(1f))
|
|
|
|
|
+ Text("作业管理", fontSize = 12.sp, color = Color(0xFF999999))
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
+ Spacer(
|
|
|
|
|
+ Modifier
|
|
|
|
|
+ .size(8.dp)
|
|
|
|
|
+ .clip(RoundedCornerShape(50))
|
|
|
|
|
+ .background(if (msg.readStatus) Color.Transparent else Color(0xFFFF4500))
|
|
|
|
|
+ .align(Alignment.CenterVertically)
|
|
|
|
|
+ )
|
|
|
}
|
|
}
|
|
|
- Spacer(
|
|
|
|
|
- Modifier
|
|
|
|
|
- .size(8.dp)
|
|
|
|
|
- .clip(RoundedCornerShape(50))
|
|
|
|
|
- .background(Color(0xFFFF4500))
|
|
|
|
|
- .align(Alignment.CenterVertically)
|
|
|
|
|
- )
|
|
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|