diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index e4c7e94..f524502 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -4,6 +4,7 @@
+
get() = _networkAvailabilityFlow
+ val isNetworkAvailable: Boolean get() = _networkAvailabilityFlow.value
+
+ init {
+ context.getSystemService()?.let { connectivityManager ->
+
+ val networkRequest = NetworkRequest.Builder()
+ .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
+ .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
+ .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
+ .build()
+
+ val networkCallback = object : ConnectivityManager.NetworkCallback() {
+ override fun onAvailable(network: Network) {
+ super.onAvailable(network)
+ _networkAvailabilityFlow.value = true
+ }
+
+ override fun onLost(network: Network) {
+ super.onLost(network)
+ _networkAvailabilityFlow.value = false
+ }
+ }
+
+ connectivityManager.requestNetwork(networkRequest, networkCallback)
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/pixelized/biblib/ui/composable/Search.kt b/app/src/main/java/com/pixelized/biblib/ui/composable/Search.kt
index db615a3..371db5b 100644
--- a/app/src/main/java/com/pixelized/biblib/ui/composable/Search.kt
+++ b/app/src/main/java/com/pixelized/biblib/ui/composable/Search.kt
@@ -2,12 +2,13 @@ package com.pixelized.biblib.ui.composable
import android.content.res.Configuration.UI_MODE_NIGHT_NO
import android.content.res.Configuration.UI_MODE_NIGHT_YES
+import androidx.compose.animation.core.animateDpAsState
import androidx.compose.foundation.Image
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
-import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material.*
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Search
@@ -24,6 +25,7 @@ import com.pixelized.biblib.R
import com.pixelized.biblib.ui.scaffold.SearchScaffoldState
import com.pixelized.biblib.ui.scaffold.rememberSearchScaffoldState
import com.pixelized.biblib.ui.theme.BibLibTheme
+import com.pixelized.biblib.utils.extention.bibLib
import com.pixelized.biblib.utils.extention.todo
@@ -35,7 +37,13 @@ fun Search(
onAvatar: () -> Unit = todo(),
onSearch: () -> Unit = todo(),
) {
- var test by remember { mutableStateOf("") }
+ val horizontalPadding by animateDpAsState(
+ targetValue = when (state.isCollapsed()) {
+ true -> MaterialTheme.bibLib.dimen.dp8
+ else -> MaterialTheme.bibLib.dimen.dp16
+ }
+ )
+ var search by remember { mutableStateOf("") }
Row(
modifier = Modifier
.clickable(onClick = onSearch)
@@ -44,8 +52,8 @@ fun Search(
) {
Icon(
modifier = Modifier
- .size(42.dp)
- .padding(horizontal = 8.dp),
+ .padding(start = horizontalPadding)
+ .size(24.dp),
imageVector = Icons.Default.Search,
tint = MaterialTheme.colors.onSurface,
contentDescription = null
@@ -58,24 +66,23 @@ fun Search(
text = "Rechercher sur BibLib"
)
},
- value = test,
+ value = if (state.isCollapsed()) "" else search,
+ singleLine = true,
enabled = state.isCollapsed().not(),
readOnly = state.isCollapsed(),
colors = TextFieldDefaults.outlinedTextFieldColors(
focusedBorderColor = Color.Transparent,
- unfocusedBorderColor = Color.Transparent,
- disabledBorderColor = Color.Transparent,
+ unfocusedBorderColor = Color.Transparent,
+ disabledBorderColor = Color.Transparent,
),
- onValueChange = { test = it }
+ onValueChange = { search = it }
)
IconButton(
- modifier = Modifier.padding(horizontal = 8.dp),
+ modifier = Modifier.padding(end = horizontalPadding),
onClick = onAvatar,
) {
Image(
- modifier = Modifier
- .size(32.dp)
- .clip(RoundedCornerShape(50)),
+ modifier = Modifier.clip(CircleShape),
painter = avatar,
contentDescription = null
)
diff --git a/app/src/main/java/com/pixelized/biblib/ui/composable/dialog/ErrorCard.kt b/app/src/main/java/com/pixelized/biblib/ui/composable/dialog/ErrorCard.kt
index bd7a9cb..f008a19 100644
--- a/app/src/main/java/com/pixelized/biblib/ui/composable/dialog/ErrorCard.kt
+++ b/app/src/main/java/com/pixelized/biblib/ui/composable/dialog/ErrorCard.kt
@@ -33,7 +33,7 @@ fun ErrorCard(
) {
Column(
modifier = Modifier
- .padding(MaterialTheme.bibLib.dimen.medium)
+ .padding(MaterialTheme.bibLib.dimen.dp16)
.sizeIn(
minWidth = MaterialTheme.bibLib.dimen.dialog.minimum.width,
minHeight = MaterialTheme.bibLib.dimen.dialog.minimum.height,
@@ -49,7 +49,7 @@ fun ErrorCard(
)
if (message.isNotEmpty()) {
Text(
- modifier = Modifier.padding(top = MaterialTheme.bibLib.dimen.medium),
+ modifier = Modifier.padding(top = MaterialTheme.bibLib.dimen.dp16),
style = MaterialTheme.typography.body1,
textAlign = TextAlign.Center,
text = message
@@ -57,7 +57,7 @@ fun ErrorCard(
}
if (exception != null) {
Text(
- modifier = Modifier.padding(top = MaterialTheme.bibLib.dimen.small),
+ modifier = Modifier.padding(top = MaterialTheme.bibLib.dimen.dp8),
style = MaterialTheme.typography.caption,
textAlign = TextAlign.Center,
text = exception.message ?: exception::class.java.simpleName
diff --git a/app/src/main/java/com/pixelized/biblib/ui/composable/dialog/LoadingCard.kt b/app/src/main/java/com/pixelized/biblib/ui/composable/dialog/LoadingCard.kt
index 17290e1..cdb5df6 100644
--- a/app/src/main/java/com/pixelized/biblib/ui/composable/dialog/LoadingCard.kt
+++ b/app/src/main/java/com/pixelized/biblib/ui/composable/dialog/LoadingCard.kt
@@ -29,7 +29,7 @@ fun LoadingCard(
) {
Column(
modifier = Modifier
- .padding(MaterialTheme.bibLib.dimen.medium)
+ .padding(MaterialTheme.bibLib.dimen.dp16)
.sizeIn(
minWidth = MaterialTheme.bibLib.dimen.dialog.minimum.width,
minHeight = MaterialTheme.bibLib.dimen.dialog.minimum.height,
@@ -50,7 +50,7 @@ fun LoadingCard(
if (message?.isNotEmpty() == true) {
val typography = MaterialTheme.typography
Text(
- modifier = Modifier.padding(top = MaterialTheme.bibLib.dimen.medium),
+ modifier = Modifier.padding(top = MaterialTheme.bibLib.dimen.dp16),
style = typography.body1,
textAlign = TextAlign.Center,
text = message
diff --git a/app/src/main/java/com/pixelized/biblib/ui/composable/dialog/SuccesCard.kt b/app/src/main/java/com/pixelized/biblib/ui/composable/dialog/SuccesCard.kt
index 91f735c..510213f 100644
--- a/app/src/main/java/com/pixelized/biblib/ui/composable/dialog/SuccesCard.kt
+++ b/app/src/main/java/com/pixelized/biblib/ui/composable/dialog/SuccesCard.kt
@@ -30,7 +30,7 @@ fun SuccessCard(
) {
Column(
modifier = Modifier
- .padding(MaterialTheme.bibLib.dimen.medium)
+ .padding(MaterialTheme.bibLib.dimen.dp16)
.sizeIn(
minWidth = MaterialTheme.bibLib.dimen.dialog.minimum.width,
minHeight = MaterialTheme.bibLib.dimen.dialog.minimum.height,
@@ -48,7 +48,7 @@ fun SuccessCard(
Text(
modifier = Modifier
.align(Alignment.CenterHorizontally)
- .padding(top = MaterialTheme.bibLib.dimen.medium),
+ .padding(top = MaterialTheme.bibLib.dimen.dp16),
style = MaterialTheme.typography.body1,
textAlign = TextAlign.Center,
text = message
diff --git a/app/src/main/java/com/pixelized/biblib/ui/navigation/screen/ScreenNavHost.kt b/app/src/main/java/com/pixelized/biblib/ui/navigation/screen/ScreenNavHost.kt
index 7c3fbb3..3346968 100644
--- a/app/src/main/java/com/pixelized/biblib/ui/navigation/screen/ScreenNavHost.kt
+++ b/app/src/main/java/com/pixelized/biblib/ui/navigation/screen/ScreenNavHost.kt
@@ -3,6 +3,7 @@ package com.pixelized.biblib.ui.navigation.screen
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.compositionLocalOf
+import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
import androidx.navigation.NavHostController
import androidx.navigation.compose.NavHost
@@ -16,6 +17,7 @@ val LocalScreenNavHostController = compositionLocalOf {
error("LocalFullScreenNavHostController is not ready yet.")
}
+@OptIn(ExperimentalComposeUiApi::class)
@Composable
fun ScreenNavHost(
modifier: Modifier = Modifier,
diff --git a/app/src/main/java/com/pixelized/biblib/ui/scaffold/BottomDetailScaffold.kt b/app/src/main/java/com/pixelized/biblib/ui/scaffold/BottomDetailScaffold.kt
index 26cd57e..847c3c4 100644
--- a/app/src/main/java/com/pixelized/biblib/ui/scaffold/BottomDetailScaffold.kt
+++ b/app/src/main/java/com/pixelized/biblib/ui/scaffold/BottomDetailScaffold.kt
@@ -2,14 +2,14 @@ package com.pixelized.biblib.ui.scaffold
import android.content.Context
import androidx.activity.compose.BackHandler
-import androidx.compose.foundation.layout.PaddingValues
-import androidx.compose.material.BottomSheetScaffold
-import androidx.compose.material.BottomSheetScaffoldState
import androidx.compose.material.ExperimentalMaterialApi
-import androidx.compose.material.rememberBottomSheetScaffoldState
+import androidx.compose.material.ModalBottomSheetLayout
+import androidx.compose.material.ModalBottomSheetState
+import androidx.compose.material.ModalBottomSheetValue.Hidden
+import androidx.compose.material.rememberModalBottomSheetState
import androidx.compose.runtime.*
+import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
-import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel
import com.pixelized.biblib.R
import com.pixelized.biblib.ui.composable.StateUio
@@ -20,60 +20,62 @@ import com.pixelized.biblib.utils.extention.showToast
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
-val LocalBottomDetailController = staticCompositionLocalOf {
+val LocalBottomDetailController = staticCompositionLocalOf {
error("LocalBottomDetailController is not ready yet")
}
@OptIn(ExperimentalMaterialApi::class)
@Composable
fun BottomDetailScaffold(
- bottomStateController: BottomDetailStateController = rememberBottomDetailStateController(),
- content: @Composable (PaddingValues) -> Unit,
+ bottomDetailState: BottomDetailState = rememberBottomDetailState(),
+ content: @Composable () -> Unit,
) {
CompositionLocalProvider(
- LocalBottomDetailController provides bottomStateController
+ LocalBottomDetailController provides bottomDetailState
) {
- BottomSheetScaffold(
- scaffoldState = bottomStateController.scaffoldState,
- sheetPeekHeight = 0.dp,
- sheetGesturesEnabled = false,
+ ModalBottomSheetLayout(
+ scrimColor = Color.Black.copy(alpha = 0.37f),
+ sheetState = bottomDetailState.bottomSheetState,
sheetContent = {
- val detail by remember { bottomStateController.bookDetail }
+ val detail by remember { bottomDetailState.bookDetail }
DetailScreen(detail = detail)
},
- content = content
+ content = content,
)
- BackHandler(bottomStateController.scaffoldState.bottomSheetState.isExpanded) {
- bottomStateController.collapse()
+ BackHandler(bottomDetailState.bottomSheetState.isVisible) {
+ bottomDetailState.collapse()
}
}
}
@OptIn(ExperimentalMaterialApi::class)
@Composable
-fun rememberBottomDetailStateController(
+fun rememberBottomDetailState(
viewModel: BookDetailViewModel = hiltViewModel(),
scope: CoroutineScope = rememberCoroutineScope(),
- scaffoldState: BottomSheetScaffoldState = rememberBottomSheetScaffoldState(),
-): BottomDetailStateController {
+ bottomSheetState: ModalBottomSheetState = rememberModalBottomSheetState(
+ initialValue = Hidden,
+ skipHalfExpanded = true,
+ ),
+): BottomDetailState {
val context: Context = LocalContext.current
- val controller = BottomDetailStateController(
+ val controller = BottomDetailState(
context = context,
viewModel = viewModel,
scope = scope,
- scaffoldState = scaffoldState
+ bottomSheetState = bottomSheetState
)
- return remember(scope, viewModel, scaffoldState) { controller }
+ return remember(scope, viewModel, bottomSheetState) { controller }
}
@OptIn(ExperimentalMaterialApi::class)
@Stable
-class BottomDetailStateController constructor(
+class BottomDetailState constructor(
private val context: Context,
private val viewModel: BookDetailViewModel,
private val scope: CoroutineScope,
- val scaffoldState: BottomSheetScaffoldState,
+ val bottomSheetState: ModalBottomSheetState,
) {
var bookDetail = mutableStateOf(null)
private set
@@ -87,7 +89,8 @@ class BottomDetailStateController constructor(
}
is StateUio.Success -> {
bookDetail.value = book.value
- scaffoldState.bottomSheetState.expand()
+// bottomSheetState.animateTo(ModalBottomSheetValue.Expanded)
+ bottomSheetState.show()
}
else -> Unit
}
@@ -96,7 +99,7 @@ class BottomDetailStateController constructor(
fun collapse() {
scope.launch {
- scaffoldState.bottomSheetState.collapse()
+ bottomSheetState.hide()
}
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/pixelized/biblib/ui/scaffold/SearchScaffold.kt b/app/src/main/java/com/pixelized/biblib/ui/scaffold/SearchScaffold.kt
index 68d7f9e..d05b462 100644
--- a/app/src/main/java/com/pixelized/biblib/ui/scaffold/SearchScaffold.kt
+++ b/app/src/main/java/com/pixelized/biblib/ui/scaffold/SearchScaffold.kt
@@ -1,10 +1,8 @@
package com.pixelized.biblib.ui.scaffold
-import androidx.compose.animation.AnimatedVisibility
+import androidx.compose.animation.*
import androidx.compose.animation.core.animateDp
import androidx.compose.animation.core.updateTransition
-import androidx.compose.foundation.ScrollState
-import androidx.compose.foundation.ScrollState.Companion.Saver
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.padding
@@ -36,13 +34,13 @@ fun SearchScaffold(
)
val horizontal by transition.animateDp(label = "horizontal") {
when (it) {
- true -> MaterialTheme.bibLib.dimen.medium
+ true -> MaterialTheme.bibLib.dimen.dp16
else -> MaterialTheme.bibLib.dimen.default
}
}
val vertical by transition.animateDp(label = "vertical") {
when (it) {
- true -> MaterialTheme.bibLib.dimen.small
+ true -> MaterialTheme.bibLib.dimen.dp8
else -> MaterialTheme.bibLib.dimen.default
}
}
@@ -53,7 +51,11 @@ fun SearchScaffold(
) {
Column {
topBar()
- AnimatedVisibility(visible = state.isCollapsed().not()) {
+ AnimatedVisibility(
+ visible = state.isCollapsed().not(),
+ enter = fadeIn() + expandVertically(),
+ exit = fadeOut() + shrinkVertically(),
+ ) {
search()
}
}
diff --git a/app/src/main/java/com/pixelized/biblib/ui/screen/authentication/AuthenticationScreen.kt b/app/src/main/java/com/pixelized/biblib/ui/screen/authentication/AuthenticationScreen.kt
index fe5844f..173f8f3 100644
--- a/app/src/main/java/com/pixelized/biblib/ui/screen/authentication/AuthenticationScreen.kt
+++ b/app/src/main/java/com/pixelized/biblib/ui/screen/authentication/AuthenticationScreen.kt
@@ -114,7 +114,7 @@ private fun AuthenticationScreenContent(
AnimatedOffset(
modifier = Modifier
- .padding(all = MaterialTheme.bibLib.dimen.medium)
+ .padding(all = MaterialTheme.bibLib.dimen.dp16)
.align(alignment = Alignment.CenterHorizontally),
) {
Text(
@@ -127,7 +127,7 @@ private fun AuthenticationScreenContent(
Spacer(modifier = Modifier.weight(1f))
AnimatedOffset(
- modifier = Modifier.padding(horizontal = MaterialTheme.bibLib.dimen.medium),
+ modifier = Modifier.padding(horizontal = MaterialTheme.bibLib.dimen.dp16),
) {
LoginField(
modifier = Modifier.fillMaxWidth(),
@@ -137,10 +137,10 @@ private fun AuthenticationScreenContent(
)
}
- Spacer(modifier = Modifier.height(MaterialTheme.bibLib.dimen.small))
+ Spacer(modifier = Modifier.height(MaterialTheme.bibLib.dimen.dp8))
AnimatedOffset(
- modifier = Modifier.padding(horizontal = MaterialTheme.bibLib.dimen.medium),
+ modifier = Modifier.padding(horizontal = MaterialTheme.bibLib.dimen.dp16),
) {
PasswordField(
modifier = Modifier.fillMaxWidth(),
@@ -151,10 +151,10 @@ private fun AuthenticationScreenContent(
)
}
- Spacer(modifier = Modifier.height(MaterialTheme.bibLib.dimen.medium))
+ Spacer(modifier = Modifier.height(MaterialTheme.bibLib.dimen.dp16))
AnimatedOffset(
- modifier = Modifier.padding(horizontal = MaterialTheme.bibLib.dimen.medium),
+ modifier = Modifier.padding(horizontal = MaterialTheme.bibLib.dimen.dp16),
) {
CredentialRemember(
value = rememberPassword,
@@ -162,11 +162,11 @@ private fun AuthenticationScreenContent(
)
}
- Spacer(modifier = Modifier.height(MaterialTheme.bibLib.dimen.medium))
+ Spacer(modifier = Modifier.height(MaterialTheme.bibLib.dimen.dp16))
AnimatedOffset(
modifier = Modifier
- .padding(horizontal = MaterialTheme.bibLib.dimen.medium)
+ .padding(horizontal = MaterialTheme.bibLib.dimen.dp16)
.align(Alignment.End),
) {
Row {
@@ -177,7 +177,7 @@ private fun AuthenticationScreenContent(
Text(text = stringResource(id = R.string.action_register))
}
- Spacer(modifier = Modifier.width(MaterialTheme.bibLib.dimen.small))
+ Spacer(modifier = Modifier.width(MaterialTheme.bibLib.dimen.dp8))
Button(
colors = ButtonDefaults.buttonColors(),
@@ -193,7 +193,7 @@ private fun AuthenticationScreenContent(
AnimatedOffset {
Button(
modifier = Modifier
- .padding(all = MaterialTheme.bibLib.dimen.medium)
+ .padding(all = MaterialTheme.bibLib.dimen.dp16)
.fillMaxWidth(),
colors = ButtonDefaults.outlinedButtonColors(),
onClick = onGoogleSignIn,
@@ -299,7 +299,7 @@ private fun CredentialRemember(
onCheckedChange = null
)
- Spacer(modifier = Modifier.width(MaterialTheme.bibLib.dimen.small))
+ Spacer(modifier = Modifier.width(MaterialTheme.bibLib.dimen.dp8))
Text(
modifier = Modifier.align(Alignment.CenterVertically),
diff --git a/app/src/main/java/com/pixelized/biblib/ui/screen/connectivity/ConnectivityViewModel.kt b/app/src/main/java/com/pixelized/biblib/ui/screen/connectivity/ConnectivityViewModel.kt
new file mode 100644
index 0000000..9f0a81d
--- /dev/null
+++ b/app/src/main/java/com/pixelized/biblib/ui/screen/connectivity/ConnectivityViewModel.kt
@@ -0,0 +1,27 @@
+package com.pixelized.biblib.ui.screen.connectivity
+
+import androidx.compose.runtime.State
+import androidx.compose.runtime.mutableStateOf
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.viewModelScope
+import com.pixelized.biblib.repository.connectivity.ConnectivityRepository
+import dagger.hilt.android.lifecycle.HiltViewModel
+import kotlinx.coroutines.launch
+import javax.inject.Inject
+
+@HiltViewModel
+class ConnectivityViewModel @Inject constructor(
+ private val connectivityRepository: ConnectivityRepository,
+) : ViewModel() {
+
+ private val _isNetworkAvailable = mutableStateOf(connectivityRepository.isNetworkAvailable)
+ val isNetworkAvailable: State get() = _isNetworkAvailable
+
+ init {
+ viewModelScope.launch {
+ connectivityRepository.networkAvailabilityFlow.collect {
+ _isNetworkAvailable.value = it
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/pixelized/biblib/ui/screen/detail/DetailScreen.kt b/app/src/main/java/com/pixelized/biblib/ui/screen/detail/DetailScreen.kt
index cf8ed58..3f95540 100644
--- a/app/src/main/java/com/pixelized/biblib/ui/screen/detail/DetailScreen.kt
+++ b/app/src/main/java/com/pixelized/biblib/ui/screen/detail/DetailScreen.kt
@@ -2,7 +2,6 @@ package com.pixelized.biblib.ui.screen.detail
import android.content.res.Configuration.UI_MODE_NIGHT_NO
import android.content.res.Configuration.UI_MODE_NIGHT_YES
-import androidx.activity.compose.BackHandler
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
@@ -68,13 +67,13 @@ private fun DetailScreenContent(
modifier = Modifier
.verticalScroll(rememberScrollState())
.systemBarsPadding()
- .padding(all = MaterialTheme.bibLib.dimen.medium)
+ .padding(all = MaterialTheme.bibLib.dimen.dp16)
.then(modifier)
) {
AnimatedOffset(
modifier = Modifier
.fillMaxWidth()
- .padding(vertical = MaterialTheme.bibLib.dimen.medium)
+ .padding(vertical = MaterialTheme.bibLib.dimen.dp16)
.height(MaterialTheme.bibLib.dimen.detail.cover),
contentAlignment = Alignment.Center
) {
@@ -89,7 +88,7 @@ private fun DetailScreenContent(
)
}
- Row(modifier = Modifier.padding(vertical = MaterialTheme.bibLib.dimen.medium)) {
+ Row(modifier = Modifier.padding(vertical = MaterialTheme.bibLib.dimen.dp16)) {
AnimatedOffset(
modifier = Modifier.weight(1f),
) {
@@ -98,12 +97,12 @@ private fun DetailScreenContent(
onClick = onMobi,
) {
Icon(imageVector = Icons.Default.Download, contentDescription = null)
- Spacer(modifier = Modifier.width(MaterialTheme.bibLib.dimen.extraSmall))
+ Spacer(modifier = Modifier.width(MaterialTheme.bibLib.dimen.dp4))
Text(text = stringResource(id = R.string.action_mobi))
}
}
- Spacer(modifier = Modifier.padding(all = MaterialTheme.bibLib.dimen.extraSmall))
+ Spacer(modifier = Modifier.padding(all = MaterialTheme.bibLib.dimen.dp4))
AnimatedOffset(
modifier = Modifier.weight(1f),
@@ -113,12 +112,12 @@ private fun DetailScreenContent(
onClick = onEpub,
) {
Icon(imageVector = Icons.Default.Download, contentDescription = null)
- Spacer(modifier = Modifier.width(MaterialTheme.bibLib.dimen.extraSmall))
+ Spacer(modifier = Modifier.width(MaterialTheme.bibLib.dimen.dp4))
Text(text = stringResource(id = R.string.action_epub))
}
}
- Spacer(modifier = Modifier.padding(all = MaterialTheme.bibLib.dimen.extraSmall))
+ Spacer(modifier = Modifier.padding(all = MaterialTheme.bibLib.dimen.dp4))
AnimatedOffset(
modifier = Modifier.weight(1f),
@@ -128,7 +127,7 @@ private fun DetailScreenContent(
onClick = onSend,
) {
Icon(imageVector = Icons.Default.Send, contentDescription = "")
- Spacer(modifier = Modifier.width(MaterialTheme.bibLib.dimen.extraSmall))
+ Spacer(modifier = Modifier.width(MaterialTheme.bibLib.dimen.dp4))
Text(text = stringResource(id = R.string.action_send))
}
}
@@ -149,7 +148,7 @@ private fun DetailScreenContent(
AnimatedOffset(
modifier = Modifier
.align(alignment = Alignment.CenterHorizontally)
- .padding(bottom = MaterialTheme.bibLib.dimen.medium),
+ .padding(bottom = MaterialTheme.bibLib.dimen.dp16),
) {
Text(
fontWeight = FontWeight.Bold,
@@ -160,7 +159,7 @@ private fun DetailScreenContent(
}
Row(
- modifier = Modifier.padding(bottom = MaterialTheme.bibLib.dimen.small),
+ modifier = Modifier.padding(bottom = MaterialTheme.bibLib.dimen.dp8),
) {
AnimatedOffset(modifier = Modifier.weight(1f)) {
TitleLabel(
@@ -185,7 +184,7 @@ private fun DetailScreenContent(
}
AnimatedOffset(
- modifier = Modifier.padding(bottom = MaterialTheme.bibLib.dimen.medium),
+ modifier = Modifier.padding(bottom = MaterialTheme.bibLib.dimen.dp16),
) {
TitleLabel(
title = stringResource(id = R.string.detail_series),
diff --git a/app/src/main/java/com/pixelized/biblib/ui/screen/home/HomeScreen.kt b/app/src/main/java/com/pixelized/biblib/ui/screen/home/HomeScreen.kt
index 3cfae6a..c676aa7 100644
--- a/app/src/main/java/com/pixelized/biblib/ui/screen/home/HomeScreen.kt
+++ b/app/src/main/java/com/pixelized/biblib/ui/screen/home/HomeScreen.kt
@@ -1,15 +1,13 @@
package com.pixelized.biblib.ui.screen.home
import androidx.activity.compose.BackHandler
-import androidx.compose.foundation.background
import androidx.compose.foundation.layout.*
-import androidx.compose.material.ExperimentalMaterialApi
-import androidx.compose.runtime.Composable
+import androidx.compose.runtime.*
+import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
-import androidx.compose.ui.draw.clip
import androidx.compose.ui.draw.clipToBounds
-import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.unit.dp
+import androidx.compose.ui.platform.LocalSoftwareKeyboardController
+import androidx.compose.ui.platform.SoftwareKeyboardController
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.navigation.NavHostController
import androidx.navigation.compose.rememberNavController
@@ -19,14 +17,18 @@ import com.pixelized.biblib.ui.scaffold.BottomDetailScaffold
import com.pixelized.biblib.ui.scaffold.SearchScaffold
import com.pixelized.biblib.ui.scaffold.SearchScaffoldState
import com.pixelized.biblib.ui.scaffold.rememberSearchScaffoldState
+import com.pixelized.biblib.ui.screen.profile.ProfileScreen
-@OptIn(ExperimentalMaterialApi::class)
+@OptIn(ExperimentalComposeUiApi::class)
@Composable
fun HomeScreen(
accountViewModel: HomeViewModel = hiltViewModel(),
+ keyboard: SoftwareKeyboardController? = LocalSoftwareKeyboardController.current,
navHostController: NavHostController = rememberNavController(),
searchScaffoldState: SearchScaffoldState = rememberSearchScaffoldState(),
) {
+ var pouet: String by remember { mutableStateOf("aucun") }
+
BottomDetailScaffold {
SearchScaffold(
state = searchScaffoldState,
@@ -39,6 +41,16 @@ fun HomeScreen(
avatar = accountViewModel.avatar,
onSearch = {
if (searchScaffoldState.isCollapsed()) {
+ pouet = "search"
+ searchScaffoldState.expand()
+ } else {
+ keyboard?.hide()
+ searchScaffoldState.collapse()
+ }
+ },
+ onAvatar = {
+ if (searchScaffoldState.isCollapsed()) {
+ pouet = "profile"
searchScaffoldState.expand()
} else {
searchScaffoldState.collapse()
@@ -47,7 +59,12 @@ fun HomeScreen(
)
},
search = {
- Box(modifier = Modifier.fillMaxSize())
+ Box(modifier = Modifier.fillMaxSize()) {
+ when (pouet) {
+ "profile" -> ProfileScreen()
+ "search" -> Unit
+ }
+ }
},
content = {
Column {
@@ -55,12 +72,12 @@ fun HomeScreen(
homePageNavController = navHostController
)
PageNavHost(
- modifier = Modifier.padding(it),
navHostController = navHostController,
)
}
},
)
+
BackHandler(searchScaffoldState.isCollapsed().not()) {
searchScaffoldState.collapse()
}
diff --git a/app/src/main/java/com/pixelized/biblib/ui/screen/home/HomeSearchBar.kt b/app/src/main/java/com/pixelized/biblib/ui/screen/home/HomeSearchBar.kt
deleted file mode 100644
index e15d67c..0000000
--- a/app/src/main/java/com/pixelized/biblib/ui/screen/home/HomeSearchBar.kt
+++ /dev/null
@@ -1,100 +0,0 @@
-package com.pixelized.biblib.ui.screen.home
-
-import android.content.res.Configuration.UI_MODE_NIGHT_NO
-import android.content.res.Configuration.UI_MODE_NIGHT_YES
-import androidx.compose.foundation.Image
-import androidx.compose.foundation.clickable
-import androidx.compose.foundation.layout.*
-import androidx.compose.foundation.shape.RoundedCornerShape
-import androidx.compose.material.*
-import androidx.compose.material.icons.Icons
-import androidx.compose.material.icons.filled.Search
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.rememberUpdatedState
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.draw.clip
-import androidx.compose.ui.graphics.painter.Painter
-import androidx.compose.ui.res.painterResource
-import androidx.compose.ui.tooling.preview.Preview
-import androidx.compose.ui.unit.dp
-import androidx.hilt.navigation.compose.hiltViewModel
-import com.pixelized.biblib.R
-import com.pixelized.biblib.ui.navigation.screen.LocalScreenNavHostController
-import com.pixelized.biblib.ui.navigation.screen.navigateToProfile
-import com.pixelized.biblib.ui.theme.BibLibTheme
-import com.pixelized.biblib.utils.extention.todo
-
-@Composable
-fun HomeSearchBar(
- accountViewModel: HomeViewModel = hiltViewModel()
-) {
- val screenNavHostController = LocalScreenNavHostController.current
- val avatar by rememberUpdatedState(accountViewModel.avatar)
-
- HomeSearchBarContent(
- modifier = Modifier.padding(vertical = 8.dp, horizontal = 16.dp),
- avatar = avatar,
- onAvatar = {
- screenNavHostController.navigateToProfile()
- }
- )
-}
-
-@Composable
-private fun HomeSearchBarContent(
- modifier: Modifier = Modifier,
- avatar: Painter,
- onAvatar: () -> Unit = todo(),
- onSearch: () -> Unit = todo(),
-) {
- Card(
- modifier = modifier,
- elevation = 8.dp
- ) {
- Row(
- modifier = Modifier
- .clickable(onClick = onSearch)
- .fillMaxWidth()
- .height(48.dp),
- verticalAlignment = Alignment.CenterVertically
- ) {
- Icon(
- modifier = Modifier
- .size(42.dp)
- .padding(horizontal = 8.dp),
- imageVector = Icons.Default.Search,
- contentDescription = null
- )
- Text(
- modifier = Modifier.weight(1f),
- color = MaterialTheme.colors.onSurface,
- text = "Rechercher sur BibLib"
- )
- IconButton(
- modifier = Modifier.padding(horizontal = 8.dp),
- onClick = onAvatar,
- ) {
- Image(
- modifier = Modifier
- .size(32.dp)
- .clip(RoundedCornerShape(50)),
- painter = avatar,
- contentDescription = null
- )
- }
- }
- }
-}
-
-@Composable
-@Preview(uiMode = UI_MODE_NIGHT_NO)
-@Preview(uiMode = UI_MODE_NIGHT_YES)
-private fun HomeSearchBarContentPreview() {
- BibLibTheme {
- HomeSearchBarContent(
- avatar = painterResource(R.drawable.ic_baseline_auto_stories_24)
- )
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/pixelized/biblib/ui/screen/home/common/composable/BookThumbnail.kt b/app/src/main/java/com/pixelized/biblib/ui/screen/home/common/composable/BookThumbnail.kt
index a43e0ec..2aa46ab 100644
--- a/app/src/main/java/com/pixelized/biblib/ui/screen/home/common/composable/BookThumbnail.kt
+++ b/app/src/main/java/com/pixelized/biblib/ui/screen/home/common/composable/BookThumbnail.kt
@@ -23,12 +23,13 @@ import com.pixelized.biblib.utils.extention.bibLib
@Composable
fun BookThumbnail(
+ modifier: Modifier = Modifier,
thumbnail: BookThumbnailUio?,
onClick: (BookThumbnailUio) -> Unit = { },
) {
val currentOnClick by rememberUpdatedState(newValue = onClick)
Card(
- modifier = Modifier
+ modifier = modifier
.clickable(enabled = thumbnail != null) {
thumbnail?.let { currentOnClick(it) }
}
@@ -47,7 +48,7 @@ fun BookThumbnail(
Column(
modifier = Modifier
.fillMaxWidth()
- .padding(MaterialTheme.bibLib.dimen.small)
+ .padding(MaterialTheme.bibLib.dimen.dp8)
) {
Text(
style = MaterialTheme.typography.body1,
diff --git a/app/src/main/java/com/pixelized/biblib/ui/screen/home/common/composable/LazyBookThumbnailColumn.kt b/app/src/main/java/com/pixelized/biblib/ui/screen/home/common/composable/LazyBookThumbnailColumn.kt
index 1782c09..dbf784d 100644
--- a/app/src/main/java/com/pixelized/biblib/ui/screen/home/common/composable/LazyBookThumbnailColumn.kt
+++ b/app/src/main/java/com/pixelized/biblib/ui/screen/home/common/composable/LazyBookThumbnailColumn.kt
@@ -1,16 +1,26 @@
package com.pixelized.biblib.ui.screen.home.common.composable
-import androidx.compose.foundation.layout.Arrangement
-import androidx.compose.foundation.layout.PaddingValues
-import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.animation.AnimatedVisibility
+import androidx.compose.animation.expandVertically
+import androidx.compose.animation.shrinkVertically
+import androidx.compose.foundation.ExperimentalFoundationApi
+import androidx.compose.foundation.background
+import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.LazyListState
import androidx.compose.foundation.lazy.rememberLazyListState
+import androidx.compose.material.ButtonDefaults
+import androidx.compose.material.Icon
import androidx.compose.material.MaterialTheme
+import androidx.compose.material.Text
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.CloudOff
import androidx.compose.runtime.*
+import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.paging.PagingData
import androidx.paging.compose.LazyPagingItems
@@ -23,12 +33,14 @@ import com.pixelized.biblib.ui.theme.BibLibTheme
import com.pixelized.biblib.utils.extention.bibLib
import kotlinx.coroutines.flow.flowOf
+@OptIn(ExperimentalFoundationApi::class)
@Composable
fun LazyBookThumbnailColumn(
modifier: Modifier = Modifier,
- verticalArrangement: Arrangement.Vertical = Arrangement.spacedBy(MaterialTheme.bibLib.dimen.medium),
- contentPadding: PaddingValues = PaddingValues(all = MaterialTheme.bibLib.dimen.medium),
+ verticalArrangement: Arrangement.Vertical = Arrangement.spacedBy(MaterialTheme.bibLib.dimen.dp16),
+ contentPadding: PaddingValues = PaddingValues(),
state: LazyListState = rememberLazyListState(),
+ isNetworkAvailable: () -> State,
books: LazyPagingItems,
onItemClick: (BookThumbnailUio) -> Unit = {},
) {
@@ -39,11 +51,17 @@ fun LazyBookThumbnailColumn(
contentPadding = contentPadding,
state = state,
) {
+ stickyHeader {
+ ConnectivityHeader(
+ isNetworkAvailable = isNetworkAvailable,
+ )
+ }
items(
items = books,
key = { it.id },
) { thumbnail ->
BookThumbnail(
+ modifier = Modifier.padding(horizontal = MaterialTheme.bibLib.dimen.thumbnail.padding),
thumbnail = thumbnail,
onClick = currentOnItemClick,
)
@@ -51,12 +69,51 @@ fun LazyBookThumbnailColumn(
}
}
+@Composable
+fun ConnectivityHeader(
+ modifier : Modifier = Modifier,
+ isNetworkAvailable: () -> State
+) {
+ val showHideHeader by isNetworkAvailable()
+ AnimatedVisibility(
+ visible = showHideHeader.not(),
+ enter = expandVertically(),
+ exit = shrinkVertically(),
+ ) {
+ Row(
+ modifier = modifier
+ .background(color = MaterialTheme.colors.error)
+ .fillMaxWidth()
+ .sizeIn(minHeight = ButtonDefaults.MinHeight)
+ .padding(
+ horizontal = MaterialTheme.bibLib.dimen.thumbnail.padding,
+ vertical = MaterialTheme.bibLib.dimen.thumbnail.arrangement,
+ ),
+ verticalAlignment = Alignment.CenterVertically,
+ ) {
+ Icon(
+ modifier = Modifier.padding(end = MaterialTheme.bibLib.dimen.dp8),
+ imageVector = Icons.Default.CloudOff,
+ tint = MaterialTheme.colors.onError,
+ contentDescription = null
+ )
+ Text(
+ style = MaterialTheme.typography.caption,
+ color = MaterialTheme.colors.onError,
+ text = stringResource(id = R.string.error_offline),
+ )
+ }
+ }
+}
+
@Composable
@Preview
private fun LazyBookThumbnailColumnPreview() {
+ val isNetworkAvailable = remember { mutableStateOf(false) }
BibLibTheme {
LazyBookThumbnailColumn(
modifier = Modifier.fillMaxSize(),
+ isNetworkAvailable = { isNetworkAvailable },
books = previewResources(),
)
}
diff --git a/app/src/main/java/com/pixelized/biblib/ui/screen/home/page/books/BooksPage.kt b/app/src/main/java/com/pixelized/biblib/ui/screen/home/page/books/BooksPage.kt
index dba5f99..98c8932 100644
--- a/app/src/main/java/com/pixelized/biblib/ui/screen/home/page/books/BooksPage.kt
+++ b/app/src/main/java/com/pixelized/biblib/ui/screen/home/page/books/BooksPage.kt
@@ -2,12 +2,12 @@ package com.pixelized.biblib.ui.screen.home.page.books
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
-import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.material.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.ui.tooling.preview.Preview
import androidx.hilt.navigation.compose.hiltViewModel
import com.pixelized.biblib.ui.scaffold.LocalBottomDetailController
+import com.pixelized.biblib.ui.screen.connectivity.ConnectivityViewModel
import com.pixelized.biblib.ui.screen.home.common.composable.LazyBookThumbnailColumn
import com.pixelized.biblib.ui.screen.home.page.news.NewsPage
import com.pixelized.biblib.ui.theme.BibLibTheme
@@ -15,13 +15,14 @@ import com.pixelized.biblib.utils.extention.bibLib
@Composable
fun BooksPage(
+ connectivityViewModel: ConnectivityViewModel = hiltViewModel(),
booksViewModel: BooksViewModel = hiltViewModel()
) {
val bottomDetailState = LocalBottomDetailController.current
LazyBookThumbnailColumn(
verticalArrangement = Arrangement.spacedBy(MaterialTheme.bibLib.dimen.thumbnail.arrangement),
- contentPadding = PaddingValues(all = MaterialTheme.bibLib.dimen.thumbnail.padding),
+ isNetworkAvailable = { connectivityViewModel.isNetworkAvailable },
books = booksViewModel.books,
onItemClick = {
bottomDetailState.expandBookDetail(id = it.id)
diff --git a/app/src/main/java/com/pixelized/biblib/ui/screen/home/page/news/NewsPage.kt b/app/src/main/java/com/pixelized/biblib/ui/screen/home/page/news/NewsPage.kt
index a7a5d0d..8295ba2 100644
--- a/app/src/main/java/com/pixelized/biblib/ui/screen/home/page/news/NewsPage.kt
+++ b/app/src/main/java/com/pixelized/biblib/ui/screen/home/page/news/NewsPage.kt
@@ -2,25 +2,26 @@ package com.pixelized.biblib.ui.screen.home.page.news
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
-import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.material.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.ui.tooling.preview.Preview
import androidx.hilt.navigation.compose.hiltViewModel
import com.pixelized.biblib.ui.scaffold.LocalBottomDetailController
+import com.pixelized.biblib.ui.screen.connectivity.ConnectivityViewModel
import com.pixelized.biblib.ui.screen.home.common.composable.LazyBookThumbnailColumn
import com.pixelized.biblib.ui.theme.BibLibTheme
import com.pixelized.biblib.utils.extention.bibLib
@Composable
fun NewsPage(
+ connectivityViewModel: ConnectivityViewModel = hiltViewModel(),
booksViewModel: NewsBookViewModel = hiltViewModel()
) {
val bottomDetail = LocalBottomDetailController.current
LazyBookThumbnailColumn(
verticalArrangement = Arrangement.spacedBy(MaterialTheme.bibLib.dimen.thumbnail.arrangement),
- contentPadding = PaddingValues(all = MaterialTheme.bibLib.dimen.thumbnail.padding),
+ isNetworkAvailable = { connectivityViewModel.isNetworkAvailable },
books = booksViewModel.news,
onItemClick = {
bottomDetail.expandBookDetail(id = it.id)
diff --git a/app/src/main/java/com/pixelized/biblib/ui/screen/profile/ProfileScreen.kt b/app/src/main/java/com/pixelized/biblib/ui/screen/profile/ProfileScreen.kt
index 6eb0a2d..ebfa1c7 100644
--- a/app/src/main/java/com/pixelized/biblib/ui/screen/profile/ProfileScreen.kt
+++ b/app/src/main/java/com/pixelized/biblib/ui/screen/profile/ProfileScreen.kt
@@ -4,66 +4,85 @@ import android.content.Intent
import android.content.res.Configuration.UI_MODE_NIGHT_NO
import android.content.res.Configuration.UI_MODE_NIGHT_YES
import android.net.Uri
-import androidx.compose.foundation.layout.Column
-import androidx.compose.material.FloatingActionButton
-import androidx.compose.material.MaterialTheme
-import androidx.compose.material.Text
+import androidx.compose.foundation.layout.*
+import androidx.compose.material.*
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.Edit
import androidx.compose.runtime.Composable
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.rememberUpdatedState
+import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.tooling.preview.Preview
import androidx.hilt.navigation.compose.hiltViewModel
-import androidx.navigation.NavHostController
import com.pixelized.biblib.network.client.IBibLibClient
import com.pixelized.biblib.ui.composable.StateUio
import com.pixelized.biblib.ui.theme.BibLibTheme
+import com.pixelized.biblib.utils.extention.bibLib
+import com.pixelized.biblib.utils.extention.todo
@Composable
fun ProfileScreen(
viewModel: ProfileViewModel = hiltViewModel(),
) {
val context = LocalContext.current
- val user by rememberUpdatedState(newValue = viewModel.user)
-
- when (val unwrap = user) {
- is StateUio.Success -> ProfileScreenContent(user = unwrap.value)
+ when (val user = viewModel.user) {
+ is StateUio.Progress -> Unit
+ is StateUio.Success -> ProfileScreenContent(
+ modifier = Modifier.padding(MaterialTheme.bibLib.dimen.dp16),
+ user = user.value,
+ onEditClick = {
+ val intent = Intent(Intent.ACTION_VIEW, Uri.parse(IBibLibClient.EDIT_PROFILE))
+ context.startActivity(intent)
+ }
+ )
+ is StateUio.Failure -> Unit
}
-
- FloatingActionButton(
- onClick = {
- context.startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(IBibLibClient.EDIT_PROFILE)))
- },
- content = { },
- )
}
@Composable
private fun ProfileScreenContent(
modifier: Modifier = Modifier,
- user: ProfileViewModel.UserUio,
+ user: UserUio,
+ onEditClick: () -> Unit = todo()
) {
- Column(modifier = modifier) {
+ Column(modifier = modifier.fillMaxWidth()) {
Text(
- style = MaterialTheme.typography.h5,
+ style = MaterialTheme.typography.body1,
color = MaterialTheme.colors.onSurface,
+ text = "Welcome"
+ )
+ Text(
+ style = MaterialTheme.typography.h4,
+ color = MaterialTheme.colors.primary,
text = user.username,
)
- user.firstname?.let {
- Text(
- style = MaterialTheme.typography.body1,
- color = MaterialTheme.colors.onSurface,
- text = it,
- )
- }
- user.lastname?.let {
- Text(
- style = MaterialTheme.typography.body1,
- color = MaterialTheme.colors.onSurface,
- text = it,
- )
+
+ if (user.firstname?.isNotEmpty() == true || user.lastname?.isNotEmpty() == true) {
+ Row {
+ user.firstname?.let {
+ Text(
+ modifier = Modifier.padding(end = MaterialTheme.bibLib.dimen.dp4),
+ style = MaterialTheme.typography.body1,
+ color = MaterialTheme.colors.onSurface,
+ text = it,
+ )
+ }
+ user.lastname?.let {
+ Text(
+ style = MaterialTheme.typography.body1,
+ color = MaterialTheme.colors.onSurface,
+ text = it,
+ )
+ }
+ }
}
+
+ Text(
+ modifier = Modifier.padding(top = MaterialTheme.bibLib.dimen.dp16),
+ style = MaterialTheme.typography.body1,
+ color = MaterialTheme.colors.onSurface,
+ text = "Linked emails:"
+ )
user.amazonEmails.forEach {
Text(
style = MaterialTheme.typography.body1,
@@ -71,7 +90,25 @@ private fun ProfileScreenContent(
text = it,
)
}
+
+ Button(
+ modifier = Modifier
+ .padding(top = MaterialTheme.bibLib.dimen.dp16)
+ .align(Alignment.End),
+ colors = ButtonDefaults.outlinedButtonColors(),
+ onClick = onEditClick,
+ ) {
+ Icon(
+ imageVector = Icons.Default.Edit,
+ contentDescription = null
+ )
+ Text(
+ modifier = Modifier.padding(start = MaterialTheme.bibLib.dimen.dp8),
+ text = "Edit profile"
+ )
+ }
}
+
}
@Composable
@@ -79,14 +116,19 @@ private fun ProfileScreenContent(
@Preview(showBackground = true, uiMode = UI_MODE_NIGHT_YES)
private fun ProfileScreenContentPreview() {
BibLibTheme {
- val user = ProfileViewModel.UserUio(
- username = "R. Daneel Olivaw",
- firstname = "R. Daneel",
- lastname = "Olivaw",
- amazonEmails = listOf("r.daneel.olivaw@biblib.com"),
- )
- ProfileScreenContent(
- user = user
- )
+ Box {
+ ProfileScreenContent(
+ modifier = Modifier.padding(MaterialTheme.bibLib.dimen.dp16),
+ user = UserUio(
+ username = "DefinitelyNotARobot",
+ firstname = "R. Daneel",
+ lastname = "Olivaw",
+ amazonEmails = listOf(
+ "r.daneel.olivaw@robot.com",
+ "r.daneel.olivaw@biblib.com",
+ ),
+ ),
+ )
+ }
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/pixelized/biblib/ui/screen/profile/ProfileViewModel.kt b/app/src/main/java/com/pixelized/biblib/ui/screen/profile/ProfileViewModel.kt
index b529f4d..27468c5 100644
--- a/app/src/main/java/com/pixelized/biblib/ui/screen/profile/ProfileViewModel.kt
+++ b/app/src/main/java/com/pixelized/biblib/ui/screen/profile/ProfileViewModel.kt
@@ -4,6 +4,7 @@ import android.app.Application
import android.util.Log
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.setValue
import androidx.lifecycle.viewModelScope
import com.pixelized.biblib.model.user.User
import com.pixelized.biblib.network.client.IBibLibClient
@@ -23,8 +24,8 @@ class ProfileViewModel @Inject constructor(
private val client: IBibLibClient,
) : ACoverViewModel(application, cacheBook) {
- private val _user = mutableStateOf>(StateUio.Progress())
- val user by _user
+ var user by mutableStateOf>(StateUio.Progress())
+ private set
init {
updateUser()
@@ -32,29 +33,22 @@ class ProfileViewModel @Inject constructor(
private fun updateUser() {
viewModelScope.launch(Dispatchers.IO) {
- try {
+ user = try {
val factory = UserFactory()
val response = client.service.user()
- val user = factory.fromUserResponseToUser(response)
- _user.value = StateUio.Success(user.toUio())
+ val data = factory.fromUserResponseToUser(response)
+ StateUio.Success(data.toUio())
} catch (exception: Exception) {
Log.e("AccountViewModel", exception.message, exception)
- _user.value = StateUio.Failure(exception)
+ StateUio.Failure(exception)
}
}
}
- data class UserUio(
- val username: String,
- val firstname: String?,
- val lastname: String?,
- val amazonEmails: List,
+ private fun User.toUio() = UserUio(
+ username = username,
+ firstname = firstname,
+ lastname = lastname,
+ amazonEmails = amazonEmails.toList(),
)
-}
-
-private fun User.toUio() = ProfileViewModel.UserUio(
- username = username,
- firstname = firstname,
- lastname = lastname,
- amazonEmails = amazonEmails.toList(),
-)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/pixelized/biblib/ui/screen/profile/UserUio.kt b/app/src/main/java/com/pixelized/biblib/ui/screen/profile/UserUio.kt
new file mode 100644
index 0000000..adb05fb
--- /dev/null
+++ b/app/src/main/java/com/pixelized/biblib/ui/screen/profile/UserUio.kt
@@ -0,0 +1,9 @@
+package com.pixelized.biblib.ui.screen.profile
+
+
+data class UserUio(
+ val username: String,
+ val firstname: String?,
+ val lastname: String?,
+ val amazonEmails: List,
+)
\ No newline at end of file
diff --git a/app/src/main/java/com/pixelized/biblib/ui/theme/color/BibLibColor.kt b/app/src/main/java/com/pixelized/biblib/ui/theme/color/BibLibColor.kt
index 3ad3968..e2405e2 100644
--- a/app/src/main/java/com/pixelized/biblib/ui/theme/color/BibLibColor.kt
+++ b/app/src/main/java/com/pixelized/biblib/ui/theme/color/BibLibColor.kt
@@ -21,6 +21,7 @@ fun bibLibDarkColors(
onPrimary = Color.White,
onSecondary = Color.White,
error = BibLibColorPalette.Red,
+ onError = Color.White,
),
) = BibLibColor(
base = base,
@@ -33,6 +34,7 @@ fun bibLibLightColors(
onPrimary = Color.White,
onSecondary = Color.White,
error = BibLibColorPalette.Red,
+ onError = Color.White,
)
) = BibLibColor(
base = base,
diff --git a/app/src/main/java/com/pixelized/biblib/ui/theme/dimen/BibLibDimen.kt b/app/src/main/java/com/pixelized/biblib/ui/theme/dimen/BibLibDimen.kt
index 74d33b2..00d4221 100644
--- a/app/src/main/java/com/pixelized/biblib/ui/theme/dimen/BibLibDimen.kt
+++ b/app/src/main/java/com/pixelized/biblib/ui/theme/dimen/BibLibDimen.kt
@@ -10,11 +10,11 @@ import androidx.compose.ui.unit.dp
@Immutable
data class BibLibDimen(
val default: Dp = 0.dp,
- val extraSmall: Dp = 4.dp,
- val small: Dp = 8.dp,
- val medium: Dp = 16.dp,
- val large: Dp = 32.dp,
- val extraLarge: Dp = 64.dp,
+ val dp4: Dp = 4.dp,
+ val dp8: Dp = 8.dp,
+ val dp16: Dp = 16.dp,
+ val dp32: Dp = 32.dp,
+ val dp64: Dp = 64.dp,
val dialog: Dialog = Dialog(),
val thumbnail: BookThumbnail = BookThumbnail(),
val detail: BookDetail = BookDetail(),
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index e1f8b13..c4beb8c 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -24,6 +24,7 @@
Oops!
Oops, connection failed!
Oops! library download failed!
+ Vous ĂȘtes hors ligne.
Entering the Imperial Library of Trantor.
Downloading the Imperial Library of Trantor.
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 20ac5e6..b688fc5 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -24,6 +24,7 @@
Oops!
Oops, connection failed!
Oops! library download failed!
+ You are offline.
Entering the Imperial Library of Trantor.
Downloading the Imperial Library of Trantor.