diff --git a/app/src/main/java/com/tangem/tap/TapApplication.kt b/app/src/main/java/com/tangem/tap/TapApplication.kt index 8908d91491..8fa11bf17a 100644 --- a/app/src/main/java/com/tangem/tap/TapApplication.kt +++ b/app/src/main/java/com/tangem/tap/TapApplication.kt @@ -32,8 +32,10 @@ import com.tangem.tap.domain.walletconnect.WalletConnectRepository import com.tangem.tap.network.NetworkConnectivity import com.tangem.tap.persistence.PreferencesStorage import com.tangem.wallet.BuildConfig +import com.zendesk.logger.Logger import org.rekotlin.Store import timber.log.Timber +import zendesk.chat.Chat val store = Store( reducer = ::appReducer, @@ -81,7 +83,7 @@ class TapApplication : Application(), ImageLoaderFactory { override fun newImageLoader(): ImageLoader { return createCoilImageLoader( context = this, - logEnabled = LogConfig.imageLoader + logEnabled = LogConfig.imageLoader, ) } @@ -140,12 +142,11 @@ class TapApplication : Application(), ImageLoaderFactory { infoHolder = additionalFeedbackInfo, logCollector = tangemLogCollector, preferencesStorage = preferencesStorage, - logEnabled = LogConfig.zendesk, - ) - feedbackManager.initChat( - context = context, - zendeskConfig = config.zendesk!!, ) + feedbackManager.chatInitializer = { zendeskConfig -> + Chat.INSTANCE.init(context, zendeskConfig.accountKey, zendeskConfig.appId) + Logger.setLoggable(LogConfig.zendesk) + } store.dispatch(GlobalAction.SetFeedbackManager(feedbackManager)) } diff --git a/app/src/main/java/com/tangem/tap/common/feedback/FeedbackManager.kt b/app/src/main/java/com/tangem/tap/common/feedback/FeedbackManager.kt index 1631952ce6..12fe1e42e9 100644 --- a/app/src/main/java/com/tangem/tap/common/feedback/FeedbackManager.kt +++ b/app/src/main/java/com/tangem/tap/common/feedback/FeedbackManager.kt @@ -10,7 +10,6 @@ import com.tangem.tap.foregroundActivityObserver import com.tangem.tap.persistence.PreferencesStorage import com.tangem.tap.withForegroundActivity import com.tangem.wallet.R -import com.zendesk.logger.Logger import timber.log.Timber import zendesk.chat.Chat import zendesk.chat.ChatConfiguration @@ -30,20 +29,17 @@ class FeedbackManager( val infoHolder: AdditionalFeedbackInfo, private val logCollector: TangemLogCollector, private val preferencesStorage: PreferencesStorage, - private val logEnabled: Boolean = false, ) { - fun initChat( - context: Context, - zendeskConfig: ZendeskConfig, - ) { - Chat.INSTANCE.init( - context, - zendeskConfig.accountKey, - zendeskConfig.appId - ) + private var lastUsedConfigForInitialization: ZendeskConfig? = null - // Zendesk logs - Logger.setLoggable(logEnabled) + var chatInitializer: ((ZendeskConfig) -> Unit)? = null + + fun initChat(zendeskConfig: ZendeskConfig) { + // prevent double initialization with the same config + if (lastUsedConfigForInitialization == zendeskConfig) return + + lastUsedConfigForInitialization = zendeskConfig + chatInitializer?.invoke(zendeskConfig) } fun sendEmail(feedbackData: FeedbackData, onFail: ((Exception) -> Unit)? = null) { @@ -55,7 +51,7 @@ class FeedbackManager( subject = activity.getString(feedbackData.subjectResId), message = feedbackData.joinTogether(activity, infoHolder), file = fileLog, - onFail = onFail + onFail = onFail, ) } } diff --git a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalAction.kt b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalAction.kt index 0b285f8da9..d1ad175404 100644 --- a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalAction.kt +++ b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalAction.kt @@ -14,6 +14,7 @@ import com.tangem.tap.common.redux.ErrorAction import com.tangem.tap.common.redux.NotificationAction import com.tangem.tap.common.redux.StateDialog import com.tangem.tap.common.redux.ToastNotificationAction +import com.tangem.tap.common.zendesk.ZendeskConfig import com.tangem.tap.domain.TapError import com.tangem.tap.domain.configurable.config.ConfigManager import com.tangem.tap.domain.configurable.warningMessage.WarningMessage @@ -79,7 +80,8 @@ sealed class GlobalAction : Action { data class SetAnanlyticHandlers(val analyticsHandlers: GlobalAnalyticsHandler) : GlobalAction() data class SendEmail(val feedbackData: FeedbackData) : GlobalAction() - data class OpenChat(val feedbackData: FeedbackData) : GlobalAction() + data class OpenChat(val feedbackData: FeedbackData, val zendeskConfig: ZendeskConfig? = null) : GlobalAction() + data class OpenSaltPayChat(val feedbackData: FeedbackData) : GlobalAction() data class UpdateFeedbackInfo(val walletManagers: List) : GlobalAction() object ExchangeManager : GlobalAction() { diff --git a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalMidlleware.kt b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalMidlleware.kt index 8173f76aae..88a9c805aa 100644 --- a/app/src/main/java/com/tangem/tap/common/redux/global/GlobalMidlleware.kt +++ b/app/src/main/java/com/tangem/tap/common/redux/global/GlobalMidlleware.kt @@ -87,7 +87,31 @@ private fun handleAction(action: Action, appState: () -> AppState?, dispatch: Di store.state.globalState.feedbackManager?.sendEmail(action.feedbackData) } is GlobalAction.OpenChat -> { - store.state.globalState.feedbackManager?.openChat(action.feedbackData) + val globalState = store.state.globalState + val feedbackManager = globalState.feedbackManager.guard { + store.dispatchDebugErrorNotification("FeedbackManager not initialized") + return + } + val config = globalState.configManager?.config.guard { + store.dispatchDebugErrorNotification("Config not initialized") + return + } + + val scanResponse = globalState.onboardingState.onboardingManager?.scanResponse + ?: globalState.scanResponse + + // if config not set -> try to get it based on a scanResponse.productType + val unsafeZendeskConfig = action.zendeskConfig ?: when { + scanResponse?.isSaltPay() == true -> config.saltPayConfig?.zendesk + else -> config.zendesk + } + + val zendeskConfig = unsafeZendeskConfig.guard { + store.dispatchDebugErrorNotification("ZendeskConfig not initialized") + return + } + feedbackManager.initChat(zendeskConfig) + feedbackManager.openChat(action.feedbackData) } is GlobalAction.UpdateWalletSignedHashes -> { store.dispatch(WalletAction.Warnings.CheckRemainingSignatures(action.remainingSignatures)) diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/dialog/NoFundsForActivationDialog.kt b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/dialog/NoFundsForActivationDialog.kt index fde8f9637d..579f34d614 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/dialog/NoFundsForActivationDialog.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/products/wallet/saltPay/dialog/NoFundsForActivationDialog.kt @@ -3,6 +3,8 @@ package com.tangem.tap.features.onboarding.products.wallet.saltPay.dialog import android.app.Dialog import android.content.Context import androidx.appcompat.app.AlertDialog +import com.tangem.common.extensions.guard +import com.tangem.tap.common.extensions.dispatchDebugErrorNotification import com.tangem.tap.common.feedback.SupportInfo import com.tangem.tap.common.redux.global.GlobalAction import com.tangem.tap.store @@ -19,7 +21,11 @@ class NoFundsForActivationDialog { setMessage(R.string.saltpay_error_no_gas_message) //TODO: SaltPay: change onboarding_supplement_button_kyc_waiting -> to appropriate string setPositiveButton(R.string.onboarding_supplement_button_kyc_waiting) { _, _ -> - store.dispatch(GlobalAction.OpenChat(SupportInfo())) + val config = store.state.globalState.configManager?.config?.saltPayConfig?.zendesk.guard { + store.dispatchDebugErrorNotification("SaltPayConfig not initialized") + return@setPositiveButton + } + store.dispatch(GlobalAction.OpenChat(SupportInfo(), config)) } setNegativeButton(R.string.common_cancel) { _, _ -> }