Skip to content
Merged
Original file line number Diff line number Diff line change
Expand Up @@ -155,8 +155,7 @@ enum class MenuItemTypeOption(
*/
data class LinkableItemOption(
val id: Long,
val title: String,
val indentLevel: Int = 0
val title: String
)

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -112,24 +112,24 @@ class NavMenusViewModel @Inject constructor(
val itemCountByMenuId = buildItemCountMap(allItemsResult)

return when (menusResult) {
is NavMenuRestClient.NavMenusResult.Success -> {
is NavMenuRestClient.NavMenuListResult.Success -> {
currentMenus = menusResult.menus
buildSuccessState(menusResult.menus, locationsResult, itemCountByMenuId)
}
is NavMenuRestClient.NavMenusResult.Error -> {
is NavMenuRestClient.NavMenuListResult.Error -> {
val errorMessage = menusResult.message.takeIf { it.isNotBlank() } ?: "Failed to load menus"
MenuListUiState(isLoading = false, error = errorMessage)
}
}
}

private fun buildItemCountMap(
result: NavMenuRestClient.NavMenuItemsResult
result: NavMenuRestClient.NavMenuItemListResult
): Map<Long, Int> = when (result) {
is NavMenuRestClient.NavMenuItemsResult.Success -> {
is NavMenuRestClient.NavMenuItemListResult.Success -> {
result.items.groupingBy { it.menuId }.eachCount()
}
is NavMenuRestClient.NavMenuItemsResult.Error -> emptyMap()
is NavMenuRestClient.NavMenuItemListResult.Error -> emptyMap()
}

private fun buildSuccessState(
Expand Down Expand Up @@ -203,15 +203,15 @@ class NavMenusViewModel @Inject constructor(

withContext(mainDispatcher) {
when (result) {
is NavMenuRestClient.NavMenuItemsResult.Success -> {
is NavMenuRestClient.NavMenuItemListResult.Success -> {
currentMenuItems = result.items
val sortedItems = sortItemsHierarchically(result.items)
_menuItemListState.value = _menuItemListState.value.copy(
isLoading = false,
items = sortedItems
)
}
is NavMenuRestClient.NavMenuItemsResult.Error -> {
is NavMenuRestClient.NavMenuItemListResult.Error -> {
_menuItemListState.value = _menuItemListState.value.copy(
isLoading = false,
error = result.message
Expand Down Expand Up @@ -461,16 +461,62 @@ class NavMenusViewModel @Inject constructor(
url = if (typeOption == MenuItemTypeOption.CUSTOM_LINK) currentState.url else "",
objectId = 0L,
selectedLinkableItem = null,
linkableItemsState = LinkableItemsState()
linkableItemsState = LinkableItemsState(isLoading = typeOption != MenuItemTypeOption.CUSTOM_LINK)
)

// Load linkable items for non-custom types
if (typeOption != MenuItemTypeOption.CUSTOM_LINK) {
loadLinkableItems(typeOption)
}
}

private fun loadLinkableItems(typeOption: MenuItemTypeOption) {
viewModelScope.launch {
val site = selectedSiteRepository.getSelectedSite() ?: return@launch

val result = withContext(ioDispatcher) {
when (typeOption) {
MenuItemTypeOption.POST -> navMenuRestClient.fetchPosts(site)
MenuItemTypeOption.PAGE -> navMenuRestClient.fetchPages(site)
MenuItemTypeOption.CATEGORY -> navMenuRestClient.fetchCategories(site)
MenuItemTypeOption.TAG -> navMenuRestClient.fetchTags(site)
MenuItemTypeOption.CUSTOM_LINK -> {
NavMenuRestClient.LinkableItemsResult.Success(emptyList())
}
}
}

val currentState = _menuItemDetailState.value ?: return@launch
// Only update if the type hasn't changed while loading
if (currentState.selectedTypeOption == typeOption) {
_menuItemDetailState.value = when (result) {
is NavMenuRestClient.LinkableItemsResult.Success -> {
currentState.copy(
linkableItemsState = LinkableItemsState(
isLoading = false,
items = result.items
)
)
}
is NavMenuRestClient.LinkableItemsResult.Error -> {
currentState.copy(
linkableItemsState = LinkableItemsState(
isLoading = false,
error = result.message
)
)
}
}
}
}
}

fun updateSelectedLinkableItem(item: LinkableItemOption) {
val currentState = _menuItemDetailState.value ?: return
_menuItemDetailState.value = currentState.copy(
selectedLinkableItem = item,
objectId = item.id,
title = currentState.title.ifBlank { item.title }
title = item.title
)
}

Expand Down
Loading
Loading