Skip to content

Commit

Permalink
Added loading state to home page.
Browse files Browse the repository at this point in the history
  • Loading branch information
andre-j3sus committed May 10, 2024
1 parent faf8cd1 commit 3c4725b
Show file tree
Hide file tree
Showing 5 changed files with 89 additions and 56 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ class HomeActivity : PharmacistActivity() {

setContent {
HomeScreen(
isLoading = viewModel.isLoading,
loggedIn = viewModel.isLoggedIn,
isGuest = viewModel.isGuest,
username = viewModel.username,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ const val WELCOME_TEXT_WIDTH_FACTOR = 0.9f
*/
@Composable
fun HomeScreen(
isLoading: Boolean,
loggedIn: Boolean,
isGuest: Boolean,
username: String?,
Expand All @@ -64,6 +65,7 @@ fun HomeScreen(
) {
HomeHeader(loggedIn, username, Modifier.weight(1f))
HomeButtons(
isLoading,
loggedIn,
onLoginClick,
onRegisterClick,
Expand All @@ -85,6 +87,7 @@ fun HomeScreen(
) {
HomeHeader(loggedIn, username)
HomeButtons(
isLoading,
loggedIn,
onLoginClick,
onRegisterClick,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,9 @@ class HomeViewModel(
val username
get() = sessionManager.username

var isLoading: Boolean by mutableStateOf(false)
private set

/**
* Logs out the user.
*/
Expand All @@ -48,12 +51,14 @@ class HomeViewModel(

Log.d("LOGOUT", "Logging out user")
withTimeoutOrNull(5000) {
isLoading = true
pharmacistService.usersService.logout()
}

sessionManager.clearSession()
isLoggedIn = false
isGuest = false
isLoading = false
Log.d("LOGOUT", "User logged out")
}

Expand All @@ -78,6 +83,7 @@ class HomeViewModel(
if (isLoggedIn || isGuest) return@launch

val guestUserName = "Guest${UUID.randomUUID()}"
isLoading = true
val result = pharmacistService.usersService.register(
username = guestUserName,
password = UUID.randomUUID().toString()
Expand All @@ -93,5 +99,6 @@ class HomeViewModel(
isLoggedIn = true
isGuest = true
}
isLoading = false
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package pt.ulisboa.ist.pharmacist.ui.screens.home.components

import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.material.icons.Icons
Expand All @@ -17,9 +18,11 @@ import androidx.compose.ui.res.stringResource
import pt.ulisboa.ist.pharmacist.R
import pt.ulisboa.ist.pharmacist.ui.screens.home.BUTTON_MAX_WIDTH_FACTOR
import pt.ulisboa.ist.pharmacist.ui.screens.shared.components.IconTextButton
import pt.ulisboa.ist.pharmacist.ui.screens.shared.components.LoadingSpinner

@Composable
fun HomeButtons(
isLoading: Boolean,
loggedIn: Boolean,
onLoginClick: () -> Unit,
onRegisterClick: () -> Unit,
Expand All @@ -31,72 +34,86 @@ fun HomeButtons(
onLogoutClick: () -> Unit,
onAboutClick: () -> Unit
) {
Column {
if (!loggedIn) {
IconTextButton(
onClick = onLoginClick,
imageVector = Icons.AutoMirrored.Rounded.Login,
contentDescription = stringResource(R.string.home_login_button_description),
text = stringResource(R.string.home_login_button_text),
modifier = Modifier.fillMaxWidth(BUTTON_MAX_WIDTH_FACTOR)
)
Box(
contentAlignment = androidx.compose.ui.Alignment.Center,
) {
if (isLoading)
LoadingSpinner(showText = false)
Column {
if (!loggedIn) {
IconTextButton(
enabled = !isLoading,
onClick = onLoginClick,
imageVector = Icons.AutoMirrored.Rounded.Login,
contentDescription = stringResource(R.string.home_login_button_description),
text = stringResource(R.string.home_login_button_text),
modifier = Modifier.fillMaxWidth(BUTTON_MAX_WIDTH_FACTOR)
)

IconTextButton(
onClick = onRegisterClick,
imageVector = Icons.Rounded.PersonAdd,
contentDescription = stringResource(R.string.home_register_button_description),
text = stringResource(R.string.home_register_button_text),
modifier = Modifier.fillMaxWidth(BUTTON_MAX_WIDTH_FACTOR)
)
IconTextButton(
enabled = !isLoading,
onClick = onRegisterClick,
imageVector = Icons.Rounded.PersonAdd,
contentDescription = stringResource(R.string.home_register_button_description),
text = stringResource(R.string.home_register_button_text),
modifier = Modifier.fillMaxWidth(BUTTON_MAX_WIDTH_FACTOR)
)

IconTextButton(
onClick = { onContinueAsGuestClick() },
imageVector = Icons.Rounded.Person,
contentDescription = stringResource(R.string.continue_as_guest),
text = stringResource(R.string.continue_as_guest),
modifier = Modifier.fillMaxWidth(BUTTON_MAX_WIDTH_FACTOR)
)
} else {
IconTextButton(
onClick = onPharmacyMapClick,
imageVector = Icons.Rounded.Map,
contentDescription = stringResource(R.string.home_pharmacy_map_button_description),
text = stringResource(R.string.home_pharmacy_map_button_text),
modifier = Modifier.fillMaxWidth(BUTTON_MAX_WIDTH_FACTOR)
)
IconTextButton(
enabled = !isLoading,
onClick = { onContinueAsGuestClick() },
imageVector = Icons.Rounded.Person,
contentDescription = stringResource(R.string.continue_as_guest),
text = stringResource(R.string.continue_as_guest),
modifier = Modifier.fillMaxWidth(BUTTON_MAX_WIDTH_FACTOR)
)
} else {
IconTextButton(
enabled = !isLoading,
onClick = onPharmacyMapClick,
imageVector = Icons.Rounded.Map,
contentDescription = stringResource(R.string.home_pharmacy_map_button_description),
text = stringResource(R.string.home_pharmacy_map_button_text),
modifier = Modifier.fillMaxWidth(BUTTON_MAX_WIDTH_FACTOR)
)

IconTextButton(
onClick = onSearchMedicineClick,
imageVector = Icons.Rounded.Search,
contentDescription = stringResource(R.string.home_search_medicine_button_description),
text = stringResource(R.string.home_search_medicine_button_text),
modifier = Modifier.fillMaxWidth(BUTTON_MAX_WIDTH_FACTOR)
)
IconTextButton(
enabled = !isLoading,
onClick = onSearchMedicineClick,
imageVector = Icons.Rounded.Search,
contentDescription = stringResource(R.string.home_search_medicine_button_description),
text = stringResource(R.string.home_search_medicine_button_text),
modifier = Modifier.fillMaxWidth(BUTTON_MAX_WIDTH_FACTOR)
)

if (isGuest)
IconTextButton(
enabled = !isLoading,
onClick = onUpgradeAccountClick,
imageVector = Icons.Rounded.Upgrade,
contentDescription = stringResource(R.string.upgrade_account),
text = stringResource(R.string.upgrade_account),
modifier = Modifier.fillMaxWidth(BUTTON_MAX_WIDTH_FACTOR)
)

if (isGuest)
IconTextButton(
onClick = onUpgradeAccountClick,
imageVector = Icons.Rounded.Upgrade,
contentDescription = stringResource(R.string.upgrade_account),
text = stringResource(R.string.upgrade_account),
enabled = !isLoading,
onClick = onLogoutClick,
imageVector = Icons.AutoMirrored.Rounded.Logout,
contentDescription = stringResource(R.string.home_logout_button_description),
text = stringResource(R.string.home_logout_button_text),
modifier = Modifier.fillMaxWidth(BUTTON_MAX_WIDTH_FACTOR)
)
}

IconTextButton(
onClick = onLogoutClick,
imageVector = Icons.AutoMirrored.Rounded.Logout,
contentDescription = stringResource(R.string.home_logout_button_description),
text = stringResource(R.string.home_logout_button_text),
enabled = !isLoading,
onClick = onAboutClick,
imageVector = Icons.Rounded.Info,
contentDescription = stringResource(R.string.home_about_button_description),
text = stringResource(R.string.home_about_button_text),
modifier = Modifier.fillMaxWidth(BUTTON_MAX_WIDTH_FACTOR)
)
}

IconTextButton(
onClick = onAboutClick,
imageVector = Icons.Rounded.Info,
contentDescription = stringResource(R.string.home_about_button_description),
text = stringResource(R.string.home_about_button_text),
modifier = Modifier.fillMaxWidth(BUTTON_MAX_WIDTH_FACTOR)
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import pt.ulisboa.ist.pharmacist.service.http.PharmacistService
import pt.ulisboa.ist.pharmacist.service.http.connection.isFailure
import java.io.ByteArrayOutputStream
import java.io.InputStream
import java.net.URL

object ImageHandlingUtils {

Expand Down Expand Up @@ -106,7 +107,6 @@ object ImageHandlingUtils {

val signedUrl = createSignedUrlResult.data.signedUrl


val uploadResult =
pharmacistService.uploaderService.uploadBoxPhoto(signedUrl, boxPhotoData, mediaType)

Expand Down Expand Up @@ -141,6 +141,11 @@ object ImageHandlingUtils {

return chooser
}

fun downloadImage(url: String): ImageBitmap? {
val inputStream = URL(url).openStream()
return BitmapFactory.decodeStream(inputStream)?.asImageBitmap()
}
}

data class HandleImageSelectionOutputData(
Expand Down

0 comments on commit 3c4725b

Please sign in to comment.