From 75f5b525b2c7b7aa706ad596cde740927bdb13ea Mon Sep 17 00:00:00 2001 From: Roman Makeev Date: Thu, 12 Oct 2023 11:30:42 +0300 Subject: [PATCH] improve status package --- modules/features/root/root.podspec | 2 +- ...Component.kt => PreviewStatusComponent.kt} | 2 +- .../status/data/MinecraftStatusRepository.kt | 17 ----------- .../features/status/data/StatusRepository.kt | 5 ---- .../status/data/UrlStatusRepository.kt | 19 ++----------- .../impl/MinecraftStatusRepositoryImpl.kt | 22 +++++++++++++++ .../data/impl/UrlStatusRepositoryImpl.kt | 21 ++++++++++++++ .../mobile/features/status/di/StatusModule.kt | 28 ++++++++++++++++--- .../DefaultMinecraftStatusComponent.kt | 9 ++---- .../MinecraftStatusComponent.kt | 2 +- .../status/root/DefaultRootStatusComponent.kt | 2 +- .../status/url/DefaultUrlStatusComponent.kt | 10 ++----- .../features/ui/status/widget/StatusWidget.kt | 2 +- 13 files changed, 78 insertions(+), 63 deletions(-) rename modules/features/root/src/commonMain/kotlin/com/makeevrserg/empireprojekt/mobile/features/status/{StubStatusComponent.kt => PreviewStatusComponent.kt} (95%) delete mode 100644 modules/features/root/src/commonMain/kotlin/com/makeevrserg/empireprojekt/mobile/features/status/data/StatusRepository.kt create mode 100644 modules/features/root/src/commonMain/kotlin/com/makeevrserg/empireprojekt/mobile/features/status/data/impl/MinecraftStatusRepositoryImpl.kt create mode 100644 modules/features/root/src/commonMain/kotlin/com/makeevrserg/empireprojekt/mobile/features/status/data/impl/UrlStatusRepositoryImpl.kt rename modules/features/root/src/commonMain/kotlin/com/makeevrserg/empireprojekt/mobile/features/status/{mincraft => minecraft}/DefaultMinecraftStatusComponent.kt (88%) rename modules/features/root/src/commonMain/kotlin/com/makeevrserg/empireprojekt/mobile/features/status/{mincraft => minecraft}/MinecraftStatusComponent.kt (99%) diff --git a/modules/features/root/root.podspec b/modules/features/root/root.podspec index 995e0097..b0269662 100644 --- a/modules/features/root/root.podspec +++ b/modules/features/root/root.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |spec| spec.name = 'root' - spec.version = '0.0.3' + spec.version = '0.1.0' spec.homepage = 'https://empireprojekt.ru' spec.source = { :http=> ''} spec.authors = '' diff --git a/modules/features/root/src/commonMain/kotlin/com/makeevrserg/empireprojekt/mobile/features/status/StubStatusComponent.kt b/modules/features/root/src/commonMain/kotlin/com/makeevrserg/empireprojekt/mobile/features/status/PreviewStatusComponent.kt similarity index 95% rename from modules/features/root/src/commonMain/kotlin/com/makeevrserg/empireprojekt/mobile/features/status/StubStatusComponent.kt rename to modules/features/root/src/commonMain/kotlin/com/makeevrserg/empireprojekt/mobile/features/status/PreviewStatusComponent.kt index 84831968..1a34553e 100644 --- a/modules/features/root/src/commonMain/kotlin/com/makeevrserg/empireprojekt/mobile/features/status/StubStatusComponent.kt +++ b/modules/features/root/src/commonMain/kotlin/com/makeevrserg/empireprojekt/mobile/features/status/PreviewStatusComponent.kt @@ -12,7 +12,7 @@ import kotlinx.coroutines.flow.update import kotlinx.coroutines.isActive import kotlinx.coroutines.launch -class StubStatusComponent : StatusComponent, CoroutineScope by MainScope() { +class PreviewStatusComponent : StatusComponent, CoroutineScope by MainScope() { private val mutableStateFlow = MutableStateFlow(StubModel()) override val model: AnyStateFlow = mutableStateFlow.wrapToAny() diff --git a/modules/features/root/src/commonMain/kotlin/com/makeevrserg/empireprojekt/mobile/features/status/data/MinecraftStatusRepository.kt b/modules/features/root/src/commonMain/kotlin/com/makeevrserg/empireprojekt/mobile/features/status/data/MinecraftStatusRepository.kt index 09855b6b..f0bd50c0 100644 --- a/modules/features/root/src/commonMain/kotlin/com/makeevrserg/empireprojekt/mobile/features/status/data/MinecraftStatusRepository.kt +++ b/modules/features/root/src/commonMain/kotlin/com/makeevrserg/empireprojekt/mobile/features/status/data/MinecraftStatusRepository.kt @@ -1,24 +1,7 @@ package com.makeevrserg.empireprojekt.mobile.features.status.data import com.makeevrserg.empireprojekt.mobile.features.status.data.model.MinecraftStatusResponse -import io.ktor.client.HttpClient -import io.ktor.client.call.body -import io.ktor.client.request.get -import kotlinx.coroutines.withContext -import ru.astrainteractive.klibs.mikro.core.dispatchers.KotlinDispatchers interface MinecraftStatusRepository { suspend fun get(): Result - class Default( - private val httpClient: HttpClient, - private val dispatchers: KotlinDispatchers - ) : MinecraftStatusRepository { - override suspend fun get(): Result = - runCatching { - val request = withContext(dispatchers.IO) { - httpClient.get("https://api.minetools.eu/ping/play.empireprojekt.ru") - } - request.body() - }.map { it.copy(description = it.description.replace("§", "")) } - } } diff --git a/modules/features/root/src/commonMain/kotlin/com/makeevrserg/empireprojekt/mobile/features/status/data/StatusRepository.kt b/modules/features/root/src/commonMain/kotlin/com/makeevrserg/empireprojekt/mobile/features/status/data/StatusRepository.kt deleted file mode 100644 index 9394a79b..00000000 --- a/modules/features/root/src/commonMain/kotlin/com/makeevrserg/empireprojekt/mobile/features/status/data/StatusRepository.kt +++ /dev/null @@ -1,5 +0,0 @@ -package com.makeevrserg.empireprojekt.mobile.features.status.data - -interface StatusRepository { - suspend fun isActive(): Result -} diff --git a/modules/features/root/src/commonMain/kotlin/com/makeevrserg/empireprojekt/mobile/features/status/data/UrlStatusRepository.kt b/modules/features/root/src/commonMain/kotlin/com/makeevrserg/empireprojekt/mobile/features/status/data/UrlStatusRepository.kt index 97aefe3b..d73abc6a 100644 --- a/modules/features/root/src/commonMain/kotlin/com/makeevrserg/empireprojekt/mobile/features/status/data/UrlStatusRepository.kt +++ b/modules/features/root/src/commonMain/kotlin/com/makeevrserg/empireprojekt/mobile/features/status/data/UrlStatusRepository.kt @@ -1,20 +1,5 @@ package com.makeevrserg.empireprojekt.mobile.features.status.data -import io.ktor.client.HttpClient -import io.ktor.client.request.get -import io.ktor.http.HttpStatusCode -import kotlinx.coroutines.withContext -import ru.astrainteractive.klibs.mikro.core.dispatchers.KotlinDispatchers - -class UrlStatusRepository( - private val url: String, - private val httpClient: HttpClient, - private val dispatchers: KotlinDispatchers -) : StatusRepository { - override suspend fun isActive(): Result = runCatching { - val request = withContext(dispatchers.IO) { - httpClient.get(url) - } - request.status == HttpStatusCode.OK - } +interface UrlStatusRepository { + suspend fun isActive(): Result } diff --git a/modules/features/root/src/commonMain/kotlin/com/makeevrserg/empireprojekt/mobile/features/status/data/impl/MinecraftStatusRepositoryImpl.kt b/modules/features/root/src/commonMain/kotlin/com/makeevrserg/empireprojekt/mobile/features/status/data/impl/MinecraftStatusRepositoryImpl.kt new file mode 100644 index 00000000..561f0637 --- /dev/null +++ b/modules/features/root/src/commonMain/kotlin/com/makeevrserg/empireprojekt/mobile/features/status/data/impl/MinecraftStatusRepositoryImpl.kt @@ -0,0 +1,22 @@ +package com.makeevrserg.empireprojekt.mobile.features.status.data.impl + +import com.makeevrserg.empireprojekt.mobile.features.status.data.MinecraftStatusRepository +import com.makeevrserg.empireprojekt.mobile.features.status.data.model.MinecraftStatusResponse +import io.ktor.client.HttpClient +import io.ktor.client.call.body +import io.ktor.client.request.get +import kotlinx.coroutines.withContext +import ru.astrainteractive.klibs.mikro.core.dispatchers.KotlinDispatchers + +class MinecraftStatusRepositoryImpl( + private val httpClient: HttpClient, + private val dispatchers: KotlinDispatchers +) : MinecraftStatusRepository { + override suspend fun get(): Result = + runCatching { + val request = withContext(dispatchers.IO) { + httpClient.get("https://api.minetools.eu/ping/play.empireprojekt.ru") + } + request.body() + }.map { it.copy(description = it.description.replace("§", "")) } +} diff --git a/modules/features/root/src/commonMain/kotlin/com/makeevrserg/empireprojekt/mobile/features/status/data/impl/UrlStatusRepositoryImpl.kt b/modules/features/root/src/commonMain/kotlin/com/makeevrserg/empireprojekt/mobile/features/status/data/impl/UrlStatusRepositoryImpl.kt new file mode 100644 index 00000000..17047a88 --- /dev/null +++ b/modules/features/root/src/commonMain/kotlin/com/makeevrserg/empireprojekt/mobile/features/status/data/impl/UrlStatusRepositoryImpl.kt @@ -0,0 +1,21 @@ +package com.makeevrserg.empireprojekt.mobile.features.status.data.impl + +import com.makeevrserg.empireprojekt.mobile.features.status.data.UrlStatusRepository +import io.ktor.client.HttpClient +import io.ktor.client.request.get +import io.ktor.http.HttpStatusCode +import kotlinx.coroutines.withContext +import ru.astrainteractive.klibs.mikro.core.dispatchers.KotlinDispatchers + +class UrlStatusRepositoryImpl( + private val url: String, + private val httpClient: HttpClient, + private val dispatchers: KotlinDispatchers +) : UrlStatusRepository { + override suspend fun isActive(): Result = runCatching { + val request = withContext(dispatchers.IO) { + httpClient.get(url) + } + request.status == HttpStatusCode.OK + } +} diff --git a/modules/features/root/src/commonMain/kotlin/com/makeevrserg/empireprojekt/mobile/features/status/di/StatusModule.kt b/modules/features/root/src/commonMain/kotlin/com/makeevrserg/empireprojekt/mobile/features/status/di/StatusModule.kt index c8b973d9..54518cb2 100644 --- a/modules/features/root/src/commonMain/kotlin/com/makeevrserg/empireprojekt/mobile/features/status/di/StatusModule.kt +++ b/modules/features/root/src/commonMain/kotlin/com/makeevrserg/empireprojekt/mobile/features/status/di/StatusModule.kt @@ -1,16 +1,36 @@ package com.makeevrserg.empireprojekt.mobile.features.status.di +import com.makeevrserg.empireprojekt.mobile.features.status.data.MinecraftStatusRepository +import com.makeevrserg.empireprojekt.mobile.features.status.data.UrlStatusRepository +import com.makeevrserg.empireprojekt.mobile.features.status.data.impl.MinecraftStatusRepositoryImpl +import com.makeevrserg.empireprojekt.mobile.features.status.data.impl.UrlStatusRepositoryImpl import io.ktor.client.HttpClient +import ru.astrainteractive.klibs.kdi.Factory import ru.astrainteractive.klibs.kdi.Module +import ru.astrainteractive.klibs.kdi.Provider import ru.astrainteractive.klibs.kdi.getValue import ru.astrainteractive.klibs.mikro.core.dispatchers.KotlinDispatchers interface StatusModule : Module { val dispatchers: KotlinDispatchers - val httpClient: HttpClient - + val minecraftStatusRepository: MinecraftStatusRepository + fun urlStatRepositoryFactory(url: String): Factory class Default( override val dispatchers: KotlinDispatchers, - override val httpClient: HttpClient - ) : StatusModule + private val httpClient: HttpClient + ) : StatusModule { + override val minecraftStatusRepository: MinecraftStatusRepository by Provider { + MinecraftStatusRepositoryImpl( + httpClient = httpClient, + dispatchers = dispatchers + ) + } + override fun urlStatRepositoryFactory(url: String) = Factory { + UrlStatusRepositoryImpl( + url = url, + httpClient = httpClient, + dispatchers = dispatchers + ) + } + } } diff --git a/modules/features/root/src/commonMain/kotlin/com/makeevrserg/empireprojekt/mobile/features/status/mincraft/DefaultMinecraftStatusComponent.kt b/modules/features/root/src/commonMain/kotlin/com/makeevrserg/empireprojekt/mobile/features/status/minecraft/DefaultMinecraftStatusComponent.kt similarity index 88% rename from modules/features/root/src/commonMain/kotlin/com/makeevrserg/empireprojekt/mobile/features/status/mincraft/DefaultMinecraftStatusComponent.kt rename to modules/features/root/src/commonMain/kotlin/com/makeevrserg/empireprojekt/mobile/features/status/minecraft/DefaultMinecraftStatusComponent.kt index 1b72a31b..bf543c22 100644 --- a/modules/features/root/src/commonMain/kotlin/com/makeevrserg/empireprojekt/mobile/features/status/mincraft/DefaultMinecraftStatusComponent.kt +++ b/modules/features/root/src/commonMain/kotlin/com/makeevrserg/empireprojekt/mobile/features/status/minecraft/DefaultMinecraftStatusComponent.kt @@ -1,7 +1,6 @@ -package com.makeevrserg.empireprojekt.mobile.features.status.mincraft +package com.makeevrserg.empireprojekt.mobile.features.status.minecraft import com.makeevrserg.empireprojekt.mobile.features.status.StatusComponent -import com.makeevrserg.empireprojekt.mobile.features.status.data.MinecraftStatusRepository import com.makeevrserg.empireprojekt.mobile.features.status.di.StatusModule import com.makeevrserg.empireprojekt.mobile.services.core.AnyStateFlow import com.makeevrserg.empireprojekt.mobile.services.core.CoroutineFeature @@ -18,10 +17,6 @@ class DefaultMinecraftStatusComponent( title: String, private val coroutineFeature: CoroutineFeature ) : StatusComponent, StatusModule by module { - private val repository = MinecraftStatusRepository.Default( - httpClient = httpClient, - dispatchers = dispatchers - ) private val _model = MutableStateFlow( MinecraftStatusComponent.Model( title = StringDesc.Raw(title), @@ -43,7 +38,7 @@ class DefaultMinecraftStatusComponent( _model.update { it.copy(isLoading = true) } - val response = repository.get() + val response = minecraftStatusRepository.get() _model.update { it.copy( isLoading = false, diff --git a/modules/features/root/src/commonMain/kotlin/com/makeevrserg/empireprojekt/mobile/features/status/mincraft/MinecraftStatusComponent.kt b/modules/features/root/src/commonMain/kotlin/com/makeevrserg/empireprojekt/mobile/features/status/minecraft/MinecraftStatusComponent.kt similarity index 99% rename from modules/features/root/src/commonMain/kotlin/com/makeevrserg/empireprojekt/mobile/features/status/mincraft/MinecraftStatusComponent.kt rename to modules/features/root/src/commonMain/kotlin/com/makeevrserg/empireprojekt/mobile/features/status/minecraft/MinecraftStatusComponent.kt index e0d182f8..71f79dd5 100644 --- a/modules/features/root/src/commonMain/kotlin/com/makeevrserg/empireprojekt/mobile/features/status/mincraft/MinecraftStatusComponent.kt +++ b/modules/features/root/src/commonMain/kotlin/com/makeevrserg/empireprojekt/mobile/features/status/minecraft/MinecraftStatusComponent.kt @@ -1,4 +1,4 @@ -package com.makeevrserg.empireprojekt.mobile.features.status.mincraft +package com.makeevrserg.empireprojekt.mobile.features.status.minecraft import com.makeevrserg.empireprojekt.mobile.features.status.StatusComponent import com.makeevrserg.empireprojekt.mobile.features.status.data.model.MinecraftStatusResponse diff --git a/modules/features/root/src/commonMain/kotlin/com/makeevrserg/empireprojekt/mobile/features/status/root/DefaultRootStatusComponent.kt b/modules/features/root/src/commonMain/kotlin/com/makeevrserg/empireprojekt/mobile/features/status/root/DefaultRootStatusComponent.kt index 5f405c06..86ea2436 100644 --- a/modules/features/root/src/commonMain/kotlin/com/makeevrserg/empireprojekt/mobile/features/status/root/DefaultRootStatusComponent.kt +++ b/modules/features/root/src/commonMain/kotlin/com/makeevrserg/empireprojekt/mobile/features/status/root/DefaultRootStatusComponent.kt @@ -2,7 +2,7 @@ package com.makeevrserg.empireprojekt.mobile.features.status.root import com.makeevrserg.empireprojekt.mobile.features.status.StatusComponent import com.makeevrserg.empireprojekt.mobile.features.status.di.StatusModule -import com.makeevrserg.empireprojekt.mobile.features.status.mincraft.DefaultMinecraftStatusComponent +import com.makeevrserg.empireprojekt.mobile.features.status.minecraft.DefaultMinecraftStatusComponent import com.makeevrserg.empireprojekt.mobile.features.status.url.DefaultUrlStatusComponent import com.makeevrserg.empireprojekt.mobile.services.core.CoroutineFeature diff --git a/modules/features/root/src/commonMain/kotlin/com/makeevrserg/empireprojekt/mobile/features/status/url/DefaultUrlStatusComponent.kt b/modules/features/root/src/commonMain/kotlin/com/makeevrserg/empireprojekt/mobile/features/status/url/DefaultUrlStatusComponent.kt index a43314d6..c9c2ffa2 100644 --- a/modules/features/root/src/commonMain/kotlin/com/makeevrserg/empireprojekt/mobile/features/status/url/DefaultUrlStatusComponent.kt +++ b/modules/features/root/src/commonMain/kotlin/com/makeevrserg/empireprojekt/mobile/features/status/url/DefaultUrlStatusComponent.kt @@ -1,8 +1,6 @@ package com.makeevrserg.empireprojekt.mobile.features.status.url import com.makeevrserg.empireprojekt.mobile.features.status.StatusComponent -import com.makeevrserg.empireprojekt.mobile.features.status.data.StatusRepository -import com.makeevrserg.empireprojekt.mobile.features.status.data.UrlStatusRepository import com.makeevrserg.empireprojekt.mobile.features.status.di.StatusModule import com.makeevrserg.empireprojekt.mobile.services.core.AnyStateFlow import com.makeevrserg.empireprojekt.mobile.services.core.CoroutineFeature @@ -20,11 +18,7 @@ class DefaultUrlStatusComponent( module: StatusModule, private val coroutineFeature: CoroutineFeature ) : UrlStatusComponent, StatusModule by module { - private val statusRepository: StatusRepository = UrlStatusRepository( - url = url, - httpClient = httpClient, - dispatchers = dispatchers - ) + private val urlStatusRepository = urlStatRepositoryFactory(url).create() private val _model = MutableStateFlow( UrlStatusComponent.Model( @@ -45,7 +39,7 @@ class DefaultUrlStatusComponent( _model.update { it.copy(isLoading = true) } - val response = statusRepository.isActive() + val response = urlStatusRepository.isActive() response.onSuccess { _model.update { it.copy( diff --git a/modules/features/ui/src/commonMain/kotlin/com/makeevrserg/empireprojekt/mobile/features/ui/status/widget/StatusWidget.kt b/modules/features/ui/src/commonMain/kotlin/com/makeevrserg/empireprojekt/mobile/features/ui/status/widget/StatusWidget.kt index 09949224..3516c310 100644 --- a/modules/features/ui/src/commonMain/kotlin/com/makeevrserg/empireprojekt/mobile/features/ui/status/widget/StatusWidget.kt +++ b/modules/features/ui/src/commonMain/kotlin/com/makeevrserg/empireprojekt/mobile/features/ui/status/widget/StatusWidget.kt @@ -26,7 +26,7 @@ import androidx.compose.ui.unit.dp import com.makeevrserg.empireprojekt.mobile.core.ui.asComposableString import com.makeevrserg.empireprojekt.mobile.core.ui.theme.AppTheme import com.makeevrserg.empireprojekt.mobile.features.status.StatusComponent -import com.makeevrserg.empireprojekt.mobile.features.status.mincraft.MinecraftStatusComponent +import com.makeevrserg.empireprojekt.mobile.features.status.minecraft.MinecraftStatusComponent private const val FADE_DURATION = 1200