diff --git a/core/src/main/java/org/futo/circles/core/feature/invite_to_follow/InviteToFollowMeDialogFragment.kt b/core/src/main/java/org/futo/circles/core/feature/invite_to_follow/InviteToFollowMeDialogFragment.kt index 0fa90df4f4e2fd433c553768822f4abe07fd1311..e35f2c3b807dc7b47a57d0da7bf96da565e06ebe 100644 --- a/core/src/main/java/org/futo/circles/core/feature/invite_to_follow/InviteToFollowMeDialogFragment.kt +++ b/core/src/main/java/org/futo/circles/core/feature/invite_to_follow/InviteToFollowMeDialogFragment.kt @@ -6,13 +6,17 @@ import android.view.View import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import androidx.navigation.fragment.findNavController +import androidx.navigation.fragment.navArgs import dagger.hilt.android.AndroidEntryPoint import org.futo.circles.core.R import org.futo.circles.core.base.fragment.BaseFullscreenDialogFragment import org.futo.circles.core.base.fragment.HasLoadingState import org.futo.circles.core.databinding.DialogFragmentInviteToFollowMeBinding import org.futo.circles.core.extensions.navigateSafe +import org.futo.circles.core.extensions.observeResponse +import org.futo.circles.core.extensions.onBackPressed import org.futo.circles.core.extensions.setIsVisible +import org.futo.circles.core.extensions.showSuccess import org.futo.circles.core.feature.room.select.SelectRoomsFragment import org.futo.circles.core.feature.room.select.interfaces.RoomsListener import org.futo.circles.core.feature.room.select.interfaces.SelectRoomsListener @@ -26,6 +30,7 @@ class InviteToFollowMeDialogFragment : ), HasLoadingState, SelectRoomsListener, RoomsListener { override val fragment: Fragment = this + private val args: InviteToFollowMeDialogFragmentArgs by navArgs() private val viewModel by viewModels<InviteToFollowMeViewModel>() private val selectRoomsFragment by lazy { SelectRoomsFragment.create(CircleRoomTypeArg.Circle) } @@ -45,8 +50,10 @@ class InviteToFollowMeDialogFragment : private fun setupViews() { with(binding) { + tvTitle.text = + getString(R.string.select_circles_to_which_you_want_to_invite_format, args.userId) btnInvite.setOnClickListener { - viewModel.invite(selectRoomsFragment.getSelectedRooms()) + viewModel.invite(args.userId, selectRoomsFragment.getSelectedRooms()) startLoading(btnInvite) } fbAddRoom.setOnClickListener { navigateToCreateCircle() } @@ -55,7 +62,12 @@ class InviteToFollowMeDialogFragment : } private fun setupObservers() { - + viewModel.inviteResultLiveData.observeResponse(this, + success = { + showSuccess(getString(R.string.invitation_sent)) + onBackPressed() + } + ) } private fun navigateToCreateCircle() { diff --git a/core/src/main/java/org/futo/circles/core/feature/invite_to_follow/InviteToFollowMeViewModel.kt b/core/src/main/java/org/futo/circles/core/feature/invite_to_follow/InviteToFollowMeViewModel.kt index 6daeedfb1f5291cf01ad8a3355d3baedb56afb20..068076b6c17101a7f110ae91eace3e98f50b3755 100644 --- a/core/src/main/java/org/futo/circles/core/feature/invite_to_follow/InviteToFollowMeViewModel.kt +++ b/core/src/main/java/org/futo/circles/core/feature/invite_to_follow/InviteToFollowMeViewModel.kt @@ -2,15 +2,37 @@ package org.futo.circles.core.feature.invite_to_follow import androidx.lifecycle.ViewModel import dagger.hilt.android.lifecycle.HiltViewModel +import org.futo.circles.core.base.SingleEventLiveData +import org.futo.circles.core.extensions.Response +import org.futo.circles.core.extensions.launchBg +import org.futo.circles.core.feature.room.invite.ManageInviteRequestsDataSource import org.futo.circles.core.model.SelectableRoomListItem +import org.futo.circles.core.utils.getTimelineRoomFor import javax.inject.Inject @HiltViewModel class InviteToFollowMeViewModel @Inject constructor( - + private val manageInviteRequestsDataSource: ManageInviteRequestsDataSource ) : ViewModel() { - fun invite(selectedRooms: List<SelectableRoomListItem>) { - } + val inviteResultLiveData = SingleEventLiveData<Response<Any>>() + fun invite(userId: String, selectedRooms: List<SelectableRoomListItem>) { + val timelinesIds = selectedRooms.mapNotNull { getTimelineRoomFor(it.id)?.roomId } + launchBg { + timelinesIds.forEach { timelineId -> + try { + manageInviteRequestsDataSource.inviteUser(timelineId, userId) + } catch (t: Throwable) { + inviteResultLiveData.postValue( + Response.Error( + t.message ?: "Failed to invite $userId to $timelineId" + ) + ) + return@launchBg + } + inviteResultLiveData.postValue(Response.Success(Unit)) + } + } + } } \ No newline at end of file