1
0
Fork 0
mirror of https://github.com/anyproto/anytype-kotlin.git synced 2025-06-08 05:47:05 +09:00

DROID-1620 Collection | Fix | Design + templates (#348)

This commit is contained in:
Konstantin Ivanov 2023-09-06 14:58:31 +02:00 committed by GitHub
parent 65ce905cfd
commit f1c9a681ea
Signed by: github
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 79 additions and 48 deletions

View file

@ -295,13 +295,11 @@ private fun MoreMenu(
shape = RoundedCornerShape(size = 10.dp)
)
) {
if(currentState.isDefaultStateEnabled) {
MenuItem(
click = { menuClick(TemplateMenuClick.Default(templateView)) },
text = stringResource(id = R.string.templates_menu_default_for_view)
)
Divider()
}
MenuItem(
click = { menuClick(TemplateMenuClick.Default(templateView)) },
text = stringResource(id = R.string.templates_menu_default_for_view)
)
Divider()
MenuItem(
click = { menuClick(TemplateMenuClick.Edit(templateView)) },
text = stringResource(id = R.string.templates_menu_edit)
@ -373,7 +371,7 @@ private fun TemplatesList(
) {
val borderWidth: Dp
val borderColor: Color
if (state.isDefaultStateEnabled && item.isDefault) {
if (item.isDefault) {
borderWidth = 2.dp
borderColor = colorResource(id = R.color.palette_system_amber_50)
} else {

View file

@ -11,6 +11,7 @@ android {
buildConfigField "boolean", "ENABLE_LINK_APPERANCE_MENU", "true"
buildConfigField "boolean", "USE_SIMPLE_TABLES_IN_EDITOR_EDDITING", "true"
buildConfigField "boolean", "ENABLE_WIDGETS", "false"
buildConfigField "boolean", "ENABLE_VIEWS_MENU", "false"
}
}

View file

@ -47,6 +47,7 @@ import com.anytypeio.anytype.presentation.sets.state.ObjectState.Companion.VIEW_
import com.anytypeio.anytype.presentation.sets.state.ObjectState.Companion.VIEW_TYPE_UNSUPPORTED
import com.anytypeio.anytype.presentation.sets.viewer.ViewerView
import com.anytypeio.anytype.presentation.templates.TemplateView
import com.anytypeio.anytype.presentation.templates.TemplateView.Companion.DEFAULT_TEMPLATE_ID_BLANK
fun ObjectState.DataView.featuredRelations(
ctx: Id,
@ -433,8 +434,14 @@ fun ObjectWrapper.Basic.toTemplateView(
val coverContainer = if (coverType != CoverType.NONE) {
BasicObjectCoverWrapper(this)
.getCover(urlBuilder, coverImageHashProvider)
} else null
val isDefault = viewerDefaultTemplate == id || objectTypeDefaultTemplate == id
} else {
null
}
val isDefault = if (viewerDefaultTemplate != null) {
viewerDefaultTemplate == id
} else {
false
}
return TemplateView.Template(
id = id,
name = name.orEmpty(),
@ -449,10 +456,13 @@ fun ObjectWrapper.Basic.toTemplateView(
)
}
fun ObjectWrapper.Type.toTemplateViewBlank(): TemplateView.Blank {
fun ObjectWrapper.Type.toTemplateViewBlank(
viewerDefaultTemplate: Id? = null
): TemplateView.Blank {
return TemplateView.Blank(
typeId = id,
layout = recommendedLayout?.code ?: ObjectType.Layout.BASIC.code
layout = recommendedLayout?.code ?: ObjectType.Layout.BASIC.code,
isDefault = viewerDefaultTemplate == DEFAULT_TEMPLATE_ID_BLANK
)
}

View file

@ -47,6 +47,7 @@ import com.anytypeio.anytype.domain.status.InterceptThreadStatus
import com.anytypeio.anytype.domain.templates.CreateTemplate
import com.anytypeio.anytype.domain.unsplash.DownloadUnsplashImage
import com.anytypeio.anytype.domain.workspace.WorkspaceManager
import com.anytypeio.anytype.presentation.BuildConfig
import com.anytypeio.anytype.presentation.common.Action
import com.anytypeio.anytype.presentation.common.Delegator
import com.anytypeio.anytype.presentation.editor.cover.CoverImageHashProvider
@ -82,6 +83,7 @@ import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.Job
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.SharedFlow
@ -1044,13 +1046,21 @@ class ObjectSetViewModel(
fun onExpandViewerMenuClicked() {
Timber.d("onExpandViewerMenuClicked, ")
val state = stateReducer.state.value.dataViewState() ?: return
if (isRestrictionPresent(DataViewRestriction.VIEWS)
) {
toast(NOT_ALLOWED)
} else {
viewersWidgetState.value = viewersWidgetState.value.copy(
showWidget = true
)
if (BuildConfig.ENABLE_VIEWS_MENU) {
viewersWidgetState.value = viewersWidgetState.value.copy(showWidget = true)
} else {
dispatch(
ObjectSetCommand.Modal.ManageViewer(
ctx = context,
dataview = state.dataViewBlock.id
)
)
}
}
}
@ -1058,6 +1068,14 @@ class ObjectSetViewModel(
Timber.d("onViewerEditClicked, ")
val state = stateReducer.state.value.dataViewState() ?: return
val viewer = state.viewerById(session.currentViewerId.value) ?: return
if (!BuildConfig.ENABLE_VIEWS_MENU) {
dispatch(
ObjectSetCommand.Modal.EditDataViewViewer(
ctx = context,
viewer = viewer.id
)
)
}
}
fun onMenuClicked() {
@ -1473,23 +1491,26 @@ class ObjectSetViewModel(
}
// region TEMPLATES
@OptIn(ExperimentalCoroutinesApi::class)
private fun subscribeToViewerTypeTemplates() {
viewModelScope.launch {
combine(
stateReducer.state.filterIsInstance<ObjectState.DataView>(),
session.currentViewerId
stateReducer.state.filterIsInstance<ObjectState.DataView>(), session.currentViewerId
) { state, currentViewId ->
val viewer = state.dataViewState()?.viewerById(currentViewId)
val viewerDefObjType = fetchViewerDefaultObjectType(viewer)
if (viewer != null && viewerDefObjType?.isTemplatesAllowed() == true) {
fetchAndProcessTemplates(viewerDefObjType, viewer)
} else {
Timber.d("Templates are not allowed for type:[${viewerDefObjType?.id}]")
_dvViews.value = emptyList()
}
}.collect()
Pair(
state,
currentViewId
)
}.flatMapLatest { (state, currentViewId) ->
val viewer = state.dataViewState()?.viewerById(currentViewId)
val viewerDefObjType = fetchViewerDefaultObjectType(viewer)
if (viewer != null && viewerDefObjType?.isTemplatesAllowed() == true) {
fetchAndProcessTemplates(viewerDefObjType, viewer)
} else {
Timber.d("Templates are not allowed for type:[${viewerDefObjType?.id}]")
emptyFlow()
}
}.onEach { _templateViews.value = it }.collect()
}
}
@ -1498,25 +1519,21 @@ class ObjectSetViewModel(
return storeOfObjectTypes.get(viewerDefaultObjectTypeId)
}
private suspend fun fetchAndProcessTemplates(viewerDefObjType: ObjectWrapper.Type, viewer: DVViewer) {
private suspend fun fetchAndProcessTemplates(
viewerDefObjType: ObjectWrapper.Type,
viewer: DVViewer
): Flow<List<TemplateView>> {
Timber.d("Fetching templates for type ${viewerDefObjType.id}")
templatesContainer.subscribe(viewerDefObjType.id)
return templatesContainer.subscribe(viewerDefObjType.id)
.catch {
handleTemplateFetchingError(it, viewerDefObjType.id)
Timber.e(it, "Error while getting templates for type ${viewerDefObjType.id}")
toast("Error while getting templates for type ${viewerDefObjType.name}")
emptyFlow<List<TemplateView>>()
}
.map { results ->
processTemplates(results, viewerDefObjType, viewer)
}
.collectLatest { templates ->
_templateViews.value = templates
}
}
private fun handleTemplateFetchingError(exception: Throwable, typeId: String) {
Timber.e(exception, "Error while getting templates for type $typeId")
toast("Error while getting templates for type $typeId")
_dvViews.value = emptyList()
}
private fun processTemplates(
@ -1524,7 +1541,11 @@ class ObjectSetViewModel(
viewerDefObjType: ObjectWrapper.Type,
viewer: DVViewer
): List<TemplateView> {
val blankTemplate = listOf(viewerDefObjType.toTemplateViewBlank())
val blankTemplate = listOf(
viewerDefObjType.toTemplateViewBlank(
viewerDefaultTemplate = viewer.defaultTemplate
)
)
return blankTemplate + results.map { objTemplate ->
objTemplate.toTemplateView(
typeId = viewerDefObjType.id,
@ -1533,7 +1554,7 @@ class ObjectSetViewModel(
objectTypeDefaultTemplate = viewerDefObjType.defaultTemplateId,
viewerDefaultTemplate = viewer.defaultTemplate
)
} + listOf(TemplateView.New(viewerDefObjType.id))
}.sortedByDescending { it.isDefault } + listOf(TemplateView.New(viewerDefObjType.id))
}
fun onTemplateItemClicked(item: TemplateView) {

View file

@ -41,6 +41,10 @@ sealed class TemplateView {
return image != null || emoji != null
}
}
companion object {
const val DEFAULT_TEMPLATE_ID_BLANK = "blank"
}
}
sealed class TemplateMenuClick {

View file

@ -7,15 +7,13 @@ data class TemplatesWidgetUiState(
val showWidget: Boolean,
val isEditing: Boolean,
val isMoreMenuVisible: Boolean,
val moreMenuTemplate: TemplateView.Template?,
val isDefaultStateEnabled: Boolean = false
val moreMenuTemplate: TemplateView.Template?
) {
fun dismiss() = copy(
showWidget = false,
isEditing = false,
isMoreMenuVisible = false,
moreMenuTemplate = null,
isDefaultStateEnabled = false
moreMenuTemplate = null
)
companion object {
@ -24,8 +22,7 @@ data class TemplatesWidgetUiState(
showWidget = false,
isEditing = false,
isMoreMenuVisible = false,
moreMenuTemplate = null,
isDefaultStateEnabled = false
moreMenuTemplate = null
)
}
}