From 39a60043d2514d9f36779d021ba0fcd40c0c42fc Mon Sep 17 00:00:00 2001 From: pedro Date: Thu, 20 Feb 2025 10:49:25 +0300 Subject: [PATCH] dataStore completely fixed, MAIN screen implemented --- .idea/inspectionProfiles/Project_Default.xml | 47 +++++ .idea/vcs.xml | 6 + app/build.gradle.kts | 2 + .../com/example/nto_minipigs/MainActivity.kt | 24 +-- .../example/nto_minipigs/core/Constants.kt | 2 +- .../ui/screens/Login/LoginScreen.kt | 2 +- .../ui/screens/Login/LoginViewModel.kt | 1 + .../ui/screens/Main/MainScreen.kt | 194 ++++++++++++++++-- .../ui/screens/Main/MainViewModel.kt | 5 +- gradle/libs.versions.toml | 1 + 10 files changed, 248 insertions(+), 36 deletions(-) create mode 100644 .idea/inspectionProfiles/Project_Default.xml create mode 100644 .idea/vcs.xml diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..005afb3 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,47 @@ + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 563378f..ed52de8 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -60,6 +60,7 @@ dependencies { androidTestImplementation(libs.androidx.ui.test.junit4) debugImplementation(libs.androidx.ui.tooling) debugImplementation(libs.androidx.ui.test.manifest) + implementation(libs.androidx.material.icons.extended) val retrofitVersion = "2.11.0" @@ -68,4 +69,5 @@ dependencies { implementation("androidx.datastore:datastore-preferences:1.1.2") implementation("androidx.datastore:datastore:1.1.2") implementation("androidx.compose.runtime:runtime-livedata:1.7.8") + implementation("io.coil-kt:coil-compose:2.0.0-rc01") } \ No newline at end of file diff --git a/app/src/main/java/com/example/nto_minipigs/MainActivity.kt b/app/src/main/java/com/example/nto_minipigs/MainActivity.kt index 3e3c873..c6f7e79 100644 --- a/app/src/main/java/com/example/nto_minipigs/MainActivity.kt +++ b/app/src/main/java/com/example/nto_minipigs/MainActivity.kt @@ -11,6 +11,7 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.datastore.preferences.core.edit import androidx.datastore.preferences.core.stringPreferencesKey @@ -26,9 +27,12 @@ import com.example.nto_minipigs.ui.screens.Main.MainScreen import com.example.nto_minipigs.ui.screens.Main.MainViewModel import com.example.nto_minipigs.ui.theme.Nto_minipigsTheme import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.map import kotlinx.coroutines.runBlocking import kotlinx.serialization.Serializable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.setValue class MainActivity : ComponentActivity() { @@ -46,19 +50,17 @@ class MainActivity : ComponentActivity() { val loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java] val mainViewModel = ViewModelProvider(this)[MainViewModel::class.java] - val token by dataStore.token.collectAsState("") + val token = dataStore.getToken() Log.d("token", token.toString()) NavHost( navController = navController, - startDestination = if(token == null) Login else Main + startDestination = if(token == "") Login else Main +// startDestination = Login ) { composable { LoginScreen( onNavigateToMain = { navController.popBackStack(); navController.navigate(route = Main) }, viewModel = loginViewModel, dataStore = dataStore ) } - composable
{ MainScreen( viewModel = mainViewModel, token = token.toString() ) } - } - LaunchedEffect(Unit) { - dataStore.loadToken() + composable
{ MainScreen( viewModel = mainViewModel, dataStore = dataStore, navController = navController ) } } } } @@ -68,14 +70,10 @@ class MainActivity : ComponentActivity() { class UserData(private val context: Context) { val Context.dataStore by preferencesDataStore("user_data") - val token = MutableStateFlow(context.dataStore.data.map { preferences -> - preferences[tokenKey] - }) - - public fun loadToken() { - runBlocking { token.value = context.dataStore.data.map { preferences -> + fun getToken():String { + return runBlocking { context.dataStore.data.map { preferences -> preferences[tokenKey] - }} + }.first().toString()} } suspend fun updateToken(data:String) = diff --git a/app/src/main/java/com/example/nto_minipigs/core/Constants.kt b/app/src/main/java/com/example/nto_minipigs/core/Constants.kt index f7d4211..bb0c4ff 100644 --- a/app/src/main/java/com/example/nto_minipigs/core/Constants.kt +++ b/app/src/main/java/com/example/nto_minipigs/core/Constants.kt @@ -3,5 +3,5 @@ package com.example.nto_minipigs.core object Constants { const val SHARED_PREFS = "shared_prefs" const val EMAIL_KEY = "email_key" - const val SERVER_ADDRESS = "http://10.6.66.120:5000" + const val SERVER_ADDRESS = "http:///192.168.99.212:5000" } \ No newline at end of file diff --git a/app/src/main/java/com/example/nto_minipigs/ui/screens/Login/LoginScreen.kt b/app/src/main/java/com/example/nto_minipigs/ui/screens/Login/LoginScreen.kt index 4d27ddf..9675747 100644 --- a/app/src/main/java/com/example/nto_minipigs/ui/screens/Login/LoginScreen.kt +++ b/app/src/main/java/com/example/nto_minipigs/ui/screens/Login/LoginScreen.kt @@ -34,7 +34,7 @@ fun LoginScreen(onNavigateToMain: () -> Unit, viewModel: LoginViewModel, dataSto ) { Text( text = "MiniPigs", - style = MaterialTheme.typography.titleLarge, + style = MaterialTheme.typography.displayMedium, modifier = Modifier.padding(bottom = 36.dp) ) diff --git a/app/src/main/java/com/example/nto_minipigs/ui/screens/Login/LoginViewModel.kt b/app/src/main/java/com/example/nto_minipigs/ui/screens/Login/LoginViewModel.kt index cfc20e1..720be02 100644 --- a/app/src/main/java/com/example/nto_minipigs/ui/screens/Login/LoginViewModel.kt +++ b/app/src/main/java/com/example/nto_minipigs/ui/screens/Login/LoginViewModel.kt @@ -18,6 +18,7 @@ class LoginViewModel :ViewModel() { val response = serviceApi.login(auth) if(response.isSuccessful) { dataStore.updateToken(response.body()?.token.toString()) +// dataStore.updateToken("") func() } } catch (e: Exception) { diff --git a/app/src/main/java/com/example/nto_minipigs/ui/screens/Main/MainScreen.kt b/app/src/main/java/com/example/nto_minipigs/ui/screens/Main/MainScreen.kt index a0f2999..1c7f7f4 100644 --- a/app/src/main/java/com/example/nto_minipigs/ui/screens/Main/MainScreen.kt +++ b/app/src/main/java/com/example/nto_minipigs/ui/screens/Main/MainScreen.kt @@ -1,13 +1,39 @@ package com.example.nto_minipigs.ui.screens.Main +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.border import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.aspectRatio import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.offset import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.outlined.Logout +import androidx.compose.material.icons.filled.BookmarkRemove +import androidx.compose.material.icons.outlined.Logout +import androidx.compose.material.icons.outlined.QrCode +import androidx.compose.material.icons.outlined.Search import androidx.compose.material3.Button +import androidx.compose.material3.ButtonColors +import androidx.compose.material3.Card import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.ElevatedCard +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedCard import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.Surface import androidx.compose.material3.Text @@ -21,39 +47,167 @@ import androidx.compose.ui.Modifier import com.example.nto_minipigs.ui.theme.Nto_minipigsTheme import androidx.compose.runtime.getValue import androidx.compose.runtime.livedata.observeAsState +import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue +import androidx.compose.ui.draw.clip +import androidx.compose.ui.draw.shadow +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp +import androidx.navigation.NavController +import coil.compose.rememberAsyncImagePainter +import com.example.nto_minipigs.Login import com.example.nto_minipigs.UserData +import kotlinx.coroutines.coroutineScope +import kotlinx.coroutines.launch + @Composable -fun MainScreen( viewModel: MainViewModel, token: String?) { +fun MainScreen( viewModel: MainViewModel, dataStore: UserData, navController: NavController) { Nto_minipigsTheme { val data = viewModel.data.observeAsState() + val token = dataStore.getToken() + val coroutineScope = rememberCoroutineScope() Surface { - Column( - modifier = Modifier.fillMaxSize(), - verticalArrangement = Arrangement.Center, - horizontalAlignment = Alignment.CenterHorizontally, - ) { - when(val result = data.value){ - is NetworkResponse.Error -> { - Text(text = result.message) - } - NetworkResponse.Loading -> { + when(val result = data.value){ + is NetworkResponse.Error -> { + Text(text = result.message) + } + NetworkResponse.Loading -> { + Column( + modifier = Modifier.fillMaxSize(), + verticalArrangement = Arrangement.Center, + horizontalAlignment = Alignment.CenterHorizontally, + ) { CircularProgressIndicator() } - is NetworkResponse.Success -> { - Text(text = result.data.toString()) - } - null -> {} } + is NetworkResponse.Success -> { + Column ( + modifier = Modifier.fillMaxSize() + ) { + Box( + modifier = Modifier + .fillMaxWidth() + .padding(top = 40.dp) + .height(200.dp), + ) { + IconButton( + onClick = { coroutineScope.launch { dataStore.updateToken("") }; navController.popBackStack(); navController.navigate(Login) }, + modifier = Modifier + .align(Alignment.TopEnd) + .size(20.dp) + .aspectRatio(1f) + .offset(x = -30.dp, y = 40.dp) + ) { + Icon( + Icons.AutoMirrored.Outlined.Logout, + contentDescription = null, + tint = MaterialTheme.colorScheme.error, + modifier = Modifier + .fillMaxSize() + .shadow(7.dp) + ) } - Button( - onClick = { viewModel.Fetch(token) }, - shape = RoundedCornerShape(12.dp), - ) { - Text(text = "Sign In", style = MaterialTheme.typography.bodyLarge) + + Row( + modifier = Modifier.fillMaxSize(), + verticalAlignment = Alignment.CenterVertically + ) { + Column ( + verticalArrangement = Arrangement.Center, + horizontalAlignment = Alignment.CenterHorizontally, + modifier = Modifier + .padding(start = 30.dp) + .size(120.dp) + .aspectRatio(1f) + .background(MaterialTheme.colorScheme.primaryContainer, CircleShape) + ) { + Image( + painter = rememberAsyncImagePainter(result.data.photo), + contentDescription = null, + contentScale = ContentScale.Fit, + modifier = Modifier.size(105.dp).clip(CircleShape) + ) + } + + Column( + modifier = Modifier + .padding(horizontal = 25.dp) + ) { + Text( + text = result.data.lastVisit, + style = MaterialTheme.typography.titleSmall, + fontWeight = FontWeight.Light + ) + Text( + text = result.data.name, + style = MaterialTheme.typography.titleMedium, + fontWeight = FontWeight.Medium + ) + Text( + text = result.data.position, + style = MaterialTheme.typography.titleSmall, + fontWeight = FontWeight.Normal + ) + } + } + } + + Box( + modifier = Modifier + .fillMaxSize() + .background(MaterialTheme.colorScheme.surfaceContainerLow, RoundedCornerShape(topEnd = 24.dp , topStart = 24.dp)) + ) { + Column( + modifier = Modifier + .fillMaxSize() + .padding(horizontal = 20.dp) + .padding(top = 8.dp) + .verticalScroll(rememberScrollState()) + ) { + for(i in 1..24) { + OutlinedCard( + modifier = Modifier + .fillMaxWidth() + .padding(top = 12.dp) + ) { + Text( + text = "4am 141", + style = MaterialTheme.typography.titleMedium, + fontWeight = FontWeight.Light, + modifier = Modifier + .padding(start = 16.dp) + .padding(top = 12.dp) + ) + Text( + text = "Dildos factory", + style = MaterialTheme.typography.titleMedium, + fontWeight = FontWeight.Normal, + modifier = Modifier + .padding(start = 16.dp) + .padding(bottom = 12.dp) + ) + } + } + } + Button( + onClick = { }, + shape = CircleShape, + modifier = Modifier + .align(Alignment.BottomEnd) + .size(80.dp) + .aspectRatio(1f) + .offset(x = -30.dp, y = -80.dp) + .shadow(7.dp) + ) { + Icon(Icons.Outlined.QrCode, contentDescription = null, Modifier.size(60.dp)) + } + } + } } + null -> {} } } diff --git a/app/src/main/java/com/example/nto_minipigs/ui/screens/Main/MainViewModel.kt b/app/src/main/java/com/example/nto_minipigs/ui/screens/Main/MainViewModel.kt index d9155e5..43ef478 100644 --- a/app/src/main/java/com/example/nto_minipigs/ui/screens/Main/MainViewModel.kt +++ b/app/src/main/java/com/example/nto_minipigs/ui/screens/Main/MainViewModel.kt @@ -17,7 +17,6 @@ class MainViewModel: ViewModel() { val data : LiveData> = _data fun Fetch(token: String?) { - Log.d("penis", token.toString()) _data.value = NetworkResponse.Loading viewModelScope.launch { @@ -37,6 +36,10 @@ class MainViewModel: ViewModel() { } } } + + fun Logout() { + + } } sealed class NetworkResponse { diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index e164b3b..4d4089e 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -24,6 +24,7 @@ androidx-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-toolin androidx-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" } androidx-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4" } androidx-material3 = { group = "androidx.compose.material3", name = "material3" } +androidx-material-icons-extended = { group = "androidx.compose.material", name = "material-icons-extended"} [plugins] android-application = { id = "com.android.application", version.ref = "agp" }