create new common components
This commit is contained in:
@@ -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
|
||||
)
|
||||
}
|
||||
Reference in New Issue
Block a user