fix profile

This commit is contained in:
Ксении 2025-02-20 10:59:09 +03:00
parent 8097e200c7
commit 212287a89a
9 changed files with 271 additions and 19 deletions

View File

@ -16,7 +16,7 @@ import ru.myitschool.work.data.auth.Network.client
class UserNetworkDataSource {
suspend fun getUser(login : String): Result<UserDto> = withContext(Dispatchers.IO) {
//runCatching {
runCatching {
val result = client.get("$SERVER_ADDRESS/api/${login}/info") {
header(HttpHeaders.Authorization, token)
@ -31,7 +31,7 @@ class UserNetworkDataSource {
}
Log.d("result", result.bodyAsText())
result.body()
// }
}
}
suspend fun getEntrancesList(login : String) : Result<List<EntranceDto>> = withContext(Dispatchers.IO){

View File

@ -1,12 +0,0 @@
package ru.myitschool.work.domain.auth
import javax.inject.Inject
/*class IsUserExistUseCase (
private val authRepo : AuthRepo
) {
suspend operator fun invoke(email : String) : Result<Boolean?> {
return authRepo.isUserExist(email)
}
}*/

View File

@ -49,17 +49,17 @@ class RootActivity : AppCompatActivity() {
/*onBackPressedDispatcher.addCallback(
onBackPressedDispatcher.addCallback(
this,
object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
onSupportNavigateUp()
}
}
)*/
)
}
/*override fun onSupportNavigateUp(): Boolean {
override fun onSupportNavigateUp(): Boolean {
val navController = findNavController(R.id.nav_host_fragment)
val popBackResult = if (navController.previousBackStackEntry != null) {
navController.popBackStack()
@ -67,6 +67,6 @@ class RootActivity : AppCompatActivity() {
false
}
return popBackResult || super.onSupportNavigateUp()
}*/
}
}

View File

