diff --git a/app/src/main/java/com/anytypeio/anytype/ui/multiplayer/RequestJoinSpaceFragment.kt b/app/src/main/java/com/anytypeio/anytype/ui/multiplayer/RequestJoinSpaceFragment.kt index 74c49b3e1e..e57bb41181 100644 --- a/app/src/main/java/com/anytypeio/anytype/ui/multiplayer/RequestJoinSpaceFragment.kt +++ b/app/src/main/java/com/anytypeio/anytype/ui/multiplayer/RequestJoinSpaceFragment.kt @@ -146,6 +146,10 @@ class RequestJoinSpaceFragment : BaseBottomSheetComposeFragment() { JoinSpaceWithoutApproveScreen( isLoading = isLoading, onRequestJoinSpaceClicked = vm::onRequestToJoinClicked, + onCancelClicked = { + vm.onCancelJoinSpaceRequestClicked() + dismiss() + }, spaceName = spaceName, createdByName = createdByName ) @@ -155,6 +159,10 @@ class RequestJoinSpaceFragment : BaseBottomSheetComposeFragment() { onRequestJoinSpaceClicked = vm::onRequestToJoinClicked, spaceName = spaceName, createdByName = createdByName, + onCancelClicked = { + vm.onCancelJoinSpaceRequestClicked() + dismiss() + } ) } } else { diff --git a/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/multiplayer/Joining.kt b/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/multiplayer/Joining.kt index 637265eeff..c143ccbaed 100644 --- a/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/multiplayer/Joining.kt +++ b/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/multiplayer/Joining.kt @@ -34,6 +34,7 @@ import com.anytypeio.anytype.core_ui.views.Title2 @Composable fun JoinSpaceScreen( onRequestJoinSpaceClicked: () -> Unit, + onCancelClicked: () -> Unit, spaceName: String, createdByName: String, isLoading: Boolean = false @@ -87,7 +88,16 @@ fun JoinSpaceScreen( loading = isLoading ) } - Spacer(modifier = Modifier.height(20.dp)) + Spacer(modifier = Modifier.height(8.dp)) + ButtonSecondary( + onClick = throttledClick( + onClick = { onCancelClicked() } + ), + text = stringResource(R.string.cancel), + modifier = Modifier.fillMaxWidth(), + size = ButtonSize.Large, + ) + Spacer(modifier = Modifier.height(10.dp)) Text( text = stringResource(R.string.multiplayer_request_to_join_explanation), style = Caption1Regular, @@ -102,6 +112,7 @@ fun JoinSpaceScreen( @Composable fun JoinSpaceWithoutApproveScreen( onRequestJoinSpaceClicked: () -> Unit, + onCancelClicked: () -> Unit, spaceName: String, createdByName: String, isLoading: Boolean = false @@ -162,7 +173,7 @@ fun JoinSpaceWithoutApproveScreen( Spacer(modifier = Modifier.height(8.dp)) ButtonSecondary( onClick = throttledClick( - onClick = { onRequestJoinSpaceClicked() } + onClick = { onCancelClicked() } ), text = stringResource(R.string.cancel), modifier = Modifier.fillMaxWidth(), @@ -172,6 +183,63 @@ fun JoinSpaceWithoutApproveScreen( } } +@Composable +fun JoinSpaceRequestSentScreen( + onDoneClicked: () -> Unit, + onManageSpaces: () -> Unit +) { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp) + ) { + Dragger( + modifier = Modifier + .align(Alignment.CenterHorizontally) + .padding(vertical = 6.dp) + ) + Spacer(modifier = Modifier.height(16.dp)) + Text( + text = stringResource(R.string.multiplayer_request_to_join_sent_title,), + style = HeadlineHeading, + color = colorResource(id = R.color.text_primary), + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp), + textAlign = TextAlign.Center + ) + Spacer(modifier = Modifier.height(8.dp)) + Text( + text = stringResource(R.string.multiplayer_request_to_join_sent_description,), + style = Title2, + color = colorResource(id = R.color.text_primary), + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp), + textAlign = TextAlign.Center + ) + Spacer(modifier = Modifier.height(19.dp)) + ButtonPrimaryLoading( + onClick = throttledClick( + onClick = { } + ), + size = ButtonSize.Large, + text = stringResource(R.string.done), + modifierButton = Modifier.fillMaxWidth(), + ) + Spacer(modifier = Modifier.height(8.dp)) + ButtonSecondary( + onClick = throttledClick( + onClick = { } + ), + text = stringResource(R.string.multiplayer_request_to_join_btn_manage_spaces), + modifier = Modifier.fillMaxWidth(), + size = ButtonSize.Large, + ) + Spacer(modifier = Modifier.height(16.dp)) + } +} + @Composable fun JoiningLoadingState( onCancelLoadingInviteClicked: () -> Unit @@ -227,7 +295,8 @@ fun JoinSpaceScreenPreview() { JoinSpaceScreen( onRequestJoinSpaceClicked = {}, spaceName = "Anytype Android App", - createdByName = "Konstantin" + createdByName = "Konstantin", + onCancelClicked = {} ) } @@ -237,7 +306,8 @@ fun JoinSpaceScreenPreviewWithEmptyNames() { JoinSpaceScreen( onRequestJoinSpaceClicked = {}, spaceName = "", - createdByName = "" + createdByName = "", + onCancelClicked = {} ) } @@ -247,6 +317,7 @@ fun JoinSpaceScreenPreviewWithoutApprove() { JoinSpaceWithoutApproveScreen( onRequestJoinSpaceClicked = {}, spaceName = "", - createdByName = "" + createdByName = "", + onCancelClicked = {} ) } \ No newline at end of file diff --git a/localization/src/main/res/values/strings.xml b/localization/src/main/res/values/strings.xml index c270628369..76de3f4fab 100644 --- a/localization/src/main/res/values/strings.xml +++ b/localization/src/main/res/values/strings.xml @@ -1361,6 +1361,9 @@ Join %1$s You\'ve been invited to join %1$s, created by %2$s Join Space + Request sent + You will receive a notification when the space owner will approve your request. + Manage spaces Hang tight — we’re setting things up for you. This should only take a moment. diff --git a/presentation/src/main/java/com/anytypeio/anytype/presentation/multiplayer/RequestJoinSpaceViewModel.kt b/presentation/src/main/java/com/anytypeio/anytype/presentation/multiplayer/RequestJoinSpaceViewModel.kt index 4d553bfa74..0d1844ae5b 100644 --- a/presentation/src/main/java/com/anytypeio/anytype/presentation/multiplayer/RequestJoinSpaceViewModel.kt +++ b/presentation/src/main/java/com/anytypeio/anytype/presentation/multiplayer/RequestJoinSpaceViewModel.kt @@ -28,7 +28,6 @@ import com.anytypeio.anytype.presentation.common.BaseViewModel import com.anytypeio.anytype.presentation.common.TypedViewState import javax.inject.Inject import kotlinx.coroutines.Job -import kotlinx.coroutines.cancel import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.launch @@ -54,6 +53,7 @@ class RequestJoinSpaceViewModel( val commands = MutableSharedFlow(0) val showLoadingInviteProgress = MutableStateFlow(false) private var getSpaceInviteViewJob: Job? = null + private var joinSpaceRequestJob: Job? = null init { Timber.i("RequestJoinSpaceViewModel, init") @@ -132,7 +132,8 @@ class RequestJoinSpaceViewModel( fun onRequestToJoinClicked() { when(val curr = state.value) { is TypedViewState.Success -> { - viewModelScope.launch { + joinSpaceRequestJob?.cancel() + joinSpaceRequestJob = viewModelScope.launch { val fileKey = spaceInviteResolver.parseFileKey(params.link) val contentId = spaceInviteResolver.parseContentId(params.link) if (contentId != null && fileKey != null) { @@ -156,10 +157,14 @@ class RequestJoinSpaceViewModel( onSuccess = { analytics.sendEvent(eventName = screenRequestSent) if (notificator.areNotificationsEnabled) { - commands.emit(Command.Toast.RequestSent) + if (!curr.data.withoutApprove) { + commands.emit(Command.Toast.RequestSent) + } commands.emit(Command.Dismiss) } else { - commands.emit(Command.Toast.RequestSent) + if (!curr.data.withoutApprove) { + commands.emit(Command.Toast.RequestSent) + } showEnableNotificationDialog.value = true } } @@ -173,6 +178,11 @@ class RequestJoinSpaceViewModel( } } + fun onCancelJoinSpaceRequestClicked() { + joinSpaceRequestJob?.cancel() + isRequestInProgress.value = false + } + fun onOpenSpaceClicked(space: SpaceId) { viewModelScope.launch { val curr = spaceManager.get()