|
|
@@ -22,9 +22,11 @@ import androidx.compose.foundation.text.KeyboardOptions
|
|
|
import androidx.compose.material3.ExperimentalMaterial3Api
|
|
|
import androidx.compose.material3.Icon
|
|
|
import androidx.compose.material3.LocalTextStyle
|
|
|
+import androidx.compose.material3.MaterialTheme
|
|
|
import androidx.compose.material3.Text
|
|
|
import androidx.compose.material3.pulltorefresh.PullToRefreshBox
|
|
|
import androidx.compose.runtime.Composable
|
|
|
+import androidx.compose.runtime.LaunchedEffect
|
|
|
import androidx.compose.runtime.collectAsState
|
|
|
import androidx.compose.runtime.derivedStateOf
|
|
|
import androidx.compose.runtime.getValue
|
|
|
@@ -43,6 +45,7 @@ import androidx.compose.ui.platform.LocalSoftwareKeyboardController
|
|
|
import androidx.compose.ui.res.painterResource
|
|
|
import androidx.compose.ui.text.font.FontWeight
|
|
|
import androidx.compose.ui.text.input.ImeAction
|
|
|
+import androidx.compose.ui.text.style.TextAlign
|
|
|
import androidx.compose.ui.unit.dp
|
|
|
import androidx.compose.ui.unit.sp
|
|
|
import androidx.compose.ui.zIndex
|
|
|
@@ -50,8 +53,6 @@ import com.iscs.bozzys.R
|
|
|
import com.iscs.bozzys.ui.common.Empty
|
|
|
import com.iscs.bozzys.ui.pages.compose.JobListItem
|
|
|
import com.iscs.bozzys.ui.pages.create.job.openPageCreateJob
|
|
|
-import com.iscs.bozzys.ui.pages.create.job.openPagePushJob
|
|
|
-import com.iscs.bozzys.ui.pages.edit.step.openPageEditStep
|
|
|
import com.iscs.bozzys.ui.pages.vm.StatePage
|
|
|
import com.iscs.bozzys.ui.pages.vm.VMHome
|
|
|
import com.iscs.bozzys.ui.theme.Main
|
|
|
@@ -63,7 +64,7 @@ fun JobsCompose(pv: PaddingValues, zIndex: Float, vm: VMHome) {
|
|
|
modifier = Modifier
|
|
|
.fillMaxSize()
|
|
|
.zIndex(zIndex)
|
|
|
- .background(Color.White)
|
|
|
+ .background(MaterialTheme.colorScheme.background)
|
|
|
.pointerInput(Unit) {},
|
|
|
) {
|
|
|
// 顶部工具栏
|
|
|
@@ -160,7 +161,7 @@ private fun TopToolBar(pv: PaddingValues, vm: VMHome) {
|
|
|
keyboardOptions = KeyboardOptions(imeAction = ImeAction.Search),
|
|
|
keyboardActions = KeyboardActions(onSearch = {
|
|
|
keyboard?.hide()
|
|
|
- vm.getJobList(StatePage(page = 1, type = "", keywords = keywords))
|
|
|
+ vm.getJobList(StatePage(page = 1, type = "", keywords = keywords, isRefresh = true))
|
|
|
})
|
|
|
)
|
|
|
}
|
|
|
@@ -189,31 +190,31 @@ private fun FilterBar(vm: VMHome) {
|
|
|
.background(color = if (state.jobPage.type == "running") Main else Color(0xFFF0F0F0))
|
|
|
.clickable(onClick = {
|
|
|
keyboard?.hide()
|
|
|
- vm.getJobList(state.jobPage.copy(page = 1, type = "running", keywords = ""))
|
|
|
+ vm.getJobList(state.jobPage.copy(page = 1, type = "running", keywords = "", noMore = false, isRefresh = true))
|
|
|
})
|
|
|
.padding(horizontal = 12.dp, vertical = 5.dp),
|
|
|
)
|
|
|
Text(
|
|
|
- "已完成", fontSize = 14.sp, color = if (state.jobPage.type == "completed") Color.White else Color(0xFF666666),
|
|
|
+ "待发布", fontSize = 14.sp, color = if (state.jobPage.type == "unreleased") Color.White else Color(0xFF666666),
|
|
|
modifier = Modifier
|
|
|
.padding(end = 10.dp)
|
|
|
.clip(RoundedCornerShape(50))
|
|
|
- .background(color = if (state.jobPage.type == "completed") Main else Color(0xFFF0F0F0))
|
|
|
+ .background(color = if (state.jobPage.type == "unreleased") Main else Color(0xFFF0F0F0))
|
|
|
.clickable(onClick = {
|
|
|
keyboard?.hide()
|
|
|
- vm.getJobList(state.jobPage.copy(page = 1, type = "completed", keywords = ""))
|
|
|
+ vm.getJobList(state.jobPage.copy(page = 1, type = "unreleased", keywords = "", noMore = false, isRefresh = true))
|
|
|
})
|
|
|
.padding(horizontal = 12.dp, vertical = 5.dp),
|
|
|
)
|
|
|
Text(
|
|
|
- "已取消", fontSize = 14.sp, color = if (state.jobPage.type == "cancelled") Color.White else Color(0xFF666666),
|
|
|
+ "已完成", fontSize = 14.sp, color = if (state.jobPage.type == "completed") Color.White else Color(0xFF666666),
|
|
|
modifier = Modifier
|
|
|
.padding(end = 10.dp)
|
|
|
.clip(RoundedCornerShape(50))
|
|
|
- .background(color = if (state.jobPage.type == "cancelled") Main else Color(0xFFF0F0F0))
|
|
|
+ .background(color = if (state.jobPage.type == "completed") Main else Color(0xFFF0F0F0))
|
|
|
.clickable(onClick = {
|
|
|
keyboard?.hide()
|
|
|
- vm.getJobList(state.jobPage.copy(page = 1, type = "cancelled", keywords = ""))
|
|
|
+ vm.getJobList(state.jobPage.copy(page = 1, type = "completed", keywords = "", noMore = false, isRefresh = true))
|
|
|
})
|
|
|
.padding(horizontal = 12.dp, vertical = 5.dp),
|
|
|
)
|
|
|
@@ -225,7 +226,7 @@ private fun FilterBar(vm: VMHome) {
|
|
|
.background(color = if (state.jobPage.type == "") Main else Color(0xFFF0F0F0))
|
|
|
.clickable(onClick = {
|
|
|
keyboard?.hide()
|
|
|
- vm.getJobList(state.jobPage.copy(page = 1, type = "", keywords = ""))
|
|
|
+ vm.getJobList(state.jobPage.copy(page = 1, type = "", keywords = "", noMore = false, isRefresh = true))
|
|
|
})
|
|
|
.padding(horizontal = 12.dp, vertical = 5.dp),
|
|
|
)
|
|
|
@@ -247,9 +248,24 @@ private fun TaskList(vm: VMHome) {
|
|
|
listState.firstVisibleItemIndex
|
|
|
}
|
|
|
}
|
|
|
+ // 监听列表是否滑动到底部
|
|
|
+ val shouldLoadMore by remember {
|
|
|
+ derivedStateOf {
|
|
|
+ val layoutInfo = listState.layoutInfo
|
|
|
+ val totalItems = layoutInfo.totalItemsCount
|
|
|
+ val lastVisibleItemIndex = layoutInfo.visibleItemsInfo.lastOrNull()?.index ?: 0
|
|
|
+ lastVisibleItemIndex >= totalItems - 2
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 处理加载更多数据
|
|
|
+ LaunchedEffect(shouldLoadMore) {
|
|
|
+ if (shouldLoadMore && state.jobList.isNotEmpty() && !state.jobPage.noMore) {
|
|
|
+ vm.getJobList(state.jobPage.copy(page = state.jobPage.page + 1, isRefresh = false))
|
|
|
+ }
|
|
|
+ }
|
|
|
Box {
|
|
|
PullToRefreshBox(state.jobPage.isRefresh, onRefresh = {
|
|
|
- vm.getJobList(state.jobPage.copy(page = 1))
|
|
|
+ vm.getJobList(state.jobPage.copy(page = 1, noMore = false, isRefresh = true))
|
|
|
}, modifier = Modifier.fillMaxSize()) {
|
|
|
Box(
|
|
|
modifier = Modifier
|
|
|
@@ -264,12 +280,25 @@ private fun TaskList(vm: VMHome) {
|
|
|
items(state.jobList) { item ->
|
|
|
JobListItem(item)
|
|
|
}
|
|
|
+ // 数据不为空才会显示加载中
|
|
|
+ if (state.jobList.isNotEmpty()) item {
|
|
|
+ Text(
|
|
|
+ if (state.jobPage.noMore) "没有更多数据" else "加载更多数据中...",
|
|
|
+ fontSize = 12.sp,
|
|
|
+ modifier = Modifier
|
|
|
+ .fillMaxWidth()
|
|
|
+ .padding(bottom = 10.dp),
|
|
|
+ textAlign = TextAlign.Center,
|
|
|
+ color = Text.copy(alpha = 0.6f)
|
|
|
+ )
|
|
|
+ }
|
|
|
}
|
|
|
// 悬浮在列表的顶部
|
|
|
// Box(Modifier.background(Color.White)) {
|
|
|
// DateTitle("${list[topIdx]}")
|
|
|
// }
|
|
|
if (state.jobList.isEmpty()) Empty("暂无数据")
|
|
|
+
|
|
|
}
|
|
|
}
|
|
|
}
|