mirror of
https://github.com/anyproto/anytype-kotlin.git
synced 2025-06-08 05:47:05 +09:00
DROID-3589 Type screen | Fix | Back navigation (#2336)
This commit is contained in:
parent
526284ef95
commit
5581e08abf
10 changed files with 68 additions and 45 deletions
|
@ -42,7 +42,6 @@ import com.anytypeio.anytype.ui.templates.EditorTemplateFragment.Companion.TYPE_
|
|||
import com.google.accompanist.navigation.material.ExperimentalMaterialNavigationApi
|
||||
import com.google.accompanist.navigation.material.rememberBottomSheetNavigator
|
||||
import javax.inject.Inject
|
||||
import kotlin.getValue
|
||||
import timber.log.Timber
|
||||
|
||||
class ObjectTypeFragment : BaseComposeFragment() {
|
||||
|
@ -93,10 +92,6 @@ class ObjectTypeFragment : BaseComposeFragment() {
|
|||
)
|
||||
}
|
||||
|
||||
ObjectTypeCommand.OpenTypePropertiesListScreen -> {
|
||||
navComposeController.navigate(OBJ_TYPE_PROPERTIES)
|
||||
}
|
||||
|
||||
is ObjectTypeCommand.OpenAddNewPropertyScreen -> {
|
||||
runCatching {
|
||||
findNavController().navigate(
|
||||
|
@ -110,10 +105,6 @@ class ObjectTypeFragment : BaseComposeFragment() {
|
|||
Timber.e(it, "Error while opening edit object type properties screen")
|
||||
}
|
||||
}
|
||||
|
||||
ObjectTypeCommand.CloseFieldsScreen -> {
|
||||
navComposeController.popBackStack()
|
||||
}
|
||||
}
|
||||
}
|
||||
vm.sendAnalyticsScreenObjectType()
|
||||
|
@ -139,6 +130,7 @@ class ObjectTypeFragment : BaseComposeFragment() {
|
|||
startDestination = OBJ_TYPE_MAIN
|
||||
) {
|
||||
composable(route = OBJ_TYPE_MAIN) {
|
||||
val showPropertiesScreen = vm.showPropertiesScreen.collectAsStateWithLifecycle().value
|
||||
WithSetScreen(
|
||||
uiEditButtonState = vm.uiEditButtonState.collectAsStateWithLifecycle().value,
|
||||
uiSyncStatusBadgeState = vm.uiSyncStatusBadgeState.collectAsStateWithLifecycle().value,
|
||||
|
@ -153,16 +145,16 @@ class ObjectTypeFragment : BaseComposeFragment() {
|
|||
space = space,
|
||||
onTypeEvent = vm::onTypeEvent
|
||||
)
|
||||
}
|
||||
composable(route = OBJ_TYPE_PROPERTIES) {
|
||||
FieldsMainScreen(
|
||||
uiFieldsListState = vm.uiTypePropertiesListState.collectAsStateWithLifecycle().value,
|
||||
uiTitleState = vm.uiTitleState.collectAsStateWithLifecycle().value,
|
||||
uiIconState = vm.uiIconState.collectAsStateWithLifecycle().value,
|
||||
uiEditPropertyState = vm.uiEditPropertyScreen.collectAsStateWithLifecycle().value,
|
||||
uiFieldLocalInfoState = vm.uiFieldLocalInfoState.collectAsStateWithLifecycle().value,
|
||||
fieldEvent = vm::onFieldEvent
|
||||
)
|
||||
if (showPropertiesScreen) {
|
||||
FieldsMainScreen(
|
||||
uiFieldsListState = vm.uiTypePropertiesListState.collectAsStateWithLifecycle().value,
|
||||
uiTitleState = vm.uiTitleState.collectAsStateWithLifecycle().value,
|
||||
uiIconState = vm.uiIconState.collectAsStateWithLifecycle().value,
|
||||
uiEditPropertyState = vm.uiEditPropertyScreen.collectAsStateWithLifecycle().value,
|
||||
uiFieldLocalInfoState = vm.uiFieldLocalInfoState.collectAsStateWithLifecycle().value,
|
||||
fieldEvent = vm::onFieldEvent
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -246,7 +238,6 @@ class ObjectTypeFragment : BaseComposeFragment() {
|
|||
|
||||
companion object {
|
||||
private const val OBJ_TYPE_MAIN = "obj_type_main"
|
||||
private const val OBJ_TYPE_PROPERTIES = "obj_properties"
|
||||
const val ARG_SPACE = "arg.object.type.space"
|
||||
const val ARG_OBJECT_ID = "arg.object.type.object_id"
|
||||
|
||||
|
|
|
@ -18,6 +18,9 @@ import androidx.compose.material3.Scaffold
|
|||
import androidx.compose.material3.TopAppBarDefaults
|
||||
import androidx.compose.material3.rememberTopAppBarState
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.MutableState
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.input.nestedscroll.nestedScroll
|
||||
import androidx.compose.ui.res.colorResource
|
||||
|
@ -32,12 +35,9 @@ import com.anytypeio.anytype.feature_object_type.ui.TypeEvent
|
|||
import com.anytypeio.anytype.feature_object_type.ui.UiDeleteAlertState
|
||||
import com.anytypeio.anytype.feature_object_type.ui.UiEditButton
|
||||
import com.anytypeio.anytype.feature_object_type.ui.UiHorizontalButtonsState
|
||||
import com.anytypeio.anytype.feature_object_type.ui.UiPropertiesButtonState
|
||||
import com.anytypeio.anytype.feature_object_type.ui.UiIconState
|
||||
import com.anytypeio.anytype.feature_object_type.ui.UiLayoutButtonState
|
||||
import com.anytypeio.anytype.feature_object_type.ui.UiLayoutTypeState
|
||||
import com.anytypeio.anytype.feature_object_type.ui.UiSyncStatusBadgeState
|
||||
import com.anytypeio.anytype.feature_object_type.ui.UiTemplatesButtonState
|
||||
import com.anytypeio.anytype.feature_object_type.ui.UiTemplatesModalListState
|
||||
import com.anytypeio.anytype.feature_object_type.ui.UiTitleState
|
||||
import com.anytypeio.anytype.feature_object_type.ui.alerts.DeleteAlertScreen
|
||||
|
@ -73,6 +73,7 @@ fun WithSetScreen(
|
|||
val topAppBarScrollBehavior = TopAppBarDefaults.enterAlwaysScrollBehavior(
|
||||
state = rememberTopAppBarState()
|
||||
)
|
||||
val objectSetFragment: MutableState<ObjectSetFragment?> = remember { mutableStateOf(null) }
|
||||
|
||||
Scaffold(
|
||||
modifier = Modifier
|
||||
|
@ -86,7 +87,12 @@ fun WithSetScreen(
|
|||
uiEditButtonState = uiEditButtonState,
|
||||
uiTitleState = uiTitleState,
|
||||
topBarScrollBehavior = topAppBarScrollBehavior,
|
||||
onTypeEvent = onTypeEvent
|
||||
onTypeEvent = { typeEvent ->
|
||||
if (typeEvent is TypeEvent.OnBackClick) {
|
||||
objectSetFragment.value?.onCloseCurrentObject()
|
||||
}
|
||||
onTypeEvent(typeEvent)
|
||||
}
|
||||
)
|
||||
},
|
||||
content = { paddingValues ->
|
||||
|
@ -97,7 +103,8 @@ fun WithSetScreen(
|
|||
uiHorizontalButtonsState = uiHorizontalButtonsState,
|
||||
objectId = objectId,
|
||||
space = space,
|
||||
onTypeEvent = onTypeEvent
|
||||
onTypeEvent = onTypeEvent,
|
||||
objectSetFragment = objectSetFragment
|
||||
)
|
||||
}
|
||||
)
|
||||
|
@ -139,7 +146,8 @@ private fun MainContentSet(
|
|||
uiHorizontalButtonsState: UiHorizontalButtonsState,
|
||||
objectId: String,
|
||||
space: String,
|
||||
onTypeEvent: (TypeEvent) -> Unit
|
||||
onTypeEvent: (TypeEvent) -> Unit,
|
||||
objectSetFragment: MutableState<ObjectSetFragment?>
|
||||
) {
|
||||
val contentModifier = if (Build.VERSION.SDK_INT >= EDGE_TO_EDGE_MIN_SDK) {
|
||||
Modifier
|
||||
|
@ -185,6 +193,7 @@ private fun MainContentSet(
|
|||
space = space
|
||||
)
|
||||
) { fragment ->
|
||||
objectSetFragment.value = fragment
|
||||
fragment.view?.findViewById<View>(R.id.topToolbar)?.gone()
|
||||
fragment.view?.findViewById<View>(R.id.objectHeader)?.visibility =
|
||||
View.GONE
|
||||
|
|
|
@ -1569,6 +1569,9 @@ open class ObjectSetFragment :
|
|||
componentManager().objectSetComponent.release(ctx)
|
||||
}
|
||||
|
||||
fun onCloseCurrentObject() {
|
||||
vm.onCloseObject()
|
||||
}
|
||||
|
||||
companion object {
|
||||
const val CONTEXT_ID_KEY = "arg.object_set.context"
|
||||
|
|
|
@ -4,9 +4,9 @@ import com.anytypeio.anytype.core_models.Id
|
|||
|
||||
sealed class FieldEvent {
|
||||
|
||||
data object OnEditPropertyScreenDismiss : FieldEvent()
|
||||
data object OnDismissScreen : FieldEvent()
|
||||
|
||||
data object OnBackClick : FieldEvent()
|
||||
data object OnEditPropertyScreenDismiss : FieldEvent()
|
||||
|
||||
data class OnFieldItemClick(val item: UiFieldsListItem) : FieldEvent()
|
||||
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package com.anytypeio.anytype.feature_object_type.fields.ui
|
||||
|
||||
import android.os.Build
|
||||
import androidx.activity.compose.BackHandler
|
||||
import androidx.compose.foundation.ExperimentalFoundationApi
|
||||
import androidx.compose.foundation.Image
|
||||
import androidx.compose.foundation.background
|
||||
|
@ -86,6 +87,7 @@ import kotlinx.coroutines.delay
|
|||
import sh.calvin.reorderable.ReorderableItem
|
||||
import sh.calvin.reorderable.ReorderableLazyListState
|
||||
import sh.calvin.reorderable.rememberReorderableLazyListState
|
||||
import timber.log.Timber
|
||||
|
||||
@OptIn(ExperimentalFoundationApi::class)
|
||||
@Composable
|
||||
|
@ -121,6 +123,11 @@ fun FieldsMainScreen(
|
|||
}
|
||||
}
|
||||
|
||||
BackHandler(enabled = true) {
|
||||
Timber.d("Back pressed on Properties Screen")
|
||||
fieldEvent.invoke(FieldEvent.OnDismissScreen)
|
||||
}
|
||||
|
||||
Scaffold(
|
||||
modifier = Modifier
|
||||
.nestedScroll(rememberNestedScrollInteropConnection())
|
||||
|
@ -136,7 +143,7 @@ fun FieldsMainScreen(
|
|||
uiTitleState = uiTitleState,
|
||||
uiIconState = uiIconState,
|
||||
onBackClick = {
|
||||
fieldEvent(OnBackClick)
|
||||
fieldEvent(FieldEvent.OnDismissScreen)
|
||||
}
|
||||
)
|
||||
},
|
||||
|
|
|
@ -2,7 +2,6 @@ package com.anytypeio.anytype.feature_object_type.ui
|
|||
|
||||
import com.anytypeio.anytype.core_models.ObjectType.Layout
|
||||
import com.anytypeio.anytype.core_models.multiplayer.SpaceSyncAndP2PStatusState
|
||||
import com.anytypeio.anytype.presentation.objects.ObjectIcon
|
||||
import com.anytypeio.anytype.presentation.objects.custom_icon.CustomIconColor
|
||||
import com.anytypeio.anytype.presentation.templates.TemplateView
|
||||
|
||||
|
@ -43,7 +42,7 @@ sealed class TypeEvent {
|
|||
//endregion
|
||||
|
||||
data object OnLayoutButtonClick : TypeEvent()
|
||||
data object OnFieldsButtonClick : TypeEvent()
|
||||
data object OnPropertiesButtonClick : TypeEvent()
|
||||
data object OnTemplatesButtonClick : TypeEvent()
|
||||
|
||||
//region Icon picker
|
||||
|
|
|
@ -29,10 +29,6 @@ sealed class ObjectTypeCommand {
|
|||
val spaceId: Id
|
||||
) : ObjectTypeCommand()
|
||||
|
||||
data object OpenTypePropertiesListScreen : ObjectTypeCommand()
|
||||
|
||||
data object CloseFieldsScreen : ObjectTypeCommand()
|
||||
|
||||
data class OpenAddNewPropertyScreen(val typeId: Id, val space: Id) : ObjectTypeCommand()
|
||||
}
|
||||
|
||||
|
|
|
@ -56,7 +56,7 @@ fun HorizontalButtons(
|
|||
if (uiPropertiesButtonState is UiPropertiesButtonState.Visible) {
|
||||
Row(
|
||||
modifier = modifierButton.noRippleThrottledClickable {
|
||||
onTypeEvent(TypeEvent.OnFieldsButtonClick)
|
||||
onTypeEvent(TypeEvent.OnPropertiesButtonClick)
|
||||
},
|
||||
verticalAlignment = Alignment.CenterVertically
|
||||
) {
|
||||
|
|
|
@ -175,6 +175,8 @@ class ObjectTypeViewModel(
|
|||
private val _objectTypeConflictingFieldIds = MutableStateFlow<List<Id>>(emptyList())
|
||||
//endregion
|
||||
|
||||
val showPropertiesScreen = MutableStateFlow<Boolean>(false)
|
||||
|
||||
val commands = MutableSharedFlow<ObjectTypeCommand>()
|
||||
|
||||
//region INIT AND LIFE CYCLE
|
||||
|
@ -473,10 +475,8 @@ class ObjectTypeViewModel(
|
|||
fun onTypeEvent(event: TypeEvent) {
|
||||
Timber.d("onTypeEvent: $event")
|
||||
when (event) {
|
||||
TypeEvent.OnFieldsButtonClick -> {
|
||||
viewModelScope.launch {
|
||||
commands.emit(ObjectTypeCommand.OpenTypePropertiesListScreen)
|
||||
}
|
||||
TypeEvent.OnPropertiesButtonClick -> {
|
||||
showPropertiesScreen.value = true
|
||||
viewModelScope.launch {
|
||||
sendAnalyticsShowObjectTypeScreen(
|
||||
analytics = analytics,
|
||||
|
@ -551,7 +551,7 @@ class ObjectTypeViewModel(
|
|||
|
||||
TypeEvent.OnBackClick -> {
|
||||
viewModelScope.launch {
|
||||
commands.emit(ObjectTypeCommand.Back)
|
||||
commands.emit(Back)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -817,10 +817,9 @@ class ObjectTypeViewModel(
|
|||
}
|
||||
|
||||
is FieldEvent.EditProperty -> proceedWithEditPropertyEvent(event)
|
||||
FieldEvent.OnBackClick -> {
|
||||
viewModelScope.launch {
|
||||
commands.emit(ObjectTypeCommand.CloseFieldsScreen)
|
||||
}
|
||||
|
||||
FieldEvent.OnDismissScreen -> {
|
||||
showPropertiesScreen.value = false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -886,6 +886,25 @@ class ObjectSetViewModel(
|
|||
jobs.cancel()
|
||||
}
|
||||
|
||||
fun onCloseObject() {
|
||||
Timber.d("onCloseObject, id:[${vmParams.ctx}]")
|
||||
viewModelScope.launch {
|
||||
closeBlock.async(
|
||||
CloseBlock.Params(
|
||||
target = vmParams.ctx,
|
||||
space = vmParams.space
|
||||
)
|
||||
).fold(
|
||||
onSuccess = {
|
||||
Timber.d("Object [${vmParams.ctx}] closed successfully")
|
||||
},
|
||||
onFailure = {
|
||||
Timber.w(it, "Error while closing object set: ${vmParams.ctx}")
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
fun onSystemBackPressed() {
|
||||
Timber.d("onSystemBackPressed, ")
|
||||
proceedWithClosingAndExit()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue