Updated on 2026-08-14
This commit is contained in:
parent
904d4bb006
commit
b352bb6235
39 changed files with 353 additions and 5 deletions
1
features/usedesk/api/.gitignore
vendored
Normal file
1
features/usedesk/api/.gitignore
vendored
Normal file
|
|
@ -0,0 +1 @@
|
|||
/build
|
||||
17
features/usedesk/api/build.gradle.kts
Normal file
17
features/usedesk/api/build.gradle.kts
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
plugins {
|
||||
alias(deps.plugins.android.library)
|
||||
alias(deps.plugins.kotlin.android)
|
||||
id("configuration")
|
||||
}
|
||||
|
||||
android {
|
||||
namespace = "com.tangem.feature.usedesk.api"
|
||||
}
|
||||
|
||||
dependencies {
|
||||
|
||||
/** Core */
|
||||
implementation(projects.core.decompose)
|
||||
implementation(projects.core.ui)
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
package com.tangem.feature.usedesk.api
|
||||
|
||||
import com.tangem.core.decompose.factory.ComponentFactory
|
||||
import com.tangem.core.ui.decompose.ComposableContentComponent
|
||||
|
||||
interface UsedeskComponent : ComposableContentComponent {
|
||||
|
||||
data class Params(
|
||||
val feedback: String? = null, // TODO [REDACTED_TASK_KEY]
|
||||
)
|
||||
|
||||
interface Factory : ComponentFactory<Params, UsedeskComponent>
|
||||
}
|
||||
1
features/usedesk/impl/.gitignore
vendored
Normal file
1
features/usedesk/impl/.gitignore
vendored
Normal file
|
|
@ -0,0 +1 @@
|
|||
/build
|
||||
36
features/usedesk/impl/build.gradle.kts
Normal file
36
features/usedesk/impl/build.gradle.kts
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
plugins {
|
||||
alias(deps.plugins.android.library)
|
||||
alias(deps.plugins.kotlin.android)
|
||||
alias(deps.plugins.kotlin.kapt)
|
||||
alias(deps.plugins.hilt.android)
|
||||
id("configuration")
|
||||
}
|
||||
|
||||
android {
|
||||
namespace = "com.tangem.feature.usedesk.impl"
|
||||
}
|
||||
|
||||
dependencies {
|
||||
|
||||
/** Core */
|
||||
implementation(projects.core.ui)
|
||||
implementation(projects.core.decompose)
|
||||
implementation(projects.core.utils)
|
||||
implementation(projects.core.navigation)
|
||||
implementation(projects.common.routing)
|
||||
implementation(projects.features.usedesk.api)
|
||||
|
||||
/** DI */
|
||||
implementation(deps.hilt.android)
|
||||
kapt(deps.hilt.kapt)
|
||||
|
||||
/** Compose */
|
||||
implementation(deps.compose.foundation)
|
||||
implementation(deps.compose.ui)
|
||||
|
||||
/** Usedesk */
|
||||
implementation(deps.usedesk.chat.sdk)
|
||||
implementation(deps.usedesk.chat.gui)
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,60 @@
|
|||
package com.tangem.feature.usedesk
|
||||
|
||||
import android.view.View
|
||||
import androidx.compose.foundation.layout.*
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.viewinterop.AndroidView
|
||||
import androidx.fragment.app.FragmentActivity
|
||||
import androidx.fragment.app.FragmentContainerView
|
||||
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
||||
import com.tangem.core.decompose.context.AppComponentContext
|
||||
import com.tangem.core.decompose.model.getOrCreateModel
|
||||
import com.tangem.feature.usedesk.api.UsedeskComponent
|
||||
import com.tangem.feature.usedesk.model.UsedeskModel
|
||||
import dagger.assisted.Assisted
|
||||
import dagger.assisted.AssistedFactory
|
||||
import dagger.assisted.AssistedInject
|
||||
import ru.usedesk.chat_gui.chat.UsedeskChatScreen
|
||||
|
||||
internal class DefaultUsedeskComponent @AssistedInject constructor(
|
||||
@Assisted appComponentContext: AppComponentContext,
|
||||
@Assisted params: UsedeskComponent.Params,
|
||||
) : UsedeskComponent, AppComponentContext by appComponentContext {
|
||||
|
||||
private val model: UsedeskModel = getOrCreateModel(params)
|
||||
|
||||
@Composable
|
||||
override fun Content(modifier: Modifier) {
|
||||
val state by model.state.collectAsStateWithLifecycle()
|
||||
|
||||
Box(
|
||||
modifier = Modifier
|
||||
.fillMaxSize()
|
||||
.systemBarsPadding()
|
||||
.imePadding(),
|
||||
) {
|
||||
AndroidView(
|
||||
factory = { context ->
|
||||
FragmentContainerView(context).apply {
|
||||
id = View.generateViewId()
|
||||
|
||||
val fragment = UsedeskChatScreen.newInstance(
|
||||
state.usedeskChatConfiguration,
|
||||
)
|
||||
(context as FragmentActivity).supportFragmentManager.beginTransaction()
|
||||
.replace(id, fragment)
|
||||
.commit()
|
||||
}
|
||||
},
|
||||
modifier = Modifier.fillMaxSize(),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@AssistedFactory
|
||||
interface Factory : UsedeskComponent.Factory {
|
||||
override fun create(context: AppComponentContext, params: UsedeskComponent.Params): DefaultUsedeskComponent
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,25 @@
|
|||
package com.tangem.feature.usedesk.di
|
||||
|
||||
import com.tangem.core.decompose.model.Model
|
||||
import com.tangem.feature.usedesk.DefaultUsedeskComponent
|
||||
import com.tangem.feature.usedesk.api.UsedeskComponent
|
||||
import com.tangem.feature.usedesk.model.UsedeskModel
|
||||
import dagger.Binds
|
||||
import dagger.Module
|
||||
import dagger.hilt.InstallIn
|
||||
import dagger.hilt.components.SingletonComponent
|
||||
import dagger.multibindings.ClassKey
|
||||
import dagger.multibindings.IntoMap
|
||||
|
||||
@Module
|
||||
@InstallIn(SingletonComponent::class)
|
||||
internal interface UsedeskFeatureModule {
|
||||
|
||||
@Binds
|
||||
fun bindComponentFactory(impl: DefaultUsedeskComponent.Factory): UsedeskComponent.Factory
|
||||
|
||||
@Binds
|
||||
@IntoMap
|
||||
@ClassKey(UsedeskModel::class)
|
||||
fun bindModel(model: UsedeskModel): Model
|
||||
}
|
||||
|
|
@ -0,0 +1,35 @@
|
|||
package com.tangem.feature.usedesk.model
|
||||
|
||||
import androidx.compose.runtime.Stable
|
||||
import com.tangem.core.decompose.di.ModelScoped
|
||||
import com.tangem.core.decompose.model.Model
|
||||
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
|
||||
import kotlinx.coroutines.flow.MutableStateFlow
|
||||
import kotlinx.coroutines.flow.StateFlow
|
||||
import ru.usedesk.chat_sdk.entity.UsedeskChatConfiguration
|
||||
import javax.inject.Inject
|
||||
|
||||
@Stable
|
||||
@ModelScoped
|
||||
internal class UsedeskModel @Inject constructor(
|
||||
override val dispatchers: CoroutineDispatcherProvider,
|
||||
) : Model() {
|
||||
|
||||
private val _state = MutableStateFlow(getInitialState())
|
||||
|
||||
val state: StateFlow<UsedeskState> = _state
|
||||
|
||||
private fun getInitialState(): UsedeskState {
|
||||
return UsedeskState(
|
||||
UsedeskChatConfiguration(
|
||||
companyId = COMPANY_ID,
|
||||
channelId = CHANNEL_ID,
|
||||
),
|
||||
)
|
||||
}
|
||||
|
||||
private companion object {
|
||||
const val COMPANY_ID = "170509"
|
||||
const val CHANNEL_ID = "65637"
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
package com.tangem.feature.usedesk.model
|
||||
|
||||
import androidx.compose.runtime.Stable
|
||||
import ru.usedesk.chat_sdk.entity.UsedeskChatConfiguration
|
||||
|
||||
@Stable
|
||||
internal data class UsedeskState(
|
||||
val usedeskChatConfiguration: UsedeskChatConfiguration,
|
||||
)
|
||||
Loading…
Add table
Add a link
Reference in a new issue