Skip to content

Commit

Permalink
feat: (#18) handle the user's role
Browse files Browse the repository at this point in the history
  • Loading branch information
kenkoro committed Mar 19, 2024
1 parent a869356 commit ba4bf06
Show file tree
Hide file tree
Showing 5 changed files with 74 additions and 81 deletions.
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.kenkoro.taurus.client.feature.sewing.presentation.screen.dashboard

import android.annotation.SuppressLint
import android.util.Log
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
Expand Down Expand Up @@ -28,18 +29,23 @@ import com.kenkoro.taurus.client.core.connectivity.ConnectivityObserver
import com.kenkoro.taurus.client.core.connectivity.NetworkConnectivityObserver
import com.kenkoro.taurus.client.core.connectivity.Status
import com.kenkoro.taurus.client.feature.sewing.data.source.remote.dto.request.LoginRequest
import com.kenkoro.taurus.client.feature.sewing.data.source.remote.dto.response.GetUserResponse
import com.kenkoro.taurus.client.feature.sewing.data.util.UserRole
import com.kenkoro.taurus.client.feature.sewing.presentation.screen.dashboard.components.BottomBarHost
import com.kenkoro.taurus.client.feature.sewing.presentation.screen.login.LoginViewModel
import com.kenkoro.taurus.client.feature.sewing.presentation.screen.order.OrderScreen
import com.kenkoro.taurus.client.feature.sewing.presentation.screen.user.UserScreen
import com.kenkoro.taurus.client.feature.sewing.presentation.screen.user.UserViewModel
import com.kenkoro.taurus.client.feature.sewing.presentation.shared.components.ErrorSnackbar
import com.kenkoro.taurus.client.feature.sewing.presentation.shared.components.showErrorSnackbar
import com.kenkoro.taurus.client.feature.sewing.presentation.shared.handlers.handleLogin
import com.kenkoro.taurus.client.feature.sewing.presentation.shared.handlers.handleUserGet
import com.kenkoro.taurus.client.feature.sewing.presentation.util.LoginResponseType
import com.kenkoro.taurus.client.ui.theme.AppTheme
import io.ktor.client.call.body

object BottomBarHostIndices {
const val ORDER_SCREEN = 1
const val USER_SCREEN = 1
}

@SuppressLint("UnusedMaterial3ScaffoldPaddingParameter")
Expand All @@ -48,6 +54,7 @@ fun DashboardScreen(
onDashboardNavigate: () -> Unit = {},
loginViewModel: LoginViewModel = hiltViewModel(),
dashboardViewModel: DashboardViewModel = hiltViewModel(),
userViewModel: UserViewModel = hiltViewModel()
) {
val snackbarHostState = remember { SnackbarHostState() }
val message = stringResource(id = R.string.request_error)
Expand All @@ -70,9 +77,9 @@ fun DashboardScreen(
) {
Surface(
modifier =
Modifier
.fillMaxSize()
.background(MaterialTheme.colorScheme.background),
Modifier
.fillMaxSize()
.background(MaterialTheme.colorScheme.background),
) {
if (networkStatus != Status.Available) {
showErrorSnackbar(
Expand All @@ -96,37 +103,30 @@ fun DashboardScreen(
).run {
dashboardViewModel.onResponse(this)
}
}
}

LaunchedEffect(Unit) {
handleLogin(
login = { subject, password, encryptSubjectAndPassword ->
loginViewModel.loginAndEncryptCredentials(
request = LoginRequest(subject, password),
context = context,
encryptSubjectAndPassword = encryptSubjectAndPassword,
)
},
context = context,
).run {
dashboardViewModel.onResponse(this)
handleUserGet(context = context) { firstName, token ->
try {
userViewModel.getUser(firstName, token).body<GetUserResponse>().run {
userViewModel.onGetUserResponse(this)
}
} catch (e: Exception) {
Log.d("kenkoro", e.message!!)
}
userViewModel.onLoad(isUserDataLoading = false)
}
}
}

when (dashboardViewModel.loginResponseType) {
LoginResponseType.Success -> {
BottomBarHost { index ->
BottomBarHost(
isAdmin = userViewModel.user.role == UserRole.Admin
) { index ->
when (index) {
BottomBarHostIndices.ORDER_SCREEN ->
OrderScreen(
networkStatus = networkStatus,
)
BottomBarHostIndices.USER_SCREEN ->
UserScreen(networkStatus = networkStatus)

else ->
UserScreen(
networkStatus = networkStatus,
)
else -> OrderScreen(networkStatus = networkStatus)
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,21 +19,25 @@ import com.kenkoro.taurus.client.feature.sewing.presentation.screen.dashboard.ut
@Composable
fun BottomBarHost(
modifier: Modifier = Modifier,
content: @Composable (index: Int) -> Unit,
isAdmin: Boolean = false,
content: @Composable (index: Int) -> Unit
) {
val tabItems =
listOf(
TabItem(
title = stringResource(id = R.string.bottom_bar_host_users),
selectedIcon = Icons.Filled.Person,
unselectedIcon = Icons.Outlined.Person,
),
mutableListOf(
TabItem(
title = stringResource(id = R.string.bottom_bar_host_orders),
selectedIcon = Icons.Filled.Create,
unselectedIcon = Icons.Outlined.Create,
),
)
)
if (isAdmin) {
tabItems +=
TabItem(
title = stringResource(id = R.string.bottom_bar_host_users),
selectedIcon = Icons.Filled.Person,
unselectedIcon = Icons.Outlined.Person,
)
}

val pagerState =
rememberPagerState {
Expand All @@ -42,9 +46,9 @@ fun BottomBarHost(

BottomBarContent(
modifier =
modifier
.statusBarsPadding()
.navigationBarsPadding(),
modifier
.statusBarsPadding()
.navigationBarsPadding(),
tabItems = tabItems,
pagerState = pagerState,
) { index ->
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.kenkoro.taurus.client.feature.sewing.presentation.screen.user

import android.util.Log
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
Expand All @@ -15,60 +14,32 @@ import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.shadow
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel
import com.kenkoro.taurus.client.core.connectivity.Status
import com.kenkoro.taurus.client.feature.sewing.data.source.remote.dto.response.GetUserResponse
import com.kenkoro.taurus.client.feature.sewing.presentation.screen.user.components.UserScreenButtons
import com.kenkoro.taurus.client.feature.sewing.presentation.screen.user.components.UserTopBar
import com.kenkoro.taurus.client.feature.sewing.presentation.util.DecryptedCredentials
import com.kenkoro.taurus.client.feature.sewing.presentation.util.LocalCredentials
import com.kenkoro.taurus.client.ui.theme.AppTheme
import io.ktor.client.call.body

@Composable
fun UserScreen(
userViewModel: UserViewModel = hiltViewModel(),
networkStatus: Status,
) {
val context = LocalContext.current
val firstName =
DecryptedCredentials.getDecryptedCredential(
filename = LocalCredentials.SUBJECT_FILENAME,
context = context,
).value
val token =
DecryptedCredentials.getDecryptedCredential(
filename = LocalCredentials.TOKEN_FILENAME,
context = context,
).value

LaunchedEffect(Unit) {
try {
userViewModel.getUser(firstName, token).body<GetUserResponse>().run {
userViewModel.onGetUserResponse(this)
}
} catch (e: Exception) {
Log.d("kenkoro", e.message!!)
}
userViewModel.onLoad(isLoading = false)
}

userViewModel.onLoad(isUserDataLoading = false)
AppTheme {
Surface(
modifier =
Modifier
.fillMaxSize()
.background(MaterialTheme.colorScheme.background),
Modifier
.fillMaxSize()
.background(MaterialTheme.colorScheme.background),
) {
Column(modifier = Modifier.fillMaxWidth()) {
UserTopBar(
isLoading = userViewModel.isLoading,
isLoading = userViewModel.isUserDataLoading,
firstName = userViewModel.user.firstName,
)
Spacer(modifier = Modifier.height(40.dp))
Expand All @@ -77,12 +48,12 @@ fun UserScreen(
Button(
enabled = networkStatus == Status.Available,
modifier =
Modifier
.size(width = 175.dp, height = 90.dp)
.shadow(
elevation = 4.dp,
shape = RoundedCornerShape(30.dp),
),
Modifier
.size(width = 175.dp, height = 90.dp)
.shadow(
elevation = 4.dp,
shape = RoundedCornerShape(30.dp),
),
onClick = { /*TODO*/ },
shape = RoundedCornerShape(30.dp),
) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,11 +32,11 @@ class UserViewModel
)
private set

var isLoading by mutableStateOf(true)
var isUserDataLoading by mutableStateOf(true)
private set

fun onLoad(isLoading: Boolean) {
this.isLoading = isLoading
fun onLoad(isUserDataLoading: Boolean) {
this.isUserDataLoading = isUserDataLoading
}

fun onGetUserResponse(userResponse: GetUserResponse) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,28 @@
package com.kenkoro.taurus.client.feature.sewing.presentation.shared.handlers

import android.content.Context
import androidx.compose.ui.platform.LocalContext
import com.kenkoro.taurus.client.feature.sewing.presentation.util.DecryptedCredentials
import com.kenkoro.taurus.client.feature.sewing.presentation.util.LocalCredentials
import com.kenkoro.taurus.client.feature.sewing.presentation.util.LoginResponseType

suspend fun handleUserGet(
context: Context,
getUser: suspend (String, String) -> Unit
) {
val firstName =
DecryptedCredentials.getDecryptedCredential(
filename = LocalCredentials.SUBJECT_FILENAME,
context = context,
).value
val token =
DecryptedCredentials.getDecryptedCredential(
filename = LocalCredentials.TOKEN_FILENAME,
context = context,
).value
getUser(firstName, token)
}

suspend fun handleLogin(
login: suspend (String, String, Boolean) -> LoginResponseType,
context: Context,
Expand Down

0 comments on commit ba4bf06

Please sign in to comment.