Updated on 2026-08-14

This commit is contained in:
Tangem 2024-12-20 15:15:57 +04:00
parent 20eba62956
commit e92074bbb0
21 changed files with 36 additions and 75 deletions

View file

@ -7,13 +7,11 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.hapticfeedback.HapticFeedbackType
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalHapticFeedback
import androidx.compose.ui.tooling.preview.Preview
import com.tangem.common.ui.R
import com.tangem.core.ui.components.SecondaryButtonIconStart
import com.tangem.core.ui.components.SpacerW12
import com.tangem.core.ui.extensions.shareText
import com.tangem.core.ui.extensions.stringResourceSafe
import com.tangem.core.ui.res.TangemTheme
import com.tangem.core.ui.res.TangemThemePreview
@ -22,12 +20,11 @@ import com.tangem.core.ui.res.TangemThemePreview
fun SendDoneButtons(
txUrl: String,
onExploreClick: () -> Unit,
onShareClick: () -> Unit,
onShareClick: (String) -> Unit,
isVisible: Boolean,
modifier: Modifier = Modifier,
) {
val hapticFeedback = LocalHapticFeedback.current
val context = LocalContext.current
AnimatedVisibility(
visible = isVisible && txUrl.isNotBlank(),
@ -49,8 +46,7 @@ fun SendDoneButtons(
iconResId = R.drawable.ic_share_24,
onClick = {
hapticFeedback.performHapticFeedback(HapticFeedbackType.LongPress)
context.shareText(txUrl)
onShareClick()
onShareClick(txUrl)
},
modifier = Modifier.weight(1f),
)

View file

@ -73,9 +73,8 @@ private fun TokenReceiveBottomSheetContent(content: TokenReceiveBottomSheetConfi
)
Buttons(
address = selectedAddress.value,
snackbarHostState = snackbarHostState,
onShareClick = content.onShareClick,
onShareClick = { content.onShareClick(selectedAddress.value) },
onCopyClick = { content.onCopyClick(selectedAddress.value) },
)
}
@ -227,7 +226,6 @@ private fun getName(content: TokenReceiveBottomSheetConfig, index: Int): String
@Composable
private fun Buttons(
address: String,
snackbarHostState: SnackbarHostState,
onShareClick: () -> Unit,
onCopyClick: () -> Unit,
@ -264,10 +262,9 @@ private fun Buttons(
text = stringResourceSafe(id = R.string.common_share),
iconResId = R.drawable.ic_share_24,
onClick = {
onShareClick()
hapticFeedback.performHapticFeedback(HapticFeedbackType.LongPress)
context.shareText(address)
onShareClick()
},
)
}

View file

@ -10,5 +10,5 @@ data class TokenReceiveBottomSheetConfig(
val addresses: ImmutableList<AddressModel>,
val showMemoDisclaimer: Boolean,
val onCopyClick: (String) -> Unit,
val onShareClick: () -> Unit,
val onShareClick: (String) -> Unit,
) : TangemBottomSheetConfigContent

View file

@ -1,15 +0,0 @@
package com.tangem.core.ui.extensions
import android.content.Context
import android.content.Intent
import androidx.core.content.ContextCompat
fun Context.shareText(text: String) {
val sendIntent: Intent = Intent().apply {
action = Intent.ACTION_SEND
putExtra(Intent.EXTRA_TEXT, text)
type = "text/plain"
}
val shareIntent = Intent.createChooser(sendIntent, null)
ContextCompat.startActivity(this, shareIntent, null)
}

View file

@ -14,6 +14,7 @@ dependencies {
/** Core modules */
implementation(projects.core.analytics)
implementation(projects.core.analytics.models)
implementation(projects.core.navigation)
implementation(projects.core.res)
implementation(projects.core.utils)
implementation(projects.core.ui)

View file

@ -50,6 +50,6 @@ internal data class ReferralStateHolder(
data class Analytics(
val onAgreementClicked: () -> Unit,
val onCopyClicked: () -> Unit,
val onShareClicked: () -> Unit,
val onShareClicked: (String) -> Unit,
)
}

View file

@ -1,7 +1,5 @@
package com.tangem.feature.referral.ui
import android.content.Context
import android.content.Intent
import android.content.res.Configuration
import androidx.compose.animation.*
import androidx.compose.foundation.background
@ -22,7 +20,6 @@ import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.tooling.preview.datasource.CollectionPreviewParameterProvider
import androidx.core.content.ContextCompat.startActivity
import com.tangem.core.res.getStringSafe
import com.tangem.core.ui.components.PrimaryButtonIconStart
import com.tangem.core.ui.components.rows.RoundableCornersRow
@ -45,7 +42,7 @@ internal fun ParticipateBottomBlock(
snackbarHostState: SnackbarHostState,
onAgreementClick: () -> Unit,
onCopyClick: () -> Unit,
onShareClick: () -> Unit,
onShareClick: (String) -> Unit,
) {
Column(
modifier = Modifier
@ -282,7 +279,7 @@ private fun AdditionalButtons(
shareLink: String,
snackbarHostState: SnackbarHostState,
onCopyClick: () -> Unit,
onShareClick: () -> Unit,
onShareClick: (String) -> Unit,
) {
val clipboardManager = LocalClipboardManager.current
val hapticFeedback = LocalHapticFeedback.current
@ -317,9 +314,8 @@ private fun AdditionalButtons(
text = stringResourceSafe(id = R.string.common_share),
iconResId = R.drawable.ic_share_24,
onClick = {
onShareClick.invoke()
hapticFeedback.performHapticFeedback(HapticFeedbackType.LongPress)
context.shareText(context.getString(R.string.referral_share_link, shareLink))
onShareClick(context.getString(R.string.referral_share_link, shareLink))
},
modifier = Modifier.weight(1f),
)
@ -342,16 +338,6 @@ private fun calculateOverallItemsCount(expectedAwards: ExpectedAwards?, isExpand
return counterItems + awardItems
}
private fun Context.shareText(text: String) {
val sendIntent: Intent = Intent().apply {
action = Intent.ACTION_SEND
putExtra(Intent.EXTRA_TEXT, text)
type = "text/plain"
}
val shareIntent = Intent.createChooser(sendIntent, null)
startActivity(this, shareIntent, null)
}
@Preview(widthDp = 360, showBackground = true)
@Preview(widthDp = 360, showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_YES)
@Composable
@ -435,5 +421,5 @@ private data class ParticipateBottomBlockData(
val onAgreementClick: () -> Unit = {},
val onShowCopySnackbar: () -> Unit = {},
val onCopyClick: () -> Unit = {},
val onShareClick: () -> Unit = {},
val onShareClick: (String) -> Unit = {},
)

View file

@ -10,6 +10,7 @@ import androidx.lifecycle.viewModelScope
import com.tangem.common.routing.AppRoute
import com.tangem.common.routing.bundle.unbundle
import com.tangem.core.analytics.api.AnalyticsEventHandler
import com.tangem.core.navigation.share.ShareManager
import com.tangem.domain.wallets.models.UserWalletId
import com.tangem.feature.referral.analytics.ReferralEvents
import com.tangem.feature.referral.domain.ReferralInteractor
@ -34,6 +35,7 @@ internal class ReferralViewModel @Inject constructor(
private val referralInteractor: ReferralInteractor,
private val dispatchers: CoroutineDispatcherProvider,
private val analyticsEventHandler: AnalyticsEventHandler,
private val shareManager: ShareManager,
savedStateHandle: SavedStateHandle,
) : ViewModel() {
@ -125,8 +127,10 @@ internal class ReferralViewModel @Inject constructor(
analyticsEventHandler.send(ReferralEvents.ClickCopy)
}
private fun onShareClicked() {
private fun onShareClicked(text: String) {
analyticsEventHandler.send(ReferralEvents.ClickShare)
shareManager.shareText(text = text)
}
private fun ReferralData.convertToReferralInfoState(): ReferralInfoState = when (this) {

View file

@ -59,13 +59,14 @@ internal object SendClickIntentsStub : SendClickIntents {
override fun onExploreClick() {}
override fun onShareClick() {}
override fun onShareClick(txUrl: String) {}
override fun onAmountReduceByClick(
reduceAmountBy: BigDecimal,
reduceAmountByDiff: BigDecimal,
notification: Class<out NotificationUM>,
) {}
) {
}
override fun onAmountReduceToClick(reduceAmountTo: BigDecimal, notification: Class<out NotificationUM>) {}

View file

@ -68,7 +68,7 @@ internal fun SendNavigationButtons(
SendDoneButtons(
txUrl = sendState.txUrl,
onExploreClick = uiState.clickIntents::onExploreClick,
onShareClick = uiState.clickIntents::onShareClick,
onShareClick = { uiState.clickIntents.onShareClick(it) },
isVisible = isSentState,
)
SendNavigationButton(

View file

@ -55,7 +55,7 @@ internal interface SendClickIntents : AmountScreenClickIntents {
fun onExploreClick()
fun onShareClick()
fun onShareClick(txUrl: String)
fun onAmountReduceByClick(
reduceAmountBy: BigDecimal,

View file

@ -15,6 +15,7 @@ import com.tangem.common.ui.amountScreen.models.AmountState
import com.tangem.common.ui.amountScreen.models.EnterAmountBoundary
import com.tangem.common.ui.notifications.NotificationUM
import com.tangem.core.analytics.api.AnalyticsEventHandler
import com.tangem.core.navigation.share.ShareManager
import com.tangem.core.ui.utils.parseBigDecimal
import com.tangem.domain.appcurrency.GetSelectedAppCurrencyUseCase
import com.tangem.domain.appcurrency.model.AppCurrency
@ -106,6 +107,7 @@ internal class SendViewModel @Inject constructor(
private val saveBlockchainErrorUseCase: SaveBlockchainErrorUseCase,
private val getCardInfoUseCase: GetCardInfoUseCase,
private val sendFeedbackEmailUseCase: SendFeedbackEmailUseCase,
private val shareManager: ShareManager,
@DelayedWork private val coroutineScope: CoroutineScope,
validateTransactionUseCase: ValidateTransactionUseCase,
getCurrencyCheckUseCase: GetCurrencyCheckUseCase,
@ -863,8 +865,9 @@ internal class SendViewModel @Inject constructor(
innerRouter.openUrl(sendState.txUrl)
}
override fun onShareClick() {
override fun onShareClick(txUrl: String) {
analyticsEventHandler.send(SendAnalyticEvents.ShareButtonClicked)
shareManager.shareText(txUrl)
}
override fun onAmountReduceToClick(reduceAmountTo: BigDecimal, notification: Class<out NotificationUM>) {

View file

@ -10,6 +10,4 @@ internal sealed class StakingEvent {
data class ShowSnackBar(val text: TextReference) : StakingEvent()
data class ShowAlert(val alert: AlertUM) : StakingEvent()
data class ShowShareDialog(val txUrl: String) : StakingEvent()
}

View file

@ -41,9 +41,4 @@ internal class StakingEventFactory(
)
stateController.updateEvent(alert)
}
fun createShareDialog(txUrl: String) {
val event = StakingEvent.ShowShareDialog(txUrl)
stateController.updateEvent(event)
}
}

View file

@ -10,14 +10,12 @@ import com.tangem.core.ui.components.DialogButtonUM
import com.tangem.core.ui.event.EventEffect
import com.tangem.core.ui.event.StateEvent
import com.tangem.core.ui.extensions.resolveReference
import com.tangem.core.ui.extensions.shareText
import com.tangem.core.ui.extensions.stringResourceSafe
import com.tangem.features.staking.impl.R
import com.tangem.features.staking.impl.presentation.state.events.StakingEvent
@Composable
internal fun StakingEventEffect(event: StateEvent<StakingEvent>, snackbarHostState: SnackbarHostState) {
val context = LocalContext.current
val resources = LocalContext.current.resources
var alertConfig by remember { mutableStateOf<AlertUM?>(value = null) }
@ -40,9 +38,6 @@ internal fun StakingEventEffect(event: StateEvent<StakingEvent>, snackbarHostSta
is StakingEvent.ShowAlert -> {
alertConfig = value.alert
}
is StakingEvent.ShowShareDialog -> {
context.shareText(value.txUrl)
}
}
},
)

View file

@ -17,6 +17,7 @@ import com.tangem.common.ui.bottomsheet.permission.state.GiveTxPermissionBottomS
import com.tangem.common.ui.notifications.NotificationUM
import com.tangem.core.analytics.api.AnalyticsEventHandler
import com.tangem.core.analytics.api.ParamsInterceptorHolder
import com.tangem.core.navigation.share.ShareManager
import com.tangem.core.ui.haptic.TangemHapticEffect
import com.tangem.core.ui.haptic.VibratorHapticManager
import com.tangem.domain.appcurrency.GetSelectedAppCurrencyUseCase
@ -119,6 +120,7 @@ internal class StakingViewModel @Inject constructor(
private val sendFeedbackEmailUseCase: SendFeedbackEmailUseCase,
private val getActionsUseCase: GetActionsUseCase,
private val paramsInterceptorHolder: ParamsInterceptorHolder,
private val shareManager: ShareManager,
@DelayedWork private val coroutineScope: CoroutineScope,
savedStateHandle: SavedStateHandle,
) : ViewModel(), DefaultLifecycleObserver, StakingClickIntents {
@ -757,7 +759,7 @@ internal class StakingViewModel @Inject constructor(
analyticsEventHandler.send(StakingAnalyticsEvent.ButtonShare)
if (txUrl != null) {
vibratorHapticManager.performOneTime(TangemHapticEffect.OneTime.Click)
stakingEventFactory.createShareDialog(txUrl = txUrl)
shareManager.shareText(txUrl)
}
}

View file

@ -6,6 +6,4 @@ import com.tangem.common.ui.alerts.models.AlertUM
@Immutable
internal sealed class SwapEvent {
data class ShowAlert(val alert: AlertUM) : SwapEvent()
data class ShowShareDialog(val txUrl: String) : SwapEvent()
}

View file

@ -1,7 +1,6 @@
package com.tangem.feature.swap.ui
import androidx.compose.runtime.*
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalSoftwareKeyboardController
import com.tangem.common.ui.alerts.models.AlertUM
import com.tangem.core.ui.components.BasicDialog
@ -9,14 +8,12 @@ import com.tangem.core.ui.components.DialogButtonUM
import com.tangem.core.ui.event.EventEffect
import com.tangem.core.ui.event.StateEvent
import com.tangem.core.ui.extensions.resolveReference
import com.tangem.core.ui.extensions.shareText
import com.tangem.core.ui.extensions.stringResourceSafe
import com.tangem.feature.swap.models.states.events.SwapEvent
import com.tangem.feature.swap.presentation.R
@Composable
internal fun SwapEventEffect(event: StateEvent<SwapEvent>) {
val context = LocalContext.current
var alertConfig by remember { mutableStateOf<AlertUM?>(value = null) }
val keyboardController = LocalSoftwareKeyboardController.current
@ -35,9 +32,6 @@ internal fun SwapEventEffect(event: StateEvent<SwapEvent>) {
is SwapEvent.ShowAlert -> {
alertConfig = value.alert
}
is SwapEvent.ShowShareDialog -> {
context.shareText(value.txUrl)
}
}
},
)

View file

@ -250,7 +250,7 @@ internal class TokenDetailsStateFactory(
currency: CryptoCurrency,
networkAddress: NetworkAddress,
onCopyClick: (String) -> Unit,
onShareClick: () -> Unit,
onShareClick: (String) -> Unit,
): TokenDetailsState {
return currentStateProvider().copy(
bottomSheetConfig = TangemBottomSheetConfig(

View file

@ -12,6 +12,7 @@ import com.tangem.core.analytics.api.AnalyticsEventHandler
import com.tangem.core.analytics.models.AnalyticsParam
import com.tangem.core.deeplink.DeepLinksRegistry
import com.tangem.core.deeplink.global.BuyCurrencyDeepLink
import com.tangem.core.navigation.share.ShareManager
import com.tangem.core.ui.clipboard.ClipboardManager
import com.tangem.core.ui.components.bottomsheets.tokenreceive.AddressModel
import com.tangem.core.ui.components.bottomsheets.tokenreceive.mapToAddressModels
@ -120,6 +121,7 @@ internal class TokenDetailsViewModel @Inject constructor(
private val clipboardManager: ClipboardManager,
private val getCryptoCurrencySyncUseCase: GetCryptoCurrencyStatusSyncUseCase,
private val onrampFeatureToggles: OnrampFeatureToggles,
private val shareManager: ShareManager,
expressStatusFactory: ExpressStatusFactory.Factory,
getUserWalletUseCase: GetUserWalletUseCase,
getStakingIntegrationIdUseCase: GetStakingIntegrationIdUseCase,
@ -594,6 +596,7 @@ internal class TokenDetailsViewModel @Inject constructor(
},
onShareClick = {
analyticsEventsHandler.send(TokenReceiveAnalyticsEvent.ButtonShareAddress(cryptoCurrency.symbol))
shareManager.shareText(text = it)
},
)
}

View file

@ -7,6 +7,7 @@ import com.tangem.common.ui.tokens.getUnavailabilityReasonText
import com.tangem.core.analytics.api.AnalyticsEventHandler
import com.tangem.core.analytics.models.AnalyticsParam
import com.tangem.core.analytics.models.event.MainScreenAnalyticsEvent
import com.tangem.core.navigation.share.ShareManager
import com.tangem.core.ui.clipboard.ClipboardManager
import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetConfigContent
import com.tangem.core.ui.components.bottomsheets.chooseaddress.ChooseAddressBottomSheetConfig
@ -117,6 +118,7 @@ internal class WalletCurrencyActionsClickIntentsImplementor @Inject constructor(
private val reduxStateHolder: ReduxStateHolder,
private val vibratorHapticManager: VibratorHapticManager,
private val clipboardManager: ClipboardManager,
private val shareManager: ShareManager,
private val appRouter: AppRouter,
private val rampStateManager: RampStateManager,
private val getUserCountryUseCase: GetUserCountryUseCase,
@ -243,6 +245,7 @@ internal class WalletCurrencyActionsClickIntentsImplementor @Inject constructor(
},
onShareClick = {
analyticsEventHandler.send(TokenReceiveAnalyticsEvent.ButtonShareAddress(currency.symbol))
shareManager.shareText(text = it)
},
)
}