@ -48,6 +48,8 @@ class ProfileFragment : Fragment(R.layout.fragment_profile) {
viewBinding.loading.visibility = if (state is ProfileViewModel.State.Loading) View.VISIBLE else View.GONE
viewBinding.profile.visibility = if (state is ProfileViewModel.State.Show) View.VISIBLE else View.GONE
when(state) {
is ProfileViewModel.State.Loading -> Unit
is ProfileViewModel.State.Show -> {

View File

@ -0,0 +1,71 @@
package ru.myitschool.work.ui.qr.result
import android.os.Bundle
import android.view.View
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import androidx.navigation.fragment.findNavController
import com.squareup.picasso.Picasso
import ru.myitschool.work.R
import ru.myitschool.work.databinding.FragmentProfileBinding
import ru.myitschool.work.databinding.FragmentQrResultBinding
import ru.myitschool.work.ui.profile.ProfileViewModel
import ru.myitschool.work.ui.qr.scan.QrScanDestination
import ru.myitschool.work.utils.collectWithLifecycle
class QrResultFragment : Fragment(R.layout.fragment_qr_result) {
private var _viewBinding: FragmentQrResultBinding? = null
private val viewBinding: FragmentQrResultBinding get() = _viewBinding!!
private val viewModel by viewModels<QrResultViewModel> { QrResultViewModel.Factory }
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
_viewBinding = FragmentQrResultBinding.bind(view)
super.onViewCreated(view, savedInstanceState)
parentFragmentManager.setFragmentResultListener(
QrScanDestination.REQUEST_KEY, viewLifecycleOwner
) {
key, bundle ->
if (key == QrScanDestination.REQUEST_KEY) {
val code = QrScanDestination.getDataIfExist(bundle)
if (code != null) {
viewModel.sendResult(code.toLong())
}
}
}
viewBinding.close.setOnClickListener {
findNavController().navigate(R.id.action_fragment_qr_result_to_fragment_profile)
}
viewModel.state.collectWithLifecycle(this) { state ->
viewBinding.error.visibility = if (state is QrResultViewModel.State.Error) View.VISIBLE else View.GONE
viewBinding.loading.visibility = if (state is QrResultViewModel.State.Loading) View.VISIBLE else View.GONE
viewBinding.result.visibility = if (state is QrResultViewModel.State.Show) View.VISIBLE else View.GONE
when(state) {
is QrResultViewModel.State.Loading -> Unit
is QrResultViewModel.State.Show -> {
viewBinding.result.text = state.result
}
is QrResultViewModel.State.Error -> {
viewBinding.errorText.text = state.text
}
}
}
}
override fun onDestroyView() {
_viewBinding = null
super.onDestroyView()
}
}

View File

@ -0,0 +1,90 @@
package ru.myitschool.work.ui.qr.result
import android.content.Context
import android.util.Log
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.viewModelScope
import androidx.lifecycle.viewmodel.CreationExtras
import dagger.hilt.android.qualifiers.ApplicationContext
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.launch
import ru.myitschool.work.R
import ru.myitschool.work.data.auth.AuthStorageDataSource
import ru.myitschool.work.data.user.UserNetworkDataSource
import ru.myitschool.work.data.user.UserRepoImpl
import ru.myitschool.work.domain.user.EnterUseCase
import ru.myitschool.work.domain.user.EntranceEntity
import ru.myitschool.work.domain.user.GetUserUseCase
import ru.myitschool.work.domain.user.UserEntity
class QrResultViewModel(
@ApplicationContext private val context: Context,
private val enterUseCase: EnterUseCase
) : ViewModel() {
private val _state = MutableStateFlow<State>(State.Loading)
val state = _state.asStateFlow()
fun updateState(code: Long?) {
viewModelScope.launch {
_state.emit(State.Loading)
if (code == null) {
_state.emit(State.Error(context.getString(R.string.qr_null_result)))
}
else {
_state.emit(
enterUseCase.invoke(code).fold(
onSuccess = { data ->
Log.d("uraa", "успех успех ${data.toString()}")
when (data) {
true -> State.Show(context.getString(R.string.qr_success_result))
false -> State.Show(context.getString(R.string.qr_wrong_result))
null -> State.Show(context.getString(R.string.qr_wrong_result))
}
},
onFailure = { error ->
Log.d("kaput", error.message.toString())
State.Error(error.message.toString())
}
)
)
}
//_state.emit(State.Error("о нет ошибка ошибка помогите"))
}
}
fun sendResult(code : Long) {
updateState(code)
}
sealed interface State {
data object Loading: State
data class Show(
val result : String
) : State
data class Error(
val text: String
) : State
}
companion object {
val Factory : ViewModelProvider.Factory = object : ViewModelProvider.Factory {
@Suppress("UNCHECKED_CAST")
override fun <T : ViewModel> create(modelClass: Class<T>, extras: CreationExtras): T {
val application = extras[ViewModelProvider.AndroidViewModelFactory.APPLICATION_KEY]!!
return QrResultViewModel(
context = application,
enterUseCase = EnterUseCase(
repo = UserRepoImpl(
userNetworkDataSource = UserNetworkDataSource()
),
authStorageDataSource = AuthStorageDataSource
)
) as T
}
}
}
}

View File

@ -0,0 +1,70 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:tools="http://schemas.android.com/tools">
<TextView
android:id="@+id/result"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/black"
android:textSize="20sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="Вход был отменён" />
<ImageView
android:id="@+id/close"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:layout_marginEnd="16dp"
android:src="@drawable/ic_close"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:clickable="true"
android:focusable="true"
android:background="@color/orange"/>
<ProgressBar
android:id="@+id/loading"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<LinearLayout
android:id="@+id/error"
android:layout_width="160dp"
android:layout_height="160dp"
android:orientation="vertical"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<TextView
android:id="@+id/errorText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="15dp"
android:gravity="center"
tools:text="Ошибка помогите" />
<Button
android:id="@+id/refresh"
android:layout_width="45dp"
android:layout_height="45dp"
android:layout_gravity="center"
android:background="@drawable/ic_refresh"
android:gravity="center" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -9,6 +9,34 @@
android:id="@+id/fragment_profile"
android:name="ru.myitschool.work.ui.profile.ProfileFragment"
android:label="Profile"
tools:layout="@layout/fragment_profile" />
tools:layout="@layout/fragment_profile">
<action
android:id="@+id/action_fragment_profile_to_fragment_qr"
app:destination="@id/fragment_qr" />
</fragment>
<fragment
android:id="@+id/fragment_qr"
android:name="ru.myitschool.work.ui.qr.scan.QrScanFragment"
android:label="QrScan"
tools:layout="@layout/fragment_qr_scan" >
<action
android:id="@+id/action_fragment_qr_to_fragment_qr_result"
app:destination="@id/fragment_qr_result" />
<action
android:id="@+id/action_fragment_qr_to_fragment_profile"
app:destination="@id/fragment_profile" />
</fragment>
<fragment
android:id="@+id/fragment_qr_result"
android:name="ru.myitschool.work.ui.qr.result.QrResultFragment"
android:label="QrResult"
tools:layout="@layout/fragment_qr_result" >
<action
android:id="@+id/action_fragment_qr_result_to_fragment_profile"
app:destination="@id/fragment_profile" />
</fragment>
</navigation>

View File

@ -13,4 +13,7 @@
<string name="entry">Вход</string>
<string name="type_of_entrance">Тип прохода</string>
<string name="no_data">Нет данных\n</string>
<string name="qr_success_result">Успешно</string>
<string name="qr_wrong_result">Что-то пошло не так</string>
<string name="qr_null_result">Вход был отменён</string>
</resources>