diff --git a/app/src/main/java/com/cornellappdev/hustle/ui/screens/home/HomeScreen.kt b/app/src/main/java/com/cornellappdev/hustle/ui/screens/home/HomeScreen.kt index 53efd34..082f1f4 100644 --- a/app/src/main/java/com/cornellappdev/hustle/ui/screens/home/HomeScreen.kt +++ b/app/src/main/java/com/cornellappdev/hustle/ui/screens/home/HomeScreen.kt @@ -3,6 +3,7 @@ package com.cornellappdev.hustle.ui.screens.home import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel +import com.cornellappdev.hustle.ui.viewmodels.home.HomeScreenViewModel @Composable fun HomeScreen(viewModel: HomeScreenViewModel = hiltViewModel()) { diff --git a/app/src/main/java/com/cornellappdev/hustle/ui/screens/onboarding/SignInScreen.kt b/app/src/main/java/com/cornellappdev/hustle/ui/screens/onboarding/SignInScreen.kt new file mode 100644 index 0000000..ef69b4b --- /dev/null +++ b/app/src/main/java/com/cornellappdev/hustle/ui/screens/onboarding/SignInScreen.kt @@ -0,0 +1,61 @@ +package com.cornellappdev.hustle.ui.screens.onboarding + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.tooling.preview.PreviewParameter +import androidx.compose.ui.tooling.preview.PreviewParameterProvider +import com.cornellappdev.hustle.ui.components.general.ErrorMessage +import com.cornellappdev.hustle.ui.components.onboarding.GoogleSignInButton + +@Composable +fun SignInScreen( + onGoogleSignInButtonClick: () -> Unit, + isSignInLoading: Boolean, + errorMessage: String?, + onDismissError: () -> Unit, + modifier: Modifier = Modifier, +) { + Box(modifier = modifier.fillMaxSize()) { + Column( + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center, + modifier = Modifier.fillMaxSize() + ) { + GoogleSignInButton( + onClick = onGoogleSignInButtonClick, isLoading = isSignInLoading + ) + } + errorMessage?.let { error -> + ErrorMessage( + message = error, + onDismiss = onDismissError, + modifier = Modifier.align(Alignment.BottomCenter) + ) + } + } +} + +class SignInErrorMessageProvider : PreviewParameterProvider { + override val values = sequenceOf( + null, + "Sign in failed. Please sign in with your Cornell email" + ) +} + +@Preview(showBackground = true) +@Composable +private fun SignInScreenPreview( + @PreviewParameter(SignInErrorMessageProvider::class) errorMessage: String? +) { + SignInScreen( + onGoogleSignInButtonClick = {}, + isSignInLoading = false, + errorMessage = errorMessage, + onDismissError = {}) +} \ No newline at end of file diff --git a/app/src/main/java/com/cornellappdev/hustle/ui/screens/profile/ProfileScreen.kt b/app/src/main/java/com/cornellappdev/hustle/ui/screens/profile/ProfileScreen.kt new file mode 100644 index 0000000..1c2213c --- /dev/null +++ b/app/src/main/java/com/cornellappdev/hustle/ui/screens/profile/ProfileScreen.kt @@ -0,0 +1,83 @@ +package com.cornellappdev.hustle.ui.screens.profile + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.OutlinedButton +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import coil3.compose.AsyncImage +import com.cornellappdev.hustle.data.model.user.User + +@Composable +fun ProfileScreen( + user: User, + onSignOut: () -> Unit, + isSignOutLoading: Boolean, + modifier: Modifier = Modifier +) { + Column( + modifier = modifier + .fillMaxSize() + .padding(16.dp), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(24.dp) + ) { + // User Info + AsyncImage( + model = user.photoUrl, + contentDescription = "Profile picture", + modifier = Modifier + .size(120.dp) + .clip(CircleShape) + ) + + Text( + text = user.displayName ?: "Unknown User" + ) + + Text( + text = user.email ?: "" + ) + + // Sign Out Button + OutlinedButton( + onClick = onSignOut, + enabled = !isSignOutLoading, + modifier = Modifier.fillMaxWidth() + ) { + if (isSignOutLoading) { + CircularProgressIndicator( + modifier = Modifier.size(20.dp), strokeWidth = 2.dp + ) + } else { + Text("Sign Out") + } + } + } +} + +@Preview(showBackground = true) +@Composable +private fun ProfileScreenPreview() { + ProfileScreen( + user = User( + firebaseUid = "1", + displayName = "John Doe", + email = "jd123@cornell.edu", + photoUrl = null + ), + onSignOut = {}, + isSignOutLoading = false + ) +} \ No newline at end of file