diff --git a/app/src/main/java/com/tpc/nudj/ui/screen/auth/clubVerification/ClubVerificationScreen.kt b/app/src/main/java/com/tpc/nudj/ui/screen/auth/clubVerification/ClubVerificationScreen.kt new file mode 100644 index 0000000..4983871 --- /dev/null +++ b/app/src/main/java/com/tpc/nudj/ui/screen/auth/clubVerification/ClubVerificationScreen.kt @@ -0,0 +1,163 @@ +package com.tpc.nudj.ui.screen.auth.clubVerification + +import com.tpc.nudj.R +import android.content.res.Configuration +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +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.foundation.layout.size +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.KeyboardArrowLeft +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.unit.dp +import androidx.hilt.navigation.compose.hiltViewModel +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.tpc.nudj.ui.components.LoadingIndicator +import androidx.compose.material3.SnackbarHost +import com.tpc.nudj.viewmodels.auth.clubVerification.ClubVerificationViewModel +import androidx.compose.material3.SnackbarHostState +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.ui.Alignment +import androidx.compose.ui.tooling.preview.Preview +import com.tpc.nudj.ui.components.PrimaryButton +import com.tpc.nudj.ui.theme.LocalAppColors +import com.tpc.nudj.ui.theme.NudjTheme +import kotlinx.coroutines.launch + +@Composable +fun ClubVerificationScreen( + viewModel: ClubVerificationViewModel = hiltViewModel(), + onNavigationBack: () -> Unit +) { + val clubVerificationUiState by viewModel.clubVerificationUiState.collectAsStateWithLifecycle() + + val snackbarHostState = remember { SnackbarHostState() } + val scope = rememberCoroutineScope() + + LoadingIndicator( + isLoading = clubVerificationUiState.isLoading + ) { + ClubVerificationScreenLayout( + clubVerificationUiState = clubVerificationUiState, + onBackClick = onNavigationBack, + snackbarHostState = snackbarHostState, + onCheckStatusClick = { + viewModel.onCheckStatusClick() + scope.launch { + val message = if(clubVerificationUiState.isVerified){ + "Verified" + } else { + "Not Verified" + } + snackbarHostState.showSnackbar(message) + } + } + ) + } +} + +@Composable +fun ClubVerificationScreenLayout( + clubVerificationUiState: ClubVerificationUiState, + onBackClick: () -> Unit, + onCheckStatusClick: () -> Unit, + snackbarHostState: SnackbarHostState +) { + Scaffold( + snackbarHost = { SnackbarHost(hostState = snackbarHostState)}, + containerColor = LocalAppColors.current.background + ) { paddingValues -> + + Box( + modifier = Modifier + .fillMaxSize() + .padding(paddingValues) + ){ + IconButton( + onClick = onBackClick, + modifier = Modifier + .align(Alignment.TopStart) + .padding(10.dp) + ) { + Icon( + imageVector = Icons.Default.KeyboardArrowLeft, + contentDescription = "Back Button", + tint = LocalAppColors.current.onBackground, + modifier = Modifier.size(40.dp) + ) + } + + Column( + modifier = Modifier + .fillMaxSize() + .padding(horizontal = 24.dp), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center + ) { + + Text( + text = "Hang tight!", + style = MaterialTheme.typography.headlineLarge, + color = LocalAppColors.current.onBackground + ) + + Spacer(modifier = Modifier.height(32.dp)) + + Image( + painter = painterResource(id = R.drawable.meditating_mascot), + contentDescription = "Monkey Meditating Graphic", + modifier = Modifier.size(300.dp) + ) + + Spacer(modifier = Modifier.height(32.dp)) + + Text( + text = "Your access is on the way", + style = MaterialTheme.typography.titleLarge, + color = LocalAppColors.current.onBackground + ) + + Spacer(modifier = Modifier.height(48.dp)) + + PrimaryButton( + text = "Check Status", + onClick = onCheckStatusClick, + modifier = Modifier.fillMaxWidth(0.7f) + ) + } + } + } +} + +@Preview(showBackground = true, name = "Light Mode") +@Preview( + showBackground = true, + uiMode = Configuration.UI_MODE_NIGHT_YES, + name = "Dark Mode" +) +@Composable +fun ClubVerificationScreenPreview() { + NudjTheme { + ClubVerificationScreenLayout( + clubVerificationUiState = ClubVerificationUiState(), + onBackClick = {}, + onCheckStatusClick = {}, + snackbarHostState = remember { SnackbarHostState() } + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/tpc/nudj/ui/screen/auth/clubVerification/ClubVerificationUiState.kt b/app/src/main/java/com/tpc/nudj/ui/screen/auth/clubVerification/ClubVerificationUiState.kt new file mode 100644 index 0000000..0825b64 --- /dev/null +++ b/app/src/main/java/com/tpc/nudj/ui/screen/auth/clubVerification/ClubVerificationUiState.kt @@ -0,0 +1,7 @@ +package com.tpc.nudj.ui.screen.auth.clubVerification + + +data class ClubVerificationUiState( + val isLoading: Boolean = false, + val isVerified: Boolean = false + ) diff --git a/app/src/main/java/com/tpc/nudj/ui/screen/club/clubLanding/ClubLandingScreen.kt b/app/src/main/java/com/tpc/nudj/ui/screen/club/clubLanding/ClubLandingScreen.kt new file mode 100644 index 0000000..b434001 --- /dev/null +++ b/app/src/main/java/com/tpc/nudj/ui/screen/club/clubLanding/ClubLandingScreen.kt @@ -0,0 +1,120 @@ +package com.tpc.nudj.ui.screen.club.clubLanding + +import android.content.res.Configuration +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +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.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.scale +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.hilt.navigation.compose.hiltViewModel +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.tpc.nudj.R +import com.tpc.nudj.ui.components.LoadingIndicator +import com.tpc.nudj.ui.components.NudjLogo +import com.tpc.nudj.ui.components.PrimaryButton +import com.tpc.nudj.ui.components.TertiaryButton +import com.tpc.nudj.ui.theme.LocalAppColors +import com.tpc.nudj.ui.theme.NudjTheme +import com.tpc.nudj.viewmodels.club.clubLanding.ClubLandingViewModel + +@Composable +fun ClubLandingScreen( + viewModel: ClubLandingViewModel = hiltViewModel() +) { + val clubLandingUiState by viewModel.clubLandingUiState.collectAsStateWithLifecycle() + + LoadingIndicator( + isLoading = clubLandingUiState.isLoading + ) { + ClubLandingScreenLayout( + clubLandingUiState = clubLandingUiState, + onCreateClubEventsClick = { viewModel.createClubEvents() }, + onSkipClick = { viewModel.onClickSkip() } + ) + } +} + +@Composable +fun ClubLandingScreenLayout( + clubLandingUiState: ClubLandingUiState, + onCreateClubEventsClick: () -> Unit, + onSkipClick: () -> Unit +) { + Scaffold( + containerColor = LocalAppColors.current.background, + ) { paddingValues -> + Column( + modifier = Modifier + .fillMaxSize() + .padding(paddingValues) + .padding(20.dp), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center + ) { + + Spacer(modifier = Modifier.weight(1f)) + Box(modifier = Modifier.scale(1.8f)) { + NudjLogo() + } + + + Spacer(modifier = Modifier.height(45.dp)) + + Text( + text = "College Events Simplified", + style = MaterialTheme.typography.bodyMedium, + color = LocalAppColors.current.onBackground + ) + + Spacer(modifier = Modifier.weight(1f)) + PrimaryButton( + text = "Create Club/Event", + onClick = onCreateClubEventsClick, + modifier = Modifier.fillMaxWidth(0.7f) + ) + TertiaryButton( + text = "Skip", + onClick = onSkipClick, + modifier = Modifier.fillMaxWidth(0.7f) + ) + + Spacer(modifier = Modifier.height(20.dp)) + } + } +} + +@Preview(showBackground = true, name = "Light Mode") +@Preview( + showBackground = true, + uiMode = Configuration.UI_MODE_NIGHT_YES, + name = "Dark Mode" +) +@Composable +fun ClubLandingScreenPreview() { + NudjTheme { + ClubLandingScreenLayout( + + clubLandingUiState = ClubLandingUiState(), + onCreateClubEventsClick = { }, + onSkipClick = { } + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/tpc/nudj/ui/screen/club/clubLanding/ClubLandingUiState.kt b/app/src/main/java/com/tpc/nudj/ui/screen/club/clubLanding/ClubLandingUiState.kt new file mode 100644 index 0000000..3cfed31 --- /dev/null +++ b/app/src/main/java/com/tpc/nudj/ui/screen/club/clubLanding/ClubLandingUiState.kt @@ -0,0 +1,6 @@ +package com.tpc.nudj.ui.screen.club.clubLanding + +data class ClubLandingUiState ( + val isLoading: Boolean = false, + val errorMessage: String? = null, +) \ No newline at end of file diff --git a/app/src/main/java/com/tpc/nudj/viewmodels/auth/clubVerification/ClubVerificationViewModel.kt b/app/src/main/java/com/tpc/nudj/viewmodels/auth/clubVerification/ClubVerificationViewModel.kt new file mode 100644 index 0000000..c7bf308 --- /dev/null +++ b/app/src/main/java/com/tpc/nudj/viewmodels/auth/clubVerification/ClubVerificationViewModel.kt @@ -0,0 +1,36 @@ +package com.tpc.nudj.viewmodels.auth.clubVerification + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelStore +import androidx.lifecycle.viewModelScope +import com.tpc.nudj.ui.screen.auth.clubVerification.ClubVerificationUiState +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch +import javax.inject.Inject + + +@HiltViewModel +class ClubVerificationViewModel @Inject constructor() : ViewModel() { + private val _clubVerificationUiState = MutableStateFlow(ClubVerificationUiState()) + val clubVerificationUiState:StateFlow = + _clubVerificationUiState.asStateFlow() + + fun onCheckStatusClick() { + viewModelScope.launch { + _clubVerificationUiState.update { + it.copy(isLoading = true) + } + + delay(1000) + + _clubVerificationUiState.update { + it.copy(isLoading = false) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/tpc/nudj/viewmodels/club/clubLanding/ClubLandingVIewModel.kt b/app/src/main/java/com/tpc/nudj/viewmodels/club/clubLanding/ClubLandingVIewModel.kt new file mode 100644 index 0000000..c412816 --- /dev/null +++ b/app/src/main/java/com/tpc/nudj/viewmodels/club/clubLanding/ClubLandingVIewModel.kt @@ -0,0 +1,17 @@ +package com.tpc.nudj.viewmodels.club.clubLanding + +import androidx.lifecycle.ViewModel +import com.tpc.nudj.ui.screen.club.clubLanding.ClubLandingUiState +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import javax.inject.Inject + +@HiltViewModel +class ClubLandingViewModel @Inject constructor(): ViewModel(){ + private val _clubLandingUiState = MutableStateFlow(ClubLandingUiState()) + val clubLandingUiState: StateFlow = _clubLandingUiState.asStateFlow() + fun createClubEvents(){} + fun onClickSkip(){} +}