create new common components

This commit is contained in:
2026-08-07 06:09:28 +03:00
parent 7cc21d101a
commit b851cf5d6d
26 changed files with 221 additions and 228 deletions
@@ -0,0 +1,4 @@
<resources>
<string name="error_title">Произошла ошибка</string>
<string name="ok">Понятно</string>
</resources>
@@ -0,0 +1,93 @@
package ru.shadowsparky.ui.components
import androiddev.libs.ui.generated.resources.Res
import androiddev.libs.ui.generated.resources.error_title
import androiddev.libs.ui.generated.resources.ok
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
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.material3.Button
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import org.jetbrains.compose.resources.stringResource
@Composable
fun ErrorContent(
message: String,
modifier: Modifier = Modifier,
buttonModifier: Modifier = Modifier,
buttonText: String = stringResource(Res.string.ok),
onClick: () -> Unit
) {
Column(
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally,
modifier = modifier.fillMaxSize().padding(4.dp)
) {
Text(
text = stringResource(Res.string.error_title),
style = MaterialTheme.typography.titleMedium,
textAlign = TextAlign.Center
)
Spacer(Modifier.height(2.dp))
Text(
text = message,
style = MaterialTheme.typography.bodyMedium,
textAlign = TextAlign.Center
)
Spacer(Modifier.height(8.dp))
Button(modifier = buttonModifier, onClick = { onClick() }) {
Text(
text = buttonText,
style = MaterialTheme.typography.bodyMedium
)
}
}
}
@Composable
fun ErrorAlert(
message: String,
buttonText: String = stringResource(Res.string.ok),
onClick: () -> Unit,
onSkip: () -> Unit = onClick
) {
AlertContent(onSkip) {
ErrorContent(
message,
Modifier,
Modifier.fillMaxWidth(),
buttonText,
onClick
)
}
}
@Preview
@Composable
fun ErrorContentPreview() {
ErrorContent("что-то пошло не так") {
}
}
@Preview
@Composable
fun ErrorAlertPreview() {
ErrorAlert(
"Увы... Что-то опять идет не так...",
onClick = {
}
)
}
@@ -14,6 +14,8 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import ru.shadowsparky.ui.LocalBlurState
import ru.shadowsparky.ui.applyBlurSource
@Composable
expect fun isTv(): Boolean
@@ -123,7 +125,11 @@ fun LazyColumn(
) {
val isTv = isTv()
androidx.compose.foundation.lazy.LazyColumn(
if (isTv) modifier.padding(contentPadding) else modifier,
if (isTv) {
modifier.padding(contentPadding)
} else {
modifier.applyBlurSource(LocalBlurState.current)
},
state,
if (isTv) PaddingValues(0.dp) else contentPadding,
reverseLayout,
@@ -14,6 +14,8 @@ import androidx.compose.foundation.rememberOverscrollEffect
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import ru.shadowsparky.ui.LocalBlurState
import ru.shadowsparky.ui.applyBlurSource
@Composable
fun LazyVerticalGrid(
@@ -33,7 +35,11 @@ fun LazyVerticalGrid(
val isTv = isTv()
androidx.compose.foundation.lazy.grid.LazyVerticalGrid(
columns,
if (isTv) modifier.padding(contentPadding) else modifier,
if (isTv) {
modifier.padding(contentPadding)
} else {
modifier.applyBlurSource(LocalBlurState.current)
},
state,
if (isTv) PaddingValues(0.dp) else contentPadding,
reverseLayout,
@@ -1,6 +1,7 @@
package ru.shadowsparky.ui.components
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.size
import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
import androidx.compose.material3.LoadingIndicator
@@ -12,7 +13,7 @@ import androidx.compose.ui.unit.dp
@OptIn(ExperimentalMaterial3ExpressiveApi::class)
@Composable
fun Loading(modifier: Modifier) {
fun Loading(modifier: Modifier = Modifier.fillMaxSize()) {
Box(modifier, contentAlignment = Alignment.Center) {
LoadingIndicator(Modifier.size(96.dp))
}
@@ -0,0 +1,42 @@
package ru.shadowsparky.ui.components
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.RowScope
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.TopAppBar
import androidx.compose.material3.TopAppBarColors
import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.material3.TopAppBarScrollBehavior
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.Dp
import ru.shadowsparky.ui.LocalBlurState
import ru.shadowsparky.ui.applyBlurEffect
import ru.shadowsparky.ui.theme.ComponentDefaults
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun TopAppBar(
title: @Composable () -> Unit,
modifier: Modifier = Modifier,
navigationIcon: @Composable () -> Unit = {},
actions: @Composable RowScope.() -> Unit = {},
expandedHeight: Dp = TopAppBarDefaults.TopAppBarExpandedHeight,
windowInsets: WindowInsets = TopAppBarDefaults.windowInsets,
colors: TopAppBarColors = ComponentDefaults.topAppBarColors(),
scrollBehavior: TopAppBarScrollBehavior? = null,
contentPadding: PaddingValues = TopAppBarDefaults.ContentPadding
) {
TopAppBar(
title = title,
modifier = modifier.applyBlurEffect(LocalBlurState.current),
navigationIcon = navigationIcon,
actions = actions,
expandedHeight = expandedHeight,
windowInsets = windowInsets,
colors = colors,
scrollBehavior = scrollBehavior,
contentPadding = contentPadding
)
}