Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions app/feature/feature-help-center/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,16 @@ hedvig {

dependencies {
api(libs.androidx.navigation.common)
api(libs.coil.coil)

implementation(libs.androidx.activity.compose)
implementation(libs.androidx.compose.foundation)
implementation(libs.androidx.navigation.compose)
implementation(libs.apollo.runtime)
implementation(libs.apollo.normalizedCache)
implementation(libs.arrow.core)
implementation(libs.arrow.fx)
implementation(libs.coil.compose)
implementation(libs.compose.richtext)
implementation(libs.compose.richtextCommonmark)
implementation(libs.coroutines.core)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
mutation PuppyGuideEngagement($name: String!, $rating: Int, $read: Boolean) {
puppyGuideEngagement(engagement: {name: $name, rating: $rating, read: $read}) {
success
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
query PuppyGuide {
currentMember {
puppyGuideStories {
categories
content
image
name
rating
read
subtitle
title
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,10 @@ import com.hedvig.android.feature.help.center.home.HelpCenterHomeDestination
import com.hedvig.android.feature.help.center.navigation.HelpCenterDestination
import com.hedvig.android.feature.help.center.navigation.HelpCenterDestinations
import com.hedvig.android.feature.help.center.navigation.HelpCenterDestinations.Emergency
import com.hedvig.android.feature.help.center.puppyguide.PuppyArticleDestination
import com.hedvig.android.feature.help.center.puppyguide.PuppyArticleViewModel
import com.hedvig.android.feature.help.center.puppyguide.PuppyGuideDestination
import com.hedvig.android.feature.help.center.puppyguide.PuppyGuideViewModel
import com.hedvig.android.feature.help.center.question.HelpCenterQuestionDestination
import com.hedvig.android.feature.help.center.question.HelpCenterQuestionViewModel
import com.hedvig.android.feature.help.center.topic.HelpCenterTopicDestination
Expand Down Expand Up @@ -81,6 +85,13 @@ fun NavGraphBuilder.helpCenterGraph(
onNavigateToNewConversation()
},
onNavigateUp = navController::navigateUp,
onNavigateToPuppyGuide = {
with(navigator) {
backStackEntry.navigate(
HelpCenterDestinations.PuppyGuide,
)
}
},
)
}

Expand Down Expand Up @@ -138,6 +149,35 @@ fun NavGraphBuilder.helpCenterGraph(
imageLoader = imageLoader
)
}

navdestination<HelpCenterDestinations.PuppyGuide> { backStackEntry ->
val viewModel = koinViewModel<PuppyGuideViewModel>()
PuppyGuideDestination(
viewModel,
onNavigateUp = navigator::navigateUp,
onNavigateToArticle = { story ->
with(navigator) {
backStackEntry.navigate(
HelpCenterDestinations.PuppyGuideArticle(
story.name,
),
)
}
},
imageLoader = imageLoader,
)
}

navdestination<HelpCenterDestinations.PuppyGuideArticle> {
val viewModel = koinViewModel<PuppyArticleViewModel> {
parametersOf(storyName)
}
PuppyArticleDestination(
viewModel = viewModel,
navigateUp = navigator::navigateUp,
imageLoader = imageLoader,
)
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,9 @@ import com.hedvig.android.feature.help.center.HelpCenterUiState.Search
import com.hedvig.android.feature.help.center.data.FAQItem
import com.hedvig.android.feature.help.center.data.FAQTopic
import com.hedvig.android.feature.help.center.data.GetHelpCenterFAQUseCase
import com.hedvig.android.feature.help.center.data.GetPuppyGuideUseCase
import com.hedvig.android.feature.help.center.data.GetQuickLinksUseCase
import com.hedvig.android.feature.help.center.data.PuppyGuideStory
import com.hedvig.android.feature.help.center.data.QuickLinkDestination
import com.hedvig.android.feature.help.center.model.QuickAction
import com.hedvig.android.molecule.public.MoleculePresenter
Expand Down Expand Up @@ -61,6 +63,7 @@ internal data class HelpCenterUiState(
val search: Search?,
val showNavigateToInboxButton: Boolean,
val destinationToNavigate: QuickLinkDestination? = null,
val puppyGuide: List<PuppyGuideStory>?,
) {
data class QuickLink(val quickAction: QuickAction)

Expand Down Expand Up @@ -93,6 +96,7 @@ internal class HelpCenterPresenter(
private val getQuickLinksUseCase: GetQuickLinksUseCase,
private val hasAnyActiveConversationUseCase: HasAnyActiveConversationUseCase,
private val getHelpCenterFAQUseCase: GetHelpCenterFAQUseCase,
private val getPuppyGuideUseCase: GetPuppyGuideUseCase,
) : MoleculePresenter<HelpCenterEvent, HelpCenterUiState> {
@Composable
override fun MoleculePresenterScope<HelpCenterEvent>.present(lastState: HelpCenterUiState): HelpCenterUiState {
Expand Down Expand Up @@ -161,7 +165,8 @@ internal class HelpCenterPresenter(
combine(
flow = flow { emit(getQuickLinksUseCase.invoke()) },
flow2 = flow { emit(getHelpCenterFAQUseCase.invoke()) },
) { quickLinks, faq ->
flow3 = flow { emit(getPuppyGuideUseCase.invoke()) },
) { quickLinks, faq, puppyGuideResult ->
quickLinksUiState = quickLinks.fold(
ifLeft = {
HelpCenterUiState.QuickLinkUiState.NoQuickLinks
Expand All @@ -179,12 +184,14 @@ internal class HelpCenterPresenter(
)
val topics = faq.getOrNull()?.topics ?: listOf()
val questions = faq.getOrNull()?.commonFAQ ?: listOf()
val puppyGuide = puppyGuideResult.getOrNull()
currentState = currentState.copy(
topics = topics,
questions = questions,
quickLinksUiState = quickLinksUiState,
selectedQuickAction = selectedQuickAction,
showNavigateToInboxButton = hasAnyActiveConversation,
puppyGuide = puppyGuide,
)
}.collect()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,15 @@ package com.hedvig.android.feature.help.center

import com.hedvig.android.data.conversations.HasAnyActiveConversationUseCase
import com.hedvig.android.feature.help.center.data.GetHelpCenterFAQUseCase
import com.hedvig.android.feature.help.center.data.GetPuppyGuideUseCase
import com.hedvig.android.feature.help.center.data.GetQuickLinksUseCase
import com.hedvig.android.molecule.public.MoleculeViewModel

internal class HelpCenterViewModel(
getQuickLinksUseCase: GetQuickLinksUseCase,
hasAnyActiveConversationUseCase: HasAnyActiveConversationUseCase,
getHelpCenterFAQUseCase: GetHelpCenterFAQUseCase,
getPuppyGuideUseCase: GetPuppyGuideUseCase,
) : MoleculeViewModel<HelpCenterEvent, HelpCenterUiState>(
initialState = HelpCenterUiState(
topics = listOf(),
Expand All @@ -17,10 +19,12 @@ internal class HelpCenterViewModel(
quickLinksUiState = HelpCenterUiState.QuickLinkUiState.Loading,
search = null,
showNavigateToInboxButton = false,
puppyGuide = null,
),
presenter = HelpCenterPresenter(
getQuickLinksUseCase = getQuickLinksUseCase,
hasAnyActiveConversationUseCase = hasAnyActiveConversationUseCase,
getHelpCenterFAQUseCase = getHelpCenterFAQUseCase,
getPuppyGuideUseCase = getPuppyGuideUseCase,
),
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
package com.hedvig.android.feature.help.center.data

import arrow.core.Either
import arrow.core.raise.either
import com.apollographql.apollo.ApolloClient
import com.apollographql.apollo.cache.normalized.FetchPolicy
import com.apollographql.apollo.cache.normalized.fetchPolicy
import com.hedvig.android.apollo.safeExecute
import com.hedvig.android.core.common.ErrorMessage
import com.hedvig.android.logger.logcat
import kotlinx.serialization.Serializable
import octopus.PuppyGuideQuery

internal interface GetPuppyGuideUseCase {
suspend fun invoke(): Either<ErrorMessage, List<PuppyGuideStory>?>
}

internal class GetPuppyGuideUseCaseImpl(
private val apolloClient: ApolloClient,
) : GetPuppyGuideUseCase {
override suspend fun invoke(): Either<ErrorMessage, List<PuppyGuideStory>?> {
return either {
apolloClient
.query(PuppyGuideQuery())
.fetchPolicy(FetchPolicy.NetworkOnly)
.safeExecute()
.onLeft { logcat { "Cannot load PuppyGuideStory: $it" } }
.getOrNull()
?.currentMember
?.puppyGuideStories
?.map { story ->
// todo: remove log
if (story.name == "Ögonvård") {
logcat { "Mariia: story Ögonvård read or not: ${story.read} rating: ${story.rating} " }
}
PuppyGuideStory(
categories = story.categories,
content = story.content,
image = story.image,
name = story.name,
rating = story.rating,
isRead = story.read,
subtitle = story.subtitle,
title = story.title,
)
}
}
}
}

@Serializable
internal data class PuppyGuideStory(
val categories: List<String>,
val content: String,
val image: String,
val name: String,
val rating: Int?,
val isRead: Boolean,
val subtitle: String,
val title: String,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package com.hedvig.android.feature.help.center.data

import arrow.core.Either
import com.apollographql.apollo.ApolloClient
import com.apollographql.apollo.api.Optional
import com.hedvig.android.apollo.safeExecute
import com.hedvig.android.core.common.ErrorMessage
import com.hedvig.android.logger.logcat
import octopus.PuppyGuideEngagementMutation

interface SetArticleRatingUseCase {
suspend fun invoke(articleName: String, rating: Int): Either<ErrorMessage, PuppyGuideEngagementMutation.Data>
}

internal class SetArticleRatingUseCaseImpl(
private val apolloClient: ApolloClient,
) : SetArticleRatingUseCase {
override suspend fun invoke(
articleName: String,
rating: Int,
): Either<ErrorMessage, PuppyGuideEngagementMutation.Data> {
return apolloClient
.mutation(
PuppyGuideEngagementMutation(
name = articleName,
rating = Optional.present(rating),
),
)
.safeExecute()
.mapLeft { _ -> ErrorMessage() }
.onRight { data ->
logcat { "Mariia. Rating $rating for story $articleName set successfully" }
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,13 @@ import com.hedvig.android.feature.help.center.data.GetInsuranceForEditCoInsuredU
import com.hedvig.android.feature.help.center.data.GetInsuranceForEditCoInsuredUseCaseImpl
import com.hedvig.android.feature.help.center.data.GetMemberActionsUseCase
import com.hedvig.android.feature.help.center.data.GetMemberActionsUseCaseImpl
import com.hedvig.android.feature.help.center.data.GetPuppyGuideUseCase
import com.hedvig.android.feature.help.center.data.GetPuppyGuideUseCaseImpl
import com.hedvig.android.feature.help.center.data.GetQuickLinksUseCase
import com.hedvig.android.feature.help.center.data.SetArticleRatingUseCase
import com.hedvig.android.feature.help.center.data.SetArticleRatingUseCaseImpl
import com.hedvig.android.feature.help.center.puppyguide.PuppyArticleViewModel
import com.hedvig.android.feature.help.center.puppyguide.PuppyGuideViewModel
import com.hedvig.android.feature.help.center.question.HelpCenterQuestionViewModel
import com.hedvig.android.feature.help.center.topic.HelpCenterTopicViewModel
import com.hedvig.android.featureflags.FeatureManager
Expand All @@ -31,6 +37,10 @@ val helpCenterModule = module {
GetHelpCenterTopicUseCaseImpl(get<GetHelpCenterFAQUseCase>())
}

single<GetPuppyGuideUseCase> {
GetPuppyGuideUseCaseImpl(get<ApolloClient>())
}

single<GetQuickLinksUseCase> {
GetQuickLinksUseCase(
apolloClient = get(),
Expand All @@ -54,6 +64,7 @@ val helpCenterModule = module {
getQuickLinksUseCase = get<GetQuickLinksUseCase>(),
hasAnyActiveConversationUseCase = get<HasAnyActiveConversationUseCase>(),
getHelpCenterFAQUseCase = get<GetHelpCenterFAQUseCase>(),
getPuppyGuideUseCase = get<GetPuppyGuideUseCase>(),
)
}

Expand Down Expand Up @@ -83,4 +94,20 @@ val helpCenterModule = module {
hasAnyActiveConversationUseCase = get<HasAnyActiveConversationUseCase>(),
)
}

viewModel<PuppyGuideViewModel> {
PuppyGuideViewModel(getPuppyGuideUseCase = get<GetPuppyGuideUseCase>())
}

viewModel<PuppyArticleViewModel> { params ->
PuppyArticleViewModel(
getPuppyGuideUseCase = get<GetPuppyGuideUseCase>(),
setArticleRatingUseCase = get<SetArticleRatingUseCase>(),
storyName = params.get(),
)
}

single<SetArticleRatingUseCase> {
SetArticleRatingUseCaseImpl(apolloClient = get())
}
}
Loading
Loading