From 9ef0b10646140f350e1101db5a1cce8b6962ddaa Mon Sep 17 00:00:00 2001 From: NikitaOnianov Date: Thu, 15 May 2025 01:31:54 +0300 Subject: [PATCH] add API --- .idea/deploymentTargetSelector.xml | 2 +- app/build.gradle.kts | 13 ++++++- app/src/main/AndroidManifest.xml | 3 +- .../com/example/appwithwin/MainActivity.kt | 24 ++++++++----- .../com/example/appwithwin/data/AuthState.kt | 17 +++++++++ .../java/com/example/appwithwin/data/User.kt | 7 ++++ .../appwithwin/data/local/DataStore.kt | 24 +++++++++++++ .../data/remote/network/RetrofitClient.kt | 17 +++++++++ .../remote/network/auth/AuthRemoteSource.kt | 9 +++++ .../network/auth/RegistrationRequest.kt | 9 +++++ .../network/auth/RegistrationResponse.kt | 9 +++++ .../data/repository/AuthRepository.kt | 12 +++++++ .../ui/screen/signIn/RegisterAccount.kt | 36 +++++++++++++------ .../appwithwin/ui/screen/welcome/welcome1.kt | 8 ++--- .../appwithwin/ui/screen/welcome/welcome2.kt | 8 ++--- .../appwithwin/ui/screen/welcome/welcome3.kt | 4 +-- .../appwithwin/ui/screen/welcome/welcome4.kt | 4 +-- 17 files changed, 172 insertions(+), 34 deletions(-) create mode 100644 app/src/main/java/com/example/appwithwin/data/AuthState.kt create mode 100644 app/src/main/java/com/example/appwithwin/data/User.kt create mode 100644 app/src/main/java/com/example/appwithwin/data/local/DataStore.kt create mode 100644 app/src/main/java/com/example/appwithwin/data/remote/network/RetrofitClient.kt create mode 100644 app/src/main/java/com/example/appwithwin/data/remote/network/auth/AuthRemoteSource.kt create mode 100644 app/src/main/java/com/example/appwithwin/data/remote/network/auth/RegistrationRequest.kt create mode 100644 app/src/main/java/com/example/appwithwin/data/remote/network/auth/RegistrationResponse.kt create mode 100644 app/src/main/java/com/example/appwithwin/data/repository/AuthRepository.kt diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml index b268ef3..1ad60c3 100644 --- a/.idea/deploymentTargetSelector.xml +++ b/.idea/deploymentTargetSelector.xml @@ -2,7 +2,7 @@ - + diff --git a/app/build.gradle.kts b/app/build.gradle.kts index bf37b59..1a539a1 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -52,10 +52,21 @@ android { } dependencies { + //implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3") + //implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3") + + implementation("androidx.datastore:datastore-core:1.1.3") + implementation("androidx.datastore:datastore:1.1.3") + implementation("androidx.datastore:datastore-preferences:1.1.3") implementation("androidx.navigation:navigation-compose:2.8.9") - implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.3") + implementation("com.squareup.retrofit2:converter-kotlinx-serialization:2.11.0") + implementation("com.squareup.retrofit2:retrofit:2.11.0") + implementation("com.squareup.okhttp3:okhttp:4.12.0") + + implementation("com.squareup.okhttp3:logging-interceptor:4.12.0") + implementation(libs.androidx.core.ktx) implementation(libs.androidx.lifecycle.runtime.ktx) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 8972d11..6ed3a8e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,13 +1,14 @@ - + by preferencesDataStore(name = "settings") +class DataStore(private val context: Context) { + val TOKEN_KEY = stringPreferencesKey("token_key") + val tokenFlow: Flow = context.dataStore.data.map { pref -> + pref[TOKEN_KEY] ?: "" + } + suspend fun setToken(token: String){ + context.dataStore.edit { pref -> + pref[TOKEN_KEY] = token + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/appwithwin/data/remote/network/RetrofitClient.kt b/app/src/main/java/com/example/appwithwin/data/remote/network/RetrofitClient.kt new file mode 100644 index 0000000..a7b66be --- /dev/null +++ b/app/src/main/java/com/example/appwithwin/data/remote/network/RetrofitClient.kt @@ -0,0 +1,17 @@ +package com.example.appwithwin.data.remote.network + +import com.example.appwithwin.data.remote.network.auth.AuthRemoteSource +import kotlinx.serialization.json.Json +import okhttp3.MediaType.Companion.toMediaType +import retrofit2.Retrofit +import retrofit2.converter.kotlinx.serialization.asConverterFactory + +object RetrofitClient { + private const val URL = "http://192.168.1.35:8080" + private val retrofit = Retrofit.Builder().baseUrl(URL) + .addConverterFactory(Json.asConverterFactory("application/json; charset=UTF8".toMediaType())) + .build() + val auth by lazy { + retrofit.create(AuthRemoteSource::class.java) + } +} diff --git a/app/src/main/java/com/example/appwithwin/data/remote/network/auth/AuthRemoteSource.kt b/app/src/main/java/com/example/appwithwin/data/remote/network/auth/AuthRemoteSource.kt new file mode 100644 index 0000000..3ac2e10 --- /dev/null +++ b/app/src/main/java/com/example/appwithwin/data/remote/network/auth/AuthRemoteSource.kt @@ -0,0 +1,9 @@ +package com.example.appwithwin.data.remote.network.auth + +import retrofit2.http.Body +import retrofit2.http.POST + +interface AuthRemoteSource { + @POST("/registration") + suspend fun registartion(@Body registrationRequest: RegistrationRequest):RegistrationResponse +} diff --git a/app/src/main/java/com/example/appwithwin/data/remote/network/auth/RegistrationRequest.kt b/app/src/main/java/com/example/appwithwin/data/remote/network/auth/RegistrationRequest.kt new file mode 100644 index 0000000..b8b6511 --- /dev/null +++ b/app/src/main/java/com/example/appwithwin/data/remote/network/auth/RegistrationRequest.kt @@ -0,0 +1,9 @@ +package com.example.appwithwin.data.remote.network.auth +import kotlinx.serialization.Serializable + +@Serializable +data class RegistrationRequest( + val userName: String, + val password: String, + val email: String +) diff --git a/app/src/main/java/com/example/appwithwin/data/remote/network/auth/RegistrationResponse.kt b/app/src/main/java/com/example/appwithwin/data/remote/network/auth/RegistrationResponse.kt new file mode 100644 index 0000000..08e12c2 --- /dev/null +++ b/app/src/main/java/com/example/appwithwin/data/remote/network/auth/RegistrationResponse.kt @@ -0,0 +1,9 @@ +package com.example.appwithwin.data.remote.network.auth + +import kotlinx.serialization.Serializable + +@Serializable +data class RegistrationResponse( + val first: String, + val second: String +) diff --git a/app/src/main/java/com/example/appwithwin/data/repository/AuthRepository.kt b/app/src/main/java/com/example/appwithwin/data/repository/AuthRepository.kt new file mode 100644 index 0000000..beba5df --- /dev/null +++ b/app/src/main/java/com/example/appwithwin/data/repository/AuthRepository.kt @@ -0,0 +1,12 @@ +package com.example.appwithwin.data.repository + +import com.example.appwithwin.data.local.DataStore +import com.example.appwithwin.data.remote.network.auth.AuthRemoteSource +import com.example.appwithwin.data.remote.network.auth.RegistrationRequest + +class AuthRepository (val dataStore: DataStore,val authRemoteSource: AuthRemoteSource){ + suspend fun registration(registrationRequest: RegistrationRequest){ + val result = authRemoteSource.registartion(registrationRequest) + dataStore.setToken(result.second) + } +} diff --git a/app/src/main/java/com/example/appwithwin/ui/screen/signIn/RegisterAccount.kt b/app/src/main/java/com/example/appwithwin/ui/screen/signIn/RegisterAccount.kt index 56162f1..4824136 100644 --- a/app/src/main/java/com/example/appwithwin/ui/screen/signIn/RegisterAccount.kt +++ b/app/src/main/java/com/example/appwithwin/ui/screen/signIn/RegisterAccount.kt @@ -16,6 +16,7 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.painterResource @@ -23,10 +24,14 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import com.example.appwithwin.R +import com.example.appwithwin.data.remote.network.RetrofitClient +import com.example.appwithwin.data.remote.network.auth.RegistrationRequest +import com.example.appwithwin.data.repository.AuthRepository import com.example.appwithwin.ui.theme.MatuleTheme +import kotlinx.coroutines.launch @Composable -fun RegisterAccount(onBackClick: () -> Unit) { +fun RegisterAccount(onBackClick: () -> Unit, repository: AuthRepository) { Scaffold( topBar = { Row( @@ -66,12 +71,12 @@ fun RegisterAccount(onBackClick: () -> Unit) { } } ) { paddingValues -> - RegisterInContent(paddingValues) + RegisterInContent(paddingValues, repository) } } @Composable -fun RegisterInContent(paddingValues: PaddingValues) { +fun RegisterInContent(paddingValues: PaddingValues, repository: AuthRepository) { Column( modifier = Modifier.padding(paddingValues = paddingValues) ) { @@ -79,19 +84,21 @@ fun RegisterInContent(paddingValues: PaddingValues) { title = stringResource(R.string.register), subTitle = stringResource(R.string.sign_in_subtitle) ) + val userName = remember { mutableStateOf("") } val email = remember { mutableStateOf("") } val password = remember { mutableStateOf("") } - val confirmPassword = remember { mutableStateOf("") } - val isAgreementChecked = remember { mutableStateOf(false) } + //val confirmPassword = remember { mutableStateOf("") } + //val isAgreementChecked = remember { mutableStateOf(false) } + val coroutione = rememberCoroutineScope() Spacer(modifier = Modifier.height(35.dp)) AuthTextFiled( labelText = stringResource(R.string.your_name), placeHolderText = stringResource(R.string.template_name), - value = email.value, + value = userName.value, onValueChange = { - email.value = it + userName.value = it } ) @@ -109,8 +116,8 @@ fun RegisterInContent(paddingValues: PaddingValues) { AuthTextFiled( labelText = stringResource(R.string.password), placeHolderText = stringResource(R.string.template_password), - value = confirmPassword.value, - onValueChange = { confirmPassword.value = it }, + value = password.value, + onValueChange = { password.value = it }, isPassword = true ) @@ -121,7 +128,16 @@ fun RegisterInContent(paddingValues: PaddingValues) { CommonButton( modifier = Modifier.padding(top = 50.dp), buttonLabel = stringResource(R.string.Register), - onClick = { }, + onClick = { + coroutione.launch { + val registrationRequest = RegistrationRequest( + email = email.value, + password = password.value, + userName = userName.value + ) + repository.registration(registrationRequest) + } + }, ) } } diff --git a/app/src/main/java/com/example/appwithwin/ui/screen/welcome/welcome1.kt b/app/src/main/java/com/example/appwithwin/ui/screen/welcome/welcome1.kt index 641eac0..bc89ea8 100644 --- a/app/src/main/java/com/example/appwithwin/ui/screen/welcome/welcome1.kt +++ b/app/src/main/java/com/example/appwithwin/ui/screen/welcome/welcome1.kt @@ -21,16 +21,16 @@ import kotlinx.coroutines.delay @Composable fun welcome1( - onClick: () -> Unit + on1Click: () -> Unit ) { LaunchedEffect(Unit) { delay(2000) - onClick() + on1Click() } - Scaffold { paddingValues -> win1(paddingValues,onClick) } + Scaffold { paddingValues -> win1(paddingValues) } } @Composable -fun win1(paddingValues: PaddingValues, onClick: () -> Unit, ) { +fun win1(paddingValues: PaddingValues ) { Column( modifier = Modifier .fillMaxSize() diff --git a/app/src/main/java/com/example/appwithwin/ui/screen/welcome/welcome2.kt b/app/src/main/java/com/example/appwithwin/ui/screen/welcome/welcome2.kt index e1ceccc..fd22928 100644 --- a/app/src/main/java/com/example/appwithwin/ui/screen/welcome/welcome2.kt +++ b/app/src/main/java/com/example/appwithwin/ui/screen/welcome/welcome2.kt @@ -29,15 +29,15 @@ import com.example.appwithwin.R @Composable fun welcome2( - onClick: () -> Unit + on2Click: () -> Unit ) { Scaffold{ - paddingValues -> win2(paddingValues,onClick) + paddingValues -> win2(paddingValues,on2Click) } } @Composable -fun win2(paddingValues: PaddingValues, onStart1Click: () -> Unit, ){ +fun win2(paddingValues: PaddingValues, onClick: () -> Unit, ){ Column( modifier = Modifier .fillMaxSize() @@ -78,7 +78,7 @@ fun win2(paddingValues: PaddingValues, onStart1Click: () -> Unit, ){ ) } Button( - onClick = onStart1Click, + onClick = onClick, modifier = Modifier .padding(top = 50.dp) .background(Color.White, RoundedCornerShape(8.dp)) diff --git a/app/src/main/java/com/example/appwithwin/ui/screen/welcome/welcome3.kt b/app/src/main/java/com/example/appwithwin/ui/screen/welcome/welcome3.kt index 274e912..9b10e46 100644 --- a/app/src/main/java/com/example/appwithwin/ui/screen/welcome/welcome3.kt +++ b/app/src/main/java/com/example/appwithwin/ui/screen/welcome/welcome3.kt @@ -30,9 +30,9 @@ import com.example.appwithwin.R @Composable fun welcome3( - onClick: () -> Unit + on3Click: () -> Unit ) { - Scaffold{ paddingValues -> win3(paddingValues,onClick) } + Scaffold{ paddingValues -> win3(paddingValues,on3Click) } } @Composable diff --git a/app/src/main/java/com/example/appwithwin/ui/screen/welcome/welcome4.kt b/app/src/main/java/com/example/appwithwin/ui/screen/welcome/welcome4.kt index 1a32a75..82bd3bd 100644 --- a/app/src/main/java/com/example/appwithwin/ui/screen/welcome/welcome4.kt +++ b/app/src/main/java/com/example/appwithwin/ui/screen/welcome/welcome4.kt @@ -29,9 +29,9 @@ import com.example.appwithwin.R @Composable fun welcome4( - onClick: () -> Unit + on4Click: () -> Unit ) { - Scaffold{ paddingValues -> win4(paddingValues,onClick) } + Scaffold{ paddingValues -> win4(paddingValues,on4Click) } } @Composable