From 49fdf1003c35e1d1d244e63b5845fec86e74bad8 Mon Sep 17 00:00:00 2001 From: danilpapa Date: Tue, 26 May 2026 22:30:19 +0300 Subject: [PATCH] fix api --- .../kotlin/friends/mobile/main/MainView.kt | 4 +- .../data/repository/EventsRepositoryImpl.kt | 6 +++ .../CheckUserAvailabilityUseCaseImpl.kt | 12 ++++++ .../mobile/feature/events/di/EventsModule.kt | 6 +++ .../domain/repository/EventsRepository.kt | 2 + .../usecase/CheckUserAvailabilityUseCase.kt | 7 ++++ .../presentation/CreateEventViewModel.kt | 38 ++++++++++--------- 7 files changed, 55 insertions(+), 20 deletions(-) create mode 100644 shared/src/commonMain/kotlin/friends/mobile/feature/events/data/usecase/CheckUserAvailabilityUseCaseImpl.kt create mode 100644 shared/src/commonMain/kotlin/friends/mobile/feature/events/domain/usecase/CheckUserAvailabilityUseCase.kt diff --git a/composeApp/src/androidMain/kotlin/friends/mobile/main/MainView.kt b/composeApp/src/androidMain/kotlin/friends/mobile/main/MainView.kt index 55da34e..e7395cd 100644 --- a/composeApp/src/androidMain/kotlin/friends/mobile/main/MainView.kt +++ b/composeApp/src/androidMain/kotlin/friends/mobile/main/MainView.kt @@ -364,12 +364,12 @@ fun MainView( showBusyAlert = true } is AvailabilityResult.Available -> { - onCreateEventClick(dateTimeString) + onCreateEventClick(dateString) showTimePickerDialog = false } null -> { // Network error or other issue - proceed with creation anyway - onCreateEventClick(dateTimeString) + onCreateEventClick(dateString) showTimePickerDialog = false } } diff --git a/shared/src/commonMain/kotlin/friends/mobile/feature/events/data/repository/EventsRepositoryImpl.kt b/shared/src/commonMain/kotlin/friends/mobile/feature/events/data/repository/EventsRepositoryImpl.kt index 7bebcb5..03426ed 100644 --- a/shared/src/commonMain/kotlin/friends/mobile/feature/events/data/repository/EventsRepositoryImpl.kt +++ b/shared/src/commonMain/kotlin/friends/mobile/feature/events/data/repository/EventsRepositoryImpl.kt @@ -25,6 +25,12 @@ internal class EventsRepositoryImpl( userDtoMapper.toDomain(response.availableFriends) } + override suspend fun checkUserAvailability(date: String): ResultWrapper = + safeApiCall { + val response = api.checkUserAvailability(date) + response.isAvailable + } + override suspend fun createEvent( title: String, description: String?, diff --git a/shared/src/commonMain/kotlin/friends/mobile/feature/events/data/usecase/CheckUserAvailabilityUseCaseImpl.kt b/shared/src/commonMain/kotlin/friends/mobile/feature/events/data/usecase/CheckUserAvailabilityUseCaseImpl.kt new file mode 100644 index 0000000..3b50384 --- /dev/null +++ b/shared/src/commonMain/kotlin/friends/mobile/feature/events/data/usecase/CheckUserAvailabilityUseCaseImpl.kt @@ -0,0 +1,12 @@ +package friends.mobile.feature.events.data.usecase + +import friends.mobile.core.domain.model.ResultWrapper +import friends.mobile.feature.events.domain.repository.EventsRepository +import friends.mobile.feature.events.domain.usecase.CheckUserAvailabilityUseCase + +internal class CheckUserAvailabilityUseCaseImpl( + private val repository: EventsRepository, +) : CheckUserAvailabilityUseCase { + override suspend fun invoke(date: String): ResultWrapper = + repository.checkUserAvailability(date) +} diff --git a/shared/src/commonMain/kotlin/friends/mobile/feature/events/di/EventsModule.kt b/shared/src/commonMain/kotlin/friends/mobile/feature/events/di/EventsModule.kt index 8b23663..470075b 100644 --- a/shared/src/commonMain/kotlin/friends/mobile/feature/events/di/EventsModule.kt +++ b/shared/src/commonMain/kotlin/friends/mobile/feature/events/di/EventsModule.kt @@ -4,6 +4,7 @@ import friends.mobile.feature.events.data.remote.EventsApi import friends.mobile.feature.events.data.repository.EventsRepositoryImpl import friends.mobile.feature.events.data.usecase.AcceptEventUseCaseImpl import friends.mobile.feature.events.data.usecase.CheckFriendsAvailabilityUseCaseImpl +import friends.mobile.feature.events.data.usecase.CheckUserAvailabilityUseCaseImpl import friends.mobile.feature.events.data.usecase.CreateEventUseCaseImpl import friends.mobile.feature.events.data.usecase.DeclineEventUseCaseImpl import friends.mobile.feature.events.data.usecase.GetEventDetailUseCaseImpl @@ -11,6 +12,7 @@ import friends.mobile.feature.events.data.usecase.GetPendingEventsUseCaseImpl import friends.mobile.feature.events.domain.repository.EventsRepository import friends.mobile.feature.events.domain.usecase.AcceptEventUseCase import friends.mobile.feature.events.domain.usecase.CheckFriendsAvailabilityUseCase +import friends.mobile.feature.events.domain.usecase.CheckUserAvailabilityUseCase import friends.mobile.feature.events.domain.usecase.CreateEventUseCase import friends.mobile.feature.events.domain.usecase.DeclineEventUseCase import friends.mobile.feature.events.domain.usecase.GetEventDetailUseCase @@ -37,6 +39,10 @@ val eventsModule = module { CheckFriendsAvailabilityUseCaseImpl(repository = get()) } + factory { + CheckUserAvailabilityUseCaseImpl(repository = get()) + } + factory { CreateEventUseCaseImpl(repository = get()) } diff --git a/shared/src/commonMain/kotlin/friends/mobile/feature/events/domain/repository/EventsRepository.kt b/shared/src/commonMain/kotlin/friends/mobile/feature/events/domain/repository/EventsRepository.kt index e10de5b..275c643 100644 --- a/shared/src/commonMain/kotlin/friends/mobile/feature/events/domain/repository/EventsRepository.kt +++ b/shared/src/commonMain/kotlin/friends/mobile/feature/events/domain/repository/EventsRepository.kt @@ -8,6 +8,8 @@ import friends.mobile.feature.friends.domain.model.User interface EventsRepository { suspend fun checkFriendsAvailability(date: String): ResultWrapper> + suspend fun checkUserAvailability(date: String): ResultWrapper + suspend fun createEvent( title: String, description: String?, diff --git a/shared/src/commonMain/kotlin/friends/mobile/feature/events/domain/usecase/CheckUserAvailabilityUseCase.kt b/shared/src/commonMain/kotlin/friends/mobile/feature/events/domain/usecase/CheckUserAvailabilityUseCase.kt new file mode 100644 index 0000000..e589ec2 --- /dev/null +++ b/shared/src/commonMain/kotlin/friends/mobile/feature/events/domain/usecase/CheckUserAvailabilityUseCase.kt @@ -0,0 +1,7 @@ +package friends.mobile.feature.events.domain.usecase + +import friends.mobile.core.domain.model.ResultWrapper + +interface CheckUserAvailabilityUseCase { + suspend operator fun invoke(date: String): ResultWrapper +} diff --git a/shared/src/commonMain/kotlin/friends/mobile/feature/events/presentation/CreateEventViewModel.kt b/shared/src/commonMain/kotlin/friends/mobile/feature/events/presentation/CreateEventViewModel.kt index 200bb60..e683cd8 100644 --- a/shared/src/commonMain/kotlin/friends/mobile/feature/events/presentation/CreateEventViewModel.kt +++ b/shared/src/commonMain/kotlin/friends/mobile/feature/events/presentation/CreateEventViewModel.kt @@ -6,6 +6,7 @@ import friends.mobile.core.domain.model.mapApiErrorToUserFriendly import friends.mobile.core.viewmodel.BaseViewModel import friends.mobile.feature.auth.domain.usecase.GetStoredSessionUseCase import friends.mobile.feature.events.domain.usecase.CheckFriendsAvailabilityUseCase +import friends.mobile.feature.events.domain.usecase.CheckUserAvailabilityUseCase import friends.mobile.feature.events.domain.usecase.CreateEventUseCase import kotlinx.coroutines.launch import org.koin.core.component.KoinComponent @@ -19,6 +20,7 @@ class CreateEventViewModel( KoinComponent { private val checkFriendsAvailabilityUseCase: CheckFriendsAvailabilityUseCase by inject() + private val checkUserAvailabilityUseCase: CheckUserAvailabilityUseCase by inject() private val createEventUseCase: CreateEventUseCase by inject() private val getStoredSessionUseCase: GetStoredSessionUseCase by inject() @@ -41,27 +43,27 @@ class CreateEventViewModel( private fun loadAvailableFriends() { viewModelScope.launch { - when (val result = checkFriendsAvailabilityUseCase(selectedDate)) { + when (val friendsResult = checkFriendsAvailabilityUseCase(selectedDate)) { is ResultWrapper.Success -> { - // Check if the owner (current user) is available on this date - val currentSession = getStoredSessionUseCase() - val ownerId = currentSession?.user?.id - - // The API returns only available friends, so owner is available if: - // 1. Owner ID exists in the available friends list, OR - // 2. If owner is not in the list, it means they're busy - val availableFriendsIds = result.data.map { it.id }.toSet() - val isOwnerAvailable = ownerId != null && availableFriendsIds.contains(ownerId) - - viewState = CreateEventViewState.Content( - selectedDate = selectedDate, - availableFriends = result.data, - isLoadingFriends = false, - isOwnerAvailable = isOwnerAvailable, - ) + when (val userAvailabilityResult = checkUserAvailabilityUseCase(selectedDate)) { + is ResultWrapper.Success -> { + viewState = CreateEventViewState.Content( + selectedDate = selectedDate, + availableFriends = friendsResult.data, + isLoadingFriends = false, + isOwnerAvailable = userAvailabilityResult.data, + ) + } + is ResultWrapper.Error -> { + val userError = mapApiErrorToUserFriendly(userAvailabilityResult.error) + viewState = CreateEventViewState.Error( + message = getErrorMessage(userError), + ) + } + } } is ResultWrapper.Error -> { - val userError = mapApiErrorToUserFriendly(result.error) + val userError = mapApiErrorToUserFriendly(friendsResult.error) viewState = CreateEventViewState.Error( message = getErrorMessage(userError), )