diff --git a/app/src/main/java/ru/myitschool/work/data/dto/VisitDTO.kt b/app/src/main/java/ru/myitschool/work/data/dto/EmployeeEntranceDTO.kt similarity index 53% rename from app/src/main/java/ru/myitschool/work/data/dto/VisitDTO.kt rename to app/src/main/java/ru/myitschool/work/data/dto/EmployeeEntranceDTO.kt index 2dd1e6d..c0bcfc1 100644 --- a/app/src/main/java/ru/myitschool/work/data/dto/VisitDTO.kt +++ b/app/src/main/java/ru/myitschool/work/data/dto/EmployeeEntranceDTO.kt @@ -6,8 +6,9 @@ import ru.myitschool.work.utils.DateSerializer import java.util.Date @Serializable -data class VisitDTO( - @SerialName("scanTime") @Serializable(with = DateSerializer::class) val scanTime : Date?, - @SerialName("readerId") val readerName: String?, +data class EmployeeEntranceDTO( + @SerialName("id") val id : Int?, + @SerialName("entryTime") @Serializable(with = DateSerializer::class) val scanTime : Date?, + @SerialName("readerName") val readerName: String?, @SerialName("type") val type: String? ) diff --git a/app/src/main/java/ru/myitschool/work/data/dto/VisitListPagingDTO.kt b/app/src/main/java/ru/myitschool/work/data/dto/EmployeeEntranceListPagingDTO.kt similarity index 55% rename from app/src/main/java/ru/myitschool/work/data/dto/VisitListPagingDTO.kt rename to app/src/main/java/ru/myitschool/work/data/dto/EmployeeEntranceListPagingDTO.kt index 73130d6..26edbc1 100644 --- a/app/src/main/java/ru/myitschool/work/data/dto/VisitListPagingDTO.kt +++ b/app/src/main/java/ru/myitschool/work/data/dto/EmployeeEntranceListPagingDTO.kt @@ -4,6 +4,6 @@ import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable -data class VisitListPagingDTO( - @SerialName("content") val content : List? +data class EmployeeEntranceListPagingDTO( + @SerialName("content") val content : List? ) diff --git a/app/src/main/java/ru/myitschool/work/data/dto/UserDTO.kt b/app/src/main/java/ru/myitschool/work/data/dto/UserDTO.kt index d2a74c4..844d6f1 100644 --- a/app/src/main/java/ru/myitschool/work/data/dto/UserDTO.kt +++ b/app/src/main/java/ru/myitschool/work/data/dto/UserDTO.kt @@ -9,7 +9,7 @@ data class UserDTO( @SerialName("login") val login: String?, @SerialName("name") val name: String?, @SerialName("authority") val authority : String?, - @SerialName("photo") val photoUrl: String?, + @SerialName("photoUrl") val photoUrl: String?, @SerialName("position") val position: String? ) diff --git a/app/src/main/java/ru/myitschool/work/data/entrance/allEntrances/AllEntranceListNetworkDataSource.kt b/app/src/main/java/ru/myitschool/work/data/entrance/allEntrances/AllEntranceListNetworkDataSource.kt new file mode 100644 index 0000000..84469f7 --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/data/entrance/allEntrances/AllEntranceListNetworkDataSource.kt @@ -0,0 +1,39 @@ +package ru.myitschool.work.data.entrance.allEntrances + +import android.content.Context +import io.ktor.client.call.body +import io.ktor.client.request.basicAuth +import io.ktor.client.request.get +import io.ktor.http.HttpStatusCode +import io.ktor.http.headers +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.withContext +import ru.myitschool.work.core.Constants +import ru.myitschool.work.data.UserDataStoreManager +import ru.myitschool.work.data.dto.EmployeeEntranceListPagingDTO +import ru.myitschool.work.utils.NetworkModule + +class AllEntranceListNetworkDataSource( + context: Context +) { + private val client = NetworkModule.httpClient + private val userDataStoreManager = UserDataStoreManager.getInstance(context) + suspend fun getList(pageNum: Int, pageSize: Int):Result = withContext( + Dispatchers.IO){ + runCatching { + val username = userDataStoreManager.usernameFlow.first() + val password = userDataStoreManager.passwordFlow.first() + val result = client.get("${Constants.SERVER_ADDRESS}/api/entrance/all?page=$pageNum&size=$pageSize"){ + headers{ + basicAuth(username, password) + } + } + + 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/entrance/allEntrances/AllEntranceListRepoImpl.kt b/app/src/main/java/ru/myitschool/work/data/entrance/allEntrances/AllEntranceListRepoImpl.kt new file mode 100644 index 0000000..1a7db28 --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/data/entrance/allEntrances/AllEntranceListRepoImpl.kt @@ -0,0 +1,24 @@ +package ru.myitschool.work.data.entrance.allEntrances + +import ru.myitschool.work.domain.employeeEntrance.allEntrances.AllEntranceListRepo +import ru.myitschool.work.domain.entities.EmployeeEntranceEntity + +class AllEntranceListRepoImpl( + private val networkDataSource: AllEntranceListNetworkDataSource +) : AllEntranceListRepo { + override suspend fun getList( + pageNum: Int, + pageSize: Int + ): Result> { + return networkDataSource.getList(pageNum, pageSize).map { pagingDTO -> + pagingDTO.content?.mapNotNull { dto -> + EmployeeEntranceEntity( + id = dto.id ?: return@mapNotNull null, + scanTime = dto.scanTime ?: return@mapNotNull null, + readerName = dto.readerName ?: return@mapNotNull null, + type = dto.type ?: return@mapNotNull null + ) + }?: return Result.failure(IllegalStateException("List parse error")) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/data/visitsList/employeeEntrances/EmployeeEntranceListNetworkDataSource.kt b/app/src/main/java/ru/myitschool/work/data/entrance/employeeEntrances/EmployeeEntranceListNetworkDataSource.kt similarity index 78% rename from app/src/main/java/ru/myitschool/work/data/visitsList/employeeEntrances/EmployeeEntranceListNetworkDataSource.kt rename to app/src/main/java/ru/myitschool/work/data/entrance/employeeEntrances/EmployeeEntranceListNetworkDataSource.kt index 335f3c9..1ce9725 100644 --- a/app/src/main/java/ru/myitschool/work/data/visitsList/employeeEntrances/EmployeeEntranceListNetworkDataSource.kt +++ b/app/src/main/java/ru/myitschool/work/data/entrance/employeeEntrances/EmployeeEntranceListNetworkDataSource.kt @@ -1,9 +1,10 @@ -package ru.myitschool.work.data.visitsList.employeeEntrances +package ru.myitschool.work.data.entrance.employeeEntrances import android.content.Context import io.ktor.client.call.body import io.ktor.client.request.basicAuth import io.ktor.client.request.get +import io.ktor.client.statement.bodyAsText import io.ktor.http.HttpStatusCode import io.ktor.http.headers import kotlinx.coroutines.Dispatchers @@ -11,7 +12,7 @@ import kotlinx.coroutines.flow.first import kotlinx.coroutines.withContext import ru.myitschool.work.core.Constants import ru.myitschool.work.data.UserDataStoreManager -import ru.myitschool.work.data.dto.VisitListPagingDTO +import ru.myitschool.work.data.dto.EmployeeEntranceListPagingDTO import ru.myitschool.work.utils.NetworkModule class EmployeeEntranceListNetworkDataSource( @@ -19,7 +20,7 @@ class EmployeeEntranceListNetworkDataSource( ){ private val client = NetworkModule.httpClient private val userDataStoreManager = UserDataStoreManager.getInstance(context) - suspend fun getList(pageNum: Int, pageSize: Int):Result = withContext(Dispatchers.IO){ + suspend fun getList(pageNum: Int, pageSize: Int):Result = withContext(Dispatchers.IO){ runCatching { val username = userDataStoreManager.usernameFlow.first() val password = userDataStoreManager.passwordFlow.first() @@ -32,6 +33,7 @@ class EmployeeEntranceListNetworkDataSource( if (result.status != HttpStatusCode.OK) { error("Status ${result.status}") } + println(result.bodyAsText()) result.body() } } diff --git a/app/src/main/java/ru/myitschool/work/data/visitsList/employeeEntrances/EmployeeEntranceListRepoImpl.kt b/app/src/main/java/ru/myitschool/work/data/entrance/employeeEntrances/EmployeeEntranceListRepoImpl.kt similarity index 72% rename from app/src/main/java/ru/myitschool/work/data/visitsList/employeeEntrances/EmployeeEntranceListRepoImpl.kt rename to app/src/main/java/ru/myitschool/work/data/entrance/employeeEntrances/EmployeeEntranceListRepoImpl.kt index 0b9ea26..4761046 100644 --- a/app/src/main/java/ru/myitschool/work/data/visitsList/employeeEntrances/EmployeeEntranceListRepoImpl.kt +++ b/app/src/main/java/ru/myitschool/work/data/entrance/employeeEntrances/EmployeeEntranceListRepoImpl.kt @@ -1,7 +1,7 @@ -package ru.myitschool.work.data.visitsList.employeeEntrances +package ru.myitschool.work.data.entrance.employeeEntrances import ru.myitschool.work.domain.entities.EmployeeEntranceEntity -import ru.myitschool.work.domain.visitsList.EmployeeEntranceListRepo +import ru.myitschool.work.domain.employeeEntrance.employeeEntrances.EmployeeEntranceListRepo class EmployeeEntranceListRepoImpl( private val networkDataSource: EmployeeEntranceListNetworkDataSource @@ -10,9 +10,10 @@ class EmployeeEntranceListRepoImpl( return networkDataSource.getList(pageNum, pageSize).map { pagingDTO -> pagingDTO.content?.mapNotNull { dto-> EmployeeEntranceEntity( + id = dto.id ?: return@mapNotNull null, scanTime = dto.scanTime ?: return@mapNotNull null, readerName = dto.readerName ?: return@mapNotNull null, - type = dto.type ?: return@mapNotNull null + type = dto.type ?: return@mapNotNull null, ) }?: return Result.failure(IllegalStateException("List parse error")) } diff --git a/app/src/main/java/ru/myitschool/work/data/info/InfoNetworkDataSource.kt b/app/src/main/java/ru/myitschool/work/data/info/InfoNetworkDataSource.kt index 99eb908..d8ffa2d 100644 --- a/app/src/main/java/ru/myitschool/work/data/info/InfoNetworkDataSource.kt +++ b/app/src/main/java/ru/myitschool/work/data/info/InfoNetworkDataSource.kt @@ -3,7 +3,7 @@ package ru.myitschool.work.data.info import android.content.Context import io.ktor.client.call.body import io.ktor.client.request.basicAuth -import io.ktor.client.request.get +import io.ktor.client.request.post import io.ktor.client.statement.bodyAsText import io.ktor.http.HttpStatusCode import io.ktor.http.headers @@ -25,7 +25,7 @@ class InfoNetworkDataSource( runCatching { val username = userDataStoreManager.usernameFlow.first() val password = userDataStoreManager.passwordFlow.first() - val result = client.get("${Constants.SERVER_ADDRESS}/api/employee/profile"){ + val result = client.post("${Constants.SERVER_ADDRESS}/api/employee/profile"){ headers{ basicAuth(username, password) } diff --git a/app/src/main/java/ru/myitschool/work/data/info/InfoRepoImpl.kt b/app/src/main/java/ru/myitschool/work/data/info/InfoRepoImpl.kt index bfb70ff..d6e3f94 100644 --- a/app/src/main/java/ru/myitschool/work/data/info/InfoRepoImpl.kt +++ b/app/src/main/java/ru/myitschool/work/data/info/InfoRepoImpl.kt @@ -11,7 +11,7 @@ class InfoRepoImpl( UserEntity( id = dto.id ?: 0, login = dto.login ?: "", - name = dto.login ?: "", + name = dto.name ?: "", authority = dto.authority ?: "", photoUrl = dto.photoUrl, position = dto.position ?: "" diff --git a/app/src/main/java/ru/myitschool/work/data/login/LoginNetworkDataSource.kt b/app/src/main/java/ru/myitschool/work/data/login/LoginNetworkDataSource.kt index 40b5e82..a2b92f2 100644 --- a/app/src/main/java/ru/myitschool/work/data/login/LoginNetworkDataSource.kt +++ b/app/src/main/java/ru/myitschool/work/data/login/LoginNetworkDataSource.kt @@ -2,7 +2,8 @@ package ru.myitschool.work.data.login import io.ktor.client.call.body import io.ktor.client.request.basicAuth -import io.ktor.client.request.get +import io.ktor.client.request.post +import io.ktor.client.statement.bodyAsText import io.ktor.http.HttpStatusCode import io.ktor.http.headers import kotlinx.coroutines.Dispatchers @@ -14,7 +15,8 @@ class LoginNetworkDataSource { private val client = NetworkModule.httpClient suspend fun login(username: String, password: String):Result = withContext(Dispatchers.IO){ runCatching { - val result = client.get("${Constants.SERVER_ADDRESS}/api/employee/login"){ + println("$username $password") + val result = client.post("${Constants.SERVER_ADDRESS}/api/employee/login"){ headers{ basicAuth(username, password) } @@ -22,6 +24,7 @@ class LoginNetworkDataSource { if (result.status != HttpStatusCode.OK) { error("Status ${result.status}") } + println(result.bodyAsText()) result.body() } } diff --git a/app/src/main/java/ru/myitschool/work/domain/employeeEntrance/allEntrances/AllEntranceListRepo.kt b/app/src/main/java/ru/myitschool/work/domain/employeeEntrance/allEntrances/AllEntranceListRepo.kt new file mode 100644 index 0000000..8192537 --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/domain/employeeEntrance/allEntrances/AllEntranceListRepo.kt @@ -0,0 +1,7 @@ +package ru.myitschool.work.domain.employeeEntrance.allEntrances + +import ru.myitschool.work.domain.entities.EmployeeEntranceEntity + +interface AllEntranceListRepo { + suspend fun getList(pageNum : Int, pageSize: Int) : Result> +} \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/domain/employeeEntrance/allEntrances/GetAllEmployeesEntranceList.kt b/app/src/main/java/ru/myitschool/work/domain/employeeEntrance/allEntrances/GetAllEmployeesEntranceList.kt new file mode 100644 index 0000000..48351d2 --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/domain/employeeEntrance/allEntrances/GetAllEmployeesEntranceList.kt @@ -0,0 +1,7 @@ +package ru.myitschool.work.domain.employeeEntrance.allEntrances + +class GetAllEmployeesEntranceList( + private val repo: AllEntranceListRepo +) { + suspend operator fun invoke(pageNum : Int, pageSize: Int) = repo.getList(pageNum, pageSize) +} \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/domain/visitsList/EmployeeEntranceListRepo.kt b/app/src/main/java/ru/myitschool/work/domain/employeeEntrance/employeeEntrances/EmployeeEntranceListRepo.kt similarity index 74% rename from app/src/main/java/ru/myitschool/work/domain/visitsList/EmployeeEntranceListRepo.kt rename to app/src/main/java/ru/myitschool/work/domain/employeeEntrance/employeeEntrances/EmployeeEntranceListRepo.kt index 22957cc..5e33695 100644 --- a/app/src/main/java/ru/myitschool/work/domain/visitsList/EmployeeEntranceListRepo.kt +++ b/app/src/main/java/ru/myitschool/work/domain/employeeEntrance/employeeEntrances/EmployeeEntranceListRepo.kt @@ -1,4 +1,4 @@ -package ru.myitschool.work.domain.visitsList +package ru.myitschool.work.domain.employeeEntrance.employeeEntrances import ru.myitschool.work.domain.entities.EmployeeEntranceEntity diff --git a/app/src/main/java/ru/myitschool/work/domain/visitsList/GetEmployeeEntranceListUseCase.kt b/app/src/main/java/ru/myitschool/work/domain/employeeEntrance/employeeEntrances/GetEmployeeEntranceListUseCase.kt similarity index 73% rename from app/src/main/java/ru/myitschool/work/domain/visitsList/GetEmployeeEntranceListUseCase.kt rename to app/src/main/java/ru/myitschool/work/domain/employeeEntrance/employeeEntrances/GetEmployeeEntranceListUseCase.kt index be24827..f3720f3 100644 --- a/app/src/main/java/ru/myitschool/work/domain/visitsList/GetEmployeeEntranceListUseCase.kt +++ b/app/src/main/java/ru/myitschool/work/domain/employeeEntrance/employeeEntrances/GetEmployeeEntranceListUseCase.kt @@ -1,4 +1,4 @@ -package ru.myitschool.work.domain.visitsList +package ru.myitschool.work.domain.employeeEntrance.employeeEntrances class GetEmployeeEntranceListUseCase( private val repo: EmployeeEntranceListRepo diff --git a/app/src/main/java/ru/myitschool/work/domain/entities/EmployeeEntranceEntity.kt b/app/src/main/java/ru/myitschool/work/domain/entities/EmployeeEntranceEntity.kt index 91b9830..c131462 100644 --- a/app/src/main/java/ru/myitschool/work/domain/entities/EmployeeEntranceEntity.kt +++ b/app/src/main/java/ru/myitschool/work/domain/entities/EmployeeEntranceEntity.kt @@ -1,9 +1,9 @@ package ru.myitschool.work.domain.entities - import java.util.Date data class EmployeeEntranceEntity( - val scanTime : Date, - val readerName: String, - val type: String + val id : Int?, + val scanTime : Date?, + val readerName: String?, + val type: String? ) 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 bb17210..89b273a 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 @@ -36,6 +36,8 @@ class LoginFragment : Fragment(R.layout.fragment_login) { } } binding.username.addTextChangedListener(textWatcher) + binding.password.addTextChangedListener(textWatcher) + binding.loginBtn.isEnabled = false binding.loginBtn.setOnClickListener{ viewModel.login(binding.username.text.toString(), binding.password.text.toString()) diff --git a/app/src/main/java/ru/myitschool/work/ui/main/EmployeeEntranceListPagingSource.kt b/app/src/main/java/ru/myitschool/work/ui/main/EmployeeEntranceListPagingSource.kt index 58662c2..feaa7cd 100644 --- a/app/src/main/java/ru/myitschool/work/ui/main/EmployeeEntranceListPagingSource.kt +++ b/app/src/main/java/ru/myitschool/work/ui/main/EmployeeEntranceListPagingSource.kt @@ -28,6 +28,7 @@ class EmployeeEntranceListPagingSource( }, onFailure = { e-> + println(e) LoadResult.Error(e) } ) diff --git a/app/src/main/java/ru/myitschool/work/ui/main/MainFragment.kt b/app/src/main/java/ru/myitschool/work/ui/main/MainFragment.kt index 25a4f5d..204e074 100644 --- a/app/src/main/java/ru/myitschool/work/ui/main/MainFragment.kt +++ b/app/src/main/java/ru/myitschool/work/ui/main/MainFragment.kt @@ -8,6 +8,7 @@ import androidx.fragment.app.setFragmentResultListener import androidx.fragment.app.viewModels import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController +import androidx.paging.LoadState import androidx.recyclerview.widget.LinearLayoutManager import com.squareup.picasso.Picasso import kotlinx.coroutines.delay @@ -18,6 +19,7 @@ import ru.myitschool.work.domain.entities.UserEntity import ru.myitschool.work.ui.qr.scan.QrScanDestination import ru.myitschool.work.utils.UserState import ru.myitschool.work.utils.collectWhenStarted +import ru.myitschool.work.utils.collectWithLifecycle class MainFragment : Fragment(R.layout.fragment_main) { @@ -32,7 +34,7 @@ class MainFragment : Fragment(R.layout.fragment_main) { _binding = FragmentMainBinding.bind(view) viewModel.getUserData() - binding.refresh.setOnClickListener { viewModel.getUserData() } + binding.logout.setOnClickListener { logout() } binding.scan.setOnClickListener { onScanClick() } viewModel.userState.collectWhenStarted(this) { state -> @@ -60,7 +62,23 @@ class MainFragment : Fragment(R.layout.fragment_main) { } binding.content.layoutManager = LinearLayoutManager(requireContext()) val adapter = EmployeeEntranceListAdapter() + binding.refresh.setOnClickListener { + viewModel.getUserData() + adapter.refresh() + } binding.content.adapter = adapter + viewModel.listState.collectWithLifecycle(this) { data -> + adapter.submitData(data) + } + adapter.loadStateFlow.collectWithLifecycle(this) { loadState -> + val state = loadState.refresh + binding.error.visibility = if (state is LoadState.Error) View.VISIBLE else View.GONE + binding.loading.visibility = if (state is LoadState.Loading) View.VISIBLE else View.GONE + + if (state is LoadState.Error) { + binding.error.text = state.error.message.toString() + } + } setFragmentResultListener(QrScanDestination.REQUEST_KEY) { _, bundle -> @@ -87,6 +105,7 @@ class MainFragment : Fragment(R.layout.fragment_main) { private fun showUserData(userEntity: UserEntity) { binding.apply { fullname.text = userEntity.name + println(userEntity.name) position.text = userEntity.position Picasso.get().load(userEntity.photoUrl).into(photo) diff --git a/app/src/main/java/ru/myitschool/work/ui/main/MainViewModel.kt b/app/src/main/java/ru/myitschool/work/ui/main/MainViewModel.kt index 9aece66..7cd1e3e 100644 --- a/app/src/main/java/ru/myitschool/work/ui/main/MainViewModel.kt +++ b/app/src/main/java/ru/myitschool/work/ui/main/MainViewModel.kt @@ -17,13 +17,11 @@ import kotlinx.coroutines.withContext import ru.myitschool.work.data.UserDataStoreManager import ru.myitschool.work.data.info.InfoNetworkDataSource import ru.myitschool.work.data.info.InfoRepoImpl -import ru.myitschool.work.data.visitsList.employeeEntrances.EmployeeEntranceListNetworkDataSource -import ru.myitschool.work.data.visitsList.employeeEntrances.EmployeeEntranceListRepoImpl +import ru.myitschool.work.data.entrance.employeeEntrances.EmployeeEntranceListNetworkDataSource +import ru.myitschool.work.data.entrance.employeeEntrances.EmployeeEntranceListRepoImpl import ru.myitschool.work.domain.info.GetInfoUseCase -import ru.myitschool.work.domain.visitsList.GetEmployeeEntranceListUseCase +import ru.myitschool.work.domain.employeeEntrance.employeeEntrances.GetEmployeeEntranceListUseCase import ru.myitschool.work.utils.UserState -import java.text.SimpleDateFormat -import java.util.Locale class MainViewModel( private val infoUseCase: GetInfoUseCase, @@ -41,31 +39,30 @@ class MainViewModel( println("Creating PagingSource") EmployeeEntranceListPagingSource(listUseCase::invoke) }.flow.cachedIn(viewModelScope) + init { + viewModelScope.launch { + listState.collect { pagingData -> + if (pagingData.toString().isEmpty()) { + println("No data in paging data.") + } else { + println("Data received: $pagingData") + } + } + } + } private val _userState = MutableStateFlow(UserState.Loading) val userState: StateFlow get() = _userState private val dataStoreManager = UserDataStoreManager(application) - fun formatDate(date: String): String { - val inputFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.getDefault()) - val outputFormat = SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.getDefault()) - return try { - val formattedDate = inputFormat.parse(date) - if (formattedDate != null) { - outputFormat.format(formattedDate) - } else{} - } catch (_: Exception) { - "Invalid Date" - }.toString() - } - fun getUserData() { _userState.value = UserState.Loading viewModelScope.launch { infoUseCase.invoke().fold( onSuccess = { data -> _userState.value = UserState.Success(data) }, - onFailure = { _userState.value = UserState.Error } + onFailure = { e -> _userState.value = UserState.Error + println(e)} ) } } diff --git a/app/src/main/java/ru/myitschool/work/utils/DateConverter.kt b/app/src/main/java/ru/myitschool/work/utils/DateConverter.kt index b12facb..91d7210 100644 --- a/app/src/main/java/ru/myitschool/work/utils/DateConverter.kt +++ b/app/src/main/java/ru/myitschool/work/utils/DateConverter.kt @@ -6,7 +6,7 @@ import java.util.Locale fun dateConverter(date: Date?) : String { if (date != null) { - val dateFormat = SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()) + val dateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()) println(dateFormat.format(date).toString()) return dateFormat.format(date).toString() diff --git a/app/src/main/java/ru/myitschool/work/utils/DateSerializer.kt b/app/src/main/java/ru/myitschool/work/utils/DateSerializer.kt index 90bf308..dfe858d 100644 --- a/app/src/main/java/ru/myitschool/work/utils/DateSerializer.kt +++ b/app/src/main/java/ru/myitschool/work/utils/DateSerializer.kt @@ -11,7 +11,7 @@ import java.util.Date import java.util.Locale object DateSerializer : KSerializer { - private val dateFormat = SimpleDateFormat("yyyy-MM-dd", Locale.US) + private val dateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.US) override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("Date", PrimitiveKind.STRING) diff --git a/app/src/main/java/ru/myitschool/work/utils/FragmentExtesions.kt b/app/src/main/java/ru/myitschool/work/utils/FragmentExtesions.kt index 8c99ef3..5cc563a 100644 --- a/app/src/main/java/ru/myitschool/work/utils/FragmentExtesions.kt +++ b/app/src/main/java/ru/myitschool/work/utils/FragmentExtesions.kt @@ -1,8 +1,10 @@ package ru.myitschool.work.utils import androidx.fragment.app.Fragment +import androidx.lifecycle.Lifecycle import androidx.lifecycle.flowWithLifecycle import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.launch @@ -15,4 +17,14 @@ inline fun Flow.collectWhenStarted( collector.invoke(value) } } +} +fun Flow.collectWithLifecycle( + fragment: Fragment, + function: suspend (T) -> Unit +){ + fragment.viewLifecycleOwner.lifecycleScope.launch { + fragment.repeatOnLifecycle(Lifecycle.State.STARTED) { + collect { function.invoke(it) } + } + } } \ No newline at end of file