Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,12 @@ internal class EventsRepositoryImpl(
userDtoMapper.toDomain(response.availableFriends)
}

override suspend fun checkUserAvailability(date: String): ResultWrapper<Boolean> =
safeApiCall {
val response = api.checkUserAvailability(date)
response.isAvailable
}

override suspend fun createEvent(
title: String,
description: String?,
Expand Down
Original file line number Diff line number Diff line change
@@ -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<Boolean> =
repository.checkUserAvailability(date)
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,15 @@ 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
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
Expand All @@ -37,6 +39,10 @@ val eventsModule = module {
CheckFriendsAvailabilityUseCaseImpl(repository = get())
}

factory<CheckUserAvailabilityUseCase> {
CheckUserAvailabilityUseCaseImpl(repository = get())
}

factory<CreateEventUseCase> {
CreateEventUseCaseImpl(repository = get())
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ import friends.mobile.feature.friends.domain.model.User
interface EventsRepository {
suspend fun checkFriendsAvailability(date: String): ResultWrapper<List<User>>

suspend fun checkUserAvailability(date: String): ResultWrapper<Boolean>

suspend fun createEvent(
title: String,
description: String?,
Expand Down
Original file line number Diff line number Diff line change
@@ -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<Boolean>
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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()

Expand All @@ -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),
)
Expand Down
Loading