Skip to content
This repository has been archived by the owner on May 6, 2024. It is now read-only.

Commit

Permalink
fixed for details item view (#71)
Browse files Browse the repository at this point in the history
* Fixed for detail item view

* Implement the cocktails by tags screen

* Implement open tags from list

* Fixed detekt issue
  • Loading branch information
VovaStelmashchuk authored Jun 20, 2023
1 parent 78f741c commit 9bb8aa0
Show file tree
Hide file tree
Showing 33 changed files with 633 additions and 263 deletions.
4 changes: 2 additions & 2 deletions iosApp/iosApp.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -353,7 +353,7 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_ENTITLEMENTS = iosApp/iosApp.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 3;
DEVELOPMENT_ASSET_PATHS = "\"iosApp/Preview Content\"";
Expand All @@ -373,7 +373,7 @@
"PRODUCT_BUNDLE_IDENTIFIER[sdk=iphoneos*]" = org.mixdrinks.app9LJW42P73L;
PRODUCT_NAME = "${APP_NAME}";
PROVISIONING_PROFILE_SPECIFIER = "";
"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "After add domains";
"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "After add domains (Development)";
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = NO;
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
Expand Down
1 change: 1 addition & 0 deletions iosApp/iosApp/ContentView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import shared
struct ComposeView: UIViewControllerRepresentable {
func makeUIViewController(context: Context) -> UIViewController {
let controller = Main_iosKt.MainViewController()
controller.navigationController?.interactivePopGestureRecognizer?.isEnabled = false
return controller
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,16 @@ package org.mixdrinks.app
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import com.arkivanov.decompose.DefaultComponentContext
import org.mixdrinks.ui.ComponentsFactory
import org.mixdrinks.ui.Graph
import org.mixdrinks.ui.RootComponent
import org.mixdrinks.ui.RootContent

@Composable
internal fun MixDrinksApp(contextComponent: DefaultComponentContext, deepLink: String?) {
val rootComponent = remember {
RootComponent(contextComponent)
val graph = Graph()
RootComponent(contextComponent, graph, ComponentsFactory(graph))
}

RootContent(rootComponent, deepLink)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,11 @@ import kotlinx.coroutines.flow.map
import org.mixdrinks.domain.CocktailSelector
import org.mixdrinks.domain.ImageUrlCreators
import org.mixdrinks.dto.CocktailId
import org.mixdrinks.dto.SnapshotDto
import org.mixdrinks.dto.TagDto
import org.mixdrinks.ui.list.FilterObserver

internal class CocktailsProvider(
private val snapshot: suspend () -> SnapshotDto,
private val snapshotRepository: SnapshotRepository,
private val filterRepository: FilterObserver,
private val cocktailSelector: suspend () -> CocktailSelector,
private val tagsRepository: TagsRepository,
Expand All @@ -19,21 +19,22 @@ internal class CocktailsProvider(
val id: CocktailId,
val url: String,
val name: String,
val tags: List<String>,
val tags: List<TagDto>,
)

suspend fun getCocktails(): Flow<List<Cocktail>> {
return filterRepository.selected.map {
val notEmptyFilter =
it.filter { filterGroup -> filterGroup.value.isNotEmpty() }
if (notEmptyFilter.isEmpty()) {
snapshot().cocktails
snapshotRepository.get().cocktails
} else {
val notEmptyFilterIds = notEmptyFilter
.mapValues { filterGroupIdListEntry -> filterGroupIdListEntry.value.map { it.filterId } }

val ids = cocktailSelector().getCocktailIds(notEmptyFilterIds)
snapshot().cocktails.filter { cocktailDto -> ids.contains(cocktailDto.id) }
snapshotRepository.get().cocktails
.filter { cocktailDto -> ids.contains(cocktailDto.id) }
}
.map { cocktailDto ->
Cocktail(
Expand All @@ -43,7 +44,7 @@ internal class CocktailsProvider(
ImageUrlCreators.Size.SIZE_400
),
name = cocktailDto.name,
tags = tagsRepository.getTags(cocktailDto.tags).map { it.name }
tags = tagsRepository.getTags(cocktailDto.tags)
)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,6 @@ data class ItemsType(
TOOL -> FilterGroups.TOOLS
}
}

companion object {
fun fromString(value: String) = Type.values().first { it.toString() == value }
}
}
}

Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
package org.mixdrinks.data

import org.mixdrinks.dto.SnapshotDto
import org.mixdrinks.dto.TagDto
import org.mixdrinks.dto.TagId

class TagsRepository(
private val snapshot: suspend () -> SnapshotDto,
internal class TagsRepository(
private val snapshotRepository: SnapshotRepository,
) {

suspend fun getTags(tagId: List<TagId>): List<TagDto> {
return snapshot().tags.filter { tagDto -> tagId.contains(tagDto.id) }
return snapshotRepository.get().tags.filter { tagDto -> tagId.contains(tagDto.id) }
}
}
173 changes: 173 additions & 0 deletions shared/src/commonMain/kotlin/org/mixdrinks/ui/ComponentsFactory.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,173 @@
package org.mixdrinks.ui

import com.arkivanov.decompose.ComponentContext
import org.mixdrinks.data.CocktailsProvider
import org.mixdrinks.data.FutureCocktailSelector
import org.mixdrinks.data.ItemsType
import org.mixdrinks.data.TagsRepository
import org.mixdrinks.domain.CocktailSelector
import org.mixdrinks.dto.CocktailId
import org.mixdrinks.dto.FilterId
import org.mixdrinks.ui.details.DetailsComponent
import org.mixdrinks.ui.details.FullCocktailRepository
import org.mixdrinks.ui.details.goods.GoodsRepository
import org.mixdrinks.ui.filters.main.FilterComponent
import org.mixdrinks.ui.filters.search.ItemRepository
import org.mixdrinks.ui.filters.search.SearchItemComponent
import org.mixdrinks.ui.items.ItemDetailComponent
import org.mixdrinks.ui.items.ItemGoodsRepository
import org.mixdrinks.ui.list.CocktailListMapper
import org.mixdrinks.ui.list.SelectedFilterProvider
import org.mixdrinks.ui.list.main.ListComponent
import org.mixdrinks.ui.list.predefine.PreDefineCocktailsComponent
import org.mixdrinks.ui.list.predefine.PreDefineFilterStorage
import org.mixdrinks.ui.navigation.Navigator
import org.mixdrinks.ui.tag.CommonTag
import org.mixdrinks.ui.tag.CommonTagCocktailsComponent
import org.mixdrinks.ui.tag.CommonTagNameProvider

internal class ComponentsFactory(
private val graph: Graph
) {

fun cocktailListComponent(
componentContext: ComponentContext,
navigator: Navigator
): ListComponent =
ListComponent(
componentContext = componentContext,
cocktailsProvider = CocktailsProvider(
graph.snapshotRepository,
graph.mutableFilterStorage,
suspend {
CocktailSelector(graph.mutableFilterStorage.getFilterGroups()
.map { it.toFilterGroup() })
},
TagsRepository(graph.snapshotRepository),
),
selectedFilterProvider = SelectedFilterProvider(suspend { graph.snapshotRepository.get() },
suspend { graph.mutableFilterStorage }),
navigator = navigator,
mutableFilterStorage = graph.mutableFilterStorage,
cocktailListMapper = CocktailListMapper(),
)

fun cocktailDetailsComponent(
componentContext: ComponentContext,
cocktailId: CocktailId,
navigator: Navigator,
): DetailsComponent {
return DetailsComponent(componentContext,
FullCocktailRepository(graph.snapshotRepository),
cocktailId,
navigator,
GoodsRepository { graph.snapshotRepository.get() })
}

fun filterScreenComponent(
componentContext: ComponentContext,
navigator: Navigator
): FilterComponent {
return FilterComponent(
componentContext,
graph.mutableFilterStorage,
createFutureCocktailSelector(),
navigator,
)
}

fun searchItemScreen(
component: ComponentContext,
searchItemType: SearchItemComponent.SearchItemType,
navigator: Navigator,
): SearchItemComponent {
val itemRepository =
ItemRepository(graph.snapshotRepository, createFutureCocktailSelector())
return SearchItemComponent(
component,
searchItemType,
graph.mutableFilterStorage,
itemRepository,
navigator,
)
}

suspend fun commonTagCocktailsScreen(
component: ComponentContext,
commonTag: CommonTag,
navigator: Navigator,
): CommonTagCocktailsComponent {
return CommonTagCocktailsComponent(
componentContext = component,
commonTagNameProvider = CommonTagNameProvider(
snapshotRepository = graph.snapshotRepository,
),
cocktailsProvider = CocktailsProvider(
snapshotRepository = graph.snapshotRepository,
filterRepository = PreDefineFilterStorage(
commonTag.type.filterGroups.id,
FilterId(commonTag.id)
),
cocktailSelector = {
CocktailSelector(graph.mutableFilterStorage.getFilterGroups()
.map { it.toFilterGroup() })
},
tagsRepository = TagsRepository(graph.snapshotRepository),
),
commonTag = commonTag,
navigator = navigator,
commonCocktailListMapper = CocktailListMapper(),
)
}

fun detailGoodsScreen(
componentContext: ComponentContext, navigator: Navigator, id: Int, type: String,
): ItemDetailComponent {
return ItemDetailComponent(
componentContext,
ItemGoodsRepository(graph.snapshotRepository),
navigator,
ItemsType(id, ItemsType.Type.valueOf(type)),
createPredefinedCocktailsComponent(
componentContext,
ItemsType(id, ItemsType.Type.valueOf(type)),
navigator,
),
)
}

fun createPredefinedCocktailsComponent(
componentContext: ComponentContext,
itemsType: ItemsType,
navigator: Navigator,
): PreDefineCocktailsComponent {
return PreDefineCocktailsComponent(
componentContext = componentContext,
cocktailsProvider = CocktailsProvider(
snapshotRepository = graph.snapshotRepository,
filterRepository = PreDefineFilterStorage(
itemsType.type.getFilterGroup().id,
FilterId(itemsType.id)
),
cocktailSelector = suspend {
CocktailSelector(graph.mutableFilterStorage.getFilterGroups()
.map { it.toFilterGroup() })
},
tagsRepository = TagsRepository(graph.snapshotRepository)
),
navigator = navigator,
cocktailsMapper = CocktailListMapper(),
)
}

private fun createFutureCocktailSelector(): FutureCocktailSelector {
return FutureCocktailSelector(
snapshot = { graph.snapshotRepository.get() },
cocktailSelector = {
CocktailSelector(graph.mutableFilterStorage.getFilterGroups()
.map { it.toFilterGroup() })
},
mutableFilterStorage = { graph.mutableFilterStorage },
)
}
}
Loading

0 comments on commit 9bb8aa0

Please sign in to comment.