Приложение

This commit is contained in:
Халимов Рустам
2026-04-14 01:15:54 +03:00
parent 8399d32490
commit 1fb1be47dd
126 changed files with 6145 additions and 0 deletions
@@ -0,0 +1,120 @@
package chats.presentation.chat_list
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.lazy.LazyRow
import androidx.compose.material3.*
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import chats.presentation.components.ChatItem
import stories.presentation.StoryViewModel
import stories.presentation.components.StoryThumbnail
import ru.knot.messager.R
@Composable
fun HorizontalDividerComponent(
modifier: Modifier = Modifier,
thickness: androidx.compose.ui.unit.Dp = 1.dp,
color: androidx.compose.ui.graphics.Color = MaterialTheme.colorScheme.outlineVariant
) {
androidx.compose.material3.Divider(
modifier = modifier,
thickness = thickness,
color = color
)
}
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun ChatListScreen(
viewModel: ChatListViewModel,
storyViewModel: StoryViewModel,
onChatClick: (String) -> Unit,
onStoryClick: (Int) -> Unit
) {
val state by viewModel.state.collectAsState()
val storyState by storyViewModel.state.collectAsState()
Scaffold(
topBar = {
TopAppBar(
title = { Text(stringResource(R.string.chats_title)) },
colors = TopAppBarDefaults.topAppBarColors(
containerColor = MaterialTheme.colorScheme.primaryContainer
)
)
}
) { paddingValues ->
Box(
modifier = Modifier
.fillMaxSize()
.padding(paddingValues)
) {
if (state.isLoading && state.chats.isEmpty()) {
CircularProgressIndicator(modifier = Modifier.align(Alignment.Center))
} else {
LazyColumn {
// Ряд историй сверху списка чатов
item {
if (state.isStoriesEnabled && storyState.storyGroups.isNotEmpty()) {
LazyRow(
modifier = Modifier
.fillMaxWidth()
.padding(vertical = 8.dp),
contentPadding = PaddingValues(horizontal = 8.dp)
) {
items(storyState.storyGroups.size) { index ->
val group = storyState.storyGroups[index]
StoryThumbnail(
username = group.username,
avatarUrl = group.avatar,
hasUnseen = true, // В идеале проверяем по статусам
onClick = { onStoryClick(index) }
)
}
}
HorizontalDividerComponent(
thickness = 0.5.dp,
color = MaterialTheme.colorScheme.outlineVariant
)
}
}
if (state.error != null && state.chats.isEmpty()) {
item {
Text(
text = "${stringResource(R.string.error_occurred)}: ${state.error}",
color = MaterialTheme.colorScheme.error,
modifier = Modifier.padding(16.dp)
)
}
} else if (state.chats.isEmpty() && !state.isLoading) {
item {
Box(modifier = Modifier.fillParentMaxSize()) {
Text(
text = stringResource(R.string.no_chats_found),
modifier = Modifier.align(Alignment.Center)
)
}
}
} else {
items(state.chats) { chat ->
ChatItem(chat = chat, onClick = onChatClick)
HorizontalDividerComponent(
modifier = Modifier.padding(horizontal = 16.dp),
thickness = 0.5.dp,
color = MaterialTheme.colorScheme.outlineVariant
)
}
}
}
}
}
}
}