diff --git a/app/src/main/java/ru/myitschool/work/core/Constants.kt b/app/src/main/java/ru/myitschool/work/core/Constants.kt index 971f65a..ffb63c1 100644 --- a/app/src/main/java/ru/myitschool/work/core/Constants.kt +++ b/app/src/main/java/ru/myitschool/work/core/Constants.kt @@ -1,5 +1,5 @@ package ru.myitschool.work.core // БЕРИТЕ И ИЗМЕНЯЙТЕ ХОСТ ТОЛЬКО ЗДЕСЬ И НЕ БЕРИТЕ ИЗ ДРУГИХ МЕСТ. ФАЙЛ ПЕРЕМЕЩАТЬ НЕЛЬЗЯ object Constants { - const val SERVER_ADDRESS = "http://localhost:8090" + const val SERVER_ADDRESS = "http://10.0.2.2:8080" } \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/data/auth/AuthNetworkDataSource.kt b/app/src/main/java/ru/myitschool/work/data/auth/AuthNetworkDataSource.kt index ebbfed3..229f2a0 100644 --- a/app/src/main/java/ru/myitschool/work/data/auth/AuthNetworkDataSource.kt +++ b/app/src/main/java/ru/myitschool/work/data/auth/AuthNetworkDataSource.kt @@ -1,5 +1,6 @@ package ru.myitschool.work.data.auth +import android.util.Log import io.ktor.client.call.body import io.ktor.client.request.get import io.ktor.client.request.header @@ -17,22 +18,24 @@ import ru.myitschool.work.data.user.UserDto object AuthNetworkDataSource { - suspend fun isUserExist(login: String): Result = withContext(Dispatchers.IO) { - runCatching { - val result = client.get("$SERVER_ADDRESS/api/login/$login") //10.0.2.2 - when (result.status) { - HttpStatusCode.OK -> { return@runCatching true } - HttpStatusCode.NotFound -> { return@runCatching false } - else -> {return@runCatching null } - } - } - } +// suspend fun isUserExist(login: String): Result = withContext(Dispatchers.IO) { +// runCatching { +// val result = client.get("$SERVER_ADDRESS/api/login/$login") //10.0.2.2 +// when (result.status) { +// HttpStatusCode.OK -> { return@runCatching true } +// HttpStatusCode.NotFound -> { return@runCatching false } +// else -> {return@runCatching null } +// } +// } +// } suspend fun login(token: String): Result = withContext(Dispatchers.IO) { + runCatching { val result = client.get("$SERVER_ADDRESS/api/login") { header(HttpHeaders.Authorization, token) } + Log.d("result", "${result.status}") if (result.status == HttpStatusCode.Unauthorized) { error("Неверный email или пароль") } diff --git a/app/src/main/java/ru/myitschool/work/data/auth/AuthRepoImpl.kt b/app/src/main/java/ru/myitschool/work/data/auth/AuthRepoImpl.kt index f0b3c20..fc38cb4 100644 --- a/app/src/main/java/ru/myitschool/work/data/auth/AuthRepoImpl.kt +++ b/app/src/main/java/ru/myitschool/work/data/auth/AuthRepoImpl.kt @@ -7,9 +7,9 @@ class AuthRepoImpl( private val authNetworkDataSource: AuthNetworkDataSource, private val authStorageDataSource: AuthStorageDataSource ) : AuthRepo { - override suspend fun isUserExist(email: String): Result { - return authNetworkDataSource.isUserExist(email) - } +// override suspend fun isUserExist(email: String): Result { +// return authNetworkDataSource.isUserExist(email) +// } override suspend fun login(email: String, password: String): Result { val token = authStorageDataSource.updateToken(email, password) diff --git a/app/src/main/java/ru/myitschool/work/data/user/EntrancesDto.kt b/app/src/main/java/ru/myitschool/work/data/user/EntrancesDto.kt new file mode 100644 index 0000000..c03157b --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/data/user/EntrancesDto.kt @@ -0,0 +1,16 @@ +package ru.myitschool.work.data.user + +import kotlinx.serialization.SerialName + +data class EntranceDto( + @SerialName("login") + val login : String, + @SerialName("name") + var name: String, + @SerialName("enterAt") + var enterAt: String, + @SerialName("enterType") + var enterType: String, +) { + +} \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/data/user/UserDto.kt b/app/src/main/java/ru/myitschool/work/data/user/UserDto.kt index 03c4e94..07ae1b9 100644 --- a/app/src/main/java/ru/myitschool/work/data/user/UserDto.kt +++ b/app/src/main/java/ru/myitschool/work/data/user/UserDto.kt @@ -18,8 +18,8 @@ data class UserDto( var avatarUrl: String?, @SerialName("position") val position: String, - @SerialName("lastEntry") - val lastEntry : String, + @SerialName("lastEnter") + val lastEntry : String? = null, @SerialName("authorities") val authorities : String ) { diff --git a/app/src/main/java/ru/myitschool/work/data/user/UserNetworkDataSource.kt b/app/src/main/java/ru/myitschool/work/data/user/UserNetworkDataSource.kt new file mode 100644 index 0000000..1bd7f31 --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/data/user/UserNetworkDataSource.kt @@ -0,0 +1,52 @@ +package ru.sicampus.bootcamp2025.data.user + +import android.util.Log +import io.ktor.client.call.body +import io.ktor.client.request.get +import io.ktor.client.request.header +import io.ktor.client.request.put +import io.ktor.client.request.setBody +import io.ktor.client.statement.bodyAsText +import io.ktor.http.HttpHeaders +import io.ktor.http.HttpStatusCode +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext +import ru.myitschool.work.core.Constants.SERVER_ADDRESS +import ru.myitschool.work.data.auth.AuthStorageDataSource.token +import ru.myitschool.work.data.auth.Network.client +import ru.myitschool.work.data.user.EntranceDto +import ru.myitschool.work.data.user.UserDto + +class UserNetworkDataSource { + suspend fun getUser(login : String): Result = withContext(Dispatchers.IO) { + runCatching { + + val result = client.get("http://$SERVER_ADDRESS/api/${login}/info") { + header(HttpHeaders.Authorization, token) + } + Log.d("tututuut", "${result.status}") + + + + if (result.status != HttpStatusCode.OK) { + error("Status ${result.status}") + } + Log.d("result", result.bodyAsText()) + result.body() + } + } + + suspend fun getEntrancesList(login : String) : Result> = withContext(Dispatchers.IO){ + runCatching { + val result = client.get("http://$SERVER_ADDRESS/api/$login/entrances") { + header(HttpHeaders.Authorization, token) + } + Log.d("serverCode", "${result.status}") + if (result.status != HttpStatusCode.OK) { + error("Status ${result.status}") + } + result.body() + } + + } +} \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/data/user/UserRepoImpl.kt b/app/src/main/java/ru/myitschool/work/data/user/UserRepoImpl.kt new file mode 100644 index 0000000..b544690 --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/data/user/UserRepoImpl.kt @@ -0,0 +1,42 @@ +package ru.sicampus.bootcamp2025.data.user + +import ru.myitschool.work.data.user.EntranceDto +import ru.myitschool.work.data.user.UserDto +import ru.myitschool.work.domain.user.EntranceEntity +import ru.myitschool.work.domain.user.UserEntity +import ru.myitschool.work.domain.user.UserRepo + + +class UserRepoImpl ( + private val userNetworkDataSource: UserNetworkDataSource +) : UserRepo { + override suspend fun getUser(login: String): Result { + return userNetworkDataSource.getUser(login).map { dto -> + UserEntity( + id = dto.id ?: -1, + name = dto.name, + avatarUrl = dto.avatarUrl ?: "", + authorities = dto.authorities, + login = login, + position = dto.position, + lastEntry = dto.lastEntry ?: "", + ) + + } + } + + + override suspend fun getEntrancesList(login : String): Result> { + return userNetworkDataSource.getEntrancesList(login).map { userList -> + userList.map { it.toEntity() } + } + } + fun EntranceDto.toEntity(): EntranceEntity { + return EntranceEntity( + login = login, + name = this.name, + enterAt = this.enterAt, + enterType = this.enterType + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/domain/auth/AuthRepo.kt b/app/src/main/java/ru/myitschool/work/domain/auth/AuthRepo.kt index 07dbf8b..5d978ab 100644 --- a/app/src/main/java/ru/myitschool/work/domain/auth/AuthRepo.kt +++ b/app/src/main/java/ru/myitschool/work/domain/auth/AuthRepo.kt @@ -3,6 +3,6 @@ package ru.myitschool.work.domain.auth import ru.myitschool.work.data.user.UserDto interface AuthRepo { - suspend fun isUserExist(email: String): Result - suspend fun login(email: String, password: String) : Result + //suspend fun isUserExist(email: String): Result + suspend fun login(login: String, password: String) : Result } diff --git a/app/src/main/java/ru/myitschool/work/domain/auth/IsUserExistUseCase.kt b/app/src/main/java/ru/myitschool/work/domain/auth/IsUserExistUseCase.kt index 7131138..25ebb15 100644 --- a/app/src/main/java/ru/myitschool/work/domain/auth/IsUserExistUseCase.kt +++ b/app/src/main/java/ru/myitschool/work/domain/auth/IsUserExistUseCase.kt @@ -3,10 +3,10 @@ package ru.myitschool.work.domain.auth import javax.inject.Inject -class IsUserExistUseCase ( +/*class IsUserExistUseCase ( private val authRepo : AuthRepo ) { suspend operator fun invoke(email : String) : Result { return authRepo.isUserExist(email) } -} \ No newline at end of file +}*/ \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/domain/auth/LoginUseCase.kt b/app/src/main/java/ru/myitschool/work/domain/auth/LoginUseCase.kt index aab6db4..cf1f682 100644 --- a/app/src/main/java/ru/myitschool/work/domain/auth/LoginUseCase.kt +++ b/app/src/main/java/ru/myitschool/work/domain/auth/LoginUseCase.kt @@ -5,7 +5,7 @@ import ru.myitschool.work.data.user.UserDto class LoginUseCase( private val authRepo : AuthRepo ){ - suspend operator fun invoke(email : String, password : String) : Result { - return authRepo.login(email, password) + suspend operator fun invoke(login : String, password : String) : Result { + return authRepo.login(login, password) } } \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/domain/auth/Network.kt b/app/src/main/java/ru/myitschool/work/domain/auth/Network.kt deleted file mode 100644 index 9b814c7..0000000 --- a/app/src/main/java/ru/myitschool/work/domain/auth/Network.kt +++ /dev/null @@ -1,18 +0,0 @@ -package ru.sicampus.bootcamp2025.data - -import io.ktor.client.HttpClient -import io.ktor.client.engine.cio.CIO -import io.ktor.client.plugins.contentnegotiation.ContentNegotiation -import io.ktor.serialization.kotlinx.json.json -import kotlinx.serialization.json.Json - -object Network { - val client = HttpClient(CIO) { - install(ContentNegotiation) { - json(Json { - isLenient = true - ignoreUnknownKeys = true - }) - } - } -} \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/domain/user/EntranceEntity.kt b/app/src/main/java/ru/myitschool/work/domain/user/EntranceEntity.kt new file mode 100644 index 0000000..9bf4638 --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/domain/user/EntranceEntity.kt @@ -0,0 +1,12 @@ +package ru.myitschool.work.domain.user + +import kotlinx.serialization.SerialName + +data class EntranceEntity( + val login : String, + var name: String, + var enterAt: String, + var enterType: String, +) { + +} diff --git a/app/src/main/java/ru/myitschool/work/domain/user/GetUserUseCase.kt b/app/src/main/java/ru/myitschool/work/domain/user/GetUserUseCase.kt new file mode 100644 index 0000000..786add4 --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/domain/user/GetUserUseCase.kt @@ -0,0 +1,16 @@ +package ru.myitschool.work.domain.user + +import ru.myitschool.work.data.auth.AuthStorageDataSource +import ru.myitschool.work.data.user.UserDto + +class GetUserUseCase( + private val repo: UserRepo, + private val authStorageDataSource: AuthStorageDataSource +) { + suspend fun getUserFromStorage() : UserDto? { + return authStorageDataSource.userInfo + } + suspend operator fun invoke() = repo.getUser(getUserFromStorage()?.login!!) + suspend fun getEntrancesList() = repo.getEntrancesList(getUserFromStorage()?.login!!) + +} \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/domain/user/UserEntity.kt b/app/src/main/java/ru/myitschool/work/domain/user/UserEntity.kt index 34f7609..afe2c60 100644 --- a/app/src/main/java/ru/myitschool/work/domain/user/UserEntity.kt +++ b/app/src/main/java/ru/myitschool/work/domain/user/UserEntity.kt @@ -8,7 +8,7 @@ data class UserEntity( var name: String, var avatarUrl: String?, val position : String, - var lastEntry : String, + var lastEntry : String?, val authorities : String ) diff --git a/app/src/main/java/ru/myitschool/work/domain/user/UserRepo.kt b/app/src/main/java/ru/myitschool/work/domain/user/UserRepo.kt new file mode 100644 index 0000000..58d8aea --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/domain/user/UserRepo.kt @@ -0,0 +1,7 @@ +package ru.myitschool.work.domain.user + + +interface UserRepo { + suspend fun getUser(login: String) : Result + suspend fun getEntrancesList(login : String) : Result> +} \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/ui/RootActivity.kt b/app/src/main/java/ru/myitschool/work/ui/RootActivity.kt index 4cfeab2..1a7ee74 100644 --- a/app/src/main/java/ru/myitschool/work/ui/RootActivity.kt +++ b/app/src/main/java/ru/myitschool/work/ui/RootActivity.kt @@ -1,5 +1,6 @@ package ru.myitschool.work.ui +import android.annotation.SuppressLint import android.os.Bundle import androidx.activity.OnBackPressedCallback import androidx.appcompat.app.AppCompatActivity @@ -17,22 +18,28 @@ import ru.myitschool.work.ui.qr.scan.QrScanFragment // НЕ ИЗМЕНЯЙТЕ НАЗВАНИЕ КЛАССА! @AndroidEntryPoint class RootActivity : AppCompatActivity() { + @SuppressLint("ResourceType") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.activity_root) + setContentView(R.layout.fragment_profile) + val userRole = intent.getStringExtra("USER_ROLE") /*val navHostFragment = supportFragmentManager .findFragmentById(R.id.nav_host_fragment) as NavHostFragment? + val navController = navHostFragment.navController*/ - if (navHostFragment != null) { - val navController = navHostFragment.navController - navController.graph = navController.createGraph( - startDestination = LoginDestination - ) { - fragment() - fragment() - } - } + + + /*if (userRole == "ROLE_ADMIN") { + bottomNavigationView.menu.clear() + bottomNavigationView.inflateMenu(R.menu.bottom_menu_admin) + navController.setGraph(R.navigation.main_admin_nav_graph) + + } else { + bottomNavigationView.menu.clear() + bottomNavigationView.inflateMenu(R.menu.bottom_menu) + navController.setGraph(R.navigation.main_nav_graph) + }*/ onBackPressedDispatcher.addCallback( this, @@ -44,7 +51,7 @@ class RootActivity : AppCompatActivity() { ) } - override fun onSupportNavigateUp(): Boolean { + /*override fun onSupportNavigateUp(): Boolean { val navController = findNavController(R.id.nav_host_fragment) val popBackResult = if (navController.previousBackStackEntry != null) { navController.popBackStack() @@ -53,5 +60,5 @@ class RootActivity : AppCompatActivity() { } return popBackResult || super.onSupportNavigateUp() }*/ - } + } \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/ui/login/LoginFragment.kt b/app/src/main/java/ru/myitschool/work/ui/login/LoginFragment.kt index b3ffdb6..f0957be 100644 --- a/app/src/main/java/ru/myitschool/work/ui/login/LoginFragment.kt +++ b/app/src/main/java/ru/myitschool/work/ui/login/LoginFragment.kt @@ -65,7 +65,7 @@ class LoginFragment : Fragment(R.layout.fragment_login) { override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) = Unit override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) = Unit override fun afterTextChanged(p0: Editable?) { - + viewModel.changeLogin() } }) diff --git a/app/src/main/java/ru/myitschool/work/ui/login/LoginViewModel.kt b/app/src/main/java/ru/myitschool/work/ui/login/LoginViewModel.kt index 66bb100..6b58580 100644 --- a/app/src/main/java/ru/myitschool/work/ui/login/LoginViewModel.kt +++ b/app/src/main/java/ru/myitschool/work/ui/login/LoginViewModel.kt @@ -17,14 +17,13 @@ import ru.myitschool.work.R import ru.myitschool.work.data.auth.AuthNetworkDataSource import ru.myitschool.work.data.auth.AuthRepoImpl import ru.myitschool.work.data.auth.AuthStorageDataSource -import ru.myitschool.work.domain.auth.IsUserExistUseCase +//import ru.myitschool.work.domain.auth.IsUserExistUseCase import ru.myitschool.work.domain.auth.LoginUseCase import javax.inject.Inject import kotlin.reflect.KClass class LoginViewModel constructor( @ApplicationContext private val context: Context, - private val isUserExistUseCase: IsUserExistUseCase, private val loginUseCase: LoginUseCase ) : ViewModel() { private val _state = MutableStateFlow(getStateShow()) @@ -49,44 +48,23 @@ class LoginViewModel constructor( ) { viewModelScope.launch { - when (checkUserExistence(login)) { - true -> { - loginUser(login, password) - } - false -> { - updateState(context.getString(R.string.error_invalid_credentials)) - } - null -> updateState(context.getString(R.string.error_unknown)) - } + loginUser(login, password) + } } - private suspend fun checkUserExistence(email: String):Boolean?{ - return try { - val result = isUserExistUseCase(email) - result.fold( - onSuccess = {isExist -> isExist}, - onFailure = { - Log.e("LoginViewModel", "Error checking user existence", it) - null - } - ) - } catch (e: Exception) { - Log.e("LoginViewModel", "Error during user existence check", e) - null - } - } private suspend fun loginUser(email: String, password: String) { loginUseCase(email, password).fold( onSuccess = { user -> - println("Login successful") + Log.d("loginViewModel","Login successful") _userRole.emit(user.authorities) _navigateToMain.emit(user.authorities) }, onFailure = { error -> updateState(error.message ?: context.getString(R.string.error_unknown)) + Log.d("errorLoginViewModel","${error.message}") } ) } @@ -125,7 +103,6 @@ class LoginViewModel constructor( ) return LoginViewModel( application, - isUserExistUseCase = IsUserExistUseCase(authRepoImpl), loginUseCase = LoginUseCase(authRepoImpl) ) as T } diff --git a/app/src/main/java/ru/myitschool/work/ui/profile/ProfileFragment.kt b/app/src/main/java/ru/myitschool/work/ui/profile/ProfileFragment.kt new file mode 100644 index 0000000..f177909 --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/ui/profile/ProfileFragment.kt @@ -0,0 +1,68 @@ +package ru.myitschool.work.ui.profile + +import android.content.Intent +import android.os.Bundle +import android.util.Log +import android.view.View +import androidx.fragment.app.Fragment +import androidx.fragment.app.viewModels +import com.squareup.picasso.Picasso +import ru.myitschool.work.R +import ru.myitschool.work.databinding.FragmentProfileBinding +import ru.myitschool.work.ui.login.EntryActivity +import ru.myitschool.work.utils.collectWithLifecycle + +class ProfileFragment : Fragment(R.layout.fragment_profile) { + private var _viewBinding: FragmentProfileBinding? = null + private val viewBinding: FragmentProfileBinding get() = _viewBinding!! + + private val viewModel by viewModels { ProfileViewModel.Factory } + + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + _viewBinding = FragmentProfileBinding.bind(view) + super.onViewCreated(view, savedInstanceState) + + + viewBinding.refresh.setOnClickListener { viewModel.clickRefresh() } + viewBinding.refreshForProfile.setOnClickListener { viewModel.clickRefresh() } + viewBinding.logout.setOnClickListener { + val intent = Intent(requireContext(), EntryActivity::class.java) + startActivity(intent) + requireActivity().finish() + } + + + viewModel.state.collectWithLifecycle(this) { state -> + + viewBinding.error.visibility = if (state is ProfileViewModel.State.Error) View.VISIBLE else View.GONE + 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 -> { + viewBinding.name.text = state.profileInfo.name + viewBinding.position.text = "Должность: ${state.profileInfo.name}" + if (state.profileInfo.lastEntry == null) viewBinding.lastEntry.text = "Время последнего входа: Нет данных" + else viewBinding.lastEntry.text = "Время последнего входа: ${state.profileInfo.lastEntry}" + Picasso.get().load(state.profileInfo.avatarUrl).resize(100, 100).centerCrop().into(viewBinding.imageView) + + //if (state.entrancesList == emptyList()) + //viewBinding.recyclerView.visibility = View.GONE + } + is ProfileViewModel.State.Error -> { + viewBinding.errorText.text = state.text + //viewBinding.noData.visibility = View.VISIBLE + } + } + + } + } + + + override fun onDestroyView() { + _viewBinding = null + super.onDestroyView() + } +} \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/ui/profile/ProfileViewModel.kt b/app/src/main/java/ru/myitschool/work/ui/profile/ProfileViewModel.kt new file mode 100644 index 0000000..2229547 --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/ui/profile/ProfileViewModel.kt @@ -0,0 +1,86 @@ +package ru.myitschool.work.ui.profile + +import android.util.Log +import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch +import ru.myitschool.work.data.auth.AuthStorageDataSource +import ru.myitschool.work.domain.user.EntranceEntity +import ru.myitschool.work.domain.user.GetUserUseCase +import ru.myitschool.work.domain.user.UserEntity +import ru.sicampus.bootcamp2025.data.user.UserNetworkDataSource +import ru.sicampus.bootcamp2025.data.user.UserRepoImpl + +class ProfileViewModel( + private val getUserUseCase: GetUserUseCase +) : ViewModel() { + private val _state = MutableStateFlow(State.Loading) + val state = _state.asStateFlow() + + init { + updateStateGet() + } + + fun clickRefresh() { + updateStateGet() + } + + fun updateStateGet() { + viewModelScope.launch { + _state.emit(State.Loading) + val entranceList : List = getUserUseCase.getEntrancesList().fold( + onSuccess = { list -> + list + }, + onFailure = { + emptyList() + } + ) + _state.emit( + getUserUseCase.invoke().fold( + onSuccess = { data -> + Log.d("uraa", "успех успех ${data.toString()}") + State.Show(data, entranceList) + }, + onFailure = { error -> + Log.d("kaput", error.message.toString()) + State.Error(error.message.toString()) + } + ) + ) + //_state.emit(State.Error("о нет ошибка ошибка помогите")) + } + } + + + + sealed interface State { + data object Loading: State + data class Show( + val profileInfo: UserEntity, + val entrancesList : List + ) : State + data class Error( + val text: String + ) : State + } + companion object { + val Factory : ViewModelProvider.Factory = object : ViewModelProvider.Factory { + @Suppress("UNCHECKED_CAST") + override fun create(modelClass: Class): T { + return ProfileViewModel( + getUserUseCase = GetUserUseCase( + repo = UserRepoImpl( + userNetworkDataSource = UserNetworkDataSource() + ), + authStorageDataSource = AuthStorageDataSource + ) + ) as T + } + } + } + +} \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_profile.xml b/app/src/main/res/layout/fragment_profile.xml index c1618d7..8939629 100644 --- a/app/src/main/res/layout/fragment_profile.xml +++ b/app/src/main/res/layout/fragment_profile.xml @@ -106,7 +106,7 @@ tools:text="Иванова Вера Павловна" /> + app:layout_constraintTop_toTopOf="@+id/view2" /> + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d886e6b..b07781e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -10,4 +10,7 @@ Непредвиденная ошибка История входов\n Время входа\n + Вход + Тип прохода + Нет данных\n \ No newline at end of file