From d7041060f075a6f1459b35ded71b62af5218be98 Mon Sep 17 00:00:00 2001 From: TaejungKim <92737123+imtaejugkim@users.noreply.github.com> Date: Sun, 8 Mar 2026 15:08:07 +0900 Subject: [PATCH 01/22] =?UTF-8?q?[add/#31]=20=ED=8F=89=EA=B0=80=ED=95=98?= =?UTF-8?q?=EA=B8=B0=20=EA=B4=80=EB=A0=A8=20=EC=9D=98=EC=A1=B4=EC=84=B1=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- composeApp/build.gradle.kts | 2 ++ .../commonMain/kotlin/com/kus/kustaurant/di/initKoin.kt | 8 +++++++- settings.gradle.kts | 6 ++++-- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/composeApp/build.gradle.kts b/composeApp/build.gradle.kts index 51b6cd6c..d27c4981 100644 --- a/composeApp/build.gradle.kts +++ b/composeApp/build.gradle.kts @@ -66,6 +66,7 @@ kotlin { implementation(project(":shared:data:auth")) implementation(project(":shared:data:home")) implementation(project(":shared:data:detail")) + implementation(project(":shared:data:evaluate")) implementation(project(":shared:feature:community")) implementation(project(":shared:feature:draw")) @@ -84,6 +85,7 @@ kotlin { implementation(project(":shared:domain:auth")) implementation(project(":shared:domain:home")) implementation(project(":shared:domain:detail")) + implementation(project(":shared:domain:evaluate")) } commonTest.dependencies { implementation(libs.kotlin.test) diff --git a/composeApp/src/commonMain/kotlin/com/kus/kustaurant/di/initKoin.kt b/composeApp/src/commonMain/kotlin/com/kus/kustaurant/di/initKoin.kt index d70e9dd2..ce13b16e 100644 --- a/composeApp/src/commonMain/kotlin/com/kus/kustaurant/di/initKoin.kt +++ b/composeApp/src/commonMain/kotlin/com/kus/kustaurant/di/initKoin.kt @@ -7,6 +7,7 @@ import com.kus.data.network.di.networkModule import com.kus.domain.firstLaunch.di.firstLaunchDomainModule import com.kus.domain.auth.di.authDomainModule import com.kus.feature.detail.di.detailFeatureModule +import com.kus.feature.evaluate.di.evaluateFeatureModule import com.kus.feature.home.di.homeFeatureModule import com.kus.feature.login.di.featureLoginModule import com.kus.feature.onboarding.di.onboardingFeatureModule @@ -16,8 +17,10 @@ import com.kus.shared.domain.tier.di.tierDomainModule import org.koin.core.KoinApplication import com.kus.feature.splash.di.splashFeatureModule import com.kus.kustaurant.detail.di.detailDataModule +import com.kus.kustaurant.evaluate.di.evaluateDataModule import com.kus.kustaurant.home.di.homeDataModule import com.kus.shared.domain.detail.di.detailDomainModule +import com.kus.shared.domain.evaluate.di.evaluateDomainModule import com.kus.shared.domain.home.di.homeDomainModule import org.koin.core.context.startKoin import org.koin.core.module.Module @@ -40,6 +43,7 @@ fun initKoin( tierDomainModule, homeDomainModule, detailDomainModule, + evaluateDomainModule, // data (repository 등 공통) networkModule, @@ -48,6 +52,7 @@ fun initKoin( tierDataModule, homeDataModule, detailDataModule, + evaluateDataModule, // feature splashFeatureModule, @@ -55,7 +60,8 @@ fun initKoin( featureLoginModule, tierFeatureModule, homeFeatureModule, - detailFeatureModule + detailFeatureModule, + evaluateFeatureModule ) modules(additionalModules) diff --git a/settings.gradle.kts b/settings.gradle.kts index 896041ec..0fca3573 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -54,7 +54,8 @@ include( ":shared:data:tier", ":shared:data:auth", ":shared:data:home", - ":shared:data:detail" + ":shared:data:detail", + ":shared:data:evaluate" ) include( @@ -63,7 +64,8 @@ include( ":shared:domain:tier", ":shared:domain:auth", ":shared:domain:home", - ":shared:domain:detail" + ":shared:domain:detail", + ":shared:domain:evaluate" ) include( From 427e63b2daa019d142a471ed0572909a4902d7f1 Mon Sep 17 00:00:00 2001 From: TaejungKim <92737123+imtaejugkim@users.noreply.github.com> Date: Sun, 8 Mar 2026 15:13:49 +0900 Subject: [PATCH 02/22] =?UTF-8?q?[feat/#31]=20=ED=8F=89=EA=B0=80=ED=95=98?= =?UTF-8?q?=EA=B8=B0=20api=20data=20=EB=AA=A8=EB=93=88=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- shared/data/evaluate/build.gradle.kts | 87 +++++++++++++++++++ .../src/androidMain/AndroidManifest.xml | 4 + .../kustaurant/evaluate/api/EvaluateApi.kt | 56 ++++++++++++ .../evaluate/di/evaluateDataModule.kt | 15 ++++ .../remote/request/EvaluationRequest.kt | 10 +++ .../repositoryimpl/EvaluateRepositoryImpl.kt | 28 ++++++ 6 files changed, 200 insertions(+) create mode 100644 shared/data/evaluate/build.gradle.kts create mode 100644 shared/data/evaluate/src/androidMain/AndroidManifest.xml create mode 100644 shared/data/evaluate/src/commonMain/kotlin/com/kus/kustaurant/evaluate/api/EvaluateApi.kt create mode 100644 shared/data/evaluate/src/commonMain/kotlin/com/kus/kustaurant/evaluate/di/evaluateDataModule.kt create mode 100644 shared/data/evaluate/src/commonMain/kotlin/com/kus/kustaurant/evaluate/remote/request/EvaluationRequest.kt create mode 100644 shared/data/evaluate/src/commonMain/kotlin/com/kus/kustaurant/evaluate/repositoryimpl/EvaluateRepositoryImpl.kt diff --git a/shared/data/evaluate/build.gradle.kts b/shared/data/evaluate/build.gradle.kts new file mode 100644 index 00000000..b3c1d87f --- /dev/null +++ b/shared/data/evaluate/build.gradle.kts @@ -0,0 +1,87 @@ +plugins { + alias(libs.plugins.kotlinMultiplatform) + alias(libs.plugins.androidKotlinMultiplatformLibrary) + alias(libs.plugins.androidLint) + alias(libs.plugins.kotlin.serialization) +} + +kotlin { + androidLibrary { + namespace = "com.kus.shared.data.evaluate" + compileSdk = 36 + minSdk = 26 + + withHostTestBuilder { + } + + withDeviceTestBuilder { + sourceSetTreeName = "test" + }.configure { + instrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + } + } + + val xcfName = "shared:data:evaluateKit" + + iosX64 { + binaries.framework { + baseName = xcfName + } + } + + iosArm64 { + binaries.framework { + baseName = xcfName + } + } + + iosSimulatorArm64 { + binaries.framework { + baseName = xcfName + } + } + + jvm("desktop") + + sourceSets { + commonMain { + dependencies { + implementation(libs.kotlinx.coroutines.core) + + implementation(libs.kotlinx.serialization.json) + implementation(libs.bundles.ktor) + + implementation(project(":shared:domain:model")) + implementation(project(":shared:domain:evaluate")) + implementation(project(":shared:data:network")) + } + } + + commonTest { + dependencies { + implementation(libs.kotlin.test) + } + } + + androidMain { + dependencies { + implementation(libs.koin.android) + implementation(libs.datastore.preferences) + } + } + + getByName("androidDeviceTest") { + dependencies { + implementation(libs.androidx.runner) + implementation(libs.androidx.core) + implementation(libs.androidx.testExt.junit) + } + } + + iosMain { + dependencies { + } + } + } + +} diff --git a/shared/data/evaluate/src/androidMain/AndroidManifest.xml b/shared/data/evaluate/src/androidMain/AndroidManifest.xml new file mode 100644 index 00000000..8bdb7e14 --- /dev/null +++ b/shared/data/evaluate/src/androidMain/AndroidManifest.xml @@ -0,0 +1,4 @@ + + + + diff --git a/shared/data/evaluate/src/commonMain/kotlin/com/kus/kustaurant/evaluate/api/EvaluateApi.kt b/shared/data/evaluate/src/commonMain/kotlin/com/kus/kustaurant/evaluate/api/EvaluateApi.kt new file mode 100644 index 00000000..24e4838e --- /dev/null +++ b/shared/data/evaluate/src/commonMain/kotlin/com/kus/kustaurant/evaluate/api/EvaluateApi.kt @@ -0,0 +1,56 @@ +package com.kus.kustaurant.evaluate.api + +import com.kus.kustaurant.evaluate.remote.request.EvaluationRequest +import io.ktor.client.HttpClient +import io.ktor.client.request.forms.MultiPartFormDataContent +import io.ktor.client.request.forms.formData +import io.ktor.client.request.post +import io.ktor.client.request.setBody +import io.ktor.http.ContentType +import io.ktor.http.Headers +import io.ktor.http.HttpHeaders +import io.ktor.http.contentType +import kotlinx.serialization.encodeToString +import kotlinx.serialization.json.Json + +class EvaluateApi( + private val client: HttpClient, + private val json: Json, +) { + suspend fun postEvaluation( + restaurantId: Long, + request: EvaluationRequest, + imageBytes: ByteArray?, + ) { + if (imageBytes != null) { + client.post("/api/v2/auth/restaurants/$restaurantId/evaluation") { + setBody( + MultiPartFormDataContent( + formData { + append( + key = "evaluationDTO", + value = json.encodeToString(request), + headers = Headers.build { + append(HttpHeaders.ContentType, ContentType.Application.Json.toString()) + } + ) + append( + key = "newImage", + value = imageBytes, + headers = Headers.build { + append(HttpHeaders.ContentType, "image/jpeg") + append(HttpHeaders.ContentDisposition, "filename=evaluation.jpg") + } + ) + } + ) + ) + } + } else { + client.post("/api/v2/auth/restaurants/$restaurantId/evaluation") { + contentType(ContentType.Application.Json) + setBody(request) + } + } + } +} diff --git a/shared/data/evaluate/src/commonMain/kotlin/com/kus/kustaurant/evaluate/di/evaluateDataModule.kt b/shared/data/evaluate/src/commonMain/kotlin/com/kus/kustaurant/evaluate/di/evaluateDataModule.kt new file mode 100644 index 00000000..3d9cd69f --- /dev/null +++ b/shared/data/evaluate/src/commonMain/kotlin/com/kus/kustaurant/evaluate/di/evaluateDataModule.kt @@ -0,0 +1,15 @@ +package com.kus.kustaurant.evaluate.di + +import com.kus.kustaurant.evaluate.api.EvaluateApi +import com.kus.kustaurant.evaluate.repositoryimpl.EvaluateRepositoryImpl +import com.kus.shared.domain.evaluate.repository.EvaluateRepository +import kotlinx.serialization.json.Json +import org.koin.core.module.dsl.singleOf +import org.koin.dsl.bind +import org.koin.dsl.module + +val evaluateDataModule = module { + single { Json { ignoreUnknownKeys = true } } + singleOf(::EvaluateApi) + singleOf(::EvaluateRepositoryImpl) bind EvaluateRepository::class +} diff --git a/shared/data/evaluate/src/commonMain/kotlin/com/kus/kustaurant/evaluate/remote/request/EvaluationRequest.kt b/shared/data/evaluate/src/commonMain/kotlin/com/kus/kustaurant/evaluate/remote/request/EvaluationRequest.kt new file mode 100644 index 00000000..3028f86f --- /dev/null +++ b/shared/data/evaluate/src/commonMain/kotlin/com/kus/kustaurant/evaluate/remote/request/EvaluationRequest.kt @@ -0,0 +1,10 @@ +package com.kus.kustaurant.evaluate.remote.request + +import kotlinx.serialization.Serializable + +@Serializable +data class EvaluationRequest( + val evaluationScore: Double, + val evaluationSituations: List? = null, + val evaluationComment: String? = null, +) diff --git a/shared/data/evaluate/src/commonMain/kotlin/com/kus/kustaurant/evaluate/repositoryimpl/EvaluateRepositoryImpl.kt b/shared/data/evaluate/src/commonMain/kotlin/com/kus/kustaurant/evaluate/repositoryimpl/EvaluateRepositoryImpl.kt new file mode 100644 index 00000000..62541f34 --- /dev/null +++ b/shared/data/evaluate/src/commonMain/kotlin/com/kus/kustaurant/evaluate/repositoryimpl/EvaluateRepositoryImpl.kt @@ -0,0 +1,28 @@ +package com.kus.kustaurant.evaluate.repositoryimpl + +import com.kus.kustaurant.evaluate.api.EvaluateApi +import com.kus.kustaurant.evaluate.remote.request.EvaluationRequest +import com.kus.shared.domain.evaluate.repository.EvaluateRepository + +class EvaluateRepositoryImpl( + private val api: EvaluateApi, +) : EvaluateRepository { + override suspend fun postEvaluation( + restaurantId: Long, + evaluationScore: Double, + evaluationSituations: List?, + evaluationComment: String?, + imageBytes: ByteArray?, + ) { + val request = EvaluationRequest( + evaluationScore = evaluationScore, + evaluationSituations = evaluationSituations?.takeIf { it.isNotEmpty() }, + evaluationComment = evaluationComment?.takeIf { it.isNotBlank() }, + ) + api.postEvaluation( + restaurantId = restaurantId, + request = request, + imageBytes = imageBytes, + ) + } +} From 6cfb0e44b1445329c66dc5d2f986b6b533ad9c40 Mon Sep 17 00:00:00 2001 From: TaejungKim <92737123+imtaejugkim@users.noreply.github.com> Date: Sun, 8 Mar 2026 15:17:48 +0900 Subject: [PATCH 03/22] =?UTF-8?q?[feat/#31]=20=ED=8F=89=EA=B0=80=ED=95=98?= =?UTF-8?q?=EA=B8=B0=20api=20domain=20=EB=AA=A8=EB=93=88=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- shared/domain/evaluate/build.gradle.kts | 78 +++++++++++++++++++ .../src/androidMain/AndroidManifest.xml | 4 + .../evaluate/di/evaluateDomainModule.kt | 9 +++ .../evaluate/repository/EvaluateRepository.kt | 11 +++ .../evaluate/usecase/PostEvaluationUseCase.kt | 23 ++++++ 5 files changed, 125 insertions(+) create mode 100644 shared/domain/evaluate/build.gradle.kts create mode 100644 shared/domain/evaluate/src/androidMain/AndroidManifest.xml create mode 100644 shared/domain/evaluate/src/commonMain/kotlin/com/kus/shared/domain/evaluate/di/evaluateDomainModule.kt create mode 100644 shared/domain/evaluate/src/commonMain/kotlin/com/kus/shared/domain/evaluate/repository/EvaluateRepository.kt create mode 100644 shared/domain/evaluate/src/commonMain/kotlin/com/kus/shared/domain/evaluate/usecase/PostEvaluationUseCase.kt diff --git a/shared/domain/evaluate/build.gradle.kts b/shared/domain/evaluate/build.gradle.kts new file mode 100644 index 00000000..d77d1d0a --- /dev/null +++ b/shared/domain/evaluate/build.gradle.kts @@ -0,0 +1,78 @@ +plugins { + alias(libs.plugins.kotlinMultiplatform) + alias(libs.plugins.androidKotlinMultiplatformLibrary) + alias(libs.plugins.androidLint) +} + +kotlin { + androidLibrary { + namespace = "com.kus.shared.domain.evaluate" + compileSdk = 36 + minSdk = 26 + + withHostTestBuilder { + } + + withDeviceTestBuilder { + sourceSetTreeName = "test" + }.configure { + instrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + } + } + + val xcfName = "shared:domain:evaluateKit" + + iosX64 { + binaries.framework { + baseName = xcfName + } + } + + iosArm64 { + binaries.framework { + baseName = xcfName + } + } + + iosSimulatorArm64 { + binaries.framework { + baseName = xcfName + } + } + + jvm("desktop") + + sourceSets { + commonMain { + dependencies { + implementation(libs.kotlinx.coroutines.core) + api(libs.koin.core) + implementation(project(":shared:domain:model")) + } + } + + commonTest { + dependencies { + implementation(libs.kotlin.test) + } + } + + androidMain { + dependencies { + } + } + + getByName("androidDeviceTest") { + dependencies { + implementation(libs.androidx.runner) + implementation(libs.androidx.core) + implementation(libs.androidx.testExt.junit) + } + } + + iosMain { + dependencies { + } + } + } +} diff --git a/shared/domain/evaluate/src/androidMain/AndroidManifest.xml b/shared/domain/evaluate/src/androidMain/AndroidManifest.xml new file mode 100644 index 00000000..8bdb7e14 --- /dev/null +++ b/shared/domain/evaluate/src/androidMain/AndroidManifest.xml @@ -0,0 +1,4 @@ + + + + diff --git a/shared/domain/evaluate/src/commonMain/kotlin/com/kus/shared/domain/evaluate/di/evaluateDomainModule.kt b/shared/domain/evaluate/src/commonMain/kotlin/com/kus/shared/domain/evaluate/di/evaluateDomainModule.kt new file mode 100644 index 00000000..4b125b2c --- /dev/null +++ b/shared/domain/evaluate/src/commonMain/kotlin/com/kus/shared/domain/evaluate/di/evaluateDomainModule.kt @@ -0,0 +1,9 @@ +package com.kus.shared.domain.evaluate.di + +import com.kus.shared.domain.evaluate.usecase.PostEvaluationUseCase +import org.koin.core.module.dsl.singleOf +import org.koin.dsl.module + +val evaluateDomainModule = module { + singleOf(::PostEvaluationUseCase) +} diff --git a/shared/domain/evaluate/src/commonMain/kotlin/com/kus/shared/domain/evaluate/repository/EvaluateRepository.kt b/shared/domain/evaluate/src/commonMain/kotlin/com/kus/shared/domain/evaluate/repository/EvaluateRepository.kt new file mode 100644 index 00000000..ae9ac1ae --- /dev/null +++ b/shared/domain/evaluate/src/commonMain/kotlin/com/kus/shared/domain/evaluate/repository/EvaluateRepository.kt @@ -0,0 +1,11 @@ +package com.kus.shared.domain.evaluate.repository + +interface EvaluateRepository { + suspend fun postEvaluation( + restaurantId: Long, + evaluationScore: Double, + evaluationSituations: List?, + evaluationComment: String?, + imageBytes: ByteArray?, + ) +} diff --git a/shared/domain/evaluate/src/commonMain/kotlin/com/kus/shared/domain/evaluate/usecase/PostEvaluationUseCase.kt b/shared/domain/evaluate/src/commonMain/kotlin/com/kus/shared/domain/evaluate/usecase/PostEvaluationUseCase.kt new file mode 100644 index 00000000..8516a15f --- /dev/null +++ b/shared/domain/evaluate/src/commonMain/kotlin/com/kus/shared/domain/evaluate/usecase/PostEvaluationUseCase.kt @@ -0,0 +1,23 @@ +package com.kus.shared.domain.evaluate.usecase + +import com.kus.shared.domain.evaluate.repository.EvaluateRepository + +class PostEvaluationUseCase( + private val evaluateRepository: EvaluateRepository, +) { + suspend operator fun invoke( + restaurantId: Long, + evaluationScore: Double, + evaluationSituations: List?, + evaluationComment: String?, + imageBytes: ByteArray?, + ) { + evaluateRepository.postEvaluation( + restaurantId = restaurantId, + evaluationScore = evaluationScore, + evaluationSituations = evaluationSituations, + evaluationComment = evaluationComment, + imageBytes = imageBytes, + ) + } +} From 0f4964fd73e07cb6d1c9304c4699350dde594864 Mon Sep 17 00:00:00 2001 From: TaejungKim <92737123+imtaejugkim@users.noreply.github.com> Date: Sun, 8 Mar 2026 15:19:24 +0900 Subject: [PATCH 04/22] =?UTF-8?q?[feat/#31]=20=ED=8F=89=EA=B0=80=ED=95=98?= =?UTF-8?q?=EA=B8=B0=20api=20viewmodel=20=EC=97=B0=EB=8F=99=20=EB=B0=8F=20?= =?UTF-8?q?UIState=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- shared/feature/evaluate/build.gradle.kts | 3 + .../evaluate/di/evaluateFeatureModule.kt | 9 ++ .../feature/evaluate/ui/EvaluateContract.kt | 3 + .../feature/evaluate/ui/EvaluateViewModel.kt | 103 +++++++----------- 4 files changed, 57 insertions(+), 61 deletions(-) create mode 100644 shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/di/evaluateFeatureModule.kt diff --git a/shared/feature/evaluate/build.gradle.kts b/shared/feature/evaluate/build.gradle.kts index 058a3f29..eec25ff4 100644 --- a/shared/feature/evaluate/build.gradle.kts +++ b/shared/feature/evaluate/build.gradle.kts @@ -53,7 +53,10 @@ kotlin { implementation(libs.kamel.image.default) implementation(project(":shared:core:designSystem")) + implementation(project(":shared:core:presentation")) implementation(project(":shared:data:network")) + implementation(project(":shared:domain:evaluate")) + implementation(project(":shared:domain:model")) resources.srcDir("src/commonMain/composeResources") } diff --git a/shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/di/evaluateFeatureModule.kt b/shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/di/evaluateFeatureModule.kt new file mode 100644 index 00000000..0e04bac9 --- /dev/null +++ b/shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/di/evaluateFeatureModule.kt @@ -0,0 +1,9 @@ +package com.kus.feature.evaluate.di + +import com.kus.feature.evaluate.ui.EvaluateViewModel +import org.koin.core.module.dsl.viewModelOf +import org.koin.dsl.module + +val evaluateFeatureModule = module { + viewModelOf(::EvaluateViewModel) +} diff --git a/shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/ui/EvaluateContract.kt b/shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/ui/EvaluateContract.kt index db831e8a..b734d611 100644 --- a/shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/ui/EvaluateContract.kt +++ b/shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/ui/EvaluateContract.kt @@ -1,8 +1,11 @@ package com.kus.feature.evaluate.ui +import UiState + data class EvaluateUiState( val restaurant: EvaluateRestaurant = EvaluateRestaurant.empty(), val evaluation: Evaluation = Evaluation.empty(), + val submitState: UiState = UiState.Idle, ) data class EvaluateRestaurant( diff --git a/shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/ui/EvaluateViewModel.kt b/shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/ui/EvaluateViewModel.kt index a0b523c3..f709eab0 100644 --- a/shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/ui/EvaluateViewModel.kt +++ b/shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/ui/EvaluateViewModel.kt @@ -1,96 +1,77 @@ package com.kus.feature.evaluate.ui +import UiError +import UiState import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.kus.shared.domain.evaluate.usecase.PostEvaluationUseCase import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch -class EvaluateViewModel : ViewModel() { +class EvaluateViewModel( + private val postEvaluationUseCase: PostEvaluationUseCase, +) : ViewModel() { private val _uiState = MutableStateFlow(EvaluateUiState()) val uiState: StateFlow = _uiState.asStateFlow() - init { - _uiState.value = EvaluateUiState( - restaurant = EvaluateRestaurant( - restaurantId = 1, - restaurantName = "제주곤이칼국수 건대점", - mainTier = 1, - restaurantCuisine = "한식", - restaurantCuisineImgUrl = "https://kustaurant.s3.ap-northeast-2.amazonaws.com/common/cuisine-icon/카페디저트.svg", - restaurantPosition = "건입~중문", - restaurantAddress = "서울시 광진구 어딘가 222-22, 304호", - situationList = arrayListOf("혼밥", "배달"), - partnershipInfo = "학생증 제시 시에 전메뉴 10% 할인 대박!!!! 학생증 제시 시에 전메뉴 10% 할인 대박!!!! 학생증 제시 시에 전메뉴 10% 할인 대박!!!! 학생증 제시 시에 전메뉴 10% 할인 대박!!!!" - ), - evaluation = Evaluation( - evaluationScore = 4.5, - evaluationSituations = listOf(1, 3, 7), - evaluationImgUrl = "https://picsum.photos/seed/evaluation1/400/300", - evaluationComment = "오 좀 맛있는데?", - starComments = listOf( - StarComment( - star = 4.5, - comment = "인생 최고의 식당입니다." - ), - StarComment( - star = 5.0, - comment = "다시 와도 좋을 것 같아요." - ), - StarComment( - star = 4.0, - comment = "가격 대비 훌륭합니다." - ) - ) - ) - ) + fun initRestaurant(restaurant: EvaluateRestaurant) { + _uiState.update { it.copy(restaurant = restaurant) } } fun updateEvaluationScore(score: Double) { - _uiState.value = _uiState.value.copy( - evaluation = _uiState.value.evaluation.copy(evaluationScore = score) - ) + _uiState.update { it.copy(evaluation = it.evaluation.copy(evaluationScore = score)) } } fun updateEvaluationComment(comment: String) { - _uiState.value = _uiState.value.copy( - evaluation = _uiState.value.evaluation.copy(evaluationComment = comment) - ) + _uiState.update { it.copy(evaluation = it.evaluation.copy(evaluationComment = comment)) } } fun updateEvaluationSituations(situations: List) { - _uiState.value = _uiState.value.copy( - evaluation = _uiState.value.evaluation.copy(evaluationSituations = situations) - ) + _uiState.update { it.copy(evaluation = it.evaluation.copy(evaluationSituations = situations)) } } fun updateEvaluationImage(imageUrl: String) { - _uiState.value = _uiState.value.copy( - evaluation = _uiState.value.evaluation.copy(evaluationImgUrl = imageUrl) - ) + _uiState.update { it.copy(evaluation = it.evaluation.copy(evaluationImgUrl = imageUrl)) } } fun updateImageBytes(imageBytes: ByteArray) { - _uiState.value = _uiState.value.copy( - evaluation = _uiState.value.evaluation.copy(imageBytes = imageBytes.copyOf()) - ) + _uiState.update { it.copy(evaluation = it.evaluation.copy(imageBytes = imageBytes.copyOf())) } } fun addStarComment(starComment: StarComment) { - val updatedComments = _uiState.value.evaluation.starComments + starComment - _uiState.value = _uiState.value.copy( - evaluation = _uiState.value.evaluation.copy(starComments = updatedComments) - ) + _uiState.update { + it.copy(evaluation = it.evaluation.copy(starComments = it.evaluation.starComments + starComment)) + } } fun removeStarComment(index: Int) { - val updatedComments = _uiState.value.evaluation.starComments.filterIndexed { i, _ -> i != index } - _uiState.value = _uiState.value.copy( - evaluation = _uiState.value.evaluation.copy(starComments = updatedComments) - ) + _uiState.update { + it.copy( + evaluation = it.evaluation.copy( + starComments = it.evaluation.starComments.filterIndexed { i, _ -> i != index } + ) + ) + } } - fun submitEvaluation() { - // TODO: API 호출 로직 구현 - // 평가 데이터를 서버로 전송 + fun submitEvaluation() = viewModelScope.launch { + val state = _uiState.value + _uiState.update { it.copy(submitState = UiState.Loading) } + runCatching { + postEvaluationUseCase( + restaurantId = state.restaurant.restaurantId.toLong(), + evaluationScore = state.evaluation.evaluationScore, + evaluationSituations = state.evaluation.evaluationSituations.takeIf { it.isNotEmpty() }, + evaluationComment = state.evaluation.evaluationComment.takeIf { it.isNotBlank() }, + imageBytes = state.evaluation.imageBytes, + ) + }.onSuccess { + _uiState.update { it.copy(submitState = UiState.Success(Unit)) } + }.onFailure { + _uiState.update { it.copy(submitState = UiState.Failure(UiError.Network)) } + } } } From deeda149be0e12eed8b044a640959609bbe8cd6d Mon Sep 17 00:00:00 2001 From: TaejungKim <92737123+imtaejugkim@users.noreply.github.com> Date: Sun, 8 Mar 2026 15:20:02 +0900 Subject: [PATCH 05/22] =?UTF-8?q?[feat/#31]=20=ED=8F=89=EA=B0=80=ED=95=98?= =?UTF-8?q?=EA=B8=B0=20api=20koin=20=EC=97=B0=EB=8F=99=20=EB=B0=8F=20?= =?UTF-8?q?=EC=83=81=ED=83=9C=EC=97=90=20=EB=94=B0=EB=A5=B8=20ui=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kus/feature/evaluate/ui/EvaluateScreen.kt | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/ui/EvaluateScreen.kt b/shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/ui/EvaluateScreen.kt index 8cabd40c..c11aa5a9 100644 --- a/shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/ui/EvaluateScreen.kt +++ b/shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/ui/EvaluateScreen.kt @@ -11,13 +11,15 @@ import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Text +import UiState import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp -import androidx.lifecycle.viewmodel.compose.viewModel +import org.koin.compose.viewmodel.koinViewModel import com.kus.designsystem.component.KusButton import com.kus.designsystem.component.KusTopBar import com.kus.designsystem.theme.KusTheme @@ -35,12 +37,21 @@ import org.jetbrains.compose.resources.painterResource @Composable fun EvaluateScreen( onBackClick: () -> Unit, - viewModel: EvaluateViewModel = viewModel { EvaluateViewModel() }, + viewModel: EvaluateViewModel = koinViewModel(), ) { val uiState by viewModel.uiState.collectAsState() val restaurant = uiState.restaurant val evaluation = uiState.evaluation + val submitState = uiState.submitState val isRatingSelected = evaluation.evaluationScore != 0.0 + val isSubmitting = submitState is UiState.Loading + + LaunchedEffect(submitState) { + if (submitState is UiState.Success) { + onBackClick() + } + } + val submitButtonColor = if (isRatingSelected) { KusTheme.colors.c_43AB38 } else { @@ -140,15 +151,14 @@ fun EvaluateScreen( .align(Alignment.BottomCenter), ) { KusButton( - enabled = isRatingSelected, - buttonName = "평가 제출하기", + enabled = isRatingSelected && !isSubmitting, + buttonName = if (isSubmitting) "제출 중..." else "평가 제출하기", roundedCornerShape = RoundedCornerShape(50.dp), containerColor = submitButtonColor, borderColor = submitButtonColor, onClick = { - if (!isRatingSelected) return@KusButton + if (!isRatingSelected || isSubmitting) return@KusButton viewModel.submitEvaluation() - onBackClick() } ) } From 7d381e5288c3a10446ec188654070aaa8ed3e338 Mon Sep 17 00:00:00 2001 From: TaejungKim <92737123+imtaejugkim@users.noreply.github.com> Date: Sun, 8 Mar 2026 16:09:05 +0900 Subject: [PATCH 06/22] =?UTF-8?q?[feat/#31]=20=EC=9D=B4=EC=A0=84=20?= =?UTF-8?q?=ED=8F=89=EA=B0=80=20=EA=B0=80=EC=A0=B8=EC=98=A4=EA=B8=B0=20api?= =?UTF-8?q?=20data=20=EB=AA=A8=EB=93=88=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kustaurant/evaluate/api/EvaluateApi.kt | 7 +++++++ .../evaluate/remote/mapper/EvaluateMapper.kt | 21 +++++++++++++++++++ .../remote/response/EvaluationResponse.kt | 19 +++++++++++++++++ .../repositoryimpl/EvaluateRepositoryImpl.kt | 5 +++++ 4 files changed, 52 insertions(+) create mode 100644 shared/data/evaluate/src/commonMain/kotlin/com/kus/kustaurant/evaluate/remote/mapper/EvaluateMapper.kt create mode 100644 shared/data/evaluate/src/commonMain/kotlin/com/kus/kustaurant/evaluate/remote/response/EvaluationResponse.kt diff --git a/shared/data/evaluate/src/commonMain/kotlin/com/kus/kustaurant/evaluate/api/EvaluateApi.kt b/shared/data/evaluate/src/commonMain/kotlin/com/kus/kustaurant/evaluate/api/EvaluateApi.kt index 24e4838e..7959af2d 100644 --- a/shared/data/evaluate/src/commonMain/kotlin/com/kus/kustaurant/evaluate/api/EvaluateApi.kt +++ b/shared/data/evaluate/src/commonMain/kotlin/com/kus/kustaurant/evaluate/api/EvaluateApi.kt @@ -1,9 +1,12 @@ package com.kus.kustaurant.evaluate.api import com.kus.kustaurant.evaluate.remote.request.EvaluationRequest +import com.kus.kustaurant.evaluate.remote.response.EvaluationResponse import io.ktor.client.HttpClient +import io.ktor.client.call.body import io.ktor.client.request.forms.MultiPartFormDataContent import io.ktor.client.request.forms.formData +import io.ktor.client.request.get import io.ktor.client.request.post import io.ktor.client.request.setBody import io.ktor.http.ContentType @@ -17,6 +20,10 @@ class EvaluateApi( private val client: HttpClient, private val json: Json, ) { + suspend fun getEvaluation(restaurantId: Long): EvaluationResponse { + return client.get("/api/v2/auth/restaurants/$restaurantId/evaluation").body() + } + suspend fun postEvaluation( restaurantId: Long, request: EvaluationRequest, diff --git a/shared/data/evaluate/src/commonMain/kotlin/com/kus/kustaurant/evaluate/remote/mapper/EvaluateMapper.kt b/shared/data/evaluate/src/commonMain/kotlin/com/kus/kustaurant/evaluate/remote/mapper/EvaluateMapper.kt new file mode 100644 index 00000000..7cbf8ca5 --- /dev/null +++ b/shared/data/evaluate/src/commonMain/kotlin/com/kus/kustaurant/evaluate/remote/mapper/EvaluateMapper.kt @@ -0,0 +1,21 @@ +package com.kus.kustaurant.evaluate.remote.mapper + +import com.kus.kustaurant.evaluate.remote.response.EvaluationResponse +import com.kus.kustaurant.evaluate.remote.response.StarCommentResponse +import com.kus.shared.domain.model.evaluate.PreviousEvaluation +import com.kus.shared.domain.model.evaluate.PreviousStarComment + +fun EvaluationResponse.toDomain(): PreviousEvaluation = + PreviousEvaluation( + evaluationScore = evaluationScore, + evaluationSituations = evaluationSituations ?: emptyList(), + evaluationImgUrl = evaluationImgUrl, + evaluationComment = evaluationComment, + starComments = starComments.map { it.toDomain() }, + ) + +fun StarCommentResponse.toDomain(): PreviousStarComment = + PreviousStarComment( + star = star, + comment = comment, + ) diff --git a/shared/data/evaluate/src/commonMain/kotlin/com/kus/kustaurant/evaluate/remote/response/EvaluationResponse.kt b/shared/data/evaluate/src/commonMain/kotlin/com/kus/kustaurant/evaluate/remote/response/EvaluationResponse.kt new file mode 100644 index 00000000..1c157d33 --- /dev/null +++ b/shared/data/evaluate/src/commonMain/kotlin/com/kus/kustaurant/evaluate/remote/response/EvaluationResponse.kt @@ -0,0 +1,19 @@ +package com.kus.kustaurant.evaluate.remote.response + +import kotlinx.serialization.Serializable + +@Serializable +data class EvaluationResponse( + val evaluationScore: Double? = null, + val evaluationSituations: List? = null, + val evaluationImgUrl: String? = null, + val evaluationComment: String? = null, + val starComments: List = emptyList(), + val newImage: String? = null, +) + +@Serializable +data class StarCommentResponse( + val star: Double, + val comment: String, +) diff --git a/shared/data/evaluate/src/commonMain/kotlin/com/kus/kustaurant/evaluate/repositoryimpl/EvaluateRepositoryImpl.kt b/shared/data/evaluate/src/commonMain/kotlin/com/kus/kustaurant/evaluate/repositoryimpl/EvaluateRepositoryImpl.kt index 62541f34..ce373c9f 100644 --- a/shared/data/evaluate/src/commonMain/kotlin/com/kus/kustaurant/evaluate/repositoryimpl/EvaluateRepositoryImpl.kt +++ b/shared/data/evaluate/src/commonMain/kotlin/com/kus/kustaurant/evaluate/repositoryimpl/EvaluateRepositoryImpl.kt @@ -1,12 +1,17 @@ package com.kus.kustaurant.evaluate.repositoryimpl import com.kus.kustaurant.evaluate.api.EvaluateApi +import com.kus.kustaurant.evaluate.remote.mapper.toDomain import com.kus.kustaurant.evaluate.remote.request.EvaluationRequest import com.kus.shared.domain.evaluate.repository.EvaluateRepository +import com.kus.shared.domain.model.evaluate.PreviousEvaluation class EvaluateRepositoryImpl( private val api: EvaluateApi, ) : EvaluateRepository { + override suspend fun getEvaluation(restaurantId: Long): PreviousEvaluation = + api.getEvaluation(restaurantId).toDomain() + override suspend fun postEvaluation( restaurantId: Long, evaluationScore: Double, From edf965aa843803b690db69c64a5fddcb96d73395 Mon Sep 17 00:00:00 2001 From: TaejungKim <92737123+imtaejugkim@users.noreply.github.com> Date: Sun, 8 Mar 2026 16:10:00 +0900 Subject: [PATCH 07/22] =?UTF-8?q?[feat/#31]=20=EC=9D=B4=EC=A0=BC=20?= =?UTF-8?q?=ED=8F=89=EA=B0=80=20=EA=B0=80=EC=A0=B8=EC=98=A4=EA=B8=B0=20api?= =?UTF-8?q?=20domain=20=EB=AA=A8=EB=93=88=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/evaluate/di/evaluateDomainModule.kt | 2 ++ .../evaluate/repository/EvaluateRepository.kt | 4 ++++ .../evaluate/usecase/GetEvaluationUseCase.kt | 12 ++++++++++++ .../domain/model/evaluate/PreviousEvaluation.kt | 14 ++++++++++++++ 4 files changed, 32 insertions(+) create mode 100644 shared/domain/evaluate/src/commonMain/kotlin/com/kus/shared/domain/evaluate/usecase/GetEvaluationUseCase.kt create mode 100644 shared/domain/model/src/commonMain/kotlin/com/kus/shared/domain/model/evaluate/PreviousEvaluation.kt diff --git a/shared/domain/evaluate/src/commonMain/kotlin/com/kus/shared/domain/evaluate/di/evaluateDomainModule.kt b/shared/domain/evaluate/src/commonMain/kotlin/com/kus/shared/domain/evaluate/di/evaluateDomainModule.kt index 4b125b2c..51988fa5 100644 --- a/shared/domain/evaluate/src/commonMain/kotlin/com/kus/shared/domain/evaluate/di/evaluateDomainModule.kt +++ b/shared/domain/evaluate/src/commonMain/kotlin/com/kus/shared/domain/evaluate/di/evaluateDomainModule.kt @@ -1,9 +1,11 @@ package com.kus.shared.domain.evaluate.di +import com.kus.shared.domain.evaluate.usecase.GetEvaluationUseCase import com.kus.shared.domain.evaluate.usecase.PostEvaluationUseCase import org.koin.core.module.dsl.singleOf import org.koin.dsl.module val evaluateDomainModule = module { + singleOf(::GetEvaluationUseCase) singleOf(::PostEvaluationUseCase) } diff --git a/shared/domain/evaluate/src/commonMain/kotlin/com/kus/shared/domain/evaluate/repository/EvaluateRepository.kt b/shared/domain/evaluate/src/commonMain/kotlin/com/kus/shared/domain/evaluate/repository/EvaluateRepository.kt index ae9ac1ae..b35d52ae 100644 --- a/shared/domain/evaluate/src/commonMain/kotlin/com/kus/shared/domain/evaluate/repository/EvaluateRepository.kt +++ b/shared/domain/evaluate/src/commonMain/kotlin/com/kus/shared/domain/evaluate/repository/EvaluateRepository.kt @@ -1,6 +1,10 @@ package com.kus.shared.domain.evaluate.repository +import com.kus.shared.domain.model.evaluate.PreviousEvaluation + interface EvaluateRepository { + suspend fun getEvaluation(restaurantId: Long): PreviousEvaluation + suspend fun postEvaluation( restaurantId: Long, evaluationScore: Double, diff --git a/shared/domain/evaluate/src/commonMain/kotlin/com/kus/shared/domain/evaluate/usecase/GetEvaluationUseCase.kt b/shared/domain/evaluate/src/commonMain/kotlin/com/kus/shared/domain/evaluate/usecase/GetEvaluationUseCase.kt new file mode 100644 index 00000000..2ff279dd --- /dev/null +++ b/shared/domain/evaluate/src/commonMain/kotlin/com/kus/shared/domain/evaluate/usecase/GetEvaluationUseCase.kt @@ -0,0 +1,12 @@ +package com.kus.shared.domain.evaluate.usecase + +import com.kus.shared.domain.evaluate.repository.EvaluateRepository +import com.kus.shared.domain.model.evaluate.PreviousEvaluation + +class GetEvaluationUseCase( + private val evaluateRepository: EvaluateRepository, +) { + suspend operator fun invoke(restaurantId: Long): PreviousEvaluation { + return evaluateRepository.getEvaluation(restaurantId) + } +} diff --git a/shared/domain/model/src/commonMain/kotlin/com/kus/shared/domain/model/evaluate/PreviousEvaluation.kt b/shared/domain/model/src/commonMain/kotlin/com/kus/shared/domain/model/evaluate/PreviousEvaluation.kt new file mode 100644 index 00000000..6ed7776f --- /dev/null +++ b/shared/domain/model/src/commonMain/kotlin/com/kus/shared/domain/model/evaluate/PreviousEvaluation.kt @@ -0,0 +1,14 @@ +package com.kus.shared.domain.model.evaluate + +data class PreviousEvaluation( + val evaluationScore: Double?, + val evaluationSituations: List, + val evaluationImgUrl: String?, + val evaluationComment: String?, + val starComments: List, +) + +data class PreviousStarComment( + val star: Double, + val comment: String, +) From 7f7cd90926fa8fc088d75915c760ada684e99b3e Mon Sep 17 00:00:00 2001 From: TaejungKim <92737123+imtaejugkim@users.noreply.github.com> Date: Sun, 8 Mar 2026 16:11:11 +0900 Subject: [PATCH 08/22] =?UTF-8?q?[mod/#31]=20=ED=8F=89=EA=B0=80=20?= =?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EC=B4=88=EA=B8=B0=ED=99=94=20?= =?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EC=88=98=EC=A0=95=20=EB=B0=8F=20?= =?UTF-8?q?UiState,=20=EB=AA=A8=EB=8D=B8=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../evaluate/model/EvaluateRestaurant.kt | 27 +++++++++ .../kus/feature/evaluate/model/Evaluation.kt | 26 ++++++++ .../feature/evaluate/state/EvaluateUiState.kt | 11 ++++ .../feature/evaluate/ui/EvaluateContract.kt | 60 ------------------- 4 files changed, 64 insertions(+), 60 deletions(-) create mode 100644 shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/model/EvaluateRestaurant.kt create mode 100644 shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/model/Evaluation.kt create mode 100644 shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/state/EvaluateUiState.kt delete mode 100644 shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/ui/EvaluateContract.kt diff --git a/shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/model/EvaluateRestaurant.kt b/shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/model/EvaluateRestaurant.kt new file mode 100644 index 00000000..eff905f4 --- /dev/null +++ b/shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/model/EvaluateRestaurant.kt @@ -0,0 +1,27 @@ +package com.kus.feature.evaluate.model + +data class EvaluateRestaurant( + val restaurantId: Int, + val restaurantName: String, + val mainTier: Int, + val restaurantCuisine: String, + val restaurantCuisineImgUrl: String, + val restaurantPosition: String, + val restaurantAddress: String, + val situationList: ArrayList, + val partnershipInfo: String, +) { + companion object { + fun empty() = EvaluateRestaurant( + restaurantId = 0, + restaurantName = "", + mainTier = 0, + restaurantCuisine = "", + restaurantCuisineImgUrl = "", + restaurantPosition = "", + restaurantAddress = "", + situationList = arrayListOf(), + partnershipInfo = "", + ) + } +} diff --git a/shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/model/Evaluation.kt b/shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/model/Evaluation.kt new file mode 100644 index 00000000..5fbd13f7 --- /dev/null +++ b/shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/model/Evaluation.kt @@ -0,0 +1,26 @@ +package com.kus.feature.evaluate.model + +data class Evaluation( + val evaluationScore: Double, + val evaluationSituations: List, + val evaluationImgUrl: String, + val evaluationComment: String, + val starComments: List, + val imageBytes: ByteArray? = null, +) { + companion object { + fun empty() = Evaluation( + evaluationScore = 0.0, + evaluationSituations = emptyList(), + evaluationImgUrl = "", + evaluationComment = "", + starComments = emptyList(), + imageBytes = null, + ) + } +} + +data class StarComment( + val star: Double, + val comment: String, +) diff --git a/shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/state/EvaluateUiState.kt b/shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/state/EvaluateUiState.kt new file mode 100644 index 00000000..04e8ce90 --- /dev/null +++ b/shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/state/EvaluateUiState.kt @@ -0,0 +1,11 @@ +package com.kus.feature.evaluate.state + +import UiState +import com.kus.feature.evaluate.model.Evaluation +import com.kus.feature.evaluate.model.EvaluateRestaurant + +data class EvaluateUiState( + val restaurant: EvaluateRestaurant = EvaluateRestaurant.empty(), + val evaluation: UiState = UiState.Loading, + val submitState: UiState = UiState.Idle, +) diff --git a/shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/ui/EvaluateContract.kt b/shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/ui/EvaluateContract.kt deleted file mode 100644 index b734d611..00000000 --- a/shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/ui/EvaluateContract.kt +++ /dev/null @@ -1,60 +0,0 @@ -package com.kus.feature.evaluate.ui - -import UiState - -data class EvaluateUiState( - val restaurant: EvaluateRestaurant = EvaluateRestaurant.empty(), - val evaluation: Evaluation = Evaluation.empty(), - val submitState: UiState = UiState.Idle, -) - -data class EvaluateRestaurant( - val restaurantId: Int, - val restaurantName: String, - val mainTier: Int, - val restaurantCuisine: String, - val restaurantCuisineImgUrl: String, - val restaurantPosition: String, - val restaurantAddress: String, - val situationList: ArrayList, - val partnershipInfo: String, -) { - companion object { - fun empty() = EvaluateRestaurant( - restaurantId = 0, - restaurantName = "", - mainTier = 0, - restaurantCuisine = "", - restaurantCuisineImgUrl = "", - restaurantPosition = "", - restaurantAddress = "", - situationList = arrayListOf(), - partnershipInfo = "", - ) - } -} - -data class Evaluation( - val evaluationScore: Double, - val evaluationSituations: List, - val evaluationImgUrl: String, - val evaluationComment: String, - val starComments: List, - val imageBytes: ByteArray? = null, -) { - companion object { - fun empty() = Evaluation( - evaluationScore = 0.0, - evaluationSituations = emptyList(), - evaluationImgUrl = "", - evaluationComment = "", - starComments = emptyList(), - imageBytes = null, - ) - } -} - -data class StarComment( - val star: Double, - val comment: String, -) From 67d22a960e85ca6fc27f304ec9abf643349aafa9 Mon Sep 17 00:00:00 2001 From: TaejungKim <92737123+imtaejugkim@users.noreply.github.com> Date: Sun, 8 Mar 2026 16:13:47 +0900 Subject: [PATCH 09/22] =?UTF-8?q?[feat/#31]=20=EC=9D=B4=EC=A0=84=20?= =?UTF-8?q?=ED=8F=89=EA=B0=80=20=EA=B0=80=EC=A0=B8=EC=98=A4=EA=B8=B0=20api?= =?UTF-8?q?=20viewmodel=20=EC=97=B0=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../component/EvaluationRestInfoCard.kt | 2 +- .../feature/evaluate/ui/EvaluateViewModel.kt | 74 +++++++++++++------ 2 files changed, 54 insertions(+), 22 deletions(-) diff --git a/shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/component/EvaluationRestInfoCard.kt b/shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/component/EvaluationRestInfoCard.kt index a0d6cd2c..535deda8 100644 --- a/shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/component/EvaluationRestInfoCard.kt +++ b/shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/component/EvaluationRestInfoCard.kt @@ -16,7 +16,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import com.kus.designsystem.theme.KusTheme -import com.kus.feature.evaluate.ui.EvaluateRestaurant +import com.kus.feature.evaluate.model.EvaluateRestaurant import kustaurant.shared.core.designsystem.generated.resources.Res import kustaurant.shared.core.designsystem.generated.resources.ic_location import org.jetbrains.compose.resources.painterResource diff --git a/shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/ui/EvaluateViewModel.kt b/shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/ui/EvaluateViewModel.kt index f709eab0..64e1db68 100644 --- a/shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/ui/EvaluateViewModel.kt +++ b/shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/ui/EvaluateViewModel.kt @@ -4,6 +4,11 @@ import UiError import UiState import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import com.kus.feature.evaluate.model.Evaluation +import com.kus.feature.evaluate.model.EvaluateRestaurant +import com.kus.feature.evaluate.model.StarComment +import com.kus.feature.evaluate.state.EvaluateUiState +import com.kus.shared.domain.evaluate.usecase.GetEvaluationUseCase import com.kus.shared.domain.evaluate.usecase.PostEvaluationUseCase import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow @@ -12,61 +17,88 @@ import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch class EvaluateViewModel( + private val getEvaluationUseCase: GetEvaluationUseCase, private val postEvaluationUseCase: PostEvaluationUseCase, ) : ViewModel() { private val _uiState = MutableStateFlow(EvaluateUiState()) val uiState: StateFlow = _uiState.asStateFlow() + fun getPreviousEvaluation(restaurantId: Long) = viewModelScope.launch { + _uiState.update { it.copy(evaluation = UiState.Loading) } + runCatching { + getEvaluationUseCase(restaurantId) + }.onSuccess { previous -> + _uiState.update { + it.copy( + evaluation = UiState.Success( + Evaluation( + evaluationScore = previous.evaluationScore ?: 0.0, + evaluationSituations = previous.evaluationSituations, + evaluationImgUrl = previous.evaluationImgUrl ?: "", + evaluationComment = previous.evaluationComment ?: "", + starComments = previous.starComments.map { StarComment(it.star, it.comment) }, + imageBytes = null, + ) + ) + ) + } + }.onFailure { + _uiState.update { it.copy(evaluation = UiState.Failure(UiError.Network)) } + } + } + fun initRestaurant(restaurant: EvaluateRestaurant) { _uiState.update { it.copy(restaurant = restaurant) } } + private fun updateEvaluation(transform: (Evaluation) -> Evaluation) { + val current = _uiState.value.evaluation + if (current !is UiState.Success) return + _uiState.update { it.copy(evaluation = UiState.Success(transform(current.data))) } + } + fun updateEvaluationScore(score: Double) { - _uiState.update { it.copy(evaluation = it.evaluation.copy(evaluationScore = score)) } + updateEvaluation { it.copy(evaluationScore = score) } } fun updateEvaluationComment(comment: String) { - _uiState.update { it.copy(evaluation = it.evaluation.copy(evaluationComment = comment)) } + updateEvaluation { it.copy(evaluationComment = comment) } } fun updateEvaluationSituations(situations: List) { - _uiState.update { it.copy(evaluation = it.evaluation.copy(evaluationSituations = situations)) } + updateEvaluation { it.copy(evaluationSituations = situations) } } fun updateEvaluationImage(imageUrl: String) { - _uiState.update { it.copy(evaluation = it.evaluation.copy(evaluationImgUrl = imageUrl)) } + updateEvaluation { it.copy(evaluationImgUrl = imageUrl) } } fun updateImageBytes(imageBytes: ByteArray) { - _uiState.update { it.copy(evaluation = it.evaluation.copy(imageBytes = imageBytes.copyOf())) } + updateEvaluation { it.copy(imageBytes = imageBytes.copyOf()) } } fun addStarComment(starComment: StarComment) { - _uiState.update { - it.copy(evaluation = it.evaluation.copy(starComments = it.evaluation.starComments + starComment)) - } + updateEvaluation { it.copy(starComments = it.starComments + starComment) } } fun removeStarComment(index: Int) { - _uiState.update { - it.copy( - evaluation = it.evaluation.copy( - starComments = it.evaluation.starComments.filterIndexed { i, _ -> i != index } - ) - ) - } + updateEvaluation { it.copy(starComments = it.starComments.filterIndexed { i, _ -> i != index }) } } fun submitEvaluation() = viewModelScope.launch { - val state = _uiState.value + val evaluationState = _uiState.value.evaluation + if (evaluationState !is UiState.Success) return@launch + val evaluation = evaluationState.data + val restaurantId = _uiState.value.restaurant.restaurantId.toLong() + _uiState.update { it.copy(submitState = UiState.Loading) } runCatching { postEvaluationUseCase( - restaurantId = state.restaurant.restaurantId.toLong(), - evaluationScore = state.evaluation.evaluationScore, - evaluationSituations = state.evaluation.evaluationSituations.takeIf { it.isNotEmpty() }, - evaluationComment = state.evaluation.evaluationComment.takeIf { it.isNotBlank() }, - imageBytes = state.evaluation.imageBytes, + restaurantId = restaurantId, + evaluationScore = evaluation.evaluationScore, + evaluationSituations = evaluation.evaluationSituations.takeIf { it.isNotEmpty() }, + evaluationComment = evaluation.evaluationComment.takeIf { it.isNotBlank() }, + imageBytes = evaluation.imageBytes, ) }.onSuccess { _uiState.update { it.copy(submitState = UiState.Success(Unit)) } From 4f571d62ad3980be44fa59af03eab505fb0a5bdd Mon Sep 17 00:00:00 2001 From: TaejungKim <92737123+imtaejugkim@users.noreply.github.com> Date: Sun, 8 Mar 2026 16:33:46 +0900 Subject: [PATCH 10/22] =?UTF-8?q?[feat/#31]=20=EC=9D=B4=EC=A0=84=20?= =?UTF-8?q?=ED=8F=89=EA=B0=80=20=EC=A0=84=EB=8B=AC=20navigation=20?= =?UTF-8?q?=EB=B0=8F=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- composeApp/build.gradle.kts | 1 + .../kus/kustaurant/navigation/KusNavHost.kt | 16 +++++++++- .../detail/navigation/DetailNavGraph.kt | 3 +- .../com/kus/feature/detail/ui/DetailScreen.kt | 4 +-- .../evaluate/navigation/EvaluateNavGraph.kt | 30 +++++++++++++++++-- .../evaluate/navigation/EvaluateRoute.kt | 13 -------- 6 files changed, 48 insertions(+), 19 deletions(-) delete mode 100644 shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/navigation/EvaluateRoute.kt diff --git a/composeApp/build.gradle.kts b/composeApp/build.gradle.kts index d27c4981..4301fd0c 100644 --- a/composeApp/build.gradle.kts +++ b/composeApp/build.gradle.kts @@ -86,6 +86,7 @@ kotlin { implementation(project(":shared:domain:home")) implementation(project(":shared:domain:detail")) implementation(project(":shared:domain:evaluate")) + implementation(project(":shared:domain:model")) } commonTest.dependencies { implementation(libs.kotlin.test) diff --git a/composeApp/src/commonMain/kotlin/com/kus/kustaurant/navigation/KusNavHost.kt b/composeApp/src/commonMain/kotlin/com/kus/kustaurant/navigation/KusNavHost.kt index 00606a87..c779dbac 100644 --- a/composeApp/src/commonMain/kotlin/com/kus/kustaurant/navigation/KusNavHost.kt +++ b/composeApp/src/commonMain/kotlin/com/kus/kustaurant/navigation/KusNavHost.kt @@ -147,7 +147,21 @@ fun KusNavHost( detailNavGraph( navigateToUp = navController::popBackStack, - navigateToEvaluate = { navController.navigate(Evaluate) }, + navigateToEvaluate = { restaurant -> + navController.navigate( + Evaluate( + restaurantId = restaurant.restaurantId, + restaurantName = restaurant.restaurantName, + mainTier = restaurant.mainTier, + restaurantCuisine = restaurant.restaurantCuisine, + restaurantCuisineImgUrl = restaurant.restaurantCuisineImgUrl, + restaurantPosition = restaurant.restaurantPosition, + restaurantAddress = restaurant.restaurantAddress, + situationList = restaurant.situationList, + partnershipInfo = restaurant.partnershipInfo, + ) + ) + }, ) evaluateNavGraph( diff --git a/shared/feature/detail/src/commonMain/kotlin/com/kus/feature/detail/navigation/DetailNavGraph.kt b/shared/feature/detail/src/commonMain/kotlin/com/kus/feature/detail/navigation/DetailNavGraph.kt index c4af0a3b..ddabaf90 100644 --- a/shared/feature/detail/src/commonMain/kotlin/com/kus/feature/detail/navigation/DetailNavGraph.kt +++ b/shared/feature/detail/src/commonMain/kotlin/com/kus/feature/detail/navigation/DetailNavGraph.kt @@ -3,6 +3,7 @@ package com.kus.feature.detail.navigation import androidx.navigation.NavGraphBuilder import androidx.navigation.compose.composable import com.kus.feature.detail.ui.DetailRoute +import com.kus.shared.domain.model.detail.RestaurantDetail import kotlinx.serialization.Serializable @Serializable @@ -10,7 +11,7 @@ data object Detail fun NavGraphBuilder.detailNavGraph( navigateToUp: () -> Unit, - navigateToEvaluate: () -> Unit, + navigateToEvaluate: (RestaurantDetail) -> Unit, ) { composable { DetailRoute( diff --git a/shared/feature/detail/src/commonMain/kotlin/com/kus/feature/detail/ui/DetailScreen.kt b/shared/feature/detail/src/commonMain/kotlin/com/kus/feature/detail/ui/DetailScreen.kt index 809c977e..b352b9d4 100644 --- a/shared/feature/detail/src/commonMain/kotlin/com/kus/feature/detail/ui/DetailScreen.kt +++ b/shared/feature/detail/src/commonMain/kotlin/com/kus/feature/detail/ui/DetailScreen.kt @@ -65,7 +65,7 @@ import org.koin.compose.viewmodel.koinViewModel @Composable fun DetailRoute( restaurantId: Long = 510L, - navigateToEvaluate: () -> Unit, + navigateToEvaluate: (RestaurantDetail) -> Unit, navigateToUp: () -> Unit, viewModel: DetailViewModel = koinViewModel(), ) { @@ -90,7 +90,7 @@ fun DetailRoute( restaurant = restaurantState.data, reviewsState = uiState.reviews, reviewSort = uiState.reviewSort, - navigateToEvaluate = navigateToEvaluate, + navigateToEvaluate = { navigateToEvaluate(restaurantState.data) }, onBackClick = navigateToUp, onFavoriteClick = { viewModel.onFavoriteClick() }, onSortSelected = { sort -> viewModel.getRestaurantReviews(sort) }, diff --git a/shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/navigation/EvaluateNavGraph.kt b/shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/navigation/EvaluateNavGraph.kt index b720547c..1bd5b651 100644 --- a/shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/navigation/EvaluateNavGraph.kt +++ b/shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/navigation/EvaluateNavGraph.kt @@ -2,16 +2,42 @@ package com.kus.feature.evaluate.navigation import androidx.navigation.NavGraphBuilder import androidx.navigation.compose.composable +import androidx.navigation.toRoute +import com.kus.feature.evaluate.model.EvaluateRestaurant +import com.kus.feature.evaluate.ui.EvaluateRoute import kotlinx.serialization.Serializable @Serializable -data object Evaluate +data class Evaluate( + val restaurantId: Long, + val restaurantName: String, + val mainTier: Int, + val restaurantCuisine: String, + val restaurantCuisineImgUrl: String, + val restaurantPosition: String, + val restaurantAddress: String, + val situationList: List, + val partnershipInfo: String, +) fun NavGraphBuilder.evaluateNavGraph( onBackClick: () -> Unit, ) { - composable { + composable { backStackEntry -> + val evaluate = backStackEntry.toRoute() EvaluateRoute( + restaurantId = evaluate.restaurantId, + restaurant = EvaluateRestaurant( + restaurantId = evaluate.restaurantId.toInt(), + restaurantName = evaluate.restaurantName, + mainTier = evaluate.mainTier, + restaurantCuisine = evaluate.restaurantCuisine, + restaurantCuisineImgUrl = evaluate.restaurantCuisineImgUrl, + restaurantPosition = evaluate.restaurantPosition, + restaurantAddress = evaluate.restaurantAddress, + situationList = ArrayList(evaluate.situationList), + partnershipInfo = evaluate.partnershipInfo, + ), onBackClick = onBackClick, ) } diff --git a/shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/navigation/EvaluateRoute.kt b/shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/navigation/EvaluateRoute.kt deleted file mode 100644 index 7ee2480c..00000000 --- a/shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/navigation/EvaluateRoute.kt +++ /dev/null @@ -1,13 +0,0 @@ -package com.kus.feature.evaluate.navigation - -import androidx.compose.runtime.Composable -import com.kus.feature.evaluate.ui.EvaluateScreen - -@Composable -fun EvaluateRoute( - onBackClick: () -> Unit, -) { - EvaluateScreen( - onBackClick = onBackClick, - ) -} From c550e7e6cdbdfda9965f3d9179278d6f86847c59 Mon Sep 17 00:00:00 2001 From: TaejungKim <92737123+imtaejugkim@users.noreply.github.com> Date: Sun, 8 Mar 2026 16:34:10 +0900 Subject: [PATCH 11/22] =?UTF-8?q?[feat/#31]=20=EC=9D=B4=EC=A0=84=20?= =?UTF-8?q?=ED=8F=89=EA=B0=80=20=EC=A0=84=EB=8B=AC=20api=20=EC=83=81?= =?UTF-8?q?=ED=83=9C=EC=97=90=20=EB=94=B0=EB=A5=B8=20ui=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kus/feature/evaluate/ui/EvaluateScreen.kt | 123 ++++++++++++------ 1 file changed, 84 insertions(+), 39 deletions(-) diff --git a/shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/ui/EvaluateScreen.kt b/shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/ui/EvaluateScreen.kt index c11aa5a9..d55d8301 100644 --- a/shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/ui/EvaluateScreen.kt +++ b/shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/ui/EvaluateScreen.kt @@ -1,5 +1,6 @@ package com.kus.feature.evaluate.ui +import UiState import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -9,9 +10,9 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Text -import UiState import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState @@ -19,7 +20,6 @@ import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp -import org.koin.compose.viewmodel.koinViewModel import com.kus.designsystem.component.KusButton import com.kus.designsystem.component.KusTopBar import com.kus.designsystem.theme.KusTheme @@ -29,73 +29,118 @@ import com.kus.feature.evaluate.component.EvaluationKeyword import com.kus.feature.evaluate.component.EvaluationRestInfoCard import com.kus.feature.evaluate.component.EvaluationReview import com.kus.feature.evaluate.component.EvaluationStar +import com.kus.feature.evaluate.model.Evaluation +import com.kus.feature.evaluate.model.EvaluateRestaurant import kustaurant.shared.core.designsystem.generated.resources.Res import kustaurant.shared.core.designsystem.generated.resources.ic_arrow_back import org.jetbrains.compose.resources.painterResource - +import org.koin.compose.viewmodel.koinViewModel @Composable -fun EvaluateScreen( +fun EvaluateRoute( + restaurantId: Long, + restaurant: EvaluateRestaurant, onBackClick: () -> Unit, viewModel: EvaluateViewModel = koinViewModel(), ) { val uiState by viewModel.uiState.collectAsState() - val restaurant = uiState.restaurant - val evaluation = uiState.evaluation - val submitState = uiState.submitState - val isRatingSelected = evaluation.evaluationScore != 0.0 - val isSubmitting = submitState is UiState.Loading - LaunchedEffect(submitState) { - if (submitState is UiState.Success) { + LaunchedEffect(restaurantId) { + viewModel.initRestaurant(restaurant) + viewModel.getPreviousEvaluation(restaurantId) + } + + LaunchedEffect(uiState.submitState) { + if (uiState.submitState is UiState.Success) { onBackClick() } } - val submitButtonColor = if (isRatingSelected) { - KusTheme.colors.c_43AB38 - } else { - KusTheme.colors.c_E0E0E0 + when (val evaluationState = uiState.evaluation) { + is UiState.Loading -> { + Box( + modifier = Modifier.fillMaxSize(), + contentAlignment = Alignment.Center, + ) { + CircularProgressIndicator(color = KusTheme.colors.c_43AB38) + } + } + + is UiState.Success -> { + EvaluateSuccessScreen( + restaurant = uiState.restaurant, + evaluation = evaluationState.data, + submitState = uiState.submitState, + onBackClick = onBackClick, + onScoreChanged = { viewModel.updateEvaluationScore(it) }, + onSituationsChanged = { viewModel.updateEvaluationSituations(it) }, + onCommentChanged = { viewModel.updateEvaluationComment(it) }, + onImageSelected = { viewModel.updateImageBytes(it) }, + onSubmitClick = { viewModel.submitEvaluation() }, + ) + } + + is UiState.Failure -> { + Box( + modifier = Modifier + .fillMaxSize() + .background(color = KusTheme.colors.c_FFFFFF), + contentAlignment = Alignment.Center, + ) { + Text(text = "서버 연결이 불안정합니다. 다시 시도해주세요.") + } + } + + is UiState.Idle -> {} } +} + +@Composable +private fun EvaluateSuccessScreen( + restaurant: EvaluateRestaurant, + evaluation: Evaluation, + submitState: UiState, + onBackClick: () -> Unit, + onScoreChanged: (Double) -> Unit, + onSituationsChanged: (List) -> Unit, + onCommentChanged: (String) -> Unit, + onImageSelected: (ByteArray) -> Unit, + onSubmitClick: () -> Unit, +) { + val isRatingSelected = evaluation.evaluationScore != 0.0 + val isSubmitting = submitState is UiState.Loading + val submitButtonColor = if (isRatingSelected) KusTheme.colors.c_43AB38 else KusTheme.colors.c_E0E0E0 Box( - modifier = Modifier.fillMaxSize() + modifier = Modifier + .fillMaxSize() .background(color = KusTheme.colors.c_FFFFFF) ) { LazyColumn( modifier = Modifier.fillMaxWidth() ) { item { - EvaluationRestInfoCard( - restaurant = restaurant - ) + EvaluationRestInfoCard(restaurant = restaurant) } item { EvaluationStar( initialRating = evaluation.evaluationScore, - onRatingChanged = { newRating -> - viewModel.updateEvaluationScore(newRating) - } + onRatingChanged = onScoreChanged, ) } item { EvaluationKeyword( selectedSituations = evaluation.evaluationSituations, - onSituationChanged = { situation -> - viewModel.updateEvaluationSituations(situation) - - } + onSituationChanged = onSituationsChanged, ) } item { EvaluationReview( evaluationComment = evaluation.evaluationComment, - onCommentChange = { comment -> - viewModel.updateEvaluationComment(comment) - } + onCommentChange = onCommentChanged, ) } @@ -103,19 +148,17 @@ fun EvaluateScreen( EvaluationImage( imageUrl = evaluation.evaluationImgUrl, imageBytes = evaluation.imageBytes, - onImageSelected = { imageBytes -> - viewModel.updateImageBytes(imageBytes) - } + onImageSelected = onImageSelected, ) } item { Box( - modifier = Modifier.fillMaxWidth() + modifier = Modifier + .fillMaxWidth() .height(72.dp) ) } - } Column( @@ -125,7 +168,8 @@ fun EvaluateScreen( ) { KusTopBar( leftIcon = painterResource(Res.drawable.ic_arrow_back), - leftIconModifier = Modifier.noRippleClickable { onBackClick() } + leftIconModifier = Modifier + .noRippleClickable { onBackClick() } .padding(all = 5.dp), iconTint = KusTheme.colors.c_000000, modifier = Modifier @@ -146,7 +190,8 @@ fun EvaluateScreen( } Box( - modifier = Modifier.background(color = KusTheme.colors.c_FFFFFF) + modifier = Modifier + .background(color = KusTheme.colors.c_FFFFFF) .padding(horizontal = 20.dp, vertical = 10.dp) .align(Alignment.BottomCenter), ) { @@ -158,9 +203,9 @@ fun EvaluateScreen( borderColor = submitButtonColor, onClick = { if (!isRatingSelected || isSubmitting) return@KusButton - viewModel.submitEvaluation() - } + onSubmitClick() + }, ) } } -} \ No newline at end of file +} From b38f77570a2c08ed450ef96a32e2369180222e84 Mon Sep 17 00:00:00 2001 From: TaejungKim <92737123+imtaejugkim@users.noreply.github.com> Date: Sun, 8 Mar 2026 16:35:16 +0900 Subject: [PATCH 12/22] =?UTF-8?q?[fix/#31]=20=ED=8F=89=EA=B0=80=20?= =?UTF-8?q?=EC=A0=9C=EC=B6=9C=20multi-part=20=EB=B6=84=EB=A6=AC=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 멀티파트를 json으로 감싸지 않고 각 컨텐츠를 requestpart로 적용되도록 수정 - 이미지 없는 경우 json으로 보내지 않고 동일하게 멀티파트로 적용 --- .../kustaurant/evaluate/api/EvaluateApi.kt | 43 ++++++++----------- .../evaluate/di/evaluateDataModule.kt | 2 - 2 files changed, 18 insertions(+), 27 deletions(-) diff --git a/shared/data/evaluate/src/commonMain/kotlin/com/kus/kustaurant/evaluate/api/EvaluateApi.kt b/shared/data/evaluate/src/commonMain/kotlin/com/kus/kustaurant/evaluate/api/EvaluateApi.kt index 7959af2d..a9a9f9cb 100644 --- a/shared/data/evaluate/src/commonMain/kotlin/com/kus/kustaurant/evaluate/api/EvaluateApi.kt +++ b/shared/data/evaluate/src/commonMain/kotlin/com/kus/kustaurant/evaluate/api/EvaluateApi.kt @@ -9,16 +9,11 @@ import io.ktor.client.request.forms.formData import io.ktor.client.request.get import io.ktor.client.request.post import io.ktor.client.request.setBody -import io.ktor.http.ContentType import io.ktor.http.Headers import io.ktor.http.HttpHeaders -import io.ktor.http.contentType -import kotlinx.serialization.encodeToString -import kotlinx.serialization.json.Json class EvaluateApi( private val client: HttpClient, - private val json: Json, ) { suspend fun getEvaluation(restaurantId: Long): EvaluationResponse { return client.get("/api/v2/auth/restaurants/$restaurantId/evaluation").body() @@ -29,35 +24,33 @@ class EvaluateApi( request: EvaluationRequest, imageBytes: ByteArray?, ) { - if (imageBytes != null) { - client.post("/api/v2/auth/restaurants/$restaurantId/evaluation") { - setBody( - MultiPartFormDataContent( - formData { - append( - key = "evaluationDTO", - value = json.encodeToString(request), - headers = Headers.build { - append(HttpHeaders.ContentType, ContentType.Application.Json.toString()) - } - ) + client.post("/api/v2/auth/restaurants/$restaurantId/evaluation") { + setBody( + MultiPartFormDataContent( + formData { + append("evaluationScore", request.evaluationScore.toString()) + + request.evaluationSituations?.forEach { situation -> + append("evaluationSituations", situation.toString()) + } + + request.evaluationComment?.let { + append("evaluationComment", it) + } + + imageBytes?.let { append( key = "newImage", - value = imageBytes, + value = it, headers = Headers.build { append(HttpHeaders.ContentType, "image/jpeg") append(HttpHeaders.ContentDisposition, "filename=evaluation.jpg") } ) } - ) + } ) - } - } else { - client.post("/api/v2/auth/restaurants/$restaurantId/evaluation") { - contentType(ContentType.Application.Json) - setBody(request) - } + ) } } } diff --git a/shared/data/evaluate/src/commonMain/kotlin/com/kus/kustaurant/evaluate/di/evaluateDataModule.kt b/shared/data/evaluate/src/commonMain/kotlin/com/kus/kustaurant/evaluate/di/evaluateDataModule.kt index 3d9cd69f..af404846 100644 --- a/shared/data/evaluate/src/commonMain/kotlin/com/kus/kustaurant/evaluate/di/evaluateDataModule.kt +++ b/shared/data/evaluate/src/commonMain/kotlin/com/kus/kustaurant/evaluate/di/evaluateDataModule.kt @@ -3,13 +3,11 @@ package com.kus.kustaurant.evaluate.di import com.kus.kustaurant.evaluate.api.EvaluateApi import com.kus.kustaurant.evaluate.repositoryimpl.EvaluateRepositoryImpl import com.kus.shared.domain.evaluate.repository.EvaluateRepository -import kotlinx.serialization.json.Json import org.koin.core.module.dsl.singleOf import org.koin.dsl.bind import org.koin.dsl.module val evaluateDataModule = module { - single { Json { ignoreUnknownKeys = true } } singleOf(::EvaluateApi) singleOf(::EvaluateRepositoryImpl) bind EvaluateRepository::class } From e6c51d5cb7e01f78bf732fe883fc4265b7da615a Mon Sep 17 00:00:00 2001 From: TaejungKim <92737123+imtaejugkim@users.noreply.github.com> Date: Sun, 8 Mar 2026 17:11:28 +0900 Subject: [PATCH 13/22] =?UTF-8?q?[feat/#31]=20=ED=8B=B0=EC=96=B4=20?= =?UTF-8?q?=ED=99=94=EB=A9=B4=20=EC=8B=9D=EB=8B=B9=20id=20=EC=A0=84?= =?UTF-8?q?=EB=8B=AC=20=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kotlin/com/kus/kustaurant/navigation/KusNavHost.kt | 2 +- .../com/kus/feature/detail/navigation/DetailNavGraph.kt | 7 +++++-- .../kotlin/com/kus/feature/tier/navigation/TierGraph.kt | 2 +- .../kotlin/com/kus/feature/tier/navigation/TierRoute.kt | 2 +- .../kotlin/com/kus/feature/tier/ui/TierScreen.kt | 4 ++-- 5 files changed, 10 insertions(+), 7 deletions(-) diff --git a/composeApp/src/commonMain/kotlin/com/kus/kustaurant/navigation/KusNavHost.kt b/composeApp/src/commonMain/kotlin/com/kus/kustaurant/navigation/KusNavHost.kt index c779dbac..5d5cd760 100644 --- a/composeApp/src/commonMain/kotlin/com/kus/kustaurant/navigation/KusNavHost.kt +++ b/composeApp/src/commonMain/kotlin/com/kus/kustaurant/navigation/KusNavHost.kt @@ -130,7 +130,7 @@ fun KusNavHost( navController.navigate(TierCategorySelect) }, - navigateToDetail = { navController.navigate(Detail) }, + navigateToDetail = { restaurantId -> navController.navigate(Detail(restaurantId)) }, popBackStackWithResult = { result -> val json = KusJson.json.encodeToString(result) navController.previousBackStackEntry diff --git a/shared/feature/detail/src/commonMain/kotlin/com/kus/feature/detail/navigation/DetailNavGraph.kt b/shared/feature/detail/src/commonMain/kotlin/com/kus/feature/detail/navigation/DetailNavGraph.kt index ddabaf90..024f4e3d 100644 --- a/shared/feature/detail/src/commonMain/kotlin/com/kus/feature/detail/navigation/DetailNavGraph.kt +++ b/shared/feature/detail/src/commonMain/kotlin/com/kus/feature/detail/navigation/DetailNavGraph.kt @@ -2,19 +2,22 @@ package com.kus.feature.detail.navigation import androidx.navigation.NavGraphBuilder import androidx.navigation.compose.composable +import androidx.navigation.toRoute import com.kus.feature.detail.ui.DetailRoute import com.kus.shared.domain.model.detail.RestaurantDetail import kotlinx.serialization.Serializable @Serializable -data object Detail +data class Detail(val restaurantId: Long) fun NavGraphBuilder.detailNavGraph( navigateToUp: () -> Unit, navigateToEvaluate: (RestaurantDetail) -> Unit, ) { - composable { + composable { backStackEntry -> + val route = backStackEntry.toRoute() DetailRoute( + restaurantId = route.restaurantId, navigateToEvaluate = navigateToEvaluate, navigateToUp = navigateToUp, ) diff --git a/shared/feature/tier/src/commonMain/kotlin/com/kus/feature/tier/navigation/TierGraph.kt b/shared/feature/tier/src/commonMain/kotlin/com/kus/feature/tier/navigation/TierGraph.kt index b6e3f826..69345fcd 100644 --- a/shared/feature/tier/src/commonMain/kotlin/com/kus/feature/tier/navigation/TierGraph.kt +++ b/shared/feature/tier/src/commonMain/kotlin/com/kus/feature/tier/navigation/TierGraph.kt @@ -19,7 +19,7 @@ data object TierCategorySelect fun NavGraphBuilder.tierNavGraph( initialProvider: () -> TierFilterState, navigateToTierCategorySelect: (TierFilterState) -> Unit, - navigateToDetail: () -> Unit, + navigateToDetail: (Long) -> Unit, popBackStackWithResult: (TierFilterState) -> Unit, onBackButtonClick: () -> Unit = {}, ) { diff --git a/shared/feature/tier/src/commonMain/kotlin/com/kus/feature/tier/navigation/TierRoute.kt b/shared/feature/tier/src/commonMain/kotlin/com/kus/feature/tier/navigation/TierRoute.kt index 87233c1d..20013e0e 100644 --- a/shared/feature/tier/src/commonMain/kotlin/com/kus/feature/tier/navigation/TierRoute.kt +++ b/shared/feature/tier/src/commonMain/kotlin/com/kus/feature/tier/navigation/TierRoute.kt @@ -12,7 +12,7 @@ import org.koin.compose.viewmodel.koinViewModel @Composable fun TierRoute( navigateToTierCategorySelect: (TierFilterState) -> Unit, - navigateToDetail: () -> Unit, + navigateToDetail: (Long) -> Unit, resultFilter: TierFilterState?, consumeResult: () -> Unit, ) { diff --git a/shared/feature/tier/src/commonMain/kotlin/com/kus/feature/tier/ui/TierScreen.kt b/shared/feature/tier/src/commonMain/kotlin/com/kus/feature/tier/ui/TierScreen.kt index bff731db..73d9463b 100644 --- a/shared/feature/tier/src/commonMain/kotlin/com/kus/feature/tier/ui/TierScreen.kt +++ b/shared/feature/tier/src/commonMain/kotlin/com/kus/feature/tier/ui/TierScreen.kt @@ -58,7 +58,7 @@ fun TierScreen( onSearchClick: () -> Unit = {}, onAlarmClick: () -> Unit = {}, onFilterClick: () -> Unit = {}, - onNavigateRestaurantDetail: () -> Unit = {}, + onNavigateRestaurantDetail: (Long) -> Unit = {}, ) { val tabs = remember { TierTab.entries } val pagerState = rememberPagerState { tabs.size } @@ -110,7 +110,7 @@ fun TierScreen( TierListScreen( viewModel = viewModel, listState = listState, - onRestaurantClick = { onNavigateRestaurantDetail() }, + onRestaurantClick = { restaurant -> onNavigateRestaurantDetail(restaurant.restaurantId) }, modifier = Modifier .fillMaxSize() .padding(top = 44.dp) From 3fb681ca908e25049210bf998a5b0f5d48f7969d Mon Sep 17 00:00:00 2001 From: TaejungKim <92737123+imtaejugkim@users.noreply.github.com> Date: Wed, 11 Mar 2026 00:20:59 +0900 Subject: [PATCH 14/22] =?UTF-8?q?[add/#31]=20koin=20=EC=9D=98=EC=A1=B4?= =?UTF-8?q?=EC=84=B1=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- shared/data/evaluate/build.gradle.kts | 1 + 1 file changed, 1 insertion(+) diff --git a/shared/data/evaluate/build.gradle.kts b/shared/data/evaluate/build.gradle.kts index b3c1d87f..5cae16cb 100644 --- a/shared/data/evaluate/build.gradle.kts +++ b/shared/data/evaluate/build.gradle.kts @@ -46,6 +46,7 @@ kotlin { sourceSets { commonMain { dependencies { + implementation(libs.koin.core) implementation(libs.kotlinx.coroutines.core) implementation(libs.kotlinx.serialization.json) From 91b6de2bd7ffb4e4d04eb53378acb5a6b7a02e4e Mon Sep 17 00:00:00 2001 From: TaejungKim <92737123+imtaejugkim@users.noreply.github.com> Date: Wed, 11 Mar 2026 00:21:24 +0900 Subject: [PATCH 15/22] =?UTF-8?q?[fix/#31]=20=EC=8B=9D=EB=8B=B9=20id=20Lon?= =?UTF-8?q?g=ED=98=95=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kotlin/com/kus/feature/evaluate/model/EvaluateRestaurant.kt | 2 +- .../com/kus/feature/evaluate/navigation/EvaluateNavGraph.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/model/EvaluateRestaurant.kt b/shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/model/EvaluateRestaurant.kt index eff905f4..e9efe694 100644 --- a/shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/model/EvaluateRestaurant.kt +++ b/shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/model/EvaluateRestaurant.kt @@ -1,7 +1,7 @@ package com.kus.feature.evaluate.model data class EvaluateRestaurant( - val restaurantId: Int, + val restaurantId: Long, val restaurantName: String, val mainTier: Int, val restaurantCuisine: String, diff --git a/shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/navigation/EvaluateNavGraph.kt b/shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/navigation/EvaluateNavGraph.kt index 1bd5b651..bfab7fa2 100644 --- a/shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/navigation/EvaluateNavGraph.kt +++ b/shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/navigation/EvaluateNavGraph.kt @@ -28,7 +28,7 @@ fun NavGraphBuilder.evaluateNavGraph( EvaluateRoute( restaurantId = evaluate.restaurantId, restaurant = EvaluateRestaurant( - restaurantId = evaluate.restaurantId.toInt(), + restaurantId = evaluate.restaurantId, restaurantName = evaluate.restaurantName, mainTier = evaluate.mainTier, restaurantCuisine = evaluate.restaurantCuisine, From 263b3adf6d763e18d14e75120dea8914cb1016a0 Mon Sep 17 00:00:00 2001 From: TaejungKim <92737123+imtaejugkim@users.noreply.github.com> Date: Wed, 11 Mar 2026 00:21:40 +0900 Subject: [PATCH 16/22] =?UTF-8?q?[ui/#31]=20=EB=A1=9C=EB=94=A9=20=EC=8B=9C?= =?UTF-8?q?=20=EB=B0=B0=EA=B2=BD=20=ED=9D=B0=EC=83=89=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kotlin/com/kus/feature/evaluate/ui/EvaluateScreen.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/ui/EvaluateScreen.kt b/shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/ui/EvaluateScreen.kt index d55d8301..6b719046 100644 --- a/shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/ui/EvaluateScreen.kt +++ b/shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/ui/EvaluateScreen.kt @@ -59,7 +59,8 @@ fun EvaluateRoute( when (val evaluationState = uiState.evaluation) { is UiState.Loading -> { Box( - modifier = Modifier.fillMaxSize(), + modifier = Modifier.fillMaxSize() + .background(color = KusTheme.colors.c_FFFFFF), contentAlignment = Alignment.Center, ) { CircularProgressIndicator(color = KusTheme.colors.c_43AB38) From 4f9aa9adb0beedc54f644fcd98235c642050cb88 Mon Sep 17 00:00:00 2001 From: TaejungKim <92737123+imtaejugkim@users.noreply.github.com> Date: Wed, 11 Mar 2026 00:25:07 +0900 Subject: [PATCH 17/22] =?UTF-8?q?[ui/#31]=20kusbutton=20=EB=B9=84=ED=99=9C?= =?UTF-8?q?=EC=84=B1=ED=99=94=20=EC=9D=B8=20=EA=B2=BD=EC=9A=B0=20border=20?= =?UTF-8?q?=EC=BB=AC=EB=9F=AC=20=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kotlin/com/kus/designsystem/component/KusButton.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/shared/core/designSystem/src/commonMain/kotlin/com/kus/designsystem/component/KusButton.kt b/shared/core/designSystem/src/commonMain/kotlin/com/kus/designsystem/component/KusButton.kt index e0762399..082a57ef 100644 --- a/shared/core/designSystem/src/commonMain/kotlin/com/kus/designsystem/component/KusButton.kt +++ b/shared/core/designSystem/src/commonMain/kotlin/com/kus/designsystem/component/KusButton.kt @@ -55,6 +55,8 @@ fun KusButton( isShadowVisible: Boolean = false, onClick: () -> Unit, ) { + val resolvedBorderColor = if (enabled) borderColor else KusTheme.colors.c_E0E0E0 + Box( modifier = modifier ) { @@ -81,7 +83,7 @@ fun KusButton( disabledContainerColor = KusTheme.colors.c_E0E0E0, disabledContentColor = KusTheme.colors.c_AAAAAA, ), - border = BorderStroke(1.dp, borderColor), + border = BorderStroke(1.dp, resolvedBorderColor), contentPadding = contentPadding, ) { Row( From 1bac56d8a1681cef0bccc3189b3515e126e60d1b Mon Sep 17 00:00:00 2001 From: TaejungKim <92737123+imtaejugkim@users.noreply.github.com> Date: Wed, 11 Mar 2026 00:31:34 +0900 Subject: [PATCH 18/22] [merge/#31] pulled develop --- .gitignore | 4 + composeApp/build.gradle.kts | 8 +- .../src/androidMain/AndroidManifest.xml | 6 + .../com/kus/kustaurant/KusApplication.kt | 6 +- .../kotlin/com/kus/kustaurant/MainActivity.kt | 9 +- .../kotlin/com/kus/kustaurant/App.kt | 132 ++- .../kotlin/com/kus/kustaurant/di/initKoin.kt | 6 + .../navigation/HIDE_BOTTOM_BAR_ROUTE.kt | 19 + .../kus/kustaurant/navigation/KusNavHost.kt | 91 +- .../navigation/util/NavigationUtil.kt | 16 + .../com/kus/kustaurant/MainViewController.kt | 2 + gradle/libs.versions.toml | 8 +- iosApp/editor/purify.min.js | 3 + iosApp/editor/quill.html | 240 +++++ iosApp/editor/quill.min.js | 8 + iosApp/editor/quill.snow.css | 945 ++++++++++++++++++ iosApp/iosApp.xcodeproj/project.pbxproj | 116 ++- .../AppIcon.appiconset/Contents.json | 3 +- .../AppIcon.appiconset/ic_app_icon _dark.png | Bin 0 -> 30076 bytes .../AppIcon.appiconset/ic_app_icon.png | Bin 0 -> 30076 bytes .../Contents.json | 3 +- .../ic_marker_none.pdf | Bin 0 -> 105257 bytes .../Contents.json | 3 +- .../ic_marker_partnership.pdf | Bin 0 -> 6013 bytes iosApp/iosApp/Info.plist | 8 +- iosApp/iosApp/login/NaverLoginBridge.swift | 12 + .../iosApp/login/NaverLoginBridgeError.swift | 1 + settings.gradle.kts | 2 + shared/appKit/build.gradle.kts | 4 +- .../appkit/community/util/ByteArrayUtil.kt | 27 + .../community/write/IosCommunityEditor.kt | 112 +++ .../write/IosCommunityEditorRenderer.kt | 23 + .../community/write/IosEditorDelegate.kt | 48 + .../write/image/IosImagePickerFactory.kt | 99 ++ .../write/image/IosPlatformImageResolver.kt | 27 + .../com/kus/appkit/di/iosCommunityModule.kt | 17 + .../kotlin/com/kus/appkit/map/MapHolder.kt | 2 + .../com/kus/appkit/map/TierMapIosScreen.kt | 126 ++- .../composeResources/drawable/ic_chat.xml | 27 + .../drawable/ic_comment_reply.xml | 9 + .../composeResources/drawable/ic_crown.png | Bin .../composeResources/drawable/ic_delete.xml | 9 + .../drawable/ic_more_vert.xml | 15 + .../drawable/ic_naver_logo.png | Bin 1791 -> 2082 bytes .../composeResources/drawable/ic_scrap.xml | 9 + .../drawable/ic_user_placeholder.png | Bin 0 -> 13617 bytes .../kus/designsystem/component/KusButton.kt | 62 +- .../component/KusCommentDialog.kt | 108 ++ .../designsystem/component/KusCommentInput.kt | 143 +++ .../designsystem/component/KusRatingBar.kt | 1 - .../kus/designsystem/component/KusTopBar.kt | 41 +- .../component/LoginRequiredDialog.kt | 103 +- .../component/ReplyCommentInputPopup.kt | 63 ++ .../component/snackbar/KusSnackBarHost.kt | 54 + .../component/snackbar/KusSnackBarOverlay.kt | 34 + .../snackbar/LocalSnackBarBottomPadding.kt | 6 + .../kus/designsystem/navigation/BottomBar.kt | 4 +- .../com/kus/designsystem/theme/Color.kt | 2 +- .../kotlin/com/kus/designsystem/theme/Type.kt | 10 + .../com/kus/designsystem/util/StringUtil.kt | 12 + shared/core/serialization/build.gradle.kts | 2 +- shared/data/auth/build.gradle.kts | 2 +- .../kus/data/auth/di/androidDataAuthModule.kt | 10 + .../com/kus/data/auth/randomUUID.android.kt | 3 + .../com/kus/data/auth/DeviceIdManagerImpl.kt | 27 + .../com/kus/data/auth/TokenManagerImpl.kt | 38 +- .../kotlin/com/kus/data/auth/config/Keys.kt | 5 + .../com/kus/data/auth/di/authDataModule.kt | 3 + .../kotlin/com/kus/data/auth/randomUUID.kt | 3 + .../com/kus/data/auth/randomUUID.desktop.kt | 5 + .../kus/data/auth/di/iosAuthLocalModule.kt | 3 + .../com/kus/data/auth/randomUUID.ios.kt | 3 + shared/data/community/.gitignore | 1 + shared/data/community/build.gradle.kts | 88 ++ .../data/community/ExampleInstrumentedTest.kt | 24 + .../com/kus/data/community/ExampleUnitTest.kt | 16 + .../src/androidMain/AndroidManifest.xml | 4 + .../community/AndroidPlatformImageResolver.kt | 40 + .../kus/data/community/Platform.android.kt | 3 + .../community/currentTimeMillis.android.kt | 3 + .../di/androidDataCommunityModule.kt | 10 + .../kotlin/com/kus/data/community/Platform.kt | 3 + .../data/community/PlatformImageResolver.kt | 7 + .../kus/data/community/api/CommunityApi.kt | 159 +++ .../kus/data/community/currentTimeMillis.kt | 4 + .../data/community/di/communityDataModule.kt | 17 + .../data/community/mapper/CommunityMapper.kt | 118 +++ .../kus/data/community/model/ResolvedImage.kt | 7 + .../remote/request/PostCategoryRequest.kt | 22 + .../remote/request/PostCommentRequest.kt | 13 + .../community/remote/request/PostRequest.kt | 15 + .../CommunityCommentReactionResponse.kt | 10 + .../response/CommunityCreatePostResponse.kt | 40 + .../response/CommunityPostCommentResponse.kt | 24 + .../response/CommunityPostLikeResponse.kt | 11 + .../response/CommunityPostListItemResponse.kt | 20 + .../remote/response/CommunityPostResponse.kt | 36 + .../response/CommunityPostScrapResponse.kt | 9 + .../CommunityPostUploadImageResponse.kt | 8 + .../response/CommunityRankingResponse.kt | 12 + .../community/remote/response/PostResponse.kt | 11 + .../repository/CommunityRepositoryImpl.kt | 119 +++ .../kus/data/community/Platform.desktop.kt | 3 + .../community/currentTimeMillis.desktop.kt | 5 + .../com/kus/data/community/Platform.ios.kt | 3 + .../data/community/currentTimeMillis.ios.kt | 8 + shared/data/network/build.gradle.kts | 1 + .../com/kus/data/network/auth/TokenManager.kt | 6 +- .../kus/data/network/creatApiHttpClient.kt | 110 +- .../com/kus/data/network/di/networkModule.kt | 1 + .../kus/data/network/model/RefreshResult.kt | 7 + .../kus/shared/data/tier/mapper/TierMapper.kt | 82 +- .../data/tier/remote/mapper/TierMapper.kt | 82 -- .../tier/repository/TierRepositoryImpl.kt | 2 +- .../kus/domain/auth/di/authDomainModule.kt | 4 + .../domain/auth/repository/DeviceIdManager.kt | 7 + .../kus/domain/auth/session/SessionEvent.kt | 1 + .../domain/auth/session/SessionEventBus.kt | 3 +- .../auth/usecase/DeleteUserInfoUseCase.kt | 12 + .../auth/usecase/PostNaverLoginUseCase.kt | 3 + shared/domain/community/.gitignore | 1 + shared/domain/community/build.gradle.kts | 79 ++ .../community/ExampleInstrumentedTest.kt | 24 + .../kus/domain/community/ExampleUnitTest.kt | 16 + .../src/androidMain/AndroidManifest.xml | 4 + .../kus/domain/community/Platform.android.kt | 3 + .../com/kus/domain/community/Platform.kt | 3 + .../community/di/communityDomainModule.kt | 31 + .../domain/community/model/AuthUserInfo.kt | 6 + .../model/CommunityCommentReactionResponse.kt | 7 + .../domain/community/model/CommunityPost.kt | 31 + .../community/model/CommunityPostComment.kt | 18 + .../community/model/CommunityPostLike.kt | 9 + .../community/model/CommunityPostListItem.kt | 16 + .../community/model/CommunityPostScrap.kt | 7 + .../community/model/CommunityRanking.kt | 9 + .../kus/domain/community/model/LikeEvent.kt | 14 + .../domain/community/model/ListSortType.kt | 12 + .../domain/community/model/PostCategory.kt | 18 + .../community/model/PostModification.kt | 9 + .../domain/community/model/RankingSortType.kt | 6 + .../community/model/UploadImageException.kt | 9 + .../kus/domain/community/model/UserRole.kt | 8 + .../repository/CommunityRepository.kt | 85 ++ .../usecase/DeleteCommunityCommentUseCase.kt | 12 + .../usecase/DeleteCommunityPostUseCase.kt | 11 + .../usecase/GetCommunityPostDetailUseCase.kt | 26 + .../usecase/GetCommunityPostListUseCase.kt | 14 + .../usecase/GetCommunityRankingListUseCase.kt | 14 + .../usecase/PatchPostModifyUseCase.kt | 13 + .../PostCommunityPostCommentReactUseCase.kt | 13 + .../PostCommunityPostCommentReplyUseCase.kt | 13 + .../usecase/PostCommunityPostCreateUseCase.kt | 14 + .../PostCommunityPostDetailScrapUseCase.kt | 12 + .../PostCommunityUploadImageUseCase.kt | 12 + .../community/usecase/PostPostLikeUseCase.kt | 13 + .../kus/domain/community/Platform.desktop.kt | 3 + .../com/kus/domain/community/Platform.ios.kt | 3 + shared/feature/community/build.gradle.kts | 39 +- .../ui/detail/HtmlBodyView.android.kt | 36 + .../ui/di/androidFeatureCommunityModule.kt | 14 + .../ui/write/AndroidCommunityEditor.kt | 71 ++ .../write/AndroidCommunityEditorRenderer.kt | 21 + .../ui/write/AndroidEditorDelegate.kt | 27 + .../write/image/AndroidImagePickerFactory.kt | 66 ++ .../composeResources/drawable/bg_halo.png | Bin 0 -> 514519 bytes .../composeResources/drawable/ic_bold.png | Bin 0 -> 402 bytes .../drawable/ic_drop_down.xml | 9 + .../drawable/ic_insert_image.png | Bin 0 -> 2357 bytes .../composeResources/drawable/ic_medal_1.png | Bin 0 -> 36569 bytes .../composeResources/drawable/ic_medal_2.png | Bin 0 -> 20276 bytes .../composeResources/drawable/ic_medal_3.png | Bin 0 -> 23280 bytes .../composeResources/drawable/ic_pencil.xml | 13 + .../composeResources/drawable/ic_redo.png | Bin 0 -> 1088 bytes .../composeResources/drawable/ic_undo.png | Bin 0 -> 1140 bytes .../files/editor/purify.min.js | 3 + .../composeResources/files/editor/quill.html | 240 +++++ .../files/editor/quill.min.js | 8 + .../files/editor/quill.snow.css | 945 ++++++++++++++++++ .../feature/community/config/CommunityKeys.kt | 12 + .../community/di/featureCommunityModule.kt | 13 + .../model/CommunityPostModifyPayload.kt | 25 + .../community/model/DeleteCommunityEvent.kt | 6 + .../feature/community/model/ReactionAction.kt | 3 + .../community/navigation/CommunityNavGraph.kt | 156 ++- .../community/navigation/CommunityRoute.kt | 10 - .../feature/community/ui/CommunityBoards.kt | 12 + .../feature/community/ui/CommunityPhase.kt | 3 + .../feature/community/ui/CommunityScreen.kt | 199 +++- .../kus/feature/community/ui/CommunityTab.kt | 6 + .../feature/community/ui/CommunityUiState.kt | 28 + .../community/ui/CommunityViewModel.kt | 221 ++++ .../community/ui/comment/CommentComponent.kt | 462 +++++++++ .../ui/detail/CommunityDetailScreen.kt | 346 +++++++ .../detail/CommunityDetailSuccessContent.kt | 207 ++++ .../ui/detail/CommunityDetailUiState.kt | 11 + .../ui/detail/CommunityDetailViewModel.kt | 365 +++++++ .../community/ui/detail/HtmlBodyView.kt | 11 + .../community/ui/floatingButton/WriteFab.kt | 41 + .../community/ui/list/CommunityListContent.kt | 191 ++++ .../ui/list/CommunityListFilterBar.kt | 149 +++ .../community/ui/list/CommunityListRow.kt | 175 ++++ .../community/ui/mapper/CommunityUiMapper.kt | 49 + .../ui/model/CommunityPostCommentUi.kt | 19 + .../community/ui/model/CommunityPostUi.kt | 33 + .../ui/ranking/CommunityRankingContent.kt | 99 ++ .../ui/ranking/CommunityRankingTopCard.kt | 218 ++++ .../community/ui/ranking/RankCardSize.kt | 3 + .../community/ui/ranking/RankingHeader.kt | 59 ++ .../ui/ranking/Top3RankingSection.kt | 95 ++ .../feature/community/ui/util/ScrollUtil.kt | 24 + .../feature/community/ui/util/StringUtil.kt | 20 + .../ui/write/CommunityEditorController.kt | 34 + .../ui/write/CommunityEditorRenderer.kt | 14 + .../ui/write/CommunityWriteScreen.kt | 442 ++++++++ .../ui/write/CommunityWriteUiState.kt | 30 + .../ui/write/CommunityWriteViewModel.kt | 180 ++++ .../community/ui/write/KusTopBarSlots.kt | 74 ++ .../ui/write/image/PlatformImagePicker.kt | 5 + .../write/image/PlatformImagePickerFactory.kt | 8 + .../ui/detail/HtmlBodyView.desktop.kt | 7 + .../community/ui/detail/HtmlBodyView.ios.kt | 89 ++ .../kus/feature/home/model/CategoryData.kt | 34 +- .../feature/home/navigation/HomeNavGraph.kt | 3 +- .../com/kus/feature/home/ui/HomeScreen.kt | 9 +- .../login/navigation/LoginRoute.android.kt | 3 +- .../com/kus/feature/login/ui/LoginScreen.kt | 6 +- .../kus/feature/login/ui/LoginViewModel.kt | 8 + .../login/navigation/LoginRoute.ios.kt | 3 +- ...rmAndroid.kt => TierMapAndroidPlatform.kt} | 2 +- .../tier/ui/map/TierMapAndroidScreen.kt | 16 +- .../kotlin/di/androidTierMapPlatformModule.kt | 4 +- .../res/drawable/ic_map_marker.xml | 12 - .../res/drawable/ic_marker_none.xml | 12 + .../res/drawable/ic_marker_partnership.xml | 12 + .../com/kus/feature/tier/config/TierKeys.kt | 6 + .../kus/feature/tier/navigation/TierGraph.kt | 3 + .../kus/feature/tier/navigation/TierRoute.kt | 17 + .../com/kus/feature/tier/ui/TierScreen.kt | 128 ++- .../com/kus/feature/tier/ui/TierState.kt | 1 + .../com/kus/feature/tier/ui/TierViewModel.kt | 24 +- .../ui/category/TierCategorySelectScreen.kt | 3 +- .../feature/tier/ui/list/TierListScreen.kt | 14 +- .../feature/tier/ui/popup/TierInfoPopup.kt | 4 +- 244 files changed, 10217 insertions(+), 497 deletions(-) create mode 100644 composeApp/src/commonMain/kotlin/com/kus/kustaurant/navigation/HIDE_BOTTOM_BAR_ROUTE.kt create mode 100644 composeApp/src/commonMain/kotlin/com/kus/kustaurant/navigation/util/NavigationUtil.kt create mode 100644 iosApp/editor/purify.min.js create mode 100644 iosApp/editor/quill.html create mode 100644 iosApp/editor/quill.min.js create mode 100644 iosApp/editor/quill.snow.css create mode 100644 iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/ic_app_icon _dark.png create mode 100644 iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/ic_app_icon.png rename iosApp/iosApp/Assets.xcassets/{AccentColor 1.colorset => ic_marker_none.imageset}/Contents.json (65%) create mode 100644 iosApp/iosApp/Assets.xcassets/ic_marker_none.imageset/ic_marker_none.pdf rename iosApp/iosApp/Assets.xcassets/{AccentColor.colorset => ic_marker_partnership.imageset}/Contents.json (63%) create mode 100644 iosApp/iosApp/Assets.xcassets/ic_marker_partnership.imageset/ic_marker_partnership.pdf create mode 100644 iosApp/iosApp/login/NaverLoginBridge.swift create mode 100644 iosApp/iosApp/login/NaverLoginBridgeError.swift create mode 100644 shared/appKit/src/iosMain/kotlin/com/kus/appkit/community/util/ByteArrayUtil.kt create mode 100644 shared/appKit/src/iosMain/kotlin/com/kus/appkit/community/write/IosCommunityEditor.kt create mode 100644 shared/appKit/src/iosMain/kotlin/com/kus/appkit/community/write/IosCommunityEditorRenderer.kt create mode 100644 shared/appKit/src/iosMain/kotlin/com/kus/appkit/community/write/IosEditorDelegate.kt create mode 100644 shared/appKit/src/iosMain/kotlin/com/kus/appkit/community/write/image/IosImagePickerFactory.kt create mode 100644 shared/appKit/src/iosMain/kotlin/com/kus/appkit/community/write/image/IosPlatformImageResolver.kt create mode 100644 shared/appKit/src/iosMain/kotlin/com/kus/appkit/di/iosCommunityModule.kt create mode 100644 shared/core/designSystem/src/commonMain/composeResources/drawable/ic_chat.xml create mode 100644 shared/core/designSystem/src/commonMain/composeResources/drawable/ic_comment_reply.xml rename shared/{feature/tier => core/designSystem}/src/commonMain/composeResources/drawable/ic_crown.png (100%) create mode 100644 shared/core/designSystem/src/commonMain/composeResources/drawable/ic_delete.xml create mode 100644 shared/core/designSystem/src/commonMain/composeResources/drawable/ic_more_vert.xml create mode 100644 shared/core/designSystem/src/commonMain/composeResources/drawable/ic_scrap.xml create mode 100644 shared/core/designSystem/src/commonMain/composeResources/drawable/ic_user_placeholder.png create mode 100644 shared/core/designSystem/src/commonMain/kotlin/com/kus/designsystem/component/KusCommentDialog.kt create mode 100644 shared/core/designSystem/src/commonMain/kotlin/com/kus/designsystem/component/KusCommentInput.kt create mode 100644 shared/core/designSystem/src/commonMain/kotlin/com/kus/designsystem/component/ReplyCommentInputPopup.kt create mode 100644 shared/core/designSystem/src/commonMain/kotlin/com/kus/designsystem/component/snackbar/KusSnackBarHost.kt create mode 100644 shared/core/designSystem/src/commonMain/kotlin/com/kus/designsystem/component/snackbar/KusSnackBarOverlay.kt create mode 100644 shared/core/designSystem/src/commonMain/kotlin/com/kus/designsystem/component/snackbar/LocalSnackBarBottomPadding.kt create mode 100644 shared/core/designSystem/src/commonMain/kotlin/com/kus/designsystem/util/StringUtil.kt create mode 100644 shared/data/auth/src/androidMain/kotlin/com/kus/data/auth/randomUUID.android.kt create mode 100644 shared/data/auth/src/commonMain/kotlin/com/kus/data/auth/DeviceIdManagerImpl.kt create mode 100644 shared/data/auth/src/commonMain/kotlin/com/kus/data/auth/config/Keys.kt create mode 100644 shared/data/auth/src/commonMain/kotlin/com/kus/data/auth/randomUUID.kt create mode 100644 shared/data/auth/src/desktopMain/kotlin/com/kus/data/auth/randomUUID.desktop.kt create mode 100644 shared/data/auth/src/iosMain/kotlin/com/kus/data/auth/randomUUID.ios.kt create mode 100644 shared/data/community/.gitignore create mode 100644 shared/data/community/build.gradle.kts create mode 100644 shared/data/community/src/androidDeviceTest/kotlin/com/kus/data/community/ExampleInstrumentedTest.kt create mode 100644 shared/data/community/src/androidHostTest/kotlin/com/kus/data/community/ExampleUnitTest.kt create mode 100644 shared/data/community/src/androidMain/AndroidManifest.xml create mode 100644 shared/data/community/src/androidMain/kotlin/com/kus/data/community/AndroidPlatformImageResolver.kt create mode 100644 shared/data/community/src/androidMain/kotlin/com/kus/data/community/Platform.android.kt create mode 100644 shared/data/community/src/androidMain/kotlin/com/kus/data/community/currentTimeMillis.android.kt create mode 100644 shared/data/community/src/androidMain/kotlin/com/kus/data/community/di/androidDataCommunityModule.kt create mode 100644 shared/data/community/src/commonMain/kotlin/com/kus/data/community/Platform.kt create mode 100644 shared/data/community/src/commonMain/kotlin/com/kus/data/community/PlatformImageResolver.kt create mode 100644 shared/data/community/src/commonMain/kotlin/com/kus/data/community/api/CommunityApi.kt create mode 100644 shared/data/community/src/commonMain/kotlin/com/kus/data/community/currentTimeMillis.kt create mode 100644 shared/data/community/src/commonMain/kotlin/com/kus/data/community/di/communityDataModule.kt create mode 100644 shared/data/community/src/commonMain/kotlin/com/kus/data/community/mapper/CommunityMapper.kt create mode 100644 shared/data/community/src/commonMain/kotlin/com/kus/data/community/model/ResolvedImage.kt create mode 100644 shared/data/community/src/commonMain/kotlin/com/kus/data/community/remote/request/PostCategoryRequest.kt create mode 100644 shared/data/community/src/commonMain/kotlin/com/kus/data/community/remote/request/PostCommentRequest.kt create mode 100644 shared/data/community/src/commonMain/kotlin/com/kus/data/community/remote/request/PostRequest.kt create mode 100644 shared/data/community/src/commonMain/kotlin/com/kus/data/community/remote/response/CommunityCommentReactionResponse.kt create mode 100644 shared/data/community/src/commonMain/kotlin/com/kus/data/community/remote/response/CommunityCreatePostResponse.kt create mode 100644 shared/data/community/src/commonMain/kotlin/com/kus/data/community/remote/response/CommunityPostCommentResponse.kt create mode 100644 shared/data/community/src/commonMain/kotlin/com/kus/data/community/remote/response/CommunityPostLikeResponse.kt create mode 100644 shared/data/community/src/commonMain/kotlin/com/kus/data/community/remote/response/CommunityPostListItemResponse.kt create mode 100644 shared/data/community/src/commonMain/kotlin/com/kus/data/community/remote/response/CommunityPostResponse.kt create mode 100644 shared/data/community/src/commonMain/kotlin/com/kus/data/community/remote/response/CommunityPostScrapResponse.kt create mode 100644 shared/data/community/src/commonMain/kotlin/com/kus/data/community/remote/response/CommunityPostUploadImageResponse.kt create mode 100644 shared/data/community/src/commonMain/kotlin/com/kus/data/community/remote/response/CommunityRankingResponse.kt create mode 100644 shared/data/community/src/commonMain/kotlin/com/kus/data/community/remote/response/PostResponse.kt create mode 100644 shared/data/community/src/commonMain/kotlin/com/kus/data/community/repository/CommunityRepositoryImpl.kt create mode 100644 shared/data/community/src/desktopMain/kotlin/com/kus/data/community/Platform.desktop.kt create mode 100644 shared/data/community/src/desktopMain/kotlin/com/kus/data/community/currentTimeMillis.desktop.kt create mode 100644 shared/data/community/src/iosMain/kotlin/com/kus/data/community/Platform.ios.kt create mode 100644 shared/data/community/src/iosMain/kotlin/com/kus/data/community/currentTimeMillis.ios.kt create mode 100644 shared/data/network/src/commonMain/kotlin/com/kus/data/network/model/RefreshResult.kt delete mode 100644 shared/data/tier/src/commonMain/kotlin/com/kus/shared/data/tier/remote/mapper/TierMapper.kt create mode 100644 shared/domain/auth/src/commonMain/kotlin/com/kus/domain/auth/repository/DeviceIdManager.kt create mode 100644 shared/domain/auth/src/commonMain/kotlin/com/kus/domain/auth/usecase/DeleteUserInfoUseCase.kt create mode 100644 shared/domain/community/.gitignore create mode 100644 shared/domain/community/build.gradle.kts create mode 100644 shared/domain/community/src/androidDeviceTest/kotlin/com/kus/domain/community/ExampleInstrumentedTest.kt create mode 100644 shared/domain/community/src/androidHostTest/kotlin/com/kus/domain/community/ExampleUnitTest.kt create mode 100644 shared/domain/community/src/androidMain/AndroidManifest.xml create mode 100644 shared/domain/community/src/androidMain/kotlin/com/kus/domain/community/Platform.android.kt create mode 100644 shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/Platform.kt create mode 100644 shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/di/communityDomainModule.kt create mode 100644 shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/model/AuthUserInfo.kt create mode 100644 shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/model/CommunityCommentReactionResponse.kt create mode 100644 shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/model/CommunityPost.kt create mode 100644 shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/model/CommunityPostComment.kt create mode 100644 shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/model/CommunityPostLike.kt create mode 100644 shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/model/CommunityPostListItem.kt create mode 100644 shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/model/CommunityPostScrap.kt create mode 100644 shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/model/CommunityRanking.kt create mode 100644 shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/model/LikeEvent.kt create mode 100644 shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/model/ListSortType.kt create mode 100644 shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/model/PostCategory.kt create mode 100644 shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/model/PostModification.kt create mode 100644 shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/model/RankingSortType.kt create mode 100644 shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/model/UploadImageException.kt create mode 100644 shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/model/UserRole.kt create mode 100644 shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/repository/CommunityRepository.kt create mode 100644 shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/usecase/DeleteCommunityCommentUseCase.kt create mode 100644 shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/usecase/DeleteCommunityPostUseCase.kt create mode 100644 shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/usecase/GetCommunityPostDetailUseCase.kt create mode 100644 shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/usecase/GetCommunityPostListUseCase.kt create mode 100644 shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/usecase/GetCommunityRankingListUseCase.kt create mode 100644 shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/usecase/PatchPostModifyUseCase.kt create mode 100644 shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/usecase/PostCommunityPostCommentReactUseCase.kt create mode 100644 shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/usecase/PostCommunityPostCommentReplyUseCase.kt create mode 100644 shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/usecase/PostCommunityPostCreateUseCase.kt create mode 100644 shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/usecase/PostCommunityPostDetailScrapUseCase.kt create mode 100644 shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/usecase/PostCommunityUploadImageUseCase.kt create mode 100644 shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/usecase/PostPostLikeUseCase.kt create mode 100644 shared/domain/community/src/desktopMain/kotlin/com/kus/domain/community/Platform.desktop.kt create mode 100644 shared/domain/community/src/iosMain/kotlin/com/kus/domain/community/Platform.ios.kt create mode 100644 shared/feature/community/src/androidMain/kotlin/com/kus/feature/community/ui/detail/HtmlBodyView.android.kt create mode 100644 shared/feature/community/src/androidMain/kotlin/com/kus/feature/community/ui/di/androidFeatureCommunityModule.kt create mode 100644 shared/feature/community/src/androidMain/kotlin/com/kus/feature/community/ui/write/AndroidCommunityEditor.kt create mode 100644 shared/feature/community/src/androidMain/kotlin/com/kus/feature/community/ui/write/AndroidCommunityEditorRenderer.kt create mode 100644 shared/feature/community/src/androidMain/kotlin/com/kus/feature/community/ui/write/AndroidEditorDelegate.kt create mode 100644 shared/feature/community/src/androidMain/kotlin/com/kus/feature/community/ui/write/image/AndroidImagePickerFactory.kt create mode 100644 shared/feature/community/src/commonMain/composeResources/drawable/bg_halo.png create mode 100644 shared/feature/community/src/commonMain/composeResources/drawable/ic_bold.png create mode 100644 shared/feature/community/src/commonMain/composeResources/drawable/ic_drop_down.xml create mode 100644 shared/feature/community/src/commonMain/composeResources/drawable/ic_insert_image.png create mode 100644 shared/feature/community/src/commonMain/composeResources/drawable/ic_medal_1.png create mode 100644 shared/feature/community/src/commonMain/composeResources/drawable/ic_medal_2.png create mode 100644 shared/feature/community/src/commonMain/composeResources/drawable/ic_medal_3.png create mode 100644 shared/feature/community/src/commonMain/composeResources/drawable/ic_pencil.xml create mode 100644 shared/feature/community/src/commonMain/composeResources/drawable/ic_redo.png create mode 100644 shared/feature/community/src/commonMain/composeResources/drawable/ic_undo.png create mode 100644 shared/feature/community/src/commonMain/composeResources/files/editor/purify.min.js create mode 100644 shared/feature/community/src/commonMain/composeResources/files/editor/quill.html create mode 100644 shared/feature/community/src/commonMain/composeResources/files/editor/quill.min.js create mode 100644 shared/feature/community/src/commonMain/composeResources/files/editor/quill.snow.css create mode 100644 shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/config/CommunityKeys.kt create mode 100644 shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/di/featureCommunityModule.kt create mode 100644 shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/model/CommunityPostModifyPayload.kt create mode 100644 shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/model/DeleteCommunityEvent.kt create mode 100644 shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/model/ReactionAction.kt delete mode 100644 shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/navigation/CommunityRoute.kt create mode 100644 shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/CommunityBoards.kt create mode 100644 shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/CommunityPhase.kt create mode 100644 shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/CommunityTab.kt create mode 100644 shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/CommunityUiState.kt create mode 100644 shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/CommunityViewModel.kt create mode 100644 shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/comment/CommentComponent.kt create mode 100644 shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/detail/CommunityDetailScreen.kt create mode 100644 shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/detail/CommunityDetailSuccessContent.kt create mode 100644 shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/detail/CommunityDetailUiState.kt create mode 100644 shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/detail/CommunityDetailViewModel.kt create mode 100644 shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/detail/HtmlBodyView.kt create mode 100644 shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/floatingButton/WriteFab.kt create mode 100644 shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/list/CommunityListContent.kt create mode 100644 shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/list/CommunityListFilterBar.kt create mode 100644 shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/list/CommunityListRow.kt create mode 100644 shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/mapper/CommunityUiMapper.kt create mode 100644 shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/model/CommunityPostCommentUi.kt create mode 100644 shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/model/CommunityPostUi.kt create mode 100644 shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/ranking/CommunityRankingContent.kt create mode 100644 shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/ranking/CommunityRankingTopCard.kt create mode 100644 shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/ranking/RankCardSize.kt create mode 100644 shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/ranking/RankingHeader.kt create mode 100644 shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/ranking/Top3RankingSection.kt create mode 100644 shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/util/ScrollUtil.kt create mode 100644 shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/util/StringUtil.kt create mode 100644 shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/write/CommunityEditorController.kt create mode 100644 shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/write/CommunityEditorRenderer.kt create mode 100644 shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/write/CommunityWriteScreen.kt create mode 100644 shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/write/CommunityWriteUiState.kt create mode 100644 shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/write/CommunityWriteViewModel.kt create mode 100644 shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/write/KusTopBarSlots.kt create mode 100644 shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/write/image/PlatformImagePicker.kt create mode 100644 shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/write/image/PlatformImagePickerFactory.kt create mode 100644 shared/feature/community/src/desktopMain/kotlin/com/kus/feature/community/ui/detail/HtmlBodyView.desktop.kt create mode 100644 shared/feature/community/src/iosMain/kotlin/com/kus/feature/community/ui/detail/HtmlBodyView.ios.kt rename shared/feature/tier/src/androidMain/kotlin/com/kus/feature/tier/ui/map/{TierMapPlatformAndroid.kt => TierMapAndroidPlatform.kt} (96%) delete mode 100644 shared/feature/tier/src/androidMain/res/drawable/ic_map_marker.xml create mode 100644 shared/feature/tier/src/androidMain/res/drawable/ic_marker_none.xml create mode 100644 shared/feature/tier/src/androidMain/res/drawable/ic_marker_partnership.xml create mode 100644 shared/feature/tier/src/commonMain/kotlin/com/kus/feature/tier/config/TierKeys.kt diff --git a/.gitignore b/.gitignore index 58f0bd23..e98adc63 100644 --- a/.gitignore +++ b/.gitignore @@ -30,9 +30,13 @@ DerivedData/ *.xcodeproj/xcuserdata/ *.xcuserstate *.car +*.xcworkspace +*.xcprivacy secrets/ +*.xcconfig + # Build build/ diff --git a/composeApp/build.gradle.kts b/composeApp/build.gradle.kts index 4301fd0c..89507517 100644 --- a/composeApp/build.gradle.kts +++ b/composeApp/build.gradle.kts @@ -51,6 +51,7 @@ kotlin { implementation(libs.androidx.lifecycle.viewmodelCompose) implementation(libs.androidx.lifecycle.runtimeCompose) implementation(libs.navigation.compose) + implementation(libs.compose.ui.graphics) implementation(libs.koin.compose) implementation(libs.kotlinx.serialization.json) @@ -65,6 +66,7 @@ kotlin { implementation(project(":shared:data:tier")) implementation(project(":shared:data:auth")) implementation(project(":shared:data:home")) + implementation(project(":shared:data:community")) implementation(project(":shared:data:detail")) implementation(project(":shared:data:evaluate")) @@ -83,7 +85,9 @@ kotlin { implementation(project(":shared:domain:firstLaunch")) implementation(project(":shared:domain:tier")) implementation(project(":shared:domain:auth")) + implementation(project(":shared:domain:community")) implementation(project(":shared:domain:home")) + implementation(project(":shared:domain:model")) implementation(project(":shared:domain:detail")) implementation(project(":shared:domain:evaluate")) implementation(project(":shared:domain:model")) @@ -159,11 +163,11 @@ dependencies { compose.desktop { application { - mainClass = "com.kus.kustaurant.MainKt" + mainClass = "com.kust.kustaurant.MainKt" nativeDistributions { targetFormats(TargetFormat.Dmg, TargetFormat.Msi, TargetFormat.Deb) - packageName = "com.kus.kustaurant" + packageName = "com.kust.kustaurant" packageVersion = "1.0.0" } } diff --git a/composeApp/src/androidMain/AndroidManifest.xml b/composeApp/src/androidMain/AndroidManifest.xml index a8564632..065aba65 100644 --- a/composeApp/src/androidMain/AndroidManifest.xml +++ b/composeApp/src/androidMain/AndroidManifest.xml @@ -2,6 +2,11 @@ + + + diff --git a/composeApp/src/androidMain/kotlin/com/kus/kustaurant/KusApplication.kt b/composeApp/src/androidMain/kotlin/com/kus/kustaurant/KusApplication.kt index 7328cfcf..ee6d4d86 100644 --- a/composeApp/src/androidMain/kotlin/com/kus/kustaurant/KusApplication.kt +++ b/composeApp/src/androidMain/kotlin/com/kus/kustaurant/KusApplication.kt @@ -3,7 +3,9 @@ package com.kus.kustaurant import android.app.Application import com.kus.core.config.BuildKonfig import com.kus.data.auth.di.androidDataAuthModule +import com.kus.data.community.di.androidDataCommunityModule import com.kus.data.firstLaunch.di.androidFirstLaunchModule +import com.kus.feature.community.ui.di.androidFeatureCommunityModule import com.kus.kustaurant.di.initKoin import com.kus.logging.initLogger import com.naver.maps.map.NaverMapSdk @@ -35,7 +37,9 @@ class KusApplication : Application() { additionalModules = listOf( androidFirstLaunchModule, androidDataAuthModule, - androidTierMapPlatformModule) + androidTierMapPlatformModule, + androidFeatureCommunityModule, + androidDataCommunityModule) ) } } \ No newline at end of file diff --git a/composeApp/src/androidMain/kotlin/com/kus/kustaurant/MainActivity.kt b/composeApp/src/androidMain/kotlin/com/kus/kustaurant/MainActivity.kt index e0571ee9..993de5ff 100644 --- a/composeApp/src/androidMain/kotlin/com/kus/kustaurant/MainActivity.kt +++ b/composeApp/src/androidMain/kotlin/com/kus/kustaurant/MainActivity.kt @@ -1,5 +1,6 @@ package com.kus.kustaurant +import android.graphics.Color import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.SystemBarStyle @@ -13,13 +14,13 @@ class MainActivity : ComponentActivity() { enableEdgeToEdge( statusBarStyle = SystemBarStyle.light( - android.graphics.Color.WHITE, - android.graphics.Color.WHITE, + Color.WHITE, + Color.WHITE, ), navigationBarStyle = SystemBarStyle.light( - android.graphics.Color.WHITE, - android.graphics.Color.WHITE, + Color.WHITE, + Color.WHITE, ), ) super.onCreate(savedInstanceState) diff --git a/composeApp/src/commonMain/kotlin/com/kus/kustaurant/App.kt b/composeApp/src/commonMain/kotlin/com/kus/kustaurant/App.kt index 886b7a0c..24f75e0a 100644 --- a/composeApp/src/commonMain/kotlin/com/kus/kustaurant/App.kt +++ b/composeApp/src/commonMain/kotlin/com/kus/kustaurant/App.kt @@ -1,27 +1,42 @@ package com.kus.kustaurant +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.systemBars import androidx.compose.foundation.layout.systemBarsPadding import androidx.compose.material3.Scaffold import androidx.compose.material3.SnackbarDuration -import androidx.compose.material3.SnackbarHost import androidx.compose.material3.SnackbarHostState import androidx.compose.material3.Surface import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import androidx.navigation.NavDestination.Companion.hasRoute import androidx.navigation.NavGraph.Companion.findStartDestination import androidx.navigation.NavHostController import androidx.navigation.NavOptionsBuilder import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.compose.rememberNavController +import com.kus.designsystem.component.LoginRequiredOverlay +import com.kus.designsystem.component.snackbar.KusSnackBarOverlay +import com.kus.designsystem.component.snackbar.LocalSnackBarBottomPadding import com.kus.designsystem.theme.KusTheme import com.kus.domain.auth.session.SessionEvent import com.kus.domain.auth.session.SessionEventBus import com.kus.feature.community.navigation.Community +import com.kus.feature.community.navigation.CommunityDetail +import com.kus.feature.community.navigation.CommunityWrite +import com.kus.feature.community.navigation.CommunityWriteModify import com.kus.feature.draw.navigation.Draw import com.kus.feature.home.navigation.Home import com.kus.feature.login.navigation.Login @@ -30,6 +45,8 @@ import com.kus.feature.tier.navigation.Tier import com.kus.kustaurant.navigation.BottomTab import com.kus.kustaurant.navigation.KusBottomBar import com.kus.kustaurant.navigation.KusNavHost +import com.kus.kustaurant.navigation.util.shouldShowBottomBar +import kotlinx.coroutines.delay import kotlinx.coroutines.launch import org.jetbrains.compose.ui.tooling.preview.Preview import org.koin.compose.koinInject @@ -48,23 +65,37 @@ fun App() { fun SetNavigation() { val navController = rememberNavController() val durationMillis = 400 + val snackDuration = 2800L val snackBarHostState = remember { SnackbarHostState() } val scope = rememberCoroutineScope() + val sessionBus: SessionEventBus = koinInject() + var showRequireLoginPopup by remember { mutableStateOf(false) } + val onShowMessage: (String) -> Unit = remember(snackBarHostState, scope) { { message -> scope.launch { + snackBarHostState.currentSnackbarData?.dismiss() + val dismissJob = launch { + delay(snackDuration) + val current = snackBarHostState.currentSnackbarData + if (current?.visuals?.message == message) { + current.dismiss() + } + } + snackBarHostState.showSnackbar( message = message, withDismissAction = false, - duration = SnackbarDuration.Short + duration = SnackbarDuration.Indefinite ) + + dismissJob.cancel() } } } - val sessionBus: SessionEventBus = koinInject() LaunchedEffect(Unit) { sessionBus.events.collect { ev -> when (ev) { @@ -74,40 +105,74 @@ fun SetNavigation() { launchSingleTop = true } } + + SessionEvent.LoginRequired -> { + showRequireLoginPopup = true + } } } } val navBackStackEntry by navController.currentBackStackEntryAsState() - val currentRoute = navBackStackEntry?.destination?.route - - val showBottomBar = shouldShowBottomBar(currentRoute) + val destination = navBackStackEntry?.destination + val showBottomBar = shouldShowBottomBar(destination) + val currentRoute = destination?.route val selectedKey = BottomTab.fromRoute(currentRoute).key - + val applySystemBarsPadding = !isEdgeToEdgeScreen(currentRoute) + val isWriter = + navBackStackEntry?.destination?.hasRoute() == true || + navBackStackEntry?.destination?.hasRoute() == true || + navBackStackEntry?.destination?.hasRoute() == true + + CompositionLocalProvider( + LocalSnackBarBottomPadding provides if (isWriter) 52.dp else 16.dp + ) { + Scaffold( + bottomBar = { + SetBottomBar( + showBottomBar = showBottomBar, + selectedKey = selectedKey, + navController = navController, + ) + }, + modifier = if (applySystemBarsPadding) Modifier.systemBarsPadding() else Modifier, + contentWindowInsets = WindowInsets.systemBars, + ) { padding -> + Box( + modifier = Modifier + .padding(padding) + .fillMaxSize() + ) { + KusNavHost( + navController = navController, + durationMillis = durationMillis, + onShowMessage = onShowMessage, + modifier = Modifier + .fillMaxSize(), + ) - Scaffold( - bottomBar = { - SetBottomBar( - showBottomBar = showBottomBar, - selectedKey = selectedKey, - navController = navController, - ) - }, - snackbarHost = { - KusSnackBarHost(hostState = snackBarHostState) - }, - modifier = if (applySystemBarsPadding) Modifier.systemBarsPadding() else Modifier, - ) { padding -> - KusNavHost( - navController = navController, - durationMillis = durationMillis, - onShowMessage = onShowMessage, - modifier = Modifier.padding(padding), - ) - } + KusSnackBarOverlay( + hostState = snackBarHostState + ) + + if (showRequireLoginPopup) { + LoginRequiredOverlay( + onLoginButtonClick = { + showRequireLoginPopup = false + navController.navigate(Login) { + popUpTo(0) { inclusive = true } + launchSingleTop = true + } + }, + onDismissRequest = { showRequireLoginPopup = false }, + ) + } + } + } } + @Composable private fun SetBottomBar( showBottomBar: Boolean, @@ -154,19 +219,6 @@ private fun NavOptionsBuilder.tabOptions(navController: NavHostController) { popUpTo(navController.graph.findStartDestination().id) { saveState = true } } -@Composable -fun KusSnackBarHost( - hostState: SnackbarHostState, - modifier: Modifier = Modifier, -) { - SnackbarHost( - hostState = hostState, - modifier = modifier, - ) { snackBarData -> - // TODO Custom Snackbar Composable - } -} - @Preview @Composable private fun AppPreview() { diff --git a/composeApp/src/commonMain/kotlin/com/kus/kustaurant/di/initKoin.kt b/composeApp/src/commonMain/kotlin/com/kus/kustaurant/di/initKoin.kt index ce13b16e..20bb955f 100644 --- a/composeApp/src/commonMain/kotlin/com/kus/kustaurant/di/initKoin.kt +++ b/composeApp/src/commonMain/kotlin/com/kus/kustaurant/di/initKoin.kt @@ -3,9 +3,12 @@ package com.kus.kustaurant.di import com.kus.core.config.di.configModule import com.kus.data.firstLaunch.di.firstLaunchDataModule import com.kus.data.auth.di.authDataModule +import com.kus.data.community.di.communityDataModule import com.kus.data.network.di.networkModule import com.kus.domain.firstLaunch.di.firstLaunchDomainModule import com.kus.domain.auth.di.authDomainModule +import com.kus.domain.community.di.communityDomainModule +import com.kus.feature.community.di.communityFeatureModule import com.kus.feature.detail.di.detailFeatureModule import com.kus.feature.evaluate.di.evaluateFeatureModule import com.kus.feature.home.di.homeFeatureModule @@ -42,6 +45,7 @@ fun initKoin( authDomainModule, tierDomainModule, homeDomainModule, + communityDomainModule, detailDomainModule, evaluateDomainModule, @@ -51,6 +55,7 @@ fun initKoin( authDataModule, tierDataModule, homeDataModule, + communityDataModule, detailDataModule, evaluateDataModule, @@ -60,6 +65,7 @@ fun initKoin( featureLoginModule, tierFeatureModule, homeFeatureModule, + communityFeatureModule, detailFeatureModule, evaluateFeatureModule ) diff --git a/composeApp/src/commonMain/kotlin/com/kus/kustaurant/navigation/HIDE_BOTTOM_BAR_ROUTE.kt b/composeApp/src/commonMain/kotlin/com/kus/kustaurant/navigation/HIDE_BOTTOM_BAR_ROUTE.kt new file mode 100644 index 00000000..cd4bc794 --- /dev/null +++ b/composeApp/src/commonMain/kotlin/com/kus/kustaurant/navigation/HIDE_BOTTOM_BAR_ROUTE.kt @@ -0,0 +1,19 @@ +package com.kus.kustaurant.navigation + +import kotlin.reflect.KClass +import com.kus.feature.community.navigation.CommunityDetail +import com.kus.feature.community.navigation.CommunityWrite +import com.kus.feature.community.navigation.CommunityWriteModify +import com.kus.feature.login.navigation.Login +import com.kus.feature.onboarding.navigatioin.Onboarding +import com.kus.feature.splash.navigation.Splash + +val HIDE_BOTTOM_BAR_ROUTES: Set> = setOf( + Login::class, + Splash::class, + Onboarding::class, + CommunityDetail::class, + CommunityWrite::class, + CommunityWriteModify::class, +) + diff --git a/composeApp/src/commonMain/kotlin/com/kus/kustaurant/navigation/KusNavHost.kt b/composeApp/src/commonMain/kotlin/com/kus/kustaurant/navigation/KusNavHost.kt index 5d5cd760..14001c75 100644 --- a/composeApp/src/commonMain/kotlin/com/kus/kustaurant/navigation/KusNavHost.kt +++ b/composeApp/src/commonMain/kotlin/com/kus/kustaurant/navigation/KusNavHost.kt @@ -10,6 +10,15 @@ import androidx.compose.ui.Modifier import androidx.navigation.NavHostController import androidx.navigation.compose.NavHost import com.kus.core.serialization.KusJson +import com.kus.feature.community.config.CommunityKeys.COMMUNITY_LIST_REFRESH +import com.kus.feature.community.config.CommunityKeys.COMMUNITY_POST_DELETE_ID +import com.kus.feature.community.config.CommunityKeys.COMMUNITY_POST_EDIT_RESULT +import com.kus.feature.community.config.CommunityKeys.COMMUNITY_POST_UPDATE_PAYLOAD +import com.kus.feature.community.model.CommunityPostModifyPayload +import com.kus.feature.community.navigation.Community +import com.kus.feature.community.navigation.CommunityDetail +import com.kus.feature.community.navigation.CommunityWrite +import com.kus.feature.community.navigation.CommunityWriteModify import com.kus.feature.community.navigation.communityNavGraph import com.kus.feature.detail.navigation.Detail import com.kus.feature.detail.navigation.detailNavGraph @@ -27,9 +36,13 @@ import com.kus.feature.search.navigation.navigateToSearch import com.kus.feature.search.navigation.searchNavGraph import com.kus.feature.splash.navigation.Splash import com.kus.feature.splash.navigation.splashNavGraph +import com.kus.feature.tier.config.TierKeys.TIER_INITIAL_JSON +import com.kus.feature.tier.config.TierKeys.TIER_RESULT_JSON +import com.kus.feature.tier.navigation.Tier import com.kus.feature.tier.navigation.TierCategorySelect import com.kus.feature.tier.navigation.tierNavGraph import com.kus.feature.tier.ui.TierFilterState +import com.kus.shared.domain.model.tier.filter.Cuisine @Composable fun KusNavHost( @@ -108,16 +121,27 @@ fun KusNavHost( homeNavGraph( navigateToSearch = navController::navigateToSearch, navigateToAlert = { }, - navigateToTier = { /* TODO */ }, + navigateToTier = { cuisine: Cuisine -> + val cuisine = Cuisine.entries.find { it == cuisine } ?: Cuisine.ALL + val filter = TierFilterState(cuisines = setOf(cuisine)).normalized() + val json = KusJson.json.encodeToString(filter) + + navController.currentBackStackEntry + ?.savedStateHandle + ?.set(TIER_INITIAL_JSON, json) + + navController.navigate(Tier) + }, navigateToDetail = { }, ) drawNavGraph(onShowMessage = onShowMessage) tierNavGraph( + onShowMessage = onShowMessage, initialProvider = { val json = navController.previousBackStackEntry ?.savedStateHandle - ?.get("tier_initial_json") + ?.get(TIER_INITIAL_JSON) if (json == null) TierFilterState() else KusJson.json.decodeFromString(json) @@ -126,7 +150,7 @@ fun KusNavHost( val json = KusJson.json.encodeToString(initial) navController.currentBackStackEntry ?.savedStateHandle - ?.set("tier_initial_json", json) + ?.set(TIER_INITIAL_JSON, json) navController.navigate(TierCategorySelect) }, @@ -135,14 +159,71 @@ fun KusNavHost( val json = KusJson.json.encodeToString(result) navController.previousBackStackEntry ?.savedStateHandle - ?.set("tier_result_json", json) + ?.set(TIER_RESULT_JSON, json) navController.popBackStack() }, onBackButtonClick = { navController.popBackStack() } ) - communityNavGraph(onShowMessage = onShowMessage) + communityNavGraph( + onShowMessage = onShowMessage, + onPostClick = { postId -> + navController.navigate(CommunityDetail(postId)) { + popUpTo { inclusive = false } + launchSingleTop = true + } + }, + onPostCreated = { postId -> + navController.getBackStackEntry() + .savedStateHandle[COMMUNITY_LIST_REFRESH] = true + + navController.navigate(CommunityDetail(postId)) { + popUpTo { inclusive = false } + launchSingleTop = true + } + }, + onPostModified = { payload -> + val json = + KusJson.json.encodeToString(CommunityPostModifyPayload.serializer(), payload) + navController.previousBackStackEntry + ?.savedStateHandle + ?.set(COMMUNITY_POST_EDIT_RESULT, json) + navController.popBackStack() + }, + onBackButtonClick = { navController.popBackStack() }, + onPostWriteClick = { + navController.navigate(CommunityWrite) + }, + onPostModifyClick = { encoded -> + navController.navigate(CommunityWriteModify(encoded)) + }, + onSearchClick = {}, + onPostModifiedInDetail = { payload -> + val json = + KusJson.json.encodeToString(CommunityPostModifyPayload.serializer(), payload) + navController.getBackStackEntry() + .savedStateHandle[COMMUNITY_POST_UPDATE_PAYLOAD] = json + }, + onDetailBackClick = { payload -> + if (payload != null) { + val json = KusJson.json.encodeToString( + CommunityPostModifyPayload.serializer(), + payload + ) + navController.getBackStackEntry() + .savedStateHandle[COMMUNITY_POST_UPDATE_PAYLOAD] = json + } + navController.popBackStack() + }, + onPostDeletedInDetail = { postId -> + navController.previousBackStackEntry + ?.savedStateHandle + ?.set(COMMUNITY_POST_DELETE_ID, postId) + + navController.popBackStack() + }, + ) myNavGraph(onShowMessage = onShowMessage) detailNavGraph( diff --git a/composeApp/src/commonMain/kotlin/com/kus/kustaurant/navigation/util/NavigationUtil.kt b/composeApp/src/commonMain/kotlin/com/kus/kustaurant/navigation/util/NavigationUtil.kt new file mode 100644 index 00000000..794d1178 --- /dev/null +++ b/composeApp/src/commonMain/kotlin/com/kus/kustaurant/navigation/util/NavigationUtil.kt @@ -0,0 +1,16 @@ +package com.kus.kustaurant.navigation.util + +import androidx.navigation.NavDestination +import androidx.navigation.NavDestination.Companion.hasRoute +import androidx.navigation.NavDestination.Companion.hierarchy +import com.kus.kustaurant.navigation.HIDE_BOTTOM_BAR_ROUTES + +fun shouldShowBottomBar(destination: NavDestination?): Boolean { + if (destination == null) return true + + return destination.hierarchy.none { dest -> + HIDE_BOTTOM_BAR_ROUTES.any { routeClass -> + dest.hasRoute(routeClass) + } + } +} diff --git a/composeApp/src/iosMain/kotlin/com/kus/kustaurant/MainViewController.kt b/composeApp/src/iosMain/kotlin/com/kus/kustaurant/MainViewController.kt index a1057a0b..968867aa 100644 --- a/composeApp/src/iosMain/kotlin/com/kus/kustaurant/MainViewController.kt +++ b/composeApp/src/iosMain/kotlin/com/kus/kustaurant/MainViewController.kt @@ -10,6 +10,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.window.ComposeUIViewController import com.kus.appkit.di.iosAuthModule +import com.kus.appkit.di.iosCommunityModule import com.kus.appkit.di.iosTierMapPlatformModule import com.kus.data.auth.di.iosAuthLocalModule import com.kus.data.firstLaunch.di.iosFirstLaunchModule @@ -30,6 +31,7 @@ fun MainViewController() = ComposeUIViewController { iosTierMapPlatformModule, iosAuthModule, iosAuthLocalModule, + iosCommunityModule ) ) koinStarted = true diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index e41f0298..235f46ea 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -39,6 +39,9 @@ naverMaps = "3.23.0" buildkonfig = "0.15.1" naverOauth = "5.11.0" kotlinx-serialization = "1.7.3" +okio = "3.9.0" +multiplatform-settings = "1.1.1" +kotlinx-io = "0.8.2" [libraries] kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin" } @@ -89,7 +92,7 @@ androidx-core-splashscreen = { module = "androidx.core:core-splashscreen", versi google-material = { module = "com.google.android.material:material", version.ref = "material" } androidx-uiautomator = { group = "androidx.test.uiautomator", name = "uiautomator", version.ref = "uiautomator" } androidx-benchmark-macro-junit4 = { group = "androidx.benchmark", name = "benchmark-macro-junit4", version.ref = "benchmarkMacroJunit4" } - +okio = { module = "com.squareup.okio:okio", version.ref = "okio" } napier-log = { group = "io.github.aakira", name = "napier", version.ref = "napier" } kamel-image-default = { module = "media.kamel:kamel-image-default", version.ref = "kamel" } @@ -102,6 +105,9 @@ naver-oauth = { group = "com.navercorp.nid", name = "oauth", version.ref = "nave kotlinx-serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "kotlinx-serialization" } +compose-ui-graphics = { module = "org.jetbrains.compose.ui:ui-graphics", version.ref = "composeMultiplatform" } +multiplatform-settings = { group = "com.russhwolf", name = "multiplatform-settings", version.ref = "multiplatform-settings" } + [plugins] androidApplication = { id = "com.android.application", version.ref = "agp" } androidLibrary = { id = "com.android.library", version.ref = "agp" } diff --git a/iosApp/editor/purify.min.js b/iosApp/editor/purify.min.js new file mode 100644 index 00000000..871c80e4 --- /dev/null +++ b/iosApp/editor/purify.min.js @@ -0,0 +1,3 @@ +/*! @license DOMPurify 3.0.8 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.0.8/LICENSE */ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).DOMPurify=t()}(this,(function(){"use strict";const{entries:e,setPrototypeOf:t,isFrozen:n,getPrototypeOf:o,getOwnPropertyDescriptor:r}=Object;let{freeze:i,seal:a,create:l}=Object,{apply:c,construct:s}="undefined"!=typeof Reflect&&Reflect;i||(i=function(e){return e}),a||(a=function(e){return e}),c||(c=function(e,t,n){return e.apply(t,n)}),s||(s=function(e,t){return new e(...t)});const u=b(Array.prototype.forEach),m=b(Array.prototype.pop),f=b(Array.prototype.push),p=b(String.prototype.toLowerCase),d=b(String.prototype.toString),h=b(String.prototype.match),g=b(String.prototype.replace),T=b(String.prototype.indexOf),y=b(String.prototype.trim),E=b(RegExp.prototype.test),A=(_=TypeError,function(){for(var e=arguments.length,t=new Array(e),n=0;n1?n-1:0),r=1;r2&&void 0!==arguments[2]?arguments[2]:p;t&&t(e,null);let i=o.length;for(;i--;){let t=o[i];if("string"==typeof t){const e=r(t);e!==t&&(n(o)||(o[i]=e),t=e)}e[t]=!0}return e}function S(e){for(let t=0;t/gm),z=a(/\${[\w\W]*}/gm),B=a(/^data-[\-\w.\u00B7-\uFFFF]/),W=a(/^aria-[\-\w]+$/),G=a(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),Y=a(/^(?:\w+script|data):/i),j=a(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),q=a(/^html$/i);var X=Object.freeze({__proto__:null,MUSTACHE_EXPR:F,ERB_EXPR:H,TMPLIT_EXPR:z,DATA_ATTR:B,ARIA_ATTR:W,IS_ALLOWED_URI:G,IS_SCRIPT_OR_DATA:Y,ATTR_WHITESPACE:j,DOCTYPE_NAME:q});const K=function(){return"undefined"==typeof window?null:window},V=function(e,t){if("object"!=typeof e||"function"!=typeof e.createPolicy)return null;let n=null;const o="data-tt-policy-suffix";t&&t.hasAttribute(o)&&(n=t.getAttribute(o));const r="dompurify"+(n?"#"+n:"");try{return e.createPolicy(r,{createHTML:e=>e,createScriptURL:e=>e})}catch(e){return console.warn("TrustedTypes policy "+r+" could not be created."),null}};var $=function t(){let n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:K();const o=e=>t(e);if(o.version="3.0.8",o.removed=[],!n||!n.document||9!==n.document.nodeType)return o.isSupported=!1,o;let{document:r}=n;const a=r,c=a.currentScript,{DocumentFragment:s,HTMLTemplateElement:_,Node:b,Element:S,NodeFilter:F,NamedNodeMap:H=n.NamedNodeMap||n.MozNamedAttrMap,HTMLFormElement:z,DOMParser:B,trustedTypes:W}=n,Y=S.prototype,j=w(Y,"cloneNode"),$=w(Y,"nextSibling"),Z=w(Y,"childNodes"),J=w(Y,"parentNode");if("function"==typeof _){const e=r.createElement("template");e.content&&e.content.ownerDocument&&(r=e.content.ownerDocument)}let Q,ee="";const{implementation:te,createNodeIterator:ne,createDocumentFragment:oe,getElementsByTagName:re}=r,{importNode:ie}=a;let ae={};o.isSupported="function"==typeof e&&"function"==typeof J&&te&&void 0!==te.createHTMLDocument;const{MUSTACHE_EXPR:le,ERB_EXPR:ce,TMPLIT_EXPR:se,DATA_ATTR:ue,ARIA_ATTR:me,IS_SCRIPT_OR_DATA:fe,ATTR_WHITESPACE:pe}=X;let{IS_ALLOWED_URI:de}=X,he=null;const ge=N({},[...D,...L,...v,...k,...O]);let Te=null;const ye=N({},[...I,...M,...U,...P]);let Ee=Object.seal(l(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),Ae=null,_e=null,be=!0,Ne=!0,Se=!1,Re=!0,we=!1,De=!1,Le=!1,ve=!1,xe=!1,ke=!1,Ce=!1,Oe=!0,Ie=!1;const Me="user-content-";let Ue=!0,Pe=!1,Fe={},He=null;const ze=N({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]);let Be=null;const We=N({},["audio","video","img","source","image","track"]);let Ge=null;const Ye=N({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),je="http://www.w3.org/1998/Math/MathML",qe="http://www.w3.org/2000/svg",Xe="http://www.w3.org/1999/xhtml";let Ke=Xe,Ve=!1,$e=null;const Ze=N({},[je,qe,Xe],d);let Je=null;const Qe=["application/xhtml+xml","text/html"],et="text/html";let tt=null,nt=null;const ot=r.createElement("form"),rt=function(e){return e instanceof RegExp||e instanceof Function},it=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(!nt||nt!==e){if(e&&"object"==typeof e||(e={}),e=R(e),Je=-1===Qe.indexOf(e.PARSER_MEDIA_TYPE)?et:e.PARSER_MEDIA_TYPE,tt="application/xhtml+xml"===Je?d:p,he="ALLOWED_TAGS"in e?N({},e.ALLOWED_TAGS,tt):ge,Te="ALLOWED_ATTR"in e?N({},e.ALLOWED_ATTR,tt):ye,$e="ALLOWED_NAMESPACES"in e?N({},e.ALLOWED_NAMESPACES,d):Ze,Ge="ADD_URI_SAFE_ATTR"in e?N(R(Ye),e.ADD_URI_SAFE_ATTR,tt):Ye,Be="ADD_DATA_URI_TAGS"in e?N(R(We),e.ADD_DATA_URI_TAGS,tt):We,He="FORBID_CONTENTS"in e?N({},e.FORBID_CONTENTS,tt):ze,Ae="FORBID_TAGS"in e?N({},e.FORBID_TAGS,tt):{},_e="FORBID_ATTR"in e?N({},e.FORBID_ATTR,tt):{},Fe="USE_PROFILES"in e&&e.USE_PROFILES,be=!1!==e.ALLOW_ARIA_ATTR,Ne=!1!==e.ALLOW_DATA_ATTR,Se=e.ALLOW_UNKNOWN_PROTOCOLS||!1,Re=!1!==e.ALLOW_SELF_CLOSE_IN_ATTR,we=e.SAFE_FOR_TEMPLATES||!1,De=e.WHOLE_DOCUMENT||!1,xe=e.RETURN_DOM||!1,ke=e.RETURN_DOM_FRAGMENT||!1,Ce=e.RETURN_TRUSTED_TYPE||!1,ve=e.FORCE_BODY||!1,Oe=!1!==e.SANITIZE_DOM,Ie=e.SANITIZE_NAMED_PROPS||!1,Ue=!1!==e.KEEP_CONTENT,Pe=e.IN_PLACE||!1,de=e.ALLOWED_URI_REGEXP||G,Ke=e.NAMESPACE||Xe,Ee=e.CUSTOM_ELEMENT_HANDLING||{},e.CUSTOM_ELEMENT_HANDLING&&rt(e.CUSTOM_ELEMENT_HANDLING.tagNameCheck)&&(Ee.tagNameCheck=e.CUSTOM_ELEMENT_HANDLING.tagNameCheck),e.CUSTOM_ELEMENT_HANDLING&&rt(e.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)&&(Ee.attributeNameCheck=e.CUSTOM_ELEMENT_HANDLING.attributeNameCheck),e.CUSTOM_ELEMENT_HANDLING&&"boolean"==typeof e.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements&&(Ee.allowCustomizedBuiltInElements=e.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements),we&&(Ne=!1),ke&&(xe=!0),Fe&&(he=N({},O),Te=[],!0===Fe.html&&(N(he,D),N(Te,I)),!0===Fe.svg&&(N(he,L),N(Te,M),N(Te,P)),!0===Fe.svgFilters&&(N(he,v),N(Te,M),N(Te,P)),!0===Fe.mathMl&&(N(he,k),N(Te,U),N(Te,P))),e.ADD_TAGS&&(he===ge&&(he=R(he)),N(he,e.ADD_TAGS,tt)),e.ADD_ATTR&&(Te===ye&&(Te=R(Te)),N(Te,e.ADD_ATTR,tt)),e.ADD_URI_SAFE_ATTR&&N(Ge,e.ADD_URI_SAFE_ATTR,tt),e.FORBID_CONTENTS&&(He===ze&&(He=R(He)),N(He,e.FORBID_CONTENTS,tt)),Ue&&(he["#text"]=!0),De&&N(he,["html","head","body"]),he.table&&(N(he,["tbody"]),delete Ae.tbody),e.TRUSTED_TYPES_POLICY){if("function"!=typeof e.TRUSTED_TYPES_POLICY.createHTML)throw A('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');if("function"!=typeof e.TRUSTED_TYPES_POLICY.createScriptURL)throw A('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');Q=e.TRUSTED_TYPES_POLICY,ee=Q.createHTML("")}else void 0===Q&&(Q=V(W,c)),null!==Q&&"string"==typeof ee&&(ee=Q.createHTML(""));i&&i(e),nt=e}},at=N({},["mi","mo","mn","ms","mtext"]),lt=N({},["foreignobject","desc","title","annotation-xml"]),ct=N({},["title","style","font","a","script"]),st=N({},[...L,...v,...x]),ut=N({},[...k,...C]),mt=function(e){let t=J(e);t&&t.tagName||(t={namespaceURI:Ke,tagName:"template"});const n=p(e.tagName),o=p(t.tagName);return!!$e[e.namespaceURI]&&(e.namespaceURI===qe?t.namespaceURI===Xe?"svg"===n:t.namespaceURI===je?"svg"===n&&("annotation-xml"===o||at[o]):Boolean(st[n]):e.namespaceURI===je?t.namespaceURI===Xe?"math"===n:t.namespaceURI===qe?"math"===n&<[o]:Boolean(ut[n]):e.namespaceURI===Xe?!(t.namespaceURI===qe&&!lt[o])&&(!(t.namespaceURI===je&&!at[o])&&(!ut[n]&&(ct[n]||!st[n]))):!("application/xhtml+xml"!==Je||!$e[e.namespaceURI]))},ft=function(e){f(o.removed,{element:e});try{e.parentNode.removeChild(e)}catch(t){e.remove()}},pt=function(e,t){try{f(o.removed,{attribute:t.getAttributeNode(e),from:t})}catch(e){f(o.removed,{attribute:null,from:t})}if(t.removeAttribute(e),"is"===e&&!Te[e])if(xe||ke)try{ft(t)}catch(e){}else try{t.setAttribute(e,"")}catch(e){}},dt=function(e){let t=null,n=null;if(ve)e=""+e;else{const t=h(e,/^[\r\n\t ]+/);n=t&&t[0]}"application/xhtml+xml"===Je&&Ke===Xe&&(e=''+e+"");const o=Q?Q.createHTML(e):e;if(Ke===Xe)try{t=(new B).parseFromString(o,Je)}catch(e){}if(!t||!t.documentElement){t=te.createDocument(Ke,"template",null);try{t.documentElement.innerHTML=Ve?ee:o}catch(e){}}const i=t.body||t.documentElement;return e&&n&&i.insertBefore(r.createTextNode(n),i.childNodes[0]||null),Ke===Xe?re.call(t,De?"html":"body")[0]:De?t.documentElement:i},ht=function(e){return ne.call(e.ownerDocument||e,e,F.SHOW_ELEMENT|F.SHOW_COMMENT|F.SHOW_TEXT,null)},gt=function(e){return e instanceof z&&("string"!=typeof e.nodeName||"string"!=typeof e.textContent||"function"!=typeof e.removeChild||!(e.attributes instanceof H)||"function"!=typeof e.removeAttribute||"function"!=typeof e.setAttribute||"string"!=typeof e.namespaceURI||"function"!=typeof e.insertBefore||"function"!=typeof e.hasChildNodes)},Tt=function(e){return"function"==typeof b&&e instanceof b},yt=function(e,t,n){ae[e]&&u(ae[e],(e=>{e.call(o,t,n,nt)}))},Et=function(e){let t=null;if(yt("beforeSanitizeElements",e,null),gt(e))return ft(e),!0;const n=tt(e.nodeName);if(yt("uponSanitizeElement",e,{tagName:n,allowedTags:he}),e.hasChildNodes()&&!Tt(e.firstElementChild)&&E(/<[/\w]/g,e.innerHTML)&&E(/<[/\w]/g,e.textContent))return ft(e),!0;if(!he[n]||Ae[n]){if(!Ae[n]&&_t(n)){if(Ee.tagNameCheck instanceof RegExp&&E(Ee.tagNameCheck,n))return!1;if(Ee.tagNameCheck instanceof Function&&Ee.tagNameCheck(n))return!1}if(Ue&&!He[n]){const t=J(e)||e.parentNode,n=Z(e)||e.childNodes;if(n&&t){for(let o=n.length-1;o>=0;--o)t.insertBefore(j(n[o],!0),$(e))}}return ft(e),!0}return e instanceof S&&!mt(e)?(ft(e),!0):"noscript"!==n&&"noembed"!==n&&"noframes"!==n||!E(/<\/no(script|embed|frames)/i,e.innerHTML)?(we&&3===e.nodeType&&(t=e.textContent,u([le,ce,se],(e=>{t=g(t,e," ")})),e.textContent!==t&&(f(o.removed,{element:e.cloneNode()}),e.textContent=t)),yt("afterSanitizeElements",e,null),!1):(ft(e),!0)},At=function(e,t,n){if(Oe&&("id"===t||"name"===t)&&(n in r||n in ot))return!1;if(Ne&&!_e[t]&&E(ue,t));else if(be&&E(me,t));else if(!Te[t]||_e[t]){if(!(_t(e)&&(Ee.tagNameCheck instanceof RegExp&&E(Ee.tagNameCheck,e)||Ee.tagNameCheck instanceof Function&&Ee.tagNameCheck(e))&&(Ee.attributeNameCheck instanceof RegExp&&E(Ee.attributeNameCheck,t)||Ee.attributeNameCheck instanceof Function&&Ee.attributeNameCheck(t))||"is"===t&&Ee.allowCustomizedBuiltInElements&&(Ee.tagNameCheck instanceof RegExp&&E(Ee.tagNameCheck,n)||Ee.tagNameCheck instanceof Function&&Ee.tagNameCheck(n))))return!1}else if(Ge[t]);else if(E(de,g(n,pe,"")));else if("src"!==t&&"xlink:href"!==t&&"href"!==t||"script"===e||0!==T(n,"data:")||!Be[e]){if(Se&&!E(fe,g(n,pe,"")));else if(n)return!1}else;return!0},_t=function(e){return e.indexOf("-")>0},bt=function(e){yt("beforeSanitizeAttributes",e,null);const{attributes:t}=e;if(!t)return;const n={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:Te};let r=t.length;for(;r--;){const i=t[r],{name:a,namespaceURI:l,value:c}=i,s=tt(a);let f="value"===a?c:y(c);if(n.attrName=s,n.attrValue=f,n.keepAttr=!0,n.forceKeepAttr=void 0,yt("uponSanitizeAttribute",e,n),f=n.attrValue,n.forceKeepAttr)continue;if(pt(a,e),!n.keepAttr)continue;if(!Re&&E(/\/>/i,f)){pt(a,e);continue}we&&u([le,ce,se],(e=>{f=g(f,e," ")}));const p=tt(e.nodeName);if(At(p,s,f)){if(!Ie||"id"!==s&&"name"!==s||(pt(a,e),f=Me+f),Q&&"object"==typeof W&&"function"==typeof W.getAttributeType)if(l);else switch(W.getAttributeType(p,s)){case"TrustedHTML":f=Q.createHTML(f);break;case"TrustedScriptURL":f=Q.createScriptURL(f)}try{l?e.setAttributeNS(l,a,f):e.setAttribute(a,f),m(o.removed)}catch(e){}}}yt("afterSanitizeAttributes",e,null)},Nt=function e(t){let n=null;const o=ht(t);for(yt("beforeSanitizeShadowDOM",t,null);n=o.nextNode();)yt("uponSanitizeShadowNode",n,null),Et(n)||(n.content instanceof s&&e(n.content),bt(n));yt("afterSanitizeShadowDOM",t,null)};return o.sanitize=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=null,r=null,i=null,l=null;if(Ve=!e,Ve&&(e="\x3c!--\x3e"),"string"!=typeof e&&!Tt(e)){if("function"!=typeof e.toString)throw A("toString is not a function");if("string"!=typeof(e=e.toString()))throw A("dirty is not a string, aborting")}if(!o.isSupported)return e;if(Le||it(t),o.removed=[],"string"==typeof e&&(Pe=!1),Pe){if(e.nodeName){const t=tt(e.nodeName);if(!he[t]||Ae[t])throw A("root node is forbidden and cannot be sanitized in-place")}}else if(e instanceof b)n=dt("\x3c!----\x3e"),r=n.ownerDocument.importNode(e,!0),1===r.nodeType&&"BODY"===r.nodeName||"HTML"===r.nodeName?n=r:n.appendChild(r);else{if(!xe&&!we&&!De&&-1===e.indexOf("<"))return Q&&Ce?Q.createHTML(e):e;if(n=dt(e),!n)return xe?null:Ce?ee:""}n&&ve&&ft(n.firstChild);const c=ht(Pe?e:n);for(;i=c.nextNode();)Et(i)||(i.content instanceof s&&Nt(i.content),bt(i));if(Pe)return e;if(xe){if(ke)for(l=oe.call(n.ownerDocument);n.firstChild;)l.appendChild(n.firstChild);else l=n;return(Te.shadowroot||Te.shadowrootmode)&&(l=ie.call(a,l,!0)),l}let m=De?n.outerHTML:n.innerHTML;return De&&he["!doctype"]&&n.ownerDocument&&n.ownerDocument.doctype&&n.ownerDocument.doctype.name&&E(q,n.ownerDocument.doctype.name)&&(m="\n"+m),we&&u([le,ce,se],(e=>{m=g(m,e," ")})),Q&&Ce?Q.createHTML(m):m},o.setConfig=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};it(e),Le=!0},o.clearConfig=function(){nt=null,Le=!1},o.isValidAttribute=function(e,t,n){nt||it({});const o=tt(e),r=tt(t);return At(o,r,n)},o.addHook=function(e,t){"function"==typeof t&&(ae[e]=ae[e]||[],f(ae[e],t))},o.removeHook=function(e){if(ae[e])return m(ae[e])},o.removeHooks=function(e){ae[e]&&(ae[e]=[])},o.removeAllHooks=function(){ae={}},o}();return $})); +//# sourceMappingURL=purify.min.js.map diff --git a/iosApp/editor/quill.html b/iosApp/editor/quill.html new file mode 100644 index 00000000..b4ec786e --- /dev/null +++ b/iosApp/editor/quill.html @@ -0,0 +1,240 @@ + + + + + + + + + + + + + + +
+ + + + diff --git a/iosApp/editor/quill.min.js b/iosApp/editor/quill.min.js new file mode 100644 index 00000000..d9f46b8d --- /dev/null +++ b/iosApp/editor/quill.min.js @@ -0,0 +1,8 @@ +/*! + * Quill Editor v1.3.7 + * https://quilljs.com/ + * Copyright (c) 2014, Jason Chen + * Copyright (c) 2013, salesforce.com + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.Quill=e():t.Quill=e()}("undefined"!=typeof self?self:this,function(){return function(t){function e(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return t[r].call(o.exports,o,o.exports,e),o.l=!0,o.exports}var n={};return e.m=t,e.c=n,e.d=function(t,n,r){e.o(t,n)||Object.defineProperty(t,n,{configurable:!1,enumerable:!0,get:r})},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,"a",n),n},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p="",e(e.s=45)}([function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n(17),o=n(18),i=n(19),l=n(48),a=n(49),s=n(50),u=n(51),c=n(52),f=n(11),h=n(29),p=n(30),d=n(28),y=n(1),v={Scope:y.Scope,create:y.create,find:y.find,query:y.query,register:y.register,Container:r.default,Format:o.default,Leaf:i.default,Embed:u.default,Scroll:l.default,Block:s.default,Inline:a.default,Text:c.default,Attributor:{Attribute:f.default,Class:h.default,Style:p.default,Store:d.default}};e.default=v},function(t,e,n){"use strict";function r(t,e){var n=i(t);if(null==n)throw new s("Unable to create "+t+" blot");var r=n;return new r(t instanceof Node||t.nodeType===Node.TEXT_NODE?t:r.create(e),e)}function o(t,n){return void 0===n&&(n=!1),null==t?null:null!=t[e.DATA_KEY]?t[e.DATA_KEY].blot:n?o(t.parentNode,n):null}function i(t,e){void 0===e&&(e=p.ANY);var n;if("string"==typeof t)n=h[t]||u[t];else if(t instanceof Text||t.nodeType===Node.TEXT_NODE)n=h.text;else if("number"==typeof t)t&p.LEVEL&p.BLOCK?n=h.block:t&p.LEVEL&p.INLINE&&(n=h.inline);else if(t instanceof HTMLElement){var r=(t.getAttribute("class")||"").split(/\s+/);for(var o in r)if(n=c[r[o]])break;n=n||f[t.tagName]}return null==n?null:e&p.LEVEL&n.scope&&e&p.TYPE&n.scope?n:null}function l(){for(var t=[],e=0;e1)return t.map(function(t){return l(t)});var n=t[0];if("string"!=typeof n.blotName&&"string"!=typeof n.attrName)throw new s("Invalid definition");if("abstract"===n.blotName)throw new s("Cannot register abstract class");if(h[n.blotName||n.attrName]=n,"string"==typeof n.keyName)u[n.keyName]=n;else if(null!=n.className&&(c[n.className]=n),null!=n.tagName){Array.isArray(n.tagName)?n.tagName=n.tagName.map(function(t){return t.toUpperCase()}):n.tagName=n.tagName.toUpperCase();var r=Array.isArray(n.tagName)?n.tagName:[n.tagName];r.forEach(function(t){null!=f[t]&&null!=n.className||(f[t]=n)})}return n}var a=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(e,"__esModule",{value:!0});var s=function(t){function e(e){var n=this;return e="[Parchment] "+e,n=t.call(this,e)||this,n.message=e,n.name=n.constructor.name,n}return a(e,t),e}(Error);e.ParchmentError=s;var u={},c={},f={},h={};e.DATA_KEY="__blot";var p;!function(t){t[t.TYPE=3]="TYPE",t[t.LEVEL=12]="LEVEL",t[t.ATTRIBUTE=13]="ATTRIBUTE",t[t.BLOT=14]="BLOT",t[t.INLINE=7]="INLINE",t[t.BLOCK=11]="BLOCK",t[t.BLOCK_BLOT=10]="BLOCK_BLOT",t[t.INLINE_BLOT=6]="INLINE_BLOT",t[t.BLOCK_ATTRIBUTE=9]="BLOCK_ATTRIBUTE",t[t.INLINE_ATTRIBUTE=5]="INLINE_ATTRIBUTE",t[t.ANY=15]="ANY"}(p=e.Scope||(e.Scope={})),e.create=r,e.find=o,e.query=i,e.register=l},function(t,e){"use strict";var n=Object.prototype.hasOwnProperty,r=Object.prototype.toString,o=Object.defineProperty,i=Object.getOwnPropertyDescriptor,l=function(t){return"function"==typeof Array.isArray?Array.isArray(t):"[object Array]"===r.call(t)},a=function(t){if(!t||"[object Object]"!==r.call(t))return!1;var e=n.call(t,"constructor"),o=t.constructor&&t.constructor.prototype&&n.call(t.constructor.prototype,"isPrototypeOf");if(t.constructor&&!e&&!o)return!1;var i;for(i in t);return void 0===i||n.call(t,i)},s=function(t,e){o&&"__proto__"===e.name?o(t,e.name,{enumerable:!0,configurable:!0,value:e.newValue,writable:!0}):t[e.name]=e.newValue},u=function(t,e){if("__proto__"===e){if(!n.call(t,e))return;if(i)return i(t,e).value}return t[e]};t.exports=function t(){var e,n,r,o,i,c,f=arguments[0],h=1,p=arguments.length,d=!1;for("boolean"==typeof f&&(d=f,f=arguments[1]||{},h=2),(null==f||"object"!=typeof f&&"function"!=typeof f)&&(f={});h1&&void 0!==arguments[1]?arguments[1]:{};return null==t?e:("function"==typeof t.formats&&(e=(0,f.default)(e,t.formats())),null==t.parent||"scroll"==t.parent.blotName||t.parent.statics.scope!==t.statics.scope?e:a(t.parent,e))}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.BlockEmbed=e.bubbleFormats=void 0;var s=function(){function t(t,e){for(var n=0;n0&&(t1&&void 0!==arguments[1]&&arguments[1];if(n&&(0===t||t>=this.length()-1)){var r=this.clone();return 0===t?(this.parent.insertBefore(r,this),this):(this.parent.insertBefore(r,this.next),r)}var o=u(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"split",this).call(this,t,n);return this.cache={},o}}]),e}(y.default.Block);x.blotName="block",x.tagName="P",x.defaultChild="break",x.allowedChildren=[m.default,y.default.Embed,O.default],e.bubbleFormats=a,e.BlockEmbed=w,e.default=x},function(t,e,n){var r=n(54),o=n(12),i=n(2),l=n(20),a=String.fromCharCode(0),s=function(t){Array.isArray(t)?this.ops=t:null!=t&&Array.isArray(t.ops)?this.ops=t.ops:this.ops=[]};s.prototype.insert=function(t,e){var n={};return 0===t.length?this:(n.insert=t,null!=e&&"object"==typeof e&&Object.keys(e).length>0&&(n.attributes=e),this.push(n))},s.prototype.delete=function(t){return t<=0?this:this.push({delete:t})},s.prototype.retain=function(t,e){if(t<=0)return this;var n={retain:t};return null!=e&&"object"==typeof e&&Object.keys(e).length>0&&(n.attributes=e),this.push(n)},s.prototype.push=function(t){var e=this.ops.length,n=this.ops[e-1];if(t=i(!0,{},t),"object"==typeof n){if("number"==typeof t.delete&&"number"==typeof n.delete)return this.ops[e-1]={delete:n.delete+t.delete},this;if("number"==typeof n.delete&&null!=t.insert&&(e-=1,"object"!=typeof(n=this.ops[e-1])))return this.ops.unshift(t),this;if(o(t.attributes,n.attributes)){if("string"==typeof t.insert&&"string"==typeof n.insert)return this.ops[e-1]={insert:n.insert+t.insert},"object"==typeof t.attributes&&(this.ops[e-1].attributes=t.attributes),this;if("number"==typeof t.retain&&"number"==typeof n.retain)return this.ops[e-1]={retain:n.retain+t.retain},"object"==typeof t.attributes&&(this.ops[e-1].attributes=t.attributes),this}}return e===this.ops.length?this.ops.push(t):this.ops.splice(e,0,t),this},s.prototype.chop=function(){var t=this.ops[this.ops.length-1];return t&&t.retain&&!t.attributes&&this.ops.pop(),this},s.prototype.filter=function(t){return this.ops.filter(t)},s.prototype.forEach=function(t){this.ops.forEach(t)},s.prototype.map=function(t){return this.ops.map(t)},s.prototype.partition=function(t){var e=[],n=[];return this.forEach(function(r){(t(r)?e:n).push(r)}),[e,n]},s.prototype.reduce=function(t,e){return this.ops.reduce(t,e)},s.prototype.changeLength=function(){return this.reduce(function(t,e){return e.insert?t+l.length(e):e.delete?t-e.delete:t},0)},s.prototype.length=function(){return this.reduce(function(t,e){return t+l.length(e)},0)},s.prototype.slice=function(t,e){t=t||0,"number"!=typeof e&&(e=1/0);for(var n=[],r=l.iterator(this.ops),o=0;o0&&n.next(i.retain-a)}for(var u=new s(r);e.hasNext()||n.hasNext();)if("insert"===n.peekType())u.push(n.next());else if("delete"===e.peekType())u.push(e.next());else{var c=Math.min(e.peekLength(),n.peekLength()),f=e.next(c),h=n.next(c);if("number"==typeof h.retain){var p={};"number"==typeof f.retain?p.retain=c:p.insert=f.insert;var d=l.attributes.compose(f.attributes,h.attributes,"number"==typeof f.retain);if(d&&(p.attributes=d),u.push(p),!n.hasNext()&&o(u.ops[u.ops.length-1],p)){var y=new s(e.rest());return u.concat(y).chop()}}else"number"==typeof h.delete&&"number"==typeof f.retain&&u.push(h)}return u.chop()},s.prototype.concat=function(t){var e=new s(this.ops.slice());return t.ops.length>0&&(e.push(t.ops[0]),e.ops=e.ops.concat(t.ops.slice(1))),e},s.prototype.diff=function(t,e){if(this.ops===t.ops)return new s;var n=[this,t].map(function(e){return e.map(function(n){if(null!=n.insert)return"string"==typeof n.insert?n.insert:a;var r=e===t?"on":"with";throw new Error("diff() called "+r+" non-document")}).join("")}),i=new s,u=r(n[0],n[1],e),c=l.iterator(this.ops),f=l.iterator(t.ops);return u.forEach(function(t){for(var e=t[1].length;e>0;){var n=0;switch(t[0]){case r.INSERT:n=Math.min(f.peekLength(),e),i.push(f.next(n));break;case r.DELETE:n=Math.min(e,c.peekLength()),c.next(n),i.delete(n);break;case r.EQUAL:n=Math.min(c.peekLength(),f.peekLength(),e);var a=c.next(n),s=f.next(n);o(a.insert,s.insert)?i.retain(n,l.attributes.diff(a.attributes,s.attributes)):i.push(s).delete(n)}e-=n}}),i.chop()},s.prototype.eachLine=function(t,e){e=e||"\n";for(var n=l.iterator(this.ops),r=new s,o=0;n.hasNext();){if("insert"!==n.peekType())return;var i=n.peek(),a=l.length(i)-n.peekLength(),u="string"==typeof i.insert?i.insert.indexOf(e,a)-a:-1;if(u<0)r.push(n.next());else if(u>0)r.push(n.next(u));else{if(!1===t(r,n.next(1).attributes||{},o))return;o+=1,r=new s}}r.length()>0&&t(r,{},o)},s.prototype.transform=function(t,e){if(e=!!e,"number"==typeof t)return this.transformPosition(t,e);for(var n=l.iterator(this.ops),r=l.iterator(t.ops),o=new s;n.hasNext()||r.hasNext();)if("insert"!==n.peekType()||!e&&"insert"===r.peekType())if("insert"===r.peekType())o.push(r.next());else{var i=Math.min(n.peekLength(),r.peekLength()),a=n.next(i),u=r.next(i);if(a.delete)continue;u.delete?o.push(u):o.retain(i,l.attributes.transform(a.attributes,u.attributes,e))}else o.retain(l.length(n.next()));return o.chop()},s.prototype.transformPosition=function(t,e){e=!!e;for(var n=l.iterator(this.ops),r=0;n.hasNext()&&r<=t;){var o=n.peekLength(),i=n.peekType();n.next(),"delete"!==i?("insert"===i&&(r0){var n=this.parent.isolate(this.offset(),this.length());this.moveChildren(n),n.wrap(this)}}}],[{key:"compare",value:function(t,n){var r=e.order.indexOf(t),o=e.order.indexOf(n);return r>=0||o>=0?r-o:t===n?0:t0){var a,s=[g.default.events.TEXT_CHANGE,l,i,e];if((a=this.emitter).emit.apply(a,[g.default.events.EDITOR_CHANGE].concat(s)),e!==g.default.sources.SILENT){var c;(c=this.emitter).emit.apply(c,s)}}return l}function s(t,e,n,r,o){var i={};return"number"==typeof t.index&&"number"==typeof t.length?"number"!=typeof e?(o=r,r=n,n=e,e=t.length,t=t.index):(e=t.length,t=t.index):"number"!=typeof e&&(o=r,r=n,n=e,e=0),"object"===(void 0===n?"undefined":c(n))?(i=n,o=r):"string"==typeof n&&(null!=r?i[n]=r:o=n),o=o||g.default.sources.API,[t,e,i,o]}function u(t,e,n,r){if(null==t)return null;var o=void 0,i=void 0;if(e instanceof d.default){var l=[t.index,t.index+t.length].map(function(t){return e.transformPosition(t,r!==g.default.sources.USER)}),a=f(l,2);o=a[0],i=a[1]}else{var s=[t.index,t.index+t.length].map(function(t){return t=0?t+n:Math.max(e,t+n)}),u=f(s,2);o=u[0],i=u[1]}return new x.Range(o,i-o)}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.overload=e.expandConfig=void 0;var c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f=function(){function t(t,e){var n=[],r=!0,o=!1,i=void 0;try{for(var l,a=t[Symbol.iterator]();!(r=(l=a.next()).done)&&(n.push(l.value),!e||n.length!==e);r=!0);}catch(t){o=!0,i=t}finally{try{!r&&a.return&&a.return()}finally{if(o)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),h=function(){function t(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:{};if(i(this,t),this.options=l(e,r),this.container=this.options.container,null==this.container)return P.error("Invalid Quill container",e);this.options.debug&&t.debug(this.options.debug);var o=this.container.innerHTML.trim();this.container.classList.add("ql-container"),this.container.innerHTML="",this.container.__quill=this,this.root=this.addContainer("ql-editor"),this.root.classList.add("ql-blank"),this.root.setAttribute("data-gramm",!1),this.scrollingContainer=this.options.scrollingContainer||this.root,this.emitter=new g.default,this.scroll=w.default.create(this.root,{emitter:this.emitter,whitelist:this.options.formats}),this.editor=new v.default(this.scroll),this.selection=new k.default(this.scroll,this.emitter),this.theme=new this.options.theme(this,this.options),this.keyboard=this.theme.addModule("keyboard"),this.clipboard=this.theme.addModule("clipboard"),this.history=this.theme.addModule("history"),this.theme.init(),this.emitter.on(g.default.events.EDITOR_CHANGE,function(t){t===g.default.events.TEXT_CHANGE&&n.root.classList.toggle("ql-blank",n.editor.isBlank())}),this.emitter.on(g.default.events.SCROLL_UPDATE,function(t,e){var r=n.selection.lastRange,o=r&&0===r.length?r.index:void 0;a.call(n,function(){return n.editor.update(null,e,o)},t)});var s=this.clipboard.convert("
"+o+"


");this.setContents(s),this.history.clear(),this.options.placeholder&&this.root.setAttribute("data-placeholder",this.options.placeholder),this.options.readOnly&&this.disable()}return h(t,null,[{key:"debug",value:function(t){!0===t&&(t="log"),A.default.level(t)}},{key:"find",value:function(t){return t.__quill||w.default.find(t)}},{key:"import",value:function(t){return null==this.imports[t]&&P.error("Cannot import "+t+". Are you sure it was registered?"),this.imports[t]}},{key:"register",value:function(t,e){var n=this,r=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if("string"!=typeof t){var o=t.attrName||t.blotName;"string"==typeof o?this.register("formats/"+o,t,e):Object.keys(t).forEach(function(r){n.register(r,t[r],e)})}else null==this.imports[t]||r||P.warn("Overwriting "+t+" with",e),this.imports[t]=e,(t.startsWith("blots/")||t.startsWith("formats/"))&&"abstract"!==e.blotName?w.default.register(e):t.startsWith("modules")&&"function"==typeof e.register&&e.register()}}]),h(t,[{key:"addContainer",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;if("string"==typeof t){var n=t;t=document.createElement("div"),t.classList.add(n)}return this.container.insertBefore(t,e),t}},{key:"blur",value:function(){this.selection.setRange(null)}},{key:"deleteText",value:function(t,e,n){var r=this,o=s(t,e,n),i=f(o,4);return t=i[0],e=i[1],n=i[3],a.call(this,function(){return r.editor.deleteText(t,e)},n,t,-1*e)}},{key:"disable",value:function(){this.enable(!1)}},{key:"enable",value:function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.scroll.enable(t),this.container.classList.toggle("ql-disabled",!t)}},{key:"focus",value:function(){var t=this.scrollingContainer.scrollTop;this.selection.focus(),this.scrollingContainer.scrollTop=t,this.scrollIntoView()}},{key:"format",value:function(t,e){var n=this,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:g.default.sources.API;return a.call(this,function(){var r=n.getSelection(!0),i=new d.default;if(null==r)return i;if(w.default.query(t,w.default.Scope.BLOCK))i=n.editor.formatLine(r.index,r.length,o({},t,e));else{if(0===r.length)return n.selection.format(t,e),i;i=n.editor.formatText(r.index,r.length,o({},t,e))}return n.setSelection(r,g.default.sources.SILENT),i},r)}},{key:"formatLine",value:function(t,e,n,r,o){var i=this,l=void 0,u=s(t,e,n,r,o),c=f(u,4);return t=c[0],e=c[1],l=c[2],o=c[3],a.call(this,function(){return i.editor.formatLine(t,e,l)},o,t,0)}},{key:"formatText",value:function(t,e,n,r,o){var i=this,l=void 0,u=s(t,e,n,r,o),c=f(u,4);return t=c[0],e=c[1],l=c[2],o=c[3],a.call(this,function(){return i.editor.formatText(t,e,l)},o,t,0)}},{key:"getBounds",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=void 0;n="number"==typeof t?this.selection.getBounds(t,e):this.selection.getBounds(t.index,t.length);var r=this.container.getBoundingClientRect();return{bottom:n.bottom-r.top,height:n.height,left:n.left-r.left,right:n.right-r.left,top:n.top-r.top,width:n.width}}},{key:"getContents",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.getLength()-t,n=s(t,e),r=f(n,2);return t=r[0],e=r[1],this.editor.getContents(t,e)}},{key:"getFormat",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.getSelection(!0),e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;return"number"==typeof t?this.editor.getFormat(t,e):this.editor.getFormat(t.index,t.length)}},{key:"getIndex",value:function(t){return t.offset(this.scroll)}},{key:"getLength",value:function(){return this.scroll.length()}},{key:"getLeaf",value:function(t){return this.scroll.leaf(t)}},{key:"getLine",value:function(t){return this.scroll.line(t)}},{key:"getLines",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Number.MAX_VALUE;return"number"!=typeof t?this.scroll.lines(t.index,t.length):this.scroll.lines(t,e)}},{key:"getModule",value:function(t){return this.theme.modules[t]}},{key:"getSelection",value:function(){return arguments.length>0&&void 0!==arguments[0]&&arguments[0]&&this.focus(),this.update(),this.selection.getRange()[0]}},{key:"getText",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.getLength()-t,n=s(t,e),r=f(n,2);return t=r[0],e=r[1],this.editor.getText(t,e)}},{key:"hasFocus",value:function(){return this.selection.hasFocus()}},{key:"insertEmbed",value:function(e,n,r){var o=this,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:t.sources.API;return a.call(this,function(){return o.editor.insertEmbed(e,n,r)},i,e)}},{key:"insertText",value:function(t,e,n,r,o){var i=this,l=void 0,u=s(t,0,n,r,o),c=f(u,4);return t=c[0],l=c[2],o=c[3],a.call(this,function(){return i.editor.insertText(t,e,l)},o,t,e.length)}},{key:"isEnabled",value:function(){return!this.container.classList.contains("ql-disabled")}},{key:"off",value:function(){return this.emitter.off.apply(this.emitter,arguments)}},{key:"on",value:function(){return this.emitter.on.apply(this.emitter,arguments)}},{key:"once",value:function(){return this.emitter.once.apply(this.emitter,arguments)}},{key:"pasteHTML",value:function(t,e,n){this.clipboard.dangerouslyPasteHTML(t,e,n)}},{key:"removeFormat",value:function(t,e,n){var r=this,o=s(t,e,n),i=f(o,4);return t=i[0],e=i[1],n=i[3],a.call(this,function(){return r.editor.removeFormat(t,e)},n,t)}},{key:"scrollIntoView",value:function(){this.selection.scrollIntoView(this.scrollingContainer)}},{key:"setContents",value:function(t){var e=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:g.default.sources.API;return a.call(this,function(){t=new d.default(t);var n=e.getLength(),r=e.editor.deleteText(0,n),o=e.editor.applyDelta(t),i=o.ops[o.ops.length-1];return null!=i&&"string"==typeof i.insert&&"\n"===i.insert[i.insert.length-1]&&(e.editor.deleteText(e.getLength()-1,1),o.delete(1)),r.compose(o)},n)}},{key:"setSelection",value:function(e,n,r){if(null==e)this.selection.setRange(null,n||t.sources.API);else{var o=s(e,n,r),i=f(o,4);e=i[0],n=i[1],r=i[3],this.selection.setRange(new x.Range(e,n),r),r!==g.default.sources.SILENT&&this.selection.scrollIntoView(this.scrollingContainer)}}},{key:"setText",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:g.default.sources.API,n=(new d.default).insert(t);return this.setContents(n,e)}},{key:"update",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:g.default.sources.USER,e=this.scroll.update(t);return this.selection.update(t),e}},{key:"updateContents",value:function(t){var e=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:g.default.sources.API;return a.call(this,function(){return t=new d.default(t),e.editor.applyDelta(t,n)},n,!0)}}]),t}();S.DEFAULTS={bounds:null,formats:null,modules:{},placeholder:"",readOnly:!1,scrollingContainer:null,strict:!0,theme:"default"},S.events=g.default.events,S.sources=g.default.sources,S.version="1.3.7",S.imports={delta:d.default,parchment:w.default,"core/module":_.default,"core/theme":T.default},e.expandConfig=l,e.overload=s,e.default=S},function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var o=function t(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};r(this,t),this.quill=e,this.options=n};o.DEFAULTS={},e.default=o},function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function i(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var l=n(0),a=function(t){return t&&t.__esModule?t:{default:t}}(l),s=function(t){function e(){return r(this,e),o(this,(e.__proto__||Object.getPrototypeOf(e)).apply(this,arguments))}return i(e,t),e}(a.default.Text);e.default=s},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function l(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var a=function(){function t(t,e){for(var n=0;n1?e-1:0),r=1;r1?n-1:0),o=1;o-1:this.whitelist.indexOf(e)>-1))},t.prototype.remove=function(t){t.removeAttribute(this.keyName)},t.prototype.value=function(t){var e=t.getAttribute(this.keyName);return this.canAdd(t,e)&&e?e:""},t}();e.default=o},function(t,e,n){function r(t){return null===t||void 0===t}function o(t){return!(!t||"object"!=typeof t||"number"!=typeof t.length)&&("function"==typeof t.copy&&"function"==typeof t.slice&&!(t.length>0&&"number"!=typeof t[0]))}function i(t,e,n){var i,c;if(r(t)||r(e))return!1;if(t.prototype!==e.prototype)return!1;if(s(t))return!!s(e)&&(t=l.call(t),e=l.call(e),u(t,e,n));if(o(t)){if(!o(e))return!1;if(t.length!==e.length)return!1;for(i=0;i=0;i--)if(f[i]!=h[i])return!1;for(i=f.length-1;i>=0;i--)if(c=f[i],!u(t[c],e[c],n))return!1;return typeof t==typeof e}var l=Array.prototype.slice,a=n(55),s=n(56),u=t.exports=function(t,e,n){return n||(n={}),t===e||(t instanceof Date&&e instanceof Date?t.getTime()===e.getTime():!t||!e||"object"!=typeof t&&"object"!=typeof e?n.strict?t===e:t==e:i(t,e,n))}},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function l(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.Code=void 0;var a=function(){function t(t,e){var n=[],r=!0,o=!1,i=void 0;try{for(var l,a=t[Symbol.iterator]();!(r=(l=a.next()).done)&&(n.push(l.value),!e||n.length!==e);r=!0);}catch(t){o=!0,i=t}finally{try{!r&&a.return&&a.return()}finally{if(o)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),s=function(){function t(t,e){for(var n=0;n=t+n)){var l=this.newlineIndex(t,!0)+1,a=i-l+1,s=this.isolate(l,a),u=s.next;s.format(r,o),u instanceof e&&u.formatAt(0,t-l+n-a,r,o)}}}},{key:"insertAt",value:function(t,e,n){if(null==n){var r=this.descendant(m.default,t),o=a(r,2),i=o[0],l=o[1];i.insertAt(l,e)}}},{key:"length",value:function(){var t=this.domNode.textContent.length;return this.domNode.textContent.endsWith("\n")?t:t+1}},{key:"newlineIndex",value:function(t){if(arguments.length>1&&void 0!==arguments[1]&&arguments[1])return this.domNode.textContent.slice(0,t).lastIndexOf("\n");var e=this.domNode.textContent.slice(t).indexOf("\n");return e>-1?t+e:-1}},{key:"optimize",value:function(t){this.domNode.textContent.endsWith("\n")||this.appendChild(p.default.create("text","\n")),u(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"optimize",this).call(this,t);var n=this.next;null!=n&&n.prev===this&&n.statics.blotName===this.statics.blotName&&this.statics.formats(this.domNode)===n.statics.formats(n.domNode)&&(n.optimize(t),n.moveChildren(this),n.remove())}},{key:"replace",value:function(t){u(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"replace",this).call(this,t),[].slice.call(this.domNode.querySelectorAll("*")).forEach(function(t){var e=p.default.find(t);null==e?t.parentNode.removeChild(t):e instanceof p.default.Embed?e.remove():e.unwrap()})}}],[{key:"create",value:function(t){var n=u(e.__proto__||Object.getPrototypeOf(e),"create",this).call(this,t);return n.setAttribute("spellcheck",!1),n}},{key:"formats",value:function(){return!0}}]),e}(y.default);O.blotName="code-block",O.tagName="PRE",O.TAB=" ",e.Code=_,e.default=O},function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function i(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var l=function(){function t(t,e){for(var n=0;n-1}Object.defineProperty(e,"__esModule",{value:!0}),e.sanitize=e.default=void 0;var a=function(){function t(t,e){for(var n=0;n1&&void 0!==arguments[1]&&arguments[1],n=this.container.querySelector(".ql-selected");if(t!==n&&(null!=n&&n.classList.remove("ql-selected"),null!=t&&(t.classList.add("ql-selected"),this.select.selectedIndex=[].indexOf.call(t.parentNode.children,t),t.hasAttribute("data-value")?this.label.setAttribute("data-value",t.getAttribute("data-value")):this.label.removeAttribute("data-value"),t.hasAttribute("data-label")?this.label.setAttribute("data-label",t.getAttribute("data-label")):this.label.removeAttribute("data-label"),e))){if("function"==typeof Event)this.select.dispatchEvent(new Event("change"));else if("object"===("undefined"==typeof Event?"undefined":l(Event))){var r=document.createEvent("Event");r.initEvent("change",!0,!0),this.select.dispatchEvent(r)}this.close()}}},{key:"update",value:function(){var t=void 0;if(this.select.selectedIndex>-1){var e=this.container.querySelector(".ql-picker-options").children[this.select.selectedIndex];t=this.select.options[this.select.selectedIndex],this.selectItem(e)}else this.selectItem(null);var n=null!=t&&t!==this.select.querySelector("option[selected]");this.label.classList.toggle("ql-active",n)}}]),t}();e.default=p},function(t,e,n){"use strict";function r(t){var e=a.find(t);if(null==e)try{e=a.create(t)}catch(n){e=a.create(a.Scope.INLINE),[].slice.call(t.childNodes).forEach(function(t){e.domNode.appendChild(t)}),t.parentNode&&t.parentNode.replaceChild(e.domNode,t),e.attach()}return e}var o=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(e,"__esModule",{value:!0});var i=n(47),l=n(27),a=n(1),s=function(t){function e(e){var n=t.call(this,e)||this;return n.build(),n}return o(e,t),e.prototype.appendChild=function(t){this.insertBefore(t)},e.prototype.attach=function(){t.prototype.attach.call(this),this.children.forEach(function(t){t.attach()})},e.prototype.build=function(){var t=this;this.children=new i.default,[].slice.call(this.domNode.childNodes).reverse().forEach(function(e){try{var n=r(e);t.insertBefore(n,t.children.head||void 0)}catch(t){if(t instanceof a.ParchmentError)return;throw t}})},e.prototype.deleteAt=function(t,e){if(0===t&&e===this.length())return this.remove();this.children.forEachAt(t,e,function(t,e,n){t.deleteAt(e,n)})},e.prototype.descendant=function(t,n){var r=this.children.find(n),o=r[0],i=r[1];return null==t.blotName&&t(o)||null!=t.blotName&&o instanceof t?[o,i]:o instanceof e?o.descendant(t,i):[null,-1]},e.prototype.descendants=function(t,n,r){void 0===n&&(n=0),void 0===r&&(r=Number.MAX_VALUE);var o=[],i=r;return this.children.forEachAt(n,r,function(n,r,l){(null==t.blotName&&t(n)||null!=t.blotName&&n instanceof t)&&o.push(n),n instanceof e&&(o=o.concat(n.descendants(t,r,i))),i-=l}),o},e.prototype.detach=function(){this.children.forEach(function(t){t.detach()}),t.prototype.detach.call(this)},e.prototype.formatAt=function(t,e,n,r){this.children.forEachAt(t,e,function(t,e,o){t.formatAt(e,o,n,r)})},e.prototype.insertAt=function(t,e,n){var r=this.children.find(t),o=r[0],i=r[1];if(o)o.insertAt(i,e,n);else{var l=null==n?a.create("text",e):a.create(e,n);this.appendChild(l)}},e.prototype.insertBefore=function(t,e){if(null!=this.statics.allowedChildren&&!this.statics.allowedChildren.some(function(e){return t instanceof e}))throw new a.ParchmentError("Cannot insert "+t.statics.blotName+" into "+this.statics.blotName);t.insertInto(this,e)},e.prototype.length=function(){return this.children.reduce(function(t,e){return t+e.length()},0)},e.prototype.moveChildren=function(t,e){this.children.forEach(function(n){t.insertBefore(n,e)})},e.prototype.optimize=function(e){if(t.prototype.optimize.call(this,e),0===this.children.length)if(null!=this.statics.defaultChild){var n=a.create(this.statics.defaultChild);this.appendChild(n),n.optimize(e)}else this.remove()},e.prototype.path=function(t,n){void 0===n&&(n=!1);var r=this.children.find(t,n),o=r[0],i=r[1],l=[[this,t]];return o instanceof e?l.concat(o.path(i,n)):(null!=o&&l.push([o,i]),l)},e.prototype.removeChild=function(t){this.children.remove(t)},e.prototype.replace=function(n){n instanceof e&&n.moveChildren(this),t.prototype.replace.call(this,n)},e.prototype.split=function(t,e){if(void 0===e&&(e=!1),!e){if(0===t)return this;if(t===this.length())return this.next}var n=this.clone();return this.parent.insertBefore(n,this.next),this.children.forEachAt(t,this.length(),function(t,r,o){t=t.split(r,e),n.appendChild(t)}),n},e.prototype.unwrap=function(){this.moveChildren(this.parent,this.next),this.remove()},e.prototype.update=function(t,e){var n=this,o=[],i=[];t.forEach(function(t){t.target===n.domNode&&"childList"===t.type&&(o.push.apply(o,t.addedNodes),i.push.apply(i,t.removedNodes))}),i.forEach(function(t){if(!(null!=t.parentNode&&"IFRAME"!==t.tagName&&document.body.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_CONTAINED_BY)){var e=a.find(t);null!=e&&(null!=e.domNode.parentNode&&e.domNode.parentNode!==n.domNode||e.detach())}}),o.filter(function(t){return t.parentNode==n.domNode}).sort(function(t,e){return t===e?0:t.compareDocumentPosition(e)&Node.DOCUMENT_POSITION_FOLLOWING?1:-1}).forEach(function(t){var e=null;null!=t.nextSibling&&(e=a.find(t.nextSibling));var o=r(t);o.next==e&&null!=o.next||(null!=o.parent&&o.parent.removeChild(n),n.insertBefore(o,e||void 0))})},e}(l.default);e.default=s},function(t,e,n){"use strict";var r=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(e,"__esModule",{value:!0});var o=n(11),i=n(28),l=n(17),a=n(1),s=function(t){function e(e){var n=t.call(this,e)||this;return n.attributes=new i.default(n.domNode),n}return r(e,t),e.formats=function(t){return"string"==typeof this.tagName||(Array.isArray(this.tagName)?t.tagName.toLowerCase():void 0)},e.prototype.format=function(t,e){var n=a.query(t);n instanceof o.default?this.attributes.attribute(n,e):e&&(null==n||t===this.statics.blotName&&this.formats()[t]===e||this.replaceWith(t,e))},e.prototype.formats=function(){var t=this.attributes.values(),e=this.statics.formats(this.domNode);return null!=e&&(t[this.statics.blotName]=e),t},e.prototype.replaceWith=function(e,n){var r=t.prototype.replaceWith.call(this,e,n);return this.attributes.copy(r),r},e.prototype.update=function(e,n){var r=this;t.prototype.update.call(this,e,n),e.some(function(t){return t.target===r.domNode&&"attributes"===t.type})&&this.attributes.build()},e.prototype.wrap=function(n,r){var o=t.prototype.wrap.call(this,n,r);return o instanceof e&&o.statics.scope===this.statics.scope&&this.attributes.move(o),o},e}(l.default);e.default=s},function(t,e,n){"use strict";var r=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(e,"__esModule",{value:!0});var o=n(27),i=n(1),l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return r(e,t),e.value=function(t){return!0},e.prototype.index=function(t,e){return this.domNode===t||this.domNode.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_CONTAINED_BY?Math.min(e,1):-1},e.prototype.position=function(t,e){var n=[].indexOf.call(this.parent.domNode.childNodes,this.domNode);return t>0&&(n+=1),[this.parent.domNode,n]},e.prototype.value=function(){var t;return t={},t[this.statics.blotName]=this.statics.value(this.domNode)||!0,t},e.scope=i.Scope.INLINE_BLOT,e}(o.default);e.default=l},function(t,e,n){function r(t){this.ops=t,this.index=0,this.offset=0}var o=n(12),i=n(2),l={attributes:{compose:function(t,e,n){"object"!=typeof t&&(t={}),"object"!=typeof e&&(e={});var r=i(!0,{},e);n||(r=Object.keys(r).reduce(function(t,e){return null!=r[e]&&(t[e]=r[e]),t},{}));for(var o in t)void 0!==t[o]&&void 0===e[o]&&(r[o]=t[o]);return Object.keys(r).length>0?r:void 0},diff:function(t,e){"object"!=typeof t&&(t={}),"object"!=typeof e&&(e={});var n=Object.keys(t).concat(Object.keys(e)).reduce(function(n,r){return o(t[r],e[r])||(n[r]=void 0===e[r]?null:e[r]),n},{});return Object.keys(n).length>0?n:void 0},transform:function(t,e,n){if("object"!=typeof t)return e;if("object"==typeof e){if(!n)return e;var r=Object.keys(e).reduce(function(n,r){return void 0===t[r]&&(n[r]=e[r]),n},{});return Object.keys(r).length>0?r:void 0}}},iterator:function(t){return new r(t)},length:function(t){return"number"==typeof t.delete?t.delete:"number"==typeof t.retain?t.retain:"string"==typeof t.insert?t.insert.length:1}};r.prototype.hasNext=function(){return this.peekLength()<1/0},r.prototype.next=function(t){t||(t=1/0);var e=this.ops[this.index];if(e){var n=this.offset,r=l.length(e);if(t>=r-n?(t=r-n,this.index+=1,this.offset=0):this.offset+=t,"number"==typeof e.delete)return{delete:t};var o={};return e.attributes&&(o.attributes=e.attributes),"number"==typeof e.retain?o.retain=t:"string"==typeof e.insert?o.insert=e.insert.substr(n,t):o.insert=e.insert,o}return{retain:1/0}},r.prototype.peek=function(){return this.ops[this.index]},r.prototype.peekLength=function(){return this.ops[this.index]?l.length(this.ops[this.index])-this.offset:1/0},r.prototype.peekType=function(){return this.ops[this.index]?"number"==typeof this.ops[this.index].delete?"delete":"number"==typeof this.ops[this.index].retain?"retain":"insert":"retain"},r.prototype.rest=function(){if(this.hasNext()){if(0===this.offset)return this.ops.slice(this.index);var t=this.offset,e=this.index,n=this.next(),r=this.ops.slice(this.index);return this.offset=t,this.index=e,[n].concat(r)}return[]},t.exports=l},function(t,e){var n=function(){"use strict";function t(t,e){return null!=e&&t instanceof e}function e(n,r,o,i,c){function f(n,o){if(null===n)return null;if(0===o)return n;var y,v;if("object"!=typeof n)return n;if(t(n,a))y=new a;else if(t(n,s))y=new s;else if(t(n,u))y=new u(function(t,e){n.then(function(e){t(f(e,o-1))},function(t){e(f(t,o-1))})});else if(e.__isArray(n))y=[];else if(e.__isRegExp(n))y=new RegExp(n.source,l(n)),n.lastIndex&&(y.lastIndex=n.lastIndex);else if(e.__isDate(n))y=new Date(n.getTime());else{if(d&&Buffer.isBuffer(n))return y=Buffer.allocUnsafe?Buffer.allocUnsafe(n.length):new Buffer(n.length),n.copy(y),y;t(n,Error)?y=Object.create(n):void 0===i?(v=Object.getPrototypeOf(n),y=Object.create(v)):(y=Object.create(i),v=i)}if(r){var b=h.indexOf(n);if(-1!=b)return p[b];h.push(n),p.push(y)}t(n,a)&&n.forEach(function(t,e){var n=f(e,o-1),r=f(t,o-1);y.set(n,r)}),t(n,s)&&n.forEach(function(t){var e=f(t,o-1);y.add(e)});for(var g in n){var m;v&&(m=Object.getOwnPropertyDescriptor(v,g)),m&&null==m.set||(y[g]=f(n[g],o-1))}if(Object.getOwnPropertySymbols)for(var _=Object.getOwnPropertySymbols(n),g=0;g<_.length;g++){var O=_[g],w=Object.getOwnPropertyDescriptor(n,O);(!w||w.enumerable||c)&&(y[O]=f(n[O],o-1),w.enumerable||Object.defineProperty(y,O,{enumerable:!1}))}if(c)for(var x=Object.getOwnPropertyNames(n),g=0;g1&&void 0!==arguments[1]?arguments[1]:0;i(this,t),this.index=e,this.length=n},O=function(){function t(e,n){var r=this;i(this,t),this.emitter=n,this.scroll=e,this.composing=!1,this.mouseDown=!1,this.root=this.scroll.domNode,this.cursor=c.default.create("cursor",this),this.lastRange=this.savedRange=new _(0,0),this.handleComposition(),this.handleDragging(),this.emitter.listenDOM("selectionchange",document,function(){r.mouseDown||setTimeout(r.update.bind(r,v.default.sources.USER),1)}),this.emitter.on(v.default.events.EDITOR_CHANGE,function(t,e){t===v.default.events.TEXT_CHANGE&&e.length()>0&&r.update(v.default.sources.SILENT)}),this.emitter.on(v.default.events.SCROLL_BEFORE_UPDATE,function(){if(r.hasFocus()){var t=r.getNativeRange();null!=t&&t.start.node!==r.cursor.textNode&&r.emitter.once(v.default.events.SCROLL_UPDATE,function(){try{r.setNativeRange(t.start.node,t.start.offset,t.end.node,t.end.offset)}catch(t){}})}}),this.emitter.on(v.default.events.SCROLL_OPTIMIZE,function(t,e){if(e.range){var n=e.range,o=n.startNode,i=n.startOffset,l=n.endNode,a=n.endOffset;r.setNativeRange(o,i,l,a)}}),this.update(v.default.sources.SILENT)}return s(t,[{key:"handleComposition",value:function(){var t=this;this.root.addEventListener("compositionstart",function(){t.composing=!0}),this.root.addEventListener("compositionend",function(){if(t.composing=!1,t.cursor.parent){var e=t.cursor.restore();if(!e)return;setTimeout(function(){t.setNativeRange(e.startNode,e.startOffset,e.endNode,e.endOffset)},1)}})}},{key:"handleDragging",value:function(){var t=this;this.emitter.listenDOM("mousedown",document.body,function(){t.mouseDown=!0}),this.emitter.listenDOM("mouseup",document.body,function(){t.mouseDown=!1,t.update(v.default.sources.USER)})}},{key:"focus",value:function(){this.hasFocus()||(this.root.focus(),this.setRange(this.savedRange))}},{key:"format",value:function(t,e){if(null==this.scroll.whitelist||this.scroll.whitelist[t]){this.scroll.update();var n=this.getNativeRange();if(null!=n&&n.native.collapsed&&!c.default.query(t,c.default.Scope.BLOCK)){if(n.start.node!==this.cursor.textNode){var r=c.default.find(n.start.node,!1);if(null==r)return;if(r instanceof c.default.Leaf){var o=r.split(n.start.offset);r.parent.insertBefore(this.cursor,o)}else r.insertBefore(this.cursor,n.start.node);this.cursor.attach()}this.cursor.format(t,e),this.scroll.optimize(),this.setNativeRange(this.cursor.textNode,this.cursor.textNode.data.length),this.update()}}}},{key:"getBounds",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=this.scroll.length();t=Math.min(t,n-1),e=Math.min(t+e,n-1)-t;var r=void 0,o=this.scroll.leaf(t),i=a(o,2),l=i[0],s=i[1];if(null==l)return null;var u=l.position(s,!0),c=a(u,2);r=c[0],s=c[1];var f=document.createRange();if(e>0){f.setStart(r,s);var h=this.scroll.leaf(t+e),p=a(h,2);if(l=p[0],s=p[1],null==l)return null;var d=l.position(s,!0),y=a(d,2);return r=y[0],s=y[1],f.setEnd(r,s),f.getBoundingClientRect()}var v="left",b=void 0;return r instanceof Text?(s0&&(v="right")),{bottom:b.top+b.height,height:b.height,left:b[v],right:b[v],top:b.top,width:0}}},{key:"getNativeRange",value:function(){var t=document.getSelection();if(null==t||t.rangeCount<=0)return null;var e=t.getRangeAt(0);if(null==e)return null;var n=this.normalizeNative(e);return m.info("getNativeRange",n),n}},{key:"getRange",value:function(){var t=this.getNativeRange();return null==t?[null,null]:[this.normalizedToRange(t),t]}},{key:"hasFocus",value:function(){return document.activeElement===this.root}},{key:"normalizedToRange",value:function(t){var e=this,n=[[t.start.node,t.start.offset]];t.native.collapsed||n.push([t.end.node,t.end.offset]);var r=n.map(function(t){var n=a(t,2),r=n[0],o=n[1],i=c.default.find(r,!0),l=i.offset(e.scroll);return 0===o?l:i instanceof c.default.Container?l+i.length():l+i.index(r,o)}),i=Math.min(Math.max.apply(Math,o(r)),this.scroll.length()-1),l=Math.min.apply(Math,[i].concat(o(r)));return new _(l,i-l)}},{key:"normalizeNative",value:function(t){if(!l(this.root,t.startContainer)||!t.collapsed&&!l(this.root,t.endContainer))return null;var e={start:{node:t.startContainer,offset:t.startOffset},end:{node:t.endContainer,offset:t.endOffset},native:t};return[e.start,e.end].forEach(function(t){for(var e=t.node,n=t.offset;!(e instanceof Text)&&e.childNodes.length>0;)if(e.childNodes.length>n)e=e.childNodes[n],n=0;else{if(e.childNodes.length!==n)break;e=e.lastChild,n=e instanceof Text?e.data.length:e.childNodes.length+1}t.node=e,t.offset=n}),e}},{key:"rangeToNative",value:function(t){var e=this,n=t.collapsed?[t.index]:[t.index,t.index+t.length],r=[],o=this.scroll.length();return n.forEach(function(t,n){t=Math.min(o-1,t);var i=void 0,l=e.scroll.leaf(t),s=a(l,2),u=s[0],c=s[1],f=u.position(c,0!==n),h=a(f,2);i=h[0],c=h[1],r.push(i,c)}),r.length<2&&(r=r.concat(r)),r}},{key:"scrollIntoView",value:function(t){var e=this.lastRange;if(null!=e){var n=this.getBounds(e.index,e.length);if(null!=n){var r=this.scroll.length()-1,o=this.scroll.line(Math.min(e.index,r)),i=a(o,1),l=i[0],s=l;if(e.length>0){var u=this.scroll.line(Math.min(e.index+e.length,r));s=a(u,1)[0]}if(null!=l&&null!=s){var c=t.getBoundingClientRect();n.topc.bottom&&(t.scrollTop+=n.bottom-c.bottom)}}}}},{key:"setNativeRange",value:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t,r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:e,o=arguments.length>4&&void 0!==arguments[4]&&arguments[4];if(m.info("setNativeRange",t,e,n,r),null==t||null!=this.root.parentNode&&null!=t.parentNode&&null!=n.parentNode){var i=document.getSelection();if(null!=i)if(null!=t){this.hasFocus()||this.root.focus();var l=(this.getNativeRange()||{}).native;if(null==l||o||t!==l.startContainer||e!==l.startOffset||n!==l.endContainer||r!==l.endOffset){"BR"==t.tagName&&(e=[].indexOf.call(t.parentNode.childNodes,t),t=t.parentNode),"BR"==n.tagName&&(r=[].indexOf.call(n.parentNode.childNodes,n),n=n.parentNode);var a=document.createRange();a.setStart(t,e),a.setEnd(n,r),i.removeAllRanges(),i.addRange(a)}}else i.removeAllRanges(),this.root.blur(),document.body.focus()}}},{key:"setRange",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:v.default.sources.API;if("string"==typeof e&&(n=e,e=!1),m.info("setRange",t),null!=t){var r=this.rangeToNative(t);this.setNativeRange.apply(this,o(r).concat([e]))}else this.setNativeRange(null);this.update(n)}},{key:"update",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:v.default.sources.USER,e=this.lastRange,n=this.getRange(),r=a(n,2),o=r[0],i=r[1];if(this.lastRange=o,null!=this.lastRange&&(this.savedRange=this.lastRange),!(0,d.default)(e,this.lastRange)){var l;!this.composing&&null!=i&&i.native.collapsed&&i.start.node!==this.cursor.textNode&&this.cursor.restore();var s=[v.default.events.SELECTION_CHANGE,(0,h.default)(this.lastRange),(0,h.default)(e),t];if((l=this.emitter).emit.apply(l,[v.default.events.EDITOR_CHANGE].concat(s)),t!==v.default.sources.SILENT){var u;(u=this.emitter).emit.apply(u,s)}}}}]),t}();e.Range=_,e.default=O},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function l(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var a=n(0),s=r(a),u=n(3),c=r(u),f=function(t){function e(){return o(this,e),i(this,(e.__proto__||Object.getPrototypeOf(e)).apply(this,arguments))}return l(e,t),e}(s.default.Container);f.allowedChildren=[c.default,u.BlockEmbed,f],e.default=f},function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function i(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0}),e.ColorStyle=e.ColorClass=e.ColorAttributor=void 0;var l=function(){function t(t,e){for(var n=0;n1){var u=o.formats(),c=this.quill.getFormat(t.index-1,1);i=A.default.attributes.diff(u,c)||{}}}var f=/[\uD800-\uDBFF][\uDC00-\uDFFF]$/.test(e.prefix)?2:1;this.quill.deleteText(t.index-f,f,S.default.sources.USER),Object.keys(i).length>0&&this.quill.formatLine(t.index-f,f,i,S.default.sources.USER),this.quill.focus()}}function c(t,e){var n=/^[\uD800-\uDBFF][\uDC00-\uDFFF]/.test(e.suffix)?2:1;if(!(t.index>=this.quill.getLength()-n)){var r={},o=0,i=this.quill.getLine(t.index),l=b(i,1),a=l[0];if(e.offset>=a.length()-1){var s=this.quill.getLine(t.index+1),u=b(s,1),c=u[0];if(c){var f=a.formats(),h=this.quill.getFormat(t.index,1);r=A.default.attributes.diff(f,h)||{},o=c.length()}}this.quill.deleteText(t.index,n,S.default.sources.USER),Object.keys(r).length>0&&this.quill.formatLine(t.index+o-1,n,r,S.default.sources.USER)}}function f(t){var e=this.quill.getLines(t),n={};if(e.length>1){var r=e[0].formats(),o=e[e.length-1].formats();n=A.default.attributes.diff(o,r)||{}}this.quill.deleteText(t,S.default.sources.USER),Object.keys(n).length>0&&this.quill.formatLine(t.index,1,n,S.default.sources.USER),this.quill.setSelection(t.index,S.default.sources.SILENT),this.quill.focus()}function h(t,e){var n=this;t.length>0&&this.quill.scroll.deleteAt(t.index,t.length);var r=Object.keys(e.format).reduce(function(t,n){return T.default.query(n,T.default.Scope.BLOCK)&&!Array.isArray(e.format[n])&&(t[n]=e.format[n]),t},{});this.quill.insertText(t.index,"\n",r,S.default.sources.USER),this.quill.setSelection(t.index+1,S.default.sources.SILENT),this.quill.focus(),Object.keys(e.format).forEach(function(t){null==r[t]&&(Array.isArray(e.format[t])||"link"!==t&&n.quill.format(t,e.format[t],S.default.sources.USER))})}function p(t){return{key:D.keys.TAB,shiftKey:!t,format:{"code-block":!0},handler:function(e){var n=T.default.query("code-block"),r=e.index,o=e.length,i=this.quill.scroll.descendant(n,r),l=b(i,2),a=l[0],s=l[1];if(null!=a){var u=this.quill.getIndex(a),c=a.newlineIndex(s,!0)+1,f=a.newlineIndex(u+s+o),h=a.domNode.textContent.slice(c,f).split("\n");s=0,h.forEach(function(e,i){t?(a.insertAt(c+s,n.TAB),s+=n.TAB.length,0===i?r+=n.TAB.length:o+=n.TAB.length):e.startsWith(n.TAB)&&(a.deleteAt(c+s,n.TAB.length),s-=n.TAB.length,0===i?r-=n.TAB.length:o-=n.TAB.length),s+=e.length+1}),this.quill.update(S.default.sources.USER),this.quill.setSelection(r,o,S.default.sources.SILENT)}}}}function d(t){return{key:t[0].toUpperCase(),shortKey:!0,handler:function(e,n){this.quill.format(t,!n.format[t],S.default.sources.USER)}}}function y(t){if("string"==typeof t||"number"==typeof t)return y({key:t});if("object"===(void 0===t?"undefined":v(t))&&(t=(0,_.default)(t,!1)),"string"==typeof t.key)if(null!=D.keys[t.key.toUpperCase()])t.key=D.keys[t.key.toUpperCase()];else{if(1!==t.key.length)return null;t.key=t.key.toUpperCase().charCodeAt(0)}return t.shortKey&&(t[B]=t.shortKey,delete t.shortKey),t}Object.defineProperty(e,"__esModule",{value:!0}),e.SHORTKEY=e.default=void 0;var v="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},b=function(){function t(t,e){var n=[],r=!0,o=!1,i=void 0;try{for(var l,a=t[Symbol.iterator]();!(r=(l=a.next()).done)&&(n.push(l.value),!e||n.length!==e);r=!0);}catch(t){o=!0,i=t}finally{try{!r&&a.return&&a.return()}finally{if(o)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),g=function(){function t(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=y(t);if(null==r||null==r.key)return I.warn("Attempted to add invalid keyboard binding",r);"function"==typeof e&&(e={handler:e}),"function"==typeof n&&(n={handler:n}),r=(0,k.default)(r,e,n),this.bindings[r.key]=this.bindings[r.key]||[],this.bindings[r.key].push(r)}},{key:"listen",value:function(){var t=this;this.quill.root.addEventListener("keydown",function(n){if(!n.defaultPrevented){var r=n.which||n.keyCode,o=(t.bindings[r]||[]).filter(function(t){return e.match(n,t)});if(0!==o.length){var i=t.quill.getSelection();if(null!=i&&t.quill.hasFocus()){var l=t.quill.getLine(i.index),a=b(l,2),s=a[0],u=a[1],c=t.quill.getLeaf(i.index),f=b(c,2),h=f[0],p=f[1],d=0===i.length?[h,p]:t.quill.getLeaf(i.index+i.length),y=b(d,2),g=y[0],m=y[1],_=h instanceof T.default.Text?h.value().slice(0,p):"",O=g instanceof T.default.Text?g.value().slice(m):"",x={collapsed:0===i.length,empty:0===i.length&&s.length()<=1,format:t.quill.getFormat(i),offset:u,prefix:_,suffix:O};o.some(function(e){if(null!=e.collapsed&&e.collapsed!==x.collapsed)return!1;if(null!=e.empty&&e.empty!==x.empty)return!1;if(null!=e.offset&&e.offset!==x.offset)return!1;if(Array.isArray(e.format)){if(e.format.every(function(t){return null==x.format[t]}))return!1}else if("object"===v(e.format)&&!Object.keys(e.format).every(function(t){return!0===e.format[t]?null!=x.format[t]:!1===e.format[t]?null==x.format[t]:(0,w.default)(e.format[t],x.format[t])}))return!1;return!(null!=e.prefix&&!e.prefix.test(x.prefix))&&(!(null!=e.suffix&&!e.suffix.test(x.suffix))&&!0!==e.handler.call(t,i,x))})&&n.preventDefault()}}}})}}]),e}(R.default);D.keys={BACKSPACE:8,TAB:9,ENTER:13,ESCAPE:27,LEFT:37,UP:38,RIGHT:39,DOWN:40,DELETE:46},D.DEFAULTS={bindings:{bold:d("bold"),italic:d("italic"),underline:d("underline"),indent:{key:D.keys.TAB,format:["blockquote","indent","list"],handler:function(t,e){if(e.collapsed&&0!==e.offset)return!0;this.quill.format("indent","+1",S.default.sources.USER)}},outdent:{key:D.keys.TAB,shiftKey:!0,format:["blockquote","indent","list"],handler:function(t,e){if(e.collapsed&&0!==e.offset)return!0;this.quill.format("indent","-1",S.default.sources.USER)}},"outdent backspace":{key:D.keys.BACKSPACE,collapsed:!0,shiftKey:null,metaKey:null,ctrlKey:null,altKey:null,format:["indent","list"],offset:0,handler:function(t,e){null!=e.format.indent?this.quill.format("indent","-1",S.default.sources.USER):null!=e.format.list&&this.quill.format("list",!1,S.default.sources.USER)}},"indent code-block":p(!0),"outdent code-block":p(!1),"remove tab":{key:D.keys.TAB,shiftKey:!0,collapsed:!0,prefix:/\t$/,handler:function(t){this.quill.deleteText(t.index-1,1,S.default.sources.USER)}},tab:{key:D.keys.TAB,handler:function(t){this.quill.history.cutoff();var e=(new N.default).retain(t.index).delete(t.length).insert("\t");this.quill.updateContents(e,S.default.sources.USER),this.quill.history.cutoff(),this.quill.setSelection(t.index+1,S.default.sources.SILENT)}},"list empty enter":{key:D.keys.ENTER,collapsed:!0,format:["list"],empty:!0,handler:function(t,e){this.quill.format("list",!1,S.default.sources.USER),e.format.indent&&this.quill.format("indent",!1,S.default.sources.USER)}},"checklist enter":{key:D.keys.ENTER,collapsed:!0,format:{list:"checked"},handler:function(t){var e=this.quill.getLine(t.index),n=b(e,2),r=n[0],o=n[1],i=(0,k.default)({},r.formats(),{list:"checked"}),l=(new N.default).retain(t.index).insert("\n",i).retain(r.length()-o-1).retain(1,{list:"unchecked"});this.quill.updateContents(l,S.default.sources.USER),this.quill.setSelection(t.index+1,S.default.sources.SILENT),this.quill.scrollIntoView()}},"header enter":{key:D.keys.ENTER,collapsed:!0,format:["header"],suffix:/^$/,handler:function(t,e){var n=this.quill.getLine(t.index),r=b(n,2),o=r[0],i=r[1],l=(new N.default).retain(t.index).insert("\n",e.format).retain(o.length()-i-1).retain(1,{header:null});this.quill.updateContents(l,S.default.sources.USER),this.quill.setSelection(t.index+1,S.default.sources.SILENT),this.quill.scrollIntoView()}},"list autofill":{key:" ",collapsed:!0,format:{list:!1},prefix:/^\s*?(\d+\.|-|\*|\[ ?\]|\[x\])$/,handler:function(t,e){var n=e.prefix.length,r=this.quill.getLine(t.index),o=b(r,2),i=o[0],l=o[1];if(l>n)return!0;var a=void 0;switch(e.prefix.trim()){case"[]":case"[ ]":a="unchecked";break;case"[x]":a="checked";break;case"-":case"*":a="bullet";break;default:a="ordered"}this.quill.insertText(t.index," ",S.default.sources.USER),this.quill.history.cutoff();var s=(new N.default).retain(t.index-l).delete(n+1).retain(i.length()-2-l).retain(1,{list:a});this.quill.updateContents(s,S.default.sources.USER),this.quill.history.cutoff(),this.quill.setSelection(t.index-n,S.default.sources.SILENT)}},"code exit":{key:D.keys.ENTER,collapsed:!0,format:["code-block"],prefix:/\n\n$/,suffix:/^\s+$/,handler:function(t){var e=this.quill.getLine(t.index),n=b(e,2),r=n[0],o=n[1],i=(new N.default).retain(t.index+r.length()-o-2).retain(1,{"code-block":null}).delete(1);this.quill.updateContents(i,S.default.sources.USER)}},"embed left":s(D.keys.LEFT,!1),"embed left shift":s(D.keys.LEFT,!0),"embed right":s(D.keys.RIGHT,!1),"embed right shift":s(D.keys.RIGHT,!0)}},e.default=D,e.SHORTKEY=B},function(t,e,n){"use strict";t.exports={align:{"":n(75),center:n(76),right:n(77),justify:n(78)},background:n(79),blockquote:n(80),bold:n(81),clean:n(82),code:n(40),"code-block":n(40),color:n(83),direction:{"":n(84),rtl:n(85)},float:{center:n(86),full:n(87),left:n(88),right:n(89)},formula:n(90),header:{1:n(91),2:n(92)},italic:n(93),image:n(94),indent:{"+1":n(95),"-1":n(96)},link:n(97),list:{ordered:n(98),bullet:n(99),check:n(100)},script:{sub:n(101),super:n(102)},strike:n(103),underline:n(104),video:n(105)}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n(1),o=function(){function t(t){this.domNode=t,this.domNode[r.DATA_KEY]={blot:this}}return Object.defineProperty(t.prototype,"statics",{get:function(){return this.constructor},enumerable:!0,configurable:!0}),t.create=function(t){if(null==this.tagName)throw new r.ParchmentError("Blot definition missing tagName");var e;return Array.isArray(this.tagName)?("string"==typeof t&&(t=t.toUpperCase(),parseInt(t).toString()===t&&(t=parseInt(t))),e="number"==typeof t?document.createElement(this.tagName[t-1]):this.tagName.indexOf(t)>-1?document.createElement(t):document.createElement(this.tagName[0])):e=document.createElement(this.tagName),this.className&&e.classList.add(this.className),e},t.prototype.attach=function(){null!=this.parent&&(this.scroll=this.parent.scroll)},t.prototype.clone=function(){var t=this.domNode.cloneNode(!1);return r.create(t)},t.prototype.detach=function(){null!=this.parent&&this.parent.removeChild(this),delete this.domNode[r.DATA_KEY]},t.prototype.deleteAt=function(t,e){this.isolate(t,e).remove()},t.prototype.formatAt=function(t,e,n,o){var i=this.isolate(t,e);if(null!=r.query(n,r.Scope.BLOT)&&o)i.wrap(n,o);else if(null!=r.query(n,r.Scope.ATTRIBUTE)){var l=r.create(this.statics.scope);i.wrap(l),l.format(n,o)}},t.prototype.insertAt=function(t,e,n){var o=null==n?r.create("text",e):r.create(e,n),i=this.split(t);this.parent.insertBefore(o,i)},t.prototype.insertInto=function(t,e){void 0===e&&(e=null),null!=this.parent&&this.parent.children.remove(this);var n=null;t.children.insertBefore(this,e),null!=e&&(n=e.domNode),this.domNode.parentNode==t.domNode&&this.domNode.nextSibling==n||t.domNode.insertBefore(this.domNode,n),this.parent=t,this.attach()},t.prototype.isolate=function(t,e){var n=this.split(t);return n.split(e),n},t.prototype.length=function(){return 1},t.prototype.offset=function(t){return void 0===t&&(t=this.parent),null==this.parent||this==t?0:this.parent.children.offset(this)+this.parent.offset(t)},t.prototype.optimize=function(t){null!=this.domNode[r.DATA_KEY]&&delete this.domNode[r.DATA_KEY].mutations},t.prototype.remove=function(){null!=this.domNode.parentNode&&this.domNode.parentNode.removeChild(this.domNode),this.detach()},t.prototype.replace=function(t){null!=t.parent&&(t.parent.insertBefore(this,t.next),t.remove())},t.prototype.replaceWith=function(t,e){var n="string"==typeof t?r.create(t,e):t;return n.replace(this),n},t.prototype.split=function(t,e){return 0===t?this:this.next},t.prototype.update=function(t,e){},t.prototype.wrap=function(t,e){var n="string"==typeof t?r.create(t,e):t;return null!=this.parent&&this.parent.insertBefore(n,this.next),n.appendChild(this),n},t.blotName="abstract",t}();e.default=o},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n(11),o=n(29),i=n(30),l=n(1),a=function(){function t(t){this.attributes={},this.domNode=t,this.build()}return t.prototype.attribute=function(t,e){e?t.add(this.domNode,e)&&(null!=t.value(this.domNode)?this.attributes[t.attrName]=t:delete this.attributes[t.attrName]):(t.remove(this.domNode),delete this.attributes[t.attrName])},t.prototype.build=function(){var t=this;this.attributes={};var e=r.default.keys(this.domNode),n=o.default.keys(this.domNode),a=i.default.keys(this.domNode);e.concat(n).concat(a).forEach(function(e){var n=l.query(e,l.Scope.ATTRIBUTE);n instanceof r.default&&(t.attributes[n.attrName]=n)})},t.prototype.copy=function(t){var e=this;Object.keys(this.attributes).forEach(function(n){var r=e.attributes[n].value(e.domNode);t.format(n,r)})},t.prototype.move=function(t){var e=this;this.copy(t),Object.keys(this.attributes).forEach(function(t){e.attributes[t].remove(e.domNode)}),this.attributes={}},t.prototype.values=function(){var t=this;return Object.keys(this.attributes).reduce(function(e,n){return e[n]=t.attributes[n].value(t.domNode),e},{})},t}();e.default=a},function(t,e,n){"use strict";function r(t,e){return(t.getAttribute("class")||"").split(/\s+/).filter(function(t){return 0===t.indexOf(e+"-")})}var o=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(e,"__esModule",{value:!0});var i=n(11),l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.keys=function(t){return(t.getAttribute("class")||"").split(/\s+/).map(function(t){return t.split("-").slice(0,-1).join("-")})},e.prototype.add=function(t,e){return!!this.canAdd(t,e)&&(this.remove(t),t.classList.add(this.keyName+"-"+e),!0)},e.prototype.remove=function(t){r(t,this.keyName).forEach(function(e){t.classList.remove(e)}),0===t.classList.length&&t.removeAttribute("class")},e.prototype.value=function(t){var e=r(t,this.keyName)[0]||"",n=e.slice(this.keyName.length+1);return this.canAdd(t,n)?n:""},e}(i.default);e.default=l},function(t,e,n){"use strict";function r(t){var e=t.split("-"),n=e.slice(1).map(function(t){return t[0].toUpperCase()+t.slice(1)}).join("");return e[0]+n}var o=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(e,"__esModule",{value:!0});var i=n(11),l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.keys=function(t){return(t.getAttribute("style")||"").split(";").map(function(t){return t.split(":")[0].trim()})},e.prototype.add=function(t,e){return!!this.canAdd(t,e)&&(t.style[r(this.keyName)]=e,!0)},e.prototype.remove=function(t){t.style[r(this.keyName)]="",t.getAttribute("style")||t.removeAttribute("style")},e.prototype.value=function(t){var e=t.style[r(this.keyName)];return this.canAdd(t,e)?e:""},e}(i.default);e.default=l},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function l(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var a=function(){function t(t,e){var n=[],r=!0,o=!1,i=void 0;try{for(var l,a=t[Symbol.iterator]();!(r=(l=a.next()).done)&&(n.push(l.value),!e||n.length!==e);r=!0);}catch(t){o=!0,i=t}finally{try{!r&&a.return&&a.return()}finally{if(o)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),s=function t(e,n,r){null===e&&(e=Function.prototype);var o=Object.getOwnPropertyDescriptor(e,n);if(void 0===o){var i=Object.getPrototypeOf(e);return null===i?void 0:t(i,n,r)}if("value"in o)return o.value;var l=o.get;if(void 0!==l)return l.call(r)},u=function(){function t(t,e){for(var n=0;n '},function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function i(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var l=function(){function t(t,e){for(var n=0;nr.right&&(i=r.right-o.right,this.root.style.left=e+i+"px"),o.leftr.bottom){var l=o.bottom-o.top,a=t.bottom-t.top+l;this.root.style.top=n-a+"px",this.root.classList.add("ql-flip")}return i}},{key:"show",value:function(){this.root.classList.remove("ql-editing"),this.root.classList.remove("ql-hidden")}}]),t}();e.default=i},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function l(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function a(t){var e=t.match(/^(?:(https?):\/\/)?(?:(?:www|m)\.)?youtube\.com\/watch.*v=([a-zA-Z0-9_-]+)/)||t.match(/^(?:(https?):\/\/)?(?:(?:www|m)\.)?youtu\.be\/([a-zA-Z0-9_-]+)/);return e?(e[1]||"https")+"://www.youtube.com/embed/"+e[2]+"?showinfo=0":(e=t.match(/^(?:(https?):\/\/)?(?:www\.)?vimeo\.com\/(\d+)/))?(e[1]||"https")+"://player.vimeo.com/video/"+e[2]+"/":t}function s(t,e){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];e.forEach(function(e){var r=document.createElement("option");e===n?r.setAttribute("selected","selected"):r.setAttribute("value",e),t.appendChild(r)})}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.BaseTooltip=void 0;var u=function(){function t(t,e){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:"link",e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;this.root.classList.remove("ql-hidden"),this.root.classList.add("ql-editing"),null!=e?this.textbox.value=e:t!==this.root.getAttribute("data-mode")&&(this.textbox.value=""),this.position(this.quill.getBounds(this.quill.selection.savedRange)),this.textbox.select(),this.textbox.setAttribute("placeholder",this.textbox.getAttribute("data-"+t)||""),this.root.setAttribute("data-mode",t)}},{key:"restoreFocus",value:function(){var t=this.quill.scrollingContainer.scrollTop;this.quill.focus(),this.quill.scrollingContainer.scrollTop=t}},{key:"save",value:function(){var t=this.textbox.value;switch(this.root.getAttribute("data-mode")){case"link":var e=this.quill.root.scrollTop;this.linkRange?(this.quill.formatText(this.linkRange,"link",t,v.default.sources.USER),delete this.linkRange):(this.restoreFocus(),this.quill.format("link",t,v.default.sources.USER)),this.quill.root.scrollTop=e;break;case"video":t=a(t);case"formula":if(!t)break;var n=this.quill.getSelection(!0);if(null!=n){var r=n.index+n.length;this.quill.insertEmbed(r,this.root.getAttribute("data-mode"),t,v.default.sources.USER),"formula"===this.root.getAttribute("data-mode")&&this.quill.insertText(r+1," ",v.default.sources.USER),this.quill.setSelection(r+2,v.default.sources.USER)}}this.textbox.value="",this.hide()}}]),e}(A.default);e.BaseTooltip=M,e.default=L},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var o=n(46),i=r(o),l=n(34),a=n(36),s=n(62),u=n(63),c=r(u),f=n(64),h=r(f),p=n(65),d=r(p),y=n(35),v=n(24),b=n(37),g=n(38),m=n(39),_=r(m),O=n(66),w=r(O),x=n(15),k=r(x),E=n(67),N=r(E),j=n(68),A=r(j),q=n(69),T=r(q),P=n(70),S=r(P),C=n(71),L=r(C),M=n(13),R=r(M),I=n(72),B=r(I),D=n(73),U=r(D),F=n(74),H=r(F),K=n(26),z=r(K),V=n(16),Z=r(V),W=n(41),G=r(W),Y=n(42),X=r(Y),$=n(43),Q=r($),J=n(107),tt=r(J),et=n(108),nt=r(et);i.default.register({"attributors/attribute/direction":a.DirectionAttribute,"attributors/class/align":l.AlignClass,"attributors/class/background":y.BackgroundClass,"attributors/class/color":v.ColorClass,"attributors/class/direction":a.DirectionClass,"attributors/class/font":b.FontClass,"attributors/class/size":g.SizeClass,"attributors/style/align":l.AlignStyle,"attributors/style/background":y.BackgroundStyle,"attributors/style/color":v.ColorStyle,"attributors/style/direction":a.DirectionStyle,"attributors/style/font":b.FontStyle,"attributors/style/size":g.SizeStyle},!0),i.default.register({"formats/align":l.AlignClass,"formats/direction":a.DirectionClass,"formats/indent":s.IndentClass,"formats/background":y.BackgroundStyle,"formats/color":v.ColorStyle,"formats/font":b.FontClass,"formats/size":g.SizeClass,"formats/blockquote":c.default,"formats/code-block":R.default,"formats/header":h.default,"formats/list":d.default,"formats/bold":_.default,"formats/code":M.Code,"formats/italic":w.default,"formats/link":k.default,"formats/script":N.default,"formats/strike":A.default,"formats/underline":T.default,"formats/image":S.default,"formats/video":L.default,"formats/list/item":p.ListItem,"modules/formula":B.default,"modules/syntax":U.default,"modules/toolbar":H.default,"themes/bubble":tt.default,"themes/snow":nt.default,"ui/icons":z.default,"ui/picker":Z.default,"ui/icon-picker":X.default,"ui/color-picker":G.default,"ui/tooltip":Q.default},!0),e.default=i.default},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var o=n(0),i=r(o),l=n(6),a=r(l),s=n(3),u=r(s),c=n(14),f=r(c),h=n(23),p=r(h),d=n(31),y=r(d),v=n(33),b=r(v),g=n(5),m=r(g),_=n(59),O=r(_),w=n(8),x=r(w),k=n(60),E=r(k),N=n(61),j=r(N),A=n(25),q=r(A);a.default.register({"blots/block":u.default,"blots/block/embed":s.BlockEmbed,"blots/break":f.default,"blots/container":p.default,"blots/cursor":y.default,"blots/embed":b.default,"blots/inline":m.default,"blots/scroll":O.default,"blots/text":x.default,"modules/clipboard":E.default,"modules/history":j.default,"modules/keyboard":q.default}),i.default.register(u.default,f.default,y.default,m.default,O.default,x.default),e.default=a.default},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=function(){function t(){this.head=this.tail=null,this.length=0}return t.prototype.append=function(){for(var t=[],e=0;e1&&this.append.apply(this,t.slice(1))},t.prototype.contains=function(t){for(var e,n=this.iterator();e=n();)if(e===t)return!0;return!1},t.prototype.insertBefore=function(t,e){t&&(t.next=e,null!=e?(t.prev=e.prev,null!=e.prev&&(e.prev.next=t),e.prev=t,e===this.head&&(this.head=t)):null!=this.tail?(this.tail.next=t,t.prev=this.tail,this.tail=t):(t.prev=null,this.head=this.tail=t),this.length+=1)},t.prototype.offset=function(t){for(var e=0,n=this.head;null!=n;){if(n===t)return e;e+=n.length(),n=n.next}return-1},t.prototype.remove=function(t){this.contains(t)&&(null!=t.prev&&(t.prev.next=t.next),null!=t.next&&(t.next.prev=t.prev),t===this.head&&(this.head=t.next),t===this.tail&&(this.tail=t.prev),this.length-=1)},t.prototype.iterator=function(t){return void 0===t&&(t=this.head),function(){var e=t;return null!=t&&(t=t.next),e}},t.prototype.find=function(t,e){void 0===e&&(e=!1);for(var n,r=this.iterator();n=r();){var o=n.length();if(ta?n(r,t-a,Math.min(e,a+u-t)):n(r,0,Math.min(u,t+e-a)),a+=u}},t.prototype.map=function(t){return this.reduce(function(e,n){return e.push(t(n)),e},[])},t.prototype.reduce=function(t,e){for(var n,r=this.iterator();n=r();)e=t(e,n);return e},t}();e.default=r},function(t,e,n){"use strict";var r=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(e,"__esModule",{value:!0});var o=n(17),i=n(1),l={attributes:!0,characterData:!0,characterDataOldValue:!0,childList:!0,subtree:!0},a=function(t){function e(e){var n=t.call(this,e)||this;return n.scroll=n,n.observer=new MutationObserver(function(t){n.update(t)}),n.observer.observe(n.domNode,l),n.attach(),n}return r(e,t),e.prototype.detach=function(){t.prototype.detach.call(this),this.observer.disconnect()},e.prototype.deleteAt=function(e,n){this.update(),0===e&&n===this.length()?this.children.forEach(function(t){t.remove()}):t.prototype.deleteAt.call(this,e,n)},e.prototype.formatAt=function(e,n,r,o){this.update(),t.prototype.formatAt.call(this,e,n,r,o)},e.prototype.insertAt=function(e,n,r){this.update(),t.prototype.insertAt.call(this,e,n,r)},e.prototype.optimize=function(e,n){var r=this;void 0===e&&(e=[]),void 0===n&&(n={}),t.prototype.optimize.call(this,n);for(var l=[].slice.call(this.observer.takeRecords());l.length>0;)e.push(l.pop());for(var a=function(t,e){void 0===e&&(e=!0),null!=t&&t!==r&&null!=t.domNode.parentNode&&(null==t.domNode[i.DATA_KEY].mutations&&(t.domNode[i.DATA_KEY].mutations=[]),e&&a(t.parent))},s=function(t){null!=t.domNode[i.DATA_KEY]&&null!=t.domNode[i.DATA_KEY].mutations&&(t instanceof o.default&&t.children.forEach(s),t.optimize(n))},u=e,c=0;u.length>0;c+=1){if(c>=100)throw new Error("[Parchment] Maximum optimize iterations reached");for(u.forEach(function(t){var e=i.find(t.target,!0);null!=e&&(e.domNode===t.target&&("childList"===t.type?(a(i.find(t.previousSibling,!1)),[].forEach.call(t.addedNodes,function(t){var e=i.find(t,!1);a(e,!1),e instanceof o.default&&e.children.forEach(function(t){a(t,!1)})})):"attributes"===t.type&&a(e.prev)),a(e))}),this.children.forEach(s),u=[].slice.call(this.observer.takeRecords()),l=u.slice();l.length>0;)e.push(l.pop())}},e.prototype.update=function(e,n){var r=this;void 0===n&&(n={}),e=e||this.observer.takeRecords(),e.map(function(t){var e=i.find(t.target,!0);return null==e?null:null==e.domNode[i.DATA_KEY].mutations?(e.domNode[i.DATA_KEY].mutations=[t],e):(e.domNode[i.DATA_KEY].mutations.push(t),null)}).forEach(function(t){null!=t&&t!==r&&null!=t.domNode[i.DATA_KEY]&&t.update(t.domNode[i.DATA_KEY].mutations||[],n)}),null!=this.domNode[i.DATA_KEY].mutations&&t.prototype.update.call(this,this.domNode[i.DATA_KEY].mutations,n),this.optimize(e,n)},e.blotName="scroll",e.defaultChild="block",e.scope=i.Scope.BLOCK_BLOT,e.tagName="DIV",e}(o.default);e.default=a},function(t,e,n){"use strict";function r(t,e){if(Object.keys(t).length!==Object.keys(e).length)return!1;for(var n in t)if(t[n]!==e[n])return!1;return!0}var o=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(e,"__esModule",{value:!0});var i=n(18),l=n(1),a=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.formats=function(n){if(n.tagName!==e.tagName)return t.formats.call(this,n)},e.prototype.format=function(n,r){var o=this;n!==this.statics.blotName||r?t.prototype.format.call(this,n,r):(this.children.forEach(function(t){t instanceof i.default||(t=t.wrap(e.blotName,!0)),o.attributes.copy(t)}),this.unwrap())},e.prototype.formatAt=function(e,n,r,o){if(null!=this.formats()[r]||l.query(r,l.Scope.ATTRIBUTE)){this.isolate(e,n).format(r,o)}else t.prototype.formatAt.call(this,e,n,r,o)},e.prototype.optimize=function(n){t.prototype.optimize.call(this,n);var o=this.formats();if(0===Object.keys(o).length)return this.unwrap();var i=this.next;i instanceof e&&i.prev===this&&r(o,i.formats())&&(i.moveChildren(this),i.remove())},e.blotName="inline",e.scope=l.Scope.INLINE_BLOT,e.tagName="SPAN",e}(i.default);e.default=a},function(t,e,n){"use strict";var r=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(e,"__esModule",{value:!0});var o=n(18),i=n(1),l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return r(e,t),e.formats=function(n){var r=i.query(e.blotName).tagName;if(n.tagName!==r)return t.formats.call(this,n)},e.prototype.format=function(n,r){null!=i.query(n,i.Scope.BLOCK)&&(n!==this.statics.blotName||r?t.prototype.format.call(this,n,r):this.replaceWith(e.blotName))},e.prototype.formatAt=function(e,n,r,o){null!=i.query(r,i.Scope.BLOCK)?this.format(r,o):t.prototype.formatAt.call(this,e,n,r,o)},e.prototype.insertAt=function(e,n,r){if(null==r||null!=i.query(n,i.Scope.INLINE))t.prototype.insertAt.call(this,e,n,r);else{var o=this.split(e),l=i.create(n,r);o.parent.insertBefore(l,o)}},e.prototype.update=function(e,n){navigator.userAgent.match(/Trident/)?this.build():t.prototype.update.call(this,e,n)},e.blotName="block",e.scope=i.Scope.BLOCK_BLOT,e.tagName="P",e}(o.default);e.default=l},function(t,e,n){"use strict";var r=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(e,"__esModule",{value:!0});var o=n(19),i=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return r(e,t),e.formats=function(t){},e.prototype.format=function(e,n){t.prototype.formatAt.call(this,0,this.length(),e,n)},e.prototype.formatAt=function(e,n,r,o){0===e&&n===this.length()?this.format(r,o):t.prototype.formatAt.call(this,e,n,r,o)},e.prototype.formats=function(){return this.statics.formats(this.domNode)},e}(o.default);e.default=i},function(t,e,n){"use strict";var r=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(e,"__esModule",{value:!0});var o=n(19),i=n(1),l=function(t){function e(e){var n=t.call(this,e)||this;return n.text=n.statics.value(n.domNode),n}return r(e,t),e.create=function(t){return document.createTextNode(t)},e.value=function(t){var e=t.data;return e.normalize&&(e=e.normalize()),e},e.prototype.deleteAt=function(t,e){this.domNode.data=this.text=this.text.slice(0,t)+this.text.slice(t+e)},e.prototype.index=function(t,e){return this.domNode===t?e:-1},e.prototype.insertAt=function(e,n,r){null==r?(this.text=this.text.slice(0,e)+n+this.text.slice(e),this.domNode.data=this.text):t.prototype.insertAt.call(this,e,n,r)},e.prototype.length=function(){return this.text.length},e.prototype.optimize=function(n){t.prototype.optimize.call(this,n),this.text=this.statics.value(this.domNode),0===this.text.length?this.remove():this.next instanceof e&&this.next.prev===this&&(this.insertAt(this.length(),this.next.value()),this.next.remove())},e.prototype.position=function(t,e){return void 0===e&&(e=!1),[this.domNode,t]},e.prototype.split=function(t,e){if(void 0===e&&(e=!1),!e){if(0===t)return this;if(t===this.length())return this.next}var n=i.create(this.domNode.splitText(t));return this.parent.insertBefore(n,this.next),this.text=this.statics.value(this.domNode),n},e.prototype.update=function(t,e){var n=this;t.some(function(t){return"characterData"===t.type&&t.target===n.domNode})&&(this.text=this.statics.value(this.domNode))},e.prototype.value=function(){return this.text},e.blotName="text",e.scope=i.Scope.INLINE_BLOT,e}(o.default);e.default=l},function(t,e,n){"use strict";var r=document.createElement("div");if(r.classList.toggle("test-class",!1),r.classList.contains("test-class")){var o=DOMTokenList.prototype.toggle;DOMTokenList.prototype.toggle=function(t,e){return arguments.length>1&&!this.contains(t)==!e?e:o.call(this,t)}}String.prototype.startsWith||(String.prototype.startsWith=function(t,e){return e=e||0,this.substr(e,t.length)===t}),String.prototype.endsWith||(String.prototype.endsWith=function(t,e){var n=this.toString();("number"!=typeof e||!isFinite(e)||Math.floor(e)!==e||e>n.length)&&(e=n.length),e-=t.length;var r=n.indexOf(t,e);return-1!==r&&r===e}),Array.prototype.find||Object.defineProperty(Array.prototype,"find",{value:function(t){if(null===this)throw new TypeError("Array.prototype.find called on null or undefined");if("function"!=typeof t)throw new TypeError("predicate must be a function");for(var e,n=Object(this),r=n.length>>>0,o=arguments[1],i=0;ie.length?t:e,l=t.length>e.length?e:t,a=i.indexOf(l);if(-1!=a)return r=[[y,i.substring(0,a)],[v,l],[y,i.substring(a+l.length)]],t.length>e.length&&(r[0][0]=r[2][0]=d),r;if(1==l.length)return[[d,t],[y,e]];var u=s(t,e);if(u){var c=u[0],f=u[1],h=u[2],p=u[3],b=u[4],g=n(c,h),m=n(f,p);return g.concat([[v,b]],m)}return o(t,e)}function o(t,e){for(var n=t.length,r=e.length,o=Math.ceil((n+r)/2),l=o,a=2*o,s=new Array(a),u=new Array(a),c=0;cn)v+=2;else if(x>r)p+=2;else if(h){var k=l+f-_;if(k>=0&&k=E)return i(t,e,O,x)}}}for(var N=-m+b;N<=m-g;N+=2){var E,k=l+N;E=N==-m||N!=m&&u[k-1]n)g+=2;else if(j>r)b+=2;else if(!h){var w=l+f-N;if(w>=0&&w=E)return i(t,e,O,x)}}}}return[[d,t],[y,e]]}function i(t,e,r,o){var i=t.substring(0,r),l=e.substring(0,o),a=t.substring(r),s=e.substring(o),u=n(i,l),c=n(a,s);return u.concat(c)}function l(t,e){if(!t||!e||t.charAt(0)!=e.charAt(0))return 0;for(var n=0,r=Math.min(t.length,e.length),o=r,i=0;n=t.length?[r,o,i,s,f]:null}var r=t.length>e.length?t:e,o=t.length>e.length?e:t;if(r.length<4||2*o.lengthu[4].length?s:u:s;var c,f,h,p;return t.length>e.length?(c=i[0],f=i[1],h=i[2],p=i[3]):(h=i[0],p=i[1],c=i[2],f=i[3]),[c,f,h,p,i[4]]}function u(t){t.push([v,""]);for(var e,n=0,r=0,o=0,i="",s="";n1?(0!==r&&0!==o&&(e=l(s,i),0!==e&&(n-r-o>0&&t[n-r-o-1][0]==v?t[n-r-o-1][1]+=s.substring(0,e):(t.splice(0,0,[v,s.substring(0,e)]),n++),s=s.substring(e),i=i.substring(e)),0!==(e=a(s,i))&&(t[n][1]=s.substring(s.length-e)+t[n][1],s=s.substring(0,s.length-e),i=i.substring(0,i.length-e))),0===r?t.splice(n-o,r+o,[y,s]):0===o?t.splice(n-r,r+o,[d,i]):t.splice(n-r-o,r+o,[d,i],[y,s]),n=n-r-o+(r?1:0)+(o?1:0)+1):0!==n&&t[n-1][0]==v?(t[n-1][1]+=t[n][1],t.splice(n,1)):n++,o=0,r=0,i="",s=""}""===t[t.length-1][1]&&t.pop();var c=!1;for(n=1;n0&&r.splice(o+2,0,[l[0],a]),p(r,o,3)}return t}function h(t){for(var e=!1,n=function(t){return t.charCodeAt(0)>=56320&&t.charCodeAt(0)<=57343},r=2;r=55296&&t.charCodeAt(t.length-1)<=56319}(t[r-2][1])&&t[r-1][0]===d&&n(t[r-1][1])&&t[r][0]===y&&n(t[r][1])&&(e=!0,t[r-1][1]=t[r-2][1].slice(-1)+t[r-1][1],t[r][1]=t[r-2][1].slice(-1)+t[r][1],t[r-2][1]=t[r-2][1].slice(0,-1));if(!e)return t;for(var o=[],r=0;r0&&o.push(t[r]);return o}function p(t,e,n){for(var r=e+n-1;r>=0&&r>=e-1;r--)if(r+1=r&&!a.endsWith("\n")&&(n=!0),e.scroll.insertAt(t,a);var c=e.scroll.line(t),f=u(c,2),h=f[0],p=f[1],y=(0,T.default)({},(0,O.bubbleFormats)(h));if(h instanceof w.default){var b=h.descendant(v.default.Leaf,p),g=u(b,1),m=g[0];y=(0,T.default)(y,(0,O.bubbleFormats)(m))}l=d.default.attributes.diff(y,l)||{}}else if("object"===s(o.insert)){var _=Object.keys(o.insert)[0];if(null==_)return t;e.scroll.insertAt(t,_,o.insert[_])}r+=i}return Object.keys(l).forEach(function(n){e.scroll.formatAt(t,i,n,l[n])}),t+i},0),t.reduce(function(t,n){return"number"==typeof n.delete?(e.scroll.deleteAt(t,n.delete),t):t+(n.retain||n.insert.length||1)},0),this.scroll.batchEnd(),this.update(t)}},{key:"deleteText",value:function(t,e){return this.scroll.deleteAt(t,e),this.update((new h.default).retain(t).delete(e))}},{key:"formatLine",value:function(t,e){var n=this,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return this.scroll.update(),Object.keys(r).forEach(function(o){if(null==n.scroll.whitelist||n.scroll.whitelist[o]){var i=n.scroll.lines(t,Math.max(e,1)),l=e;i.forEach(function(e){var i=e.length();if(e instanceof g.default){var a=t-e.offset(n.scroll),s=e.newlineIndex(a+l)-a+1;e.formatAt(a,s,o,r[o])}else e.format(o,r[o]);l-=i})}}),this.scroll.optimize(),this.update((new h.default).retain(t).retain(e,(0,N.default)(r)))}},{key:"formatText",value:function(t,e){var n=this,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return Object.keys(r).forEach(function(o){n.scroll.formatAt(t,e,o,r[o])}),this.update((new h.default).retain(t).retain(e,(0,N.default)(r)))}},{key:"getContents",value:function(t,e){return this.delta.slice(t,t+e)}},{key:"getDelta",value:function(){return this.scroll.lines().reduce(function(t,e){return t.concat(e.delta())},new h.default)}},{key:"getFormat",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=[],r=[];0===e?this.scroll.path(t).forEach(function(t){var e=u(t,1),o=e[0];o instanceof w.default?n.push(o):o instanceof v.default.Leaf&&r.push(o)}):(n=this.scroll.lines(t,e),r=this.scroll.descendants(v.default.Leaf,t,e));var o=[n,r].map(function(t){if(0===t.length)return{};for(var e=(0,O.bubbleFormats)(t.shift());Object.keys(e).length>0;){var n=t.shift();if(null==n)return e;e=l((0,O.bubbleFormats)(n),e)}return e});return T.default.apply(T.default,o)}},{key:"getText",value:function(t,e){return this.getContents(t,e).filter(function(t){return"string"==typeof t.insert}).map(function(t){return t.insert}).join("")}},{key:"insertEmbed",value:function(t,e,n){return this.scroll.insertAt(t,e,n),this.update((new h.default).retain(t).insert(o({},e,n)))}},{key:"insertText",value:function(t,e){var n=this,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return e=e.replace(/\r\n/g,"\n").replace(/\r/g,"\n"),this.scroll.insertAt(t,e),Object.keys(r).forEach(function(o){n.scroll.formatAt(t,e.length,o,r[o])}),this.update((new h.default).retain(t).insert(e,(0,N.default)(r)))}},{key:"isBlank",value:function(){if(0==this.scroll.children.length)return!0;if(this.scroll.children.length>1)return!1;var t=this.scroll.children.head;return t.statics.blotName===w.default.blotName&&(!(t.children.length>1)&&t.children.head instanceof k.default)}},{key:"removeFormat",value:function(t,e){var n=this.getText(t,e),r=this.scroll.line(t+e),o=u(r,2),i=o[0],l=o[1],a=0,s=new h.default;null!=i&&(a=i instanceof g.default?i.newlineIndex(l)-l+1:i.length()-l,s=i.delta().slice(l,l+a-1).insert("\n"));var c=this.getContents(t,e+a),f=c.diff((new h.default).insert(n).concat(s)),p=(new h.default).retain(t).concat(f);return this.applyDelta(p)}},{key:"update",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0,r=this.delta;if(1===e.length&&"characterData"===e[0].type&&e[0].target.data.match(P)&&v.default.find(e[0].target)){var o=v.default.find(e[0].target),i=(0,O.bubbleFormats)(o),l=o.offset(this.scroll),a=e[0].oldValue.replace(_.default.CONTENTS,""),s=(new h.default).insert(a),u=(new h.default).insert(o.value());t=(new h.default).retain(l).concat(s.diff(u,n)).reduce(function(t,e){return e.insert?t.insert(e.insert,i):t.push(e)},new h.default),this.delta=r.compose(t)}else this.delta=this.getDelta(),t&&(0,A.default)(r.compose(t),this.delta)||(t=r.diff(this.delta,n));return t}}]),t}();e.default=S},function(t,e){"use strict";function n(){}function r(t,e,n){this.fn=t,this.context=e,this.once=n||!1}function o(){this._events=new n,this._eventsCount=0}var i=Object.prototype.hasOwnProperty,l="~";Object.create&&(n.prototype=Object.create(null),(new n).__proto__||(l=!1)),o.prototype.eventNames=function(){var t,e,n=[];if(0===this._eventsCount)return n;for(e in t=this._events)i.call(t,e)&&n.push(l?e.slice(1):e);return Object.getOwnPropertySymbols?n.concat(Object.getOwnPropertySymbols(t)):n},o.prototype.listeners=function(t,e){var n=l?l+t:t,r=this._events[n];if(e)return!!r;if(!r)return[];if(r.fn)return[r.fn];for(var o=0,i=r.length,a=new Array(i);o0){if(i instanceof y.BlockEmbed||f instanceof y.BlockEmbed)return void this.optimize();if(i instanceof _.default){var h=i.newlineIndex(i.length(),!0);if(h>-1&&(i=i.split(h+1))===f)return void this.optimize()}else if(f instanceof _.default){var p=f.newlineIndex(0);p>-1&&f.split(p+1)}var d=f.children.head instanceof g.default?null:f.children.head;i.moveChildren(f,d),i.remove()}this.optimize()}},{key:"enable",value:function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.domNode.setAttribute("contenteditable",t)}},{key:"formatAt",value:function(t,n,r,o){(null==this.whitelist||this.whitelist[r])&&(c(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"formatAt",this).call(this,t,n,r,o),this.optimize())}},{key:"insertAt",value:function(t,n,r){if(null==r||null==this.whitelist||this.whitelist[n]){if(t>=this.length())if(null==r||null==h.default.query(n,h.default.Scope.BLOCK)){var o=h.default.create(this.statics.defaultChild);this.appendChild(o),null==r&&n.endsWith("\n")&&(n=n.slice(0,-1)),o.insertAt(0,n,r)}else{var i=h.default.create(n,r);this.appendChild(i)}else c(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"insertAt",this).call(this,t,n,r);this.optimize()}}},{key:"insertBefore",value:function(t,n){if(t.statics.scope===h.default.Scope.INLINE_BLOT){var r=h.default.create(this.statics.defaultChild);r.appendChild(t),t=r}c(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"insertBefore",this).call(this,t,n)}},{key:"leaf",value:function(t){return this.path(t).pop()||[null,-1]}},{key:"line",value:function(t){return t===this.length()?this.line(t-1):this.descendant(a,t)}},{key:"lines",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Number.MAX_VALUE;return function t(e,n,r){var o=[],i=r;return e.children.forEachAt(n,r,function(e,n,r){a(e)?o.push(e):e instanceof h.default.Container&&(o=o.concat(t(e,n,i))),i-=r}),o}(this,t,e)}},{key:"optimize",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};!0!==this.batch&&(c(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"optimize",this).call(this,t,n),t.length>0&&this.emitter.emit(d.default.events.SCROLL_OPTIMIZE,t,n))}},{key:"path",value:function(t){return c(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"path",this).call(this,t).slice(1)}},{key:"update",value:function(t){if(!0!==this.batch){var n=d.default.sources.USER;"string"==typeof t&&(n=t),Array.isArray(t)||(t=this.observer.takeRecords()),t.length>0&&this.emitter.emit(d.default.events.SCROLL_BEFORE_UPDATE,n,t),c(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"update",this).call(this,t.concat([])),t.length>0&&this.emitter.emit(d.default.events.SCROLL_UPDATE,n,t)}}}]),e}(h.default.Scroll);x.blotName="scroll",x.className="ql-editor",x.tagName="DIV",x.defaultChild="block",x.allowedChildren=[v.default,y.BlockEmbed,w.default],e.default=x},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function l(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function a(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function s(t,e,n){return"object"===(void 0===e?"undefined":x(e))?Object.keys(e).reduce(function(t,n){return s(t,n,e[n])},t):t.reduce(function(t,r){return r.attributes&&r.attributes[e]?t.push(r):t.insert(r.insert,(0,j.default)({},o({},e,n),r.attributes))},new q.default)}function u(t){if(t.nodeType!==Node.ELEMENT_NODE)return{};return t["__ql-computed-style"]||(t["__ql-computed-style"]=window.getComputedStyle(t))}function c(t,e){for(var n="",r=t.ops.length-1;r>=0&&n.length-1}function h(t,e,n){return t.nodeType===t.TEXT_NODE?n.reduce(function(e,n){return n(t,e)},new q.default):t.nodeType===t.ELEMENT_NODE?[].reduce.call(t.childNodes||[],function(r,o){var i=h(o,e,n);return o.nodeType===t.ELEMENT_NODE&&(i=e.reduce(function(t,e){return e(o,t)},i),i=(o[W]||[]).reduce(function(t,e){return e(o,t)},i)),r.concat(i)},new q.default):new q.default}function p(t,e,n){return s(n,t,!0)}function d(t,e){var n=P.default.Attributor.Attribute.keys(t),r=P.default.Attributor.Class.keys(t),o=P.default.Attributor.Style.keys(t),i={};return n.concat(r).concat(o).forEach(function(e){var n=P.default.query(e,P.default.Scope.ATTRIBUTE);null!=n&&(i[n.attrName]=n.value(t),i[n.attrName])||(n=Y[e],null==n||n.attrName!==e&&n.keyName!==e||(i[n.attrName]=n.value(t)||void 0),null==(n=X[e])||n.attrName!==e&&n.keyName!==e||(n=X[e],i[n.attrName]=n.value(t)||void 0))}),Object.keys(i).length>0&&(e=s(e,i)),e}function y(t,e){var n=P.default.query(t);if(null==n)return e;if(n.prototype instanceof P.default.Embed){var r={},o=n.value(t);null!=o&&(r[n.blotName]=o,e=(new q.default).insert(r,n.formats(t)))}else"function"==typeof n.formats&&(e=s(e,n.blotName,n.formats(t)));return e}function v(t,e){return c(e,"\n")||e.insert("\n"),e}function b(){return new q.default}function g(t,e){var n=P.default.query(t);if(null==n||"list-item"!==n.blotName||!c(e,"\n"))return e;for(var r=-1,o=t.parentNode;!o.classList.contains("ql-clipboard");)"list"===(P.default.query(o)||{}).blotName&&(r+=1),o=o.parentNode;return r<=0?e:e.compose((new q.default).retain(e.length()-1).retain(1,{indent:r}))}function m(t,e){return c(e,"\n")||(f(t)||e.length()>0&&t.nextSibling&&f(t.nextSibling))&&e.insert("\n"),e}function _(t,e){if(f(t)&&null!=t.nextElementSibling&&!c(e,"\n\n")){var n=t.offsetHeight+parseFloat(u(t).marginTop)+parseFloat(u(t).marginBottom);t.nextElementSibling.offsetTop>t.offsetTop+1.5*n&&e.insert("\n")}return e}function O(t,e){var n={},r=t.style||{};return r.fontStyle&&"italic"===u(t).fontStyle&&(n.italic=!0),r.fontWeight&&(u(t).fontWeight.startsWith("bold")||parseInt(u(t).fontWeight)>=700)&&(n.bold=!0),Object.keys(n).length>0&&(e=s(e,n)),parseFloat(r.textIndent||0)>0&&(e=(new q.default).insert("\t").concat(e)),e}function w(t,e){var n=t.data;if("O:P"===t.parentNode.tagName)return e.insert(n.trim());if(0===n.trim().length&&t.parentNode.classList.contains("ql-clipboard"))return e;if(!u(t.parentNode).whiteSpace.startsWith("pre")){var r=function(t,e){return e=e.replace(/[^\u00a0]/g,""),e.length<1&&t?" ":e};n=n.replace(/\r\n/g," ").replace(/\n/g," "),n=n.replace(/\s\s+/g,r.bind(r,!0)),(null==t.previousSibling&&f(t.parentNode)||null!=t.previousSibling&&f(t.previousSibling))&&(n=n.replace(/^\s+/,r.bind(r,!1))),(null==t.nextSibling&&f(t.parentNode)||null!=t.nextSibling&&f(t.nextSibling))&&(n=n.replace(/\s+$/,r.bind(r,!1)))}return e.insert(n)}Object.defineProperty(e,"__esModule",{value:!0}),e.matchText=e.matchSpacing=e.matchNewline=e.matchBlot=e.matchAttributor=e.default=void 0;var x="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},k=function(){function t(t,e){var n=[],r=!0,o=!1,i=void 0;try{for(var l,a=t[Symbol.iterator]();!(r=(l=a.next()).done)&&(n.push(l.value),!e||n.length!==e);r=!0);}catch(t){o=!0,i=t}finally{try{!r&&a.return&&a.return()}finally{if(o)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),E=function(){function t(t,e){for(var n=0;n\r?\n +\<"),this.convert();var e=this.quill.getFormat(this.quill.selection.savedRange.index);if(e[F.default.blotName]){var n=this.container.innerText;return this.container.innerHTML="",(new q.default).insert(n,o({},F.default.blotName,e[F.default.blotName]))}var r=this.prepareMatching(),i=k(r,2),l=i[0],a=i[1],s=h(this.container,l,a);return c(s,"\n")&&null==s.ops[s.ops.length-1].attributes&&(s=s.compose((new q.default).retain(s.length()-1).delete(1))),Z.log("convert",this.container.innerHTML,s),this.container.innerHTML="",s}},{key:"dangerouslyPasteHTML",value:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:C.default.sources.API;if("string"==typeof t)this.quill.setContents(this.convert(t),e),this.quill.setSelection(0,C.default.sources.SILENT);else{var r=this.convert(e);this.quill.updateContents((new q.default).retain(t).concat(r),n),this.quill.setSelection(t+r.length(),C.default.sources.SILENT)}}},{key:"onPaste",value:function(t){var e=this;if(!t.defaultPrevented&&this.quill.isEnabled()){var n=this.quill.getSelection(),r=(new q.default).retain(n.index),o=this.quill.scrollingContainer.scrollTop;this.container.focus(),this.quill.selection.update(C.default.sources.SILENT),setTimeout(function(){r=r.concat(e.convert()).delete(n.length),e.quill.updateContents(r,C.default.sources.USER),e.quill.setSelection(r.length()-n.length,C.default.sources.SILENT),e.quill.scrollingContainer.scrollTop=o,e.quill.focus()},1)}}},{key:"prepareMatching",value:function(){var t=this,e=[],n=[];return this.matchers.forEach(function(r){var o=k(r,2),i=o[0],l=o[1];switch(i){case Node.TEXT_NODE:n.push(l);break;case Node.ELEMENT_NODE:e.push(l);break;default:[].forEach.call(t.container.querySelectorAll(i),function(t){t[W]=t[W]||[],t[W].push(l)})}}),[e,n]}}]),e}(I.default);$.DEFAULTS={matchers:[],matchVisual:!0},e.default=$,e.matchAttributor=d,e.matchBlot=y,e.matchNewline=m,e.matchSpacing=_,e.matchText=w},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function l(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function a(t){var e=t.ops[t.ops.length-1];return null!=e&&(null!=e.insert?"string"==typeof e.insert&&e.insert.endsWith("\n"):null!=e.attributes&&Object.keys(e.attributes).some(function(t){return null!=f.default.query(t,f.default.Scope.BLOCK)}))}function s(t){var e=t.reduce(function(t,e){return t+=e.delete||0},0),n=t.length()-e;return a(t)&&(n-=1),n}Object.defineProperty(e,"__esModule",{value:!0}),e.getLastChangeIndex=e.default=void 0;var u=function(){function t(t,e){for(var n=0;nr&&this.stack.undo.length>0){var o=this.stack.undo.pop();n=n.compose(o.undo),t=o.redo.compose(t)}else this.lastRecorded=r;this.stack.undo.push({redo:t,undo:n}),this.stack.undo.length>this.options.maxStack&&this.stack.undo.shift()}}},{key:"redo",value:function(){this.change("redo","undo")}},{key:"transform",value:function(t){this.stack.undo.forEach(function(e){e.undo=t.transform(e.undo,!0),e.redo=t.transform(e.redo,!0)}),this.stack.redo.forEach(function(e){e.undo=t.transform(e.undo,!0),e.redo=t.transform(e.redo,!0)})}},{key:"undo",value:function(){this.change("undo","redo")}}]),e}(y.default);v.DEFAULTS={delay:1e3,maxStack:100,userOnly:!1},e.default=v,e.getLastChangeIndex=s},function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function i(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0}),e.IndentClass=void 0;var l=function(){function t(t,e){for(var n=0;n0&&this.children.tail.format(t,e)}},{key:"formats",value:function(){return o({},this.statics.blotName,this.statics.formats(this.domNode))}},{key:"insertBefore",value:function(t,n){if(t instanceof v)u(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"insertBefore",this).call(this,t,n);else{var r=null==n?this.length():n.offset(this),o=this.split(r);o.parent.insertBefore(t,o)}}},{key:"optimize",value:function(t){u(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"optimize",this).call(this,t);var n=this.next;null!=n&&n.prev===this&&n.statics.blotName===this.statics.blotName&&n.domNode.tagName===this.domNode.tagName&&n.domNode.getAttribute("data-checked")===this.domNode.getAttribute("data-checked")&&(n.moveChildren(this),n.remove())}},{key:"replace",value:function(t){if(t.statics.blotName!==this.statics.blotName){var n=f.default.create(this.statics.defaultChild);t.moveChildren(n),this.appendChild(n)}u(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"replace",this).call(this,t)}}]),e}(y.default);b.blotName="list",b.scope=f.default.Scope.BLOCK_BLOT,b.tagName=["OL","UL"],b.defaultChild="list-item",b.allowedChildren=[v],e.ListItem=v,e.default=b},function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function i(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var l=n(39),a=function(t){return t&&t.__esModule?t:{default:t}}(l),s=function(t){function e(){return r(this,e),o(this,(e.__proto__||Object.getPrototypeOf(e)).apply(this,arguments))}return i(e,t),e}(a.default);s.blotName="italic",s.tagName=["EM","I"],e.default=s},function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function i(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var l=function(){function t(t,e){for(var n=0;n-1?n?this.domNode.setAttribute(t,n):this.domNode.removeAttribute(t):a(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"format",this).call(this,t,n)}}],[{key:"create",value:function(t){var n=a(e.__proto__||Object.getPrototypeOf(e),"create",this).call(this,t);return"string"==typeof t&&n.setAttribute("src",this.sanitize(t)),n}},{key:"formats",value:function(t){return f.reduce(function(e,n){return t.hasAttribute(n)&&(e[n]=t.getAttribute(n)),e},{})}},{key:"match",value:function(t){return/\.(jpe?g|gif|png)$/.test(t)||/^data:image\/.+;base64/.test(t)}},{key:"sanitize",value:function(t){return(0,c.sanitize)(t,["http","https","data"])?t:"//:0"}},{key:"value",value:function(t){return t.getAttribute("src")}}]),e}(u.default.Embed);h.blotName="image",h.tagName="IMG",e.default=h},function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function i(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var l=function(){function t(t,e){for(var n=0;n-1?n?this.domNode.setAttribute(t,n):this.domNode.removeAttribute(t):a(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"format",this).call(this,t,n)}}],[{key:"create",value:function(t){var n=a(e.__proto__||Object.getPrototypeOf(e),"create",this).call(this,t);return n.setAttribute("frameborder","0"),n.setAttribute("allowfullscreen",!0),n.setAttribute("src",this.sanitize(t)),n}},{key:"formats",value:function(t){return f.reduce(function(e,n){return t.hasAttribute(n)&&(e[n]=t.getAttribute(n)),e},{})}},{key:"sanitize",value:function(t){return c.default.sanitize(t)}},{key:"value",value:function(t){return t.getAttribute("src")}}]),e}(s.BlockEmbed);h.blotName="video",h.className="ql-video",h.tagName="IFRAME",e.default=h},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function l(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.FormulaBlot=void 0;var a=function(){function t(t,e){for(var n=0;n0||null==this.cachedText)&&(this.domNode.innerHTML=t(e),this.domNode.normalize(),this.attach()),this.cachedText=e)}}]),e}(v.default);b.className="ql-syntax";var g=new c.default.Attributor.Class("token","hljs",{scope:c.default.Scope.INLINE}),m=function(t){function e(t,n){o(this,e);var r=i(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,n));if("function"!=typeof r.options.highlight)throw new Error("Syntax module requires highlight.js. Please include the library on the page before Quill.");var l=null;return r.quill.on(h.default.events.SCROLL_OPTIMIZE,function(){clearTimeout(l),l=setTimeout(function(){r.highlight(),l=null},r.options.interval)}),r.highlight(),r}return l(e,t),a(e,null,[{key:"register",value:function(){h.default.register(g,!0),h.default.register(b,!0)}}]),a(e,[{key:"highlight",value:function(){var t=this;if(!this.quill.selection.composing){this.quill.update(h.default.sources.USER);var e=this.quill.getSelection();this.quill.scroll.descendants(b).forEach(function(e){e.highlight(t.options.highlight)}),this.quill.update(h.default.sources.SILENT),null!=e&&this.quill.setSelection(e,h.default.sources.SILENT)}}}]),e}(d.default);m.DEFAULTS={highlight:function(){return null==window.hljs?null:function(t){return window.hljs.highlightAuto(t).value}}(),interval:1e3},e.CodeBlock=b,e.CodeToken=g,e.default=m},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function l(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function a(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function s(t,e,n){var r=document.createElement("button");r.setAttribute("type","button"),r.classList.add("ql-"+e),null!=n&&(r.value=n),t.appendChild(r)}function u(t,e){Array.isArray(e[0])||(e=[e]),e.forEach(function(e){var n=document.createElement("span");n.classList.add("ql-formats"),e.forEach(function(t){if("string"==typeof t)s(n,t);else{var e=Object.keys(t)[0],r=t[e];Array.isArray(r)?c(n,e,r):s(n,e,r)}}),t.appendChild(n)})}function c(t,e,n){var r=document.createElement("select");r.classList.add("ql-"+e),n.forEach(function(t){var e=document.createElement("option");!1!==t?e.setAttribute("value",t):e.setAttribute("selected","selected"),r.appendChild(e)}),t.appendChild(r)}Object.defineProperty(e,"__esModule",{value:!0}),e.addControls=e.default=void 0;var f=function(){function t(t,e){var n=[],r=!0,o=!1,i=void 0;try{for(var l,a=t[Symbol.iterator]();!(r=(l=a.next()).done)&&(n.push(l.value),!e||n.length!==e);r=!0);}catch(t){o=!0,i=t}finally{try{!r&&a.return&&a.return()}finally{if(o)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),h=function(){function t(t,e){for(var n=0;n '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function l(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.BubbleTooltip=void 0;var a=function t(e,n,r){null===e&&(e=Function.prototype);var o=Object.getOwnPropertyDescriptor(e,n);if(void 0===o){var i=Object.getPrototypeOf(e);return null===i?void 0:t(i,n,r)}if("value"in o)return o.value;var l=o.get;if(void 0!==l)return l.call(r)},s=function(){function t(t,e){for(var n=0;n0&&o===h.default.sources.USER){r.show(),r.root.style.left="0px",r.root.style.width="",r.root.style.width=r.root.offsetWidth+"px";var i=r.quill.getLines(e.index,e.length);if(1===i.length)r.position(r.quill.getBounds(e));else{var l=i[i.length-1],a=r.quill.getIndex(l),s=Math.min(l.length()-1,e.index+e.length-a),u=r.quill.getBounds(new y.Range(a,s));r.position(u)}}else document.activeElement!==r.textbox&&r.quill.hasFocus()&&r.hide()}),r}return l(e,t),s(e,[{key:"listen",value:function(){var t=this;a(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"listen",this).call(this),this.root.querySelector(".ql-close").addEventListener("click",function(){t.root.classList.remove("ql-editing")}),this.quill.on(h.default.events.SCROLL_OPTIMIZE,function(){setTimeout(function(){if(!t.root.classList.contains("ql-hidden")){var e=t.quill.getSelection();null!=e&&t.position(t.quill.getBounds(e))}},1)})}},{key:"cancel",value:function(){this.show()}},{key:"position",value:function(t){var n=a(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"position",this).call(this,t),r=this.root.querySelector(".ql-tooltip-arrow");if(r.style.marginLeft="",0===n)return n;r.style.marginLeft=-1*n-r.offsetWidth/2+"px"}}]),e}(p.BaseTooltip);_.TEMPLATE=['','
','','',"
"].join(""),e.BubbleTooltip=_,e.default=m},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function l(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var a=function(){function t(t,e){var n=[],r=!0,o=!1,i=void 0;try{for(var l,a=t[Symbol.iterator]();!(r=(l=a.next()).done)&&(n.push(l.value),!e||n.length!==e);r=!0);}catch(t){o=!0,i=t}finally{try{!r&&a.return&&a.return()}finally{if(o)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),s=function t(e,n,r){null===e&&(e=Function.prototype);var o=Object.getOwnPropertyDescriptor(e,n);if(void 0===o){var i=Object.getPrototypeOf(e);return null===i?void 0:t(i,n,r)}if("value"in o)return o.value;var l=o.get;if(void 0!==l)return l.call(r)},u=function(){function t(t,e){for(var n=0;n','','',''].join(""),e.default=w}]).default}); +//# sourceMappingURL=quill.min.js.map \ No newline at end of file diff --git a/iosApp/editor/quill.snow.css b/iosApp/editor/quill.snow.css new file mode 100644 index 00000000..ccf825df --- /dev/null +++ b/iosApp/editor/quill.snow.css @@ -0,0 +1,945 @@ +/*! + * Quill Editor v1.3.7 + * https://quilljs.com/ + * Copyright (c) 2014, Jason Chen + * Copyright (c) 2013, salesforce.com + */ +.ql-container { + box-sizing: border-box; + font-family: Helvetica, Arial, sans-serif; + font-size: 13px; + height: 100%; + margin: 0px; + position: relative; +} +.ql-container.ql-disabled .ql-tooltip { + visibility: hidden; +} +.ql-container.ql-disabled .ql-editor ul[data-checked] > li::before { + pointer-events: none; +} +.ql-clipboard { + left: -100000px; + height: 1px; + overflow-y: hidden; + position: absolute; + top: 50%; +} +.ql-clipboard p { + margin: 0; + padding: 0; +} +.ql-editor { + box-sizing: border-box; + line-height: 1.42; + height: 100%; + outline: none; + overflow-y: auto; + padding: 12px 15px; + tab-size: 4; + -moz-tab-size: 4; + text-align: left; + white-space: pre-wrap; + word-wrap: break-word; +} +.ql-editor > * { + cursor: text; +} +.ql-editor p, +.ql-editor ol, +.ql-editor ul, +.ql-editor pre, +.ql-editor blockquote, +.ql-editor h1, +.ql-editor h2, +.ql-editor h3, +.ql-editor h4, +.ql-editor h5, +.ql-editor h6 { + margin: 0; + padding: 0; + counter-reset: list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9; +} +.ql-editor ol, +.ql-editor ul { + padding-left: 1.5em; +} +.ql-editor ol > li, +.ql-editor ul > li { + list-style-type: none; +} +.ql-editor ul > li::before { + content: '\2022'; +} +.ql-editor ul[data-checked=true], +.ql-editor ul[data-checked=false] { + pointer-events: none; +} +.ql-editor ul[data-checked=true] > li *, +.ql-editor ul[data-checked=false] > li * { + pointer-events: all; +} +.ql-editor ul[data-checked=true] > li::before, +.ql-editor ul[data-checked=false] > li::before { + color: #777; + cursor: pointer; + pointer-events: all; +} +.ql-editor ul[data-checked=true] > li::before { + content: '\2611'; +} +.ql-editor ul[data-checked=false] > li::before { + content: '\2610'; +} +.ql-editor li::before { + display: inline-block; + white-space: nowrap; + width: 1.2em; +} +.ql-editor li:not(.ql-direction-rtl)::before { + margin-left: -1.5em; + margin-right: 0.3em; + text-align: right; +} +.ql-editor li.ql-direction-rtl::before { + margin-left: 0.3em; + margin-right: -1.5em; +} +.ql-editor ol li:not(.ql-direction-rtl), +.ql-editor ul li:not(.ql-direction-rtl) { + padding-left: 1.5em; +} +.ql-editor ol li.ql-direction-rtl, +.ql-editor ul li.ql-direction-rtl { + padding-right: 1.5em; +} +.ql-editor ol li { + counter-reset: list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9; + counter-increment: list-0; +} +.ql-editor ol li:before { + content: counter(list-0, decimal) '. '; +} +.ql-editor ol li.ql-indent-1 { + counter-increment: list-1; +} +.ql-editor ol li.ql-indent-1:before { + content: counter(list-1, lower-alpha) '. '; +} +.ql-editor ol li.ql-indent-1 { + counter-reset: list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9; +} +.ql-editor ol li.ql-indent-2 { + counter-increment: list-2; +} +.ql-editor ol li.ql-indent-2:before { + content: counter(list-2, lower-roman) '. '; +} +.ql-editor ol li.ql-indent-2 { + counter-reset: list-3 list-4 list-5 list-6 list-7 list-8 list-9; +} +.ql-editor ol li.ql-indent-3 { + counter-increment: list-3; +} +.ql-editor ol li.ql-indent-3:before { + content: counter(list-3, decimal) '. '; +} +.ql-editor ol li.ql-indent-3 { + counter-reset: list-4 list-5 list-6 list-7 list-8 list-9; +} +.ql-editor ol li.ql-indent-4 { + counter-increment: list-4; +} +.ql-editor ol li.ql-indent-4:before { + content: counter(list-4, lower-alpha) '. '; +} +.ql-editor ol li.ql-indent-4 { + counter-reset: list-5 list-6 list-7 list-8 list-9; +} +.ql-editor ol li.ql-indent-5 { + counter-increment: list-5; +} +.ql-editor ol li.ql-indent-5:before { + content: counter(list-5, lower-roman) '. '; +} +.ql-editor ol li.ql-indent-5 { + counter-reset: list-6 list-7 list-8 list-9; +} +.ql-editor ol li.ql-indent-6 { + counter-increment: list-6; +} +.ql-editor ol li.ql-indent-6:before { + content: counter(list-6, decimal) '. '; +} +.ql-editor ol li.ql-indent-6 { + counter-reset: list-7 list-8 list-9; +} +.ql-editor ol li.ql-indent-7 { + counter-increment: list-7; +} +.ql-editor ol li.ql-indent-7:before { + content: counter(list-7, lower-alpha) '. '; +} +.ql-editor ol li.ql-indent-7 { + counter-reset: list-8 list-9; +} +.ql-editor ol li.ql-indent-8 { + counter-increment: list-8; +} +.ql-editor ol li.ql-indent-8:before { + content: counter(list-8, lower-roman) '. '; +} +.ql-editor ol li.ql-indent-8 { + counter-reset: list-9; +} +.ql-editor ol li.ql-indent-9 { + counter-increment: list-9; +} +.ql-editor ol li.ql-indent-9:before { + content: counter(list-9, decimal) '. '; +} +.ql-editor .ql-indent-1:not(.ql-direction-rtl) { + padding-left: 3em; +} +.ql-editor li.ql-indent-1:not(.ql-direction-rtl) { + padding-left: 4.5em; +} +.ql-editor .ql-indent-1.ql-direction-rtl.ql-align-right { + padding-right: 3em; +} +.ql-editor li.ql-indent-1.ql-direction-rtl.ql-align-right { + padding-right: 4.5em; +} +.ql-editor .ql-indent-2:not(.ql-direction-rtl) { + padding-left: 6em; +} +.ql-editor li.ql-indent-2:not(.ql-direction-rtl) { + padding-left: 7.5em; +} +.ql-editor .ql-indent-2.ql-direction-rtl.ql-align-right { + padding-right: 6em; +} +.ql-editor li.ql-indent-2.ql-direction-rtl.ql-align-right { + padding-right: 7.5em; +} +.ql-editor .ql-indent-3:not(.ql-direction-rtl) { + padding-left: 9em; +} +.ql-editor li.ql-indent-3:not(.ql-direction-rtl) { + padding-left: 10.5em; +} +.ql-editor .ql-indent-3.ql-direction-rtl.ql-align-right { + padding-right: 9em; +} +.ql-editor li.ql-indent-3.ql-direction-rtl.ql-align-right { + padding-right: 10.5em; +} +.ql-editor .ql-indent-4:not(.ql-direction-rtl) { + padding-left: 12em; +} +.ql-editor li.ql-indent-4:not(.ql-direction-rtl) { + padding-left: 13.5em; +} +.ql-editor .ql-indent-4.ql-direction-rtl.ql-align-right { + padding-right: 12em; +} +.ql-editor li.ql-indent-4.ql-direction-rtl.ql-align-right { + padding-right: 13.5em; +} +.ql-editor .ql-indent-5:not(.ql-direction-rtl) { + padding-left: 15em; +} +.ql-editor li.ql-indent-5:not(.ql-direction-rtl) { + padding-left: 16.5em; +} +.ql-editor .ql-indent-5.ql-direction-rtl.ql-align-right { + padding-right: 15em; +} +.ql-editor li.ql-indent-5.ql-direction-rtl.ql-align-right { + padding-right: 16.5em; +} +.ql-editor .ql-indent-6:not(.ql-direction-rtl) { + padding-left: 18em; +} +.ql-editor li.ql-indent-6:not(.ql-direction-rtl) { + padding-left: 19.5em; +} +.ql-editor .ql-indent-6.ql-direction-rtl.ql-align-right { + padding-right: 18em; +} +.ql-editor li.ql-indent-6.ql-direction-rtl.ql-align-right { + padding-right: 19.5em; +} +.ql-editor .ql-indent-7:not(.ql-direction-rtl) { + padding-left: 21em; +} +.ql-editor li.ql-indent-7:not(.ql-direction-rtl) { + padding-left: 22.5em; +} +.ql-editor .ql-indent-7.ql-direction-rtl.ql-align-right { + padding-right: 21em; +} +.ql-editor li.ql-indent-7.ql-direction-rtl.ql-align-right { + padding-right: 22.5em; +} +.ql-editor .ql-indent-8:not(.ql-direction-rtl) { + padding-left: 24em; +} +.ql-editor li.ql-indent-8:not(.ql-direction-rtl) { + padding-left: 25.5em; +} +.ql-editor .ql-indent-8.ql-direction-rtl.ql-align-right { + padding-right: 24em; +} +.ql-editor li.ql-indent-8.ql-direction-rtl.ql-align-right { + padding-right: 25.5em; +} +.ql-editor .ql-indent-9:not(.ql-direction-rtl) { + padding-left: 27em; +} +.ql-editor li.ql-indent-9:not(.ql-direction-rtl) { + padding-left: 28.5em; +} +.ql-editor .ql-indent-9.ql-direction-rtl.ql-align-right { + padding-right: 27em; +} +.ql-editor li.ql-indent-9.ql-direction-rtl.ql-align-right { + padding-right: 28.5em; +} +.ql-editor .ql-video { + display: block; + max-width: 100%; +} +.ql-editor .ql-video.ql-align-center { + margin: 0 auto; +} +.ql-editor .ql-video.ql-align-right { + margin: 0 0 0 auto; +} +.ql-editor .ql-bg-black { + background-color: #000; +} +.ql-editor .ql-bg-red { + background-color: #e60000; +} +.ql-editor .ql-bg-orange { + background-color: #f90; +} +.ql-editor .ql-bg-yellow { + background-color: #ff0; +} +.ql-editor .ql-bg-green { + background-color: #008a00; +} +.ql-editor .ql-bg-blue { + background-color: #06c; +} +.ql-editor .ql-bg-purple { + background-color: #93f; +} +.ql-editor .ql-color-white { + color: #fff; +} +.ql-editor .ql-color-red { + color: #e60000; +} +.ql-editor .ql-color-orange { + color: #f90; +} +.ql-editor .ql-color-yellow { + color: #ff0; +} +.ql-editor .ql-color-green { + color: #008a00; +} +.ql-editor .ql-color-blue { + color: #06c; +} +.ql-editor .ql-color-purple { + color: #93f; +} +.ql-editor .ql-font-serif { + font-family: Georgia, Times New Roman, serif; +} +.ql-editor .ql-font-monospace { + font-family: Monaco, Courier New, monospace; +} +.ql-editor .ql-size-small { + font-size: 0.75em; +} +.ql-editor .ql-size-large { + font-size: 1.5em; +} +.ql-editor .ql-size-huge { + font-size: 2.5em; +} +.ql-editor .ql-direction-rtl { + direction: rtl; + text-align: inherit; +} +.ql-editor .ql-align-center { + text-align: center; +} +.ql-editor .ql-align-justify { + text-align: justify; +} +.ql-editor .ql-align-right { + text-align: right; +} +.ql-editor.ql-blank::before { + color: rgba(0,0,0,0.6); + content: attr(data-placeholder); + font-style: italic; + left: 15px; + pointer-events: none; + position: absolute; + right: 15px; +} +.ql-snow.ql-toolbar:after, +.ql-snow .ql-toolbar:after { + clear: both; + content: ''; + display: table; +} +.ql-snow.ql-toolbar button, +.ql-snow .ql-toolbar button { + background: none; + border: none; + cursor: pointer; + display: inline-block; + float: left; + height: 24px; + padding: 3px 5px; + width: 28px; +} +.ql-snow.ql-toolbar button svg, +.ql-snow .ql-toolbar button svg { + float: left; + height: 100%; +} +.ql-snow.ql-toolbar button:active:hover, +.ql-snow .ql-toolbar button:active:hover { + outline: none; +} +.ql-snow.ql-toolbar input.ql-image[type=file], +.ql-snow .ql-toolbar input.ql-image[type=file] { + display: none; +} +.ql-snow.ql-toolbar button:hover, +.ql-snow .ql-toolbar button:hover, +.ql-snow.ql-toolbar button:focus, +.ql-snow .ql-toolbar button:focus, +.ql-snow.ql-toolbar button.ql-active, +.ql-snow .ql-toolbar button.ql-active, +.ql-snow.ql-toolbar .ql-picker-label:hover, +.ql-snow .ql-toolbar .ql-picker-label:hover, +.ql-snow.ql-toolbar .ql-picker-label.ql-active, +.ql-snow .ql-toolbar .ql-picker-label.ql-active, +.ql-snow.ql-toolbar .ql-picker-item:hover, +.ql-snow .ql-toolbar .ql-picker-item:hover, +.ql-snow.ql-toolbar .ql-picker-item.ql-selected, +.ql-snow .ql-toolbar .ql-picker-item.ql-selected { + color: #06c; +} +.ql-snow.ql-toolbar button:hover .ql-fill, +.ql-snow .ql-toolbar button:hover .ql-fill, +.ql-snow.ql-toolbar button:focus .ql-fill, +.ql-snow .ql-toolbar button:focus .ql-fill, +.ql-snow.ql-toolbar button.ql-active .ql-fill, +.ql-snow .ql-toolbar button.ql-active .ql-fill, +.ql-snow.ql-toolbar .ql-picker-label:hover .ql-fill, +.ql-snow .ql-toolbar .ql-picker-label:hover .ql-fill, +.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-fill, +.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-fill, +.ql-snow.ql-toolbar .ql-picker-item:hover .ql-fill, +.ql-snow .ql-toolbar .ql-picker-item:hover .ql-fill, +.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-fill, +.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-fill, +.ql-snow.ql-toolbar button:hover .ql-stroke.ql-fill, +.ql-snow .ql-toolbar button:hover .ql-stroke.ql-fill, +.ql-snow.ql-toolbar button:focus .ql-stroke.ql-fill, +.ql-snow .ql-toolbar button:focus .ql-stroke.ql-fill, +.ql-snow.ql-toolbar button.ql-active .ql-stroke.ql-fill, +.ql-snow .ql-toolbar button.ql-active .ql-stroke.ql-fill, +.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill, +.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill, +.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill, +.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill, +.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill, +.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill, +.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill, +.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill { + fill: #06c; +} +.ql-snow.ql-toolbar button:hover .ql-stroke, +.ql-snow .ql-toolbar button:hover .ql-stroke, +.ql-snow.ql-toolbar button:focus .ql-stroke, +.ql-snow .ql-toolbar button:focus .ql-stroke, +.ql-snow.ql-toolbar button.ql-active .ql-stroke, +.ql-snow .ql-toolbar button.ql-active .ql-stroke, +.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke, +.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke, +.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke, +.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke, +.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke, +.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke, +.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke, +.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke, +.ql-snow.ql-toolbar button:hover .ql-stroke-miter, +.ql-snow .ql-toolbar button:hover .ql-stroke-miter, +.ql-snow.ql-toolbar button:focus .ql-stroke-miter, +.ql-snow .ql-toolbar button:focus .ql-stroke-miter, +.ql-snow.ql-toolbar button.ql-active .ql-stroke-miter, +.ql-snow .ql-toolbar button.ql-active .ql-stroke-miter, +.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke-miter, +.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke-miter, +.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter, +.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter, +.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke-miter, +.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke-miter, +.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter, +.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter { + stroke: #06c; +} +@media (pointer: coarse) { + .ql-snow.ql-toolbar button:hover:not(.ql-active), + .ql-snow .ql-toolbar button:hover:not(.ql-active) { + color: #444; + } + .ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-fill, + .ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-fill, + .ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill, + .ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill { + fill: #444; + } + .ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke, + .ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke, + .ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter, + .ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter { + stroke: #444; + } +} +.ql-snow { + box-sizing: border-box; +} +.ql-snow * { + box-sizing: border-box; +} +.ql-snow .ql-hidden { + display: none; +} +.ql-snow .ql-out-bottom, +.ql-snow .ql-out-top { + visibility: hidden; +} +.ql-snow .ql-tooltip { + position: absolute; + transform: translateY(10px); +} +.ql-snow .ql-tooltip a { + cursor: pointer; + text-decoration: none; +} +.ql-snow .ql-tooltip.ql-flip { + transform: translateY(-10px); +} +.ql-snow .ql-formats { + display: inline-block; + vertical-align: middle; +} +.ql-snow .ql-formats:after { + clear: both; + content: ''; + display: table; +} +.ql-snow .ql-stroke { + fill: none; + stroke: #444; + stroke-linecap: round; + stroke-linejoin: round; + stroke-width: 2; +} +.ql-snow .ql-stroke-miter { + fill: none; + stroke: #444; + stroke-miterlimit: 10; + stroke-width: 2; +} +.ql-snow .ql-fill, +.ql-snow .ql-stroke.ql-fill { + fill: #444; +} +.ql-snow .ql-empty { + fill: none; +} +.ql-snow .ql-even { + fill-rule: evenodd; +} +.ql-snow .ql-thin, +.ql-snow .ql-stroke.ql-thin { + stroke-width: 1; +} +.ql-snow .ql-transparent { + opacity: 0.4; +} +.ql-snow .ql-direction svg:last-child { + display: none; +} +.ql-snow .ql-direction.ql-active svg:last-child { + display: inline; +} +.ql-snow .ql-direction.ql-active svg:first-child { + display: none; +} +.ql-snow .ql-editor h1 { + font-size: 2em; +} +.ql-snow .ql-editor h2 { + font-size: 1.5em; +} +.ql-snow .ql-editor h3 { + font-size: 1.17em; +} +.ql-snow .ql-editor h4 { + font-size: 1em; +} +.ql-snow .ql-editor h5 { + font-size: 0.83em; +} +.ql-snow .ql-editor h6 { + font-size: 0.67em; +} +.ql-snow .ql-editor a { + text-decoration: underline; +} +.ql-snow .ql-editor blockquote { + border-left: 4px solid #ccc; + margin-bottom: 5px; + margin-top: 5px; + padding-left: 16px; +} +.ql-snow .ql-editor code, +.ql-snow .ql-editor pre { + background-color: #f0f0f0; + border-radius: 3px; +} +.ql-snow .ql-editor pre { + white-space: pre-wrap; + margin-bottom: 5px; + margin-top: 5px; + padding: 5px 10px; +} +.ql-snow .ql-editor code { + font-size: 85%; + padding: 2px 4px; +} +.ql-snow .ql-editor pre.ql-syntax { + background-color: #23241f; + color: #f8f8f2; + overflow: visible; +} +.ql-snow .ql-editor img { + max-width: 100%; +} +.ql-snow .ql-picker { + color: #444; + display: inline-block; + float: left; + font-size: 14px; + font-weight: 500; + height: 24px; + position: relative; + vertical-align: middle; +} +.ql-snow .ql-picker-label { + cursor: pointer; + display: inline-block; + height: 100%; + padding-left: 8px; + padding-right: 2px; + position: relative; + width: 100%; +} +.ql-snow .ql-picker-label::before { + display: inline-block; + line-height: 22px; +} +.ql-snow .ql-picker-options { + background-color: #fff; + display: none; + min-width: 100%; + padding: 4px 8px; + position: absolute; + white-space: nowrap; +} +.ql-snow .ql-picker-options .ql-picker-item { + cursor: pointer; + display: block; + padding-bottom: 5px; + padding-top: 5px; +} +.ql-snow .ql-picker.ql-expanded .ql-picker-label { + color: #ccc; + z-index: 2; +} +.ql-snow .ql-picker.ql-expanded .ql-picker-label .ql-fill { + fill: #ccc; +} +.ql-snow .ql-picker.ql-expanded .ql-picker-label .ql-stroke { + stroke: #ccc; +} +.ql-snow .ql-picker.ql-expanded .ql-picker-options { + display: block; + margin-top: -1px; + top: 100%; + z-index: 1; +} +.ql-snow .ql-color-picker, +.ql-snow .ql-icon-picker { + width: 28px; +} +.ql-snow .ql-color-picker .ql-picker-label, +.ql-snow .ql-icon-picker .ql-picker-label { + padding: 2px 4px; +} +.ql-snow .ql-color-picker .ql-picker-label svg, +.ql-snow .ql-icon-picker .ql-picker-label svg { + right: 4px; +} +.ql-snow .ql-icon-picker .ql-picker-options { + padding: 4px 0px; +} +.ql-snow .ql-icon-picker .ql-picker-item { + height: 24px; + width: 24px; + padding: 2px 4px; +} +.ql-snow .ql-color-picker .ql-picker-options { + padding: 3px 5px; + width: 152px; +} +.ql-snow .ql-color-picker .ql-picker-item { + border: 1px solid transparent; + float: left; + height: 16px; + margin: 2px; + padding: 0px; + width: 16px; +} +.ql-snow .ql-picker:not(.ql-color-picker):not(.ql-icon-picker) svg { + position: absolute; + margin-top: -9px; + right: 0; + top: 50%; + width: 18px; +} +.ql-snow .ql-picker.ql-header .ql-picker-label[data-label]:not([data-label=''])::before, +.ql-snow .ql-picker.ql-font .ql-picker-label[data-label]:not([data-label=''])::before, +.ql-snow .ql-picker.ql-size .ql-picker-label[data-label]:not([data-label=''])::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-label]:not([data-label=''])::before, +.ql-snow .ql-picker.ql-font .ql-picker-item[data-label]:not([data-label=''])::before, +.ql-snow .ql-picker.ql-size .ql-picker-item[data-label]:not([data-label=''])::before { + content: attr(data-label); +} +.ql-snow .ql-picker.ql-header { + width: 98px; +} +.ql-snow .ql-picker.ql-header .ql-picker-label::before, +.ql-snow .ql-picker.ql-header .ql-picker-item::before { + content: 'Normal'; +} +.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="1"]::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="1"]::before { + content: 'Heading 1'; +} +.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="2"]::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="2"]::before { + content: 'Heading 2'; +} +.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="3"]::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="3"]::before { + content: 'Heading 3'; +} +.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="4"]::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="4"]::before { + content: 'Heading 4'; +} +.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="5"]::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="5"]::before { + content: 'Heading 5'; +} +.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="6"]::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="6"]::before { + content: 'Heading 6'; +} +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="1"]::before { + font-size: 2em; +} +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="2"]::before { + font-size: 1.5em; +} +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="3"]::before { + font-size: 1.17em; +} +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="4"]::before { + font-size: 1em; +} +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="5"]::before { + font-size: 0.83em; +} +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="6"]::before { + font-size: 0.67em; +} +.ql-snow .ql-picker.ql-font { + width: 108px; +} +.ql-snow .ql-picker.ql-font .ql-picker-label::before, +.ql-snow .ql-picker.ql-font .ql-picker-item::before { + content: 'Sans Serif'; +} +.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=serif]::before, +.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=serif]::before { + content: 'Serif'; +} +.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=monospace]::before, +.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=monospace]::before { + content: 'Monospace'; +} +.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=serif]::before { + font-family: Georgia, Times New Roman, serif; +} +.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=monospace]::before { + font-family: Monaco, Courier New, monospace; +} +.ql-snow .ql-picker.ql-size { + width: 98px; +} +.ql-snow .ql-picker.ql-size .ql-picker-label::before, +.ql-snow .ql-picker.ql-size .ql-picker-item::before { + content: 'Normal'; +} +.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=small]::before, +.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=small]::before { + content: 'Small'; +} +.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=large]::before, +.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=large]::before { + content: 'Large'; +} +.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=huge]::before, +.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=huge]::before { + content: 'Huge'; +} +.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=small]::before { + font-size: 10px; +} +.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=large]::before { + font-size: 18px; +} +.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=huge]::before { + font-size: 32px; +} +.ql-snow .ql-color-picker.ql-background .ql-picker-item { + background-color: #fff; +} +.ql-snow .ql-color-picker.ql-color .ql-picker-item { + background-color: #000; +} +.ql-toolbar.ql-snow { + border: 1px solid #ccc; + box-sizing: border-box; + font-family: 'Helvetica Neue', 'Helvetica', 'Arial', sans-serif; + padding: 8px; +} +.ql-toolbar.ql-snow .ql-formats { + margin-right: 15px; +} +.ql-toolbar.ql-snow .ql-picker-label { + border: 1px solid transparent; +} +.ql-toolbar.ql-snow .ql-picker-options { + border: 1px solid transparent; + box-shadow: rgba(0,0,0,0.2) 0 2px 8px; +} +.ql-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-label { + border-color: #ccc; +} +.ql-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-options { + border-color: #ccc; +} +.ql-toolbar.ql-snow .ql-color-picker .ql-picker-item.ql-selected, +.ql-toolbar.ql-snow .ql-color-picker .ql-picker-item:hover { + border-color: #000; +} +.ql-toolbar.ql-snow + .ql-container.ql-snow { + border-top: 0px; +} +.ql-snow .ql-tooltip { + background-color: #fff; + border: 1px solid #ccc; + box-shadow: 0px 0px 5px #ddd; + color: #444; + padding: 5px 12px; + white-space: nowrap; +} +.ql-snow .ql-tooltip::before { + content: "Visit URL:"; + line-height: 26px; + margin-right: 8px; +} +.ql-snow .ql-tooltip input[type=text] { + display: none; + border: 1px solid #ccc; + font-size: 13px; + height: 26px; + margin: 0px; + padding: 3px 5px; + width: 170px; +} +.ql-snow .ql-tooltip a.ql-preview { + display: inline-block; + max-width: 200px; + overflow-x: hidden; + text-overflow: ellipsis; + vertical-align: top; +} +.ql-snow .ql-tooltip a.ql-action::after { + border-right: 1px solid #ccc; + content: 'Edit'; + margin-left: 16px; + padding-right: 8px; +} +.ql-snow .ql-tooltip a.ql-remove::before { + content: 'Remove'; + margin-left: 8px; +} +.ql-snow .ql-tooltip a { + line-height: 26px; +} +.ql-snow .ql-tooltip.ql-editing a.ql-preview, +.ql-snow .ql-tooltip.ql-editing a.ql-remove { + display: none; +} +.ql-snow .ql-tooltip.ql-editing input[type=text] { + display: inline-block; +} +.ql-snow .ql-tooltip.ql-editing a.ql-action::after { + border-right: 0px; + content: 'Save'; + padding-right: 0px; +} +.ql-snow .ql-tooltip[data-mode=link]::before { + content: "Enter link:"; +} +.ql-snow .ql-tooltip[data-mode=formula]::before { + content: "Enter formula:"; +} +.ql-snow .ql-tooltip[data-mode=video]::before { + content: "Enter video:"; +} +.ql-snow a { + color: #06c; +} +.ql-container.ql-snow { + border: 1px solid #ccc; +} diff --git a/iosApp/iosApp.xcodeproj/project.pbxproj b/iosApp/iosApp.xcodeproj/project.pbxproj index 3fe9bb2d..1f0877eb 100644 --- a/iosApp/iosApp.xcodeproj/project.pbxproj +++ b/iosApp/iosApp.xcodeproj/project.pbxproj @@ -7,23 +7,35 @@ objects = { /* Begin PBXBuildFile section */ - A9B0559C853C142D3A6C6B71 /* Pods_iosApp.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C0034160D93F9F955A298DD7 /* Pods_iosApp.framework */; }; + 3FA2BE7BDEC2E97E18051110 /* Pods_iosApp.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF7EEC8DED3EE682436CF041 /* Pods_iosApp.framework */; }; + BF20D3822F4B3806009E8A2B /* purify.min.js in Resources */ = {isa = PBXBuildFile; fileRef = BF20D37E2F4B26BB009E8A2B /* purify.min.js */; }; + BF20D3832F4B3806009E8A2B /* quill.html in Resources */ = {isa = PBXBuildFile; fileRef = BF20D37F2F4B26BB009E8A2B /* quill.html */; }; + BF20D3842F4B3806009E8A2B /* quill.min.js in Resources */ = {isa = PBXBuildFile; fileRef = BF20D3802F4B26BB009E8A2B /* quill.min.js */; }; + BF20D3852F4B3806009E8A2B /* quill.snow.css in Resources */ = {isa = PBXBuildFile; fileRef = BF20D3812F4B26BB009E8A2B /* quill.snow.css */; }; + BFBA73432F34D8C500C94D68 /* NaverLoginBridge.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFBA73392F34D8C500C94D68 /* NaverLoginBridge.swift */; }; BFBA73452F34D8C500C94D68 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFBA733F2F34D8C500C94D68 /* ContentView.swift */; }; BFBA73462F34D8C500C94D68 /* iOSApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFBA73412F34D8C500C94D68 /* iOSApp.swift */; }; BFBA73472F34D8C500C94D68 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = BFBA733C2F34D8C500C94D68 /* Preview Assets.xcassets */; }; BFBA73482F34D8C500C94D68 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = BFBA733E2F34D8C500C94D68 /* Assets.xcassets */; }; + BFBA734A2F34D8C500C94D68 /* NaverLoginBridgeError.swift in Resources */ = {isa = PBXBuildFile; fileRef = BFBA733A2F34D8C500C94D68 /* NaverLoginBridgeError.swift */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ - 2FA65A5A9C5AD2181DB1E845 /* Pods-iosApp.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-iosApp.release.xcconfig"; path = "Target Support Files/Pods-iosApp/Pods-iosApp.release.xcconfig"; sourceTree = ""; }; - 49798E78D608B8DBF563C324 /* Pods-iosApp.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-iosApp.debug.xcconfig"; path = "Target Support Files/Pods-iosApp/Pods-iosApp.debug.xcconfig"; sourceTree = ""; }; + 527122E9A83C1DBF04F6DA92 /* Pods-iosApp.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-iosApp.release.xcconfig"; path = "Target Support Files/Pods-iosApp/Pods-iosApp.release.xcconfig"; sourceTree = ""; }; + 574F7EE4318346BBBDFB6B2F /* Pods-iosApp.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-iosApp.debug.xcconfig"; path = "Target Support Files/Pods-iosApp/Pods-iosApp.debug.xcconfig"; sourceTree = ""; }; + AF7EEC8DED3EE682436CF041 /* Pods_iosApp.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_iosApp.framework; sourceTree = BUILT_PRODUCTS_DIR; }; BEDAF15A8875D515274269F3 /* Kustaurant.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Kustaurant.app; sourceTree = BUILT_PRODUCTS_DIR; }; + BF20D37E2F4B26BB009E8A2B /* purify.min.js */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.javascript; path = purify.min.js; sourceTree = ""; }; + BF20D37F2F4B26BB009E8A2B /* quill.html */ = {isa = PBXFileReference; lastKnownFileType = text.html; path = quill.html; sourceTree = ""; }; + BF20D3802F4B26BB009E8A2B /* quill.min.js */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.javascript; path = quill.min.js; sourceTree = ""; }; + BF20D3812F4B26BB009E8A2B /* quill.snow.css */ = {isa = PBXFileReference; lastKnownFileType = text.css; path = quill.snow.css; sourceTree = ""; }; + BFBA73392F34D8C500C94D68 /* NaverLoginBridge.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NaverLoginBridge.swift; sourceTree = ""; }; + BFBA733A2F34D8C500C94D68 /* NaverLoginBridgeError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NaverLoginBridgeError.swift; sourceTree = ""; }; BFBA733C2F34D8C500C94D68 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; BFBA733E2F34D8C500C94D68 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; BFBA733F2F34D8C500C94D68 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; BFBA73402F34D8C500C94D68 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; BFBA73412F34D8C500C94D68 /* iOSApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = iOSApp.swift; sourceTree = ""; }; - C0034160D93F9F955A298DD7 /* Pods_iosApp.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_iosApp.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFileSystemSynchronizedRootGroup section */ @@ -39,28 +51,48 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - A9B0559C853C142D3A6C6B71 /* Pods_iosApp.framework in Frameworks */, + 3FA2BE7BDEC2E97E18051110 /* Pods_iosApp.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 05C7D4CAA8B1CF2FA799D601 /* Frameworks */ = { + isa = PBXGroup; + children = ( + AF7EEC8DED3EE682436CF041 /* Pods_iosApp.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; 36865C889E772A55E9A3D36B /* Pods */ = { isa = PBXGroup; children = ( - 49798E78D608B8DBF563C324 /* Pods-iosApp.debug.xcconfig */, - 2FA65A5A9C5AD2181DB1E845 /* Pods-iosApp.release.xcconfig */, + 574F7EE4318346BBBDFB6B2F /* Pods-iosApp.debug.xcconfig */, + 527122E9A83C1DBF04F6DA92 /* Pods-iosApp.release.xcconfig */, ); path = Pods; sourceTree = ""; }; - 4DB1E34AC0D4DBB265A9E34E /* Frameworks */ = { + BF20D37D2F4B26AA009E8A2B /* editor */ = { isa = PBXGroup; children = ( - C0034160D93F9F955A298DD7 /* Pods_iosApp.framework */, + BF20D37E2F4B26BB009E8A2B /* purify.min.js */, + BF20D37F2F4B26BB009E8A2B /* quill.html */, + BF20D3802F4B26BB009E8A2B /* quill.min.js */, + BF20D3812F4B26BB009E8A2B /* quill.snow.css */, ); - name = Frameworks; + path = editor; + sourceTree = ""; + }; + BFBA733B2F34D8C500C94D68 /* login */ = { + isa = PBXGroup; + children = ( + BFBA73392F34D8C500C94D68 /* NaverLoginBridge.swift */, + BFBA733A2F34D8C500C94D68 /* NaverLoginBridgeError.swift */, + ); + path = login; sourceTree = ""; }; BFBA733D2F34D8C500C94D68 /* Preview Content */ = { @@ -74,6 +106,7 @@ BFBA73422F34D8C500C94D68 /* iosApp */ = { isa = PBXGroup; children = ( + BFBA733B2F34D8C500C94D68 /* login */, BFBA733D2F34D8C500C94D68 /* Preview Content */, BFBA733E2F34D8C500C94D68 /* Assets.xcassets */, BFBA733F2F34D8C500C94D68 /* ContentView.swift */, @@ -86,11 +119,12 @@ D260EA6B21FA9F05B2DE7742 = { isa = PBXGroup; children = ( + BF20D37D2F4B26AA009E8A2B /* editor */, AAC7BD4E7A7D29C041541713 /* Configuration */, F22060E8D33BC6684076B2B7 /* Products */, 36865C889E772A55E9A3D36B /* Pods */, BFBA73422F34D8C500C94D68 /* iosApp */, - 4DB1E34AC0D4DBB265A9E34E /* Frameworks */, + 05C7D4CAA8B1CF2FA799D601 /* Frameworks */, ); sourceTree = ""; }; @@ -109,12 +143,13 @@ isa = PBXNativeTarget; buildConfigurationList = 67987FEB6AF96E61FAEBDC7C /* Build configuration list for PBXNativeTarget "iosApp" */; buildPhases = ( - B1AC470A60CF5D1DBA770D80 /* [CP] Check Pods Manifest.lock */, + D239A9CC79226A8B1C69781F /* [CP] Check Pods Manifest.lock */, 6501E404554D0E1B8F93565C /* Compile Kotlin Framework */, E7CF5854243AD0599C609050 /* Sources */, EA20CAE0BC9F822664055313 /* Frameworks */, 8706D40C56EACBB05AC2EF21 /* Resources */, - E0324CF71BF00F819E9F3BB9 /* [CP] Embed Pods Frameworks */, + CDFD185654583732267C0B70 /* [CP] Embed Pods Frameworks */, + 26981FD3302D5CCB547031CE /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -164,7 +199,12 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + BF20D3822F4B3806009E8A2B /* purify.min.js in Resources */, + BF20D3832F4B3806009E8A2B /* quill.html in Resources */, + BF20D3842F4B3806009E8A2B /* quill.min.js in Resources */, + BF20D3852F4B3806009E8A2B /* quill.snow.css in Resources */, BFBA73472F34D8C500C94D68 /* Preview Assets.xcassets in Resources */, + BFBA734A2F34D8C500C94D68 /* NaverLoginBridgeError.swift in Resources */, BFBA73482F34D8C500C94D68 /* Assets.xcassets in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -172,6 +212,27 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ + 26981FD3302D5CCB547031CE /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-iosApp/Pods-iosApp-resources-${CONFIGURATION}-input-files.xcfilelist", + ); + inputPaths = ( + ); + name = "[CP] Copy Pods Resources"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-iosApp/Pods-iosApp-resources-${CONFIGURATION}-output-files.xcfilelist", + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-iosApp/Pods-iosApp-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; 6501E404554D0E1B8F93565C /* Compile Kotlin Framework */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; @@ -191,47 +252,47 @@ shellPath = /bin/sh; shellScript = "if [ \"YES\" = \"$OVERRIDE_KOTLIN_BUILD_IDE_SUPPORTED\" ]; then\n echo \"Skipping Gradle build task invocation due to OVERRIDE_KOTLIN_BUILD_IDE_SUPPORTED environment variable set to \\\"YES\\\"\"\n exit 0\nfi\ncd \"$SRCROOT/..\"\n./gradlew :composeApp:embedAndSignAppleFrameworkForXcode\n"; }; - B1AC470A60CF5D1DBA770D80 /* [CP] Check Pods Manifest.lock */ = { + CDFD185654583732267C0B70 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-iosApp/Pods-iosApp-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", ); - name = "[CP] Check Pods Manifest.lock"; + name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-iosApp/Pods-iosApp-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-iosApp-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-iosApp/Pods-iosApp-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - E0324CF71BF00F819E9F3BB9 /* [CP] Embed Pods Frameworks */ = { + D239A9CC79226A8B1C69781F /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-iosApp/Pods-iosApp-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", ); - name = "[CP] Embed Pods Frameworks"; + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-iosApp/Pods-iosApp-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-iosApp-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-iosApp/Pods-iosApp-frameworks.sh\"\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -241,6 +302,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + BFBA73432F34D8C500C94D68 /* NaverLoginBridge.swift in Sources */, BFBA73452F34D8C500C94D68 /* ContentView.swift in Sources */, BFBA73462F34D8C500C94D68 /* iOSApp.swift in Sources */, ); @@ -374,7 +436,7 @@ }; 7ED49136567999D3B97F8EE8 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 2FA65A5A9C5AD2181DB1E845 /* Pods-iosApp.release.xcconfig */; + baseConfigurationReference = 527122E9A83C1DBF04F6DA92 /* Pods-iosApp.release.xcconfig */; buildSettings = { ARCHS = arm64; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; @@ -404,7 +466,7 @@ }; C4D1690A066E062430391C63 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 49798E78D608B8DBF563C324 /* Pods-iosApp.debug.xcconfig */; + baseConfigurationReference = 574F7EE4318346BBBDFB6B2F /* Pods-iosApp.debug.xcconfig */; buildSettings = { ARCHS = arm64; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; @@ -426,7 +488,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = com.kus.kustaurant; + PRODUCT_BUNDLE_IDENTIFIER = com.kust.kustaurant; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; diff --git a/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/Contents.json b/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/Contents.json index 4e8d485b..262f6e40 100644 --- a/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1,7 +1,7 @@ { "images" : [ { - "filename" : "app-icon-1024.png", + "filename" : "ic_app_icon.png", "idiom" : "universal", "platform" : "ios", "size" : "1024x1024" @@ -13,6 +13,7 @@ "value" : "dark" } ], + "filename" : "ic_app_icon _dark.png", "idiom" : "universal", "platform" : "ios", "size" : "1024x1024" diff --git a/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/ic_app_icon _dark.png b/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/ic_app_icon _dark.png new file mode 100644 index 0000000000000000000000000000000000000000..78a233d6ca22232085ba88a3f0d610b78d3901e6 GIT binary patch literal 30076 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 Wk(YYb)xZTCc?XS6jSBZVM*bfS+NhBL literal 0 HcmV?d00001 diff --git a/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/ic_app_icon.png b/iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/ic_app_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..78a233d6ca22232085ba88a3f0d610b78d3901e6 GIT binary patch literal 30076 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 Wk(YYb)xZTCc?XS6jSBZVM*bfS+NhBL literal 0 HcmV?d00001 diff --git a/iosApp/iosApp/Assets.xcassets/AccentColor 1.colorset/Contents.json b/iosApp/iosApp/Assets.xcassets/ic_marker_none.imageset/Contents.json similarity index 65% rename from iosApp/iosApp/Assets.xcassets/AccentColor 1.colorset/Contents.json rename to iosApp/iosApp/Assets.xcassets/ic_marker_none.imageset/Contents.json index eb878970..451feed1 100644 --- a/iosApp/iosApp/Assets.xcassets/AccentColor 1.colorset/Contents.json +++ b/iosApp/iosApp/Assets.xcassets/ic_marker_none.imageset/Contents.json @@ -1,6 +1,7 @@ { - "colors" : [ + "images" : [ { + "filename" : "ic_marker_none.pdf", "idiom" : "universal" } ], diff --git a/iosApp/iosApp/Assets.xcassets/ic_marker_none.imageset/ic_marker_none.pdf b/iosApp/iosApp/Assets.xcassets/ic_marker_none.imageset/ic_marker_none.pdf new file mode 100644 index 0000000000000000000000000000000000000000..984d3280084fd587df84e1d5ddd3d8a0aa3a3d03 GIT binary patch literal 105257 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 literal 0 HcmV?d00001 diff --git a/iosApp/iosApp/Assets.xcassets/AccentColor.colorset/Contents.json b/iosApp/iosApp/Assets.xcassets/ic_marker_partnership.imageset/Contents.json similarity index 63% rename from iosApp/iosApp/Assets.xcassets/AccentColor.colorset/Contents.json rename to iosApp/iosApp/Assets.xcassets/ic_marker_partnership.imageset/Contents.json index eb878970..1fabe0e0 100644 --- a/iosApp/iosApp/Assets.xcassets/AccentColor.colorset/Contents.json +++ b/iosApp/iosApp/Assets.xcassets/ic_marker_partnership.imageset/Contents.json @@ -1,6 +1,7 @@ { - "colors" : [ + "images" : [ { + "filename" : "ic_marker_partnership.pdf", "idiom" : "universal" } ], diff --git a/iosApp/iosApp/Assets.xcassets/ic_marker_partnership.imageset/ic_marker_partnership.pdf b/iosApp/iosApp/Assets.xcassets/ic_marker_partnership.imageset/ic_marker_partnership.pdf new file mode 100644 index 0000000000000000000000000000000000000000..6d3c1fb2be25b9661abd9380d46d531b290dec18 GIT binary patch literal 6013 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 bLr^RjAVLx;sA)xbsNg-0TeQe}oz4FN>&RD) literal 0 HcmV?d00001 diff --git a/iosApp/iosApp/Info.plist b/iosApp/iosApp/Info.plist index 43b1ebb9..8093df1b 100644 --- a/iosApp/iosApp/Info.plist +++ b/iosApp/iosApp/Info.plist @@ -4,13 +4,17 @@ CADisableMinimumFrameDurationOnPhone - NMFClientId - $(NAVER_MAP_CLIENT_ID) NAVER_LOGIN_CLIENT_ID $(NAVER_LOGIN_CLIENT_ID) NAVER_LOGIN_CLIENT_SECRET $(NAVER_LOGIN_CLIENT_SECRET) NAVER_LOGIN_URL_SCHEMA $(NAVER_LOGIN_URL_SCHEMA) + NMFClientId + $(NAVER_MAP_CLIENT_ID) + PRODUCT_NAME + $(PRODUCT_NAME) + CFBundleDisplayName + ${CFBundleDisplayName} diff --git a/iosApp/iosApp/login/NaverLoginBridge.swift b/iosApp/iosApp/login/NaverLoginBridge.swift new file mode 100644 index 00000000..a71033b6 --- /dev/null +++ b/iosApp/iosApp/login/NaverLoginBridge.swift @@ -0,0 +1,12 @@ +// +// NaverLoginBridge.swift +// iosApp +// +// Created by Beom on 2/5/26. +// +import Foundation +import UIKit + +final class NaverLoginBridge111 { + +} diff --git a/iosApp/iosApp/login/NaverLoginBridgeError.swift b/iosApp/iosApp/login/NaverLoginBridgeError.swift new file mode 100644 index 00000000..8d1c8b69 --- /dev/null +++ b/iosApp/iosApp/login/NaverLoginBridgeError.swift @@ -0,0 +1 @@ + diff --git a/settings.gradle.kts b/settings.gradle.kts index 0fca3573..40162200 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -54,6 +54,7 @@ include( ":shared:data:tier", ":shared:data:auth", ":shared:data:home", + ":shared:data:community", ":shared:data:detail", ":shared:data:evaluate" ) @@ -64,6 +65,7 @@ include( ":shared:domain:tier", ":shared:domain:auth", ":shared:domain:home", + ":shared:domain:community", ":shared:domain:detail", ":shared:domain:evaluate" ) diff --git a/shared/appKit/build.gradle.kts b/shared/appKit/build.gradle.kts index b24b886b..05cdd62d 100644 --- a/shared/appKit/build.gradle.kts +++ b/shared/appKit/build.gradle.kts @@ -39,10 +39,12 @@ kotlin { implementation(compose.runtime) implementation(compose.foundation) implementation(compose.material3) - implementation(compose.ui) + implementation(compose.ui) api(project(":shared:feature:login")) api(project(":shared:feature:tier")) + api(project(":shared:feature:community")) + api(project(":shared:data:community")) } } } diff --git a/shared/appKit/src/iosMain/kotlin/com/kus/appkit/community/util/ByteArrayUtil.kt b/shared/appKit/src/iosMain/kotlin/com/kus/appkit/community/util/ByteArrayUtil.kt new file mode 100644 index 00000000..9f38bb6f --- /dev/null +++ b/shared/appKit/src/iosMain/kotlin/com/kus/appkit/community/util/ByteArrayUtil.kt @@ -0,0 +1,27 @@ +package com.kus.appkit.community.util + +import kotlinx.cinterop.ExperimentalForeignApi +import kotlinx.cinterop.addressOf +import kotlinx.cinterop.convert +import kotlinx.cinterop.memScoped +import kotlinx.cinterop.usePinned +import platform.Foundation.NSData +import platform.posix.memcpy + +@OptIn(ExperimentalForeignApi::class) +fun NSData.toByteArray(): ByteArray { + val size = length.toInt() + val byteArray = ByteArray(size) + + memScoped { + byteArray.usePinned { pinned -> + memcpy( + pinned.addressOf(0), + this@toByteArray.bytes, + size.convert() + ) + } + } + + return byteArray +} diff --git a/shared/appKit/src/iosMain/kotlin/com/kus/appkit/community/write/IosCommunityEditor.kt b/shared/appKit/src/iosMain/kotlin/com/kus/appkit/community/write/IosCommunityEditor.kt new file mode 100644 index 00000000..26d285c5 --- /dev/null +++ b/shared/appKit/src/iosMain/kotlin/com/kus/appkit/community/write/IosCommunityEditor.kt @@ -0,0 +1,112 @@ +package com.kus.appkit.community.write + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberUpdatedState +import androidx.compose.ui.Modifier +import androidx.compose.ui.interop.UIKitView +import com.kus.feature.community.ui.write.CommunityEditorController +import kotlinx.cinterop.ExperimentalForeignApi +import kotlinx.cinterop.readValue +import platform.CoreGraphics.CGRectZero +import platform.Foundation.NSBundle +import platform.Foundation.NSLog +import platform.Foundation.NSOperationQueue +import platform.UIKit.UIColor +import platform.WebKit.WKScriptMessage +import platform.WebKit.WKScriptMessageHandlerProtocol +import platform.WebKit.WKUserContentController +import platform.WebKit.WKWebView +import platform.WebKit.WKWebViewConfiguration +import platform.WebKit.javaScriptEnabled +import platform.darwin.NSObject + +@OptIn(ExperimentalForeignApi::class) +@Composable +fun IosCommunityEditor( + controller: CommunityEditorController, + modifier: Modifier, + onHtmlChange: (String) -> Unit, + onEditorReady: () -> Unit +) { + val editorDelegate = remember { mutableStateOf(null) } + val onEditorReadyState = rememberUpdatedState(onEditorReady) + + val webView = remember { + val config = WKWebViewConfiguration() + val userController = WKUserContentController() + + userController.addScriptMessageHandler( + scriptMessageHandler = HtmlChangedMessageHandler { html -> onHtmlChange(html) }, + name = "htmlChanged" + ) + + userController.addScriptMessageHandler( + scriptMessageHandler = object : NSObject(), WKScriptMessageHandlerProtocol { + override fun userContentController( + userContentController: WKUserContentController, + didReceiveScriptMessage: WKScriptMessage + ) { + NSOperationQueue.mainQueue.addOperationWithBlock { + val delegate = editorDelegate.value + if (delegate != null) { + if (!delegate.isReady) { + delegate.onEditorReady() + } else { + delegate.onContentReady() + } + } else { + onEditorReadyState.value.invoke() + } + } + } + }, + name = "editorReady" + ) + + config.userContentController = userController + config.preferences.javaScriptEnabled = true + + WKWebView(frame = CGRectZero.readValue(), configuration = config).also { wv -> + wv.opaque = false + wv.backgroundColor = UIColor.whiteColor + } + } + + LaunchedEffect(Unit) { + val bundle = NSBundle.mainBundle + val htmlUrl = bundle.URLForResource("quill", withExtension = "html") ?: run { + NSLog("❌ quill.html not found"); return@LaunchedEffect + } + val baseUrl = bundle.resourceURL ?: run { + NSLog("❌ bundle.resourceURL is null"); return@LaunchedEffect + } + + val delegate = IosEditorDelegate(webView, controller) + delegate.onContentReady = { onEditorReadyState.value.invoke() } + editorDelegate.value = delegate + controller.delegate = delegate + + webView.loadFileURL(URL = htmlUrl, allowingReadAccessToURL = baseUrl) + } + + UIKitView( + modifier = modifier, + factory = { webView } + ) +} + +private class HtmlChangedMessageHandler( + private val onHtml: (String) -> Unit +) : NSObject(), WKScriptMessageHandlerProtocol { + + override fun userContentController( + userContentController: WKUserContentController, + didReceiveScriptMessage: WKScriptMessage + ) { + val html = didReceiveScriptMessage.body.toString() + onHtml(html) + } +} diff --git a/shared/appKit/src/iosMain/kotlin/com/kus/appkit/community/write/IosCommunityEditorRenderer.kt b/shared/appKit/src/iosMain/kotlin/com/kus/appkit/community/write/IosCommunityEditorRenderer.kt new file mode 100644 index 00000000..635b8111 --- /dev/null +++ b/shared/appKit/src/iosMain/kotlin/com/kus/appkit/community/write/IosCommunityEditorRenderer.kt @@ -0,0 +1,23 @@ +package com.kus.appkit.community.write + +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import com.kus.feature.community.ui.write.CommunityEditorController +import com.kus.feature.community.ui.write.CommunityEditorRenderer + +class IosCommunityEditorRenderer : CommunityEditorRenderer { + @Composable + override fun Render( + controller: CommunityEditorController, + modifier: Modifier, + onHtmlChange: (String) -> Unit, + onEditorReady: () -> Unit + ) { + IosCommunityEditor( + controller = controller, + modifier = modifier, + onHtmlChange = onHtmlChange, + onEditorReady = onEditorReady + ) + } +} \ No newline at end of file diff --git a/shared/appKit/src/iosMain/kotlin/com/kus/appkit/community/write/IosEditorDelegate.kt b/shared/appKit/src/iosMain/kotlin/com/kus/appkit/community/write/IosEditorDelegate.kt new file mode 100644 index 00000000..ad476deb --- /dev/null +++ b/shared/appKit/src/iosMain/kotlin/com/kus/appkit/community/write/IosEditorDelegate.kt @@ -0,0 +1,48 @@ +package com.kus.appkit.community.write + +import com.kus.feature.community.ui.util.jsQuote +import com.kus.feature.community.ui.write.CommunityEditorController +import com.kus.feature.community.ui.write.EditorDelegate +import platform.WebKit.WKWebView + +class IosEditorDelegate( + private val webView: WKWebView, + private val controller: CommunityEditorController +) : EditorDelegate { + + var isReady = false + private var pendingHtml: String? = null + var onContentReady: (() -> Unit)? = null + + fun onEditorReady() { + isReady = true + val html = pendingHtml + if (html != null) { + eval("window.EditorApi.setHtml(${html.jsQuote()});") + pendingHtml = null + } else if (!controller.expectsContent) { + onContentReady?.invoke() + } + } + + fun onContentReady() { + onContentReady?.invoke() + } + + private fun eval(js: String) { + webView.evaluateJavaScript(js, completionHandler = null) + } + + override fun setHtml(html: String) { + if (isReady) { + eval("window.EditorApi.setHtml(${html.jsQuote()});") + } else { + pendingHtml = html + } + } + + override fun insertImage(url: String) = eval("window.EditorApi.insertImage(${url.jsQuote()});") + override fun undo() = eval("window.EditorApi.undo();") + override fun redo() = eval("window.EditorApi.redo();") + override fun toggleBold() = eval("window.EditorApi.toggleBold();") +} \ No newline at end of file diff --git a/shared/appKit/src/iosMain/kotlin/com/kus/appkit/community/write/image/IosImagePickerFactory.kt b/shared/appKit/src/iosMain/kotlin/com/kus/appkit/community/write/image/IosImagePickerFactory.kt new file mode 100644 index 00000000..03b87b82 --- /dev/null +++ b/shared/appKit/src/iosMain/kotlin/com/kus/appkit/community/write/image/IosImagePickerFactory.kt @@ -0,0 +1,99 @@ +package com.kus.appkit.community.write.image + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.interop.LocalUIViewController +import com.kus.feature.community.ui.write.image.PlatformImagePicker +import com.kus.feature.community.ui.write.image.PlatformImagePickerFactory +import platform.Foundation.NSData +import platform.Foundation.NSTemporaryDirectory +import platform.Foundation.NSUUID +import platform.Foundation.writeToFile +import platform.Photos.PHPhotoLibrary +import platform.PhotosUI.PHPickerConfiguration +import platform.PhotosUI.PHPickerFilter +import platform.PhotosUI.PHPickerResult +import platform.PhotosUI.PHPickerViewController +import platform.PhotosUI.PHPickerViewControllerDelegateProtocol +import platform.UIKit.UIImage +import platform.UIKit.UIImageJPEGRepresentation +import platform.darwin.NSObject +import platform.darwin.dispatch_async +import platform.darwin.dispatch_get_main_queue + + +class IosImagePickerFactory : PlatformImagePickerFactory { + @Composable + override fun rememberPicker(): PlatformImagePicker { + val presenter = LocalUIViewController.current + + var callback: ((String?) -> Unit)? by remember { mutableStateOf(null) } + val delegateRef = remember { mutableStateOf(null) } + + return remember(presenter) { + PlatformImagePicker { onPicked -> + callback = onPicked + + val config = PHPickerConfiguration(photoLibrary = PHPhotoLibrary.sharedPhotoLibrary()).apply { + setSelectionLimit(1) + setFilter(PHPickerFilter.imagesFilter()) + } + + val picker = PHPickerViewController(configuration = config) + val delegate = object : NSObject(), PHPickerViewControllerDelegateProtocol { + override fun picker( + picker: PHPickerViewController, + didFinishPicking: List<*> + ) { + picker.dismissViewControllerAnimated(true, completion = null) + + val result = didFinishPicking.firstOrNull() as? PHPickerResult + val provider = result?.itemProvider + if (provider == null) { + dispatch_async(dispatch_get_main_queue()) { callback?.invoke(null) } + return + } + + val typeId = "public.image" + if (!provider.hasItemConformingToTypeIdentifier(typeId)) { + dispatch_async(dispatch_get_main_queue()) { callback?.invoke(null) } + return + } + + provider.loadDataRepresentationForTypeIdentifier(typeId) { data, error -> + if (data == null || error != null) { + dispatch_async(dispatch_get_main_queue()) { callback?.invoke(null) } + return@loadDataRepresentationForTypeIdentifier + } + + val image = UIImage(data = data) + val jpeg = UIImageJPEGRepresentation(image, 0.9) + if (jpeg == null) { + dispatch_async(dispatch_get_main_queue()) { callback?.invoke(null) } + return@loadDataRepresentationForTypeIdentifier + } + + val path = saveToTempFile(jpeg, "jpg") + dispatch_async(dispatch_get_main_queue()) { callback?.invoke(path) } + } + } + } + delegateRef.value = delegate + picker.delegate = delegate + + presenter.presentViewController(picker, animated = true, completion = null) + } + } + } +} + +private fun saveToTempFile(data: NSData, ext: String): String? { + val tempDir = NSTemporaryDirectory() + val fileName = "picked_${NSUUID.UUID().UUIDString}.$ext" + val fullPath = tempDir + fileName + val ok = data.writeToFile(fullPath, atomically = true) + return if (ok) fullPath else null +} \ No newline at end of file diff --git a/shared/appKit/src/iosMain/kotlin/com/kus/appkit/community/write/image/IosPlatformImageResolver.kt b/shared/appKit/src/iosMain/kotlin/com/kus/appkit/community/write/image/IosPlatformImageResolver.kt new file mode 100644 index 00000000..6959ed97 --- /dev/null +++ b/shared/appKit/src/iosMain/kotlin/com/kus/appkit/community/write/image/IosPlatformImageResolver.kt @@ -0,0 +1,27 @@ +package com.kus.appkit.community.write.image + +import com.kus.appkit.community.util.toByteArray +import com.kus.data.community.PlatformImageResolver +import com.kus.data.community.model.ResolvedImage +import com.kus.domain.community.model.UploadImageException +import platform.Foundation.NSData +import platform.Foundation.dataWithContentsOfFile + +class IosPlatformImageResolver( + private val maxBytes: Long = 1_048_576L, +): PlatformImageResolver { + override suspend fun resolve(imagePath: String): ResolvedImage { + val data = NSData.dataWithContentsOfFile(imagePath) + ?: throw UploadImageException.ReadFailed() + + if (data.length.toLong() > maxBytes) { + throw UploadImageException.TooLarge(maxBytes) + } + + return ResolvedImage( + bytes = data.toByteArray(), + mimeType = "image/jpeg", + fileName = imagePath.substringAfterLast('/') + ) + } +} \ No newline at end of file diff --git a/shared/appKit/src/iosMain/kotlin/com/kus/appkit/di/iosCommunityModule.kt b/shared/appKit/src/iosMain/kotlin/com/kus/appkit/di/iosCommunityModule.kt new file mode 100644 index 00000000..bcd00552 --- /dev/null +++ b/shared/appKit/src/iosMain/kotlin/com/kus/appkit/di/iosCommunityModule.kt @@ -0,0 +1,17 @@ +package com.kus.appkit.di + +import com.kus.appkit.community.write.IosCommunityEditorRenderer +import com.kus.appkit.community.write.image.IosImagePickerFactory +import com.kus.appkit.community.write.image.IosPlatformImageResolver +import com.kus.data.community.PlatformImageResolver +import com.kus.feature.community.ui.write.CommunityEditorRenderer +import com.kus.feature.community.ui.write.image.PlatformImagePickerFactory +import org.koin.core.module.dsl.singleOf +import org.koin.dsl.bind +import org.koin.dsl.module + +val iosCommunityModule = module { + singleOf(::IosCommunityEditorRenderer) bind CommunityEditorRenderer::class + single { IosPlatformImageResolver() } + singleOf(::IosImagePickerFactory) bind PlatformImagePickerFactory::class +} \ No newline at end of file diff --git a/shared/appKit/src/iosMain/kotlin/com/kus/appkit/map/MapHolder.kt b/shared/appKit/src/iosMain/kotlin/com/kus/appkit/map/MapHolder.kt index 95ec4c27..2bf2d8ae 100644 --- a/shared/appKit/src/iosMain/kotlin/com/kus/appkit/map/MapHolder.kt +++ b/shared/appKit/src/iosMain/kotlin/com/kus/appkit/map/MapHolder.kt @@ -12,6 +12,8 @@ class MapHolder(val mapView: NMFNaverMapView) { var lastCameraState: MapCameraState? = null var didApplyInitialBounds: Boolean = false + var lastVisibleBounds: List = emptyList() + val polygonOverlays = mutableListOf() val polylineOverlays = mutableListOf() val restaurantMarkers = mutableListOf() diff --git a/shared/appKit/src/iosMain/kotlin/com/kus/appkit/map/TierMapIosScreen.kt b/shared/appKit/src/iosMain/kotlin/com/kus/appkit/map/TierMapIosScreen.kt index 3e1f6510..00b51284 100644 --- a/shared/appKit/src/iosMain/kotlin/com/kus/appkit/map/TierMapIosScreen.kt +++ b/shared/appKit/src/iosMain/kotlin/com/kus/appkit/map/TierMapIosScreen.kt @@ -7,7 +7,9 @@ import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut import androidx.compose.animation.slideInVertically import androidx.compose.animation.slideOutVertically +import androidx.compose.foundation.background import androidx.compose.foundation.layout.* +import androidx.compose.material3.CircularProgressIndicator import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -33,6 +35,7 @@ import com.kus.designsystem.toUIColor import com.kus.feature.tier.ui.map.MapCameraState import com.kus.feature.tier.ui.map.TierMapUiState import com.kus.feature.tier.ui.map.TierRestaurantBottomSheetCard +import platform.Foundation.NSLog @Composable fun TierMapIosScreen( @@ -51,13 +54,14 @@ fun TierMapIosScreen( val polygonOverlays = holder.polygonOverlays val polylineOverlays = holder.polylineOverlays val restaurantMarkers = holder.restaurantMarkers + val isCameraReady = remember { mutableStateOf(false) } - var currentZoom by remember { - mutableDoubleStateOf(holder.lastCameraState?.zoom ?: 11.0) - } + val outlineUiColor = KusTheme.colors.c_43AB38.toUIColor() + val currentZoomState = remember { mutableIntStateOf((holder.lastCameraState?.zoom ?: 11.0).toInt()) } val latestOnMapTapped by rememberUpdatedState(onMapTapped) val latestOnRestaurantSelected by rememberUpdatedState(onRestaurantSelected) + val latestState by rememberUpdatedState(state) val touchDelegate = remember { object : NSObject(), NMFMapViewTouchDelegateProtocol { @@ -77,11 +81,11 @@ fun TierMapIosScreen( val camera = mapView.cameraPosition if (!holder.didApplyInitialBounds) { - currentZoom = camera.zoom + currentZoomState.intValue = camera.zoom.toInt() return } - val state = MapCameraState( + val cameraState = MapCameraState( latitude = camera.target.lat(), longitude = camera.target.lng(), zoom = camera.zoom, @@ -89,9 +93,21 @@ fun TierMapIosScreen( bearing = camera.heading ) - holder.lastCameraState = state - currentZoom = camera.zoom - onCameraIdle(state) + holder.lastCameraState = cameraState + currentZoomState.intValue = camera.zoom.toInt() + onCameraIdle(cameraState) + + val data = (latestState.map as? UiState.Success)?.data ?: return + updateMapIos( + mapView = mapView, + mapData = data, + currentZoom = camera.zoom.toInt(), + polygonOverlays = polygonOverlays, + polylineOverlays = polylineOverlays, + restaurantMarkers = restaurantMarkers, + onRestaurantSelected = latestOnRestaurantSelected, + outlineColor = outlineUiColor, + ) } } } @@ -105,36 +121,57 @@ fun TierMapIosScreen( } } - LaunchedEffect(state.map) { val data = (state.map as? UiState.Success)?.data ?: return@LaunchedEffect if (!holder.didApplyInitialBounds) { mapView.minZoomLevel = data.minZoom.toDouble() - moveCameraToVisibleBoundsIos(mapView, data.visibleBounds) holder.didApplyInitialBounds = true + moveCameraToVisibleBoundsIos(mapView, data.visibleBounds) { + isCameraReady.value = true + updateMapIos( + mapView = mapView, + mapData = data, + currentZoom = currentZoomState.intValue, + polygonOverlays = polygonOverlays, + polylineOverlays = polylineOverlays, + restaurantMarkers = restaurantMarkers, + onRestaurantSelected = onRestaurantSelected, + outlineColor = outlineUiColor, + ) + } + holder.lastVisibleBounds = data.visibleBounds + } else { + if (holder.lastVisibleBounds != data.visibleBounds) { + holder.lastVisibleBounds = data.visibleBounds + moveCameraToVisibleBoundsIos(mapView, data.visibleBounds) { + updateMapIos( + mapView = mapView, + mapData = data, + currentZoom = currentZoomState.intValue, + polygonOverlays = polygonOverlays, + polylineOverlays = polylineOverlays, + restaurantMarkers = restaurantMarkers, + onRestaurantSelected = onRestaurantSelected, + outlineColor = outlineUiColor, + ) + } + } else { + updateMapIos( + mapView = mapView, + mapData = data, + currentZoom = currentZoomState.intValue, + polygonOverlays = polygonOverlays, + polylineOverlays = polylineOverlays, + restaurantMarkers = restaurantMarkers, + onRestaurantSelected = onRestaurantSelected, + outlineColor = outlineUiColor, + ) + } } } - - val outlineUiColor = KusTheme.colors.c_43AB38.toUIColor() - - LaunchedEffect(state.map, currentZoom) { - val data = (state.map as? UiState.Success)?.data ?: return@LaunchedEffect - - updateMapIos( - mapView = mapView, - mapData = data, - currentZoom = currentZoom, - polygonOverlays = polygonOverlays, - polylineOverlays = polylineOverlays, - restaurantMarkers = restaurantMarkers, - onRestaurantSelected = latestOnRestaurantSelected, - outlineColor = outlineUiColor, - ) - } - val selectedRestaurant: TierRestaurant? = remember(state.map, state.selectedRestaurantId) { val data = (state.map as? UiState.Success)?.data ?: return@remember null val id = state.selectedRestaurantId ?: return@remember null @@ -172,13 +209,24 @@ fun TierMapIosScreen( onClick = { onBottomSheetClick(r.restaurantId) } ) } + + if (!isCameraReady.value) { + Box( + modifier = Modifier + .fillMaxSize() + .background(KusTheme.colors.c_FFFFFF), + contentAlignment = Alignment.Center + ) { + CircularProgressIndicator(color = KusTheme.colors.c_43AB38) + } + } } } private fun updateMapIos( mapView: NMFMapView, mapData: TierMapData, - currentZoom: Double, + currentZoom: Int, polygonOverlays: MutableList, polylineOverlays: MutableList, restaurantMarkers: MutableList, @@ -320,6 +368,15 @@ private fun createRestaurantMarkerIos( setLng(restaurant.longitude) } iconImage = getMarkerIconIos(restaurant) + + val isNoneMarker = !restaurant.isFavorite && + restaurant.partnershipInfo.isNotEmpty() || + restaurant.mainTier !in 1..4 + if (isNoneMarker) { + width = 15.0 + height = 20.0 + } + this.mapView = mapView zIndex = when { @@ -345,20 +402,22 @@ private fun getMarkerIconIos(restaurant: TierRestaurant): NMFOverlayImage { val imageName = if(restaurant.isTempTier) { when { restaurant.isFavorite -> "ic_saved" + restaurant.partnershipInfo.isNotEmpty() -> "ic_marker_partnership" restaurant.mainTier == 1 -> "ic_temp_tier_1" restaurant.mainTier == 2 -> "ic_temp_tier_2" restaurant.mainTier == 3 -> "ic_temp_tier_3" restaurant.mainTier == 4 -> "ic_temp_tier_4" - else -> "ic_map_marker" + else -> "ic_marker_none" } } else { when { restaurant.isFavorite -> "ic_saved" + restaurant.partnershipInfo.isNotEmpty() -> "ic_marker_partnership" restaurant.mainTier == 1 -> "ic_tier_1" restaurant.mainTier == 2 -> "ic_tier_2" restaurant.mainTier == 3 -> "ic_tier_3" restaurant.mainTier == 4 -> "ic_tier_4" - else -> "ic_map_marker" + else -> "ic_marker_none" } } return NMFOverlayImage.overlayImageWithName(imageName)!! @@ -368,6 +427,7 @@ private fun getMarkerIconIos(restaurant: TierRestaurant): NMFOverlayImage { private fun moveCameraToVisibleBoundsIos( mapView: NMFMapView, visibleBounds: List, + onComplete: () -> Unit ) { if (visibleBounds.size < 4) return @@ -387,6 +447,8 @@ private fun moveCameraToVisibleBoundsIos( bounds = bounds, ) - mapView.moveCamera(update) + mapView.moveCamera(update) { + onComplete() + } } diff --git a/shared/core/designSystem/src/commonMain/composeResources/drawable/ic_chat.xml b/shared/core/designSystem/src/commonMain/composeResources/drawable/ic_chat.xml new file mode 100644 index 00000000..884ebf10 --- /dev/null +++ b/shared/core/designSystem/src/commonMain/composeResources/drawable/ic_chat.xml @@ -0,0 +1,27 @@ + + + + + + + diff --git a/shared/core/designSystem/src/commonMain/composeResources/drawable/ic_comment_reply.xml b/shared/core/designSystem/src/commonMain/composeResources/drawable/ic_comment_reply.xml new file mode 100644 index 00000000..a8ad3fe9 --- /dev/null +++ b/shared/core/designSystem/src/commonMain/composeResources/drawable/ic_comment_reply.xml @@ -0,0 +1,9 @@ + + + diff --git a/shared/feature/tier/src/commonMain/composeResources/drawable/ic_crown.png b/shared/core/designSystem/src/commonMain/composeResources/drawable/ic_crown.png similarity index 100% rename from shared/feature/tier/src/commonMain/composeResources/drawable/ic_crown.png rename to shared/core/designSystem/src/commonMain/composeResources/drawable/ic_crown.png diff --git a/shared/core/designSystem/src/commonMain/composeResources/drawable/ic_delete.xml b/shared/core/designSystem/src/commonMain/composeResources/drawable/ic_delete.xml new file mode 100644 index 00000000..411941a3 --- /dev/null +++ b/shared/core/designSystem/src/commonMain/composeResources/drawable/ic_delete.xml @@ -0,0 +1,9 @@ + + + diff --git a/shared/core/designSystem/src/commonMain/composeResources/drawable/ic_more_vert.xml b/shared/core/designSystem/src/commonMain/composeResources/drawable/ic_more_vert.xml new file mode 100644 index 00000000..414702c7 --- /dev/null +++ b/shared/core/designSystem/src/commonMain/composeResources/drawable/ic_more_vert.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/shared/core/designSystem/src/commonMain/composeResources/drawable/ic_naver_logo.png b/shared/core/designSystem/src/commonMain/composeResources/drawable/ic_naver_logo.png index 28528cc5aa28aeb67615caec1afe65461875d5a5..463aad66401235dcf6cd8f1b406ec0b7fbf998d3 100644 GIT binary patch literal 2082 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 YAI-^$W~r0Th5!Hn07*qoM6N<$f-^~0r2qf` diff --git a/shared/core/designSystem/src/commonMain/composeResources/drawable/ic_scrap.xml b/shared/core/designSystem/src/commonMain/composeResources/drawable/ic_scrap.xml new file mode 100644 index 00000000..088864fe --- /dev/null +++ b/shared/core/designSystem/src/commonMain/composeResources/drawable/ic_scrap.xml @@ -0,0 +1,9 @@ + + + diff --git a/shared/core/designSystem/src/commonMain/composeResources/drawable/ic_user_placeholder.png b/shared/core/designSystem/src/commonMain/composeResources/drawable/ic_user_placeholder.png new file mode 100644 index 0000000000000000000000000000000000000000..f50e78976496d175e71b386b60a981bd94fd1cf2 GIT binary patch literal 13617 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 Unit, ) { @@ -91,25 +94,38 @@ fun KusButton( verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.Center, ) { - if (icon != null) { + + if (leftIcon != null) { Icon( - imageVector = icon, + painter = leftIcon, contentDescription = null, - modifier = Modifier.size(24.dp) + modifier = Modifier.size(iconSize) ) + } - Spacer(Modifier.width(10.dp)) + Box( + modifier = Modifier.weight(1f), + contentAlignment = Alignment.Center + ) { + Text( + text = buttonName, + style = textStyle + ) } - Text( - text = buttonName, - style = textStyle, - ) + if (rightIcon != null) { + Icon( + painter = rightIcon, + contentDescription = null, + modifier = Modifier.size(iconSize) + ) + } } } } } + //@Preview //@Composable //private fun KusButtonPreview() { diff --git a/shared/core/designSystem/src/commonMain/kotlin/com/kus/designsystem/component/KusCommentDialog.kt b/shared/core/designSystem/src/commonMain/kotlin/com/kus/designsystem/component/KusCommentDialog.kt new file mode 100644 index 00000000..a7bcf106 --- /dev/null +++ b/shared/core/designSystem/src/commonMain/kotlin/com/kus/designsystem/component/KusCommentDialog.kt @@ -0,0 +1,108 @@ +package com.kus.designsystem.component + +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.widthIn +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.HorizontalDivider +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.material3.VerticalDivider +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import androidx.compose.ui.window.Dialog +import com.kus.designsystem.theme.KusTheme + +@Composable +fun ReplyConfirmDialog( + visible: Boolean, + content: String, + onConfirm: () -> Unit, + onDismiss: () -> Unit, + confirmText: String = "확인", + dismissText: String = "취소", +) { + if (!visible) return + + Dialog(onDismissRequest = onDismiss) { + Surface( + shape = RoundedCornerShape(12.dp), + color = KusTheme.colors.c_FFFFFF, + modifier = Modifier + .padding(horizontal = 20.dp) + ) { + Column( + modifier = Modifier + .widthIn(min = 212.dp) + ) { + Box( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 20.dp, vertical = 20.dp) + .padding(top = 4.dp), + contentAlignment = Alignment.Center + ) { + Text( + text = content, + style = KusTheme.typography.type13b, + color = KusTheme.colors.c_323232, + ) + } + + HorizontalDivider( + color = KusTheme.colors.c_E0E0E0, + thickness = 1.dp, + modifier = Modifier.padding(horizontal = 16.dp) + ) + + Row( + modifier = Modifier + .fillMaxWidth() + .height(44.dp) + ) { + Box( + modifier = Modifier + .weight(1f) + .fillMaxHeight() + .clickable { onDismiss() }, + contentAlignment = Alignment.Center + ) { + Text( + text = dismissText, + style = KusTheme.typography.type13m, + color = KusTheme.colors.c_43AB38 + ) + } + + VerticalDivider( + color = KusTheme.colors.c_E0E0E0, + thickness = 1.dp, + modifier = Modifier.padding(bottom = 12.dp) + ) + + Box( + modifier = Modifier + .weight(1f) + .fillMaxHeight() + .clickable { onConfirm() }, + contentAlignment = Alignment.Center + ) { + Text( + text = confirmText, + style = KusTheme.typography.type13m, + color = KusTheme.colors.c_43AB38 + ) + } + } + } + } + } +} \ No newline at end of file diff --git a/shared/core/designSystem/src/commonMain/kotlin/com/kus/designsystem/component/KusCommentInput.kt b/shared/core/designSystem/src/commonMain/kotlin/com/kus/designsystem/component/KusCommentInput.kt new file mode 100644 index 00000000..44a7052e --- /dev/null +++ b/shared/core/designSystem/src/commonMain/kotlin/com/kus/designsystem/component/KusCommentInput.kt @@ -0,0 +1,143 @@ +package com.kus.designsystem.component + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.heightIn +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.text.BasicTextField +import androidx.compose.foundation.text.KeyboardActions +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.material3.Icon +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.focus.FocusManager +import androidx.compose.ui.focus.FocusRequester +import androidx.compose.ui.focus.focusRequester +import androidx.compose.ui.platform.LocalFocusManager +import androidx.compose.ui.platform.LocalSoftwareKeyboardController +import androidx.compose.ui.platform.SoftwareKeyboardController +import androidx.compose.ui.text.input.ImeAction +import androidx.compose.ui.text.input.KeyboardType +import androidx.compose.ui.unit.dp +import com.kus.designsystem.theme.KusTheme +import kustaurant.shared.core.designsystem.generated.resources.Res +import kustaurant.shared.core.designsystem.generated.resources.ic_send +import org.jetbrains.compose.resources.painterResource + +@Composable +fun KusCommentInput( + modifier: Modifier = Modifier, + value: String, + onValueChange: (String) -> Unit, + placeholder: String = "댓글을 입력하세요", + enabled: Boolean = true, + autoFocus: Boolean = false, + onSend: (String) -> Unit, + focusManager: FocusManager = LocalFocusManager.current, + keyboardController: SoftwareKeyboardController? = LocalSoftwareKeyboardController.current, +) { + val focusRequester = remember { FocusRequester() } + + LaunchedEffect(autoFocus) { + if (autoFocus) { + focusRequester.requestFocus() + keyboardController?.show() + } + } + + val canSend = enabled && value.isNotBlank() + + Row( + modifier = modifier.fillMaxWidth(), + verticalAlignment = Alignment.Bottom + ) { + BasicTextField( + value = value, + onValueChange = onValueChange, + enabled = enabled, + singleLine = false, + maxLines = 5, + textStyle = KusTheme.typography.type14r.copy( + color = KusTheme.colors.c_000000 + ), + keyboardOptions = KeyboardOptions( + imeAction = ImeAction.Send, + keyboardType = KeyboardType.Text + ), + keyboardActions = KeyboardActions( + onSend = { + if (canSend) { + keyboardController?.hide() + focusManager.clearFocus(true) + onSend(value.trim()) + } + } + ), + modifier = Modifier + .weight(1f) + .heightIn(min = 45.dp, max = 113.dp) + .background( + color = KusTheme.colors.c_EAEAEA, + shape = RoundedCornerShape(27.dp) + ) + .padding(horizontal = 16.dp, vertical = 10.dp) + .focusRequester(focusRequester), + decorationBox = { innerTextField -> + Box( + modifier = Modifier.fillMaxWidth() , + contentAlignment = Alignment.CenterStart + ) { + if (value.isEmpty()) { + Text( + text = placeholder, + style = KusTheme.typography.type14r, + color = KusTheme.colors.c_AAAAAA + ) + } + innerTextField() + } + } + ) + + Spacer(Modifier.width(6.dp)) + + Surface( + onClick = { + if (canSend) { + keyboardController?.hide() + focusManager.clearFocus(true) + onSend(value.trim()) + } + }, + enabled = canSend, + shape = CircleShape, + color = KusTheme.colors.c_EAEAEA, + ) { + Box( + modifier = Modifier + .size(40.dp) + .padding(end = 4.dp), + contentAlignment = Alignment.Center + ) { + Icon( + painter = painterResource(Res.drawable.ic_send), + contentDescription = "전송", + tint = KusTheme.colors.c_43AB38, + modifier = Modifier.size(18.dp) + ) + } + } + } +} \ No newline at end of file diff --git a/shared/core/designSystem/src/commonMain/kotlin/com/kus/designsystem/component/KusRatingBar.kt b/shared/core/designSystem/src/commonMain/kotlin/com/kus/designsystem/component/KusRatingBar.kt index 43b562b3..8fe59937 100644 --- a/shared/core/designSystem/src/commonMain/kotlin/com/kus/designsystem/component/KusRatingBar.kt +++ b/shared/core/designSystem/src/commonMain/kotlin/com/kus/designsystem/component/KusRatingBar.kt @@ -18,7 +18,6 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.input.pointer.pointerInput import androidx.compose.ui.layout.onSizeChanged -import androidx.compose.ui.draw.alpha import androidx.compose.ui.unit.dp import kustaurant.shared.core.designsystem.generated.resources.Res import kustaurant.shared.core.designsystem.generated.resources.ic_empty_star diff --git a/shared/core/designSystem/src/commonMain/kotlin/com/kus/designsystem/component/KusTopBar.kt b/shared/core/designSystem/src/commonMain/kotlin/com/kus/designsystem/component/KusTopBar.kt index 61226a39..0507eb64 100644 --- a/shared/core/designSystem/src/commonMain/kotlin/com/kus/designsystem/component/KusTopBar.kt +++ b/shared/core/designSystem/src/commonMain/kotlin/com/kus/designsystem/component/KusTopBar.kt @@ -15,10 +15,14 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.geometry.Rect import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.painter.Painter +import androidx.compose.ui.layout.boundsInWindow +import androidx.compose.ui.layout.onGloballyPositioned import androidx.compose.ui.layout.onSizeChanged import androidx.compose.ui.platform.LocalDensity +import com.kus.designsystem.util.noRippleClickable /** * 쿠스토랑 top bar @@ -46,6 +50,7 @@ fun KusTopBar( onRightSecondClicked: () -> Unit = {}, leftIconModifier: Modifier = Modifier, rightFirstIconModifier: Modifier = Modifier, + onRightFirstIconBoundsChanged: ((Rect) -> Unit)? = null, rightSecondIconModifier: Modifier = Modifier, content: @Composable (() -> Unit) = {}, ) { @@ -54,24 +59,24 @@ fun KusTopBar( val iconTintColor: Color = iconTint ?: Color.Unspecified val density = LocalDensity.current - val leftPadding = with(density) { leftWidthPx.toDp() } - val rightPadding = with(density) { rightWidthPx.toDp() } + val leftWidth = with(density) { leftWidthPx.toDp() } + val rightWidth = with(density) { rightWidthPx.toDp() } + + val safeSidePadding = maxOf(leftWidth, rightWidth) Box( modifier = modifier, contentAlignment = Alignment.Center ) { - // 중앙 컨텐츠: 좌/우 실제 너비만큼 패딩을 줘서 절대 침범하지 않음 Box( modifier = Modifier .fillMaxWidth() - .padding(start = leftPadding, end = rightPadding), + .padding(horizontal = safeSidePadding), contentAlignment = Alignment.Center ) { content() } - // 왼쪽 아이콘 영역 (실제 너비 측정) if (leftIcon != null) { Box( modifier = Modifier @@ -90,11 +95,9 @@ fun KusTopBar( } } } else { - // 아이콘이 없으면 0으로 - LaunchedEffect(Unit) { leftWidthPx = 0 } + LaunchedEffect(leftIcon) { leftWidthPx = 0 } } - // 오른쪽 아이콘들 영역 (실제 너비 측정) Row( modifier = Modifier .align(Alignment.CenterEnd) @@ -103,16 +106,16 @@ fun KusTopBar( horizontalArrangement = Arrangement.End ) { if (rightFirstIcon != null) { - IconButton( - onClick = onRightFirstClicked, + Icon( + painter = rightFirstIcon, + contentDescription = null, + tint = iconTintColor, modifier = rightFirstIconModifier - ) { - Icon( - painter = rightFirstIcon, - contentDescription = null, - tint = iconTintColor - ) - } + .onGloballyPositioned { coords -> + onRightFirstIconBoundsChanged?.invoke(coords.boundsInWindow()) + } + .noRippleClickable { onRightFirstClicked() } + ) } if (rightSecondIcon != null) { IconButton( @@ -127,16 +130,12 @@ fun KusTopBar( } } } - - // 오른쪽 아이콘이 둘 다 없으면 Row 너비가 0이 되지만, - // 혹시 레이아웃 캐시 때문에 남아있을 수 있으니 안전 처리 LaunchedEffect(rightFirstIcon, rightSecondIcon) { if (rightFirstIcon == null && rightSecondIcon == null) rightWidthPx = 0 } } } - //@Composable //fun KusTopBarPreviewOneRightIcon(){ // KusTheme { diff --git a/shared/core/designSystem/src/commonMain/kotlin/com/kus/designsystem/component/LoginRequiredDialog.kt b/shared/core/designSystem/src/commonMain/kotlin/com/kus/designsystem/component/LoginRequiredDialog.kt index ee82584c..d0ba9d24 100644 --- a/shared/core/designSystem/src/commonMain/kotlin/com/kus/designsystem/component/LoginRequiredDialog.kt +++ b/shared/core/designSystem/src/commonMain/kotlin/com/kus/designsystem/component/LoginRequiredDialog.kt @@ -10,7 +10,6 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment @@ -18,86 +17,76 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextDecoration import androidx.compose.ui.unit.dp -import androidx.compose.ui.window.Dialog import com.kus.designsystem.theme.KusTheme import com.kus.designsystem.util.noRippleClickable /** - * 미로그인시 기능제한 안내 팝업 + * 미로그인시 기능제한 안내 오버레이 * - * @param targetFeature 이용제한 되는 기능명 * @param modifier 다이얼로그 수정자 * @param onLoginButtonClick 로그인 버튼 클릭 시 호출되는 콜백 * @param onDismissRequest 취소 버튼 및 외부 영역 터치 시 호출되는 콜백 */ @Composable -fun LoginRequiredDialog( - targetFeature: String, +fun LoginRequiredOverlay( modifier: Modifier = Modifier, onLoginButtonClick: () -> Unit, onDismissRequest: () -> Unit, ) { - Dialog( - onDismissRequest = onDismissRequest, + Box( + modifier = Modifier + .fillMaxSize() + .background(KusTheme.colors.c_000000.copy(alpha = 0.5f)) + .noRippleClickable(onDismissRequest), + contentAlignment = Alignment.Center, ) { Box( - modifier = Modifier - .fillMaxSize() - .background(KusTheme.colors.c_000000.copy(alpha = 0.5f)), - contentAlignment = Alignment.Center, + modifier = modifier + .width(300.dp) + .background(KusTheme.colors.c_FFFFFF, RoundedCornerShape(16.dp)) + .noRippleClickable {} // 팝업 내부 클릭 시 dismiss 방지 + .padding(20.dp) ) { - Surface( - shape = RoundedCornerShape(16.dp), - tonalElevation = 8.dp + Column( + modifier = Modifier.fillMaxWidth(), + horizontalAlignment = Alignment.CenterHorizontally, ) { - Box( - modifier = modifier - .width(300.dp) - .background(KusTheme.colors.c_FFFFFF, RoundedCornerShape(16.dp)) - .padding(20.dp) - ) { - Column( - modifier = Modifier.fillMaxWidth(), - horizontalAlignment = Alignment.CenterHorizontally, - ) { - Text( - text = "안내", - style = KusTheme.typography.type16b, - color = KusTheme.colors.c_AAAAAA, - ) + Text( + text = "안내", + style = KusTheme.typography.type16b, + color = KusTheme.colors.c_AAAAAA, + ) - Spacer(Modifier.height(8.dp)) + Spacer(Modifier.height(8.dp)) - Text( - text = "$targetFeature 은(는) 로그인 후\n이용할 수 있습니다", - style = KusTheme.typography.type16m, - textAlign = TextAlign.Center, - ) + Text( + text = "현재 서비스는 로그인 후\n이용할 수 있습니다", + style = KusTheme.typography.type16m, + textAlign = TextAlign.Center, + ) - Spacer(Modifier.height(18.dp)) + Spacer(Modifier.height(18.dp)) - KusButton( - enabled = true, - buttonName = "로그인 하러 가기", - textStyle = KusTheme.typography.type16m, - containerColor = KusTheme.colors.c_098C62, - roundedCornerShape = RoundedCornerShape(12.dp), - onClick = onLoginButtonClick, - modifier = Modifier.fillMaxWidth(), - ) + KusButton( + enabled = true, + buttonName = "로그인 하러 가기", + textStyle = KusTheme.typography.type16m, + containerColor = KusTheme.colors.c_098C62, + roundedCornerShape = RoundedCornerShape(12.dp), + onClick = onLoginButtonClick, + modifier = Modifier.fillMaxWidth(), + ) - Spacer(Modifier.height(8.dp)) + Spacer(Modifier.height(8.dp)) - Text( - text = "나중에 하기", - style = KusTheme.typography.type14r, - color = KusTheme.colors.c_AAAAAA, - textDecoration = TextDecoration.Underline, - modifier = Modifier.noRippleClickable(onDismissRequest), - ) - } - } + Text( + text = "나중에 하기", + style = KusTheme.typography.type14r, + color = KusTheme.colors.c_AAAAAA, + textDecoration = TextDecoration.Underline, + modifier = Modifier.noRippleClickable(onDismissRequest), + ) } } } -} +} \ No newline at end of file diff --git a/shared/core/designSystem/src/commonMain/kotlin/com/kus/designsystem/component/ReplyCommentInputPopup.kt b/shared/core/designSystem/src/commonMain/kotlin/com/kus/designsystem/component/ReplyCommentInputPopup.kt new file mode 100644 index 00000000..0ba4c5d1 --- /dev/null +++ b/shared/core/designSystem/src/commonMain/kotlin/com/kus/designsystem/component/ReplyCommentInputPopup.kt @@ -0,0 +1,63 @@ +package com.kus.designsystem.component + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.imePadding +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Surface +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import com.kus.designsystem.theme.KusTheme +import com.kus.designsystem.util.noRippleClickable + +@Composable +fun KusReplyCommentOverlay( + visible: Boolean, + value: String, + onValueChange: (String) -> Unit, + enabled: Boolean, + onSend: (String) -> Unit, + onDismiss: () -> Unit, + scrimAlpha: Float = 0.35f, +) { + if (!visible) return + + Box(Modifier.fillMaxSize()) { + Box( + modifier = Modifier + .fillMaxSize() + .background(KusTheme.colors.c_000000.copy(alpha = scrimAlpha)) + .noRippleClickable { onDismiss() } + ) + + Surface( + color = KusTheme.colors.c_FFFFFF, + shadowElevation = 10.dp, + modifier = Modifier + .align(Alignment.BottomCenter) + .fillMaxWidth() + ) { + Column( + modifier = Modifier + .fillMaxWidth() + .imePadding() + .padding(horizontal = 16.dp, vertical = 10.dp) + ) { + KusCommentInput( + value = value, + onValueChange = onValueChange, + placeholder = "대댓글을 입력하세요", + enabled = enabled, + autoFocus = true, + onSend = onSend, + modifier = Modifier.fillMaxWidth() + ) + } + } + } +} \ No newline at end of file diff --git a/shared/core/designSystem/src/commonMain/kotlin/com/kus/designsystem/component/snackbar/KusSnackBarHost.kt b/shared/core/designSystem/src/commonMain/kotlin/com/kus/designsystem/component/snackbar/KusSnackBarHost.kt new file mode 100644 index 00000000..8987c453 --- /dev/null +++ b/shared/core/designSystem/src/commonMain/kotlin/com/kus/designsystem/component/snackbar/KusSnackBarHost.kt @@ -0,0 +1,54 @@ +package com.kus.designsystem.component.snackbar + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.SnackbarHost +import androidx.compose.material3.SnackbarHostState +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.unit.dp +import com.kus.designsystem.theme.KusTheme + +@Composable +fun KusSnackBarHost( + hostState: SnackbarHostState, + modifier: Modifier = Modifier, +) { + SnackbarHost( + hostState = hostState, + modifier = modifier, + ) { data -> + Box( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp, vertical = 10.dp), + contentAlignment = Alignment.Center + ) { + val shape = RoundedCornerShape(14.dp) + Surface( + shape = shape, + tonalElevation = 0.dp, + shadowElevation = 6.dp, + color = KusTheme.colors.c_000000, + contentColor = KusTheme.colors.c_FFFFFF, + ) { + Text( + text = data.visuals.message, + style = KusTheme.typography.type14r, + color = KusTheme.colors.c_FFFFFF, + modifier = Modifier + .clip(shape) + .background(KusTheme.colors.c_000000) + .padding(horizontal = 14.dp, vertical = 12.dp) + ) + } + } + } +} \ No newline at end of file diff --git a/shared/core/designSystem/src/commonMain/kotlin/com/kus/designsystem/component/snackbar/KusSnackBarOverlay.kt b/shared/core/designSystem/src/commonMain/kotlin/com/kus/designsystem/component/snackbar/KusSnackBarOverlay.kt new file mode 100644 index 00000000..f6d4b00d --- /dev/null +++ b/shared/core/designSystem/src/commonMain/kotlin/com/kus/designsystem/component/snackbar/KusSnackBarOverlay.kt @@ -0,0 +1,34 @@ +package com.kus.designsystem.component.snackbar + +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.ime +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.windowInsetsPadding +import androidx.compose.material3.SnackbarHostState +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier + +@Composable +fun KusSnackBarOverlay( + hostState: SnackbarHostState, + modifier: Modifier = Modifier, +) { + val bottomOffset = LocalSnackBarBottomPadding.current + + Box( + modifier = modifier + .fillMaxSize() + .windowInsetsPadding(WindowInsets.ime) + .padding(bottom = bottomOffset), + contentAlignment = Alignment.BottomCenter + ) { + KusSnackBarHost( + hostState = hostState, + modifier = Modifier.fillMaxWidth() + ) + } +} diff --git a/shared/core/designSystem/src/commonMain/kotlin/com/kus/designsystem/component/snackbar/LocalSnackBarBottomPadding.kt b/shared/core/designSystem/src/commonMain/kotlin/com/kus/designsystem/component/snackbar/LocalSnackBarBottomPadding.kt new file mode 100644 index 00000000..bc9be01c --- /dev/null +++ b/shared/core/designSystem/src/commonMain/kotlin/com/kus/designsystem/component/snackbar/LocalSnackBarBottomPadding.kt @@ -0,0 +1,6 @@ +package com.kus.designsystem.component.snackbar + +import androidx.compose.runtime.compositionLocalOf +import androidx.compose.ui.unit.dp + +val LocalSnackBarBottomPadding = compositionLocalOf { 16.dp } \ No newline at end of file diff --git a/shared/core/designSystem/src/commonMain/kotlin/com/kus/designsystem/navigation/BottomBar.kt b/shared/core/designSystem/src/commonMain/kotlin/com/kus/designsystem/navigation/BottomBar.kt index 789dd265..2fe28214 100644 --- a/shared/core/designSystem/src/commonMain/kotlin/com/kus/designsystem/navigation/BottomBar.kt +++ b/shared/core/designSystem/src/commonMain/kotlin/com/kus/designsystem/navigation/BottomBar.kt @@ -1,6 +1,7 @@ package com.kus.designsystem.navigation import BottomBarItem +import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row @@ -22,6 +23,7 @@ import androidx.compose.ui.unit.dp import com.kus.designsystem.theme.C_43AB38 import com.kus.designsystem.theme.C_AAAAAA import com.kus.designsystem.theme.C_EAEAEA +import com.kus.designsystem.theme.KusTheme import com.kus.designsystem.util.noRippleClickable @Composable @@ -33,7 +35,7 @@ fun BottomBar( selectedTint: Color = C_43AB38, labelUnselected: Color = C_AAAAAA, ) { - Column(modifier) { + Column(modifier.background(KusTheme.colors.c_FFFFFF)) { Surface(color = C_EAEAEA) { Row( modifier = Modifier diff --git a/shared/core/designSystem/src/commonMain/kotlin/com/kus/designsystem/theme/Color.kt b/shared/core/designSystem/src/commonMain/kotlin/com/kus/designsystem/theme/Color.kt index b07ec2d1..1bac681a 100644 --- a/shared/core/designSystem/src/commonMain/kotlin/com/kus/designsystem/theme/Color.kt +++ b/shared/core/designSystem/src/commonMain/kotlin/com/kus/designsystem/theme/Color.kt @@ -173,4 +173,4 @@ fun KusLightColors( c_FFB900, c_9BA5B0, c_FF0000, -) +) \ No newline at end of file diff --git a/shared/core/designSystem/src/commonMain/kotlin/com/kus/designsystem/theme/Type.kt b/shared/core/designSystem/src/commonMain/kotlin/com/kus/designsystem/theme/Type.kt index 6925f34d..d879649b 100644 --- a/shared/core/designSystem/src/commonMain/kotlin/com/kus/designsystem/theme/Type.kt +++ b/shared/core/designSystem/src/commonMain/kotlin/com/kus/designsystem/theme/Type.kt @@ -68,11 +68,13 @@ class KusTypography( val type18m: TextStyle, val type16m: TextStyle, val type14m: TextStyle, + val type16r: TextStyle, val type15m: TextStyle, val type12m: TextStyle, val type11m: TextStyle, val type14r: TextStyle, val type13r: TextStyle, + val type13m: TextStyle, val type12r: TextStyle, val type11r: TextStyle, val type10r: TextStyle, @@ -132,6 +134,10 @@ fun createKusTypography() = KusTypography( fontFamily = PretendardMedium, fontSize = 16.sp, ), + type16r = KusTextStyle( + fontFamily = PretendardRegular, + fontSize = 16.sp, + ), type15m = KusTextStyle( fontFamily = PretendardMedium, fontSize = 15.sp, @@ -156,6 +162,10 @@ fun createKusTypography() = KusTypography( fontFamily = PretendardRegular, fontSize = 13.sp, ), + type13m = KusTextStyle( + fontFamily = PretendardMedium, + fontSize = 13.sp, + ), type12r = KusTextStyle( fontFamily = PretendardRegular, fontSize = 12.sp, diff --git a/shared/core/designSystem/src/commonMain/kotlin/com/kus/designsystem/util/StringUtil.kt b/shared/core/designSystem/src/commonMain/kotlin/com/kus/designsystem/util/StringUtil.kt new file mode 100644 index 00000000..572a8947 --- /dev/null +++ b/shared/core/designSystem/src/commonMain/kotlin/com/kus/designsystem/util/StringUtil.kt @@ -0,0 +1,12 @@ +package com.kus.designsystem.util + +fun String.stripHtml(): String = + this.replace(Regex("]*>"), "") + .replace(Regex("<[^>]+>"), "") + .replace(Regex(" "), " ") + .replace(Regex("<"), "<") + .replace(Regex(">"), ">") + .replace(Regex("&"), "&") + .replace(Regex("""), "\"") + .replace(Regex("\n{3,}"), "\n\n") + .trim() \ No newline at end of file diff --git a/shared/core/serialization/build.gradle.kts b/shared/core/serialization/build.gradle.kts index 7109ba07..251a66dc 100644 --- a/shared/core/serialization/build.gradle.kts +++ b/shared/core/serialization/build.gradle.kts @@ -31,7 +31,7 @@ kotlin { sourceSets { commonMain { dependencies { - implementation(libs.kotlinx.serialization.json) + api(libs.kotlinx.serialization.json) } } } diff --git a/shared/data/auth/build.gradle.kts b/shared/data/auth/build.gradle.kts index 5b008e0b..3de3ee79 100644 --- a/shared/data/auth/build.gradle.kts +++ b/shared/data/auth/build.gradle.kts @@ -47,7 +47,7 @@ kotlin { commonMain { dependencies { implementation(libs.kotlinx.coroutines.core) - + implementation(libs.multiplatform.settings) implementation(libs.bundles.ktor) implementation(project(":shared:domain:auth")) diff --git a/shared/data/auth/src/androidMain/kotlin/com/kus/data/auth/di/androidDataAuthModule.kt b/shared/data/auth/src/androidMain/kotlin/com/kus/data/auth/di/androidDataAuthModule.kt index 07141a68..fa7a7aff 100644 --- a/shared/data/auth/src/androidMain/kotlin/com/kus/data/auth/di/androidDataAuthModule.kt +++ b/shared/data/auth/src/androidMain/kotlin/com/kus/data/auth/di/androidDataAuthModule.kt @@ -1,7 +1,11 @@ package com.kus.data.auth.di +import android.content.Context +import com.kus.data.auth.config.Keys import com.kus.data.auth.local.AndroidAuthPreferenceDataSource import com.kus.data.auth.local.AuthPreferenceDataSource +import com.russhwolf.settings.Settings +import com.russhwolf.settings.SharedPreferencesSettings import org.koin.android.ext.koin.androidContext import org.koin.dsl.module @@ -9,4 +13,10 @@ val androidDataAuthModule = module { single { AndroidAuthPreferenceDataSource(androidContext()) } + + single { + SharedPreferencesSettings( + androidContext().getSharedPreferences(Keys.KEY_PREFERENCE, Context.MODE_PRIVATE) + ) + } } \ No newline at end of file diff --git a/shared/data/auth/src/androidMain/kotlin/com/kus/data/auth/randomUUID.android.kt b/shared/data/auth/src/androidMain/kotlin/com/kus/data/auth/randomUUID.android.kt new file mode 100644 index 00000000..3673f99d --- /dev/null +++ b/shared/data/auth/src/androidMain/kotlin/com/kus/data/auth/randomUUID.android.kt @@ -0,0 +1,3 @@ +package com.kus.data.auth + +actual fun randomUUID(): String = java.util.UUID.randomUUID().toString() \ No newline at end of file diff --git a/shared/data/auth/src/commonMain/kotlin/com/kus/data/auth/DeviceIdManagerImpl.kt b/shared/data/auth/src/commonMain/kotlin/com/kus/data/auth/DeviceIdManagerImpl.kt new file mode 100644 index 00000000..d077ce8a --- /dev/null +++ b/shared/data/auth/src/commonMain/kotlin/com/kus/data/auth/DeviceIdManagerImpl.kt @@ -0,0 +1,27 @@ +package com.kus.data.auth + +import com.kus.domain.auth.repository.DeviceIdManager +import com.russhwolf.settings.Settings + +class DeviceIdManagerImpl(private val settings: Settings) : DeviceIdManager { + + override suspend fun getOrCreateDeviceId(): String { + return settings.getStringOrNull(KEY_DEVICE_ID) ?: run { + val newId = randomUUID() + settings.putString(KEY_DEVICE_ID, newId) + newId + } + } + + override suspend fun saveDeviceId(id: String) { + settings.putString(KEY_DEVICE_ID, id) + } + + override suspend fun clear() { + settings.remove(KEY_DEVICE_ID) + } + + companion object { + private const val KEY_DEVICE_ID = "device_id" + } +} \ No newline at end of file diff --git a/shared/data/auth/src/commonMain/kotlin/com/kus/data/auth/TokenManagerImpl.kt b/shared/data/auth/src/commonMain/kotlin/com/kus/data/auth/TokenManagerImpl.kt index dc2a9a48..35032309 100644 --- a/shared/data/auth/src/commonMain/kotlin/com/kus/data/auth/TokenManagerImpl.kt +++ b/shared/data/auth/src/commonMain/kotlin/com/kus/data/auth/TokenManagerImpl.kt @@ -2,39 +2,51 @@ package com.kus.data.auth import com.kus.data.auth.api.AuthRefreshApi import com.kus.data.network.auth.TokenManager -import com.kus.domain.auth.repository.AuthTokenStore -import com.kus.domain.auth.session.SessionEvent -import com.kus.domain.auth.session.SessionEventEmitter -import io.ktor.client.plugins.ClientRequestException +import com.kus.data.network.model.RefreshResult +import com.kus.domain.auth.repository.AuthTokenStore +import io.ktor.client.plugins.ResponseException +import io.ktor.http.HttpStatusCode +import io.ktor.serialization.JsonConvertException import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock class TokenManagerImpl( private val store: AuthTokenStore, private val refreshApi: AuthRefreshApi, - private val sessionEvents: SessionEventEmitter, ) : TokenManager { + private val refreshMutex = Mutex() override suspend fun loadAccessToken(): String = store.getAccessTokenOrBlank() - override suspend fun refreshAndGetNewAccessToken(): String = refreshMutex.withLock { + override suspend fun loadRefreshToken(): String = + store.getRefreshTokenOrBlank() + + override suspend fun refreshAndGetNewAccessToken(): RefreshResult = refreshMutex.withLock { val refresh = store.getRefreshTokenOrBlank() + if (refresh.isBlank()) { + store.clear() + return RefreshResult.InvalidRefreshToken + } return try { val newTokens = refreshApi.refresh(refresh) store.save(newTokens) - newTokens.accessToken - } catch (e: ClientRequestException) { + RefreshResult.Success(newTokens.accessToken) + } catch (e: ResponseException) { val code = e.response.status - if (code == io.ktor.http.HttpStatusCode.Unauthorized || - code == io.ktor.http.HttpStatusCode.Forbidden - ) { + if (code == HttpStatusCode.Unauthorized || code == HttpStatusCode.Forbidden) { store.clear() - sessionEvents.emit(SessionEvent.Expired) + RefreshResult.InvalidRefreshToken + } else { + RefreshResult.NetworkError } - "" + } catch (e: JsonConvertException) { + store.clear() + RefreshResult.InvalidRefreshToken + } catch (e: Throwable) { + RefreshResult.NetworkError } } } diff --git a/shared/data/auth/src/commonMain/kotlin/com/kus/data/auth/config/Keys.kt b/shared/data/auth/src/commonMain/kotlin/com/kus/data/auth/config/Keys.kt new file mode 100644 index 00000000..1bc59ec1 --- /dev/null +++ b/shared/data/auth/src/commonMain/kotlin/com/kus/data/auth/config/Keys.kt @@ -0,0 +1,5 @@ +package com.kus.data.auth.config + +object Keys{ + const val KEY_PREFERENCE = "kus_prefs" +} \ No newline at end of file diff --git a/shared/data/auth/src/commonMain/kotlin/com/kus/data/auth/di/authDataModule.kt b/shared/data/auth/src/commonMain/kotlin/com/kus/data/auth/di/authDataModule.kt index fe17d2e0..29f01460 100644 --- a/shared/data/auth/src/commonMain/kotlin/com/kus/data/auth/di/authDataModule.kt +++ b/shared/data/auth/src/commonMain/kotlin/com/kus/data/auth/di/authDataModule.kt @@ -1,5 +1,6 @@ package com.kus.data.auth.di +import com.kus.data.auth.DeviceIdManagerImpl import com.kus.data.auth.TokenManagerImpl import com.kus.data.auth.api.AuthApi import com.kus.data.auth.api.AuthRefreshApi @@ -8,6 +9,7 @@ import com.kus.data.auth.repository.AuthTokenStoreImpl import com.kus.data.network.auth.TokenManager import com.kus.domain.auth.repository.AuthRepository import com.kus.domain.auth.repository.AuthTokenStore +import com.kus.domain.auth.repository.DeviceIdManager import org.koin.core.module.dsl.singleOf import org.koin.core.qualifier.named import org.koin.dsl.bind @@ -31,4 +33,5 @@ val authDataModule = module { singleOf(::AuthRepositoryImpl) bind AuthRepository::class singleOf(::AuthTokenStoreImpl) bind AuthTokenStore::class singleOf(::TokenManagerImpl) bind TokenManager::class + singleOf(::DeviceIdManagerImpl) bind DeviceIdManager::class } \ No newline at end of file diff --git a/shared/data/auth/src/commonMain/kotlin/com/kus/data/auth/randomUUID.kt b/shared/data/auth/src/commonMain/kotlin/com/kus/data/auth/randomUUID.kt new file mode 100644 index 00000000..9d59e1fa --- /dev/null +++ b/shared/data/auth/src/commonMain/kotlin/com/kus/data/auth/randomUUID.kt @@ -0,0 +1,3 @@ +package com.kus.data.auth + +expect fun randomUUID(): String \ No newline at end of file diff --git a/shared/data/auth/src/desktopMain/kotlin/com/kus/data/auth/randomUUID.desktop.kt b/shared/data/auth/src/desktopMain/kotlin/com/kus/data/auth/randomUUID.desktop.kt new file mode 100644 index 00000000..cff88623 --- /dev/null +++ b/shared/data/auth/src/desktopMain/kotlin/com/kus/data/auth/randomUUID.desktop.kt @@ -0,0 +1,5 @@ +package com.kus.data.auth + +actual fun randomUUID(): String { + TODO("Not yet implemented") +} \ No newline at end of file diff --git a/shared/data/auth/src/iosMain/kotlin/com/kus/data/auth/di/iosAuthLocalModule.kt b/shared/data/auth/src/iosMain/kotlin/com/kus/data/auth/di/iosAuthLocalModule.kt index 84572124..667a51a2 100644 --- a/shared/data/auth/src/iosMain/kotlin/com/kus/data/auth/di/iosAuthLocalModule.kt +++ b/shared/data/auth/src/iosMain/kotlin/com/kus/data/auth/di/iosAuthLocalModule.kt @@ -2,10 +2,13 @@ package com.kus.data.auth.di import com.kus.data.auth.local.AuthPreferenceDataSource import com.kus.data.auth.local.IosAuthPreferenceDataSource +import com.russhwolf.settings.NSUserDefaultsSettings +import com.russhwolf.settings.Settings import platform.Foundation.NSUserDefaults import org.koin.dsl.module val iosAuthLocalModule = module { single { NSUserDefaults.standardUserDefaults() } single { IosAuthPreferenceDataSource() } + single { NSUserDefaultsSettings(NSUserDefaults.standardUserDefaults) } } \ No newline at end of file diff --git a/shared/data/auth/src/iosMain/kotlin/com/kus/data/auth/randomUUID.ios.kt b/shared/data/auth/src/iosMain/kotlin/com/kus/data/auth/randomUUID.ios.kt new file mode 100644 index 00000000..eed4facd --- /dev/null +++ b/shared/data/auth/src/iosMain/kotlin/com/kus/data/auth/randomUUID.ios.kt @@ -0,0 +1,3 @@ +package com.kus.data.auth + +actual fun randomUUID(): String = platform.Foundation.NSUUID().UUIDString() \ No newline at end of file diff --git a/shared/data/community/.gitignore b/shared/data/community/.gitignore new file mode 100644 index 00000000..42afabfd --- /dev/null +++ b/shared/data/community/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/shared/data/community/build.gradle.kts b/shared/data/community/build.gradle.kts new file mode 100644 index 00000000..014ec451 --- /dev/null +++ b/shared/data/community/build.gradle.kts @@ -0,0 +1,88 @@ +plugins { + alias(libs.plugins.kotlinMultiplatform) + alias(libs.plugins.androidKotlinMultiplatformLibrary) + alias(libs.plugins.androidLint) + alias(libs.plugins.kotlin.serialization) +} + +kotlin { + androidLibrary { + namespace = "com.kus.shared.data.community" + compileSdk = 36 + minSdk = 26 + + withHostTestBuilder { + } + + withDeviceTestBuilder { + sourceSetTreeName = "test" + }.configure { + instrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + } + } + + val xcfName = "shared:data:communityKit" + + iosX64 { + binaries.framework { + baseName = xcfName + } + } + + iosArm64 { + binaries.framework { + baseName = xcfName + } + } + + iosSimulatorArm64 { + binaries.framework { + baseName = xcfName + } + } + + jvm("desktop") + + sourceSets { + commonMain { + dependencies { + implementation(libs.kotlinx.coroutines.core) + + implementation(libs.kotlinx.serialization.json) + implementation(libs.bundles.ktor) + implementation(libs.okio) + + implementation(project(":shared:domain:community")) + implementation(project(":shared:domain:model")) + implementation(project(":shared:domain:auth")) + implementation(project(":shared:data:network")) + } + } + + commonTest { + dependencies { + implementation(libs.kotlin.test) + } + } + + androidMain { + dependencies { + implementation(libs.koin.android) + implementation(libs.datastore.preferences) + } + } + + getByName("androidDeviceTest") { + dependencies { + implementation(libs.androidx.runner) + implementation(libs.androidx.core) + implementation(libs.androidx.testExt.junit) + } + } + + iosMain { + dependencies { + } + } + } +} \ No newline at end of file diff --git a/shared/data/community/src/androidDeviceTest/kotlin/com/kus/data/community/ExampleInstrumentedTest.kt b/shared/data/community/src/androidDeviceTest/kotlin/com/kus/data/community/ExampleInstrumentedTest.kt new file mode 100644 index 00000000..1d5cfeb8 --- /dev/null +++ b/shared/data/community/src/androidDeviceTest/kotlin/com/kus/data/community/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.kus.data.community + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.kus.data.community.test", appContext.packageName) + } +} \ No newline at end of file diff --git a/shared/data/community/src/androidHostTest/kotlin/com/kus/data/community/ExampleUnitTest.kt b/shared/data/community/src/androidHostTest/kotlin/com/kus/data/community/ExampleUnitTest.kt new file mode 100644 index 00000000..14132128 --- /dev/null +++ b/shared/data/community/src/androidHostTest/kotlin/com/kus/data/community/ExampleUnitTest.kt @@ -0,0 +1,16 @@ +package com.kus.data.community + +import kotlin.test.Test +import kotlin.test.assertEquals + +/** + * Example local unit test, which will execute on the development machine (host). + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +class ExampleUnitTest { + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} \ No newline at end of file diff --git a/shared/data/community/src/androidMain/AndroidManifest.xml b/shared/data/community/src/androidMain/AndroidManifest.xml new file mode 100644 index 00000000..a5918e68 --- /dev/null +++ b/shared/data/community/src/androidMain/AndroidManifest.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/shared/data/community/src/androidMain/kotlin/com/kus/data/community/AndroidPlatformImageResolver.kt b/shared/data/community/src/androidMain/kotlin/com/kus/data/community/AndroidPlatformImageResolver.kt new file mode 100644 index 00000000..75779833 --- /dev/null +++ b/shared/data/community/src/androidMain/kotlin/com/kus/data/community/AndroidPlatformImageResolver.kt @@ -0,0 +1,40 @@ +package com.kus.data.community + +import android.content.Context +import android.provider.OpenableColumns +import com.kus.data.community.model.ResolvedImage +import androidx.core.net.toUri +import com.kus.domain.community.model.UploadImageException + +class AndroidPlatformImageResolver( + private val context: Context, + private val maxBytes: Long = 1_048_576L, +) : PlatformImageResolver { + + override suspend fun resolve(imagePath: String): ResolvedImage { + val uri = imagePath.toUri() + val resolver = context.contentResolver + + val mime = resolver.getType(uri) ?: "image/*" + val bytes = resolver.openInputStream(uri)?.use { it.readBytes() } + ?: throw UploadImageException.ReadFailed() + + if (bytes.size.toLong() > maxBytes) { + throw UploadImageException.TooLarge(maxBytes) + } + + val fileName: String = resolver + .query(uri, arrayOf(OpenableColumns.DISPLAY_NAME), null, null, null) + ?.use { cursor -> + if (cursor.moveToFirst()) { + cursor.getString( + cursor.getColumnIndexOrThrow(OpenableColumns.DISPLAY_NAME) + ) + } else null + } + ?.takeIf { it.isNotBlank() } + ?: "image_${System.currentTimeMillis()}.jpg" + + return ResolvedImage(bytes = bytes, mimeType = mime, fileName = fileName) + } +} \ No newline at end of file diff --git a/shared/data/community/src/androidMain/kotlin/com/kus/data/community/Platform.android.kt b/shared/data/community/src/androidMain/kotlin/com/kus/data/community/Platform.android.kt new file mode 100644 index 00000000..503af1fc --- /dev/null +++ b/shared/data/community/src/androidMain/kotlin/com/kus/data/community/Platform.android.kt @@ -0,0 +1,3 @@ +package com.kus.data.community + +actual fun platform() = "Android" \ No newline at end of file diff --git a/shared/data/community/src/androidMain/kotlin/com/kus/data/community/currentTimeMillis.android.kt b/shared/data/community/src/androidMain/kotlin/com/kus/data/community/currentTimeMillis.android.kt new file mode 100644 index 00000000..56227348 --- /dev/null +++ b/shared/data/community/src/androidMain/kotlin/com/kus/data/community/currentTimeMillis.android.kt @@ -0,0 +1,3 @@ +package com.kus.data.community + +actual fun currentTimeMillis(): Long = System.currentTimeMillis() diff --git a/shared/data/community/src/androidMain/kotlin/com/kus/data/community/di/androidDataCommunityModule.kt b/shared/data/community/src/androidMain/kotlin/com/kus/data/community/di/androidDataCommunityModule.kt new file mode 100644 index 00000000..abf49544 --- /dev/null +++ b/shared/data/community/src/androidMain/kotlin/com/kus/data/community/di/androidDataCommunityModule.kt @@ -0,0 +1,10 @@ +package com.kus.data.community.di + +import android.content.Context +import com.kus.data.community.AndroidPlatformImageResolver +import com.kus.data.community.PlatformImageResolver +import org.koin.dsl.module + +val androidDataCommunityModule = module { + single { AndroidPlatformImageResolver(get().applicationContext) } +} \ No newline at end of file diff --git a/shared/data/community/src/commonMain/kotlin/com/kus/data/community/Platform.kt b/shared/data/community/src/commonMain/kotlin/com/kus/data/community/Platform.kt new file mode 100644 index 00000000..6d014db3 --- /dev/null +++ b/shared/data/community/src/commonMain/kotlin/com/kus/data/community/Platform.kt @@ -0,0 +1,3 @@ +package com.kus.data.community + +expect fun platform(): String \ No newline at end of file diff --git a/shared/data/community/src/commonMain/kotlin/com/kus/data/community/PlatformImageResolver.kt b/shared/data/community/src/commonMain/kotlin/com/kus/data/community/PlatformImageResolver.kt new file mode 100644 index 00000000..44ac7880 --- /dev/null +++ b/shared/data/community/src/commonMain/kotlin/com/kus/data/community/PlatformImageResolver.kt @@ -0,0 +1,7 @@ +package com.kus.data.community + +import com.kus.data.community.model.ResolvedImage + +interface PlatformImageResolver { + suspend fun resolve(imagePath: String): ResolvedImage +} \ No newline at end of file diff --git a/shared/data/community/src/commonMain/kotlin/com/kus/data/community/api/CommunityApi.kt b/shared/data/community/src/commonMain/kotlin/com/kus/data/community/api/CommunityApi.kt new file mode 100644 index 00000000..731720ea --- /dev/null +++ b/shared/data/community/src/commonMain/kotlin/com/kus/data/community/api/CommunityApi.kt @@ -0,0 +1,159 @@ +package com.kus.data.community.api + +import com.kus.data.community.remote.request.PostCommentRequest +import com.kus.data.community.remote.request.PostRequest +import com.kus.data.community.remote.response.CommunityCommentReactionResponse +import com.kus.data.community.remote.response.CommunityCreatePostResponse +import com.kus.data.community.remote.response.CommunityPostCommentResponse +import com.kus.data.community.remote.response.CommunityPostLikeResponse +import com.kus.data.community.remote.response.CommunityPostListItemResponse +import com.kus.data.community.remote.response.CommunityPostResponse +import com.kus.data.community.remote.response.CommunityPostScrapResponse +import com.kus.data.community.remote.response.CommunityPostUploadImageResponse +import com.kus.data.community.remote.response.CommunityRankingResponse +import com.kus.data.community.remote.response.PostResponse +import com.kus.domain.community.model.AuthUserInfo +import io.ktor.client.HttpClient +import io.ktor.client.call.body +import io.ktor.client.request.delete +import io.ktor.client.request.forms.formData +import io.ktor.client.request.forms.submitFormWithBinaryData +import io.ktor.client.request.get +import io.ktor.client.request.headers +import io.ktor.client.request.parameter +import io.ktor.client.request.patch +import io.ktor.client.request.post +import io.ktor.client.request.put +import io.ktor.client.request.setBody +import io.ktor.client.statement.bodyAsText +import io.ktor.http.ContentType +import io.ktor.http.Headers +import io.ktor.http.HttpHeaders +import io.ktor.http.contentType +import io.ktor.http.isSuccess + +class CommunityApi( + private val client: HttpClient, +) { + suspend fun getCommunityPostDetailData( + postId: Long, + deviceId: String? + ): CommunityPostResponse = + client.get("/api/v2/community/$postId") { + deviceId?.let { + headers { append("X-device-id", it) } + } + }.body() + + suspend fun getCommunityPostListData( + category: String, + page: Int, + sort: String + ): List = + client.get("/api/v2/community/posts") { + parameter("category", category) + parameter("page", page) + parameter("sort", sort) + }.body() + + suspend fun deletePostComment(commentId: Long) { + client.delete("/api/v2/auth/comments/$commentId") + } + + suspend fun postCommunityPostCommentReply( + postId: Long, + postCommentRequest: PostCommentRequest + ): CommunityPostCommentResponse = + client.post("/api/v2/auth/posts/$postId/comments") { + contentType(ContentType.Application.Json) + setBody(postCommentRequest) + }.body() + + suspend fun putCommentLikeToggle( + commentId: Long, + reaction: String? + ): CommunityCommentReactionResponse = + client.put("/api/v2/auth/community/comments/$commentId/reaction") { + // reaction이 null이면 쿼리를 아예 빼는게 안전 + if (reaction != null) parameter("reaction", reaction) + }.body() + + suspend fun postPostCreate( + postRequest: PostRequest + ): CommunityCreatePostResponse = + client.post("/api/v2/auth/community/posts") { + contentType(ContentType.Application.Json) + setBody(postRequest) + }.body() + + suspend fun patchModifyPost( + postId: String, + postRequest: PostRequest + ) { + client.patch("/api/v2/auth/community/posts/$postId") { + contentType(ContentType.Application.Json) + setBody(postRequest) + } + } + + suspend fun getModifyPost( + postId: Long, + user: AuthUserInfo, + ): PostResponse = + client.get("/api/v2/auth/community/posts/$postId") { + parameter("id", user.id) + parameter("role", user.role) + }.body() + + suspend fun deletePost(postId: Long) { + client.delete("/api/v2/auth/community/posts/$postId") + } + + suspend fun postCommunityUploadImage( + imageBytes: ByteArray, + fileName: String, + mimeType: String = "image/jpeg", + ): CommunityPostUploadImageResponse { + val response = client.submitFormWithBinaryData( + url = "/api/v2/auth/community/posts/image", + formData = formData { + append( + key = "image", + value = imageBytes, + headers = Headers.build { + append(HttpHeaders.ContentType, mimeType) + append(HttpHeaders.ContentDisposition, "filename=\"$fileName\"") + } + ) + } + ) + + if (!response.status.isSuccess()) { + val err = response.bodyAsText() // 에러 JSON 그대로 + throw IllegalStateException("Upload failed: HTTP ${response.status.value} ${response.status.description} body=$err") + } + + return response.body() + } + + suspend fun postCommunityPostLikeToggle( + postId: Long, + cmd: String? + ): CommunityPostLikeResponse = + client.put("/api/v2/auth/community/$postId/reaction") { + if (cmd != null) parameter("cmd", cmd) + }.body() + + suspend fun postCommunityPostDetailScrap( + postId: Long, + scrapped: Boolean + ): CommunityPostScrapResponse = + client.post("/api/v2/auth/community/$postId/scraps") { + parameter("scrapped", scrapped) + }.body() + + suspend fun getCommunityRankingListData(sort: String): List = + client.get("/api/v2/community/ranking") { + parameter("sort", sort) + }.body() +} \ No newline at end of file diff --git a/shared/data/community/src/commonMain/kotlin/com/kus/data/community/currentTimeMillis.kt b/shared/data/community/src/commonMain/kotlin/com/kus/data/community/currentTimeMillis.kt new file mode 100644 index 00000000..dadafdba --- /dev/null +++ b/shared/data/community/src/commonMain/kotlin/com/kus/data/community/currentTimeMillis.kt @@ -0,0 +1,4 @@ +package com.kus.data.community + + +expect fun currentTimeMillis(): Long diff --git a/shared/data/community/src/commonMain/kotlin/com/kus/data/community/di/communityDataModule.kt b/shared/data/community/src/commonMain/kotlin/com/kus/data/community/di/communityDataModule.kt new file mode 100644 index 00000000..f210d10f --- /dev/null +++ b/shared/data/community/src/commonMain/kotlin/com/kus/data/community/di/communityDataModule.kt @@ -0,0 +1,17 @@ +package com.kus.data.community.di + +import com.kus.data.community.api.CommunityApi +import com.kus.data.community.repository.CommunityRepositoryImpl +import com.kus.domain.community.repository.CommunityRepository +import okio.FileSystem +import okio.SYSTEM +import org.koin.core.module.dsl.singleOf +import org.koin.dsl.bind +import org.koin.dsl.module + +val communityDataModule = module { + single { FileSystem.SYSTEM } + + singleOf(::CommunityApi) + singleOf(::CommunityRepositoryImpl) bind CommunityRepository::class +} \ No newline at end of file diff --git a/shared/data/community/src/commonMain/kotlin/com/kus/data/community/mapper/CommunityMapper.kt b/shared/data/community/src/commonMain/kotlin/com/kus/data/community/mapper/CommunityMapper.kt new file mode 100644 index 00000000..82f4f731 --- /dev/null +++ b/shared/data/community/src/commonMain/kotlin/com/kus/data/community/mapper/CommunityMapper.kt @@ -0,0 +1,118 @@ +package com.kus.data.community.mapper + +import com.kus.data.community.remote.response.CommunityCommentReactionResponse +import com.kus.data.community.remote.response.CommunityPostCommentResponse +import com.kus.data.community.remote.response.CommunityPostLikeResponse +import com.kus.data.community.remote.response.CommunityPostListItemResponse +import com.kus.data.community.remote.response.CommunityPostResponse +import com.kus.data.community.remote.response.CommunityPostScrapResponse +import com.kus.data.community.remote.response.CommunityRankingResponse +import com.kus.data.community.remote.response.PostResponse +import com.kus.domain.community.model.CommunityCommentReaction +import com.kus.domain.community.model.CommunityPost +import com.kus.domain.community.model.CommunityPostComment +import com.kus.domain.community.model.CommunityPostLike +import com.kus.domain.community.model.CommunityPostListItem +import com.kus.domain.community.model.CommunityPostScrap +import com.kus.domain.community.model.CommunityRanking +import com.kus.domain.community.model.PostModification + +fun CommunityPostResponse.toDomain(): CommunityPost = + CommunityPost( + postId = postId, + category = category.toDomain(), + title = title, + body = body, + photoUrls = photoUrls, + writerId = writerId, + nickname = nickname, + evalCount = evalCount, + writerIconUrl = writerIconUrl, + timeAgo = timeAgo, + createdAt = createdAt, + updatedAt = updatedAt, + likeOnlyCount = likeOnlyCount, + dislikeOnlyCount = dislikeOnlyCount, + totalLikes = totalLikes, + commentCount = commentCount, + scrapCount = scrapCount, + visitCount = visitCount, + myReaction = myReaction, + isScrapped = isScrapped, + isPostMine = isPostMine, + comments = comments?.map { it.toDomain() }.orEmpty() + ) + +fun PostResponse.toDomain() : PostModification { + return PostModification( + postId = postId, + category = category.toDomain(), + title = title, + body = body, + photoUrls = photoUrls + ) +} + +fun CommunityPostCommentResponse.toDomain(): CommunityPostComment = + CommunityPostComment( + commentId = commentId, + parentCommentId = parentCommentId, + body = body, + status = status, + likeCount = likeCount, + dislikeCount = dislikeCount, + repliesList = replies?.map { it.toDomain() }.orEmpty(), + timeAgo = timeAgo, + reactionType = reactionType, + isCommentMine = isCommentMine, + writerId = writeruserId, + nickname = writernickname, + evalCount = writerevalCount, + writerIconUrl = writericonUrl, + ) + +fun CommunityCommentReactionResponse.toDomain(): CommunityCommentReaction = + CommunityCommentReaction( + likeCount = likeCount, + dislikeCount = dislikeCount, + reactionType = reactionType + ) + +fun CommunityPostScrapResponse.toDomain(): CommunityPostScrap = + CommunityPostScrap( + postScrapCount = postScrapCount, + isScrapped = isScrapped + ) + +fun CommunityPostLikeResponse.toDomain(): CommunityPostLike = + CommunityPostLike( + reactionType = reactionType, + likeCount = likeCount, + dislikeCount = dislikeCount, + netLikes = netLikes + ) + +fun CommunityPostListItemResponse.toDomain(): CommunityPostListItem = + CommunityPostListItem( + postId = postId, + category = category, + title = title, + body = body, + writerId = writerId, + nickname = nickname, + evalCount = evalCount, + writerIconUrl = writerIconUrl, + photoUrl = photoUrl, + timeAgo = timeAgo, + totalLikes = totalLikes, + commentCount = commentCount + ) + +fun CommunityRankingResponse.toDomain() : CommunityRanking = + CommunityRanking( + userId = userId, + nickname = nickname, + iconUrl = iconUrl, + evaluationCount = evaluationCount, + rank = rank + ) \ No newline at end of file diff --git a/shared/data/community/src/commonMain/kotlin/com/kus/data/community/model/ResolvedImage.kt b/shared/data/community/src/commonMain/kotlin/com/kus/data/community/model/ResolvedImage.kt new file mode 100644 index 00000000..3e14736d --- /dev/null +++ b/shared/data/community/src/commonMain/kotlin/com/kus/data/community/model/ResolvedImage.kt @@ -0,0 +1,7 @@ +package com.kus.data.community.model + +data class ResolvedImage( + val bytes: ByteArray, + val mimeType: String, + val fileName: String, +) \ No newline at end of file diff --git a/shared/data/community/src/commonMain/kotlin/com/kus/data/community/remote/request/PostCategoryRequest.kt b/shared/data/community/src/commonMain/kotlin/com/kus/data/community/remote/request/PostCategoryRequest.kt new file mode 100644 index 00000000..ccb5a1cd --- /dev/null +++ b/shared/data/community/src/commonMain/kotlin/com/kus/data/community/remote/request/PostCategoryRequest.kt @@ -0,0 +1,22 @@ +package com.kus.data.community.remote.request + +import kotlinx.serialization.SerialName +import com.kus.domain.community.model.PostCategory + +enum class PostCategoryRequest{ + @SerialName("전체게시판") + ALL, + @SerialName("자유게시판") + FREE, + @SerialName("칼럼게시판") + COLUMN, + @SerialName("건의게시판") + SUGGESTION; + + fun toDomain(): PostCategory = when (this) { + ALL -> PostCategory.ALL + FREE -> PostCategory.FREE + COLUMN -> PostCategory.COLUMN + SUGGESTION -> PostCategory.SUGGESTION + } +} \ No newline at end of file diff --git a/shared/data/community/src/commonMain/kotlin/com/kus/data/community/remote/request/PostCommentRequest.kt b/shared/data/community/src/commonMain/kotlin/com/kus/data/community/remote/request/PostCommentRequest.kt new file mode 100644 index 00000000..5ac9e994 --- /dev/null +++ b/shared/data/community/src/commonMain/kotlin/com/kus/data/community/remote/request/PostCommentRequest.kt @@ -0,0 +1,13 @@ +package com.kus.data.community.remote.request + +import kotlinx.serialization.Serializable + +@Serializable +data class PostCommentRequest( + val content : String, + val parentCommentId : Long?, +) { + init{ + require(content.length in 1..1000) { "Content must be between 1 and 1000 characters." } + } +} \ No newline at end of file diff --git a/shared/data/community/src/commonMain/kotlin/com/kus/data/community/remote/request/PostRequest.kt b/shared/data/community/src/commonMain/kotlin/com/kus/data/community/remote/request/PostRequest.kt new file mode 100644 index 00000000..e12892ee --- /dev/null +++ b/shared/data/community/src/commonMain/kotlin/com/kus/data/community/remote/request/PostRequest.kt @@ -0,0 +1,15 @@ +package com.kus.data.community.remote.request + +import kotlinx.serialization.Serializable + +@Serializable +data class PostRequest( + val title: String, + val category: String, + val content: String +) { + init { + require(title.length in 1..100) { "Title must be between 1 and 100 characters." } + require(content.length in 1..10000) { "Content must be between 1 and 10000 characters." } + } +} \ No newline at end of file diff --git a/shared/data/community/src/commonMain/kotlin/com/kus/data/community/remote/response/CommunityCommentReactionResponse.kt b/shared/data/community/src/commonMain/kotlin/com/kus/data/community/remote/response/CommunityCommentReactionResponse.kt new file mode 100644 index 00000000..b89e5c99 --- /dev/null +++ b/shared/data/community/src/commonMain/kotlin/com/kus/data/community/remote/response/CommunityCommentReactionResponse.kt @@ -0,0 +1,10 @@ +package com.kus.data.community.remote.response + +import kotlinx.serialization.Serializable + +@Serializable +data class CommunityCommentReactionResponse( + val likeCount : Int, + val dislikeCount : Int, + val reactionType : String?, +) \ No newline at end of file diff --git a/shared/data/community/src/commonMain/kotlin/com/kus/data/community/remote/response/CommunityCreatePostResponse.kt b/shared/data/community/src/commonMain/kotlin/com/kus/data/community/remote/response/CommunityCreatePostResponse.kt new file mode 100644 index 00000000..b6c45bce --- /dev/null +++ b/shared/data/community/src/commonMain/kotlin/com/kus/data/community/remote/response/CommunityCreatePostResponse.kt @@ -0,0 +1,40 @@ +package com.kus.data.community.remote.response + +import com.kus.data.community.remote.request.PostCategoryRequest +import com.kus.domain.community.model.CommunityPost +import kotlinx.serialization.Serializable + +@Serializable +data class CommunityCreatePostResponse( + val postId: Long, + val category: PostCategoryRequest, + val title: String, + val body: String, + val photoUrls: List?, +) + +fun CommunityCreatePostResponse.toDomain() : CommunityPost = + CommunityPost( + postId = postId, + category = category.toDomain(), + title = title, + body = body, + photoUrls = photoUrls, + writerId = -1L, + nickname = "", + evalCount = 0L, + createdAt = "", + likeOnlyCount = 0L, + dislikeOnlyCount = 0L, + totalLikes = 0L, + commentCount = 0L, + scrapCount = 0L, + visitCount = 0L, + isScrapped = false, + isPostMine = true, + writerIconUrl = null, + timeAgo = "", + updatedAt = null, + myReaction = null, + comments = null, + ) \ No newline at end of file diff --git a/shared/data/community/src/commonMain/kotlin/com/kus/data/community/remote/response/CommunityPostCommentResponse.kt b/shared/data/community/src/commonMain/kotlin/com/kus/data/community/remote/response/CommunityPostCommentResponse.kt new file mode 100644 index 00000000..20e6f1b0 --- /dev/null +++ b/shared/data/community/src/commonMain/kotlin/com/kus/data/community/remote/response/CommunityPostCommentResponse.kt @@ -0,0 +1,24 @@ +package com.kus.data.community.remote.response + +import kotlinx.serialization.Serializable + +@Serializable +data class CommunityPostCommentResponse( + val commentId: Long, + val parentCommentId: Long?, + val body: String, + val status: String, + val likeCount: Int, + val dislikeCount: Int, + val createdAt : String?, + val updatedAt : String?, + val timeAgo: String, + val reactionType: String?, + val isCommentMine: Boolean, + val replyCount: Int = 0, + val replies: List?, + val writeruserId: Long?, + val writernickname: String?, + val writerevalCount: Long?, + val writericonUrl: String?, +) \ No newline at end of file diff --git a/shared/data/community/src/commonMain/kotlin/com/kus/data/community/remote/response/CommunityPostLikeResponse.kt b/shared/data/community/src/commonMain/kotlin/com/kus/data/community/remote/response/CommunityPostLikeResponse.kt new file mode 100644 index 00000000..fa9a1baf --- /dev/null +++ b/shared/data/community/src/commonMain/kotlin/com/kus/data/community/remote/response/CommunityPostLikeResponse.kt @@ -0,0 +1,11 @@ +package com.kus.data.community.remote.response + +import kotlinx.serialization.Serializable + +@Serializable +data class CommunityPostLikeResponse( + val reactionType : String?, + val likeCount : Int, + val dislikeCount : Int, + val netLikes : Int, +) \ No newline at end of file diff --git a/shared/data/community/src/commonMain/kotlin/com/kus/data/community/remote/response/CommunityPostListItemResponse.kt b/shared/data/community/src/commonMain/kotlin/com/kus/data/community/remote/response/CommunityPostListItemResponse.kt new file mode 100644 index 00000000..1310b23c --- /dev/null +++ b/shared/data/community/src/commonMain/kotlin/com/kus/data/community/remote/response/CommunityPostListItemResponse.kt @@ -0,0 +1,20 @@ +package com.kus.data.community.remote.response + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class CommunityPostListItemResponse( + val postId: Long, + val category: String, + val title: String, + val body: String, + @SerialName("writeruserId") val writerId: Long, + @SerialName("writernickname") val nickname: String, + @SerialName("writerevalCount") val evalCount: Long, + @SerialName("writericonUrl") val writerIconUrl: String?, + val photoUrl: String?, + val timeAgo: String, + val totalLikes: Long, + val commentCount: Long, +) diff --git a/shared/data/community/src/commonMain/kotlin/com/kus/data/community/remote/response/CommunityPostResponse.kt b/shared/data/community/src/commonMain/kotlin/com/kus/data/community/remote/response/CommunityPostResponse.kt new file mode 100644 index 00000000..62c679ca --- /dev/null +++ b/shared/data/community/src/commonMain/kotlin/com/kus/data/community/remote/response/CommunityPostResponse.kt @@ -0,0 +1,36 @@ +package com.kus.data.community.remote.response + +import com.kus.data.community.remote.request.PostCategoryRequest +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class CommunityPostResponse( + val postId: Long= 0L, + val category: PostCategoryRequest, + val title: String, + val body: String, + val photoUrls: List?, + + @SerialName("writeruserId")val writerId: Long, + @SerialName("writernickname")val nickname: String, + @SerialName("writerevalCount")val evalCount: Long, + @SerialName("writericonUrl")val writerIconUrl: String?, + + val timeAgo: String, + val createdAt: String, + val updatedAt: String?, + + val likeOnlyCount: Long, + val dislikeOnlyCount: Long, + val totalLikes: Long, + val commentCount: Long, + val scrapCount: Long, + val visitCount: Long, + + val myReaction: String?, + val isScrapped: Boolean, + val isPostMine: Boolean, + + val comments: List? +) \ No newline at end of file diff --git a/shared/data/community/src/commonMain/kotlin/com/kus/data/community/remote/response/CommunityPostScrapResponse.kt b/shared/data/community/src/commonMain/kotlin/com/kus/data/community/remote/response/CommunityPostScrapResponse.kt new file mode 100644 index 00000000..dd31da36 --- /dev/null +++ b/shared/data/community/src/commonMain/kotlin/com/kus/data/community/remote/response/CommunityPostScrapResponse.kt @@ -0,0 +1,9 @@ +package com.kus.data.community.remote.response + +import kotlinx.serialization.Serializable + +@Serializable +data class CommunityPostScrapResponse( + val postScrapCount : Int, + val isScrapped : Boolean, +) \ No newline at end of file diff --git a/shared/data/community/src/commonMain/kotlin/com/kus/data/community/remote/response/CommunityPostUploadImageResponse.kt b/shared/data/community/src/commonMain/kotlin/com/kus/data/community/remote/response/CommunityPostUploadImageResponse.kt new file mode 100644 index 00000000..1c422753 --- /dev/null +++ b/shared/data/community/src/commonMain/kotlin/com/kus/data/community/remote/response/CommunityPostUploadImageResponse.kt @@ -0,0 +1,8 @@ +package com.kus.data.community.remote.response + +import kotlinx.serialization.Serializable + +@Serializable +data class CommunityPostUploadImageResponse( + val imgUrl: String +) \ No newline at end of file diff --git a/shared/data/community/src/commonMain/kotlin/com/kus/data/community/remote/response/CommunityRankingResponse.kt b/shared/data/community/src/commonMain/kotlin/com/kus/data/community/remote/response/CommunityRankingResponse.kt new file mode 100644 index 00000000..ac6c4ccc --- /dev/null +++ b/shared/data/community/src/commonMain/kotlin/com/kus/data/community/remote/response/CommunityRankingResponse.kt @@ -0,0 +1,12 @@ +package com.kus.data.community.remote.response + +import kotlinx.serialization.Serializable + +@Serializable +class CommunityRankingResponse( + val userId : Long, + val nickname : String, + val iconUrl : String, + val evaluationCount: Int, + val rank: Int, +) \ No newline at end of file diff --git a/shared/data/community/src/commonMain/kotlin/com/kus/data/community/remote/response/PostResponse.kt b/shared/data/community/src/commonMain/kotlin/com/kus/data/community/remote/response/PostResponse.kt new file mode 100644 index 00000000..d7d1ed7a --- /dev/null +++ b/shared/data/community/src/commonMain/kotlin/com/kus/data/community/remote/response/PostResponse.kt @@ -0,0 +1,11 @@ +package com.kus.data.community.remote.response + +import com.kus.data.community.remote.request.PostCategoryRequest + +data class PostResponse( + val postId: Long, + val category: PostCategoryRequest, + val title: String, + val body: String, + val photoUrls: List +) \ No newline at end of file diff --git a/shared/data/community/src/commonMain/kotlin/com/kus/data/community/repository/CommunityRepositoryImpl.kt b/shared/data/community/src/commonMain/kotlin/com/kus/data/community/repository/CommunityRepositoryImpl.kt new file mode 100644 index 00000000..c0a289d1 --- /dev/null +++ b/shared/data/community/src/commonMain/kotlin/com/kus/data/community/repository/CommunityRepositoryImpl.kt @@ -0,0 +1,119 @@ +package com.kus.data.community.repository + +import com.kus.data.community.PlatformImageResolver +import com.kus.data.community.api.CommunityApi +import com.kus.data.community.mapper.toDomain +import com.kus.data.community.remote.request.PostCommentRequest +import com.kus.data.community.remote.request.PostRequest +import com.kus.data.community.remote.response.toDomain +import com.kus.domain.auth.repository.DeviceIdManager +import com.kus.domain.community.model.AuthUserInfo +import com.kus.domain.community.model.CommunityCommentReaction +import com.kus.domain.community.model.CommunityPost +import com.kus.domain.community.model.CommunityPostComment +import com.kus.domain.community.model.CommunityPostLike +import com.kus.domain.community.model.CommunityPostListItem +import com.kus.domain.community.model.CommunityPostScrap +import com.kus.domain.community.model.CommunityRanking +import com.kus.domain.community.model.LikeEvent +import com.kus.domain.community.model.ListSortType +import com.kus.domain.community.model.PostCategory +import com.kus.domain.community.model.PostModification +import com.kus.domain.community.model.RankingSortType +import com.kus.domain.community.repository.CommunityRepository + +class CommunityRepositoryImpl( + private val communityApi: CommunityApi, + private val deviceIdManager: DeviceIdManager, + private val resolver: PlatformImageResolver, +) : CommunityRepository { + + override suspend fun postUploadImage(imagePath: String): String { + val resolved = resolver.resolve(imagePath) + return communityApi.postCommunityUploadImage( + imageBytes = resolved.bytes, + fileName = resolved.fileName, + ).imgUrl + } + + override suspend fun getPostList( + postCategory: PostCategory, + page: Int, + sort: ListSortType + ): List { + return communityApi.getCommunityPostListData( + category = postCategory.value, + page = page, + sort = sort.value + ).map{it.toDomain()} + } + + override suspend fun getRankingList(sort: RankingSortType): List { + return communityApi.getCommunityRankingListData(sort.value).map {it.toDomain()} + } + + override suspend fun getPostDetail(postId: Long, isLoggedIn: Boolean): CommunityPost { + val deviceId = if (isLoggedIn) null else deviceIdManager.getOrCreateDeviceId() + return communityApi.getCommunityPostDetailData(postId, deviceId).toDomain() + } + + override suspend fun postPostCreate( + title: String, + postCategory: PostCategory, + content: String + ): CommunityPost { + val request = PostRequest(title, postCategory.value, content) + return communityApi.postPostCreate(request).toDomain() + } + + override suspend fun postPostDetailScrap(postId: Long, scrapped: Boolean): CommunityPostScrap { + return communityApi.postCommunityPostDetailScrap(postId, scrapped).toDomain() + } + + override suspend fun postPostLikeToggle(postId: Long, likeEvent: LikeEvent?): CommunityPostLike { + return communityApi.postCommunityPostLikeToggle(postId, likeEvent?.value).toDomain() + } + + override suspend fun patchPostModify( + postId: String, + title: String, + postCategory: PostCategory, + content: String + ) { + val request = PostRequest(title, postCategory.value, content) + communityApi.patchModifyPost(postId, request) + } + + override suspend fun getPostModify( + postId: Long, + user: AuthUserInfo, + ): PostModification { + return communityApi + .getModifyPost(postId = postId, user = user) + .toDomain() + } + + override suspend fun postCommunityCommentReply( + postId: Long, + content: String, + parentCommentId: Long? + ): CommunityPostComment { + val request = PostCommentRequest(content, parentCommentId) + return communityApi.postCommunityPostCommentReply(postId, request).toDomain() + } + + override suspend fun postCommentLikeToggle( + commentId: Long, + reaction: LikeEvent? + ): CommunityCommentReaction { + return communityApi.putCommentLikeToggle(commentId, reaction?.value).toDomain() + } + + override suspend fun deletePost(postId: Long) { + communityApi.deletePost(postId) + } + + override suspend fun deleteCommunityComment(commentId: Long) { + communityApi.deletePostComment(commentId) + } +} diff --git a/shared/data/community/src/desktopMain/kotlin/com/kus/data/community/Platform.desktop.kt b/shared/data/community/src/desktopMain/kotlin/com/kus/data/community/Platform.desktop.kt new file mode 100644 index 00000000..d097a23d --- /dev/null +++ b/shared/data/community/src/desktopMain/kotlin/com/kus/data/community/Platform.desktop.kt @@ -0,0 +1,3 @@ +package com.kus.data.community + +actual fun platform(): String = "Desktop" \ No newline at end of file diff --git a/shared/data/community/src/desktopMain/kotlin/com/kus/data/community/currentTimeMillis.desktop.kt b/shared/data/community/src/desktopMain/kotlin/com/kus/data/community/currentTimeMillis.desktop.kt new file mode 100644 index 00000000..f570d82a --- /dev/null +++ b/shared/data/community/src/desktopMain/kotlin/com/kus/data/community/currentTimeMillis.desktop.kt @@ -0,0 +1,5 @@ +package com.kus.data.community + +actual fun currentTimeMillis(): Long { + TODO("Not yet implemented") +} \ No newline at end of file diff --git a/shared/data/community/src/iosMain/kotlin/com/kus/data/community/Platform.ios.kt b/shared/data/community/src/iosMain/kotlin/com/kus/data/community/Platform.ios.kt new file mode 100644 index 00000000..ed03dc51 --- /dev/null +++ b/shared/data/community/src/iosMain/kotlin/com/kus/data/community/Platform.ios.kt @@ -0,0 +1,3 @@ +package com.kus.data.community + +actual fun platform() = "iOS" \ No newline at end of file diff --git a/shared/data/community/src/iosMain/kotlin/com/kus/data/community/currentTimeMillis.ios.kt b/shared/data/community/src/iosMain/kotlin/com/kus/data/community/currentTimeMillis.ios.kt new file mode 100644 index 00000000..84e7c386 --- /dev/null +++ b/shared/data/community/src/iosMain/kotlin/com/kus/data/community/currentTimeMillis.ios.kt @@ -0,0 +1,8 @@ +package com.kus.data.community + + +import platform.Foundation.NSDate +import platform.Foundation.timeIntervalSince1970 + +actual fun currentTimeMillis(): Long = + (NSDate().timeIntervalSince1970 * 1000).toLong() diff --git a/shared/data/network/build.gradle.kts b/shared/data/network/build.gradle.kts index d909c152..f4d70901 100644 --- a/shared/data/network/build.gradle.kts +++ b/shared/data/network/build.gradle.kts @@ -47,6 +47,7 @@ kotlin { implementation(libs.bundles.ktor) implementation(project(":shared:core:config")) + implementation(project(":shared:domain:auth")) } } diff --git a/shared/data/network/src/commonMain/kotlin/com/kus/data/network/auth/TokenManager.kt b/shared/data/network/src/commonMain/kotlin/com/kus/data/network/auth/TokenManager.kt index 9f152182..0478f3bf 100644 --- a/shared/data/network/src/commonMain/kotlin/com/kus/data/network/auth/TokenManager.kt +++ b/shared/data/network/src/commonMain/kotlin/com/kus/data/network/auth/TokenManager.kt @@ -1,8 +1,12 @@ package com.kus.data.network.auth +import com.kus.data.network.model.RefreshResult + interface TokenManager { suspend fun loadAccessToken(): String - suspend fun refreshAndGetNewAccessToken(): String + suspend fun loadRefreshToken(): String + + suspend fun refreshAndGetNewAccessToken(): RefreshResult } diff --git a/shared/data/network/src/commonMain/kotlin/com/kus/data/network/creatApiHttpClient.kt b/shared/data/network/src/commonMain/kotlin/com/kus/data/network/creatApiHttpClient.kt index 56b112ed..ec372dd7 100644 --- a/shared/data/network/src/commonMain/kotlin/com/kus/data/network/creatApiHttpClient.kt +++ b/shared/data/network/src/commonMain/kotlin/com/kus/data/network/creatApiHttpClient.kt @@ -1,9 +1,13 @@ package com.kus.data.network import com.kus.data.network.auth.TokenManager +import com.kus.data.network.model.RefreshResult +import com.kus.domain.auth.session.SessionEvent +import com.kus.domain.auth.session.SessionEventEmitter import io.ktor.client.HttpClient import io.ktor.client.HttpClientConfig import io.ktor.client.engine.HttpClientEngine +import io.ktor.client.plugins.HttpSend import io.ktor.client.plugins.HttpTimeout import io.ktor.client.plugins.auth.Auth import io.ktor.client.plugins.auth.providers.BearerTokens @@ -14,6 +18,7 @@ import io.ktor.client.plugins.logging.LogLevel import io.ktor.client.plugins.logging.Logger import io.ktor.client.plugins.logging.Logging import io.ktor.client.plugins.logging.SIMPLE +import io.ktor.client.plugins.plugin import io.ktor.http.encodedPath import io.ktor.http.takeFrom import io.ktor.serialization.kotlinx.json.json @@ -24,62 +29,81 @@ fun creatApiHttpClient( tokenManager: TokenManager, isDebug: Boolean = true, baseUrl: String, + sessionEvents: SessionEventEmitter, additionalConfig: HttpClientConfig<*>.() -> Unit = {} -): HttpClient = HttpClient(engine = engine) { - defaultRequest { - url.takeFrom(baseUrl) - } +): HttpClient { + val client = HttpClient(engine = engine) { - expectSuccess = false + defaultRequest { url.takeFrom(baseUrl) } + expectSuccess = false - if (isDebug) { - install(Logging) { - logger = Logger.SIMPLE - level = LogLevel.BODY + if (isDebug) { + install(Logging) { logger = Logger.SIMPLE; level = LogLevel.BODY } } - } - install(ContentNegotiation) { - json( - Json { - ignoreUnknownKeys = true - explicitNulls = false - isLenient = true - } - ) - } + install(ContentNegotiation) { + json(Json { ignoreUnknownKeys = true; explicitNulls = false; isLenient = true }) + } - install(HttpTimeout) { - requestTimeoutMillis = 15_000 - connectTimeoutMillis = 10_000 - socketTimeoutMillis = 15_000 - } + install(HttpTimeout) { + requestTimeoutMillis = 15_000 + connectTimeoutMillis = 10_000 + socketTimeoutMillis = 15_000 + } - install(Auth) { - bearer { - sendWithoutRequest { request -> - val path = request.url.encodedPath - path.startsWith("/api/v2/login/naver") || - path.startsWith("/api/v2/token/refresh") - } + install(Auth) { + bearer { + sendWithoutRequest { request -> + val path = request.url.encodedPath + val isPublic = + path.startsWith("/api/v2/login/naver") || + path.startsWith("/api/v2/token/refresh") + !isPublic + } - loadTokens { - tokenManager.loadAccessToken() - .takeIf {it.isNotBlank() } - ?.let { access -> - BearerTokens(accessToken = access, refreshToken = "") + loadTokens { + val access = tokenManager.loadAccessToken() + val refresh = tokenManager.loadRefreshToken() + if (access.isNotBlank() && refresh.isNotBlank()) { + BearerTokens(accessToken = access, refreshToken = refresh) + } else null } - } - refreshTokens { - tokenManager.refreshAndGetNewAccessToken() - .takeIf{it.isNotBlank()} - ?.let { newAccess -> - BearerTokens(accessToken = newAccess, refreshToken = "") + refreshTokens { + val refresh = tokenManager.loadRefreshToken() + + if (refresh.isBlank()) return@refreshTokens null + + when (val result = tokenManager.refreshAndGetNewAccessToken()) { + is RefreshResult.Success -> { + BearerTokens(accessToken = result.accessToken, refreshToken = refresh) + } + + is RefreshResult.InvalidRefreshToken -> { + sessionEvents.emit(SessionEvent.Expired) + null + } + + is RefreshResult.NetworkError -> null + } } } } + + additionalConfig() + } + + client.plugin(HttpSend).intercept { request -> + val path = request.url.encodedPath + val requiresAuth = path.contains("/auth/") + val access = tokenManager.loadAccessToken() + + if (requiresAuth && access.isBlank()) { + sessionEvents.emit(SessionEvent.LoginRequired) + } + + execute(request) } - additionalConfig() + return client } \ No newline at end of file diff --git a/shared/data/network/src/commonMain/kotlin/com/kus/data/network/di/networkModule.kt b/shared/data/network/src/commonMain/kotlin/com/kus/data/network/di/networkModule.kt index 3b47cff9..a96c3147 100644 --- a/shared/data/network/src/commonMain/kotlin/com/kus/data/network/di/networkModule.kt +++ b/shared/data/network/src/commonMain/kotlin/com/kus/data/network/di/networkModule.kt @@ -19,6 +19,7 @@ val networkModule = module { creatApiHttpClient( engine = provideEngine(), tokenManager = get(), + sessionEvents = get(), baseUrl = get(named("BASE_URL")), isDebug = true ) diff --git a/shared/data/network/src/commonMain/kotlin/com/kus/data/network/model/RefreshResult.kt b/shared/data/network/src/commonMain/kotlin/com/kus/data/network/model/RefreshResult.kt new file mode 100644 index 00000000..062e5e07 --- /dev/null +++ b/shared/data/network/src/commonMain/kotlin/com/kus/data/network/model/RefreshResult.kt @@ -0,0 +1,7 @@ +package com.kus.data.network.model + +sealed class RefreshResult { + data class Success(val accessToken: String) : RefreshResult() + object InvalidRefreshToken : RefreshResult() + object NetworkError : RefreshResult() +} \ No newline at end of file diff --git a/shared/data/tier/src/commonMain/kotlin/com/kus/shared/data/tier/mapper/TierMapper.kt b/shared/data/tier/src/commonMain/kotlin/com/kus/shared/data/tier/mapper/TierMapper.kt index 5673ebb8..14aba981 100644 --- a/shared/data/tier/src/commonMain/kotlin/com/kus/shared/data/tier/mapper/TierMapper.kt +++ b/shared/data/tier/src/commonMain/kotlin/com/kus/shared/data/tier/mapper/TierMapper.kt @@ -1,5 +1,13 @@ package com.kus.shared.data.tier.mapper +import com.kus.shared.data.tier.remote.response.GeoPointResponse +import com.kus.shared.data.tier.remote.response.NonTieredRestaurantsResponse +import com.kus.shared.data.tier.remote.response.RestaurantResponse +import com.kus.shared.data.tier.remote.response.TierMapDataResponse +import com.kus.shared.domain.model.tier.GeoPoint +import com.kus.shared.domain.model.tier.NonTieredRestaurantGroup +import com.kus.shared.domain.model.tier.TierMapData +import com.kus.shared.domain.model.tier.TierRestaurant import com.kus.shared.domain.model.tier.filter.Cuisine import com.kus.shared.domain.model.tier.filter.Location import com.kus.shared.domain.model.tier.filter.Situation @@ -52,4 +60,76 @@ fun Set.toSituationQuery(): String = Situation.normalize(this).joinToString(",") { it.toApiCode() } fun Set.toLocationQuery(): String = - Location.normalize(this).joinToString(",") { it.toApiCode() } \ No newline at end of file + Location.normalize(this).joinToString(",") { it.toApiCode() } + + +fun RestaurantResponse.toDomain(): TierRestaurant = + TierRestaurant( + restaurantId = restaurantId, + restaurantRanking = restaurantRanking ?: 0, + restaurantName = restaurantName, + restaurantCuisine = restaurantCuisine, + restaurantPosition = restaurantPosition, + restaurantImgUrl = restaurantImgUrl, + mainTier = mainTier, + isEvaluated = isEvaluated, + isFavorite = isFavorite, + longitude = longitude, + latitude = latitude, + partnershipInfo = partnershipInfo ?: "", + restaurantScore = restaurantScore?.takeIf { s -> !s.isNaN() } ?: 0.0, + isTempTier = isTempTier, + ) + +fun NonTieredRestaurantsResponse.toDomain(): NonTieredRestaurantGroup = + NonTieredRestaurantGroup( + zoom = zoom, + tierRestaurants = restaurants.map { + TierRestaurant( + restaurantId = it.restaurantId, + restaurantRanking = it.restaurantRanking ?: 0, + restaurantName = it.restaurantName, + restaurantCuisine = it.restaurantCuisine, + restaurantPosition = it.restaurantPosition, + restaurantImgUrl = it.restaurantImgUrl, + mainTier = -1, + isEvaluated = it.isEvaluated, + isFavorite = it.isFavorite, + longitude = it.longitude, + latitude = it.latitude, + partnershipInfo = it.partnershipInfo ?: "", + restaurantScore = it.restaurantScore?.takeIf { s -> !s.isNaN() } ?: 0.0, + isTempTier = it.isTempTier, + ) + } + ) + +fun TierMapDataResponse.toDomain(): TierMapData { + return TierMapData( + solidPolygonCoordsList = solidPolygonCoordsList.map { it.toDomainClosed() }, + dashedPolygonCoordsList = dashedPolygonCoordsList.map { it.toDomainClosed() }, + + favoriteTierRestaurants = favoriteRestaurants.map { it.toDomain() }, + tieredTierRestaurants = tieredRestaurants.map { it.toDomain() }, + nonTieredRestaurants = nonTieredRestaurants.map { it.toDomain() }, + + minZoom = minZoom, + visibleBounds = visibleBounds, + ) +} + +private fun List.toDomainClosed(): List { + if (isEmpty()) return emptyList() + + val mapped = map { it.toDomain() } + val first = mapped.first() + val last = mapped.last() + + return if (first != last) mapped + first else mapped +} + +fun GeoPointResponse.toDomain(): GeoPoint = + GeoPoint( + longitude = longitude, + latitude = latitude, + ) diff --git a/shared/data/tier/src/commonMain/kotlin/com/kus/shared/data/tier/remote/mapper/TierMapper.kt b/shared/data/tier/src/commonMain/kotlin/com/kus/shared/data/tier/remote/mapper/TierMapper.kt deleted file mode 100644 index 31d5b046..00000000 --- a/shared/data/tier/src/commonMain/kotlin/com/kus/shared/data/tier/remote/mapper/TierMapper.kt +++ /dev/null @@ -1,82 +0,0 @@ -package com.kus.shared.data.tier.remote.mapper - -import com.kus.shared.data.tier.remote.response.GeoPointResponse -import com.kus.shared.data.tier.remote.response.NonTieredRestaurantsResponse -import com.kus.shared.data.tier.remote.response.RestaurantResponse -import com.kus.shared.data.tier.remote.response.TierMapDataResponse -import com.kus.shared.domain.model.tier.GeoPoint -import com.kus.shared.domain.model.tier.NonTieredRestaurantGroup -import com.kus.shared.domain.model.tier.TierMapData -import com.kus.shared.domain.model.tier.TierRestaurant - - -fun RestaurantResponse.toDomain(): TierRestaurant = - TierRestaurant( - restaurantId = restaurantId, - restaurantRanking = restaurantRanking ?: 0, - restaurantName = restaurantName, - restaurantCuisine = restaurantCuisine, - restaurantPosition = restaurantPosition, - restaurantImgUrl = restaurantImgUrl, - mainTier = mainTier, - isEvaluated = isEvaluated, - isFavorite = isFavorite, - longitude = longitude, - latitude = latitude, - partnershipInfo = partnershipInfo ?: "", - restaurantScore = restaurantScore?.takeIf { s -> !s.isNaN() } ?: 0.0, - isTempTier = isTempTier, - ) - -fun NonTieredRestaurantsResponse.toDomain(): NonTieredRestaurantGroup = - NonTieredRestaurantGroup( - zoom = zoom, - tierRestaurants = restaurants.map { - TierRestaurant( - restaurantId = it.restaurantId, - restaurantRanking = it.restaurantRanking ?: 0, - restaurantName = it.restaurantName, - restaurantCuisine = it.restaurantCuisine, - restaurantPosition = it.restaurantPosition, - restaurantImgUrl = it.restaurantImgUrl, - mainTier = -1, - isEvaluated = it.isEvaluated, - isFavorite = it.isFavorite, - longitude = it.longitude, - latitude = it.latitude, - partnershipInfo = it.partnershipInfo ?: "", - restaurantScore = it.restaurantScore?.takeIf { s -> !s.isNaN() } ?: 0.0, - isTempTier = it.isTempTier, - ) - } - ) - -fun TierMapDataResponse.toDomain(): TierMapData { - return TierMapData( - solidPolygonCoordsList = solidPolygonCoordsList.map { it.toDomainClosed() }, - dashedPolygonCoordsList = dashedPolygonCoordsList.map { it.toDomainClosed() }, - - favoriteTierRestaurants = favoriteRestaurants.map { it.toDomain() }, - tieredTierRestaurants = tieredRestaurants.map { it.toDomain() }, - nonTieredRestaurants = nonTieredRestaurants.map { it.toDomain() }, - - minZoom = minZoom, - visibleBounds = visibleBounds, - ) -} - -private fun List.toDomainClosed(): List { - if (isEmpty()) return emptyList() - - val mapped = map { it.toDomain() } - val first = mapped.first() - val last = mapped.last() - - return if (first != last) mapped + first else mapped -} - -fun GeoPointResponse.toDomain(): GeoPoint = - GeoPoint( - longitude = longitude, - latitude = latitude, - ) diff --git a/shared/data/tier/src/commonMain/kotlin/com/kus/shared/data/tier/repository/TierRepositoryImpl.kt b/shared/data/tier/src/commonMain/kotlin/com/kus/shared/data/tier/repository/TierRepositoryImpl.kt index 9643cfa7..c7090cbe 100644 --- a/shared/data/tier/src/commonMain/kotlin/com/kus/shared/data/tier/repository/TierRepositoryImpl.kt +++ b/shared/data/tier/src/commonMain/kotlin/com/kus/shared/data/tier/repository/TierRepositoryImpl.kt @@ -2,9 +2,9 @@ package com.kus.shared.data.tier.repository import com.kus.shared.data.tier.api.TierApi import com.kus.shared.data.tier.mapper.toCuisineQuery +import com.kus.shared.data.tier.mapper.toDomain import com.kus.shared.data.tier.mapper.toLocationQuery import com.kus.shared.data.tier.mapper.toSituationQuery -import com.kus.shared.data.tier.remote.mapper.toDomain import com.kus.shared.domain.model.tier.TierMapData import com.kus.shared.domain.model.tier.TierRestaurant import com.kus.shared.domain.model.tier.filter.Cuisine diff --git a/shared/domain/auth/src/commonMain/kotlin/com/kus/domain/auth/di/authDomainModule.kt b/shared/domain/auth/src/commonMain/kotlin/com/kus/domain/auth/di/authDomainModule.kt index c9a99573..987f1f21 100644 --- a/shared/domain/auth/src/commonMain/kotlin/com/kus/domain/auth/di/authDomainModule.kt +++ b/shared/domain/auth/src/commonMain/kotlin/com/kus/domain/auth/di/authDomainModule.kt @@ -1,7 +1,9 @@ package com.kus.domain.auth.di +import GetSessionAvailabilityUseCase import com.kus.domain.auth.session.SessionEventBus import com.kus.domain.auth.session.SessionEventEmitter +import com.kus.domain.auth.usecase.DeleteUserInfoUseCase import com.kus.domain.auth.usecase.PostNaverLoginUseCase import org.koin.core.module.dsl.singleOf import org.koin.dsl.bind @@ -9,6 +11,8 @@ import org.koin.dsl.module var authDomainModule = module { singleOf(::PostNaverLoginUseCase) + singleOf(::DeleteUserInfoUseCase) + singleOf(::GetSessionAvailabilityUseCase) single { SessionEventBus() } singleOf(::SessionEventBus) bind SessionEventEmitter::class } \ No newline at end of file diff --git a/shared/domain/auth/src/commonMain/kotlin/com/kus/domain/auth/repository/DeviceIdManager.kt b/shared/domain/auth/src/commonMain/kotlin/com/kus/domain/auth/repository/DeviceIdManager.kt new file mode 100644 index 00000000..f21730ca --- /dev/null +++ b/shared/domain/auth/src/commonMain/kotlin/com/kus/domain/auth/repository/DeviceIdManager.kt @@ -0,0 +1,7 @@ +package com.kus.domain.auth.repository + +interface DeviceIdManager { + suspend fun getOrCreateDeviceId(): String + suspend fun saveDeviceId(id: String) + suspend fun clear() +} \ No newline at end of file diff --git a/shared/domain/auth/src/commonMain/kotlin/com/kus/domain/auth/session/SessionEvent.kt b/shared/domain/auth/src/commonMain/kotlin/com/kus/domain/auth/session/SessionEvent.kt index 92749a04..2a56573a 100644 --- a/shared/domain/auth/src/commonMain/kotlin/com/kus/domain/auth/session/SessionEvent.kt +++ b/shared/domain/auth/src/commonMain/kotlin/com/kus/domain/auth/session/SessionEvent.kt @@ -2,4 +2,5 @@ package com.kus.domain.auth.session sealed interface SessionEvent { data object Expired : SessionEvent + data object LoginRequired : SessionEvent } \ No newline at end of file diff --git a/shared/domain/auth/src/commonMain/kotlin/com/kus/domain/auth/session/SessionEventBus.kt b/shared/domain/auth/src/commonMain/kotlin/com/kus/domain/auth/session/SessionEventBus.kt index ce698518..9143568d 100644 --- a/shared/domain/auth/src/commonMain/kotlin/com/kus/domain/auth/session/SessionEventBus.kt +++ b/shared/domain/auth/src/commonMain/kotlin/com/kus/domain/auth/session/SessionEventBus.kt @@ -1,10 +1,11 @@ package com.kus.domain.auth.session import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.SharedFlow class SessionEventBus : SessionEventEmitter { private val _events = MutableSharedFlow( extraBufferCapacity = 1 ) - val events: kotlinx.coroutines.flow.SharedFlow = _events + val events: SharedFlow = _events override suspend fun emit(event: SessionEvent) { _events.tryEmit(event) diff --git a/shared/domain/auth/src/commonMain/kotlin/com/kus/domain/auth/usecase/DeleteUserInfoUseCase.kt b/shared/domain/auth/src/commonMain/kotlin/com/kus/domain/auth/usecase/DeleteUserInfoUseCase.kt new file mode 100644 index 00000000..167a6cbc --- /dev/null +++ b/shared/domain/auth/src/commonMain/kotlin/com/kus/domain/auth/usecase/DeleteUserInfoUseCase.kt @@ -0,0 +1,12 @@ +package com.kus.domain.auth.usecase + +import com.kus.domain.auth.repository.AuthTokenStore + +class DeleteUserInfoUseCase( + private val tokenStore: AuthTokenStore, +) { + suspend operator fun invoke(): Boolean { + tokenStore.clear() + return true + } +} diff --git a/shared/domain/auth/src/commonMain/kotlin/com/kus/domain/auth/usecase/PostNaverLoginUseCase.kt b/shared/domain/auth/src/commonMain/kotlin/com/kus/domain/auth/usecase/PostNaverLoginUseCase.kt index 270748b1..7cfd6be2 100644 --- a/shared/domain/auth/src/commonMain/kotlin/com/kus/domain/auth/usecase/PostNaverLoginUseCase.kt +++ b/shared/domain/auth/src/commonMain/kotlin/com/kus/domain/auth/usecase/PostNaverLoginUseCase.kt @@ -3,10 +3,12 @@ package com.kus.domain.auth.usecase import com.kus.domain.auth.model.AuthToken import com.kus.domain.auth.repository.AuthRepository import com.kus.domain.auth.repository.AuthTokenStore +import com.kus.domain.auth.repository.DeviceIdManager class PostNaverLoginUseCase( private val authRepository: AuthRepository, private val tokenStore: AuthTokenStore, + private val deviceIdManager: DeviceIdManager, ) { suspend operator fun invoke(providerId: String, naverAccessToken: String): AuthToken { val token = authRepository.postNaverLogin( @@ -16,6 +18,7 @@ class PostNaverLoginUseCase( ) tokenStore.save(token) + deviceIdManager.clear() return token } } diff --git a/shared/domain/community/.gitignore b/shared/domain/community/.gitignore new file mode 100644 index 00000000..42afabfd --- /dev/null +++ b/shared/domain/community/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/shared/domain/community/build.gradle.kts b/shared/domain/community/build.gradle.kts new file mode 100644 index 00000000..39d77908 --- /dev/null +++ b/shared/domain/community/build.gradle.kts @@ -0,0 +1,79 @@ +plugins { + alias(libs.plugins.kotlinMultiplatform) + alias(libs.plugins.androidKotlinMultiplatformLibrary) + alias(libs.plugins.androidLint) +} + +kotlin { + androidLibrary { + namespace = "com.kus.shared.core.domain.community" + compileSdk = 36 + minSdk = 26 + + withHostTestBuilder { + } + + withDeviceTestBuilder { + sourceSetTreeName = "test" + }.configure { + instrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + } + } + + val xcfName = "shared:domain:CommunityKit" + + iosX64 { + binaries.framework { + baseName = xcfName + } + } + + iosArm64 { + binaries.framework { + baseName = xcfName + } + } + + iosSimulatorArm64 { + binaries.framework { + baseName = xcfName + } + } + + + jvm("desktop") + + sourceSets { + commonMain { + dependencies { + implementation(libs.kotlinx.coroutines.core) + api(libs.koin.core) + implementation(project(":shared:domain:model")) + } + } + + commonTest { + dependencies { + implementation(libs.kotlin.test) + } + } + + androidMain { + dependencies { + } + } + + getByName("androidDeviceTest") { + dependencies { + implementation(libs.androidx.runner) + implementation(libs.androidx.core) + implementation(libs.androidx.testExt.junit) + } + } + + iosMain { + dependencies { + } + } + } +} \ No newline at end of file diff --git a/shared/domain/community/src/androidDeviceTest/kotlin/com/kus/domain/community/ExampleInstrumentedTest.kt b/shared/domain/community/src/androidDeviceTest/kotlin/com/kus/domain/community/ExampleInstrumentedTest.kt new file mode 100644 index 00000000..7cdb1193 --- /dev/null +++ b/shared/domain/community/src/androidDeviceTest/kotlin/com/kus/domain/community/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.kus.domain.community + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.kus.domain.community.test", appContext.packageName) + } +} \ No newline at end of file diff --git a/shared/domain/community/src/androidHostTest/kotlin/com/kus/domain/community/ExampleUnitTest.kt b/shared/domain/community/src/androidHostTest/kotlin/com/kus/domain/community/ExampleUnitTest.kt new file mode 100644 index 00000000..edddf8dc --- /dev/null +++ b/shared/domain/community/src/androidHostTest/kotlin/com/kus/domain/community/ExampleUnitTest.kt @@ -0,0 +1,16 @@ +package com.kus.domain.community + +import kotlin.test.Test +import kotlin.test.assertEquals + +/** + * Example local unit test, which will execute on the development machine (host). + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +class ExampleUnitTest { + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} \ No newline at end of file diff --git a/shared/domain/community/src/androidMain/AndroidManifest.xml b/shared/domain/community/src/androidMain/AndroidManifest.xml new file mode 100644 index 00000000..a5918e68 --- /dev/null +++ b/shared/domain/community/src/androidMain/AndroidManifest.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/shared/domain/community/src/androidMain/kotlin/com/kus/domain/community/Platform.android.kt b/shared/domain/community/src/androidMain/kotlin/com/kus/domain/community/Platform.android.kt new file mode 100644 index 00000000..6387eff8 --- /dev/null +++ b/shared/domain/community/src/androidMain/kotlin/com/kus/domain/community/Platform.android.kt @@ -0,0 +1,3 @@ +package com.kus.domain.community + +actual fun platform() = "Android" \ No newline at end of file diff --git a/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/Platform.kt b/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/Platform.kt new file mode 100644 index 00000000..8f3f5883 --- /dev/null +++ b/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/Platform.kt @@ -0,0 +1,3 @@ +package com.kus.domain.community + +expect fun platform(): String \ No newline at end of file diff --git a/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/di/communityDomainModule.kt b/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/di/communityDomainModule.kt new file mode 100644 index 00000000..9913c360 --- /dev/null +++ b/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/di/communityDomainModule.kt @@ -0,0 +1,31 @@ +package com.kus.domain.community.di + +import com.kus.domain.community.usecase.DeleteCommunityCommentUseCase +import com.kus.domain.community.usecase.DeleteCommunityPostUseCase +import com.kus.domain.community.usecase.GetCommunityPostDetailUseCase +import com.kus.domain.community.usecase.GetCommunityPostListUseCase +import com.kus.domain.community.usecase.GetCommunityRankingListUseCase +import com.kus.domain.community.usecase.PatchPostModifyUseCase +import com.kus.domain.community.usecase.PostCommunityPostCommentReactUseCase +import com.kus.domain.community.usecase.PostCommunityPostCommentReplyUseCase +import com.kus.domain.community.usecase.PostCommunityPostCreateUseCase +import com.kus.domain.community.usecase.PostCommunityPostDetailScrapUseCase +import com.kus.domain.community.usecase.PostCommunityUploadImageUseCase +import com.kus.domain.community.usecase.PostPostLikeUseCase +import org.koin.core.module.dsl.singleOf +import org.koin.dsl.module + +val communityDomainModule = module { + singleOf(::DeleteCommunityCommentUseCase) + singleOf(::DeleteCommunityPostUseCase) + singleOf(::GetCommunityPostDetailUseCase) + singleOf(::GetCommunityPostListUseCase) + singleOf(::GetCommunityRankingListUseCase) + singleOf(::PatchPostModifyUseCase) + singleOf(::PostCommunityPostCommentReactUseCase) + singleOf(::PostCommunityPostCommentReplyUseCase) + singleOf(::PostCommunityPostCreateUseCase) + singleOf(::PostCommunityPostDetailScrapUseCase) + singleOf(::PostCommunityUploadImageUseCase) + singleOf(::PostPostLikeUseCase) +} \ No newline at end of file diff --git a/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/model/AuthUserInfo.kt b/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/model/AuthUserInfo.kt new file mode 100644 index 00000000..2b2210c0 --- /dev/null +++ b/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/model/AuthUserInfo.kt @@ -0,0 +1,6 @@ +package com.kus.domain.community.model + +data class AuthUserInfo( + val id: Long, + val role: UserRole +) \ No newline at end of file diff --git a/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/model/CommunityCommentReactionResponse.kt b/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/model/CommunityCommentReactionResponse.kt new file mode 100644 index 00000000..ea0b5475 --- /dev/null +++ b/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/model/CommunityCommentReactionResponse.kt @@ -0,0 +1,7 @@ +package com.kus.domain.community.model + +data class CommunityCommentReaction( + val likeCount : Int, + val dislikeCount : Int, + val reactionType : String?, +) \ No newline at end of file diff --git a/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/model/CommunityPost.kt b/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/model/CommunityPost.kt new file mode 100644 index 00000000..3a791956 --- /dev/null +++ b/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/model/CommunityPost.kt @@ -0,0 +1,31 @@ +package com.kus.domain.community.model + +data class CommunityPost( + val postId: Long, + val category: PostCategory, + val title: String, + val body: String, + val photoUrls: List?, + + val writerId: Long, + val nickname: String, + val evalCount: Long, + val writerIconUrl: String?, + + val timeAgo: String, + val createdAt: String, + val updatedAt: String?, + + val likeOnlyCount: Long, + val dislikeOnlyCount: Long, + val totalLikes: Long, + val commentCount: Long, + val scrapCount: Long, + val visitCount: Long, + + val myReaction: String?, + val isScrapped: Boolean, + val isPostMine: Boolean, + + val comments: List? +) \ No newline at end of file diff --git a/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/model/CommunityPostComment.kt b/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/model/CommunityPostComment.kt new file mode 100644 index 00000000..688f1496 --- /dev/null +++ b/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/model/CommunityPostComment.kt @@ -0,0 +1,18 @@ +package com.kus.domain.community.model + +data class CommunityPostComment( + val commentId: Long, + val parentCommentId: Long? = null, + val body: String, + val status: String, + val likeCount: Int, + val dislikeCount: Int, + val repliesList: List = emptyList(), + val timeAgo: String, + val reactionType: String?, + val isCommentMine: Boolean, + val writerId: Long?, + val nickname: String?, + val evalCount: Long?, + val writerIconUrl: String?, +) \ No newline at end of file diff --git a/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/model/CommunityPostLike.kt b/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/model/CommunityPostLike.kt new file mode 100644 index 00000000..221ae950 --- /dev/null +++ b/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/model/CommunityPostLike.kt @@ -0,0 +1,9 @@ +package com.kus.domain.community.model + + +data class CommunityPostLike( + val reactionType : String?, + val likeCount : Int, + val dislikeCount : Int, + val netLikes : Int, +) \ No newline at end of file diff --git a/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/model/CommunityPostListItem.kt b/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/model/CommunityPostListItem.kt new file mode 100644 index 00000000..48a510a3 --- /dev/null +++ b/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/model/CommunityPostListItem.kt @@ -0,0 +1,16 @@ +package com.kus.domain.community.model + +data class CommunityPostListItem( + val postId: Long, + val category: String, + val title: String, + val body: String, + val writerId: Long, + val nickname: String, + val evalCount: Long, + val writerIconUrl: String?, + val photoUrl: String?, + val timeAgo: String, + val totalLikes: Long, + val commentCount: Long, +) \ No newline at end of file diff --git a/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/model/CommunityPostScrap.kt b/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/model/CommunityPostScrap.kt new file mode 100644 index 00000000..58a4924a --- /dev/null +++ b/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/model/CommunityPostScrap.kt @@ -0,0 +1,7 @@ +package com.kus.domain.community.model + + +data class CommunityPostScrap( + val postScrapCount : Int, + val isScrapped : Boolean, +) \ No newline at end of file diff --git a/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/model/CommunityRanking.kt b/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/model/CommunityRanking.kt new file mode 100644 index 00000000..8788b988 --- /dev/null +++ b/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/model/CommunityRanking.kt @@ -0,0 +1,9 @@ +package com.kus.domain.community.model + +data class CommunityRanking( + val userId : Long, + val nickname : String, + val iconUrl : String, + val evaluationCount: Int, + val rank: Int, +) \ No newline at end of file diff --git a/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/model/LikeEvent.kt b/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/model/LikeEvent.kt new file mode 100644 index 00000000..6f578101 --- /dev/null +++ b/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/model/LikeEvent.kt @@ -0,0 +1,14 @@ +package com.kus.domain.community.model + +enum class LikeEvent(val value: String) { + LIKE("LIKE"), + DISLIKE("DISLIKE"); + + companion object { + fun from(value: String?): LikeEvent? = when (value?.trim()?.uppercase()) { + "LIKE" -> LIKE + "DISLIKE" -> DISLIKE + else -> null + } + } +} diff --git a/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/model/ListSortType.kt b/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/model/ListSortType.kt new file mode 100644 index 00000000..8b2518d5 --- /dev/null +++ b/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/model/ListSortType.kt @@ -0,0 +1,12 @@ +package com.kus.domain.community.model + +enum class ListSortType(val value: String) { + POPULARITY("POPULARITY"), + LATEST("LATEST"); +} + +fun ListSortType.toCategorySort(): ListSortType = + when (this) { + ListSortType.LATEST -> ListSortType.LATEST + ListSortType.POPULARITY -> ListSortType.POPULARITY + } \ No newline at end of file diff --git a/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/model/PostCategory.kt b/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/model/PostCategory.kt new file mode 100644 index 00000000..5fd7c074 --- /dev/null +++ b/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/model/PostCategory.kt @@ -0,0 +1,18 @@ +package com.kus.domain.community.model + +enum class PostCategory(val value: String, val displayName: String) { + ALL("ALL", "전체게시판"), + FREE("FREE", "자유게시판"), + COLUMN("COLUMN", "칼럼게시판"), + SUGGESTION("SUGGESTION", "건의게시판"); +} + +fun String.toPostCategory(): PostCategory { + return when (this.uppercase()) { + "ALL", "전체게시판" -> PostCategory.ALL + "FREE", "자유게시판" -> PostCategory.FREE + "COLUMN", "칼럼게시판" -> PostCategory.COLUMN + "SUGGESTION", "건의게시판" -> PostCategory.SUGGESTION + else -> PostCategory.ALL + } +} \ No newline at end of file diff --git a/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/model/PostModification.kt b/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/model/PostModification.kt new file mode 100644 index 00000000..41a293f7 --- /dev/null +++ b/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/model/PostModification.kt @@ -0,0 +1,9 @@ +package com.kus.domain.community.model + +data class PostModification ( + val postId: Long, + val category: PostCategory, + val title: String, + val body: String, + val photoUrls: List +) \ No newline at end of file diff --git a/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/model/RankingSortType.kt b/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/model/RankingSortType.kt new file mode 100644 index 00000000..6a972c51 --- /dev/null +++ b/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/model/RankingSortType.kt @@ -0,0 +1,6 @@ +package com.kus.domain.community.model + +enum class RankingSortType(val value : String) { + SEASONAL("SEASONAL"), + CUMULATIVE("CUMULATIVE") +} \ No newline at end of file diff --git a/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/model/UploadImageException.kt b/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/model/UploadImageException.kt new file mode 100644 index 00000000..4c520b42 --- /dev/null +++ b/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/model/UploadImageException.kt @@ -0,0 +1,9 @@ +package com.kus.domain.community.model + +sealed class UploadImageException(message: String) : Exception(message) { + class TooLarge(val maxBytes: Long) : UploadImageException( + "이미지는 1MB 이하만 업로드 가능합니다." + ) + + class ReadFailed : UploadImageException("이미지를 읽을 수 없습니다.") +} \ No newline at end of file diff --git a/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/model/UserRole.kt b/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/model/UserRole.kt new file mode 100644 index 00000000..c3df14c5 --- /dev/null +++ b/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/model/UserRole.kt @@ -0,0 +1,8 @@ +package com.kus.domain.community.model + +enum class UserRole { + GUEST, + USER, + ADMIN, + OWNER +} \ No newline at end of file diff --git a/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/repository/CommunityRepository.kt b/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/repository/CommunityRepository.kt new file mode 100644 index 00000000..1ef2b9a7 --- /dev/null +++ b/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/repository/CommunityRepository.kt @@ -0,0 +1,85 @@ +package com.kus.domain.community.repository + +import com.kus.domain.community.model.AuthUserInfo +import com.kus.domain.community.model.CommunityCommentReaction +import com.kus.domain.community.model.ListSortType +import com.kus.domain.community.model.CommunityPost +import com.kus.domain.community.model.CommunityPostComment +import com.kus.domain.community.model.CommunityPostLike +import com.kus.domain.community.model.CommunityPostListItem +import com.kus.domain.community.model.CommunityPostScrap +import com.kus.domain.community.model.CommunityRanking +import com.kus.domain.community.model.LikeEvent +import com.kus.domain.community.model.PostModification +import com.kus.domain.community.model.RankingSortType +import com.kus.domain.community.model.PostCategory + +interface CommunityRepository { + suspend fun getPostList( + postCategory: PostCategory, + page: Int, + sort: ListSortType + ): List + + suspend fun getRankingList( + sort: RankingSortType + ): List + + suspend fun getPostDetail( + postId: Long, + isLoggedIn : Boolean + ): CommunityPost + + suspend fun postPostCreate( + title : String, + postCategory : PostCategory, + content : String, + ) : CommunityPost + + suspend fun postUploadImage( + imagePath : String + ) : String + + suspend fun postPostDetailScrap( + postId : Long, + scrapped : Boolean + ) : CommunityPostScrap + + suspend fun postPostLikeToggle( + postId : Long, + likeEvent : LikeEvent?, + ) : CommunityPostLike + + suspend fun patchPostModify( + postId: String, + title : String, + postCategory : PostCategory, + content : String, + ) + + suspend fun getPostModify( + postId: Long, + user : AuthUserInfo, + ) : PostModification + + suspend fun postCommunityCommentReply( + postId : Long, + content : String, + parentCommentId : Long?, + ) : CommunityPostComment + + suspend fun postCommentLikeToggle( + commentId : Long, + reaction : LikeEvent?, + ) : CommunityCommentReaction + + suspend fun deletePost( + postId : Long, + ) + + suspend fun deleteCommunityComment( + commentId : Long, + ) +} + + diff --git a/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/usecase/DeleteCommunityCommentUseCase.kt b/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/usecase/DeleteCommunityCommentUseCase.kt new file mode 100644 index 00000000..f77f8806 --- /dev/null +++ b/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/usecase/DeleteCommunityCommentUseCase.kt @@ -0,0 +1,12 @@ +package com.kus.domain.community.usecase + +import com.kus.domain.community.repository.CommunityRepository + + +class DeleteCommunityCommentUseCase( + private val communityRepository: CommunityRepository +){ + suspend operator fun invoke(commentId : Long) { + return communityRepository.deleteCommunityComment(commentId) + } +} \ No newline at end of file diff --git a/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/usecase/DeleteCommunityPostUseCase.kt b/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/usecase/DeleteCommunityPostUseCase.kt new file mode 100644 index 00000000..6c01cc68 --- /dev/null +++ b/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/usecase/DeleteCommunityPostUseCase.kt @@ -0,0 +1,11 @@ +package com.kus.domain.community.usecase + +import com.kus.domain.community.repository.CommunityRepository + +class DeleteCommunityPostUseCase( + private val communityRepository: CommunityRepository +){ + suspend operator fun invoke(postId : Long) { + communityRepository.deletePost(postId) + } +} \ No newline at end of file diff --git a/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/usecase/GetCommunityPostDetailUseCase.kt b/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/usecase/GetCommunityPostDetailUseCase.kt new file mode 100644 index 00000000..f3e05c0b --- /dev/null +++ b/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/usecase/GetCommunityPostDetailUseCase.kt @@ -0,0 +1,26 @@ +package com.kus.domain.community.usecase + + +import com.kus.domain.community.model.CommunityPost +import com.kus.domain.community.model.CommunityPostComment +import com.kus.domain.community.repository.CommunityRepository + +class GetCommunityPostDetailUseCase( + private val communityRepository: CommunityRepository +) { + suspend operator fun invoke(postId: Long, isLoggedIn: Boolean): CommunityPost { + val post = communityRepository.getPostDetail(postId, isLoggedIn) + + val safeComments = post.comments?.map { comment -> + normalizeComment(comment) + } ?: emptyList() + + return post.copy(comments = safeComments) + } + + private fun normalizeComment(comment: CommunityPostComment): CommunityPostComment { + val safeReplies = comment.repliesList.map { normalizeComment(it) } + return comment.copy(repliesList = safeReplies) + } +} + diff --git a/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/usecase/GetCommunityPostListUseCase.kt b/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/usecase/GetCommunityPostListUseCase.kt new file mode 100644 index 00000000..5f2e20de --- /dev/null +++ b/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/usecase/GetCommunityPostListUseCase.kt @@ -0,0 +1,14 @@ +package com.kus.domain.community.usecase + +import com.kus.domain.community.model.ListSortType +import com.kus.domain.community.model.CommunityPostListItem +import com.kus.domain.community.repository.CommunityRepository +import com.kus.domain.community.model.PostCategory + +class GetCommunityPostListUseCase( + private val communityRepository: CommunityRepository +) { + suspend operator fun invoke(postCategory: PostCategory, page: Int, sort: ListSortType): List { + return communityRepository.getPostList(postCategory, page, sort) + } +} \ No newline at end of file diff --git a/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/usecase/GetCommunityRankingListUseCase.kt b/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/usecase/GetCommunityRankingListUseCase.kt new file mode 100644 index 00000000..366a9e02 --- /dev/null +++ b/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/usecase/GetCommunityRankingListUseCase.kt @@ -0,0 +1,14 @@ +package com.kus.domain.community.usecase + +import com.kus.domain.community.model.CommunityRanking +import com.kus.domain.community.model.RankingSortType +import com.kus.domain.community.repository.CommunityRepository + + +class GetCommunityRankingListUseCase( + private val communityRepository: CommunityRepository +) { + suspend operator fun invoke(sort: RankingSortType): List { + return communityRepository.getRankingList(sort) + } +} \ No newline at end of file diff --git a/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/usecase/PatchPostModifyUseCase.kt b/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/usecase/PatchPostModifyUseCase.kt new file mode 100644 index 00000000..7ea48f6a --- /dev/null +++ b/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/usecase/PatchPostModifyUseCase.kt @@ -0,0 +1,13 @@ +package com.kus.domain.community.usecase + +import com.kus.domain.community.repository.CommunityRepository +import com.kus.domain.community.model.PostCategory + + +class PatchPostModifyUseCase( + private val communityRepository: CommunityRepository +){ + suspend operator fun invoke(postId: String, title : String, postCategory : PostCategory, content : String,) { + return communityRepository.patchPostModify(postId, title, postCategory, content) + } +} \ No newline at end of file diff --git a/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/usecase/PostCommunityPostCommentReactUseCase.kt b/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/usecase/PostCommunityPostCommentReactUseCase.kt new file mode 100644 index 00000000..eec15618 --- /dev/null +++ b/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/usecase/PostCommunityPostCommentReactUseCase.kt @@ -0,0 +1,13 @@ +package com.kus.domain.community.usecase + +import com.kus.domain.community.model.CommunityCommentReaction +import com.kus.domain.community.model.LikeEvent +import com.kus.domain.community.repository.CommunityRepository + +class PostCommunityPostCommentReactUseCase( + private val communityRepository: CommunityRepository +){ + suspend operator fun invoke(commentId : Long, reaction : LikeEvent?) : CommunityCommentReaction { + return communityRepository.postCommentLikeToggle(commentId, reaction) + } +} \ No newline at end of file diff --git a/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/usecase/PostCommunityPostCommentReplyUseCase.kt b/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/usecase/PostCommunityPostCommentReplyUseCase.kt new file mode 100644 index 00000000..680fce3b --- /dev/null +++ b/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/usecase/PostCommunityPostCommentReplyUseCase.kt @@ -0,0 +1,13 @@ +package com.kus.domain.community.usecase + +import com.kus.domain.community.model.CommunityPostComment +import com.kus.domain.community.repository.CommunityRepository + + +class PostCommunityPostCommentReplyUseCase( + private val communityRepository: CommunityRepository +){ + suspend operator fun invoke(content : String, postId : Long, parentCommentId : Long?) : CommunityPostComment { + return communityRepository.postCommunityCommentReply( postId, content, parentCommentId) + } +} \ No newline at end of file diff --git a/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/usecase/PostCommunityPostCreateUseCase.kt b/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/usecase/PostCommunityPostCreateUseCase.kt new file mode 100644 index 00000000..f0169534 --- /dev/null +++ b/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/usecase/PostCommunityPostCreateUseCase.kt @@ -0,0 +1,14 @@ +package com.kus.domain.community.usecase + +import com.kus.domain.community.model.CommunityPost +import com.kus.domain.community.model.PostCategory +import com.kus.domain.community.repository.CommunityRepository + + +class PostCommunityPostCreateUseCase( + private val communityRepository: CommunityRepository +){ + suspend operator fun invoke(title : String, postCategory : PostCategory, content : String) : CommunityPost { + return communityRepository.postPostCreate(title, postCategory, content) + } +} \ No newline at end of file diff --git a/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/usecase/PostCommunityPostDetailScrapUseCase.kt b/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/usecase/PostCommunityPostDetailScrapUseCase.kt new file mode 100644 index 00000000..3e5634b4 --- /dev/null +++ b/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/usecase/PostCommunityPostDetailScrapUseCase.kt @@ -0,0 +1,12 @@ +package com.kus.domain.community.usecase + +import com.kus.domain.community.model.CommunityPostScrap +import com.kus.domain.community.repository.CommunityRepository + +class PostCommunityPostDetailScrapUseCase( + private val communityRepository: CommunityRepository +) { + suspend operator fun invoke(postId: Long, scrapped : Boolean): CommunityPostScrap { + return communityRepository.postPostDetailScrap(postId, scrapped) + } +} \ No newline at end of file diff --git a/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/usecase/PostCommunityUploadImageUseCase.kt b/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/usecase/PostCommunityUploadImageUseCase.kt new file mode 100644 index 00000000..6eb76888 --- /dev/null +++ b/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/usecase/PostCommunityUploadImageUseCase.kt @@ -0,0 +1,12 @@ +package com.kus.domain.community.usecase + +import com.kus.domain.community.repository.CommunityRepository + + +class PostCommunityUploadImageUseCase( + private val communityRepository: CommunityRepository +){ + suspend operator fun invoke(imagePath : String) : String { + return communityRepository.postUploadImage(imagePath) + } +} \ No newline at end of file diff --git a/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/usecase/PostPostLikeUseCase.kt b/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/usecase/PostPostLikeUseCase.kt new file mode 100644 index 00000000..e2638092 --- /dev/null +++ b/shared/domain/community/src/commonMain/kotlin/com/kus/domain/community/usecase/PostPostLikeUseCase.kt @@ -0,0 +1,13 @@ +package com.kus.domain.community.usecase + +import com.kus.domain.community.model.CommunityPostLike +import com.kus.domain.community.model.LikeEvent +import com.kus.domain.community.repository.CommunityRepository + +class PostPostLikeUseCase( + private val communityRepository: CommunityRepository +){ + suspend operator fun invoke(postId : Long, likeEvent : LikeEvent?) : CommunityPostLike { + return communityRepository.postPostLikeToggle(postId, likeEvent) + } +} diff --git a/shared/domain/community/src/desktopMain/kotlin/com/kus/domain/community/Platform.desktop.kt b/shared/domain/community/src/desktopMain/kotlin/com/kus/domain/community/Platform.desktop.kt new file mode 100644 index 00000000..58c231a9 --- /dev/null +++ b/shared/domain/community/src/desktopMain/kotlin/com/kus/domain/community/Platform.desktop.kt @@ -0,0 +1,3 @@ +package com.kus.domain.community + +actual fun platform(): String = "Desktop" \ No newline at end of file diff --git a/shared/domain/community/src/iosMain/kotlin/com/kus/domain/community/Platform.ios.kt b/shared/domain/community/src/iosMain/kotlin/com/kus/domain/community/Platform.ios.kt new file mode 100644 index 00000000..471cb55a --- /dev/null +++ b/shared/domain/community/src/iosMain/kotlin/com/kus/domain/community/Platform.ios.kt @@ -0,0 +1,3 @@ +package com.kus.domain.community + +actual fun platform() = "iOS" \ No newline at end of file diff --git a/shared/feature/community/build.gradle.kts b/shared/feature/community/build.gradle.kts index f5d885e2..9def4f74 100644 --- a/shared/feature/community/build.gradle.kts +++ b/shared/feature/community/build.gradle.kts @@ -1,3 +1,4 @@ + plugins { alias(libs.plugins.kotlinMultiplatform) alias(libs.plugins.androidLibrary) @@ -8,26 +9,9 @@ plugins { kotlin { androidTarget() - - val xcfName = "shared:feature:communityKit" - - iosX64 { - binaries.framework { - baseName = xcfName - } - } - - iosArm64 { - binaries.framework { - baseName = xcfName - } - } - - iosSimulatorArm64 { - binaries.framework { - baseName = xcfName - } - } + iosX64() + iosArm64() + iosSimulatorArm64() jvm("desktop") @@ -50,9 +34,21 @@ kotlin { implementation(libs.lifecycle.viewmodel) implementation(libs.kotlinx.coroutines.core) + implementation(libs.kamel.image.default) + + implementation(libs.kotlinx.serialization.json) + implementation(libs.compose.ui.backhandler) + implementation(project(":shared:core:designSystem")) implementation(project(":shared:core:presentation")) + implementation(project(":shared:core:logging")) + implementation(project(":shared:core:serialization")) + + implementation(project(":shared:domain:model")) + implementation(project(":shared:domain:community")) + implementation(project(":shared:domain:auth")) + implementation(project(":shared:data:network")) } } @@ -66,14 +62,15 @@ kotlin { androidMain { dependencies { implementation(compose.preview) + implementation(libs.naver.maps) implementation(libs.androidx.activity.compose) - implementation(libs.koin.android) } } iosMain { dependencies { + implementation(project(":shared:core:designSystem")) } } } diff --git a/shared/feature/community/src/androidMain/kotlin/com/kus/feature/community/ui/detail/HtmlBodyView.android.kt b/shared/feature/community/src/androidMain/kotlin/com/kus/feature/community/ui/detail/HtmlBodyView.android.kt new file mode 100644 index 00000000..62b7fdce --- /dev/null +++ b/shared/feature/community/src/androidMain/kotlin/com/kus/feature/community/ui/detail/HtmlBodyView.android.kt @@ -0,0 +1,36 @@ +package com.kus.feature.community.ui.detail + +import android.annotation.SuppressLint +import android.webkit.WebView +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.viewinterop.AndroidView + +@SuppressLint("SetJavaScriptEnabled") +@Composable +actual fun HtmlBodyView( + html: String, + modifier: Modifier +) { + val context = LocalContext.current + + AndroidView( + modifier = modifier, + factory = { + WebView(context).apply { + settings.javaScriptEnabled = true + setBackgroundColor(android.graphics.Color.TRANSPARENT) + } + }, + update = { webView -> + webView.loadDataWithBaseURL( + null, + html, + "text/html", + "utf-8", + null + ) + } + ) +} diff --git a/shared/feature/community/src/androidMain/kotlin/com/kus/feature/community/ui/di/androidFeatureCommunityModule.kt b/shared/feature/community/src/androidMain/kotlin/com/kus/feature/community/ui/di/androidFeatureCommunityModule.kt new file mode 100644 index 00000000..95cae323 --- /dev/null +++ b/shared/feature/community/src/androidMain/kotlin/com/kus/feature/community/ui/di/androidFeatureCommunityModule.kt @@ -0,0 +1,14 @@ +package com.kus.feature.community.ui.di + +import com.kus.feature.community.ui.write.AndroidCommunityEditorRenderer +import com.kus.feature.community.ui.write.CommunityEditorRenderer +import com.kus.feature.community.ui.write.image.AndroidImagePickerFactory +import com.kus.feature.community.ui.write.image.PlatformImagePickerFactory +import org.koin.dsl.module +import org.koin.core.module.dsl.singleOf +import org.koin.dsl.bind + +val androidFeatureCommunityModule = module { + singleOf(::AndroidCommunityEditorRenderer) bind CommunityEditorRenderer::class + singleOf(::AndroidImagePickerFactory) bind PlatformImagePickerFactory::class +} \ No newline at end of file diff --git a/shared/feature/community/src/androidMain/kotlin/com/kus/feature/community/ui/write/AndroidCommunityEditor.kt b/shared/feature/community/src/androidMain/kotlin/com/kus/feature/community/ui/write/AndroidCommunityEditor.kt new file mode 100644 index 00000000..fd92ba82 --- /dev/null +++ b/shared/feature/community/src/androidMain/kotlin/com/kus/feature/community/ui/write/AndroidCommunityEditor.kt @@ -0,0 +1,71 @@ +@file:Suppress("SetJavaScriptEnabled") +package com.kus.feature.community.ui.write + +import android.view.ViewGroup +import android.webkit.JavascriptInterface +import android.webkit.WebView +import androidx.compose.runtime.* +import androidx.compose.ui.Modifier +import androidx.compose.ui.viewinterop.AndroidView + +@Composable +fun AndroidCommunityEditor( + controller: CommunityEditorController, + modifier: Modifier, + onHtmlChange: (String) -> Unit, + onEditorReady: () -> Unit +) { + val onEditorReadyState = rememberUpdatedState(onEditorReady) + + AndroidView( + modifier = modifier, + factory = { context -> + WebView(context).apply { + layoutParams = ViewGroup.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.MATCH_PARENT + ) + + settings.javaScriptEnabled = true + settings.domStorageEnabled = true + + addJavascriptInterface( + object { + @JavascriptInterface + fun onHtmlChanged(html: String) { + onHtmlChange(html) + } + + @JavascriptInterface + fun onEditorReady() { + onEditorReadyState.value.invoke() + } + }, + "AndroidBridge" + ) + + controller.delegate = AndroidEditorDelegate(this) + + val base = "composeResources" + val pkg = context.assets.list(base)!!.first { + it.contains("community.generated.resources") + } + + val path = "file:///android_asset/$base/$pkg/files/editor/quill.html" + loadUrl(path) + } + }, + update = { webView -> + controller.delegate = AndroidEditorDelegate(webView) + } + ) +} + +private class EditorBridge( + private val onHtmlChanged: (String) -> Unit, +) { + @JavascriptInterface + fun onHtmlChanged(html: String) { + onHtmlChanged(html) + } +} \ No newline at end of file diff --git a/shared/feature/community/src/androidMain/kotlin/com/kus/feature/community/ui/write/AndroidCommunityEditorRenderer.kt b/shared/feature/community/src/androidMain/kotlin/com/kus/feature/community/ui/write/AndroidCommunityEditorRenderer.kt new file mode 100644 index 00000000..08b62f7f --- /dev/null +++ b/shared/feature/community/src/androidMain/kotlin/com/kus/feature/community/ui/write/AndroidCommunityEditorRenderer.kt @@ -0,0 +1,21 @@ +package com.kus.feature.community.ui.write + +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier + +class AndroidCommunityEditorRenderer : CommunityEditorRenderer { + @Composable + override fun Render( + controller: CommunityEditorController, + modifier: Modifier, + onHtmlChange: (String) -> Unit, + onEditorReady: () -> Unit + ) { + AndroidCommunityEditor( + controller = controller, + modifier = modifier, + onHtmlChange = onHtmlChange, + onEditorReady = onEditorReady + ) + } +} \ No newline at end of file diff --git a/shared/feature/community/src/androidMain/kotlin/com/kus/feature/community/ui/write/AndroidEditorDelegate.kt b/shared/feature/community/src/androidMain/kotlin/com/kus/feature/community/ui/write/AndroidEditorDelegate.kt new file mode 100644 index 00000000..f7a5b6e4 --- /dev/null +++ b/shared/feature/community/src/androidMain/kotlin/com/kus/feature/community/ui/write/AndroidEditorDelegate.kt @@ -0,0 +1,27 @@ +package com.kus.feature.community.ui.write + +import android.webkit.WebView +import org.json.JSONObject + +class AndroidEditorDelegate( + private val webView: WebView +) : EditorDelegate { + + private fun eval(js: String) { + webView.evaluateJavascript(js, null) + } + + override fun setHtml(html: String) { + val safe = JSONObject.quote(html) + eval("window.EditorApi.setHtml($safe)") + } + + override fun insertImage(url: String) { + val safe = JSONObject.quote(url) + eval("window.EditorApi.insertImage($safe)") + } + + override fun undo() = eval("window.EditorApi.undo()") + override fun redo() = eval("window.EditorApi.redo()") + override fun toggleBold() = eval("window.EditorApi.toggleBold()") +} \ No newline at end of file diff --git a/shared/feature/community/src/androidMain/kotlin/com/kus/feature/community/ui/write/image/AndroidImagePickerFactory.kt b/shared/feature/community/src/androidMain/kotlin/com/kus/feature/community/ui/write/image/AndroidImagePickerFactory.kt new file mode 100644 index 00000000..d77ab578 --- /dev/null +++ b/shared/feature/community/src/androidMain/kotlin/com/kus/feature/community/ui/write/image/AndroidImagePickerFactory.kt @@ -0,0 +1,66 @@ +package com.kus.feature.community.ui.write.image + +import android.content.pm.PackageManager +import android.os.Build +import androidx.activity.compose.rememberLauncherForActivityResult +import androidx.activity.result.PickVisualMediaRequest +import androidx.activity.result.contract.ActivityResultContracts +import androidx.compose.runtime.* +import androidx.compose.ui.platform.LocalContext +import androidx.core.content.ContextCompat + +class AndroidImagePickerFactory : PlatformImagePickerFactory { + @Composable + override fun rememberPicker(): PlatformImagePicker { + var pendingPicked by remember { mutableStateOf<((String?) -> Unit)?>(null) } + var pendingAfterPermission by remember { mutableStateOf<(() -> Unit)?>(null) } + + val pickVisualLauncher = rememberLauncherForActivityResult( + ActivityResultContracts.PickVisualMedia() + ) { uri -> + pendingPicked?.invoke(uri?.toString()) + pendingPicked = null + } + + val getContentLauncher = rememberLauncherForActivityResult( + ActivityResultContracts.GetContent() + ) { uri -> + pendingPicked?.invoke(uri?.toString()) + pendingPicked = null + } + + val permissionLauncher = rememberLauncherForActivityResult( + ActivityResultContracts.RequestPermission() + ) { granted -> + if (granted) pendingAfterPermission?.invoke() + else pendingPicked?.invoke(null) + pendingAfterPermission = null + pendingPicked = null + } + + val context = LocalContext.current + + return remember { + PlatformImagePicker { onPicked -> + pendingPicked = onPicked + + if (Build.VERSION.SDK_INT >= 33) { + pickVisualLauncher.launch( + PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly) + ) + return@PlatformImagePicker + } + + val perm = android.Manifest.permission.READ_EXTERNAL_STORAGE + val granted = ContextCompat.checkSelfPermission(context, perm) == PackageManager.PERMISSION_GRANTED + val doPick = { getContentLauncher.launch("image/*") } + + if (granted) doPick() + else { + pendingAfterPermission = doPick + permissionLauncher.launch(perm) + } + } + } + } +} \ No newline at end of file diff --git a/shared/feature/community/src/commonMain/composeResources/drawable/bg_halo.png b/shared/feature/community/src/commonMain/composeResources/drawable/bg_halo.png new file mode 100644 index 0000000000000000000000000000000000000000..8a4932944466c55c8b4e983b8955e9ed341aac26 GIT binary patch literal 514519 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%0AG0JhYvtsZbVr)!r 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 JDq+K*{{!Nfd=vlx literal 0 HcmV?d00001 diff --git a/shared/feature/community/src/commonMain/composeResources/drawable/ic_bold.png b/shared/feature/community/src/commonMain/composeResources/drawable/ic_bold.png new file mode 100644 index 0000000000000000000000000000000000000000..b1c9716b17a1bd907f9ca01b56adc93cd2e4617d GIT binary patch literal 402 zcmeAS@N?(olHy`uVBq!ia0vp^Hb88_!3HE3=FUz5Qk(@Ik;M!QI^H16xYTyqN}wQP zage(c!@6@aFM%AEbVpxD28NCO+}_%oX_J@cxHC;ChtW^w zCf^;QZOyp{xpW-8FL2FK78ml~z&ug7@$e518?ELS2mk!J|5WxzdRu>rn#$)rCcbOW zbm-5N6me@m^ddk)w%+H&=RNloIQonxZp*zMHO*Nv`>h?%;rf~T-0c6~nkuawBkEc> zsZ+(X=%VG3jmLgYHT}ZAN^0_BIgtJzRS^>5E9|#CIlOc4;=-qYHtE!}Fnqm{d2?sc zox>p0xfVMomT2_wwO(9kU{#D^|?(sihPSS zR`nQ`>%WM7{ClH5=k?ON-`#Sb@V;P=yjQiB?c$mF)800xv+H&@Zq$AUwPfbp52Cw5 Wyz+KF?KuPtLIzJ)KbLh*2~7aJE~X&> literal 0 HcmV?d00001 diff --git a/shared/feature/community/src/commonMain/composeResources/drawable/ic_drop_down.xml b/shared/feature/community/src/commonMain/composeResources/drawable/ic_drop_down.xml new file mode 100644 index 00000000..ecfdbe41 --- /dev/null +++ b/shared/feature/community/src/commonMain/composeResources/drawable/ic_drop_down.xml @@ -0,0 +1,9 @@ + + + diff --git a/shared/feature/community/src/commonMain/composeResources/drawable/ic_insert_image.png b/shared/feature/community/src/commonMain/composeResources/drawable/ic_insert_image.png new file mode 100644 index 0000000000000000000000000000000000000000..0797d942f441d34a791f040f381821a75ebded5c GIT binary patch literal 2357 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 *&ff(2l3WaE^X@H3YZ29$3Q*w38&4It# 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 literal 0 HcmV?d00001 diff --git a/shared/feature/community/src/commonMain/composeResources/drawable/ic_medal_3.png b/shared/feature/community/src/commonMain/composeResources/drawable/ic_medal_3.png new file mode 100644 index 0000000000000000000000000000000000000000..93bc8fe0bc435e972c7d8e77f1de045579bf99b0 GIT binary patch literal 23280 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 + + diff --git a/shared/feature/community/src/commonMain/composeResources/drawable/ic_redo.png b/shared/feature/community/src/commonMain/composeResources/drawable/ic_redo.png new file mode 100644 index 0000000000000000000000000000000000000000..5ffa02c0309de6203c6f5d2766a90f89a9071db8 GIT binary patch literal 1088 zcmV-G1i$-@~0drDELIAGL9O(c600d`2O+f$vv5yPS~`4!-0=F<#M@paB$EjhXkYu77DvE^fU(b*dlyoW@aWiJ3ISH zFN7)?fE(A$ONcrdATJ>*Wq>?{sFeYH3sEft_!OdE1~5Y2@L|;={K-NJAp>yZzHuYx z_|Rqs`XnKRkpZ}IyDl@NP%;2A#MKy5I2pjzpjt>7zzF%nhwm-It%MX-2H?iExRGce zguE8QMInWj0l0C$W@l%=^GX&%DnfXs5LIQr=MY6v$R&VbCBqb4H(5VAI{K3OIgJs| z6;k+aa-Z|_^Ul=N)E*0o`R!XFJk@2Mof)RIA90^Wf5n}dG{?^2>-;u{C>M56HpD-3 z{SAHTUJ@fuCY3GX&W3FkVKq9B0hL$7ej3Md0x znQ?J(u|akP6pbYKufH>Ac|#N4rK{uMfed_O@XJRU5xzKf$J=~yOkg^katS#G4d$Ks zUZV#eSHONO_GK+jlkk{WYq#48-VA2O23dmC;>Pds$r^kzX^+$!*mh(QJ0#41a05AR zwJ!qvlVP$VBpEdP6Zf$ODT76P;2X3f#TgN`!JBwLGicDyddNg_Z`hP2)=-@^@3gqaV0wOK3Khya0k zEGQICwnd7-%Gpc|V=2~F1bD^cKq$l{hlhtvQbNWPfhk520Rm~3W+qZ9a47-={7dhI zlQu~Ku0;TRwPw!Lu$rTs@gV}Bn}k^b*Voqx<%lm4K+KFh=N3Li08vI>_!a@Ahhh`T zfjmS2RZj?myhH$XGV&4uBpF`E6Wf}K3lRV^l8n#2%6RFu#;B<4CRw-?0RmIZRRI@x z8;^bFS_Hrh^hd_$33@~0drDELIAGL9O(c600d`2O+f$vv5yPi@C3n65c>&;pCEQgl~AS%bk4wFr%M+V47fDV zWVq)46)7>nl6Ni1tk(aGMk{G;tv>DL?AaqrBrMyu^A{Hv?~vTambWaccYlB1JU%{d z3C)xh35p;tFE76$xq&U`oi1QoUtC-~KRY|?2#u5x3CRb6T2Kzi@?L1BL|{mOpz`H% zxg<1F>@Xxj_!KUSy|Z(%D|e@6tg3afUVWlReRLMEEa!%U=f%@tS$3z ztVtZ&ko@JH%88T-K-P=J;_k`G$%8(`otw~-L`TZx*u`KDUl_J(!{@MOn$P8Oc}&)Z zZI8s{**GO6ODNAv&n!^6Z~prF`Xlz$;gb){aR8|cIUp@Ocul8SDyu%q^cH2?RQOp9 z72$(_@W`K`07Ogw1y}a7+3XIRf<*QKU_AE^9tEqQ580ROLka-0fws5zf7^RX_51w+ zo?%z=8FEWYOW)aV@?d1-jsg(&6YIJGp}c3{Td#!W!wW4SZ`)0WWt43)kTX9&UzIg` zrzzMK-Es3SSf|g~+(RA0p1(pSbig%e*4Eavo9yAu*T&_6b?WvnW4+@FK-gqLExe}? zXRi`gw)+yLf>jiN&<1Fsd1)2AhB6(5T?ec;+)GF9r~rZLIsw5@`#J2oXTYh&fhvqL zl#RUn&4GAgot~cdQ5O1af~F3+g@uK-a!_nqfxw<%U~VDkI@f+CiV#jCkV2vG8hu0H zXonHy%f!)sY3@TtiIcxbvEyl~A!sJ76?RCLy~u&|X#s-!+9JG+2eEurkOm+UFuuhW zA*|Ymz*3c&Voy_pSYyW(E!7>Nm*Ry%sZ8#S|HOh)05UZnh;MQSiR-nAeTg&<2xpQy zxeRY^ZU%|LphAE+nC@?hDau=v4w8cx(@PWvMIi7by+E=-uR8WM9KV`&L?G_j62Z;V zePNNlDoC5?i9?P2B>t^06HdclE|@78zI^v27LuIde(N{hZM>2Q8N;;z00001?n-1:0),r=1;r2&&void 0!==arguments[2]?arguments[2]:p;t&&t(e,null);let i=o.length;for(;i--;){let t=o[i];if("string"==typeof t){const e=r(t);e!==t&&(n(o)||(o[i]=e),t=e)}e[t]=!0}return e}function S(e){for(let t=0;t/gm),z=a(/\${[\w\W]*}/gm),B=a(/^data-[\-\w.\u00B7-\uFFFF]/),W=a(/^aria-[\-\w]+$/),G=a(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),Y=a(/^(?:\w+script|data):/i),j=a(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),q=a(/^html$/i);var X=Object.freeze({__proto__:null,MUSTACHE_EXPR:F,ERB_EXPR:H,TMPLIT_EXPR:z,DATA_ATTR:B,ARIA_ATTR:W,IS_ALLOWED_URI:G,IS_SCRIPT_OR_DATA:Y,ATTR_WHITESPACE:j,DOCTYPE_NAME:q});const K=function(){return"undefined"==typeof window?null:window},V=function(e,t){if("object"!=typeof e||"function"!=typeof e.createPolicy)return null;let n=null;const o="data-tt-policy-suffix";t&&t.hasAttribute(o)&&(n=t.getAttribute(o));const r="dompurify"+(n?"#"+n:"");try{return e.createPolicy(r,{createHTML:e=>e,createScriptURL:e=>e})}catch(e){return console.warn("TrustedTypes policy "+r+" could not be created."),null}};var $=function t(){let n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:K();const o=e=>t(e);if(o.version="3.0.8",o.removed=[],!n||!n.document||9!==n.document.nodeType)return o.isSupported=!1,o;let{document:r}=n;const a=r,c=a.currentScript,{DocumentFragment:s,HTMLTemplateElement:_,Node:b,Element:S,NodeFilter:F,NamedNodeMap:H=n.NamedNodeMap||n.MozNamedAttrMap,HTMLFormElement:z,DOMParser:B,trustedTypes:W}=n,Y=S.prototype,j=w(Y,"cloneNode"),$=w(Y,"nextSibling"),Z=w(Y,"childNodes"),J=w(Y,"parentNode");if("function"==typeof _){const e=r.createElement("template");e.content&&e.content.ownerDocument&&(r=e.content.ownerDocument)}let Q,ee="";const{implementation:te,createNodeIterator:ne,createDocumentFragment:oe,getElementsByTagName:re}=r,{importNode:ie}=a;let ae={};o.isSupported="function"==typeof e&&"function"==typeof J&&te&&void 0!==te.createHTMLDocument;const{MUSTACHE_EXPR:le,ERB_EXPR:ce,TMPLIT_EXPR:se,DATA_ATTR:ue,ARIA_ATTR:me,IS_SCRIPT_OR_DATA:fe,ATTR_WHITESPACE:pe}=X;let{IS_ALLOWED_URI:de}=X,he=null;const ge=N({},[...D,...L,...v,...k,...O]);let Te=null;const ye=N({},[...I,...M,...U,...P]);let Ee=Object.seal(l(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),Ae=null,_e=null,be=!0,Ne=!0,Se=!1,Re=!0,we=!1,De=!1,Le=!1,ve=!1,xe=!1,ke=!1,Ce=!1,Oe=!0,Ie=!1;const Me="user-content-";let Ue=!0,Pe=!1,Fe={},He=null;const ze=N({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]);let Be=null;const We=N({},["audio","video","img","source","image","track"]);let Ge=null;const Ye=N({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),je="http://www.w3.org/1998/Math/MathML",qe="http://www.w3.org/2000/svg",Xe="http://www.w3.org/1999/xhtml";let Ke=Xe,Ve=!1,$e=null;const Ze=N({},[je,qe,Xe],d);let Je=null;const Qe=["application/xhtml+xml","text/html"],et="text/html";let tt=null,nt=null;const ot=r.createElement("form"),rt=function(e){return e instanceof RegExp||e instanceof Function},it=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(!nt||nt!==e){if(e&&"object"==typeof e||(e={}),e=R(e),Je=-1===Qe.indexOf(e.PARSER_MEDIA_TYPE)?et:e.PARSER_MEDIA_TYPE,tt="application/xhtml+xml"===Je?d:p,he="ALLOWED_TAGS"in e?N({},e.ALLOWED_TAGS,tt):ge,Te="ALLOWED_ATTR"in e?N({},e.ALLOWED_ATTR,tt):ye,$e="ALLOWED_NAMESPACES"in e?N({},e.ALLOWED_NAMESPACES,d):Ze,Ge="ADD_URI_SAFE_ATTR"in e?N(R(Ye),e.ADD_URI_SAFE_ATTR,tt):Ye,Be="ADD_DATA_URI_TAGS"in e?N(R(We),e.ADD_DATA_URI_TAGS,tt):We,He="FORBID_CONTENTS"in e?N({},e.FORBID_CONTENTS,tt):ze,Ae="FORBID_TAGS"in e?N({},e.FORBID_TAGS,tt):{},_e="FORBID_ATTR"in e?N({},e.FORBID_ATTR,tt):{},Fe="USE_PROFILES"in e&&e.USE_PROFILES,be=!1!==e.ALLOW_ARIA_ATTR,Ne=!1!==e.ALLOW_DATA_ATTR,Se=e.ALLOW_UNKNOWN_PROTOCOLS||!1,Re=!1!==e.ALLOW_SELF_CLOSE_IN_ATTR,we=e.SAFE_FOR_TEMPLATES||!1,De=e.WHOLE_DOCUMENT||!1,xe=e.RETURN_DOM||!1,ke=e.RETURN_DOM_FRAGMENT||!1,Ce=e.RETURN_TRUSTED_TYPE||!1,ve=e.FORCE_BODY||!1,Oe=!1!==e.SANITIZE_DOM,Ie=e.SANITIZE_NAMED_PROPS||!1,Ue=!1!==e.KEEP_CONTENT,Pe=e.IN_PLACE||!1,de=e.ALLOWED_URI_REGEXP||G,Ke=e.NAMESPACE||Xe,Ee=e.CUSTOM_ELEMENT_HANDLING||{},e.CUSTOM_ELEMENT_HANDLING&&rt(e.CUSTOM_ELEMENT_HANDLING.tagNameCheck)&&(Ee.tagNameCheck=e.CUSTOM_ELEMENT_HANDLING.tagNameCheck),e.CUSTOM_ELEMENT_HANDLING&&rt(e.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)&&(Ee.attributeNameCheck=e.CUSTOM_ELEMENT_HANDLING.attributeNameCheck),e.CUSTOM_ELEMENT_HANDLING&&"boolean"==typeof e.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements&&(Ee.allowCustomizedBuiltInElements=e.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements),we&&(Ne=!1),ke&&(xe=!0),Fe&&(he=N({},O),Te=[],!0===Fe.html&&(N(he,D),N(Te,I)),!0===Fe.svg&&(N(he,L),N(Te,M),N(Te,P)),!0===Fe.svgFilters&&(N(he,v),N(Te,M),N(Te,P)),!0===Fe.mathMl&&(N(he,k),N(Te,U),N(Te,P))),e.ADD_TAGS&&(he===ge&&(he=R(he)),N(he,e.ADD_TAGS,tt)),e.ADD_ATTR&&(Te===ye&&(Te=R(Te)),N(Te,e.ADD_ATTR,tt)),e.ADD_URI_SAFE_ATTR&&N(Ge,e.ADD_URI_SAFE_ATTR,tt),e.FORBID_CONTENTS&&(He===ze&&(He=R(He)),N(He,e.FORBID_CONTENTS,tt)),Ue&&(he["#text"]=!0),De&&N(he,["html","head","body"]),he.table&&(N(he,["tbody"]),delete Ae.tbody),e.TRUSTED_TYPES_POLICY){if("function"!=typeof e.TRUSTED_TYPES_POLICY.createHTML)throw A('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');if("function"!=typeof e.TRUSTED_TYPES_POLICY.createScriptURL)throw A('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');Q=e.TRUSTED_TYPES_POLICY,ee=Q.createHTML("")}else void 0===Q&&(Q=V(W,c)),null!==Q&&"string"==typeof ee&&(ee=Q.createHTML(""));i&&i(e),nt=e}},at=N({},["mi","mo","mn","ms","mtext"]),lt=N({},["foreignobject","desc","title","annotation-xml"]),ct=N({},["title","style","font","a","script"]),st=N({},[...L,...v,...x]),ut=N({},[...k,...C]),mt=function(e){let t=J(e);t&&t.tagName||(t={namespaceURI:Ke,tagName:"template"});const n=p(e.tagName),o=p(t.tagName);return!!$e[e.namespaceURI]&&(e.namespaceURI===qe?t.namespaceURI===Xe?"svg"===n:t.namespaceURI===je?"svg"===n&&("annotation-xml"===o||at[o]):Boolean(st[n]):e.namespaceURI===je?t.namespaceURI===Xe?"math"===n:t.namespaceURI===qe?"math"===n&<[o]:Boolean(ut[n]):e.namespaceURI===Xe?!(t.namespaceURI===qe&&!lt[o])&&(!(t.namespaceURI===je&&!at[o])&&(!ut[n]&&(ct[n]||!st[n]))):!("application/xhtml+xml"!==Je||!$e[e.namespaceURI]))},ft=function(e){f(o.removed,{element:e});try{e.parentNode.removeChild(e)}catch(t){e.remove()}},pt=function(e,t){try{f(o.removed,{attribute:t.getAttributeNode(e),from:t})}catch(e){f(o.removed,{attribute:null,from:t})}if(t.removeAttribute(e),"is"===e&&!Te[e])if(xe||ke)try{ft(t)}catch(e){}else try{t.setAttribute(e,"")}catch(e){}},dt=function(e){let t=null,n=null;if(ve)e=""+e;else{const t=h(e,/^[\r\n\t ]+/);n=t&&t[0]}"application/xhtml+xml"===Je&&Ke===Xe&&(e=''+e+"");const o=Q?Q.createHTML(e):e;if(Ke===Xe)try{t=(new B).parseFromString(o,Je)}catch(e){}if(!t||!t.documentElement){t=te.createDocument(Ke,"template",null);try{t.documentElement.innerHTML=Ve?ee:o}catch(e){}}const i=t.body||t.documentElement;return e&&n&&i.insertBefore(r.createTextNode(n),i.childNodes[0]||null),Ke===Xe?re.call(t,De?"html":"body")[0]:De?t.documentElement:i},ht=function(e){return ne.call(e.ownerDocument||e,e,F.SHOW_ELEMENT|F.SHOW_COMMENT|F.SHOW_TEXT,null)},gt=function(e){return e instanceof z&&("string"!=typeof e.nodeName||"string"!=typeof e.textContent||"function"!=typeof e.removeChild||!(e.attributes instanceof H)||"function"!=typeof e.removeAttribute||"function"!=typeof e.setAttribute||"string"!=typeof e.namespaceURI||"function"!=typeof e.insertBefore||"function"!=typeof e.hasChildNodes)},Tt=function(e){return"function"==typeof b&&e instanceof b},yt=function(e,t,n){ae[e]&&u(ae[e],(e=>{e.call(o,t,n,nt)}))},Et=function(e){let t=null;if(yt("beforeSanitizeElements",e,null),gt(e))return ft(e),!0;const n=tt(e.nodeName);if(yt("uponSanitizeElement",e,{tagName:n,allowedTags:he}),e.hasChildNodes()&&!Tt(e.firstElementChild)&&E(/<[/\w]/g,e.innerHTML)&&E(/<[/\w]/g,e.textContent))return ft(e),!0;if(!he[n]||Ae[n]){if(!Ae[n]&&_t(n)){if(Ee.tagNameCheck instanceof RegExp&&E(Ee.tagNameCheck,n))return!1;if(Ee.tagNameCheck instanceof Function&&Ee.tagNameCheck(n))return!1}if(Ue&&!He[n]){const t=J(e)||e.parentNode,n=Z(e)||e.childNodes;if(n&&t){for(let o=n.length-1;o>=0;--o)t.insertBefore(j(n[o],!0),$(e))}}return ft(e),!0}return e instanceof S&&!mt(e)?(ft(e),!0):"noscript"!==n&&"noembed"!==n&&"noframes"!==n||!E(/<\/no(script|embed|frames)/i,e.innerHTML)?(we&&3===e.nodeType&&(t=e.textContent,u([le,ce,se],(e=>{t=g(t,e," ")})),e.textContent!==t&&(f(o.removed,{element:e.cloneNode()}),e.textContent=t)),yt("afterSanitizeElements",e,null),!1):(ft(e),!0)},At=function(e,t,n){if(Oe&&("id"===t||"name"===t)&&(n in r||n in ot))return!1;if(Ne&&!_e[t]&&E(ue,t));else if(be&&E(me,t));else if(!Te[t]||_e[t]){if(!(_t(e)&&(Ee.tagNameCheck instanceof RegExp&&E(Ee.tagNameCheck,e)||Ee.tagNameCheck instanceof Function&&Ee.tagNameCheck(e))&&(Ee.attributeNameCheck instanceof RegExp&&E(Ee.attributeNameCheck,t)||Ee.attributeNameCheck instanceof Function&&Ee.attributeNameCheck(t))||"is"===t&&Ee.allowCustomizedBuiltInElements&&(Ee.tagNameCheck instanceof RegExp&&E(Ee.tagNameCheck,n)||Ee.tagNameCheck instanceof Function&&Ee.tagNameCheck(n))))return!1}else if(Ge[t]);else if(E(de,g(n,pe,"")));else if("src"!==t&&"xlink:href"!==t&&"href"!==t||"script"===e||0!==T(n,"data:")||!Be[e]){if(Se&&!E(fe,g(n,pe,"")));else if(n)return!1}else;return!0},_t=function(e){return e.indexOf("-")>0},bt=function(e){yt("beforeSanitizeAttributes",e,null);const{attributes:t}=e;if(!t)return;const n={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:Te};let r=t.length;for(;r--;){const i=t[r],{name:a,namespaceURI:l,value:c}=i,s=tt(a);let f="value"===a?c:y(c);if(n.attrName=s,n.attrValue=f,n.keepAttr=!0,n.forceKeepAttr=void 0,yt("uponSanitizeAttribute",e,n),f=n.attrValue,n.forceKeepAttr)continue;if(pt(a,e),!n.keepAttr)continue;if(!Re&&E(/\/>/i,f)){pt(a,e);continue}we&&u([le,ce,se],(e=>{f=g(f,e," ")}));const p=tt(e.nodeName);if(At(p,s,f)){if(!Ie||"id"!==s&&"name"!==s||(pt(a,e),f=Me+f),Q&&"object"==typeof W&&"function"==typeof W.getAttributeType)if(l);else switch(W.getAttributeType(p,s)){case"TrustedHTML":f=Q.createHTML(f);break;case"TrustedScriptURL":f=Q.createScriptURL(f)}try{l?e.setAttributeNS(l,a,f):e.setAttribute(a,f),m(o.removed)}catch(e){}}}yt("afterSanitizeAttributes",e,null)},Nt=function e(t){let n=null;const o=ht(t);for(yt("beforeSanitizeShadowDOM",t,null);n=o.nextNode();)yt("uponSanitizeShadowNode",n,null),Et(n)||(n.content instanceof s&&e(n.content),bt(n));yt("afterSanitizeShadowDOM",t,null)};return o.sanitize=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=null,r=null,i=null,l=null;if(Ve=!e,Ve&&(e="\x3c!--\x3e"),"string"!=typeof e&&!Tt(e)){if("function"!=typeof e.toString)throw A("toString is not a function");if("string"!=typeof(e=e.toString()))throw A("dirty is not a string, aborting")}if(!o.isSupported)return e;if(Le||it(t),o.removed=[],"string"==typeof e&&(Pe=!1),Pe){if(e.nodeName){const t=tt(e.nodeName);if(!he[t]||Ae[t])throw A("root node is forbidden and cannot be sanitized in-place")}}else if(e instanceof b)n=dt("\x3c!----\x3e"),r=n.ownerDocument.importNode(e,!0),1===r.nodeType&&"BODY"===r.nodeName||"HTML"===r.nodeName?n=r:n.appendChild(r);else{if(!xe&&!we&&!De&&-1===e.indexOf("<"))return Q&&Ce?Q.createHTML(e):e;if(n=dt(e),!n)return xe?null:Ce?ee:""}n&&ve&&ft(n.firstChild);const c=ht(Pe?e:n);for(;i=c.nextNode();)Et(i)||(i.content instanceof s&&Nt(i.content),bt(i));if(Pe)return e;if(xe){if(ke)for(l=oe.call(n.ownerDocument);n.firstChild;)l.appendChild(n.firstChild);else l=n;return(Te.shadowroot||Te.shadowrootmode)&&(l=ie.call(a,l,!0)),l}let m=De?n.outerHTML:n.innerHTML;return De&&he["!doctype"]&&n.ownerDocument&&n.ownerDocument.doctype&&n.ownerDocument.doctype.name&&E(q,n.ownerDocument.doctype.name)&&(m="\n"+m),we&&u([le,ce,se],(e=>{m=g(m,e," ")})),Q&&Ce?Q.createHTML(m):m},o.setConfig=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};it(e),Le=!0},o.clearConfig=function(){nt=null,Le=!1},o.isValidAttribute=function(e,t,n){nt||it({});const o=tt(e),r=tt(t);return At(o,r,n)},o.addHook=function(e,t){"function"==typeof t&&(ae[e]=ae[e]||[],f(ae[e],t))},o.removeHook=function(e){if(ae[e])return m(ae[e])},o.removeHooks=function(e){ae[e]&&(ae[e]=[])},o.removeAllHooks=function(){ae={}},o}();return $})); +//# sourceMappingURL=purify.min.js.map diff --git a/shared/feature/community/src/commonMain/composeResources/files/editor/quill.html b/shared/feature/community/src/commonMain/composeResources/files/editor/quill.html new file mode 100644 index 00000000..950c1cea --- /dev/null +++ b/shared/feature/community/src/commonMain/composeResources/files/editor/quill.html @@ -0,0 +1,240 @@ + + + + + + + + + + + + + + +

+ + + + diff --git a/shared/feature/community/src/commonMain/composeResources/files/editor/quill.min.js b/shared/feature/community/src/commonMain/composeResources/files/editor/quill.min.js new file mode 100644 index 00000000..d9f46b8d --- /dev/null +++ b/shared/feature/community/src/commonMain/composeResources/files/editor/quill.min.js @@ -0,0 +1,8 @@ +/*! + * Quill Editor v1.3.7 + * https://quilljs.com/ + * Copyright (c) 2014, Jason Chen + * Copyright (c) 2013, salesforce.com + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.Quill=e():t.Quill=e()}("undefined"!=typeof self?self:this,function(){return function(t){function e(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return t[r].call(o.exports,o,o.exports,e),o.l=!0,o.exports}var n={};return e.m=t,e.c=n,e.d=function(t,n,r){e.o(t,n)||Object.defineProperty(t,n,{configurable:!1,enumerable:!0,get:r})},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,"a",n),n},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p="",e(e.s=45)}([function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n(17),o=n(18),i=n(19),l=n(48),a=n(49),s=n(50),u=n(51),c=n(52),f=n(11),h=n(29),p=n(30),d=n(28),y=n(1),v={Scope:y.Scope,create:y.create,find:y.find,query:y.query,register:y.register,Container:r.default,Format:o.default,Leaf:i.default,Embed:u.default,Scroll:l.default,Block:s.default,Inline:a.default,Text:c.default,Attributor:{Attribute:f.default,Class:h.default,Style:p.default,Store:d.default}};e.default=v},function(t,e,n){"use strict";function r(t,e){var n=i(t);if(null==n)throw new s("Unable to create "+t+" blot");var r=n;return new r(t instanceof Node||t.nodeType===Node.TEXT_NODE?t:r.create(e),e)}function o(t,n){return void 0===n&&(n=!1),null==t?null:null!=t[e.DATA_KEY]?t[e.DATA_KEY].blot:n?o(t.parentNode,n):null}function i(t,e){void 0===e&&(e=p.ANY);var n;if("string"==typeof t)n=h[t]||u[t];else if(t instanceof Text||t.nodeType===Node.TEXT_NODE)n=h.text;else if("number"==typeof t)t&p.LEVEL&p.BLOCK?n=h.block:t&p.LEVEL&p.INLINE&&(n=h.inline);else if(t instanceof HTMLElement){var r=(t.getAttribute("class")||"").split(/\s+/);for(var o in r)if(n=c[r[o]])break;n=n||f[t.tagName]}return null==n?null:e&p.LEVEL&n.scope&&e&p.TYPE&n.scope?n:null}function l(){for(var t=[],e=0;e1)return t.map(function(t){return l(t)});var n=t[0];if("string"!=typeof n.blotName&&"string"!=typeof n.attrName)throw new s("Invalid definition");if("abstract"===n.blotName)throw new s("Cannot register abstract class");if(h[n.blotName||n.attrName]=n,"string"==typeof n.keyName)u[n.keyName]=n;else if(null!=n.className&&(c[n.className]=n),null!=n.tagName){Array.isArray(n.tagName)?n.tagName=n.tagName.map(function(t){return t.toUpperCase()}):n.tagName=n.tagName.toUpperCase();var r=Array.isArray(n.tagName)?n.tagName:[n.tagName];r.forEach(function(t){null!=f[t]&&null!=n.className||(f[t]=n)})}return n}var a=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(e,"__esModule",{value:!0});var s=function(t){function e(e){var n=this;return e="[Parchment] "+e,n=t.call(this,e)||this,n.message=e,n.name=n.constructor.name,n}return a(e,t),e}(Error);e.ParchmentError=s;var u={},c={},f={},h={};e.DATA_KEY="__blot";var p;!function(t){t[t.TYPE=3]="TYPE",t[t.LEVEL=12]="LEVEL",t[t.ATTRIBUTE=13]="ATTRIBUTE",t[t.BLOT=14]="BLOT",t[t.INLINE=7]="INLINE",t[t.BLOCK=11]="BLOCK",t[t.BLOCK_BLOT=10]="BLOCK_BLOT",t[t.INLINE_BLOT=6]="INLINE_BLOT",t[t.BLOCK_ATTRIBUTE=9]="BLOCK_ATTRIBUTE",t[t.INLINE_ATTRIBUTE=5]="INLINE_ATTRIBUTE",t[t.ANY=15]="ANY"}(p=e.Scope||(e.Scope={})),e.create=r,e.find=o,e.query=i,e.register=l},function(t,e){"use strict";var n=Object.prototype.hasOwnProperty,r=Object.prototype.toString,o=Object.defineProperty,i=Object.getOwnPropertyDescriptor,l=function(t){return"function"==typeof Array.isArray?Array.isArray(t):"[object Array]"===r.call(t)},a=function(t){if(!t||"[object Object]"!==r.call(t))return!1;var e=n.call(t,"constructor"),o=t.constructor&&t.constructor.prototype&&n.call(t.constructor.prototype,"isPrototypeOf");if(t.constructor&&!e&&!o)return!1;var i;for(i in t);return void 0===i||n.call(t,i)},s=function(t,e){o&&"__proto__"===e.name?o(t,e.name,{enumerable:!0,configurable:!0,value:e.newValue,writable:!0}):t[e.name]=e.newValue},u=function(t,e){if("__proto__"===e){if(!n.call(t,e))return;if(i)return i(t,e).value}return t[e]};t.exports=function t(){var e,n,r,o,i,c,f=arguments[0],h=1,p=arguments.length,d=!1;for("boolean"==typeof f&&(d=f,f=arguments[1]||{},h=2),(null==f||"object"!=typeof f&&"function"!=typeof f)&&(f={});h1&&void 0!==arguments[1]?arguments[1]:{};return null==t?e:("function"==typeof t.formats&&(e=(0,f.default)(e,t.formats())),null==t.parent||"scroll"==t.parent.blotName||t.parent.statics.scope!==t.statics.scope?e:a(t.parent,e))}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.BlockEmbed=e.bubbleFormats=void 0;var s=function(){function t(t,e){for(var n=0;n0&&(t1&&void 0!==arguments[1]&&arguments[1];if(n&&(0===t||t>=this.length()-1)){var r=this.clone();return 0===t?(this.parent.insertBefore(r,this),this):(this.parent.insertBefore(r,this.next),r)}var o=u(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"split",this).call(this,t,n);return this.cache={},o}}]),e}(y.default.Block);x.blotName="block",x.tagName="P",x.defaultChild="break",x.allowedChildren=[m.default,y.default.Embed,O.default],e.bubbleFormats=a,e.BlockEmbed=w,e.default=x},function(t,e,n){var r=n(54),o=n(12),i=n(2),l=n(20),a=String.fromCharCode(0),s=function(t){Array.isArray(t)?this.ops=t:null!=t&&Array.isArray(t.ops)?this.ops=t.ops:this.ops=[]};s.prototype.insert=function(t,e){var n={};return 0===t.length?this:(n.insert=t,null!=e&&"object"==typeof e&&Object.keys(e).length>0&&(n.attributes=e),this.push(n))},s.prototype.delete=function(t){return t<=0?this:this.push({delete:t})},s.prototype.retain=function(t,e){if(t<=0)return this;var n={retain:t};return null!=e&&"object"==typeof e&&Object.keys(e).length>0&&(n.attributes=e),this.push(n)},s.prototype.push=function(t){var e=this.ops.length,n=this.ops[e-1];if(t=i(!0,{},t),"object"==typeof n){if("number"==typeof t.delete&&"number"==typeof n.delete)return this.ops[e-1]={delete:n.delete+t.delete},this;if("number"==typeof n.delete&&null!=t.insert&&(e-=1,"object"!=typeof(n=this.ops[e-1])))return this.ops.unshift(t),this;if(o(t.attributes,n.attributes)){if("string"==typeof t.insert&&"string"==typeof n.insert)return this.ops[e-1]={insert:n.insert+t.insert},"object"==typeof t.attributes&&(this.ops[e-1].attributes=t.attributes),this;if("number"==typeof t.retain&&"number"==typeof n.retain)return this.ops[e-1]={retain:n.retain+t.retain},"object"==typeof t.attributes&&(this.ops[e-1].attributes=t.attributes),this}}return e===this.ops.length?this.ops.push(t):this.ops.splice(e,0,t),this},s.prototype.chop=function(){var t=this.ops[this.ops.length-1];return t&&t.retain&&!t.attributes&&this.ops.pop(),this},s.prototype.filter=function(t){return this.ops.filter(t)},s.prototype.forEach=function(t){this.ops.forEach(t)},s.prototype.map=function(t){return this.ops.map(t)},s.prototype.partition=function(t){var e=[],n=[];return this.forEach(function(r){(t(r)?e:n).push(r)}),[e,n]},s.prototype.reduce=function(t,e){return this.ops.reduce(t,e)},s.prototype.changeLength=function(){return this.reduce(function(t,e){return e.insert?t+l.length(e):e.delete?t-e.delete:t},0)},s.prototype.length=function(){return this.reduce(function(t,e){return t+l.length(e)},0)},s.prototype.slice=function(t,e){t=t||0,"number"!=typeof e&&(e=1/0);for(var n=[],r=l.iterator(this.ops),o=0;o0&&n.next(i.retain-a)}for(var u=new s(r);e.hasNext()||n.hasNext();)if("insert"===n.peekType())u.push(n.next());else if("delete"===e.peekType())u.push(e.next());else{var c=Math.min(e.peekLength(),n.peekLength()),f=e.next(c),h=n.next(c);if("number"==typeof h.retain){var p={};"number"==typeof f.retain?p.retain=c:p.insert=f.insert;var d=l.attributes.compose(f.attributes,h.attributes,"number"==typeof f.retain);if(d&&(p.attributes=d),u.push(p),!n.hasNext()&&o(u.ops[u.ops.length-1],p)){var y=new s(e.rest());return u.concat(y).chop()}}else"number"==typeof h.delete&&"number"==typeof f.retain&&u.push(h)}return u.chop()},s.prototype.concat=function(t){var e=new s(this.ops.slice());return t.ops.length>0&&(e.push(t.ops[0]),e.ops=e.ops.concat(t.ops.slice(1))),e},s.prototype.diff=function(t,e){if(this.ops===t.ops)return new s;var n=[this,t].map(function(e){return e.map(function(n){if(null!=n.insert)return"string"==typeof n.insert?n.insert:a;var r=e===t?"on":"with";throw new Error("diff() called "+r+" non-document")}).join("")}),i=new s,u=r(n[0],n[1],e),c=l.iterator(this.ops),f=l.iterator(t.ops);return u.forEach(function(t){for(var e=t[1].length;e>0;){var n=0;switch(t[0]){case r.INSERT:n=Math.min(f.peekLength(),e),i.push(f.next(n));break;case r.DELETE:n=Math.min(e,c.peekLength()),c.next(n),i.delete(n);break;case r.EQUAL:n=Math.min(c.peekLength(),f.peekLength(),e);var a=c.next(n),s=f.next(n);o(a.insert,s.insert)?i.retain(n,l.attributes.diff(a.attributes,s.attributes)):i.push(s).delete(n)}e-=n}}),i.chop()},s.prototype.eachLine=function(t,e){e=e||"\n";for(var n=l.iterator(this.ops),r=new s,o=0;n.hasNext();){if("insert"!==n.peekType())return;var i=n.peek(),a=l.length(i)-n.peekLength(),u="string"==typeof i.insert?i.insert.indexOf(e,a)-a:-1;if(u<0)r.push(n.next());else if(u>0)r.push(n.next(u));else{if(!1===t(r,n.next(1).attributes||{},o))return;o+=1,r=new s}}r.length()>0&&t(r,{},o)},s.prototype.transform=function(t,e){if(e=!!e,"number"==typeof t)return this.transformPosition(t,e);for(var n=l.iterator(this.ops),r=l.iterator(t.ops),o=new s;n.hasNext()||r.hasNext();)if("insert"!==n.peekType()||!e&&"insert"===r.peekType())if("insert"===r.peekType())o.push(r.next());else{var i=Math.min(n.peekLength(),r.peekLength()),a=n.next(i),u=r.next(i);if(a.delete)continue;u.delete?o.push(u):o.retain(i,l.attributes.transform(a.attributes,u.attributes,e))}else o.retain(l.length(n.next()));return o.chop()},s.prototype.transformPosition=function(t,e){e=!!e;for(var n=l.iterator(this.ops),r=0;n.hasNext()&&r<=t;){var o=n.peekLength(),i=n.peekType();n.next(),"delete"!==i?("insert"===i&&(r0){var n=this.parent.isolate(this.offset(),this.length());this.moveChildren(n),n.wrap(this)}}}],[{key:"compare",value:function(t,n){var r=e.order.indexOf(t),o=e.order.indexOf(n);return r>=0||o>=0?r-o:t===n?0:t0){var a,s=[g.default.events.TEXT_CHANGE,l,i,e];if((a=this.emitter).emit.apply(a,[g.default.events.EDITOR_CHANGE].concat(s)),e!==g.default.sources.SILENT){var c;(c=this.emitter).emit.apply(c,s)}}return l}function s(t,e,n,r,o){var i={};return"number"==typeof t.index&&"number"==typeof t.length?"number"!=typeof e?(o=r,r=n,n=e,e=t.length,t=t.index):(e=t.length,t=t.index):"number"!=typeof e&&(o=r,r=n,n=e,e=0),"object"===(void 0===n?"undefined":c(n))?(i=n,o=r):"string"==typeof n&&(null!=r?i[n]=r:o=n),o=o||g.default.sources.API,[t,e,i,o]}function u(t,e,n,r){if(null==t)return null;var o=void 0,i=void 0;if(e instanceof d.default){var l=[t.index,t.index+t.length].map(function(t){return e.transformPosition(t,r!==g.default.sources.USER)}),a=f(l,2);o=a[0],i=a[1]}else{var s=[t.index,t.index+t.length].map(function(t){return t=0?t+n:Math.max(e,t+n)}),u=f(s,2);o=u[0],i=u[1]}return new x.Range(o,i-o)}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.overload=e.expandConfig=void 0;var c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},f=function(){function t(t,e){var n=[],r=!0,o=!1,i=void 0;try{for(var l,a=t[Symbol.iterator]();!(r=(l=a.next()).done)&&(n.push(l.value),!e||n.length!==e);r=!0);}catch(t){o=!0,i=t}finally{try{!r&&a.return&&a.return()}finally{if(o)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),h=function(){function t(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:{};if(i(this,t),this.options=l(e,r),this.container=this.options.container,null==this.container)return P.error("Invalid Quill container",e);this.options.debug&&t.debug(this.options.debug);var o=this.container.innerHTML.trim();this.container.classList.add("ql-container"),this.container.innerHTML="",this.container.__quill=this,this.root=this.addContainer("ql-editor"),this.root.classList.add("ql-blank"),this.root.setAttribute("data-gramm",!1),this.scrollingContainer=this.options.scrollingContainer||this.root,this.emitter=new g.default,this.scroll=w.default.create(this.root,{emitter:this.emitter,whitelist:this.options.formats}),this.editor=new v.default(this.scroll),this.selection=new k.default(this.scroll,this.emitter),this.theme=new this.options.theme(this,this.options),this.keyboard=this.theme.addModule("keyboard"),this.clipboard=this.theme.addModule("clipboard"),this.history=this.theme.addModule("history"),this.theme.init(),this.emitter.on(g.default.events.EDITOR_CHANGE,function(t){t===g.default.events.TEXT_CHANGE&&n.root.classList.toggle("ql-blank",n.editor.isBlank())}),this.emitter.on(g.default.events.SCROLL_UPDATE,function(t,e){var r=n.selection.lastRange,o=r&&0===r.length?r.index:void 0;a.call(n,function(){return n.editor.update(null,e,o)},t)});var s=this.clipboard.convert("
"+o+"


");this.setContents(s),this.history.clear(),this.options.placeholder&&this.root.setAttribute("data-placeholder",this.options.placeholder),this.options.readOnly&&this.disable()}return h(t,null,[{key:"debug",value:function(t){!0===t&&(t="log"),A.default.level(t)}},{key:"find",value:function(t){return t.__quill||w.default.find(t)}},{key:"import",value:function(t){return null==this.imports[t]&&P.error("Cannot import "+t+". Are you sure it was registered?"),this.imports[t]}},{key:"register",value:function(t,e){var n=this,r=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if("string"!=typeof t){var o=t.attrName||t.blotName;"string"==typeof o?this.register("formats/"+o,t,e):Object.keys(t).forEach(function(r){n.register(r,t[r],e)})}else null==this.imports[t]||r||P.warn("Overwriting "+t+" with",e),this.imports[t]=e,(t.startsWith("blots/")||t.startsWith("formats/"))&&"abstract"!==e.blotName?w.default.register(e):t.startsWith("modules")&&"function"==typeof e.register&&e.register()}}]),h(t,[{key:"addContainer",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;if("string"==typeof t){var n=t;t=document.createElement("div"),t.classList.add(n)}return this.container.insertBefore(t,e),t}},{key:"blur",value:function(){this.selection.setRange(null)}},{key:"deleteText",value:function(t,e,n){var r=this,o=s(t,e,n),i=f(o,4);return t=i[0],e=i[1],n=i[3],a.call(this,function(){return r.editor.deleteText(t,e)},n,t,-1*e)}},{key:"disable",value:function(){this.enable(!1)}},{key:"enable",value:function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.scroll.enable(t),this.container.classList.toggle("ql-disabled",!t)}},{key:"focus",value:function(){var t=this.scrollingContainer.scrollTop;this.selection.focus(),this.scrollingContainer.scrollTop=t,this.scrollIntoView()}},{key:"format",value:function(t,e){var n=this,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:g.default.sources.API;return a.call(this,function(){var r=n.getSelection(!0),i=new d.default;if(null==r)return i;if(w.default.query(t,w.default.Scope.BLOCK))i=n.editor.formatLine(r.index,r.length,o({},t,e));else{if(0===r.length)return n.selection.format(t,e),i;i=n.editor.formatText(r.index,r.length,o({},t,e))}return n.setSelection(r,g.default.sources.SILENT),i},r)}},{key:"formatLine",value:function(t,e,n,r,o){var i=this,l=void 0,u=s(t,e,n,r,o),c=f(u,4);return t=c[0],e=c[1],l=c[2],o=c[3],a.call(this,function(){return i.editor.formatLine(t,e,l)},o,t,0)}},{key:"formatText",value:function(t,e,n,r,o){var i=this,l=void 0,u=s(t,e,n,r,o),c=f(u,4);return t=c[0],e=c[1],l=c[2],o=c[3],a.call(this,function(){return i.editor.formatText(t,e,l)},o,t,0)}},{key:"getBounds",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=void 0;n="number"==typeof t?this.selection.getBounds(t,e):this.selection.getBounds(t.index,t.length);var r=this.container.getBoundingClientRect();return{bottom:n.bottom-r.top,height:n.height,left:n.left-r.left,right:n.right-r.left,top:n.top-r.top,width:n.width}}},{key:"getContents",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.getLength()-t,n=s(t,e),r=f(n,2);return t=r[0],e=r[1],this.editor.getContents(t,e)}},{key:"getFormat",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.getSelection(!0),e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;return"number"==typeof t?this.editor.getFormat(t,e):this.editor.getFormat(t.index,t.length)}},{key:"getIndex",value:function(t){return t.offset(this.scroll)}},{key:"getLength",value:function(){return this.scroll.length()}},{key:"getLeaf",value:function(t){return this.scroll.leaf(t)}},{key:"getLine",value:function(t){return this.scroll.line(t)}},{key:"getLines",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Number.MAX_VALUE;return"number"!=typeof t?this.scroll.lines(t.index,t.length):this.scroll.lines(t,e)}},{key:"getModule",value:function(t){return this.theme.modules[t]}},{key:"getSelection",value:function(){return arguments.length>0&&void 0!==arguments[0]&&arguments[0]&&this.focus(),this.update(),this.selection.getRange()[0]}},{key:"getText",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.getLength()-t,n=s(t,e),r=f(n,2);return t=r[0],e=r[1],this.editor.getText(t,e)}},{key:"hasFocus",value:function(){return this.selection.hasFocus()}},{key:"insertEmbed",value:function(e,n,r){var o=this,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:t.sources.API;return a.call(this,function(){return o.editor.insertEmbed(e,n,r)},i,e)}},{key:"insertText",value:function(t,e,n,r,o){var i=this,l=void 0,u=s(t,0,n,r,o),c=f(u,4);return t=c[0],l=c[2],o=c[3],a.call(this,function(){return i.editor.insertText(t,e,l)},o,t,e.length)}},{key:"isEnabled",value:function(){return!this.container.classList.contains("ql-disabled")}},{key:"off",value:function(){return this.emitter.off.apply(this.emitter,arguments)}},{key:"on",value:function(){return this.emitter.on.apply(this.emitter,arguments)}},{key:"once",value:function(){return this.emitter.once.apply(this.emitter,arguments)}},{key:"pasteHTML",value:function(t,e,n){this.clipboard.dangerouslyPasteHTML(t,e,n)}},{key:"removeFormat",value:function(t,e,n){var r=this,o=s(t,e,n),i=f(o,4);return t=i[0],e=i[1],n=i[3],a.call(this,function(){return r.editor.removeFormat(t,e)},n,t)}},{key:"scrollIntoView",value:function(){this.selection.scrollIntoView(this.scrollingContainer)}},{key:"setContents",value:function(t){var e=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:g.default.sources.API;return a.call(this,function(){t=new d.default(t);var n=e.getLength(),r=e.editor.deleteText(0,n),o=e.editor.applyDelta(t),i=o.ops[o.ops.length-1];return null!=i&&"string"==typeof i.insert&&"\n"===i.insert[i.insert.length-1]&&(e.editor.deleteText(e.getLength()-1,1),o.delete(1)),r.compose(o)},n)}},{key:"setSelection",value:function(e,n,r){if(null==e)this.selection.setRange(null,n||t.sources.API);else{var o=s(e,n,r),i=f(o,4);e=i[0],n=i[1],r=i[3],this.selection.setRange(new x.Range(e,n),r),r!==g.default.sources.SILENT&&this.selection.scrollIntoView(this.scrollingContainer)}}},{key:"setText",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:g.default.sources.API,n=(new d.default).insert(t);return this.setContents(n,e)}},{key:"update",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:g.default.sources.USER,e=this.scroll.update(t);return this.selection.update(t),e}},{key:"updateContents",value:function(t){var e=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:g.default.sources.API;return a.call(this,function(){return t=new d.default(t),e.editor.applyDelta(t,n)},n,!0)}}]),t}();S.DEFAULTS={bounds:null,formats:null,modules:{},placeholder:"",readOnly:!1,scrollingContainer:null,strict:!0,theme:"default"},S.events=g.default.events,S.sources=g.default.sources,S.version="1.3.7",S.imports={delta:d.default,parchment:w.default,"core/module":_.default,"core/theme":T.default},e.expandConfig=l,e.overload=s,e.default=S},function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var o=function t(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};r(this,t),this.quill=e,this.options=n};o.DEFAULTS={},e.default=o},function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function i(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var l=n(0),a=function(t){return t&&t.__esModule?t:{default:t}}(l),s=function(t){function e(){return r(this,e),o(this,(e.__proto__||Object.getPrototypeOf(e)).apply(this,arguments))}return i(e,t),e}(a.default.Text);e.default=s},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function l(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var a=function(){function t(t,e){for(var n=0;n1?e-1:0),r=1;r1?n-1:0),o=1;o-1:this.whitelist.indexOf(e)>-1))},t.prototype.remove=function(t){t.removeAttribute(this.keyName)},t.prototype.value=function(t){var e=t.getAttribute(this.keyName);return this.canAdd(t,e)&&e?e:""},t}();e.default=o},function(t,e,n){function r(t){return null===t||void 0===t}function o(t){return!(!t||"object"!=typeof t||"number"!=typeof t.length)&&("function"==typeof t.copy&&"function"==typeof t.slice&&!(t.length>0&&"number"!=typeof t[0]))}function i(t,e,n){var i,c;if(r(t)||r(e))return!1;if(t.prototype!==e.prototype)return!1;if(s(t))return!!s(e)&&(t=l.call(t),e=l.call(e),u(t,e,n));if(o(t)){if(!o(e))return!1;if(t.length!==e.length)return!1;for(i=0;i=0;i--)if(f[i]!=h[i])return!1;for(i=f.length-1;i>=0;i--)if(c=f[i],!u(t[c],e[c],n))return!1;return typeof t==typeof e}var l=Array.prototype.slice,a=n(55),s=n(56),u=t.exports=function(t,e,n){return n||(n={}),t===e||(t instanceof Date&&e instanceof Date?t.getTime()===e.getTime():!t||!e||"object"!=typeof t&&"object"!=typeof e?n.strict?t===e:t==e:i(t,e,n))}},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function l(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.Code=void 0;var a=function(){function t(t,e){var n=[],r=!0,o=!1,i=void 0;try{for(var l,a=t[Symbol.iterator]();!(r=(l=a.next()).done)&&(n.push(l.value),!e||n.length!==e);r=!0);}catch(t){o=!0,i=t}finally{try{!r&&a.return&&a.return()}finally{if(o)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),s=function(){function t(t,e){for(var n=0;n=t+n)){var l=this.newlineIndex(t,!0)+1,a=i-l+1,s=this.isolate(l,a),u=s.next;s.format(r,o),u instanceof e&&u.formatAt(0,t-l+n-a,r,o)}}}},{key:"insertAt",value:function(t,e,n){if(null==n){var r=this.descendant(m.default,t),o=a(r,2),i=o[0],l=o[1];i.insertAt(l,e)}}},{key:"length",value:function(){var t=this.domNode.textContent.length;return this.domNode.textContent.endsWith("\n")?t:t+1}},{key:"newlineIndex",value:function(t){if(arguments.length>1&&void 0!==arguments[1]&&arguments[1])return this.domNode.textContent.slice(0,t).lastIndexOf("\n");var e=this.domNode.textContent.slice(t).indexOf("\n");return e>-1?t+e:-1}},{key:"optimize",value:function(t){this.domNode.textContent.endsWith("\n")||this.appendChild(p.default.create("text","\n")),u(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"optimize",this).call(this,t);var n=this.next;null!=n&&n.prev===this&&n.statics.blotName===this.statics.blotName&&this.statics.formats(this.domNode)===n.statics.formats(n.domNode)&&(n.optimize(t),n.moveChildren(this),n.remove())}},{key:"replace",value:function(t){u(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"replace",this).call(this,t),[].slice.call(this.domNode.querySelectorAll("*")).forEach(function(t){var e=p.default.find(t);null==e?t.parentNode.removeChild(t):e instanceof p.default.Embed?e.remove():e.unwrap()})}}],[{key:"create",value:function(t){var n=u(e.__proto__||Object.getPrototypeOf(e),"create",this).call(this,t);return n.setAttribute("spellcheck",!1),n}},{key:"formats",value:function(){return!0}}]),e}(y.default);O.blotName="code-block",O.tagName="PRE",O.TAB=" ",e.Code=_,e.default=O},function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function i(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var l=function(){function t(t,e){for(var n=0;n-1}Object.defineProperty(e,"__esModule",{value:!0}),e.sanitize=e.default=void 0;var a=function(){function t(t,e){for(var n=0;n1&&void 0!==arguments[1]&&arguments[1],n=this.container.querySelector(".ql-selected");if(t!==n&&(null!=n&&n.classList.remove("ql-selected"),null!=t&&(t.classList.add("ql-selected"),this.select.selectedIndex=[].indexOf.call(t.parentNode.children,t),t.hasAttribute("data-value")?this.label.setAttribute("data-value",t.getAttribute("data-value")):this.label.removeAttribute("data-value"),t.hasAttribute("data-label")?this.label.setAttribute("data-label",t.getAttribute("data-label")):this.label.removeAttribute("data-label"),e))){if("function"==typeof Event)this.select.dispatchEvent(new Event("change"));else if("object"===("undefined"==typeof Event?"undefined":l(Event))){var r=document.createEvent("Event");r.initEvent("change",!0,!0),this.select.dispatchEvent(r)}this.close()}}},{key:"update",value:function(){var t=void 0;if(this.select.selectedIndex>-1){var e=this.container.querySelector(".ql-picker-options").children[this.select.selectedIndex];t=this.select.options[this.select.selectedIndex],this.selectItem(e)}else this.selectItem(null);var n=null!=t&&t!==this.select.querySelector("option[selected]");this.label.classList.toggle("ql-active",n)}}]),t}();e.default=p},function(t,e,n){"use strict";function r(t){var e=a.find(t);if(null==e)try{e=a.create(t)}catch(n){e=a.create(a.Scope.INLINE),[].slice.call(t.childNodes).forEach(function(t){e.domNode.appendChild(t)}),t.parentNode&&t.parentNode.replaceChild(e.domNode,t),e.attach()}return e}var o=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(e,"__esModule",{value:!0});var i=n(47),l=n(27),a=n(1),s=function(t){function e(e){var n=t.call(this,e)||this;return n.build(),n}return o(e,t),e.prototype.appendChild=function(t){this.insertBefore(t)},e.prototype.attach=function(){t.prototype.attach.call(this),this.children.forEach(function(t){t.attach()})},e.prototype.build=function(){var t=this;this.children=new i.default,[].slice.call(this.domNode.childNodes).reverse().forEach(function(e){try{var n=r(e);t.insertBefore(n,t.children.head||void 0)}catch(t){if(t instanceof a.ParchmentError)return;throw t}})},e.prototype.deleteAt=function(t,e){if(0===t&&e===this.length())return this.remove();this.children.forEachAt(t,e,function(t,e,n){t.deleteAt(e,n)})},e.prototype.descendant=function(t,n){var r=this.children.find(n),o=r[0],i=r[1];return null==t.blotName&&t(o)||null!=t.blotName&&o instanceof t?[o,i]:o instanceof e?o.descendant(t,i):[null,-1]},e.prototype.descendants=function(t,n,r){void 0===n&&(n=0),void 0===r&&(r=Number.MAX_VALUE);var o=[],i=r;return this.children.forEachAt(n,r,function(n,r,l){(null==t.blotName&&t(n)||null!=t.blotName&&n instanceof t)&&o.push(n),n instanceof e&&(o=o.concat(n.descendants(t,r,i))),i-=l}),o},e.prototype.detach=function(){this.children.forEach(function(t){t.detach()}),t.prototype.detach.call(this)},e.prototype.formatAt=function(t,e,n,r){this.children.forEachAt(t,e,function(t,e,o){t.formatAt(e,o,n,r)})},e.prototype.insertAt=function(t,e,n){var r=this.children.find(t),o=r[0],i=r[1];if(o)o.insertAt(i,e,n);else{var l=null==n?a.create("text",e):a.create(e,n);this.appendChild(l)}},e.prototype.insertBefore=function(t,e){if(null!=this.statics.allowedChildren&&!this.statics.allowedChildren.some(function(e){return t instanceof e}))throw new a.ParchmentError("Cannot insert "+t.statics.blotName+" into "+this.statics.blotName);t.insertInto(this,e)},e.prototype.length=function(){return this.children.reduce(function(t,e){return t+e.length()},0)},e.prototype.moveChildren=function(t,e){this.children.forEach(function(n){t.insertBefore(n,e)})},e.prototype.optimize=function(e){if(t.prototype.optimize.call(this,e),0===this.children.length)if(null!=this.statics.defaultChild){var n=a.create(this.statics.defaultChild);this.appendChild(n),n.optimize(e)}else this.remove()},e.prototype.path=function(t,n){void 0===n&&(n=!1);var r=this.children.find(t,n),o=r[0],i=r[1],l=[[this,t]];return o instanceof e?l.concat(o.path(i,n)):(null!=o&&l.push([o,i]),l)},e.prototype.removeChild=function(t){this.children.remove(t)},e.prototype.replace=function(n){n instanceof e&&n.moveChildren(this),t.prototype.replace.call(this,n)},e.prototype.split=function(t,e){if(void 0===e&&(e=!1),!e){if(0===t)return this;if(t===this.length())return this.next}var n=this.clone();return this.parent.insertBefore(n,this.next),this.children.forEachAt(t,this.length(),function(t,r,o){t=t.split(r,e),n.appendChild(t)}),n},e.prototype.unwrap=function(){this.moveChildren(this.parent,this.next),this.remove()},e.prototype.update=function(t,e){var n=this,o=[],i=[];t.forEach(function(t){t.target===n.domNode&&"childList"===t.type&&(o.push.apply(o,t.addedNodes),i.push.apply(i,t.removedNodes))}),i.forEach(function(t){if(!(null!=t.parentNode&&"IFRAME"!==t.tagName&&document.body.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_CONTAINED_BY)){var e=a.find(t);null!=e&&(null!=e.domNode.parentNode&&e.domNode.parentNode!==n.domNode||e.detach())}}),o.filter(function(t){return t.parentNode==n.domNode}).sort(function(t,e){return t===e?0:t.compareDocumentPosition(e)&Node.DOCUMENT_POSITION_FOLLOWING?1:-1}).forEach(function(t){var e=null;null!=t.nextSibling&&(e=a.find(t.nextSibling));var o=r(t);o.next==e&&null!=o.next||(null!=o.parent&&o.parent.removeChild(n),n.insertBefore(o,e||void 0))})},e}(l.default);e.default=s},function(t,e,n){"use strict";var r=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(e,"__esModule",{value:!0});var o=n(11),i=n(28),l=n(17),a=n(1),s=function(t){function e(e){var n=t.call(this,e)||this;return n.attributes=new i.default(n.domNode),n}return r(e,t),e.formats=function(t){return"string"==typeof this.tagName||(Array.isArray(this.tagName)?t.tagName.toLowerCase():void 0)},e.prototype.format=function(t,e){var n=a.query(t);n instanceof o.default?this.attributes.attribute(n,e):e&&(null==n||t===this.statics.blotName&&this.formats()[t]===e||this.replaceWith(t,e))},e.prototype.formats=function(){var t=this.attributes.values(),e=this.statics.formats(this.domNode);return null!=e&&(t[this.statics.blotName]=e),t},e.prototype.replaceWith=function(e,n){var r=t.prototype.replaceWith.call(this,e,n);return this.attributes.copy(r),r},e.prototype.update=function(e,n){var r=this;t.prototype.update.call(this,e,n),e.some(function(t){return t.target===r.domNode&&"attributes"===t.type})&&this.attributes.build()},e.prototype.wrap=function(n,r){var o=t.prototype.wrap.call(this,n,r);return o instanceof e&&o.statics.scope===this.statics.scope&&this.attributes.move(o),o},e}(l.default);e.default=s},function(t,e,n){"use strict";var r=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(e,"__esModule",{value:!0});var o=n(27),i=n(1),l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return r(e,t),e.value=function(t){return!0},e.prototype.index=function(t,e){return this.domNode===t||this.domNode.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_CONTAINED_BY?Math.min(e,1):-1},e.prototype.position=function(t,e){var n=[].indexOf.call(this.parent.domNode.childNodes,this.domNode);return t>0&&(n+=1),[this.parent.domNode,n]},e.prototype.value=function(){var t;return t={},t[this.statics.blotName]=this.statics.value(this.domNode)||!0,t},e.scope=i.Scope.INLINE_BLOT,e}(o.default);e.default=l},function(t,e,n){function r(t){this.ops=t,this.index=0,this.offset=0}var o=n(12),i=n(2),l={attributes:{compose:function(t,e,n){"object"!=typeof t&&(t={}),"object"!=typeof e&&(e={});var r=i(!0,{},e);n||(r=Object.keys(r).reduce(function(t,e){return null!=r[e]&&(t[e]=r[e]),t},{}));for(var o in t)void 0!==t[o]&&void 0===e[o]&&(r[o]=t[o]);return Object.keys(r).length>0?r:void 0},diff:function(t,e){"object"!=typeof t&&(t={}),"object"!=typeof e&&(e={});var n=Object.keys(t).concat(Object.keys(e)).reduce(function(n,r){return o(t[r],e[r])||(n[r]=void 0===e[r]?null:e[r]),n},{});return Object.keys(n).length>0?n:void 0},transform:function(t,e,n){if("object"!=typeof t)return e;if("object"==typeof e){if(!n)return e;var r=Object.keys(e).reduce(function(n,r){return void 0===t[r]&&(n[r]=e[r]),n},{});return Object.keys(r).length>0?r:void 0}}},iterator:function(t){return new r(t)},length:function(t){return"number"==typeof t.delete?t.delete:"number"==typeof t.retain?t.retain:"string"==typeof t.insert?t.insert.length:1}};r.prototype.hasNext=function(){return this.peekLength()<1/0},r.prototype.next=function(t){t||(t=1/0);var e=this.ops[this.index];if(e){var n=this.offset,r=l.length(e);if(t>=r-n?(t=r-n,this.index+=1,this.offset=0):this.offset+=t,"number"==typeof e.delete)return{delete:t};var o={};return e.attributes&&(o.attributes=e.attributes),"number"==typeof e.retain?o.retain=t:"string"==typeof e.insert?o.insert=e.insert.substr(n,t):o.insert=e.insert,o}return{retain:1/0}},r.prototype.peek=function(){return this.ops[this.index]},r.prototype.peekLength=function(){return this.ops[this.index]?l.length(this.ops[this.index])-this.offset:1/0},r.prototype.peekType=function(){return this.ops[this.index]?"number"==typeof this.ops[this.index].delete?"delete":"number"==typeof this.ops[this.index].retain?"retain":"insert":"retain"},r.prototype.rest=function(){if(this.hasNext()){if(0===this.offset)return this.ops.slice(this.index);var t=this.offset,e=this.index,n=this.next(),r=this.ops.slice(this.index);return this.offset=t,this.index=e,[n].concat(r)}return[]},t.exports=l},function(t,e){var n=function(){"use strict";function t(t,e){return null!=e&&t instanceof e}function e(n,r,o,i,c){function f(n,o){if(null===n)return null;if(0===o)return n;var y,v;if("object"!=typeof n)return n;if(t(n,a))y=new a;else if(t(n,s))y=new s;else if(t(n,u))y=new u(function(t,e){n.then(function(e){t(f(e,o-1))},function(t){e(f(t,o-1))})});else if(e.__isArray(n))y=[];else if(e.__isRegExp(n))y=new RegExp(n.source,l(n)),n.lastIndex&&(y.lastIndex=n.lastIndex);else if(e.__isDate(n))y=new Date(n.getTime());else{if(d&&Buffer.isBuffer(n))return y=Buffer.allocUnsafe?Buffer.allocUnsafe(n.length):new Buffer(n.length),n.copy(y),y;t(n,Error)?y=Object.create(n):void 0===i?(v=Object.getPrototypeOf(n),y=Object.create(v)):(y=Object.create(i),v=i)}if(r){var b=h.indexOf(n);if(-1!=b)return p[b];h.push(n),p.push(y)}t(n,a)&&n.forEach(function(t,e){var n=f(e,o-1),r=f(t,o-1);y.set(n,r)}),t(n,s)&&n.forEach(function(t){var e=f(t,o-1);y.add(e)});for(var g in n){var m;v&&(m=Object.getOwnPropertyDescriptor(v,g)),m&&null==m.set||(y[g]=f(n[g],o-1))}if(Object.getOwnPropertySymbols)for(var _=Object.getOwnPropertySymbols(n),g=0;g<_.length;g++){var O=_[g],w=Object.getOwnPropertyDescriptor(n,O);(!w||w.enumerable||c)&&(y[O]=f(n[O],o-1),w.enumerable||Object.defineProperty(y,O,{enumerable:!1}))}if(c)for(var x=Object.getOwnPropertyNames(n),g=0;g1&&void 0!==arguments[1]?arguments[1]:0;i(this,t),this.index=e,this.length=n},O=function(){function t(e,n){var r=this;i(this,t),this.emitter=n,this.scroll=e,this.composing=!1,this.mouseDown=!1,this.root=this.scroll.domNode,this.cursor=c.default.create("cursor",this),this.lastRange=this.savedRange=new _(0,0),this.handleComposition(),this.handleDragging(),this.emitter.listenDOM("selectionchange",document,function(){r.mouseDown||setTimeout(r.update.bind(r,v.default.sources.USER),1)}),this.emitter.on(v.default.events.EDITOR_CHANGE,function(t,e){t===v.default.events.TEXT_CHANGE&&e.length()>0&&r.update(v.default.sources.SILENT)}),this.emitter.on(v.default.events.SCROLL_BEFORE_UPDATE,function(){if(r.hasFocus()){var t=r.getNativeRange();null!=t&&t.start.node!==r.cursor.textNode&&r.emitter.once(v.default.events.SCROLL_UPDATE,function(){try{r.setNativeRange(t.start.node,t.start.offset,t.end.node,t.end.offset)}catch(t){}})}}),this.emitter.on(v.default.events.SCROLL_OPTIMIZE,function(t,e){if(e.range){var n=e.range,o=n.startNode,i=n.startOffset,l=n.endNode,a=n.endOffset;r.setNativeRange(o,i,l,a)}}),this.update(v.default.sources.SILENT)}return s(t,[{key:"handleComposition",value:function(){var t=this;this.root.addEventListener("compositionstart",function(){t.composing=!0}),this.root.addEventListener("compositionend",function(){if(t.composing=!1,t.cursor.parent){var e=t.cursor.restore();if(!e)return;setTimeout(function(){t.setNativeRange(e.startNode,e.startOffset,e.endNode,e.endOffset)},1)}})}},{key:"handleDragging",value:function(){var t=this;this.emitter.listenDOM("mousedown",document.body,function(){t.mouseDown=!0}),this.emitter.listenDOM("mouseup",document.body,function(){t.mouseDown=!1,t.update(v.default.sources.USER)})}},{key:"focus",value:function(){this.hasFocus()||(this.root.focus(),this.setRange(this.savedRange))}},{key:"format",value:function(t,e){if(null==this.scroll.whitelist||this.scroll.whitelist[t]){this.scroll.update();var n=this.getNativeRange();if(null!=n&&n.native.collapsed&&!c.default.query(t,c.default.Scope.BLOCK)){if(n.start.node!==this.cursor.textNode){var r=c.default.find(n.start.node,!1);if(null==r)return;if(r instanceof c.default.Leaf){var o=r.split(n.start.offset);r.parent.insertBefore(this.cursor,o)}else r.insertBefore(this.cursor,n.start.node);this.cursor.attach()}this.cursor.format(t,e),this.scroll.optimize(),this.setNativeRange(this.cursor.textNode,this.cursor.textNode.data.length),this.update()}}}},{key:"getBounds",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=this.scroll.length();t=Math.min(t,n-1),e=Math.min(t+e,n-1)-t;var r=void 0,o=this.scroll.leaf(t),i=a(o,2),l=i[0],s=i[1];if(null==l)return null;var u=l.position(s,!0),c=a(u,2);r=c[0],s=c[1];var f=document.createRange();if(e>0){f.setStart(r,s);var h=this.scroll.leaf(t+e),p=a(h,2);if(l=p[0],s=p[1],null==l)return null;var d=l.position(s,!0),y=a(d,2);return r=y[0],s=y[1],f.setEnd(r,s),f.getBoundingClientRect()}var v="left",b=void 0;return r instanceof Text?(s0&&(v="right")),{bottom:b.top+b.height,height:b.height,left:b[v],right:b[v],top:b.top,width:0}}},{key:"getNativeRange",value:function(){var t=document.getSelection();if(null==t||t.rangeCount<=0)return null;var e=t.getRangeAt(0);if(null==e)return null;var n=this.normalizeNative(e);return m.info("getNativeRange",n),n}},{key:"getRange",value:function(){var t=this.getNativeRange();return null==t?[null,null]:[this.normalizedToRange(t),t]}},{key:"hasFocus",value:function(){return document.activeElement===this.root}},{key:"normalizedToRange",value:function(t){var e=this,n=[[t.start.node,t.start.offset]];t.native.collapsed||n.push([t.end.node,t.end.offset]);var r=n.map(function(t){var n=a(t,2),r=n[0],o=n[1],i=c.default.find(r,!0),l=i.offset(e.scroll);return 0===o?l:i instanceof c.default.Container?l+i.length():l+i.index(r,o)}),i=Math.min(Math.max.apply(Math,o(r)),this.scroll.length()-1),l=Math.min.apply(Math,[i].concat(o(r)));return new _(l,i-l)}},{key:"normalizeNative",value:function(t){if(!l(this.root,t.startContainer)||!t.collapsed&&!l(this.root,t.endContainer))return null;var e={start:{node:t.startContainer,offset:t.startOffset},end:{node:t.endContainer,offset:t.endOffset},native:t};return[e.start,e.end].forEach(function(t){for(var e=t.node,n=t.offset;!(e instanceof Text)&&e.childNodes.length>0;)if(e.childNodes.length>n)e=e.childNodes[n],n=0;else{if(e.childNodes.length!==n)break;e=e.lastChild,n=e instanceof Text?e.data.length:e.childNodes.length+1}t.node=e,t.offset=n}),e}},{key:"rangeToNative",value:function(t){var e=this,n=t.collapsed?[t.index]:[t.index,t.index+t.length],r=[],o=this.scroll.length();return n.forEach(function(t,n){t=Math.min(o-1,t);var i=void 0,l=e.scroll.leaf(t),s=a(l,2),u=s[0],c=s[1],f=u.position(c,0!==n),h=a(f,2);i=h[0],c=h[1],r.push(i,c)}),r.length<2&&(r=r.concat(r)),r}},{key:"scrollIntoView",value:function(t){var e=this.lastRange;if(null!=e){var n=this.getBounds(e.index,e.length);if(null!=n){var r=this.scroll.length()-1,o=this.scroll.line(Math.min(e.index,r)),i=a(o,1),l=i[0],s=l;if(e.length>0){var u=this.scroll.line(Math.min(e.index+e.length,r));s=a(u,1)[0]}if(null!=l&&null!=s){var c=t.getBoundingClientRect();n.topc.bottom&&(t.scrollTop+=n.bottom-c.bottom)}}}}},{key:"setNativeRange",value:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t,r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:e,o=arguments.length>4&&void 0!==arguments[4]&&arguments[4];if(m.info("setNativeRange",t,e,n,r),null==t||null!=this.root.parentNode&&null!=t.parentNode&&null!=n.parentNode){var i=document.getSelection();if(null!=i)if(null!=t){this.hasFocus()||this.root.focus();var l=(this.getNativeRange()||{}).native;if(null==l||o||t!==l.startContainer||e!==l.startOffset||n!==l.endContainer||r!==l.endOffset){"BR"==t.tagName&&(e=[].indexOf.call(t.parentNode.childNodes,t),t=t.parentNode),"BR"==n.tagName&&(r=[].indexOf.call(n.parentNode.childNodes,n),n=n.parentNode);var a=document.createRange();a.setStart(t,e),a.setEnd(n,r),i.removeAllRanges(),i.addRange(a)}}else i.removeAllRanges(),this.root.blur(),document.body.focus()}}},{key:"setRange",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:v.default.sources.API;if("string"==typeof e&&(n=e,e=!1),m.info("setRange",t),null!=t){var r=this.rangeToNative(t);this.setNativeRange.apply(this,o(r).concat([e]))}else this.setNativeRange(null);this.update(n)}},{key:"update",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:v.default.sources.USER,e=this.lastRange,n=this.getRange(),r=a(n,2),o=r[0],i=r[1];if(this.lastRange=o,null!=this.lastRange&&(this.savedRange=this.lastRange),!(0,d.default)(e,this.lastRange)){var l;!this.composing&&null!=i&&i.native.collapsed&&i.start.node!==this.cursor.textNode&&this.cursor.restore();var s=[v.default.events.SELECTION_CHANGE,(0,h.default)(this.lastRange),(0,h.default)(e),t];if((l=this.emitter).emit.apply(l,[v.default.events.EDITOR_CHANGE].concat(s)),t!==v.default.sources.SILENT){var u;(u=this.emitter).emit.apply(u,s)}}}}]),t}();e.Range=_,e.default=O},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function l(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var a=n(0),s=r(a),u=n(3),c=r(u),f=function(t){function e(){return o(this,e),i(this,(e.__proto__||Object.getPrototypeOf(e)).apply(this,arguments))}return l(e,t),e}(s.default.Container);f.allowedChildren=[c.default,u.BlockEmbed,f],e.default=f},function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function i(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0}),e.ColorStyle=e.ColorClass=e.ColorAttributor=void 0;var l=function(){function t(t,e){for(var n=0;n1){var u=o.formats(),c=this.quill.getFormat(t.index-1,1);i=A.default.attributes.diff(u,c)||{}}}var f=/[\uD800-\uDBFF][\uDC00-\uDFFF]$/.test(e.prefix)?2:1;this.quill.deleteText(t.index-f,f,S.default.sources.USER),Object.keys(i).length>0&&this.quill.formatLine(t.index-f,f,i,S.default.sources.USER),this.quill.focus()}}function c(t,e){var n=/^[\uD800-\uDBFF][\uDC00-\uDFFF]/.test(e.suffix)?2:1;if(!(t.index>=this.quill.getLength()-n)){var r={},o=0,i=this.quill.getLine(t.index),l=b(i,1),a=l[0];if(e.offset>=a.length()-1){var s=this.quill.getLine(t.index+1),u=b(s,1),c=u[0];if(c){var f=a.formats(),h=this.quill.getFormat(t.index,1);r=A.default.attributes.diff(f,h)||{},o=c.length()}}this.quill.deleteText(t.index,n,S.default.sources.USER),Object.keys(r).length>0&&this.quill.formatLine(t.index+o-1,n,r,S.default.sources.USER)}}function f(t){var e=this.quill.getLines(t),n={};if(e.length>1){var r=e[0].formats(),o=e[e.length-1].formats();n=A.default.attributes.diff(o,r)||{}}this.quill.deleteText(t,S.default.sources.USER),Object.keys(n).length>0&&this.quill.formatLine(t.index,1,n,S.default.sources.USER),this.quill.setSelection(t.index,S.default.sources.SILENT),this.quill.focus()}function h(t,e){var n=this;t.length>0&&this.quill.scroll.deleteAt(t.index,t.length);var r=Object.keys(e.format).reduce(function(t,n){return T.default.query(n,T.default.Scope.BLOCK)&&!Array.isArray(e.format[n])&&(t[n]=e.format[n]),t},{});this.quill.insertText(t.index,"\n",r,S.default.sources.USER),this.quill.setSelection(t.index+1,S.default.sources.SILENT),this.quill.focus(),Object.keys(e.format).forEach(function(t){null==r[t]&&(Array.isArray(e.format[t])||"link"!==t&&n.quill.format(t,e.format[t],S.default.sources.USER))})}function p(t){return{key:D.keys.TAB,shiftKey:!t,format:{"code-block":!0},handler:function(e){var n=T.default.query("code-block"),r=e.index,o=e.length,i=this.quill.scroll.descendant(n,r),l=b(i,2),a=l[0],s=l[1];if(null!=a){var u=this.quill.getIndex(a),c=a.newlineIndex(s,!0)+1,f=a.newlineIndex(u+s+o),h=a.domNode.textContent.slice(c,f).split("\n");s=0,h.forEach(function(e,i){t?(a.insertAt(c+s,n.TAB),s+=n.TAB.length,0===i?r+=n.TAB.length:o+=n.TAB.length):e.startsWith(n.TAB)&&(a.deleteAt(c+s,n.TAB.length),s-=n.TAB.length,0===i?r-=n.TAB.length:o-=n.TAB.length),s+=e.length+1}),this.quill.update(S.default.sources.USER),this.quill.setSelection(r,o,S.default.sources.SILENT)}}}}function d(t){return{key:t[0].toUpperCase(),shortKey:!0,handler:function(e,n){this.quill.format(t,!n.format[t],S.default.sources.USER)}}}function y(t){if("string"==typeof t||"number"==typeof t)return y({key:t});if("object"===(void 0===t?"undefined":v(t))&&(t=(0,_.default)(t,!1)),"string"==typeof t.key)if(null!=D.keys[t.key.toUpperCase()])t.key=D.keys[t.key.toUpperCase()];else{if(1!==t.key.length)return null;t.key=t.key.toUpperCase().charCodeAt(0)}return t.shortKey&&(t[B]=t.shortKey,delete t.shortKey),t}Object.defineProperty(e,"__esModule",{value:!0}),e.SHORTKEY=e.default=void 0;var v="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},b=function(){function t(t,e){var n=[],r=!0,o=!1,i=void 0;try{for(var l,a=t[Symbol.iterator]();!(r=(l=a.next()).done)&&(n.push(l.value),!e||n.length!==e);r=!0);}catch(t){o=!0,i=t}finally{try{!r&&a.return&&a.return()}finally{if(o)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),g=function(){function t(t,e){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=y(t);if(null==r||null==r.key)return I.warn("Attempted to add invalid keyboard binding",r);"function"==typeof e&&(e={handler:e}),"function"==typeof n&&(n={handler:n}),r=(0,k.default)(r,e,n),this.bindings[r.key]=this.bindings[r.key]||[],this.bindings[r.key].push(r)}},{key:"listen",value:function(){var t=this;this.quill.root.addEventListener("keydown",function(n){if(!n.defaultPrevented){var r=n.which||n.keyCode,o=(t.bindings[r]||[]).filter(function(t){return e.match(n,t)});if(0!==o.length){var i=t.quill.getSelection();if(null!=i&&t.quill.hasFocus()){var l=t.quill.getLine(i.index),a=b(l,2),s=a[0],u=a[1],c=t.quill.getLeaf(i.index),f=b(c,2),h=f[0],p=f[1],d=0===i.length?[h,p]:t.quill.getLeaf(i.index+i.length),y=b(d,2),g=y[0],m=y[1],_=h instanceof T.default.Text?h.value().slice(0,p):"",O=g instanceof T.default.Text?g.value().slice(m):"",x={collapsed:0===i.length,empty:0===i.length&&s.length()<=1,format:t.quill.getFormat(i),offset:u,prefix:_,suffix:O};o.some(function(e){if(null!=e.collapsed&&e.collapsed!==x.collapsed)return!1;if(null!=e.empty&&e.empty!==x.empty)return!1;if(null!=e.offset&&e.offset!==x.offset)return!1;if(Array.isArray(e.format)){if(e.format.every(function(t){return null==x.format[t]}))return!1}else if("object"===v(e.format)&&!Object.keys(e.format).every(function(t){return!0===e.format[t]?null!=x.format[t]:!1===e.format[t]?null==x.format[t]:(0,w.default)(e.format[t],x.format[t])}))return!1;return!(null!=e.prefix&&!e.prefix.test(x.prefix))&&(!(null!=e.suffix&&!e.suffix.test(x.suffix))&&!0!==e.handler.call(t,i,x))})&&n.preventDefault()}}}})}}]),e}(R.default);D.keys={BACKSPACE:8,TAB:9,ENTER:13,ESCAPE:27,LEFT:37,UP:38,RIGHT:39,DOWN:40,DELETE:46},D.DEFAULTS={bindings:{bold:d("bold"),italic:d("italic"),underline:d("underline"),indent:{key:D.keys.TAB,format:["blockquote","indent","list"],handler:function(t,e){if(e.collapsed&&0!==e.offset)return!0;this.quill.format("indent","+1",S.default.sources.USER)}},outdent:{key:D.keys.TAB,shiftKey:!0,format:["blockquote","indent","list"],handler:function(t,e){if(e.collapsed&&0!==e.offset)return!0;this.quill.format("indent","-1",S.default.sources.USER)}},"outdent backspace":{key:D.keys.BACKSPACE,collapsed:!0,shiftKey:null,metaKey:null,ctrlKey:null,altKey:null,format:["indent","list"],offset:0,handler:function(t,e){null!=e.format.indent?this.quill.format("indent","-1",S.default.sources.USER):null!=e.format.list&&this.quill.format("list",!1,S.default.sources.USER)}},"indent code-block":p(!0),"outdent code-block":p(!1),"remove tab":{key:D.keys.TAB,shiftKey:!0,collapsed:!0,prefix:/\t$/,handler:function(t){this.quill.deleteText(t.index-1,1,S.default.sources.USER)}},tab:{key:D.keys.TAB,handler:function(t){this.quill.history.cutoff();var e=(new N.default).retain(t.index).delete(t.length).insert("\t");this.quill.updateContents(e,S.default.sources.USER),this.quill.history.cutoff(),this.quill.setSelection(t.index+1,S.default.sources.SILENT)}},"list empty enter":{key:D.keys.ENTER,collapsed:!0,format:["list"],empty:!0,handler:function(t,e){this.quill.format("list",!1,S.default.sources.USER),e.format.indent&&this.quill.format("indent",!1,S.default.sources.USER)}},"checklist enter":{key:D.keys.ENTER,collapsed:!0,format:{list:"checked"},handler:function(t){var e=this.quill.getLine(t.index),n=b(e,2),r=n[0],o=n[1],i=(0,k.default)({},r.formats(),{list:"checked"}),l=(new N.default).retain(t.index).insert("\n",i).retain(r.length()-o-1).retain(1,{list:"unchecked"});this.quill.updateContents(l,S.default.sources.USER),this.quill.setSelection(t.index+1,S.default.sources.SILENT),this.quill.scrollIntoView()}},"header enter":{key:D.keys.ENTER,collapsed:!0,format:["header"],suffix:/^$/,handler:function(t,e){var n=this.quill.getLine(t.index),r=b(n,2),o=r[0],i=r[1],l=(new N.default).retain(t.index).insert("\n",e.format).retain(o.length()-i-1).retain(1,{header:null});this.quill.updateContents(l,S.default.sources.USER),this.quill.setSelection(t.index+1,S.default.sources.SILENT),this.quill.scrollIntoView()}},"list autofill":{key:" ",collapsed:!0,format:{list:!1},prefix:/^\s*?(\d+\.|-|\*|\[ ?\]|\[x\])$/,handler:function(t,e){var n=e.prefix.length,r=this.quill.getLine(t.index),o=b(r,2),i=o[0],l=o[1];if(l>n)return!0;var a=void 0;switch(e.prefix.trim()){case"[]":case"[ ]":a="unchecked";break;case"[x]":a="checked";break;case"-":case"*":a="bullet";break;default:a="ordered"}this.quill.insertText(t.index," ",S.default.sources.USER),this.quill.history.cutoff();var s=(new N.default).retain(t.index-l).delete(n+1).retain(i.length()-2-l).retain(1,{list:a});this.quill.updateContents(s,S.default.sources.USER),this.quill.history.cutoff(),this.quill.setSelection(t.index-n,S.default.sources.SILENT)}},"code exit":{key:D.keys.ENTER,collapsed:!0,format:["code-block"],prefix:/\n\n$/,suffix:/^\s+$/,handler:function(t){var e=this.quill.getLine(t.index),n=b(e,2),r=n[0],o=n[1],i=(new N.default).retain(t.index+r.length()-o-2).retain(1,{"code-block":null}).delete(1);this.quill.updateContents(i,S.default.sources.USER)}},"embed left":s(D.keys.LEFT,!1),"embed left shift":s(D.keys.LEFT,!0),"embed right":s(D.keys.RIGHT,!1),"embed right shift":s(D.keys.RIGHT,!0)}},e.default=D,e.SHORTKEY=B},function(t,e,n){"use strict";t.exports={align:{"":n(75),center:n(76),right:n(77),justify:n(78)},background:n(79),blockquote:n(80),bold:n(81),clean:n(82),code:n(40),"code-block":n(40),color:n(83),direction:{"":n(84),rtl:n(85)},float:{center:n(86),full:n(87),left:n(88),right:n(89)},formula:n(90),header:{1:n(91),2:n(92)},italic:n(93),image:n(94),indent:{"+1":n(95),"-1":n(96)},link:n(97),list:{ordered:n(98),bullet:n(99),check:n(100)},script:{sub:n(101),super:n(102)},strike:n(103),underline:n(104),video:n(105)}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n(1),o=function(){function t(t){this.domNode=t,this.domNode[r.DATA_KEY]={blot:this}}return Object.defineProperty(t.prototype,"statics",{get:function(){return this.constructor},enumerable:!0,configurable:!0}),t.create=function(t){if(null==this.tagName)throw new r.ParchmentError("Blot definition missing tagName");var e;return Array.isArray(this.tagName)?("string"==typeof t&&(t=t.toUpperCase(),parseInt(t).toString()===t&&(t=parseInt(t))),e="number"==typeof t?document.createElement(this.tagName[t-1]):this.tagName.indexOf(t)>-1?document.createElement(t):document.createElement(this.tagName[0])):e=document.createElement(this.tagName),this.className&&e.classList.add(this.className),e},t.prototype.attach=function(){null!=this.parent&&(this.scroll=this.parent.scroll)},t.prototype.clone=function(){var t=this.domNode.cloneNode(!1);return r.create(t)},t.prototype.detach=function(){null!=this.parent&&this.parent.removeChild(this),delete this.domNode[r.DATA_KEY]},t.prototype.deleteAt=function(t,e){this.isolate(t,e).remove()},t.prototype.formatAt=function(t,e,n,o){var i=this.isolate(t,e);if(null!=r.query(n,r.Scope.BLOT)&&o)i.wrap(n,o);else if(null!=r.query(n,r.Scope.ATTRIBUTE)){var l=r.create(this.statics.scope);i.wrap(l),l.format(n,o)}},t.prototype.insertAt=function(t,e,n){var o=null==n?r.create("text",e):r.create(e,n),i=this.split(t);this.parent.insertBefore(o,i)},t.prototype.insertInto=function(t,e){void 0===e&&(e=null),null!=this.parent&&this.parent.children.remove(this);var n=null;t.children.insertBefore(this,e),null!=e&&(n=e.domNode),this.domNode.parentNode==t.domNode&&this.domNode.nextSibling==n||t.domNode.insertBefore(this.domNode,n),this.parent=t,this.attach()},t.prototype.isolate=function(t,e){var n=this.split(t);return n.split(e),n},t.prototype.length=function(){return 1},t.prototype.offset=function(t){return void 0===t&&(t=this.parent),null==this.parent||this==t?0:this.parent.children.offset(this)+this.parent.offset(t)},t.prototype.optimize=function(t){null!=this.domNode[r.DATA_KEY]&&delete this.domNode[r.DATA_KEY].mutations},t.prototype.remove=function(){null!=this.domNode.parentNode&&this.domNode.parentNode.removeChild(this.domNode),this.detach()},t.prototype.replace=function(t){null!=t.parent&&(t.parent.insertBefore(this,t.next),t.remove())},t.prototype.replaceWith=function(t,e){var n="string"==typeof t?r.create(t,e):t;return n.replace(this),n},t.prototype.split=function(t,e){return 0===t?this:this.next},t.prototype.update=function(t,e){},t.prototype.wrap=function(t,e){var n="string"==typeof t?r.create(t,e):t;return null!=this.parent&&this.parent.insertBefore(n,this.next),n.appendChild(this),n},t.blotName="abstract",t}();e.default=o},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n(11),o=n(29),i=n(30),l=n(1),a=function(){function t(t){this.attributes={},this.domNode=t,this.build()}return t.prototype.attribute=function(t,e){e?t.add(this.domNode,e)&&(null!=t.value(this.domNode)?this.attributes[t.attrName]=t:delete this.attributes[t.attrName]):(t.remove(this.domNode),delete this.attributes[t.attrName])},t.prototype.build=function(){var t=this;this.attributes={};var e=r.default.keys(this.domNode),n=o.default.keys(this.domNode),a=i.default.keys(this.domNode);e.concat(n).concat(a).forEach(function(e){var n=l.query(e,l.Scope.ATTRIBUTE);n instanceof r.default&&(t.attributes[n.attrName]=n)})},t.prototype.copy=function(t){var e=this;Object.keys(this.attributes).forEach(function(n){var r=e.attributes[n].value(e.domNode);t.format(n,r)})},t.prototype.move=function(t){var e=this;this.copy(t),Object.keys(this.attributes).forEach(function(t){e.attributes[t].remove(e.domNode)}),this.attributes={}},t.prototype.values=function(){var t=this;return Object.keys(this.attributes).reduce(function(e,n){return e[n]=t.attributes[n].value(t.domNode),e},{})},t}();e.default=a},function(t,e,n){"use strict";function r(t,e){return(t.getAttribute("class")||"").split(/\s+/).filter(function(t){return 0===t.indexOf(e+"-")})}var o=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(e,"__esModule",{value:!0});var i=n(11),l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.keys=function(t){return(t.getAttribute("class")||"").split(/\s+/).map(function(t){return t.split("-").slice(0,-1).join("-")})},e.prototype.add=function(t,e){return!!this.canAdd(t,e)&&(this.remove(t),t.classList.add(this.keyName+"-"+e),!0)},e.prototype.remove=function(t){r(t,this.keyName).forEach(function(e){t.classList.remove(e)}),0===t.classList.length&&t.removeAttribute("class")},e.prototype.value=function(t){var e=r(t,this.keyName)[0]||"",n=e.slice(this.keyName.length+1);return this.canAdd(t,n)?n:""},e}(i.default);e.default=l},function(t,e,n){"use strict";function r(t){var e=t.split("-"),n=e.slice(1).map(function(t){return t[0].toUpperCase()+t.slice(1)}).join("");return e[0]+n}var o=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(e,"__esModule",{value:!0});var i=n(11),l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.keys=function(t){return(t.getAttribute("style")||"").split(";").map(function(t){return t.split(":")[0].trim()})},e.prototype.add=function(t,e){return!!this.canAdd(t,e)&&(t.style[r(this.keyName)]=e,!0)},e.prototype.remove=function(t){t.style[r(this.keyName)]="",t.getAttribute("style")||t.removeAttribute("style")},e.prototype.value=function(t){var e=t.style[r(this.keyName)];return this.canAdd(t,e)?e:""},e}(i.default);e.default=l},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function l(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var a=function(){function t(t,e){var n=[],r=!0,o=!1,i=void 0;try{for(var l,a=t[Symbol.iterator]();!(r=(l=a.next()).done)&&(n.push(l.value),!e||n.length!==e);r=!0);}catch(t){o=!0,i=t}finally{try{!r&&a.return&&a.return()}finally{if(o)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),s=function t(e,n,r){null===e&&(e=Function.prototype);var o=Object.getOwnPropertyDescriptor(e,n);if(void 0===o){var i=Object.getPrototypeOf(e);return null===i?void 0:t(i,n,r)}if("value"in o)return o.value;var l=o.get;if(void 0!==l)return l.call(r)},u=function(){function t(t,e){for(var n=0;n '},function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function i(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var l=function(){function t(t,e){for(var n=0;nr.right&&(i=r.right-o.right,this.root.style.left=e+i+"px"),o.leftr.bottom){var l=o.bottom-o.top,a=t.bottom-t.top+l;this.root.style.top=n-a+"px",this.root.classList.add("ql-flip")}return i}},{key:"show",value:function(){this.root.classList.remove("ql-editing"),this.root.classList.remove("ql-hidden")}}]),t}();e.default=i},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function l(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function a(t){var e=t.match(/^(?:(https?):\/\/)?(?:(?:www|m)\.)?youtube\.com\/watch.*v=([a-zA-Z0-9_-]+)/)||t.match(/^(?:(https?):\/\/)?(?:(?:www|m)\.)?youtu\.be\/([a-zA-Z0-9_-]+)/);return e?(e[1]||"https")+"://www.youtube.com/embed/"+e[2]+"?showinfo=0":(e=t.match(/^(?:(https?):\/\/)?(?:www\.)?vimeo\.com\/(\d+)/))?(e[1]||"https")+"://player.vimeo.com/video/"+e[2]+"/":t}function s(t,e){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];e.forEach(function(e){var r=document.createElement("option");e===n?r.setAttribute("selected","selected"):r.setAttribute("value",e),t.appendChild(r)})}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.BaseTooltip=void 0;var u=function(){function t(t,e){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:"link",e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;this.root.classList.remove("ql-hidden"),this.root.classList.add("ql-editing"),null!=e?this.textbox.value=e:t!==this.root.getAttribute("data-mode")&&(this.textbox.value=""),this.position(this.quill.getBounds(this.quill.selection.savedRange)),this.textbox.select(),this.textbox.setAttribute("placeholder",this.textbox.getAttribute("data-"+t)||""),this.root.setAttribute("data-mode",t)}},{key:"restoreFocus",value:function(){var t=this.quill.scrollingContainer.scrollTop;this.quill.focus(),this.quill.scrollingContainer.scrollTop=t}},{key:"save",value:function(){var t=this.textbox.value;switch(this.root.getAttribute("data-mode")){case"link":var e=this.quill.root.scrollTop;this.linkRange?(this.quill.formatText(this.linkRange,"link",t,v.default.sources.USER),delete this.linkRange):(this.restoreFocus(),this.quill.format("link",t,v.default.sources.USER)),this.quill.root.scrollTop=e;break;case"video":t=a(t);case"formula":if(!t)break;var n=this.quill.getSelection(!0);if(null!=n){var r=n.index+n.length;this.quill.insertEmbed(r,this.root.getAttribute("data-mode"),t,v.default.sources.USER),"formula"===this.root.getAttribute("data-mode")&&this.quill.insertText(r+1," ",v.default.sources.USER),this.quill.setSelection(r+2,v.default.sources.USER)}}this.textbox.value="",this.hide()}}]),e}(A.default);e.BaseTooltip=M,e.default=L},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var o=n(46),i=r(o),l=n(34),a=n(36),s=n(62),u=n(63),c=r(u),f=n(64),h=r(f),p=n(65),d=r(p),y=n(35),v=n(24),b=n(37),g=n(38),m=n(39),_=r(m),O=n(66),w=r(O),x=n(15),k=r(x),E=n(67),N=r(E),j=n(68),A=r(j),q=n(69),T=r(q),P=n(70),S=r(P),C=n(71),L=r(C),M=n(13),R=r(M),I=n(72),B=r(I),D=n(73),U=r(D),F=n(74),H=r(F),K=n(26),z=r(K),V=n(16),Z=r(V),W=n(41),G=r(W),Y=n(42),X=r(Y),$=n(43),Q=r($),J=n(107),tt=r(J),et=n(108),nt=r(et);i.default.register({"attributors/attribute/direction":a.DirectionAttribute,"attributors/class/align":l.AlignClass,"attributors/class/background":y.BackgroundClass,"attributors/class/color":v.ColorClass,"attributors/class/direction":a.DirectionClass,"attributors/class/font":b.FontClass,"attributors/class/size":g.SizeClass,"attributors/style/align":l.AlignStyle,"attributors/style/background":y.BackgroundStyle,"attributors/style/color":v.ColorStyle,"attributors/style/direction":a.DirectionStyle,"attributors/style/font":b.FontStyle,"attributors/style/size":g.SizeStyle},!0),i.default.register({"formats/align":l.AlignClass,"formats/direction":a.DirectionClass,"formats/indent":s.IndentClass,"formats/background":y.BackgroundStyle,"formats/color":v.ColorStyle,"formats/font":b.FontClass,"formats/size":g.SizeClass,"formats/blockquote":c.default,"formats/code-block":R.default,"formats/header":h.default,"formats/list":d.default,"formats/bold":_.default,"formats/code":M.Code,"formats/italic":w.default,"formats/link":k.default,"formats/script":N.default,"formats/strike":A.default,"formats/underline":T.default,"formats/image":S.default,"formats/video":L.default,"formats/list/item":p.ListItem,"modules/formula":B.default,"modules/syntax":U.default,"modules/toolbar":H.default,"themes/bubble":tt.default,"themes/snow":nt.default,"ui/icons":z.default,"ui/picker":Z.default,"ui/icon-picker":X.default,"ui/color-picker":G.default,"ui/tooltip":Q.default},!0),e.default=i.default},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var o=n(0),i=r(o),l=n(6),a=r(l),s=n(3),u=r(s),c=n(14),f=r(c),h=n(23),p=r(h),d=n(31),y=r(d),v=n(33),b=r(v),g=n(5),m=r(g),_=n(59),O=r(_),w=n(8),x=r(w),k=n(60),E=r(k),N=n(61),j=r(N),A=n(25),q=r(A);a.default.register({"blots/block":u.default,"blots/block/embed":s.BlockEmbed,"blots/break":f.default,"blots/container":p.default,"blots/cursor":y.default,"blots/embed":b.default,"blots/inline":m.default,"blots/scroll":O.default,"blots/text":x.default,"modules/clipboard":E.default,"modules/history":j.default,"modules/keyboard":q.default}),i.default.register(u.default,f.default,y.default,m.default,O.default,x.default),e.default=a.default},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=function(){function t(){this.head=this.tail=null,this.length=0}return t.prototype.append=function(){for(var t=[],e=0;e1&&this.append.apply(this,t.slice(1))},t.prototype.contains=function(t){for(var e,n=this.iterator();e=n();)if(e===t)return!0;return!1},t.prototype.insertBefore=function(t,e){t&&(t.next=e,null!=e?(t.prev=e.prev,null!=e.prev&&(e.prev.next=t),e.prev=t,e===this.head&&(this.head=t)):null!=this.tail?(this.tail.next=t,t.prev=this.tail,this.tail=t):(t.prev=null,this.head=this.tail=t),this.length+=1)},t.prototype.offset=function(t){for(var e=0,n=this.head;null!=n;){if(n===t)return e;e+=n.length(),n=n.next}return-1},t.prototype.remove=function(t){this.contains(t)&&(null!=t.prev&&(t.prev.next=t.next),null!=t.next&&(t.next.prev=t.prev),t===this.head&&(this.head=t.next),t===this.tail&&(this.tail=t.prev),this.length-=1)},t.prototype.iterator=function(t){return void 0===t&&(t=this.head),function(){var e=t;return null!=t&&(t=t.next),e}},t.prototype.find=function(t,e){void 0===e&&(e=!1);for(var n,r=this.iterator();n=r();){var o=n.length();if(ta?n(r,t-a,Math.min(e,a+u-t)):n(r,0,Math.min(u,t+e-a)),a+=u}},t.prototype.map=function(t){return this.reduce(function(e,n){return e.push(t(n)),e},[])},t.prototype.reduce=function(t,e){for(var n,r=this.iterator();n=r();)e=t(e,n);return e},t}();e.default=r},function(t,e,n){"use strict";var r=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(e,"__esModule",{value:!0});var o=n(17),i=n(1),l={attributes:!0,characterData:!0,characterDataOldValue:!0,childList:!0,subtree:!0},a=function(t){function e(e){var n=t.call(this,e)||this;return n.scroll=n,n.observer=new MutationObserver(function(t){n.update(t)}),n.observer.observe(n.domNode,l),n.attach(),n}return r(e,t),e.prototype.detach=function(){t.prototype.detach.call(this),this.observer.disconnect()},e.prototype.deleteAt=function(e,n){this.update(),0===e&&n===this.length()?this.children.forEach(function(t){t.remove()}):t.prototype.deleteAt.call(this,e,n)},e.prototype.formatAt=function(e,n,r,o){this.update(),t.prototype.formatAt.call(this,e,n,r,o)},e.prototype.insertAt=function(e,n,r){this.update(),t.prototype.insertAt.call(this,e,n,r)},e.prototype.optimize=function(e,n){var r=this;void 0===e&&(e=[]),void 0===n&&(n={}),t.prototype.optimize.call(this,n);for(var l=[].slice.call(this.observer.takeRecords());l.length>0;)e.push(l.pop());for(var a=function(t,e){void 0===e&&(e=!0),null!=t&&t!==r&&null!=t.domNode.parentNode&&(null==t.domNode[i.DATA_KEY].mutations&&(t.domNode[i.DATA_KEY].mutations=[]),e&&a(t.parent))},s=function(t){null!=t.domNode[i.DATA_KEY]&&null!=t.domNode[i.DATA_KEY].mutations&&(t instanceof o.default&&t.children.forEach(s),t.optimize(n))},u=e,c=0;u.length>0;c+=1){if(c>=100)throw new Error("[Parchment] Maximum optimize iterations reached");for(u.forEach(function(t){var e=i.find(t.target,!0);null!=e&&(e.domNode===t.target&&("childList"===t.type?(a(i.find(t.previousSibling,!1)),[].forEach.call(t.addedNodes,function(t){var e=i.find(t,!1);a(e,!1),e instanceof o.default&&e.children.forEach(function(t){a(t,!1)})})):"attributes"===t.type&&a(e.prev)),a(e))}),this.children.forEach(s),u=[].slice.call(this.observer.takeRecords()),l=u.slice();l.length>0;)e.push(l.pop())}},e.prototype.update=function(e,n){var r=this;void 0===n&&(n={}),e=e||this.observer.takeRecords(),e.map(function(t){var e=i.find(t.target,!0);return null==e?null:null==e.domNode[i.DATA_KEY].mutations?(e.domNode[i.DATA_KEY].mutations=[t],e):(e.domNode[i.DATA_KEY].mutations.push(t),null)}).forEach(function(t){null!=t&&t!==r&&null!=t.domNode[i.DATA_KEY]&&t.update(t.domNode[i.DATA_KEY].mutations||[],n)}),null!=this.domNode[i.DATA_KEY].mutations&&t.prototype.update.call(this,this.domNode[i.DATA_KEY].mutations,n),this.optimize(e,n)},e.blotName="scroll",e.defaultChild="block",e.scope=i.Scope.BLOCK_BLOT,e.tagName="DIV",e}(o.default);e.default=a},function(t,e,n){"use strict";function r(t,e){if(Object.keys(t).length!==Object.keys(e).length)return!1;for(var n in t)if(t[n]!==e[n])return!1;return!0}var o=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(e,"__esModule",{value:!0});var i=n(18),l=n(1),a=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.formats=function(n){if(n.tagName!==e.tagName)return t.formats.call(this,n)},e.prototype.format=function(n,r){var o=this;n!==this.statics.blotName||r?t.prototype.format.call(this,n,r):(this.children.forEach(function(t){t instanceof i.default||(t=t.wrap(e.blotName,!0)),o.attributes.copy(t)}),this.unwrap())},e.prototype.formatAt=function(e,n,r,o){if(null!=this.formats()[r]||l.query(r,l.Scope.ATTRIBUTE)){this.isolate(e,n).format(r,o)}else t.prototype.formatAt.call(this,e,n,r,o)},e.prototype.optimize=function(n){t.prototype.optimize.call(this,n);var o=this.formats();if(0===Object.keys(o).length)return this.unwrap();var i=this.next;i instanceof e&&i.prev===this&&r(o,i.formats())&&(i.moveChildren(this),i.remove())},e.blotName="inline",e.scope=l.Scope.INLINE_BLOT,e.tagName="SPAN",e}(i.default);e.default=a},function(t,e,n){"use strict";var r=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(e,"__esModule",{value:!0});var o=n(18),i=n(1),l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return r(e,t),e.formats=function(n){var r=i.query(e.blotName).tagName;if(n.tagName!==r)return t.formats.call(this,n)},e.prototype.format=function(n,r){null!=i.query(n,i.Scope.BLOCK)&&(n!==this.statics.blotName||r?t.prototype.format.call(this,n,r):this.replaceWith(e.blotName))},e.prototype.formatAt=function(e,n,r,o){null!=i.query(r,i.Scope.BLOCK)?this.format(r,o):t.prototype.formatAt.call(this,e,n,r,o)},e.prototype.insertAt=function(e,n,r){if(null==r||null!=i.query(n,i.Scope.INLINE))t.prototype.insertAt.call(this,e,n,r);else{var o=this.split(e),l=i.create(n,r);o.parent.insertBefore(l,o)}},e.prototype.update=function(e,n){navigator.userAgent.match(/Trident/)?this.build():t.prototype.update.call(this,e,n)},e.blotName="block",e.scope=i.Scope.BLOCK_BLOT,e.tagName="P",e}(o.default);e.default=l},function(t,e,n){"use strict";var r=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(e,"__esModule",{value:!0});var o=n(19),i=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return r(e,t),e.formats=function(t){},e.prototype.format=function(e,n){t.prototype.formatAt.call(this,0,this.length(),e,n)},e.prototype.formatAt=function(e,n,r,o){0===e&&n===this.length()?this.format(r,o):t.prototype.formatAt.call(this,e,n,r,o)},e.prototype.formats=function(){return this.statics.formats(this.domNode)},e}(o.default);e.default=i},function(t,e,n){"use strict";var r=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(e,"__esModule",{value:!0});var o=n(19),i=n(1),l=function(t){function e(e){var n=t.call(this,e)||this;return n.text=n.statics.value(n.domNode),n}return r(e,t),e.create=function(t){return document.createTextNode(t)},e.value=function(t){var e=t.data;return e.normalize&&(e=e.normalize()),e},e.prototype.deleteAt=function(t,e){this.domNode.data=this.text=this.text.slice(0,t)+this.text.slice(t+e)},e.prototype.index=function(t,e){return this.domNode===t?e:-1},e.prototype.insertAt=function(e,n,r){null==r?(this.text=this.text.slice(0,e)+n+this.text.slice(e),this.domNode.data=this.text):t.prototype.insertAt.call(this,e,n,r)},e.prototype.length=function(){return this.text.length},e.prototype.optimize=function(n){t.prototype.optimize.call(this,n),this.text=this.statics.value(this.domNode),0===this.text.length?this.remove():this.next instanceof e&&this.next.prev===this&&(this.insertAt(this.length(),this.next.value()),this.next.remove())},e.prototype.position=function(t,e){return void 0===e&&(e=!1),[this.domNode,t]},e.prototype.split=function(t,e){if(void 0===e&&(e=!1),!e){if(0===t)return this;if(t===this.length())return this.next}var n=i.create(this.domNode.splitText(t));return this.parent.insertBefore(n,this.next),this.text=this.statics.value(this.domNode),n},e.prototype.update=function(t,e){var n=this;t.some(function(t){return"characterData"===t.type&&t.target===n.domNode})&&(this.text=this.statics.value(this.domNode))},e.prototype.value=function(){return this.text},e.blotName="text",e.scope=i.Scope.INLINE_BLOT,e}(o.default);e.default=l},function(t,e,n){"use strict";var r=document.createElement("div");if(r.classList.toggle("test-class",!1),r.classList.contains("test-class")){var o=DOMTokenList.prototype.toggle;DOMTokenList.prototype.toggle=function(t,e){return arguments.length>1&&!this.contains(t)==!e?e:o.call(this,t)}}String.prototype.startsWith||(String.prototype.startsWith=function(t,e){return e=e||0,this.substr(e,t.length)===t}),String.prototype.endsWith||(String.prototype.endsWith=function(t,e){var n=this.toString();("number"!=typeof e||!isFinite(e)||Math.floor(e)!==e||e>n.length)&&(e=n.length),e-=t.length;var r=n.indexOf(t,e);return-1!==r&&r===e}),Array.prototype.find||Object.defineProperty(Array.prototype,"find",{value:function(t){if(null===this)throw new TypeError("Array.prototype.find called on null or undefined");if("function"!=typeof t)throw new TypeError("predicate must be a function");for(var e,n=Object(this),r=n.length>>>0,o=arguments[1],i=0;ie.length?t:e,l=t.length>e.length?e:t,a=i.indexOf(l);if(-1!=a)return r=[[y,i.substring(0,a)],[v,l],[y,i.substring(a+l.length)]],t.length>e.length&&(r[0][0]=r[2][0]=d),r;if(1==l.length)return[[d,t],[y,e]];var u=s(t,e);if(u){var c=u[0],f=u[1],h=u[2],p=u[3],b=u[4],g=n(c,h),m=n(f,p);return g.concat([[v,b]],m)}return o(t,e)}function o(t,e){for(var n=t.length,r=e.length,o=Math.ceil((n+r)/2),l=o,a=2*o,s=new Array(a),u=new Array(a),c=0;cn)v+=2;else if(x>r)p+=2;else if(h){var k=l+f-_;if(k>=0&&k=E)return i(t,e,O,x)}}}for(var N=-m+b;N<=m-g;N+=2){var E,k=l+N;E=N==-m||N!=m&&u[k-1]n)g+=2;else if(j>r)b+=2;else if(!h){var w=l+f-N;if(w>=0&&w=E)return i(t,e,O,x)}}}}return[[d,t],[y,e]]}function i(t,e,r,o){var i=t.substring(0,r),l=e.substring(0,o),a=t.substring(r),s=e.substring(o),u=n(i,l),c=n(a,s);return u.concat(c)}function l(t,e){if(!t||!e||t.charAt(0)!=e.charAt(0))return 0;for(var n=0,r=Math.min(t.length,e.length),o=r,i=0;n=t.length?[r,o,i,s,f]:null}var r=t.length>e.length?t:e,o=t.length>e.length?e:t;if(r.length<4||2*o.lengthu[4].length?s:u:s;var c,f,h,p;return t.length>e.length?(c=i[0],f=i[1],h=i[2],p=i[3]):(h=i[0],p=i[1],c=i[2],f=i[3]),[c,f,h,p,i[4]]}function u(t){t.push([v,""]);for(var e,n=0,r=0,o=0,i="",s="";n1?(0!==r&&0!==o&&(e=l(s,i),0!==e&&(n-r-o>0&&t[n-r-o-1][0]==v?t[n-r-o-1][1]+=s.substring(0,e):(t.splice(0,0,[v,s.substring(0,e)]),n++),s=s.substring(e),i=i.substring(e)),0!==(e=a(s,i))&&(t[n][1]=s.substring(s.length-e)+t[n][1],s=s.substring(0,s.length-e),i=i.substring(0,i.length-e))),0===r?t.splice(n-o,r+o,[y,s]):0===o?t.splice(n-r,r+o,[d,i]):t.splice(n-r-o,r+o,[d,i],[y,s]),n=n-r-o+(r?1:0)+(o?1:0)+1):0!==n&&t[n-1][0]==v?(t[n-1][1]+=t[n][1],t.splice(n,1)):n++,o=0,r=0,i="",s=""}""===t[t.length-1][1]&&t.pop();var c=!1;for(n=1;n0&&r.splice(o+2,0,[l[0],a]),p(r,o,3)}return t}function h(t){for(var e=!1,n=function(t){return t.charCodeAt(0)>=56320&&t.charCodeAt(0)<=57343},r=2;r=55296&&t.charCodeAt(t.length-1)<=56319}(t[r-2][1])&&t[r-1][0]===d&&n(t[r-1][1])&&t[r][0]===y&&n(t[r][1])&&(e=!0,t[r-1][1]=t[r-2][1].slice(-1)+t[r-1][1],t[r][1]=t[r-2][1].slice(-1)+t[r][1],t[r-2][1]=t[r-2][1].slice(0,-1));if(!e)return t;for(var o=[],r=0;r0&&o.push(t[r]);return o}function p(t,e,n){for(var r=e+n-1;r>=0&&r>=e-1;r--)if(r+1=r&&!a.endsWith("\n")&&(n=!0),e.scroll.insertAt(t,a);var c=e.scroll.line(t),f=u(c,2),h=f[0],p=f[1],y=(0,T.default)({},(0,O.bubbleFormats)(h));if(h instanceof w.default){var b=h.descendant(v.default.Leaf,p),g=u(b,1),m=g[0];y=(0,T.default)(y,(0,O.bubbleFormats)(m))}l=d.default.attributes.diff(y,l)||{}}else if("object"===s(o.insert)){var _=Object.keys(o.insert)[0];if(null==_)return t;e.scroll.insertAt(t,_,o.insert[_])}r+=i}return Object.keys(l).forEach(function(n){e.scroll.formatAt(t,i,n,l[n])}),t+i},0),t.reduce(function(t,n){return"number"==typeof n.delete?(e.scroll.deleteAt(t,n.delete),t):t+(n.retain||n.insert.length||1)},0),this.scroll.batchEnd(),this.update(t)}},{key:"deleteText",value:function(t,e){return this.scroll.deleteAt(t,e),this.update((new h.default).retain(t).delete(e))}},{key:"formatLine",value:function(t,e){var n=this,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return this.scroll.update(),Object.keys(r).forEach(function(o){if(null==n.scroll.whitelist||n.scroll.whitelist[o]){var i=n.scroll.lines(t,Math.max(e,1)),l=e;i.forEach(function(e){var i=e.length();if(e instanceof g.default){var a=t-e.offset(n.scroll),s=e.newlineIndex(a+l)-a+1;e.formatAt(a,s,o,r[o])}else e.format(o,r[o]);l-=i})}}),this.scroll.optimize(),this.update((new h.default).retain(t).retain(e,(0,N.default)(r)))}},{key:"formatText",value:function(t,e){var n=this,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return Object.keys(r).forEach(function(o){n.scroll.formatAt(t,e,o,r[o])}),this.update((new h.default).retain(t).retain(e,(0,N.default)(r)))}},{key:"getContents",value:function(t,e){return this.delta.slice(t,t+e)}},{key:"getDelta",value:function(){return this.scroll.lines().reduce(function(t,e){return t.concat(e.delta())},new h.default)}},{key:"getFormat",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=[],r=[];0===e?this.scroll.path(t).forEach(function(t){var e=u(t,1),o=e[0];o instanceof w.default?n.push(o):o instanceof v.default.Leaf&&r.push(o)}):(n=this.scroll.lines(t,e),r=this.scroll.descendants(v.default.Leaf,t,e));var o=[n,r].map(function(t){if(0===t.length)return{};for(var e=(0,O.bubbleFormats)(t.shift());Object.keys(e).length>0;){var n=t.shift();if(null==n)return e;e=l((0,O.bubbleFormats)(n),e)}return e});return T.default.apply(T.default,o)}},{key:"getText",value:function(t,e){return this.getContents(t,e).filter(function(t){return"string"==typeof t.insert}).map(function(t){return t.insert}).join("")}},{key:"insertEmbed",value:function(t,e,n){return this.scroll.insertAt(t,e,n),this.update((new h.default).retain(t).insert(o({},e,n)))}},{key:"insertText",value:function(t,e){var n=this,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return e=e.replace(/\r\n/g,"\n").replace(/\r/g,"\n"),this.scroll.insertAt(t,e),Object.keys(r).forEach(function(o){n.scroll.formatAt(t,e.length,o,r[o])}),this.update((new h.default).retain(t).insert(e,(0,N.default)(r)))}},{key:"isBlank",value:function(){if(0==this.scroll.children.length)return!0;if(this.scroll.children.length>1)return!1;var t=this.scroll.children.head;return t.statics.blotName===w.default.blotName&&(!(t.children.length>1)&&t.children.head instanceof k.default)}},{key:"removeFormat",value:function(t,e){var n=this.getText(t,e),r=this.scroll.line(t+e),o=u(r,2),i=o[0],l=o[1],a=0,s=new h.default;null!=i&&(a=i instanceof g.default?i.newlineIndex(l)-l+1:i.length()-l,s=i.delta().slice(l,l+a-1).insert("\n"));var c=this.getContents(t,e+a),f=c.diff((new h.default).insert(n).concat(s)),p=(new h.default).retain(t).concat(f);return this.applyDelta(p)}},{key:"update",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0,r=this.delta;if(1===e.length&&"characterData"===e[0].type&&e[0].target.data.match(P)&&v.default.find(e[0].target)){var o=v.default.find(e[0].target),i=(0,O.bubbleFormats)(o),l=o.offset(this.scroll),a=e[0].oldValue.replace(_.default.CONTENTS,""),s=(new h.default).insert(a),u=(new h.default).insert(o.value());t=(new h.default).retain(l).concat(s.diff(u,n)).reduce(function(t,e){return e.insert?t.insert(e.insert,i):t.push(e)},new h.default),this.delta=r.compose(t)}else this.delta=this.getDelta(),t&&(0,A.default)(r.compose(t),this.delta)||(t=r.diff(this.delta,n));return t}}]),t}();e.default=S},function(t,e){"use strict";function n(){}function r(t,e,n){this.fn=t,this.context=e,this.once=n||!1}function o(){this._events=new n,this._eventsCount=0}var i=Object.prototype.hasOwnProperty,l="~";Object.create&&(n.prototype=Object.create(null),(new n).__proto__||(l=!1)),o.prototype.eventNames=function(){var t,e,n=[];if(0===this._eventsCount)return n;for(e in t=this._events)i.call(t,e)&&n.push(l?e.slice(1):e);return Object.getOwnPropertySymbols?n.concat(Object.getOwnPropertySymbols(t)):n},o.prototype.listeners=function(t,e){var n=l?l+t:t,r=this._events[n];if(e)return!!r;if(!r)return[];if(r.fn)return[r.fn];for(var o=0,i=r.length,a=new Array(i);o0){if(i instanceof y.BlockEmbed||f instanceof y.BlockEmbed)return void this.optimize();if(i instanceof _.default){var h=i.newlineIndex(i.length(),!0);if(h>-1&&(i=i.split(h+1))===f)return void this.optimize()}else if(f instanceof _.default){var p=f.newlineIndex(0);p>-1&&f.split(p+1)}var d=f.children.head instanceof g.default?null:f.children.head;i.moveChildren(f,d),i.remove()}this.optimize()}},{key:"enable",value:function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.domNode.setAttribute("contenteditable",t)}},{key:"formatAt",value:function(t,n,r,o){(null==this.whitelist||this.whitelist[r])&&(c(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"formatAt",this).call(this,t,n,r,o),this.optimize())}},{key:"insertAt",value:function(t,n,r){if(null==r||null==this.whitelist||this.whitelist[n]){if(t>=this.length())if(null==r||null==h.default.query(n,h.default.Scope.BLOCK)){var o=h.default.create(this.statics.defaultChild);this.appendChild(o),null==r&&n.endsWith("\n")&&(n=n.slice(0,-1)),o.insertAt(0,n,r)}else{var i=h.default.create(n,r);this.appendChild(i)}else c(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"insertAt",this).call(this,t,n,r);this.optimize()}}},{key:"insertBefore",value:function(t,n){if(t.statics.scope===h.default.Scope.INLINE_BLOT){var r=h.default.create(this.statics.defaultChild);r.appendChild(t),t=r}c(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"insertBefore",this).call(this,t,n)}},{key:"leaf",value:function(t){return this.path(t).pop()||[null,-1]}},{key:"line",value:function(t){return t===this.length()?this.line(t-1):this.descendant(a,t)}},{key:"lines",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Number.MAX_VALUE;return function t(e,n,r){var o=[],i=r;return e.children.forEachAt(n,r,function(e,n,r){a(e)?o.push(e):e instanceof h.default.Container&&(o=o.concat(t(e,n,i))),i-=r}),o}(this,t,e)}},{key:"optimize",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};!0!==this.batch&&(c(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"optimize",this).call(this,t,n),t.length>0&&this.emitter.emit(d.default.events.SCROLL_OPTIMIZE,t,n))}},{key:"path",value:function(t){return c(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"path",this).call(this,t).slice(1)}},{key:"update",value:function(t){if(!0!==this.batch){var n=d.default.sources.USER;"string"==typeof t&&(n=t),Array.isArray(t)||(t=this.observer.takeRecords()),t.length>0&&this.emitter.emit(d.default.events.SCROLL_BEFORE_UPDATE,n,t),c(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"update",this).call(this,t.concat([])),t.length>0&&this.emitter.emit(d.default.events.SCROLL_UPDATE,n,t)}}}]),e}(h.default.Scroll);x.blotName="scroll",x.className="ql-editor",x.tagName="DIV",x.defaultChild="block",x.allowedChildren=[v.default,y.BlockEmbed,w.default],e.default=x},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function l(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function a(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function s(t,e,n){return"object"===(void 0===e?"undefined":x(e))?Object.keys(e).reduce(function(t,n){return s(t,n,e[n])},t):t.reduce(function(t,r){return r.attributes&&r.attributes[e]?t.push(r):t.insert(r.insert,(0,j.default)({},o({},e,n),r.attributes))},new q.default)}function u(t){if(t.nodeType!==Node.ELEMENT_NODE)return{};return t["__ql-computed-style"]||(t["__ql-computed-style"]=window.getComputedStyle(t))}function c(t,e){for(var n="",r=t.ops.length-1;r>=0&&n.length-1}function h(t,e,n){return t.nodeType===t.TEXT_NODE?n.reduce(function(e,n){return n(t,e)},new q.default):t.nodeType===t.ELEMENT_NODE?[].reduce.call(t.childNodes||[],function(r,o){var i=h(o,e,n);return o.nodeType===t.ELEMENT_NODE&&(i=e.reduce(function(t,e){return e(o,t)},i),i=(o[W]||[]).reduce(function(t,e){return e(o,t)},i)),r.concat(i)},new q.default):new q.default}function p(t,e,n){return s(n,t,!0)}function d(t,e){var n=P.default.Attributor.Attribute.keys(t),r=P.default.Attributor.Class.keys(t),o=P.default.Attributor.Style.keys(t),i={};return n.concat(r).concat(o).forEach(function(e){var n=P.default.query(e,P.default.Scope.ATTRIBUTE);null!=n&&(i[n.attrName]=n.value(t),i[n.attrName])||(n=Y[e],null==n||n.attrName!==e&&n.keyName!==e||(i[n.attrName]=n.value(t)||void 0),null==(n=X[e])||n.attrName!==e&&n.keyName!==e||(n=X[e],i[n.attrName]=n.value(t)||void 0))}),Object.keys(i).length>0&&(e=s(e,i)),e}function y(t,e){var n=P.default.query(t);if(null==n)return e;if(n.prototype instanceof P.default.Embed){var r={},o=n.value(t);null!=o&&(r[n.blotName]=o,e=(new q.default).insert(r,n.formats(t)))}else"function"==typeof n.formats&&(e=s(e,n.blotName,n.formats(t)));return e}function v(t,e){return c(e,"\n")||e.insert("\n"),e}function b(){return new q.default}function g(t,e){var n=P.default.query(t);if(null==n||"list-item"!==n.blotName||!c(e,"\n"))return e;for(var r=-1,o=t.parentNode;!o.classList.contains("ql-clipboard");)"list"===(P.default.query(o)||{}).blotName&&(r+=1),o=o.parentNode;return r<=0?e:e.compose((new q.default).retain(e.length()-1).retain(1,{indent:r}))}function m(t,e){return c(e,"\n")||(f(t)||e.length()>0&&t.nextSibling&&f(t.nextSibling))&&e.insert("\n"),e}function _(t,e){if(f(t)&&null!=t.nextElementSibling&&!c(e,"\n\n")){var n=t.offsetHeight+parseFloat(u(t).marginTop)+parseFloat(u(t).marginBottom);t.nextElementSibling.offsetTop>t.offsetTop+1.5*n&&e.insert("\n")}return e}function O(t,e){var n={},r=t.style||{};return r.fontStyle&&"italic"===u(t).fontStyle&&(n.italic=!0),r.fontWeight&&(u(t).fontWeight.startsWith("bold")||parseInt(u(t).fontWeight)>=700)&&(n.bold=!0),Object.keys(n).length>0&&(e=s(e,n)),parseFloat(r.textIndent||0)>0&&(e=(new q.default).insert("\t").concat(e)),e}function w(t,e){var n=t.data;if("O:P"===t.parentNode.tagName)return e.insert(n.trim());if(0===n.trim().length&&t.parentNode.classList.contains("ql-clipboard"))return e;if(!u(t.parentNode).whiteSpace.startsWith("pre")){var r=function(t,e){return e=e.replace(/[^\u00a0]/g,""),e.length<1&&t?" ":e};n=n.replace(/\r\n/g," ").replace(/\n/g," "),n=n.replace(/\s\s+/g,r.bind(r,!0)),(null==t.previousSibling&&f(t.parentNode)||null!=t.previousSibling&&f(t.previousSibling))&&(n=n.replace(/^\s+/,r.bind(r,!1))),(null==t.nextSibling&&f(t.parentNode)||null!=t.nextSibling&&f(t.nextSibling))&&(n=n.replace(/\s+$/,r.bind(r,!1)))}return e.insert(n)}Object.defineProperty(e,"__esModule",{value:!0}),e.matchText=e.matchSpacing=e.matchNewline=e.matchBlot=e.matchAttributor=e.default=void 0;var x="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},k=function(){function t(t,e){var n=[],r=!0,o=!1,i=void 0;try{for(var l,a=t[Symbol.iterator]();!(r=(l=a.next()).done)&&(n.push(l.value),!e||n.length!==e);r=!0);}catch(t){o=!0,i=t}finally{try{!r&&a.return&&a.return()}finally{if(o)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),E=function(){function t(t,e){for(var n=0;n\r?\n +\<"),this.convert();var e=this.quill.getFormat(this.quill.selection.savedRange.index);if(e[F.default.blotName]){var n=this.container.innerText;return this.container.innerHTML="",(new q.default).insert(n,o({},F.default.blotName,e[F.default.blotName]))}var r=this.prepareMatching(),i=k(r,2),l=i[0],a=i[1],s=h(this.container,l,a);return c(s,"\n")&&null==s.ops[s.ops.length-1].attributes&&(s=s.compose((new q.default).retain(s.length()-1).delete(1))),Z.log("convert",this.container.innerHTML,s),this.container.innerHTML="",s}},{key:"dangerouslyPasteHTML",value:function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:C.default.sources.API;if("string"==typeof t)this.quill.setContents(this.convert(t),e),this.quill.setSelection(0,C.default.sources.SILENT);else{var r=this.convert(e);this.quill.updateContents((new q.default).retain(t).concat(r),n),this.quill.setSelection(t+r.length(),C.default.sources.SILENT)}}},{key:"onPaste",value:function(t){var e=this;if(!t.defaultPrevented&&this.quill.isEnabled()){var n=this.quill.getSelection(),r=(new q.default).retain(n.index),o=this.quill.scrollingContainer.scrollTop;this.container.focus(),this.quill.selection.update(C.default.sources.SILENT),setTimeout(function(){r=r.concat(e.convert()).delete(n.length),e.quill.updateContents(r,C.default.sources.USER),e.quill.setSelection(r.length()-n.length,C.default.sources.SILENT),e.quill.scrollingContainer.scrollTop=o,e.quill.focus()},1)}}},{key:"prepareMatching",value:function(){var t=this,e=[],n=[];return this.matchers.forEach(function(r){var o=k(r,2),i=o[0],l=o[1];switch(i){case Node.TEXT_NODE:n.push(l);break;case Node.ELEMENT_NODE:e.push(l);break;default:[].forEach.call(t.container.querySelectorAll(i),function(t){t[W]=t[W]||[],t[W].push(l)})}}),[e,n]}}]),e}(I.default);$.DEFAULTS={matchers:[],matchVisual:!0},e.default=$,e.matchAttributor=d,e.matchBlot=y,e.matchNewline=m,e.matchSpacing=_,e.matchText=w},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function l(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function a(t){var e=t.ops[t.ops.length-1];return null!=e&&(null!=e.insert?"string"==typeof e.insert&&e.insert.endsWith("\n"):null!=e.attributes&&Object.keys(e.attributes).some(function(t){return null!=f.default.query(t,f.default.Scope.BLOCK)}))}function s(t){var e=t.reduce(function(t,e){return t+=e.delete||0},0),n=t.length()-e;return a(t)&&(n-=1),n}Object.defineProperty(e,"__esModule",{value:!0}),e.getLastChangeIndex=e.default=void 0;var u=function(){function t(t,e){for(var n=0;nr&&this.stack.undo.length>0){var o=this.stack.undo.pop();n=n.compose(o.undo),t=o.redo.compose(t)}else this.lastRecorded=r;this.stack.undo.push({redo:t,undo:n}),this.stack.undo.length>this.options.maxStack&&this.stack.undo.shift()}}},{key:"redo",value:function(){this.change("redo","undo")}},{key:"transform",value:function(t){this.stack.undo.forEach(function(e){e.undo=t.transform(e.undo,!0),e.redo=t.transform(e.redo,!0)}),this.stack.redo.forEach(function(e){e.undo=t.transform(e.undo,!0),e.redo=t.transform(e.redo,!0)})}},{key:"undo",value:function(){this.change("undo","redo")}}]),e}(y.default);v.DEFAULTS={delay:1e3,maxStack:100,userOnly:!1},e.default=v,e.getLastChangeIndex=s},function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function i(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0}),e.IndentClass=void 0;var l=function(){function t(t,e){for(var n=0;n0&&this.children.tail.format(t,e)}},{key:"formats",value:function(){return o({},this.statics.blotName,this.statics.formats(this.domNode))}},{key:"insertBefore",value:function(t,n){if(t instanceof v)u(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"insertBefore",this).call(this,t,n);else{var r=null==n?this.length():n.offset(this),o=this.split(r);o.parent.insertBefore(t,o)}}},{key:"optimize",value:function(t){u(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"optimize",this).call(this,t);var n=this.next;null!=n&&n.prev===this&&n.statics.blotName===this.statics.blotName&&n.domNode.tagName===this.domNode.tagName&&n.domNode.getAttribute("data-checked")===this.domNode.getAttribute("data-checked")&&(n.moveChildren(this),n.remove())}},{key:"replace",value:function(t){if(t.statics.blotName!==this.statics.blotName){var n=f.default.create(this.statics.defaultChild);t.moveChildren(n),this.appendChild(n)}u(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"replace",this).call(this,t)}}]),e}(y.default);b.blotName="list",b.scope=f.default.Scope.BLOCK_BLOT,b.tagName=["OL","UL"],b.defaultChild="list-item",b.allowedChildren=[v],e.ListItem=v,e.default=b},function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function i(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var l=n(39),a=function(t){return t&&t.__esModule?t:{default:t}}(l),s=function(t){function e(){return r(this,e),o(this,(e.__proto__||Object.getPrototypeOf(e)).apply(this,arguments))}return i(e,t),e}(a.default);s.blotName="italic",s.tagName=["EM","I"],e.default=s},function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function i(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var l=function(){function t(t,e){for(var n=0;n-1?n?this.domNode.setAttribute(t,n):this.domNode.removeAttribute(t):a(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"format",this).call(this,t,n)}}],[{key:"create",value:function(t){var n=a(e.__proto__||Object.getPrototypeOf(e),"create",this).call(this,t);return"string"==typeof t&&n.setAttribute("src",this.sanitize(t)),n}},{key:"formats",value:function(t){return f.reduce(function(e,n){return t.hasAttribute(n)&&(e[n]=t.getAttribute(n)),e},{})}},{key:"match",value:function(t){return/\.(jpe?g|gif|png)$/.test(t)||/^data:image\/.+;base64/.test(t)}},{key:"sanitize",value:function(t){return(0,c.sanitize)(t,["http","https","data"])?t:"//:0"}},{key:"value",value:function(t){return t.getAttribute("src")}}]),e}(u.default.Embed);h.blotName="image",h.tagName="IMG",e.default=h},function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function i(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var l=function(){function t(t,e){for(var n=0;n-1?n?this.domNode.setAttribute(t,n):this.domNode.removeAttribute(t):a(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"format",this).call(this,t,n)}}],[{key:"create",value:function(t){var n=a(e.__proto__||Object.getPrototypeOf(e),"create",this).call(this,t);return n.setAttribute("frameborder","0"),n.setAttribute("allowfullscreen",!0),n.setAttribute("src",this.sanitize(t)),n}},{key:"formats",value:function(t){return f.reduce(function(e,n){return t.hasAttribute(n)&&(e[n]=t.getAttribute(n)),e},{})}},{key:"sanitize",value:function(t){return c.default.sanitize(t)}},{key:"value",value:function(t){return t.getAttribute("src")}}]),e}(s.BlockEmbed);h.blotName="video",h.className="ql-video",h.tagName="IFRAME",e.default=h},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function l(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.FormulaBlot=void 0;var a=function(){function t(t,e){for(var n=0;n0||null==this.cachedText)&&(this.domNode.innerHTML=t(e),this.domNode.normalize(),this.attach()),this.cachedText=e)}}]),e}(v.default);b.className="ql-syntax";var g=new c.default.Attributor.Class("token","hljs",{scope:c.default.Scope.INLINE}),m=function(t){function e(t,n){o(this,e);var r=i(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,n));if("function"!=typeof r.options.highlight)throw new Error("Syntax module requires highlight.js. Please include the library on the page before Quill.");var l=null;return r.quill.on(h.default.events.SCROLL_OPTIMIZE,function(){clearTimeout(l),l=setTimeout(function(){r.highlight(),l=null},r.options.interval)}),r.highlight(),r}return l(e,t),a(e,null,[{key:"register",value:function(){h.default.register(g,!0),h.default.register(b,!0)}}]),a(e,[{key:"highlight",value:function(){var t=this;if(!this.quill.selection.composing){this.quill.update(h.default.sources.USER);var e=this.quill.getSelection();this.quill.scroll.descendants(b).forEach(function(e){e.highlight(t.options.highlight)}),this.quill.update(h.default.sources.SILENT),null!=e&&this.quill.setSelection(e,h.default.sources.SILENT)}}}]),e}(d.default);m.DEFAULTS={highlight:function(){return null==window.hljs?null:function(t){return window.hljs.highlightAuto(t).value}}(),interval:1e3},e.CodeBlock=b,e.CodeToken=g,e.default=m},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function l(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function a(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function s(t,e,n){var r=document.createElement("button");r.setAttribute("type","button"),r.classList.add("ql-"+e),null!=n&&(r.value=n),t.appendChild(r)}function u(t,e){Array.isArray(e[0])||(e=[e]),e.forEach(function(e){var n=document.createElement("span");n.classList.add("ql-formats"),e.forEach(function(t){if("string"==typeof t)s(n,t);else{var e=Object.keys(t)[0],r=t[e];Array.isArray(r)?c(n,e,r):s(n,e,r)}}),t.appendChild(n)})}function c(t,e,n){var r=document.createElement("select");r.classList.add("ql-"+e),n.forEach(function(t){var e=document.createElement("option");!1!==t?e.setAttribute("value",t):e.setAttribute("selected","selected"),r.appendChild(e)}),t.appendChild(r)}Object.defineProperty(e,"__esModule",{value:!0}),e.addControls=e.default=void 0;var f=function(){function t(t,e){var n=[],r=!0,o=!1,i=void 0;try{for(var l,a=t[Symbol.iterator]();!(r=(l=a.next()).done)&&(n.push(l.value),!e||n.length!==e);r=!0);}catch(t){o=!0,i=t}finally{try{!r&&a.return&&a.return()}finally{if(o)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),h=function(){function t(t,e){for(var n=0;n '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e){t.exports=' '},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function l(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0}),e.default=e.BubbleTooltip=void 0;var a=function t(e,n,r){null===e&&(e=Function.prototype);var o=Object.getOwnPropertyDescriptor(e,n);if(void 0===o){var i=Object.getPrototypeOf(e);return null===i?void 0:t(i,n,r)}if("value"in o)return o.value;var l=o.get;if(void 0!==l)return l.call(r)},s=function(){function t(t,e){for(var n=0;n0&&o===h.default.sources.USER){r.show(),r.root.style.left="0px",r.root.style.width="",r.root.style.width=r.root.offsetWidth+"px";var i=r.quill.getLines(e.index,e.length);if(1===i.length)r.position(r.quill.getBounds(e));else{var l=i[i.length-1],a=r.quill.getIndex(l),s=Math.min(l.length()-1,e.index+e.length-a),u=r.quill.getBounds(new y.Range(a,s));r.position(u)}}else document.activeElement!==r.textbox&&r.quill.hasFocus()&&r.hide()}),r}return l(e,t),s(e,[{key:"listen",value:function(){var t=this;a(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"listen",this).call(this),this.root.querySelector(".ql-close").addEventListener("click",function(){t.root.classList.remove("ql-editing")}),this.quill.on(h.default.events.SCROLL_OPTIMIZE,function(){setTimeout(function(){if(!t.root.classList.contains("ql-hidden")){var e=t.quill.getSelection();null!=e&&t.position(t.quill.getBounds(e))}},1)})}},{key:"cancel",value:function(){this.show()}},{key:"position",value:function(t){var n=a(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"position",this).call(this,t),r=this.root.querySelector(".ql-tooltip-arrow");if(r.style.marginLeft="",0===n)return n;r.style.marginLeft=-1*n-r.offsetWidth/2+"px"}}]),e}(p.BaseTooltip);_.TEMPLATE=['','
"].join(""),e.BubbleTooltip=_,e.default=m},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function l(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var a=function(){function t(t,e){var n=[],r=!0,o=!1,i=void 0;try{for(var l,a=t[Symbol.iterator]();!(r=(l=a.next()).done)&&(n.push(l.value),!e||n.length!==e);r=!0);}catch(t){o=!0,i=t}finally{try{!r&&a.return&&a.return()}finally{if(o)throw i}}return n}return function(e,n){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return t(e,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),s=function t(e,n,r){null===e&&(e=Function.prototype);var o=Object.getOwnPropertyDescriptor(e,n);if(void 0===o){var i=Object.getPrototypeOf(e);return null===i?void 0:t(i,n,r)}if("value"in o)return o.value;var l=o.get;if(void 0!==l)return l.call(r)},u=function(){function t(t,e){for(var n=0;n','','',''].join(""),e.default=w}]).default}); +//# sourceMappingURL=quill.min.js.map \ No newline at end of file diff --git a/shared/feature/community/src/commonMain/composeResources/files/editor/quill.snow.css b/shared/feature/community/src/commonMain/composeResources/files/editor/quill.snow.css new file mode 100644 index 00000000..ccf825df --- /dev/null +++ b/shared/feature/community/src/commonMain/composeResources/files/editor/quill.snow.css @@ -0,0 +1,945 @@ +/*! + * Quill Editor v1.3.7 + * https://quilljs.com/ + * Copyright (c) 2014, Jason Chen + * Copyright (c) 2013, salesforce.com + */ +.ql-container { + box-sizing: border-box; + font-family: Helvetica, Arial, sans-serif; + font-size: 13px; + height: 100%; + margin: 0px; + position: relative; +} +.ql-container.ql-disabled .ql-tooltip { + visibility: hidden; +} +.ql-container.ql-disabled .ql-editor ul[data-checked] > li::before { + pointer-events: none; +} +.ql-clipboard { + left: -100000px; + height: 1px; + overflow-y: hidden; + position: absolute; + top: 50%; +} +.ql-clipboard p { + margin: 0; + padding: 0; +} +.ql-editor { + box-sizing: border-box; + line-height: 1.42; + height: 100%; + outline: none; + overflow-y: auto; + padding: 12px 15px; + tab-size: 4; + -moz-tab-size: 4; + text-align: left; + white-space: pre-wrap; + word-wrap: break-word; +} +.ql-editor > * { + cursor: text; +} +.ql-editor p, +.ql-editor ol, +.ql-editor ul, +.ql-editor pre, +.ql-editor blockquote, +.ql-editor h1, +.ql-editor h2, +.ql-editor h3, +.ql-editor h4, +.ql-editor h5, +.ql-editor h6 { + margin: 0; + padding: 0; + counter-reset: list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9; +} +.ql-editor ol, +.ql-editor ul { + padding-left: 1.5em; +} +.ql-editor ol > li, +.ql-editor ul > li { + list-style-type: none; +} +.ql-editor ul > li::before { + content: '\2022'; +} +.ql-editor ul[data-checked=true], +.ql-editor ul[data-checked=false] { + pointer-events: none; +} +.ql-editor ul[data-checked=true] > li *, +.ql-editor ul[data-checked=false] > li * { + pointer-events: all; +} +.ql-editor ul[data-checked=true] > li::before, +.ql-editor ul[data-checked=false] > li::before { + color: #777; + cursor: pointer; + pointer-events: all; +} +.ql-editor ul[data-checked=true] > li::before { + content: '\2611'; +} +.ql-editor ul[data-checked=false] > li::before { + content: '\2610'; +} +.ql-editor li::before { + display: inline-block; + white-space: nowrap; + width: 1.2em; +} +.ql-editor li:not(.ql-direction-rtl)::before { + margin-left: -1.5em; + margin-right: 0.3em; + text-align: right; +} +.ql-editor li.ql-direction-rtl::before { + margin-left: 0.3em; + margin-right: -1.5em; +} +.ql-editor ol li:not(.ql-direction-rtl), +.ql-editor ul li:not(.ql-direction-rtl) { + padding-left: 1.5em; +} +.ql-editor ol li.ql-direction-rtl, +.ql-editor ul li.ql-direction-rtl { + padding-right: 1.5em; +} +.ql-editor ol li { + counter-reset: list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9; + counter-increment: list-0; +} +.ql-editor ol li:before { + content: counter(list-0, decimal) '. '; +} +.ql-editor ol li.ql-indent-1 { + counter-increment: list-1; +} +.ql-editor ol li.ql-indent-1:before { + content: counter(list-1, lower-alpha) '. '; +} +.ql-editor ol li.ql-indent-1 { + counter-reset: list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9; +} +.ql-editor ol li.ql-indent-2 { + counter-increment: list-2; +} +.ql-editor ol li.ql-indent-2:before { + content: counter(list-2, lower-roman) '. '; +} +.ql-editor ol li.ql-indent-2 { + counter-reset: list-3 list-4 list-5 list-6 list-7 list-8 list-9; +} +.ql-editor ol li.ql-indent-3 { + counter-increment: list-3; +} +.ql-editor ol li.ql-indent-3:before { + content: counter(list-3, decimal) '. '; +} +.ql-editor ol li.ql-indent-3 { + counter-reset: list-4 list-5 list-6 list-7 list-8 list-9; +} +.ql-editor ol li.ql-indent-4 { + counter-increment: list-4; +} +.ql-editor ol li.ql-indent-4:before { + content: counter(list-4, lower-alpha) '. '; +} +.ql-editor ol li.ql-indent-4 { + counter-reset: list-5 list-6 list-7 list-8 list-9; +} +.ql-editor ol li.ql-indent-5 { + counter-increment: list-5; +} +.ql-editor ol li.ql-indent-5:before { + content: counter(list-5, lower-roman) '. '; +} +.ql-editor ol li.ql-indent-5 { + counter-reset: list-6 list-7 list-8 list-9; +} +.ql-editor ol li.ql-indent-6 { + counter-increment: list-6; +} +.ql-editor ol li.ql-indent-6:before { + content: counter(list-6, decimal) '. '; +} +.ql-editor ol li.ql-indent-6 { + counter-reset: list-7 list-8 list-9; +} +.ql-editor ol li.ql-indent-7 { + counter-increment: list-7; +} +.ql-editor ol li.ql-indent-7:before { + content: counter(list-7, lower-alpha) '. '; +} +.ql-editor ol li.ql-indent-7 { + counter-reset: list-8 list-9; +} +.ql-editor ol li.ql-indent-8 { + counter-increment: list-8; +} +.ql-editor ol li.ql-indent-8:before { + content: counter(list-8, lower-roman) '. '; +} +.ql-editor ol li.ql-indent-8 { + counter-reset: list-9; +} +.ql-editor ol li.ql-indent-9 { + counter-increment: list-9; +} +.ql-editor ol li.ql-indent-9:before { + content: counter(list-9, decimal) '. '; +} +.ql-editor .ql-indent-1:not(.ql-direction-rtl) { + padding-left: 3em; +} +.ql-editor li.ql-indent-1:not(.ql-direction-rtl) { + padding-left: 4.5em; +} +.ql-editor .ql-indent-1.ql-direction-rtl.ql-align-right { + padding-right: 3em; +} +.ql-editor li.ql-indent-1.ql-direction-rtl.ql-align-right { + padding-right: 4.5em; +} +.ql-editor .ql-indent-2:not(.ql-direction-rtl) { + padding-left: 6em; +} +.ql-editor li.ql-indent-2:not(.ql-direction-rtl) { + padding-left: 7.5em; +} +.ql-editor .ql-indent-2.ql-direction-rtl.ql-align-right { + padding-right: 6em; +} +.ql-editor li.ql-indent-2.ql-direction-rtl.ql-align-right { + padding-right: 7.5em; +} +.ql-editor .ql-indent-3:not(.ql-direction-rtl) { + padding-left: 9em; +} +.ql-editor li.ql-indent-3:not(.ql-direction-rtl) { + padding-left: 10.5em; +} +.ql-editor .ql-indent-3.ql-direction-rtl.ql-align-right { + padding-right: 9em; +} +.ql-editor li.ql-indent-3.ql-direction-rtl.ql-align-right { + padding-right: 10.5em; +} +.ql-editor .ql-indent-4:not(.ql-direction-rtl) { + padding-left: 12em; +} +.ql-editor li.ql-indent-4:not(.ql-direction-rtl) { + padding-left: 13.5em; +} +.ql-editor .ql-indent-4.ql-direction-rtl.ql-align-right { + padding-right: 12em; +} +.ql-editor li.ql-indent-4.ql-direction-rtl.ql-align-right { + padding-right: 13.5em; +} +.ql-editor .ql-indent-5:not(.ql-direction-rtl) { + padding-left: 15em; +} +.ql-editor li.ql-indent-5:not(.ql-direction-rtl) { + padding-left: 16.5em; +} +.ql-editor .ql-indent-5.ql-direction-rtl.ql-align-right { + padding-right: 15em; +} +.ql-editor li.ql-indent-5.ql-direction-rtl.ql-align-right { + padding-right: 16.5em; +} +.ql-editor .ql-indent-6:not(.ql-direction-rtl) { + padding-left: 18em; +} +.ql-editor li.ql-indent-6:not(.ql-direction-rtl) { + padding-left: 19.5em; +} +.ql-editor .ql-indent-6.ql-direction-rtl.ql-align-right { + padding-right: 18em; +} +.ql-editor li.ql-indent-6.ql-direction-rtl.ql-align-right { + padding-right: 19.5em; +} +.ql-editor .ql-indent-7:not(.ql-direction-rtl) { + padding-left: 21em; +} +.ql-editor li.ql-indent-7:not(.ql-direction-rtl) { + padding-left: 22.5em; +} +.ql-editor .ql-indent-7.ql-direction-rtl.ql-align-right { + padding-right: 21em; +} +.ql-editor li.ql-indent-7.ql-direction-rtl.ql-align-right { + padding-right: 22.5em; +} +.ql-editor .ql-indent-8:not(.ql-direction-rtl) { + padding-left: 24em; +} +.ql-editor li.ql-indent-8:not(.ql-direction-rtl) { + padding-left: 25.5em; +} +.ql-editor .ql-indent-8.ql-direction-rtl.ql-align-right { + padding-right: 24em; +} +.ql-editor li.ql-indent-8.ql-direction-rtl.ql-align-right { + padding-right: 25.5em; +} +.ql-editor .ql-indent-9:not(.ql-direction-rtl) { + padding-left: 27em; +} +.ql-editor li.ql-indent-9:not(.ql-direction-rtl) { + padding-left: 28.5em; +} +.ql-editor .ql-indent-9.ql-direction-rtl.ql-align-right { + padding-right: 27em; +} +.ql-editor li.ql-indent-9.ql-direction-rtl.ql-align-right { + padding-right: 28.5em; +} +.ql-editor .ql-video { + display: block; + max-width: 100%; +} +.ql-editor .ql-video.ql-align-center { + margin: 0 auto; +} +.ql-editor .ql-video.ql-align-right { + margin: 0 0 0 auto; +} +.ql-editor .ql-bg-black { + background-color: #000; +} +.ql-editor .ql-bg-red { + background-color: #e60000; +} +.ql-editor .ql-bg-orange { + background-color: #f90; +} +.ql-editor .ql-bg-yellow { + background-color: #ff0; +} +.ql-editor .ql-bg-green { + background-color: #008a00; +} +.ql-editor .ql-bg-blue { + background-color: #06c; +} +.ql-editor .ql-bg-purple { + background-color: #93f; +} +.ql-editor .ql-color-white { + color: #fff; +} +.ql-editor .ql-color-red { + color: #e60000; +} +.ql-editor .ql-color-orange { + color: #f90; +} +.ql-editor .ql-color-yellow { + color: #ff0; +} +.ql-editor .ql-color-green { + color: #008a00; +} +.ql-editor .ql-color-blue { + color: #06c; +} +.ql-editor .ql-color-purple { + color: #93f; +} +.ql-editor .ql-font-serif { + font-family: Georgia, Times New Roman, serif; +} +.ql-editor .ql-font-monospace { + font-family: Monaco, Courier New, monospace; +} +.ql-editor .ql-size-small { + font-size: 0.75em; +} +.ql-editor .ql-size-large { + font-size: 1.5em; +} +.ql-editor .ql-size-huge { + font-size: 2.5em; +} +.ql-editor .ql-direction-rtl { + direction: rtl; + text-align: inherit; +} +.ql-editor .ql-align-center { + text-align: center; +} +.ql-editor .ql-align-justify { + text-align: justify; +} +.ql-editor .ql-align-right { + text-align: right; +} +.ql-editor.ql-blank::before { + color: rgba(0,0,0,0.6); + content: attr(data-placeholder); + font-style: italic; + left: 15px; + pointer-events: none; + position: absolute; + right: 15px; +} +.ql-snow.ql-toolbar:after, +.ql-snow .ql-toolbar:after { + clear: both; + content: ''; + display: table; +} +.ql-snow.ql-toolbar button, +.ql-snow .ql-toolbar button { + background: none; + border: none; + cursor: pointer; + display: inline-block; + float: left; + height: 24px; + padding: 3px 5px; + width: 28px; +} +.ql-snow.ql-toolbar button svg, +.ql-snow .ql-toolbar button svg { + float: left; + height: 100%; +} +.ql-snow.ql-toolbar button:active:hover, +.ql-snow .ql-toolbar button:active:hover { + outline: none; +} +.ql-snow.ql-toolbar input.ql-image[type=file], +.ql-snow .ql-toolbar input.ql-image[type=file] { + display: none; +} +.ql-snow.ql-toolbar button:hover, +.ql-snow .ql-toolbar button:hover, +.ql-snow.ql-toolbar button:focus, +.ql-snow .ql-toolbar button:focus, +.ql-snow.ql-toolbar button.ql-active, +.ql-snow .ql-toolbar button.ql-active, +.ql-snow.ql-toolbar .ql-picker-label:hover, +.ql-snow .ql-toolbar .ql-picker-label:hover, +.ql-snow.ql-toolbar .ql-picker-label.ql-active, +.ql-snow .ql-toolbar .ql-picker-label.ql-active, +.ql-snow.ql-toolbar .ql-picker-item:hover, +.ql-snow .ql-toolbar .ql-picker-item:hover, +.ql-snow.ql-toolbar .ql-picker-item.ql-selected, +.ql-snow .ql-toolbar .ql-picker-item.ql-selected { + color: #06c; +} +.ql-snow.ql-toolbar button:hover .ql-fill, +.ql-snow .ql-toolbar button:hover .ql-fill, +.ql-snow.ql-toolbar button:focus .ql-fill, +.ql-snow .ql-toolbar button:focus .ql-fill, +.ql-snow.ql-toolbar button.ql-active .ql-fill, +.ql-snow .ql-toolbar button.ql-active .ql-fill, +.ql-snow.ql-toolbar .ql-picker-label:hover .ql-fill, +.ql-snow .ql-toolbar .ql-picker-label:hover .ql-fill, +.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-fill, +.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-fill, +.ql-snow.ql-toolbar .ql-picker-item:hover .ql-fill, +.ql-snow .ql-toolbar .ql-picker-item:hover .ql-fill, +.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-fill, +.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-fill, +.ql-snow.ql-toolbar button:hover .ql-stroke.ql-fill, +.ql-snow .ql-toolbar button:hover .ql-stroke.ql-fill, +.ql-snow.ql-toolbar button:focus .ql-stroke.ql-fill, +.ql-snow .ql-toolbar button:focus .ql-stroke.ql-fill, +.ql-snow.ql-toolbar button.ql-active .ql-stroke.ql-fill, +.ql-snow .ql-toolbar button.ql-active .ql-stroke.ql-fill, +.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill, +.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill, +.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill, +.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill, +.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill, +.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill, +.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill, +.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill { + fill: #06c; +} +.ql-snow.ql-toolbar button:hover .ql-stroke, +.ql-snow .ql-toolbar button:hover .ql-stroke, +.ql-snow.ql-toolbar button:focus .ql-stroke, +.ql-snow .ql-toolbar button:focus .ql-stroke, +.ql-snow.ql-toolbar button.ql-active .ql-stroke, +.ql-snow .ql-toolbar button.ql-active .ql-stroke, +.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke, +.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke, +.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke, +.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke, +.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke, +.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke, +.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke, +.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke, +.ql-snow.ql-toolbar button:hover .ql-stroke-miter, +.ql-snow .ql-toolbar button:hover .ql-stroke-miter, +.ql-snow.ql-toolbar button:focus .ql-stroke-miter, +.ql-snow .ql-toolbar button:focus .ql-stroke-miter, +.ql-snow.ql-toolbar button.ql-active .ql-stroke-miter, +.ql-snow .ql-toolbar button.ql-active .ql-stroke-miter, +.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke-miter, +.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke-miter, +.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter, +.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter, +.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke-miter, +.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke-miter, +.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter, +.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter { + stroke: #06c; +} +@media (pointer: coarse) { + .ql-snow.ql-toolbar button:hover:not(.ql-active), + .ql-snow .ql-toolbar button:hover:not(.ql-active) { + color: #444; + } + .ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-fill, + .ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-fill, + .ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill, + .ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill { + fill: #444; + } + .ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke, + .ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke, + .ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter, + .ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter { + stroke: #444; + } +} +.ql-snow { + box-sizing: border-box; +} +.ql-snow * { + box-sizing: border-box; +} +.ql-snow .ql-hidden { + display: none; +} +.ql-snow .ql-out-bottom, +.ql-snow .ql-out-top { + visibility: hidden; +} +.ql-snow .ql-tooltip { + position: absolute; + transform: translateY(10px); +} +.ql-snow .ql-tooltip a { + cursor: pointer; + text-decoration: none; +} +.ql-snow .ql-tooltip.ql-flip { + transform: translateY(-10px); +} +.ql-snow .ql-formats { + display: inline-block; + vertical-align: middle; +} +.ql-snow .ql-formats:after { + clear: both; + content: ''; + display: table; +} +.ql-snow .ql-stroke { + fill: none; + stroke: #444; + stroke-linecap: round; + stroke-linejoin: round; + stroke-width: 2; +} +.ql-snow .ql-stroke-miter { + fill: none; + stroke: #444; + stroke-miterlimit: 10; + stroke-width: 2; +} +.ql-snow .ql-fill, +.ql-snow .ql-stroke.ql-fill { + fill: #444; +} +.ql-snow .ql-empty { + fill: none; +} +.ql-snow .ql-even { + fill-rule: evenodd; +} +.ql-snow .ql-thin, +.ql-snow .ql-stroke.ql-thin { + stroke-width: 1; +} +.ql-snow .ql-transparent { + opacity: 0.4; +} +.ql-snow .ql-direction svg:last-child { + display: none; +} +.ql-snow .ql-direction.ql-active svg:last-child { + display: inline; +} +.ql-snow .ql-direction.ql-active svg:first-child { + display: none; +} +.ql-snow .ql-editor h1 { + font-size: 2em; +} +.ql-snow .ql-editor h2 { + font-size: 1.5em; +} +.ql-snow .ql-editor h3 { + font-size: 1.17em; +} +.ql-snow .ql-editor h4 { + font-size: 1em; +} +.ql-snow .ql-editor h5 { + font-size: 0.83em; +} +.ql-snow .ql-editor h6 { + font-size: 0.67em; +} +.ql-snow .ql-editor a { + text-decoration: underline; +} +.ql-snow .ql-editor blockquote { + border-left: 4px solid #ccc; + margin-bottom: 5px; + margin-top: 5px; + padding-left: 16px; +} +.ql-snow .ql-editor code, +.ql-snow .ql-editor pre { + background-color: #f0f0f0; + border-radius: 3px; +} +.ql-snow .ql-editor pre { + white-space: pre-wrap; + margin-bottom: 5px; + margin-top: 5px; + padding: 5px 10px; +} +.ql-snow .ql-editor code { + font-size: 85%; + padding: 2px 4px; +} +.ql-snow .ql-editor pre.ql-syntax { + background-color: #23241f; + color: #f8f8f2; + overflow: visible; +} +.ql-snow .ql-editor img { + max-width: 100%; +} +.ql-snow .ql-picker { + color: #444; + display: inline-block; + float: left; + font-size: 14px; + font-weight: 500; + height: 24px; + position: relative; + vertical-align: middle; +} +.ql-snow .ql-picker-label { + cursor: pointer; + display: inline-block; + height: 100%; + padding-left: 8px; + padding-right: 2px; + position: relative; + width: 100%; +} +.ql-snow .ql-picker-label::before { + display: inline-block; + line-height: 22px; +} +.ql-snow .ql-picker-options { + background-color: #fff; + display: none; + min-width: 100%; + padding: 4px 8px; + position: absolute; + white-space: nowrap; +} +.ql-snow .ql-picker-options .ql-picker-item { + cursor: pointer; + display: block; + padding-bottom: 5px; + padding-top: 5px; +} +.ql-snow .ql-picker.ql-expanded .ql-picker-label { + color: #ccc; + z-index: 2; +} +.ql-snow .ql-picker.ql-expanded .ql-picker-label .ql-fill { + fill: #ccc; +} +.ql-snow .ql-picker.ql-expanded .ql-picker-label .ql-stroke { + stroke: #ccc; +} +.ql-snow .ql-picker.ql-expanded .ql-picker-options { + display: block; + margin-top: -1px; + top: 100%; + z-index: 1; +} +.ql-snow .ql-color-picker, +.ql-snow .ql-icon-picker { + width: 28px; +} +.ql-snow .ql-color-picker .ql-picker-label, +.ql-snow .ql-icon-picker .ql-picker-label { + padding: 2px 4px; +} +.ql-snow .ql-color-picker .ql-picker-label svg, +.ql-snow .ql-icon-picker .ql-picker-label svg { + right: 4px; +} +.ql-snow .ql-icon-picker .ql-picker-options { + padding: 4px 0px; +} +.ql-snow .ql-icon-picker .ql-picker-item { + height: 24px; + width: 24px; + padding: 2px 4px; +} +.ql-snow .ql-color-picker .ql-picker-options { + padding: 3px 5px; + width: 152px; +} +.ql-snow .ql-color-picker .ql-picker-item { + border: 1px solid transparent; + float: left; + height: 16px; + margin: 2px; + padding: 0px; + width: 16px; +} +.ql-snow .ql-picker:not(.ql-color-picker):not(.ql-icon-picker) svg { + position: absolute; + margin-top: -9px; + right: 0; + top: 50%; + width: 18px; +} +.ql-snow .ql-picker.ql-header .ql-picker-label[data-label]:not([data-label=''])::before, +.ql-snow .ql-picker.ql-font .ql-picker-label[data-label]:not([data-label=''])::before, +.ql-snow .ql-picker.ql-size .ql-picker-label[data-label]:not([data-label=''])::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-label]:not([data-label=''])::before, +.ql-snow .ql-picker.ql-font .ql-picker-item[data-label]:not([data-label=''])::before, +.ql-snow .ql-picker.ql-size .ql-picker-item[data-label]:not([data-label=''])::before { + content: attr(data-label); +} +.ql-snow .ql-picker.ql-header { + width: 98px; +} +.ql-snow .ql-picker.ql-header .ql-picker-label::before, +.ql-snow .ql-picker.ql-header .ql-picker-item::before { + content: 'Normal'; +} +.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="1"]::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="1"]::before { + content: 'Heading 1'; +} +.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="2"]::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="2"]::before { + content: 'Heading 2'; +} +.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="3"]::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="3"]::before { + content: 'Heading 3'; +} +.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="4"]::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="4"]::before { + content: 'Heading 4'; +} +.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="5"]::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="5"]::before { + content: 'Heading 5'; +} +.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="6"]::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="6"]::before { + content: 'Heading 6'; +} +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="1"]::before { + font-size: 2em; +} +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="2"]::before { + font-size: 1.5em; +} +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="3"]::before { + font-size: 1.17em; +} +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="4"]::before { + font-size: 1em; +} +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="5"]::before { + font-size: 0.83em; +} +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="6"]::before { + font-size: 0.67em; +} +.ql-snow .ql-picker.ql-font { + width: 108px; +} +.ql-snow .ql-picker.ql-font .ql-picker-label::before, +.ql-snow .ql-picker.ql-font .ql-picker-item::before { + content: 'Sans Serif'; +} +.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=serif]::before, +.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=serif]::before { + content: 'Serif'; +} +.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=monospace]::before, +.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=monospace]::before { + content: 'Monospace'; +} +.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=serif]::before { + font-family: Georgia, Times New Roman, serif; +} +.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=monospace]::before { + font-family: Monaco, Courier New, monospace; +} +.ql-snow .ql-picker.ql-size { + width: 98px; +} +.ql-snow .ql-picker.ql-size .ql-picker-label::before, +.ql-snow .ql-picker.ql-size .ql-picker-item::before { + content: 'Normal'; +} +.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=small]::before, +.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=small]::before { + content: 'Small'; +} +.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=large]::before, +.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=large]::before { + content: 'Large'; +} +.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=huge]::before, +.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=huge]::before { + content: 'Huge'; +} +.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=small]::before { + font-size: 10px; +} +.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=large]::before { + font-size: 18px; +} +.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=huge]::before { + font-size: 32px; +} +.ql-snow .ql-color-picker.ql-background .ql-picker-item { + background-color: #fff; +} +.ql-snow .ql-color-picker.ql-color .ql-picker-item { + background-color: #000; +} +.ql-toolbar.ql-snow { + border: 1px solid #ccc; + box-sizing: border-box; + font-family: 'Helvetica Neue', 'Helvetica', 'Arial', sans-serif; + padding: 8px; +} +.ql-toolbar.ql-snow .ql-formats { + margin-right: 15px; +} +.ql-toolbar.ql-snow .ql-picker-label { + border: 1px solid transparent; +} +.ql-toolbar.ql-snow .ql-picker-options { + border: 1px solid transparent; + box-shadow: rgba(0,0,0,0.2) 0 2px 8px; +} +.ql-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-label { + border-color: #ccc; +} +.ql-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-options { + border-color: #ccc; +} +.ql-toolbar.ql-snow .ql-color-picker .ql-picker-item.ql-selected, +.ql-toolbar.ql-snow .ql-color-picker .ql-picker-item:hover { + border-color: #000; +} +.ql-toolbar.ql-snow + .ql-container.ql-snow { + border-top: 0px; +} +.ql-snow .ql-tooltip { + background-color: #fff; + border: 1px solid #ccc; + box-shadow: 0px 0px 5px #ddd; + color: #444; + padding: 5px 12px; + white-space: nowrap; +} +.ql-snow .ql-tooltip::before { + content: "Visit URL:"; + line-height: 26px; + margin-right: 8px; +} +.ql-snow .ql-tooltip input[type=text] { + display: none; + border: 1px solid #ccc; + font-size: 13px; + height: 26px; + margin: 0px; + padding: 3px 5px; + width: 170px; +} +.ql-snow .ql-tooltip a.ql-preview { + display: inline-block; + max-width: 200px; + overflow-x: hidden; + text-overflow: ellipsis; + vertical-align: top; +} +.ql-snow .ql-tooltip a.ql-action::after { + border-right: 1px solid #ccc; + content: 'Edit'; + margin-left: 16px; + padding-right: 8px; +} +.ql-snow .ql-tooltip a.ql-remove::before { + content: 'Remove'; + margin-left: 8px; +} +.ql-snow .ql-tooltip a { + line-height: 26px; +} +.ql-snow .ql-tooltip.ql-editing a.ql-preview, +.ql-snow .ql-tooltip.ql-editing a.ql-remove { + display: none; +} +.ql-snow .ql-tooltip.ql-editing input[type=text] { + display: inline-block; +} +.ql-snow .ql-tooltip.ql-editing a.ql-action::after { + border-right: 0px; + content: 'Save'; + padding-right: 0px; +} +.ql-snow .ql-tooltip[data-mode=link]::before { + content: "Enter link:"; +} +.ql-snow .ql-tooltip[data-mode=formula]::before { + content: "Enter formula:"; +} +.ql-snow .ql-tooltip[data-mode=video]::before { + content: "Enter video:"; +} +.ql-snow a { + color: #06c; +} +.ql-container.ql-snow { + border: 1px solid #ccc; +} diff --git a/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/config/CommunityKeys.kt b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/config/CommunityKeys.kt new file mode 100644 index 00000000..171c5451 --- /dev/null +++ b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/config/CommunityKeys.kt @@ -0,0 +1,12 @@ +package com.kus.feature.community.config + +object CommunityKeys { + const val COMMUNITY_MODIFY_KEY = "modify_payload_json" + const val COMMUNITY_LIST_REFRESH = "community_list_refresh" + + const val COMMUNITY_POST_EDIT_RESULT = "COMMUNITY_POST_EDIT_RESULT" + + const val COMMUNITY_POST_UPDATE_PAYLOAD = "community_post_update_payload" + + const val COMMUNITY_POST_DELETE_ID = "community_post_delete_id" +} \ No newline at end of file diff --git a/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/di/featureCommunityModule.kt b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/di/featureCommunityModule.kt new file mode 100644 index 00000000..12784e64 --- /dev/null +++ b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/di/featureCommunityModule.kt @@ -0,0 +1,13 @@ +package com.kus.feature.community.di + +import com.kus.feature.community.ui.CommunityViewModel +import com.kus.feature.community.ui.detail.CommunityDetailViewModel +import com.kus.feature.community.ui.write.CommunityWriteViewModel +import org.koin.core.module.dsl.viewModelOf +import org.koin.dsl.module + +val communityFeatureModule = module { + viewModelOf(::CommunityViewModel) + viewModelOf(::CommunityDetailViewModel) + viewModelOf(::CommunityWriteViewModel) +} \ No newline at end of file diff --git a/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/model/CommunityPostModifyPayload.kt b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/model/CommunityPostModifyPayload.kt new file mode 100644 index 00000000..085ba978 --- /dev/null +++ b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/model/CommunityPostModifyPayload.kt @@ -0,0 +1,25 @@ +package com.kus.feature.community.model + +import com.kus.domain.community.model.PostCategory +import com.kus.feature.community.ui.model.CommunityPostUi +import kotlinx.serialization.Serializable + +@Serializable +data class CommunityPostModifyPayload( + val postId: Long, + val title: String, + val body: String, + val category: PostCategory, + val totalLikes: Long, + val commentCount: Long, +) + +fun CommunityPostUi.toModifyPayload(): CommunityPostModifyPayload = + CommunityPostModifyPayload( + postId = postId, + category = category, + title = title, + body = body, + totalLikes = totalLikes, + commentCount = commentCount, + ) \ No newline at end of file diff --git a/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/model/DeleteCommunityEvent.kt b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/model/DeleteCommunityEvent.kt new file mode 100644 index 00000000..ac08ca2c --- /dev/null +++ b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/model/DeleteCommunityEvent.kt @@ -0,0 +1,6 @@ +package com.kus.feature.community.model + +sealed interface DeleteCommunityEvent { + data object Deleted : DeleteCommunityEvent + data class Error(val message: String) : DeleteCommunityEvent +} \ No newline at end of file diff --git a/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/model/ReactionAction.kt b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/model/ReactionAction.kt new file mode 100644 index 00000000..d65388d1 --- /dev/null +++ b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/model/ReactionAction.kt @@ -0,0 +1,3 @@ +package com.kus.feature.community.model + +enum class ReactionAction { LIKE, DISLIKE } \ No newline at end of file diff --git a/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/navigation/CommunityNavGraph.kt b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/navigation/CommunityNavGraph.kt index e7c822ff..bac437d9 100644 --- a/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/navigation/CommunityNavGraph.kt +++ b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/navigation/CommunityNavGraph.kt @@ -1,17 +1,169 @@ package com.kus.feature.community.navigation +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.navigation.NavGraphBuilder import androidx.navigation.compose.composable +import androidx.navigation.toRoute +import com.kus.core.serialization.KusJson +import com.kus.core.serialization.RouteCodec +import com.kus.feature.community.config.CommunityKeys.COMMUNITY_LIST_REFRESH +import com.kus.feature.community.config.CommunityKeys.COMMUNITY_POST_DELETE_ID +import com.kus.feature.community.config.CommunityKeys.COMMUNITY_POST_EDIT_RESULT +import com.kus.feature.community.config.CommunityKeys.COMMUNITY_POST_UPDATE_PAYLOAD +import com.kus.feature.community.model.CommunityPostModifyPayload +import com.kus.feature.community.ui.CommunityScreen +import com.kus.feature.community.ui.CommunityViewModel +import com.kus.feature.community.ui.detail.CommunityDetailScreen +import com.kus.feature.community.ui.detail.CommunityDetailViewModel +import com.kus.feature.community.ui.write.CommunityEditorRenderer +import com.kus.feature.community.ui.write.CommunityWriteScreen +import com.kus.feature.community.ui.write.image.PlatformImagePickerFactory import kotlinx.serialization.Serializable +import org.koin.compose.koinInject +import org.koin.compose.viewmodel.koinViewModel @Serializable data object Community +@Serializable +data class CommunityDetail(val postId: Long) + +@Serializable +data object CommunityWrite + +@Serializable +data class CommunityWriteModify( + val encoded: String, +) + fun NavGraphBuilder.communityNavGraph( onShowMessage: (String) -> Unit, + onBackButtonClick: () -> Unit, + onPostClick: (Long) -> Unit, + onPostCreated: (Long) -> Unit, + onPostModified: (CommunityPostModifyPayload) -> Unit, + onPostWriteClick: () -> Unit, + onSearchClick: () -> Unit, + onPostModifyClick: (String) -> Unit, + onPostModifiedInDetail: (CommunityPostModifyPayload) -> Unit, + onDetailBackClick: (CommunityPostModifyPayload?) -> Unit, + onPostDeletedInDetail: (Long) -> Unit, ) { - composable { - CommunityRoute( + composable { backStackEntry -> + val viewModel: CommunityViewModel = koinViewModel() + + val shouldRefresh by backStackEntry.savedStateHandle + .getStateFlow(COMMUNITY_LIST_REFRESH, false) + .collectAsStateWithLifecycle() + + LaunchedEffect(shouldRefresh) { + if (shouldRefresh) { + backStackEntry.savedStateHandle[COMMUNITY_LIST_REFRESH] = false + viewModel.fetchFirstPosts() + } + } + + val updatePayloadJson by backStackEntry.savedStateHandle + .getStateFlow(COMMUNITY_POST_UPDATE_PAYLOAD, null) + .collectAsStateWithLifecycle() + + LaunchedEffect(updatePayloadJson) { + val json = updatePayloadJson ?: return@LaunchedEffect + val payload = KusJson.json.decodeFromString( + CommunityPostModifyPayload.serializer(), json + ) + viewModel.updatePost(payload) + backStackEntry.savedStateHandle.remove(COMMUNITY_POST_UPDATE_PAYLOAD) + } + + val deletedPostId by backStackEntry.savedStateHandle + .getStateFlow(COMMUNITY_POST_DELETE_ID, null) + .collectAsStateWithLifecycle() + + LaunchedEffect(deletedPostId) { + val postId = deletedPostId ?: return@LaunchedEffect + viewModel.deletePost(postId) + backStackEntry.savedStateHandle.remove(COMMUNITY_POST_DELETE_ID) + } + + CommunityScreen( + onPostClick = onPostClick, + onWriteClick = onPostWriteClick, + onBackClick = onBackButtonClick, + onSearchClick = onSearchClick, + onShowMessage = onShowMessage, + ) + } + + composable { + val editorRenderer: CommunityEditorRenderer = koinInject() + val imagePickerFactory: PlatformImagePickerFactory = koinInject() + val imagePicker = imagePickerFactory.rememberPicker() + + CommunityWriteScreen( + initial = null, + onBackClick = onBackButtonClick, + onFinishCreate = onPostCreated, + onFinishModify = {}, + onShowMessage = onShowMessage, + editorRenderer = editorRenderer, + imagePicker = imagePicker + ) + } + + composable { backStackEntry -> + val args = backStackEntry.toRoute() + + val payloadJson = RouteCodec.decode(args.encoded) + val payload = KusJson.json.decodeFromString(payloadJson) + + val editorRenderer: CommunityEditorRenderer = koinInject() + val imagePickerFactory: PlatformImagePickerFactory = koinInject() + val imagePicker = imagePickerFactory.rememberPicker() + + CommunityWriteScreen( + initial = payload, + onBackClick = onBackButtonClick, + onFinishCreate = {}, + onFinishModify = onPostModified, + onShowMessage = onShowMessage, + editorRenderer = editorRenderer, + imagePicker = imagePicker + ) + } + + composable { backStackEntry -> + val args = backStackEntry.toRoute() + val viewModel: CommunityDetailViewModel = koinViewModel() + + val editJson by backStackEntry.savedStateHandle + .getStateFlow(COMMUNITY_POST_EDIT_RESULT, null) + .collectAsStateWithLifecycle() + + LaunchedEffect(editJson) { + val json = editJson ?: return@LaunchedEffect + + val payload = KusJson.json.decodeFromString( + CommunityPostModifyPayload.serializer(), + json + ) + + if (payload.postId == args.postId) { + viewModel.applyEditResult(payload) + } + + backStackEntry.savedStateHandle.remove(COMMUNITY_POST_EDIT_RESULT) + onPostModifiedInDetail(payload) + } + + CommunityDetailScreen( + postId = args.postId, + onBackButtonClick = { onDetailBackClick(viewModel.currentPayload()) }, + onPostModifyClick = onPostModifyClick, + onPostDeleted = { onPostDeletedInDetail(args.postId) }, + onShowMessage = onShowMessage ) } } \ No newline at end of file diff --git a/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/navigation/CommunityRoute.kt b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/navigation/CommunityRoute.kt deleted file mode 100644 index 47bfef67..00000000 --- a/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/navigation/CommunityRoute.kt +++ /dev/null @@ -1,10 +0,0 @@ -package com.kus.feature.community.navigation - -import androidx.compose.runtime.Composable -import com.kus.feature.community.ui.CommunityScreen - -@Composable -fun CommunityRoute( -) { - CommunityScreen() -} \ No newline at end of file diff --git a/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/CommunityBoards.kt b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/CommunityBoards.kt new file mode 100644 index 00000000..d7f250ac --- /dev/null +++ b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/CommunityBoards.kt @@ -0,0 +1,12 @@ +package com.kus.feature.community.ui + +import com.kus.domain.community.model.PostCategory + +internal object CommunityBoards { + val list: List = listOf( + PostCategory.ALL, + PostCategory.FREE, + PostCategory.COLUMN, + PostCategory.SUGGESTION + ) +} \ No newline at end of file diff --git a/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/CommunityPhase.kt b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/CommunityPhase.kt new file mode 100644 index 00000000..470277d8 --- /dev/null +++ b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/CommunityPhase.kt @@ -0,0 +1,3 @@ +package com.kus.feature.community.ui + +enum class CommunityPhase { Idle, Refreshing, Paging } \ No newline at end of file diff --git a/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/CommunityScreen.kt b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/CommunityScreen.kt index e12781fc..76025e26 100644 --- a/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/CommunityScreen.kt +++ b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/CommunityScreen.kt @@ -1,18 +1,205 @@ package com.kus.feature.community.ui +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.core.FastOutSlowInEasing +import androidx.compose.animation.core.tween +import androidx.compose.animation.fadeIn +import androidx.compose.animation.fadeOut +import androidx.compose.animation.scaleIn +import androidx.compose.animation.scaleOut +import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.HorizontalDivider +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Tab +import androidx.compose.material3.TabRow +import androidx.compose.material3.TabRowDefaults +import androidx.compose.material3.TabRowDefaults.tabIndicatorOffset import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.input.nestedscroll.nestedScroll +import androidx.compose.ui.unit.dp +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.kus.designsystem.component.KusTopBar +import com.kus.designsystem.theme.KusTheme +import com.kus.feature.community.ui.floatingButton.WriteFab +import com.kus.feature.community.ui.list.CommunityListContent +import com.kus.feature.community.ui.ranking.RankingContent +import kotlinx.coroutines.launch +import kustaurant.shared.core.designsystem.generated.resources.ic_alarm_off +import kustaurant.shared.core.designsystem.generated.resources.ic_arrow_back +import kustaurant.shared.core.designsystem.generated.resources.ic_search +import org.jetbrains.compose.resources.painterResource +import org.koin.compose.viewmodel.koinViewModel +import rememberFabVisibleOnScrollUp +import kustaurant.shared.core.designsystem.generated.resources.Res as CoreRes @Composable -fun CommunityScreen() { - Box( - modifier = Modifier.fillMaxSize(), - contentAlignment = Alignment.Center +fun CommunityScreen( + modifier: Modifier = Modifier, + onShowMessage: (String) -> Unit = {}, + onPostClick: (Long) -> Unit = {}, + onBackClick: () -> Unit = {}, + onSearchClick: () -> Unit = {}, + onAlarmClick: () -> Unit = {}, + onWriteClick: () -> Unit = {}, +) { + val viewModel: CommunityViewModel = koinViewModel() + val uiState by viewModel.uiState.collectAsStateWithLifecycle() + + var boardExpanded by remember { mutableStateOf(false) } + val (showWriteFab, fabScrollConnection) = rememberFabVisibleOnScrollUp() + + val scope = rememberCoroutineScope() + + val selectedIndex = remember(uiState.selectedTab) { + CommunityTab.entries.indexOf(uiState.selectedTab).coerceAtLeast(0) + } + + LaunchedEffect(uiState.toastMessage) { + uiState.toastMessage?.let { + onShowMessage(it) + viewModel.clearToastMessage() + } + } + + Scaffold( + modifier = modifier + .fillMaxSize(), + topBar = { + Column( + modifier.background(KusTheme.colors.c_FFFFFF) + ) { + KusTopBar( + modifier = Modifier + .fillMaxWidth() + .height(64.dp) + .padding(horizontal = 8.dp), + leftIcon = painterResource(CoreRes.drawable.ic_arrow_back), + rightFirstIcon = painterResource(CoreRes.drawable.ic_search), + rightSecondIcon = painterResource(CoreRes.drawable.ic_alarm_off), + onLeftClicked = onBackClick, + onRightFirstClicked = onSearchClick, + onRightSecondClicked = onAlarmClick, + ) { + Text( + text = "커뮤니티", + style = KusTheme.typography.type17sb, + color = KusTheme.colors.c_323232 + ) + } + + CommunityTabs( + selectedIndex = selectedIndex, + onSelect = { index -> + viewModel.selectTab(CommunityTab.entries[index]) + } + ) + } + }, + floatingActionButton = { + val visible = (uiState.selectedTab == CommunityTab.POSTS) && showWriteFab + + AnimatedVisibility( + visible = visible, + enter = fadeIn(animationSpec = tween(150)) + + scaleIn( + initialScale = 0.85f, + animationSpec = tween(180, easing = FastOutSlowInEasing) + ), + exit = fadeOut(animationSpec = tween(120)) + + scaleOut( + targetScale = 0.85f, + animationSpec = tween(160, easing = FastOutSlowInEasing) + ) + ) { + WriteFab(onClick = { + scope.launch { + if (viewModel.requireLogin()) { + onWriteClick() + } + } + }) + } + } + ) { inner -> + Box( + modifier = Modifier + .padding(inner) + .fillMaxSize() + ) { + when (uiState.selectedTab) { + CommunityTab.POSTS -> CommunityListContent( + uiState = uiState, + boardExpanded = boardExpanded, + onBoardExpandedChange = { boardExpanded = it }, + onPostClick = onPostClick, + onBoardSelect = viewModel::changePostCategory, + onSortChange = viewModel::changeListSortOrder, + onLoadNext = viewModel::loadNextPosts, + onRefresh = viewModel::fetchFirstPosts, + modifier = Modifier.nestedScroll(fabScrollConnection) + ) + + CommunityTab.RANKING -> RankingContent( + uiState = uiState, + onSortChange = viewModel::changeRankingSortType, + ) + } + } + } +} + +@Composable +private fun CommunityTabs( + selectedIndex: Int, + onSelect: (Int) -> Unit, +) { + TabRow( + selectedTabIndex = selectedIndex, + containerColor = Color.Transparent, + contentColor = Color.Black, + indicator = { tabPositions -> + TabRowDefaults.Indicator( + modifier = Modifier + .tabIndicatorOffset(tabPositions[selectedIndex]) + .height(2.dp), + color = KusTheme.colors.c_43AB38 + ) + }, + divider = { + HorizontalDivider( + thickness = 2.dp, + color = KusTheme.colors.c_E0E0E0, + ) + }, ) { - Text("Community Screen") + CommunityTab.entries.forEachIndexed { index, tab -> + Tab( + selected = selectedIndex == index, + onClick = { onSelect(index) }, + selectedContentColor = Color.Black, + unselectedContentColor = KusTheme.colors.c_323232, + ) { + Text( + text = tab.title, + modifier = Modifier.padding(vertical = 18.dp, horizontal = 18.dp), + style = KusTheme.typography.type14r, + ) + } + } } } \ No newline at end of file diff --git a/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/CommunityTab.kt b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/CommunityTab.kt new file mode 100644 index 00000000..8313d41f --- /dev/null +++ b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/CommunityTab.kt @@ -0,0 +1,6 @@ +package com.kus.feature.community.ui + +enum class CommunityTab(val title : String) { + POSTS("게시글"), + RANKING("평가 랭킹") +} \ No newline at end of file diff --git a/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/CommunityUiState.kt b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/CommunityUiState.kt new file mode 100644 index 00000000..abb7e432 --- /dev/null +++ b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/CommunityUiState.kt @@ -0,0 +1,28 @@ +package com.kus.feature.community.ui + +import UiState +import com.kus.domain.community.model.ListSortType +import com.kus.domain.community.model.CommunityPostListItem +import com.kus.domain.community.model.CommunityRanking +import com.kus.domain.community.model.RankingSortType +import com.kus.domain.community.model.PostCategory + +data class CommunityPageState( + val phase: CommunityPhase = CommunityPhase.Idle, + val page: Int = 0, + val isLastPage: Boolean = false +) + +data class CommunityUiState( + val selectedTab: CommunityTab = CommunityTab.POSTS, + + val postCategory: PostCategory = PostCategory.ALL, + val postListState: UiState> = UiState.Loading, + val postPageState: CommunityPageState = CommunityPageState(phase = CommunityPhase.Refreshing, page = 0), + + val listSortType: ListSortType = ListSortType.LATEST, + val rankingSortType: RankingSortType = RankingSortType.SEASONAL, + val rankingListState: UiState> = UiState.Loading, + + val toastMessage: String? = null, +) \ No newline at end of file diff --git a/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/CommunityViewModel.kt b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/CommunityViewModel.kt new file mode 100644 index 00000000..bbade003 --- /dev/null +++ b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/CommunityViewModel.kt @@ -0,0 +1,221 @@ +package com.kus.feature.community.ui + +import GetSessionAvailabilityUseCase +import UiError +import UiState +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.kus.domain.auth.session.SessionEvent +import com.kus.domain.auth.session.SessionEventEmitter +import com.kus.domain.community.model.ListSortType +import com.kus.domain.community.model.PostCategory +import com.kus.domain.community.model.RankingSortType +import com.kus.domain.community.model.toCategorySort +import com.kus.domain.community.usecase.GetCommunityPostListUseCase +import com.kus.domain.community.usecase.GetCommunityRankingListUseCase +import com.kus.feature.community.model.CommunityPostModifyPayload +import com.kus.logging.KusLog +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch + +class CommunityViewModel( + private val getSessionAvailabilityUseCase: GetSessionAvailabilityUseCase, + private val getCommunityPostListUseCase: GetCommunityPostListUseCase, + private val getCommunityRankingListUseCase: GetCommunityRankingListUseCase, + private val sessionEvents: SessionEventEmitter, +) : ViewModel() { + + private val _uiState = MutableStateFlow(CommunityUiState()) + val uiState: StateFlow = _uiState.asStateFlow() + + init { + ensureDataForCurrentTab(force = true) + } + + fun clearToastMessage() { + _uiState.update { it.copy(toastMessage = null) } + } + + suspend fun requireLogin(): Boolean { + if (!getSessionAvailabilityUseCase()) { + sessionEvents.emit(SessionEvent.LoginRequired) + return false + } + return true + } + + fun selectTab(tab: CommunityTab) { + _uiState.update { it.copy(selectedTab = tab) } + ensureDataForCurrentTab() + } + + fun changePostCategory(newCategory: PostCategory) { + if (_uiState.value.postCategory == newCategory) return + _uiState.update { it.copy(postCategory = newCategory) } + fetchFirstPosts() + } + + fun changeListSortOrder(newOrder: ListSortType) { + if (_uiState.value.listSortType == newOrder) return + _uiState.update { it.copy(listSortType = newOrder) } + + when (_uiState.value.selectedTab) { + CommunityTab.POSTS -> fetchFirstPosts() + CommunityTab.RANKING -> { + } + } + } + + fun changeRankingSortType(newSort: RankingSortType) { + if (_uiState.value.rankingSortType == newSort) return + _uiState.update { it.copy(rankingSortType = newSort) } + loadRanking() + } + + fun loadNextPosts() { + val s = _uiState.value.postPageState + if (s.phase != CommunityPhase.Idle || s.isLastPage) return + + _uiState.update { + it.copy(postPageState = s.copy(phase = CommunityPhase.Paging)) + } + loadPosts(requestedPage = s.page + 1) + } + + fun fetchFirstPosts() { + _uiState.update { + it.copy( + postListState = UiState.Loading, + postPageState = it.postPageState.copy( + phase = CommunityPhase.Refreshing, + page = 0, + isLastPage = false + ) + ) + } + loadPosts(requestedPage = 0) + } + + private fun ensureDataForCurrentTab(force: Boolean = false) { + when (_uiState.value.selectedTab) { + CommunityTab.POSTS -> { + val need = force || _uiState.value.postListState !is UiState.Success + if (need) fetchFirstPosts() + } + + CommunityTab.RANKING -> { + val need = force || _uiState.value.rankingListState !is UiState.Success + if (need) loadRanking() + } + } + } + + private fun loadPosts(requestedPage: Int) { + val snapshot = _uiState.value + val page = snapshot.postPageState + if (page.phase != CommunityPhase.Refreshing && page.phase != CommunityPhase.Paging) return + + val category = snapshot.postCategory + val sort = snapshot.listSortType.toCategorySort() + + viewModelScope.launch { + runCatching { + getCommunityPostListUseCase( + category, + requestedPage, + sort + ) + }.onSuccess { fetched -> + val isLast = fetched.isEmpty() + + _uiState.update { cur -> + val currentList = (cur.postListState as? UiState.Success)?.data ?: emptyList() + val merged = if (requestedPage == 0) fetched else currentList + fetched + cur.copy( + postListState = UiState.Success(merged), + postPageState = cur.postPageState.copy( + phase = CommunityPhase.Idle, + page = requestedPage, + isLastPage = isLast + ) + ) + } + }.onFailure { e -> + _uiState.update { cur -> + cur.copy( + postListState = UiState.Failure( + UiError.Message( + e.message ?: "게시글 리스트를 불러오는데 오류가 발생했습니다." + ) + ), + postPageState = cur.postPageState.copy(phase = CommunityPhase.Idle), + toastMessage = "게시글 리스트를 불러오는데 오류가 발생했습니다." + ) + } + } + } + } + + fun updatePost(payload: CommunityPostModifyPayload) { + val currentState = uiState.value.postListState + if (currentState !is UiState.Success) return + + val updatedList = currentState.data.map { item -> + if (item.postId == payload.postId) { + item.copy( + title = payload.title, + body = payload.body, + totalLikes = payload.totalLikes, + commentCount = payload.commentCount + ) + } else item + } + + _uiState.update { it.copy(postListState = UiState.Success(updatedList)) } + } + + fun deletePost(postId: Long) { + val currentState = uiState.value.postListState + if (currentState !is UiState.Success) return + + val updatedList = currentState.data.filter { it.postId != postId } + + _uiState.update { + it.copy( + postListState = UiState.Success(updatedList), + toastMessage = "게시글이 삭제되었어요." + ) + } + } + + private fun loadRanking() { + _uiState.update { it.copy(rankingListState = UiState.Loading) } + val snapshot = _uiState.value + val sortType = snapshot.rankingSortType + + viewModelScope.launch { + runCatching { + getCommunityRankingListUseCase(sortType) + }.onSuccess { list -> + _uiState.update { cur -> + cur.copy(rankingListState = UiState.Success(list)) + } + }.onFailure { e -> + KusLog.e("CommunityViewModel", "loadRanking error", e) + _uiState.update { + it.copy( + rankingListState = UiState.Failure( + UiError.Message( + e.message ?: "랭킹 리스트를 불러오는데 오류가 발생했습니다." + ) + ), + toastMessage = "랭킹 리스트를 불러오는데 오류가 발생했습니다." + ) + } + } + } + } +} \ No newline at end of file diff --git a/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/comment/CommentComponent.kt b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/comment/CommentComponent.kt new file mode 100644 index 00000000..4fad5e36 --- /dev/null +++ b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/comment/CommentComponent.kt @@ -0,0 +1,462 @@ +package com.kus.feature.community.ui.comment + +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.layout.widthIn +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.DropdownMenu +import androidx.compose.material3.DropdownMenuItem +import androidx.compose.material3.HorizontalDivider +import androidx.compose.material3.Icon +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.painter.Painter +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.DpOffset +import androidx.compose.ui.unit.dp +import com.kus.designsystem.theme.KusTheme +import com.kus.designsystem.util.noRippleClickable +import com.kus.feature.community.ui.model.CommunityPostCommentUi +import io.kamel.image.KamelImage +import io.kamel.image.asyncPainterResource +import kustaurant.shared.core.designsystem.generated.resources.ic_chat +import kustaurant.shared.core.designsystem.generated.resources.ic_comment_reply +import kustaurant.shared.core.designsystem.generated.resources.ic_delete +import kustaurant.shared.core.designsystem.generated.resources.ic_dislike +import kustaurant.shared.core.designsystem.generated.resources.ic_like +import kustaurant.shared.core.designsystem.generated.resources.ic_more_vert +import kustaurant.shared.core.designsystem.generated.resources.ic_user_placeholder +import org.jetbrains.compose.resources.painterResource +import kustaurant.shared.core.designsystem.generated.resources.Res as CoreRes + + +@Composable +fun CommentTreeItem( + comment: CommunityPostCommentUi, + indentLevel: Int, + modifier: Modifier = Modifier, + onLike: (Long) -> Unit = {}, + onDislike: (Long) -> Unit = {}, + onDeleteComment: (Long) -> Unit = {}, + onReplyClick: (Long) -> Unit = {} +) { + Column(modifier = modifier.fillMaxWidth()) { + + if (indentLevel == 0) { + RootCommentCard( + comment = comment, + onLike = onLike, + onDislike = onDislike, + onDeleteComment = onDeleteComment, + onReplyClick = onReplyClick, + ) + } else { + ReplyCommentCard( + comment = comment, + onLike = onLike, + onDislike = onDislike, + onDeleteComment = onDeleteComment, + ) + } + + comment.repliesList.forEach { child -> + CommentTreeItem( + comment = child, + indentLevel = indentLevel + 1, + onLike = onLike, + onDislike = onDislike, + onDeleteComment = onDeleteComment, + onReplyClick = onReplyClick, + ) + } + + if (indentLevel == 0) { + HorizontalDivider( + thickness = 2.dp, + color = KusTheme.colors.c_E0E0E0, + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp) + .padding(top = 16.dp) + ) + } + } +} + +@Composable +private fun RootCommentCard( + comment: CommunityPostCommentUi, + onLike: (Long) -> Unit, + onDislike: (Long) -> Unit, + onDeleteComment: (Long) -> Unit, + onReplyClick: (Long) -> Unit, +) { + var moreExpanded by remember { mutableStateOf(false) } + + Column( + modifier = Modifier + .fillMaxWidth() + .padding(start = 16.dp) + .padding(vertical = 10.dp) + ) { + Row(verticalAlignment = Alignment.CenterVertically) { + CommentAvatar(url = comment.writerIconUrl) + + Spacer(Modifier.width(8.dp)) + + Text( + text = comment.nickname.orEmpty(), + style = KusTheme.typography.type13b, + color = KusTheme.colors.c_323232, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + modifier = Modifier.widthIn(min = 32.dp) + ) + + Spacer(Modifier.width(2.dp)) + + Text( + text = "|", + style = KusTheme.typography.type12r, + color = KusTheme.colors.c_E0E0E0 + ) + + Spacer(Modifier.width(8.dp)) + + Text( + text = comment.timeAgo, + style = KusTheme.typography.type12r, + color = KusTheme.colors.c_AAAAAA + ) + + Spacer(Modifier.weight(1f)) + + if(comment.isCommentMine) { + Box { + Box( + modifier = Modifier + .size(36.dp) + .padding(end = 10.dp) + .noRippleClickable { moreExpanded = true }, + contentAlignment = Alignment.Center + ) { + Icon( + painter = painterResource(CoreRes.drawable.ic_more_vert), + contentDescription = "대댓글 더보기 아이콘입니다.", + tint = KusTheme.colors.c_E0E0E0, + ) + } + + DropdownMenu( + expanded = moreExpanded, + onDismissRequest = { moreExpanded = false }, + shape = RoundedCornerShape(10.dp), + containerColor = KusTheme.colors.c_E0E0E0, + offset = DpOffset(x = (-120 + 20).dp, y = (-6).dp), + modifier = Modifier.width(120.dp) + ) { + DropdownMenuItem( + modifier = Modifier.height(32.dp), + text = { + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically + ) { + Text( + "삭제하기", + style = KusTheme.typography.type14r, + color = KusTheme.colors.c_666666 + ) + + Icon( + painter = painterResource(CoreRes.drawable.ic_delete), + contentDescription = "삭제하기 아이콘입니다." + ) + } + }, + onClick = { + moreExpanded = false + onDeleteComment(comment.commentId) + } + ) + } + } + } + } + + Spacer(Modifier.height(4.dp)) + + Text( + text = if (comment.isDeleted) "삭제된 댓글입니다." else comment.body, + style = KusTheme.typography.type14r, + color = KusTheme.colors.c_323232, + modifier = Modifier.padding(end = 16.dp, bottom = 8.dp) + ) + + Spacer(Modifier.height(10.dp)) + + ReactionRow( + likeCount = comment.likeCount, + dislikeCount = comment.dislikeCount, + onLike = { onLike(comment.commentId) }, + onDislike = { onDislike(comment.commentId) }, + selectedReaction = comment.reactionType, + showReplyAction = true, + onReplyClick = { onReplyClick(comment.commentId) } + ) + } +} + +@Composable +private fun ReplyCommentCard( + comment: CommunityPostCommentUi, + onLike: (Long) -> Unit, + onDislike: (Long) -> Unit, + onDeleteComment: (Long) -> Unit, +) { + var moreExpanded by remember { mutableStateOf(false) } + + Row( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 20.dp, vertical = 8.dp) + ) { + Image( + painter = painterResource(CoreRes.drawable.ic_comment_reply), + contentDescription = "대댓글 아이콘입니다.", + ) + + Spacer(modifier = Modifier.width(6.dp)) + + Box(modifier = Modifier.weight(1f)) { + Surface( + shape = RoundedCornerShape(10.dp), + color = KusTheme.colors.c_EAEAEA, + modifier = Modifier.fillMaxWidth() + ) { + Column( + modifier = Modifier + .fillMaxSize() + .padding(vertical = 10.dp, horizontal = 12.dp) + ) { + Row(verticalAlignment = Alignment.CenterVertically) { + CommentAvatar(url = comment.writerIconUrl) + + Spacer(Modifier.width(8.dp)) + + Text( + text = comment.nickname.orEmpty(), + style = KusTheme.typography.type13b, + color = KusTheme.colors.c_323232, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + modifier = Modifier.widthIn(min = 32.dp) + ) + + Spacer(Modifier.width(2.dp)) + + Text( + text = "|", + style = KusTheme.typography.type12r, + color = KusTheme.colors.c_E0E0E0 + ) + + Spacer(Modifier.width(8.dp)) + + Text( + text = comment.timeAgo, + style = KusTheme.typography.type12r, + color = KusTheme.colors.c_AAAAAA + ) + } + + Spacer(Modifier.height(8.dp)) + + Text( + text = comment.body, + style = KusTheme.typography.type13r, + color = KusTheme.colors.c_666666 + ) + + Spacer(Modifier.height(10.dp)) + + ReactionRow( + likeCount = comment.likeCount, + dislikeCount = comment.dislikeCount, + onLike = { onLike(comment.commentId) }, + onDislike = { onDislike(comment.commentId) }, + selectedReaction = comment.reactionType, + ) + } + } + + if(comment.isCommentMine) { + Box(modifier = Modifier.align(Alignment.TopEnd).padding(top = 2.dp, end = 4.dp)) { + Box( + modifier = Modifier + .size(36.dp) + .noRippleClickable { moreExpanded = true }, + contentAlignment = Alignment.Center + ) { + Icon( + painter = painterResource(CoreRes.drawable.ic_more_vert), + contentDescription = "대댓글 더보기 아이콘입니다.", + tint = KusTheme.colors.c_E0E0E0, + ) + } + + DropdownMenu( + + expanded = moreExpanded, + onDismissRequest = { moreExpanded = false }, + shape = RoundedCornerShape(10.dp), + containerColor = KusTheme.colors.c_E0E0E0, + offset = DpOffset(x = (-120 + 22).dp, y = (-6).dp), + modifier = Modifier.width(120.dp) + ) { + DropdownMenuItem( + modifier = Modifier.height(32.dp), + text = { + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically + ) { + Text( + "삭제하기", + style = KusTheme.typography.type14r, + color = KusTheme.colors.c_666666 + ) + Icon( + painter = painterResource(CoreRes.drawable.ic_delete), + contentDescription = "삭제하기 아이콘입니다." + ) + } + }, + onClick = { + moreExpanded = false + onDeleteComment(comment.commentId) + } + ) + } + } + } + } + } + + Spacer(Modifier.height(8.dp)) +} + +@Composable +private fun CommentAvatar( + url: String?, + size: Dp = 25.dp +) { + if (!url.isNullOrBlank()) { + KamelImage( + resource = asyncPainterResource(url), + contentDescription = "사용자 아이콘입니다.", + modifier = Modifier + .size(size) + .clip(RoundedCornerShape(100.dp)) + ) + } else { + Image( + painter = painterResource(CoreRes.drawable.ic_user_placeholder), + contentDescription = "사용자 기본 아이콘입니다.", + modifier = Modifier + .size(size) + .clip(RoundedCornerShape(100.dp)) + ) + } +} + +@Composable +private fun ReactionRow( + likeCount: Int, + dislikeCount: Int, + onLike: () -> Unit, + onDislike: () -> Unit, + selectedReaction: String?, + showReplyAction: Boolean = false, + onReplyClick: () -> Unit = {}, +) { + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(12.dp) + ) { + ReactionIconWithCount( + painter = painterResource(CoreRes.drawable.ic_like), + count = likeCount, + selected = selectedReaction == "LIKE", + onClick = onLike, + activeColor = KusTheme.colors.c_43AB38 + ) + ReactionIconWithCount( + painter = painterResource(CoreRes.drawable.ic_dislike), + count = dislikeCount, + selected = selectedReaction == "DISLIKE", + onClick = onDislike, + activeColor = KusTheme.colors.c_FF0000 + ) + + if (showReplyAction) { + Image( + painter = painterResource(CoreRes.drawable.ic_chat), + contentDescription = "대댓글 작성 아이콘입니다.", + modifier = Modifier.noRippleClickable { onReplyClick() } + ) + } + } +} + +@Composable +private fun ReactionIconWithCount( + painter: Painter, + count: Int, + selected: Boolean, + onClick: () -> Unit, + activeColor : Color, +) { + val tint = if (selected) activeColor else KusTheme.colors.c_AAAAAA + val textColor = if (selected) activeColor else KusTheme.colors.c_AAAAAA + + Row( + modifier = Modifier.noRippleClickable { onClick() }, + verticalAlignment = Alignment.CenterVertically + ) { + Icon( + painter = painter, + contentDescription = "아이콘 입니다.", + tint = tint, + modifier = Modifier.size(16.dp) + ) + Spacer(Modifier.width(4.dp)) + Text( + text = count.toString(), + style = KusTheme.typography.type12r, + color = textColor + ) + } +} \ No newline at end of file diff --git a/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/detail/CommunityDetailScreen.kt b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/detail/CommunityDetailScreen.kt new file mode 100644 index 00000000..f1387f53 --- /dev/null +++ b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/detail/CommunityDetailScreen.kt @@ -0,0 +1,346 @@ +package com.kus.feature.community.ui.detail + +import androidx.compose.foundation.background +import androidx.compose.foundation.gestures.awaitEachGesture +import androidx.compose.foundation.gestures.awaitFirstDown +import androidx.compose.foundation.gestures.waitForUpOrCancellation +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.imePadding +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.DropdownMenu +import androidx.compose.material3.DropdownMenuItem +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.ExperimentalComposeUiApi +import androidx.compose.ui.Modifier +import androidx.compose.ui.backhandler.BackHandler +import androidx.compose.ui.input.pointer.PointerEventPass +import androidx.compose.ui.input.pointer.pointerInput +import androidx.compose.ui.platform.LocalFocusManager +import androidx.compose.ui.platform.LocalSoftwareKeyboardController +import androidx.compose.ui.unit.DpOffset +import androidx.compose.ui.unit.dp +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.kus.core.serialization.KusJson +import com.kus.core.serialization.RouteCodec +import com.kus.designsystem.component.KusCommentInput +import com.kus.designsystem.component.KusReplyCommentOverlay +import com.kus.designsystem.component.ReplyConfirmDialog +import com.kus.designsystem.theme.KusTheme +import com.kus.designsystem.util.noRippleClickable +import com.kus.feature.community.model.DeleteCommunityEvent +import com.kus.feature.community.model.toModifyPayload +import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.launch +import kustaurant.shared.core.designsystem.generated.resources.Res as CoreRes +import kustaurant.shared.core.designsystem.generated.resources.ic_arrow_back +import kustaurant.shared.core.designsystem.generated.resources.ic_more_vert +import org.jetbrains.compose.resources.painterResource +import org.koin.compose.viewmodel.koinViewModel + +@OptIn(ExperimentalComposeUiApi::class) +@Composable +fun CommunityDetailScreen( + postId: Long, + onBackButtonClick: () -> Unit = {}, + onPostModifyClick: (String) -> Unit = {}, + onPostDeleted: () -> Unit = {}, + onShowMessage: (String) -> Unit, +) { + val viewModel: CommunityDetailViewModel = koinViewModel() + val uiState by viewModel.uiState.collectAsStateWithLifecycle() + + var showReplyConfirmDialog by rememberSaveable { mutableStateOf(false) } + var showReplyComposer by rememberSaveable { mutableStateOf(false) } + + var pendingReplyParentId by rememberSaveable { mutableStateOf(null) } + var replyText by rememberSaveable { mutableStateOf("") } + + var commentText by rememberSaveable { mutableStateOf("") } + val isMine = uiState.post?.isPostMine == true + var moreExpanded by rememberSaveable { mutableStateOf(false) } + + val focusManager = LocalFocusManager.current + val keyboardController = LocalSoftwareKeyboardController.current + val scope = rememberCoroutineScope() + + val scrollState = rememberScrollState() + + BackHandler { onBackButtonClick() } + + LaunchedEffect(postId) { + viewModel.loadDetail(postId) + } + + LaunchedEffect(uiState.toastMessage) { + uiState.toastMessage?.let { + onShowMessage(it) + viewModel.clearToast() + } + } + + LaunchedEffect(Unit) { + viewModel.events.collectLatest { event -> + when (event) { + is DeleteCommunityEvent.Deleted -> { onPostDeleted() } + is DeleteCommunityEvent.Error -> {} + } + } + } + + Box(modifier = Modifier.fillMaxSize()){ + Scaffold( + topBar = { + Box( + modifier = Modifier + .fillMaxWidth() + .background(KusTheme.colors.c_FFFFFF) + .height(64.dp) + .padding(horizontal = 16.dp) + ) { + IconButton( + onClick = onBackButtonClick, + modifier = Modifier.align(Alignment.CenterStart) + ) { + Icon( + painter = painterResource(CoreRes.drawable.ic_arrow_back), + contentDescription = null + ) + } + + uiState.post?.category?.displayName?.let { + Text( + text = it, + style = KusTheme.typography.type17sb, + color = KusTheme.colors.c_323232, + modifier = Modifier.align(Alignment.Center) + ) + } + + if (isMine) { + Box(modifier = Modifier.align(Alignment.CenterEnd)) { + IconButton(onClick = { + focusManager.clearFocus(force = true) + scope.launch { + delay(16) + keyboardController?.hide() + moreExpanded = true + } + }) { + Icon( + painter = painterResource(CoreRes.drawable.ic_more_vert), + contentDescription = null, + tint = KusTheme.colors.c_AAAAAA + ) + } + + DropdownMenu( + expanded = moreExpanded, + onDismissRequest = { moreExpanded = false }, + shape = RoundedCornerShape(10.dp), + containerColor = KusTheme.colors.c_E0E0E0, + offset = DpOffset(x = (-40).dp, y = 0.dp), + modifier = Modifier.width(80.dp) + ) { + DropdownMenuItem( + modifier = Modifier.height(32.dp), + text = { + Box( + modifier = + Modifier + .fillMaxWidth(), + contentAlignment = Alignment.Center + ) { + Text( + text = "수정하기", + style = KusTheme.typography.type14r, + color = KusTheme.colors.c_666666 + ) + } + }, + onClick = { + moreExpanded = false + val post = uiState.post ?: return@DropdownMenuItem + val json = KusJson.json.encodeToString(post.toModifyPayload()) + val encoded = RouteCodec.encode(json) + onPostModifyClick(encoded) + } + ) + DropdownMenuItem( + modifier = Modifier.height(32.dp), + text = { + Box( + modifier = + Modifier + .fillMaxWidth(), + contentAlignment = Alignment.Center + ) { + Text( + text = "삭제하기", + style = KusTheme.typography.type14r, + color = KusTheme.colors.c_666666 + ) + } + }, + onClick = { + moreExpanded = false + viewModel.deletePost(postId) + } + ) + } + } + } + } + }, + contentWindowInsets = WindowInsets(0.dp, 0.dp, 0.dp, 0.dp), + ) { inner -> + Column( + modifier = Modifier + .fillMaxSize() + .background(KusTheme.colors.c_FFFFFF) + .padding(inner) + .pointerInput(Unit) { + awaitEachGesture { + awaitFirstDown(pass = PointerEventPass.Final) + val up = waitForUpOrCancellation(pass = PointerEventPass.Final) + if (up != null) { + focusManager.clearFocus(force = true) + keyboardController?.hide() + } + } + } + ) { + Box( + modifier = Modifier + .weight(1f) + .background(KusTheme.colors.c_FFFFFF) + ) { + when (uiState.phase) { + CommunityDetailPhase.Idle, CommunityDetailPhase.Loading -> { + Box(Modifier.fillMaxSize(), contentAlignment = Alignment.Center) { + CircularProgressIndicator(color = KusTheme.colors.c_43AB38) + } + } + + CommunityDetailPhase.Failure -> { + Column( + modifier = Modifier + .fillMaxSize() + .padding(16.dp), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center + ) { + Text( + text = "불러오기에 실패했어요.\n 다시 시도해주세요.", + style = KusTheme.typography.type14r, + color = KusTheme.colors.c_666666 + ) + Spacer(Modifier.height(12.dp)) + Text( + text = "다시 시도", + color = KusTheme.colors.c_43AB38, + modifier = Modifier.noRippleClickable { + viewModel.loadDetail(postId) + } + ) + } + } + + CommunityDetailPhase.Success -> { + uiState.post?.let { post -> + CommunityDetailSuccessContent( + post = post, + onPostLikeReactClick = { viewModel.togglePostLike() }, + onScrapClick = { viewModel.toggleScrap() }, + onReplyClick = { parentId -> + pendingReplyParentId = parentId + showReplyConfirmDialog = true + }, + onDeleteComment = { commentId -> + viewModel.deleteComment(commentId) + }, + onCommentReact = { commentId, action -> + viewModel.reactComment(commentId, action) + }, + scrollState = scrollState, + ) + } + } + } + } + + ReplyConfirmDialog( + visible = showReplyConfirmDialog, + content = "대댓글을 작성하시겠습니까?", + onConfirm = { + showReplyConfirmDialog = false + showReplyComposer = true + }, + onDismiss = { + showReplyConfirmDialog = false + pendingReplyParentId = null + } + ) + + Box( + modifier = Modifier + .fillMaxWidth() + .imePadding() + ) { + KusCommentInput( + value = commentText, + onValueChange = { commentText = it }, + placeholder = "댓글을 입력하세요", + enabled = uiState.phase == CommunityDetailPhase.Success, + onSend = { + viewModel.createCommentOrReply(commentText, null) + commentText ="" + }, + modifier = Modifier.padding(horizontal = 16.dp, vertical = 6.dp) + ) + } + } + } + + KusReplyCommentOverlay( + visible = showReplyComposer, + value = replyText, + onValueChange = { replyText = it }, + enabled = uiState.phase == CommunityDetailPhase.Success, + onSend = { text -> + val parentId = pendingReplyParentId ?: return@KusReplyCommentOverlay + viewModel.createCommentOrReply(text, parentId) + replyText = "" + pendingReplyParentId = null + showReplyComposer = false + }, + onDismiss = { + showReplyComposer = false + replyText = "" + pendingReplyParentId = null + } + ) + } +} diff --git a/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/detail/CommunityDetailSuccessContent.kt b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/detail/CommunityDetailSuccessContent.kt new file mode 100644 index 00000000..1b9ec2c9 --- /dev/null +++ b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/detail/CommunityDetailSuccessContent.kt @@ -0,0 +1,207 @@ +package com.kus.feature.community.ui.detail + +import androidx.compose.foundation.Image +import androidx.compose.foundation.ScrollState +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.layout.widthIn +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.HorizontalDivider +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import com.kus.designsystem.component.KusButton +import com.kus.designsystem.theme.KusTheme +import com.kus.feature.community.model.ReactionAction +import com.kus.feature.community.ui.comment.CommentTreeItem +import com.kus.feature.community.ui.model.CommunityPostUi +import io.kamel.image.KamelImage +import io.kamel.image.asyncPainterResource +import kustaurant.shared.core.designsystem.generated.resources.ic_like +import kustaurant.shared.core.designsystem.generated.resources.ic_scrap +import kustaurant.shared.core.designsystem.generated.resources.ic_user_placeholder +import org.jetbrains.compose.resources.painterResource +import kustaurant.shared.core.designsystem.generated.resources.Res as CoreRes + +@Composable +fun CommunityDetailSuccessContent( + post: CommunityPostUi, + scrollState: ScrollState, + modifier: Modifier = Modifier, + onPostLikeReactClick: () -> Unit = {}, + onCommentReact: (Long, ReactionAction) -> Unit = { _, _ -> }, + onScrapClick: () -> Unit = {}, + onReplyClick: (Long) -> Unit = {}, + onDeleteComment: (Long) -> Unit = {} +) { + val comments = post.comments.orEmpty() + + Column( + modifier = modifier + .fillMaxSize() + .verticalScroll(scrollState) + .background(KusTheme.colors.c_FFFFFF) + ) { + DetailAuthorHeader(post = post) + Spacer(Modifier.height(10.dp)) + Text( + text = post.title, + style = KusTheme.typography.type18b, + color = KusTheme.colors.c_323232, + modifier = Modifier.padding(horizontal = 16.dp) + ) + Spacer(Modifier.height(12.dp)) + HtmlBodyView( + html = post.body, + modifier = Modifier.padding(horizontal = 16.dp) + ) + Spacer(Modifier.height(20.dp)) + DetailStatsRow( + post = post, + onLikeClick = { onPostLikeReactClick() }, + onScrapClick = { onScrapClick() } + ) + Spacer(Modifier.height(20.dp)) + HorizontalDivider(color = KusTheme.colors.c_EAEAEA, thickness = 8.dp) + Spacer(Modifier.height(8.dp)) + + comments.forEach { comment -> + CommentTreeItem( + comment = comment, + indentLevel = 0, + onReplyClick = onReplyClick, + onDeleteComment = onDeleteComment, + onLike = { id -> onCommentReact(id, ReactionAction.LIKE) }, + onDislike = { id -> onCommentReact(id, ReactionAction.DISLIKE) } + ) + } + + Spacer(Modifier.height(12.dp)) + } +} + +@Composable +private fun DetailAuthorHeader(post: CommunityPostUi) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp, vertical = 12.dp), + verticalAlignment = Alignment.CenterVertically + ) { + if (!post.writerIconUrl.isNullOrBlank()) { + KamelImage( + resource = asyncPainterResource(post.writerIconUrl), + contentDescription = "사용자 이미지입니다.", + modifier = Modifier.size(25.dp), + onFailure = { + Image( + painter = painterResource(CoreRes.drawable.ic_user_placeholder), + contentDescription = "기본 프로필 이미지 입니다.", + modifier = Modifier.size(25.dp) + ) + } + ) + } else { + Image( + painter = painterResource(CoreRes.drawable.ic_user_placeholder), + contentDescription = "기본 프로필 이미지 입니다.", + modifier = Modifier.size(25.dp) + ) + } + + Spacer(Modifier.width(4.dp)) + + Text( + text = post.nickname, + style = KusTheme.typography.type12r, + color = KusTheme.colors.c_666666, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + modifier = Modifier + .widthIn(min = 32.dp) + .weight(1f, fill = false) + ) + + Spacer(Modifier.width(4.dp)) + + Text( + text = "|", + style = KusTheme.typography.type12r, + color = KusTheme.colors.c_E0E0E0 + ) + + Spacer(Modifier.width(2.dp)) + + Text( + text = post.timeAgo ?: "", + style = KusTheme.typography.type12r, + color = KusTheme.colors.c_666666 + ) + } +} + +@Composable +private fun DetailStatsRow( + post: CommunityPostUi, + onLikeClick: () -> Unit, + onScrapClick: () -> Unit +) { + val isLiked = post.myReaction == "LIKE" + val likeTint = if (isLiked) KusTheme.colors.c_43AB38 else KusTheme.colors.c_AAAAAA + + Row( + modifier = Modifier.fillMaxWidth().padding(horizontal = 16.dp), + verticalAlignment = Alignment.CenterVertically, + ) { + Text( + text = "조회수 ${post.visitCount} 댓글 ${post.commentCount} 추천 ${post.likeOnlyCount}", + style = KusTheme.typography.type12r, + color = KusTheme.colors.c_323232, + ) + + Spacer(Modifier.weight(1f)) + + KusButton( + enabled = true, + buttonName = post.likeOnlyCount.toString(), + roundedCornerShape = RoundedCornerShape(100.dp), + textStyle = KusTheme.typography.type14r, + contentColor = likeTint, + containerColor = KusTheme.colors.c_FFFFFF, + borderColor = likeTint, + contentPadding = PaddingValues(vertical = 4.dp, horizontal = 16.dp), + leftIcon = painterResource(CoreRes.drawable.ic_like), + onClick = onLikeClick, + modifier = Modifier.size(width = 68.dp, height = 29.dp) + ) + + Spacer(modifier = Modifier.width(7.dp)) + + KusButton( + enabled = true, + buttonName = post.scrapCount.toString(), + roundedCornerShape = RoundedCornerShape(100.dp), + textStyle = KusTheme.typography.type14r, + contentColor = KusTheme.colors.c_AAAAAA, + containerColor = KusTheme.colors.c_FFFFFF, + borderColor = KusTheme.colors.c_AAAAAA, + contentPadding = PaddingValues(vertical = 4.dp, horizontal = 16.dp), + leftIcon = painterResource(CoreRes.drawable.ic_scrap), + onClick = onScrapClick, + modifier = Modifier.size(width = 68.dp, height = 29.dp) + ) + } +} diff --git a/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/detail/CommunityDetailUiState.kt b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/detail/CommunityDetailUiState.kt new file mode 100644 index 00000000..e16ab0b0 --- /dev/null +++ b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/detail/CommunityDetailUiState.kt @@ -0,0 +1,11 @@ +package com.kus.feature.community.ui.detail + +import com.kus.feature.community.ui.model.CommunityPostUi + +enum class CommunityDetailPhase { Idle, Loading, Success, Failure } + +data class CommunityDetailUiState( + val phase: CommunityDetailPhase = CommunityDetailPhase.Idle, + val post: CommunityPostUi? = null, + val toastMessage :String? = null, +) \ No newline at end of file diff --git a/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/detail/CommunityDetailViewModel.kt b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/detail/CommunityDetailViewModel.kt new file mode 100644 index 00000000..04e04bd1 --- /dev/null +++ b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/detail/CommunityDetailViewModel.kt @@ -0,0 +1,365 @@ +package com.kus.feature.community.ui.detail + +import GetSessionAvailabilityUseCase +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.kus.designsystem.util.stripHtml +import com.kus.domain.community.model.LikeEvent +import com.kus.domain.community.usecase.DeleteCommunityCommentUseCase +import com.kus.domain.community.usecase.DeleteCommunityPostUseCase +import com.kus.domain.community.usecase.GetCommunityPostDetailUseCase +import com.kus.domain.community.usecase.PostCommunityPostCommentReactUseCase +import com.kus.domain.community.usecase.PostCommunityPostCommentReplyUseCase +import com.kus.domain.community.usecase.PostCommunityPostDetailScrapUseCase +import com.kus.domain.community.usecase.PostPostLikeUseCase +import com.kus.feature.community.model.CommunityPostModifyPayload +import com.kus.feature.community.model.DeleteCommunityEvent +import com.kus.feature.community.model.ReactionAction +import com.kus.feature.community.ui.mapper.toUiModel +import com.kus.feature.community.ui.model.CommunityPostCommentUi +import kotlinx.coroutines.channels.BufferOverflow +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.SharedFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asSharedFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch + +class CommunityDetailViewModel( + private val getCommunityPostDetailUseCase: GetCommunityPostDetailUseCase, + private val postPostScrapUseCase: PostCommunityPostDetailScrapUseCase, + private val postPostLikeUseCase: PostPostLikeUseCase, + private val postCreateCommentReplyUseCase: PostCommunityPostCommentReplyUseCase, + private val postCommentReactUseCase: PostCommunityPostCommentReactUseCase, + private val deletePostUseCase: DeleteCommunityPostUseCase, + private val deleteCommentUseCase: DeleteCommunityCommentUseCase, + private val getSessionAvailabilityUseCase: GetSessionAvailabilityUseCase, +) : ViewModel() { + private val _events = MutableSharedFlow( + replay = 0, + extraBufferCapacity = 1, + onBufferOverflow = BufferOverflow.DROP_OLDEST + ) + val events: SharedFlow = _events.asSharedFlow() + + private val _uiState = MutableStateFlow(CommunityDetailUiState()) + val uiState: StateFlow = _uiState.asStateFlow() + + private var currentPostId: Long? = null + + fun loadDetail(postId: Long) { + if (currentPostId == postId && _uiState.value.phase == CommunityDetailPhase.Success) return + currentPostId = postId + + viewModelScope.launch { + fetchDetail(postId) + } + } + + private fun fetchDetail(postId: Long) { + viewModelScope.launch { + _uiState.update { it.copy(phase = CommunityDetailPhase.Loading) } + + val isLoggedIn = getSessionAvailabilityUseCase() + runCatching { + getCommunityPostDetailUseCase(postId, isLoggedIn) + }.onSuccess { post -> + _uiState.update { + it.copy(phase = CommunityDetailPhase.Success, post = post.toUiModel()) + } + }.onFailure { + _uiState.update { it.copy(phase = CommunityDetailPhase.Failure) } + } + } + } + + fun applyEditResult(payload: CommunityPostModifyPayload) { + _uiState.update { state -> + val currentPost = state.post ?: return@update state + + if (currentPost.postId != payload.postId) { + return@update state + } + + state.copy( + post = currentPost.copy( + category = payload.category, + title = payload.title, + body = payload.body + ) + ) + } + } + + fun toggleScrap() { + viewModelScope.launch { + val current = _uiState.value.post ?: return@launch + val postId = current.postId + + val nextScrap = !current.isScrapped + + runCatching { postPostScrapUseCase(postId, nextScrap) } + .onSuccess { info -> + _uiState.update { state -> + val post = state.post ?: return@update state + state.copy( + post = post.copy( + isScrapped = info.isScrapped, + scrapCount = info.postScrapCount.toLong() + ) + ) + } + } + .onFailure { + } + } + } + + fun togglePostLike() { + viewModelScope.launch { + val current = _uiState.value.post ?: return@launch + val postId = current.postId + + val currentReaction = current.myReaction + val next: LikeEvent? = when (currentReaction) { + "LIKE" -> null + "DISLIKE" -> LikeEvent.LIKE + else -> LikeEvent.LIKE + } + + runCatching { postPostLikeUseCase(postId, next) } + .onSuccess { info -> + _uiState.update { state -> + val post = state.post ?: return@update state + state.copy( + post = post.copy( + myReaction = info.reactionType, + likeOnlyCount = info.likeCount.toLong(), + ) + ) + } + } + .onFailure { + } + } + } + + fun createCommentOrReply( + content: String, + parentCommentId: Long?, + ) { + viewModelScope.launch { + val currentPost = _uiState.value.post ?: return@launch + val postId = currentPost.postId + + runCatching { postCreateCommentReplyUseCase(content, postId, parentCommentId) } + .onSuccess { created -> + val createdUi = created.toUiModel() // 변환 + _uiState.update { state -> + val post = state.post ?: return@update state + val currentComments = post.comments.orEmpty() + + val newComments = + if (createdUi.parentCommentId == null) { + listOf(createdUi) + currentComments + } else { + val parentId = createdUi.parentCommentId + val (updated, inserted) = insertReply( + list = currentComments, + parentId = parentId, + child = createdUi + ) + if (inserted) updated else listOf(createdUi) + currentComments + } + + state.copy( + post = post.copy( + comments = newComments, + commentCount = post.commentCount + 1 + ) + ) + } + } + .onFailure { } + } + } + + private fun insertReply( + list: List, + parentId: Long, + child: CommunityPostCommentUi, + ): Pair, Boolean> { + var inserted = false + val updated = list.map { c -> + when { + c.commentId == parentId -> { + inserted = true + c.copy(repliesList = listOf(child) + c.repliesList) + } + + else -> { + val (newReplies, did) = insertReply(c.repliesList, parentId, child) + if (did) { + inserted = true + c.copy(repliesList = newReplies) + } else c + } + } + } + return updated to inserted + } + + fun reactComment(commentId: Long, action: ReactionAction) { + viewModelScope.launch { + val post = _uiState.value.post ?: return@launch + val comments = post.comments.orEmpty() + val currentReaction = findCommentById(comments, commentId)?.reactionType + + val likeEvent: LikeEvent? = when (action) { + ReactionAction.LIKE -> + if (currentReaction == "LIKE") null else LikeEvent.LIKE + + ReactionAction.DISLIKE -> + if (currentReaction == "DISLIKE") null else LikeEvent.DISLIKE + } + + runCatching { postCommentReactUseCase(commentId, likeEvent) } + .onSuccess { resp -> + _uiState.update { state -> + val p = state.post ?: return@update state + val cur = p.comments.orEmpty() + val updated = cur.map { + updateCommentTree( + comment = it, + targetId = commentId, + likeCount = resp.likeCount, + dislikeCount = resp.dislikeCount, + reactionType = resp.reactionType + ) + } + state.copy(post = p.copy(comments = updated)) + } + } + } + } + + private fun findCommentById( + comments: List, + targetId: Long, + ): CommunityPostCommentUi? { + comments.forEach { c -> + if (c.commentId == targetId) return c + findCommentById(c.repliesList, targetId)?.let { return it } + } + return null + } + + private fun updateCommentTree( + comment: CommunityPostCommentUi, + targetId: Long, + likeCount: Int, + dislikeCount: Int, + reactionType: String?, + ): CommunityPostCommentUi { + if (comment.commentId == targetId) { + return comment.copy( + likeCount = likeCount, + dislikeCount = dislikeCount, + reactionType = reactionType + ) + } + if (comment.repliesList.isEmpty()) return comment + val updatedReplies = comment.repliesList.map { + updateCommentTree(it, targetId, likeCount, dislikeCount, reactionType) + } + return comment.copy(repliesList = updatedReplies) + } + + fun clearToast() { + _uiState.update { it.copy(toastMessage = null) } + } + + fun deletePost(postId: Long) { + viewModelScope.launch { + runCatching { deletePostUseCase(postId) } + .onSuccess { + _uiState.update { + it.copy( + toastMessage = "게시글이 삭제되었어요." + ) + } + _events.tryEmit(DeleteCommunityEvent.Deleted) + } + .onFailure { e -> + _uiState.update { + it.copy( + toastMessage = "게시글 삭제에 실패했어요." + ) + } + _events.tryEmit(DeleteCommunityEvent.Error(e.message ?: "삭제에 실패했어요.")) + } + } + } + + fun deleteComment(commentId: Long) { + viewModelScope.launch { + runCatching { deleteCommentUseCase(commentId) } + .onSuccess { + _uiState.update { state -> + val post = state.post ?: return@update state + val comments = post.comments.orEmpty() + val updatedComments = removeOrMarkComment(comments, commentId) + state.copy( + post = post.copy( + comments = updatedComments, + commentCount = post.commentCount - 1 + ) + ) + } + } + .onFailure { } + } + } + + private fun removeOrMarkComment( + comments: List, + targetId: Long, + ): List { + return comments.mapNotNull { comment -> + when { + comment.commentId == targetId && comment.repliesList.isEmpty() -> null + + comment.commentId == targetId && comment.repliesList.isNotEmpty() -> { + comment.copy( + body = "삭제된 댓글입니다.", + isCommentMine = false, + isDeleted = true, + ) + } + + else -> { + val updatedReplies = comment.repliesList.filter { it.commentId != targetId } + if (comment.isDeleted && updatedReplies.isEmpty()) { + null + } else { + comment.copy(repliesList = updatedReplies) + } + } + } + } + } + + fun currentPayload(): CommunityPostModifyPayload? { + val post = uiState.value.post ?: return null + return CommunityPostModifyPayload( + postId = post.postId, + title = post.title, + body = post.body.stripHtml(), + totalLikes = post.likeOnlyCount, + commentCount = post.commentCount, + category = post.category, + ) + } +} \ No newline at end of file diff --git a/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/detail/HtmlBodyView.kt b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/detail/HtmlBodyView.kt new file mode 100644 index 00000000..96ef7180 --- /dev/null +++ b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/detail/HtmlBodyView.kt @@ -0,0 +1,11 @@ +package com.kus.feature.community.ui.detail + +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier + + +@Composable +expect fun HtmlBodyView( + html: String, + modifier: Modifier = Modifier +) diff --git a/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/floatingButton/WriteFab.kt b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/floatingButton/WriteFab.kt new file mode 100644 index 00000000..1e1c77dc --- /dev/null +++ b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/floatingButton/WriteFab.kt @@ -0,0 +1,41 @@ +package com.kus.feature.community.ui.floatingButton + +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.unit.dp +import com.kus.designsystem.theme.KusTheme +import kustaurant.shared.core.designsystem.generated.resources.ic_pencil +import org.jetbrains.compose.resources.painterResource +import kustaurant.shared.core.designsystem.generated.resources.Res as CoreRes + +@Composable +fun WriteFab(onClick: () -> Unit) { + Surface( + onClick = onClick, + shape = RoundedCornerShape(999.dp), + color = KusTheme.colors.c_43AB38, + shadowElevation = 6.dp + ) { + Row( + modifier = Modifier.padding(horizontal = 22.dp, vertical = 12.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Text("글쓰기", color = Color.White, style = KusTheme.typography.type15sb) + Spacer(Modifier.width(6.dp)) + Image( + painter = painterResource(CoreRes.drawable.ic_pencil), + contentDescription = "글 쓰기 아이콘입니다." + ) + } + } +} \ No newline at end of file diff --git a/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/list/CommunityListContent.kt b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/list/CommunityListContent.kt new file mode 100644 index 00000000..f3b51417 --- /dev/null +++ b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/list/CommunityListContent.kt @@ -0,0 +1,191 @@ +package com.kus.feature.community.ui.list + +import UiState +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.itemsIndexed +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.HorizontalDivider +import androidx.compose.material3.Text +import androidx.compose.material3.pulltorefresh.PullToRefreshBox +import androidx.compose.material3.pulltorefresh.PullToRefreshDefaults +import androidx.compose.material3.pulltorefresh.rememberPullToRefreshState +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import androidx.compose.ui.zIndex +import com.kus.designsystem.theme.KusTheme +import com.kus.designsystem.util.noRippleClickable +import com.kus.domain.community.model.ListSortType +import com.kus.domain.community.model.PostCategory +import com.kus.feature.community.ui.CommunityBoards +import com.kus.feature.community.ui.CommunityPhase +import com.kus.feature.community.ui.CommunityUiState + +@Composable +fun CommunityListContent( + uiState: CommunityUiState, + boardExpanded: Boolean, + onBoardExpandedChange: (Boolean) -> Unit, + onPostClick: (Long) -> Unit, + onBoardSelect: (PostCategory) -> Unit, + onSortChange: (ListSortType) -> Unit, + onLoadNext: () -> Unit = {}, + onRefresh: () -> Unit = {}, + modifier: Modifier = Modifier +) { + val pullState = rememberPullToRefreshState() + + val isInitialLoading = + (uiState.postListState is UiState.Loading || uiState.postListState is UiState.Idle) && + uiState.postPageState.phase != CommunityPhase.Paging + + val isPullRefreshing = uiState.postPageState.phase == CommunityPhase.Refreshing + + val isRefreshingForIndicator = isPullRefreshing || isInitialLoading + + Box(modifier = Modifier.fillMaxSize()) { + + Column(modifier = Modifier.fillMaxSize()) { + CommunityListFilterBar( + selectedBoard = uiState.postCategory, + onBoardClick = { onBoardExpandedChange(true) }, + boardExpanded = boardExpanded, + boards = CommunityBoards.list, + onBoardSelect = { selected -> + onBoardExpandedChange(false) + onBoardSelect(selected) + onRefresh() + }, + onBoardDismiss = { onBoardExpandedChange(false) }, + sortType = uiState.listSortType, + onSortChange = { sort -> + onSortChange(sort) + onRefresh() + } + ) + + PullToRefreshBox( + state = pullState, + isRefreshing = isPullRefreshing, + onRefresh = onRefresh, + modifier = Modifier.fillMaxSize(), + indicator = {} + ) { + LazyColumn( + modifier = modifier + .fillMaxSize() + .background(KusTheme.colors.c_FFFFFF), + ) { + item { + HorizontalDivider( + thickness = 1.dp, + color = KusTheme.colors.c_E0E0E0, + ) + } + + when (val state = uiState.postListState) { + is UiState.Loading, UiState.Idle -> { + item { Spacer(Modifier.height(12.dp)) } + } + + is UiState.Failure -> { + item { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(16.dp), + horizontalAlignment = Alignment.CenterHorizontally + ) { + Text( + text = "게시글을 불러오지 못했어요.", + style = KusTheme.typography.type14r, + color = KusTheme.colors.c_666666 + ) + Spacer(Modifier.height(10.dp)) + Text( + text = "다시 시도", + color = KusTheme.colors.c_43AB38, + modifier = Modifier + .padding(8.dp) + .noRippleClickable { onRefresh() } + ) + } + } + } + + is UiState.Success -> { + val list = state.data + + if (list.isEmpty()) { + item { + Box( + modifier = Modifier + .fillMaxWidth() + .padding(vertical = 40.dp), + contentAlignment = Alignment.Center + ) { + Text( + text = "게시글의 첫 번째 주인공이 되어주세요.", + style = KusTheme.typography.type14r, + color = KusTheme.colors.c_666666 + ) + } + } + } else { + itemsIndexed( + items = list, + key = { _, item -> item.postId } + ) { index, item -> + CommunityListRow( + item = item, + modifier = Modifier.noRippleClickable { onPostClick(item.postId) } + ) + + val shouldLoadNext = index >= list.lastIndex - 3 + LaunchedEffect(shouldLoadNext) { + if (shouldLoadNext && uiState.postPageState.phase == CommunityPhase.Idle) { + onLoadNext() + } + } + } + + if (uiState.postPageState.phase == CommunityPhase.Paging) { + item { + Box( + modifier = Modifier + .fillMaxWidth() + .padding(vertical = 18.dp), + contentAlignment = Alignment.Center + ) { + CircularProgressIndicator(color = KusTheme.colors.c_43AB38) + } + } + } + } + } + } + } + } + } + + PullToRefreshDefaults.Indicator( + state = pullState, + isRefreshing = isRefreshingForIndicator, + containerColor = KusTheme.colors.c_FFFFFF, + color = KusTheme.colors.c_43AB38, + modifier = Modifier + .align(Alignment.TopCenter) + .zIndex(1f) + ) + } +} \ No newline at end of file diff --git a/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/list/CommunityListFilterBar.kt b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/list/CommunityListFilterBar.kt new file mode 100644 index 00000000..ff79a33f --- /dev/null +++ b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/list/CommunityListFilterBar.kt @@ -0,0 +1,149 @@ +package com.kus.feature.community.ui.list + +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.IntrinsicSize +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.layout.wrapContentWidth +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.HorizontalDivider +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableIntStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.shadow +import androidx.compose.ui.layout.onSizeChanged +import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.unit.IntOffset +import androidx.compose.ui.unit.dp +import androidx.compose.ui.window.Popup +import com.kus.designsystem.component.KusChip +import com.kus.designsystem.theme.KusTheme +import com.kus.designsystem.util.noRippleClickable +import com.kus.domain.community.model.ListSortType +import com.kus.domain.community.model.PostCategory +import kustaurant.shared.feature.community.generated.resources.Res +import kustaurant.shared.feature.community.generated.resources.ic_drop_down +import org.jetbrains.compose.resources.painterResource + +@Composable +fun CommunityListFilterBar( + selectedBoard: PostCategory, + onBoardClick: () -> Unit, + boardExpanded: Boolean, + boards: List, + onBoardSelect: (PostCategory) -> Unit, + onBoardDismiss: () -> Unit, + sortType: ListSortType, + onSortChange: (ListSortType) -> Unit, +) { + val density = LocalDensity.current + var anchorHeightPx by remember { mutableIntStateOf(0) } + val extraOffsetPx = with(density) { 18.dp.roundToPx() } + val orderedBoards = remember(selectedBoard, boards) { + listOf(selectedBoard) + boards.filter { it != selectedBoard } + } + + Column { + Row( + modifier = Modifier + .background(color = KusTheme.colors.c_FFFFFF) + .fillMaxWidth() + .padding(horizontal = 16.dp, vertical = 10.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Box { + Row( + modifier = Modifier + .noRippleClickable(onBoardClick) + .onSizeChanged { anchorHeightPx = it.height }, + verticalAlignment = Alignment.CenterVertically + ) { + Text( + text = selectedBoard.displayName, + style = KusTheme.typography.type14r, + color = KusTheme.colors.c_43AB38 + ) + Spacer(Modifier.width(4.dp)) + Image( + painter = painterResource(Res.drawable.ic_drop_down), + contentDescription = "드롭다운 메뉴 아이콘입니다.", + modifier = Modifier.size(width = 14.dp, height = 9.dp) + ) + } + + if (boardExpanded) { + Popup( + alignment = Alignment.TopStart, + offset = IntOffset(x = 0, y = -anchorHeightPx + extraOffsetPx), + onDismissRequest = onBoardDismiss + ) { + Box( + modifier = Modifier + .shadow(6.dp, RoundedCornerShape(10.dp)) + .background(KusTheme.colors.c_E0E0E0, RoundedCornerShape(10.dp)) + .wrapContentWidth() + .width(IntrinsicSize.Max) + ) { + Column(modifier = Modifier.wrapContentWidth()) { + orderedBoards.forEach { category -> + val isSelected = category == selectedBoard + + Text( + text = category.displayName, + color = if (isSelected) KusTheme.colors.c_AAAAAA else KusTheme.colors.c_666666, + modifier = Modifier + .wrapContentWidth() + .padding(horizontal = 16.dp, vertical = 10.dp) + .let { m -> + if (!isSelected) m.noRippleClickable { + onBoardSelect(category) + } else m + } + ) + } + } + } + } + } + } + + Spacer(Modifier.weight(1f)) + + Row(horizontalArrangement = Arrangement.spacedBy(6.dp)) { + KusChip( + chipName = "최신순", + isSelected = sortType == ListSortType.LATEST, + onClick = { onSortChange(ListSortType.LATEST) }, + modifier = Modifier.height(29.dp) + ) + + KusChip( + chipName = "인기순", + isSelected = sortType == ListSortType.POPULARITY, + onClick = { onSortChange(ListSortType.POPULARITY) }, + modifier = Modifier.height(29.dp) + ) + } + } + + HorizontalDivider( + thickness = 0.5.dp, + color = KusTheme.colors.c_E0E0E0, + modifier = Modifier.fillMaxWidth() + ) + } +} diff --git a/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/list/CommunityListRow.kt b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/list/CommunityListRow.kt new file mode 100644 index 00000000..4187885f --- /dev/null +++ b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/list/CommunityListRow.kt @@ -0,0 +1,175 @@ +package com.kus.feature.community.ui.list + +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.HorizontalDivider +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import com.kus.designsystem.theme.KusTheme +import com.kus.domain.community.model.CommunityPostListItem +import io.kamel.image.KamelImage +import io.kamel.image.asyncPainterResource +import kustaurant.shared.core.designsystem.generated.resources.Res as CoreRes +import kustaurant.shared.core.designsystem.generated.resources.ic_comment +import kustaurant.shared.core.designsystem.generated.resources.ic_like +import kustaurant.shared.core.designsystem.generated.resources.ic_user_placeholder +import org.jetbrains.compose.resources.painterResource + +@Composable +fun CommunityListRow( + item: CommunityPostListItem, + modifier: Modifier, +) { + Column( + modifier = modifier + .fillMaxWidth() + .padding(horizontal = 14.dp, vertical = 12.dp) + ) { + Surface( + shape = RoundedCornerShape(2.dp), + color = KusTheme.colors.c_EAEAEA + ) { + Text( + text = item.category, + modifier = Modifier.padding(horizontal = 8.dp, vertical = 4.dp), + style = KusTheme.typography.type11r, + color = KusTheme.colors.c_AAAAAA + ) + } + + Spacer(Modifier.height(8.dp)) + + Row { + Column(modifier = Modifier.weight(1f)) { + Text( + text = item.title, + style = KusTheme.typography.type15sb, + color = KusTheme.colors.c_323232, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + + Spacer(Modifier.height(6.dp)) + + Text( + text = item.body, + style = KusTheme.typography.type13r, + color = KusTheme.colors.c_323232, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + + Spacer(Modifier.height(10.dp)) + + Row(verticalAlignment = Alignment.CenterVertically) { + if (!item.writerIconUrl.isNullOrBlank()) { + KamelImage( + resource = asyncPainterResource(item.writerIconUrl!!), + contentDescription = "사용자의 프로필 이미지 입니다.", + modifier = Modifier + .size(16.dp), + onFailure = { + Image( + painter = painterResource(CoreRes.drawable.ic_user_placeholder), + contentDescription = "기본 프로필 이미지 입니다.", + modifier = Modifier.size(16.dp) + ) + }, + ) + } else { + Image( + painter = painterResource(CoreRes.drawable.ic_user_placeholder), + contentDescription = "기본 프로필 이미지 입니다.", + modifier = Modifier.size(16.dp) + ) + } + + + Spacer(Modifier.width(2.dp)) + + Text( + text = item.nickname, + style = KusTheme.typography.type12r, + color = KusTheme.colors.c_AAAAAA + ) + + Spacer(Modifier.width(8.dp)) + + Text( + text = "|", + color = KusTheme.colors.c_E0E0E0 + ) + + Spacer(Modifier.width(2.dp)) + + Text( + text = item.timeAgo, + style = KusTheme.typography.type12r, + color = KusTheme.colors.c_AAAAAA + ) + + Spacer(Modifier.width(12.dp)) + + Image( + painter = painterResource(CoreRes.drawable.ic_like), + contentDescription = null, + modifier = Modifier.size(14.dp) + ) + Spacer(Modifier.width(4.dp)) + Text( + text = item.totalLikes.toString(), + style = KusTheme.typography.type12r, + color = KusTheme.colors.c_43AB38 + ) + + Spacer(Modifier.width(10.dp)) + + Image( + painter = painterResource(CoreRes.drawable.ic_comment), + contentDescription = null, + modifier = Modifier.size(11.dp) + ) + Spacer(Modifier.width(4.dp)) + Text( + text = item.commentCount.toString(), + style = KusTheme.typography.type12r, + color = KusTheme.colors.c_AAAAAA + ) + } + } + + Spacer(Modifier.width(12.dp)) + + val thumbUrl = item.photoUrl + if (!thumbUrl.isNullOrBlank()) { + KamelImage( + resource = asyncPainterResource(thumbUrl), + contentDescription = "게시글 썸네일", + modifier = Modifier + .size(76.dp) + .clip(RoundedCornerShape(10.dp)) + ) + } + } + } + + HorizontalDivider( + thickness = 1.dp, + color = KusTheme.colors.c_E0E0E0, + modifier = Modifier.padding(horizontal = 14.dp) + ) +} diff --git a/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/mapper/CommunityUiMapper.kt b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/mapper/CommunityUiMapper.kt new file mode 100644 index 00000000..1c34d39a --- /dev/null +++ b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/mapper/CommunityUiMapper.kt @@ -0,0 +1,49 @@ +package com.kus.feature.community.ui.mapper + +import com.kus.domain.community.model.CommunityPost +import com.kus.domain.community.model.CommunityPostComment +import com.kus.feature.community.ui.model.CommunityPostCommentUi +import com.kus.feature.community.ui.model.CommunityPostUi + +fun CommunityPost.toUiModel(): CommunityPostUi = CommunityPostUi( + postId = postId, + category = category, + title = title, + body = body, + photoUrls = photoUrls, + writerId = writerId, + nickname = nickname, + evalCount = evalCount, + writerIconUrl = writerIconUrl, + timeAgo = timeAgo, + createdAt = createdAt, + updatedAt = updatedAt, + likeOnlyCount = likeOnlyCount, + dislikeOnlyCount = dislikeOnlyCount, + totalLikes = totalLikes, + commentCount = commentCount, + scrapCount = scrapCount, + visitCount = visitCount, + myReaction = myReaction, + isScrapped = isScrapped, + isPostMine = isPostMine, + comments = comments?.map { it.toUiModel() } +) + +fun CommunityPostComment.toUiModel(): CommunityPostCommentUi = CommunityPostCommentUi( + commentId = commentId, + parentCommentId = parentCommentId, + body = body, + status = status, + likeCount = likeCount, + dislikeCount = dislikeCount, + repliesList = repliesList.map { it.toUiModel() }, + timeAgo = timeAgo, + reactionType = reactionType, + isCommentMine = isCommentMine, + writerId = writerId, + nickname = nickname, + evalCount = evalCount, + writerIconUrl = writerIconUrl, + isDeleted = false, +) \ No newline at end of file diff --git a/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/model/CommunityPostCommentUi.kt b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/model/CommunityPostCommentUi.kt new file mode 100644 index 00000000..f2771d6d --- /dev/null +++ b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/model/CommunityPostCommentUi.kt @@ -0,0 +1,19 @@ +package com.kus.feature.community.ui.model + +data class CommunityPostCommentUi( + val commentId: Long, + val parentCommentId: Long? = null, + val body: String, + val status: String, + val likeCount: Int, + val dislikeCount: Int, + val repliesList: List = emptyList(), + val timeAgo: String, + val reactionType: String?, + val isCommentMine: Boolean, + val writerId: Long?, + val nickname: String?, + val evalCount: Long?, + val writerIconUrl: String?, + val isDeleted: Boolean = false, +) \ No newline at end of file diff --git a/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/model/CommunityPostUi.kt b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/model/CommunityPostUi.kt new file mode 100644 index 00000000..55cf1072 --- /dev/null +++ b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/model/CommunityPostUi.kt @@ -0,0 +1,33 @@ +package com.kus.feature.community.ui.model + +import com.kus.domain.community.model.PostCategory + +data class CommunityPostUi ( + val postId: Long, + val category: PostCategory, + val title: String, + val body: String, + val photoUrls: List?, + + val writerId: Long, + val nickname: String, + val evalCount: Long, + val writerIconUrl: String?, + + val timeAgo: String, + val createdAt: String, + val updatedAt: String?, + + val likeOnlyCount: Long, + val dislikeOnlyCount: Long, + val totalLikes: Long, + val commentCount: Long, + val scrapCount: Long, + val visitCount: Long, + + val myReaction: String?, + val isScrapped: Boolean, + val isPostMine: Boolean, + + val comments: List?, +) \ No newline at end of file diff --git a/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/ranking/CommunityRankingContent.kt b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/ranking/CommunityRankingContent.kt new file mode 100644 index 00000000..75c90c39 --- /dev/null +++ b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/ranking/CommunityRankingContent.kt @@ -0,0 +1,99 @@ +package com.kus.feature.community.ui.ranking + +import UiState +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.unit.dp +import com.kus.designsystem.theme.KusTheme +import com.kus.domain.community.model.RankingSortType +import com.kus.feature.community.ui.CommunityTab +import com.kus.feature.community.ui.CommunityUiState + +@Composable +fun RankingContent( + uiState: CommunityUiState, + onSortChange: (RankingSortType) -> Unit, + modifier: Modifier = Modifier, +) { + val sort = uiState.rankingSortType + + LaunchedEffect(uiState.selectedTab) { + if (uiState.selectedTab == CommunityTab.RANKING) { + val hasData = (uiState.rankingListState as? UiState.Success)?.data?.isNotEmpty() == true + if (!hasData) onSortChange(sort) + } + } + + Column( + modifier = modifier + .fillMaxSize() + .background(Color.White) + ) { + RankingHeader( + selectedSort = sort, + onSortChange = onSortChange, + ) + + Spacer(Modifier.height(10.dp)) + + when (val state = uiState.rankingListState) { + is UiState.Loading, UiState.Idle -> { + Box( + modifier = Modifier + .fillMaxWidth() + .padding(vertical = 28.dp), + contentAlignment = Alignment.Center + ) { + CircularProgressIndicator(color = KusTheme.colors.c_43AB38) + } + } + + is UiState.Failure -> { + Text( + text = "랭킹을 불러오지 못했어요.", + modifier = Modifier.padding(16.dp), + color = KusTheme.colors.c_666666, + style = KusTheme.typography.type14r + ) + } + + is UiState.Success -> { + val list = state.data.sortedBy { it.rank } + val top3 = list.filter { it.rank in 1..3 } + val rest = list.filter { it.rank >= 4 } + + Top3RankingSection(top3 = top3) + + Spacer(Modifier.height(12.dp)) + + LazyColumn( + modifier = Modifier + .fillMaxSize() + .background(Color.White), + ) { + items( + items = rest, + key = { it.userId }, + ) { item -> + RankingRow(item = item) + } + } + } + } + } +} \ No newline at end of file diff --git a/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/ranking/CommunityRankingTopCard.kt b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/ranking/CommunityRankingTopCard.kt new file mode 100644 index 00000000..9dcda38c --- /dev/null +++ b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/ranking/CommunityRankingTopCard.kt @@ -0,0 +1,218 @@ +package com.kus.feature.community.ui.ranking + +import androidx.compose.foundation.BorderStroke +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.offset +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.layout.widthIn +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.HorizontalDivider +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import androidx.compose.ui.zIndex +import com.kus.designsystem.theme.KusTheme +import com.kus.domain.community.model.CommunityRanking +import io.kamel.image.KamelImage +import io.kamel.image.asyncPainterResource +import kustaurant.shared.core.designsystem.generated.resources.ic_crown +import kustaurant.shared.core.designsystem.generated.resources.ic_user_placeholder +import kustaurant.shared.feature.community.generated.resources.Res +import kustaurant.shared.feature.community.generated.resources.ic_medal_1 +import kustaurant.shared.feature.community.generated.resources.ic_medal_2 +import kustaurant.shared.feature.community.generated.resources.ic_medal_3 +import org.jetbrains.compose.resources.painterResource +import kustaurant.shared.core.designsystem.generated.resources.Res as CoreRes + +@Composable +fun CommunityRankingTopCard( + rank: Int, + data: CommunityRanking?, + sizeType: RankCardSize, + cardShape: RoundedCornerShape, + modifier: Modifier = Modifier, + isFirst: Boolean = false, +) { + val height = if (sizeType == RankCardSize.Center) 188.dp else 140.dp + val medalSize = if (sizeType == RankCardSize.Center) 56.dp else 40.dp + val avatarSize = if (sizeType == RankCardSize.Center) 100.dp else 62.dp + val topPaddingHeight = if (rank == 1) 12.dp else 8.dp + val infoTypo = if (rank == 1) KusTheme.typography.type16m else KusTheme.typography.type12r + val bgColor = if (rank == 1) KusTheme.colors.c_FFFFFF else KusTheme.colors.c_EAEAEA + + val medalRes = when (rank) { + 1 -> Res.drawable.ic_medal_1 + 2 -> Res.drawable.ic_medal_2 + else -> Res.drawable.ic_medal_3 + } + + Box( + modifier = modifier + .padding(top = medalSize / 2), + contentAlignment = Alignment.TopCenter + ) { + Surface( + modifier = Modifier + .fillMaxWidth() + .height(height), + shape = cardShape, + border = if (isFirst) BorderStroke(1.dp, KusTheme.colors.c_43AB38) else null, + shadowElevation = 0.dp, + ) { + Column( + modifier = Modifier + .background(bgColor) + .fillMaxSize() + .padding(horizontal = 10.dp, vertical = 12.dp), + horizontalAlignment = Alignment.CenterHorizontally + ) { + Spacer(Modifier.height(topPaddingHeight)) + + UserAvator(url = data?.iconUrl, modifier = Modifier.size(avatarSize)) + + Spacer(Modifier.height(8.dp)) + + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.Center, + verticalAlignment = Alignment.CenterVertically + ) { + if (rank == 1) { + Image( + painter = painterResource(CoreRes.drawable.ic_crown), + contentDescription = "1등 왕관", + modifier = Modifier.size(16.dp) + ) + Spacer(Modifier.width(6.dp)) + } + Text( + text = data?.nickname ?: "-", + style = infoTypo, + color = KusTheme.colors.c_323232, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + ) + } + + Spacer(Modifier.height(6.dp)) + + Text( + text = "${data?.evaluationCount ?: 0}개", + style = infoTypo, + color = KusTheme.colors.c_43AB38, + ) + } + } + + Image( + painter = painterResource(medalRes), + contentDescription = "${rank}등 메달", + modifier = Modifier + .size(medalSize) + .align(Alignment.TopCenter) + .offset(y = -(medalSize / 2)) + .zIndex(2f) + ) + } +} + +@Composable +fun UserAvator( + url: String?, + modifier: Modifier = Modifier, +) { + Box( + modifier = modifier + .size(24.dp), + contentAlignment = Alignment.Center + ) { + if (!url.isNullOrBlank()) { + KamelImage( + resource = asyncPainterResource(url), + contentDescription = "사용자의 프로필 이미지 입니다.", + modifier = Modifier + .fillMaxSize() + .clip(CircleShape), + onFailure = { + Image( + painter = painterResource(CoreRes.drawable.ic_user_placeholder), + contentDescription = "기본 프로필 이미지 입니다." + ) + }, + ) + } else { + Image( + painter = painterResource(CoreRes.drawable.ic_user_placeholder), + contentDescription = "기본 프로필 이미지 입니다.", + modifier = Modifier.size(62.dp) + ) + } + } +} + +@Composable +fun RankingRow( + item: CommunityRanking, +) { + Column { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp) + .padding(vertical = 10.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Text( + text = item.rank.toString(), + style = KusTheme.typography.type16sb, + color = KusTheme.colors.c_43AB38, + modifier = Modifier.widthIn(34.dp), + ) + + Spacer(Modifier.width(2.dp)) + + UserAvator(url = item.iconUrl) + + Spacer(Modifier.width(2.dp)) + + Text( + text = item.nickname, + style = KusTheme.typography.type16m, + color = KusTheme.colors.c_323232, + modifier = Modifier.weight(1f), + maxLines = 1, + overflow = TextOverflow.Ellipsis, + ) + + Text( + text = "${item.evaluationCount}개", + style = KusTheme.typography.type16r, + color = KusTheme.colors.c_666666, + ) + } + + HorizontalDivider( + modifier = Modifier.padding(horizontal = 16.dp), + thickness = 1.dp, + color = KusTheme.colors.c_E0E0E0 + ) + } +} + diff --git a/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/ranking/RankCardSize.kt b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/ranking/RankCardSize.kt new file mode 100644 index 00000000..a4471e60 --- /dev/null +++ b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/ranking/RankCardSize.kt @@ -0,0 +1,3 @@ +package com.kus.feature.community.ui.ranking + +enum class RankCardSize { Center, Side } \ No newline at end of file diff --git a/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/ranking/RankingHeader.kt b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/ranking/RankingHeader.kt new file mode 100644 index 00000000..7a916046 --- /dev/null +++ b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/ranking/RankingHeader.kt @@ -0,0 +1,59 @@ +package com.kus.feature.community.ui.ranking + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.dp +import com.kus.designsystem.component.KusChip +import com.kus.designsystem.theme.KusTheme +import com.kus.domain.community.model.RankingSortType + + +@Composable +fun RankingHeader( + selectedSort: RankingSortType, + onSortChange: (RankingSortType) -> Unit, +) { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp), + ) { + Spacer(modifier = Modifier.height(32.dp)) + Text( + text = "맛집 평가에 참여하고 랭킹에 올라보세요!", + style = KusTheme.typography.type13r, + color = KusTheme.colors.c_AAAAAA, + modifier = Modifier.fillMaxWidth(), + textAlign = TextAlign.Center + ) + Spacer(Modifier.height(18.dp)) + + Row( + horizontalArrangement = Arrangement.spacedBy(6.dp), + modifier = Modifier.padding(horizontal = 18.dp) + ) { + KusChip( + chipName = "분기순", + isSelected = selectedSort == RankingSortType.SEASONAL, + onClick = { onSortChange(RankingSortType.SEASONAL) }, + modifier = Modifier.height(29.dp) + ) + + KusChip( + chipName = "누적순", + isSelected = selectedSort == RankingSortType.CUMULATIVE, + onClick = { onSortChange(RankingSortType.CUMULATIVE) }, + modifier = Modifier.height(29.dp) + ) + } + } +} diff --git a/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/ranking/Top3RankingSection.kt b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/ranking/Top3RankingSection.kt new file mode 100644 index 00000000..80d75549 --- /dev/null +++ b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/ranking/Top3RankingSection.kt @@ -0,0 +1,95 @@ +package com.kus.feature.community.ui.ranking + +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.offset +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.scale +import androidx.compose.ui.unit.dp +import androidx.compose.ui.zIndex +import com.kus.domain.community.model.CommunityRanking +import kustaurant.shared.feature.community.generated.resources.Res +import kustaurant.shared.feature.community.generated.resources.bg_halo +import org.jetbrains.compose.resources.painterResource + +@Composable +fun Top3RankingSection( + top3: List, +) { + val first = top3.firstOrNull { it.rank == 1 } + val second = top3.firstOrNull { it.rank == 2 } + val third = top3.firstOrNull { it.rank == 3 } + + Box( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp) + .height(250.dp), + contentAlignment = Alignment.Center + ) { + Image( + painter = painterResource(Res.drawable.bg_halo), + contentDescription = "평가 랭킹 탭 배경 이미지입니다.", + modifier = Modifier.fillMaxSize(), + ) + + Row( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 8.dp), + horizontalArrangement = Arrangement.spacedBy(0.dp, Alignment.CenterHorizontally), + verticalAlignment = Alignment.CenterVertically + ) { + CommunityRankingTopCard( + rank = 2, + data = second, + sizeType = RankCardSize.Side, + cardShape = RoundedCornerShape( + topStart = 14.dp, + bottomStart = 14.dp, + topEnd = 0.dp, + bottomEnd = 0.dp + ), + modifier = Modifier + .weight(1f) + .offset(y = 20.dp) + ) + + CommunityRankingTopCard( + rank = 1, + data = first, + sizeType = RankCardSize.Center, + cardShape = RoundedCornerShape(16.dp), + isFirst = true, + modifier = Modifier + .weight(1.3f) + .zIndex(1f) + .scale(1.05f) + ) + + CommunityRankingTopCard( + rank = 3, + data = third, + sizeType = RankCardSize.Side, + cardShape = RoundedCornerShape( + topStart = 0.dp, + bottomStart = 0.dp, + topEnd = 14.dp, + bottomEnd = 14.dp + ), + modifier = Modifier + .weight(1f) + .offset(y = 20.dp) + ) + } + } +} \ No newline at end of file diff --git a/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/util/ScrollUtil.kt b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/util/ScrollUtil.kt new file mode 100644 index 00000000..3c43e3b8 --- /dev/null +++ b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/util/ScrollUtil.kt @@ -0,0 +1,24 @@ +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.geometry.Offset +import androidx.compose.ui.input.nestedscroll.NestedScrollConnection +import androidx.compose.ui.input.nestedscroll.NestedScrollSource + +@Composable +fun rememberFabVisibleOnScrollUp(): Pair { + var visible by remember { mutableStateOf(false) } + + val connection = remember { + object : NestedScrollConnection { + override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset { + val dy = available.y + visible = dy > 0f + return Offset.Zero + } + } + } + return visible to connection +} \ No newline at end of file diff --git a/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/util/StringUtil.kt b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/util/StringUtil.kt new file mode 100644 index 00000000..08f8a14b --- /dev/null +++ b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/util/StringUtil.kt @@ -0,0 +1,20 @@ +package com.kus.feature.community.ui.util + +import kotlin.text.iterator + +fun String.jsQuote(): String { + return buildString { + append('"') + for (c in this@jsQuote) { + when (c) { + '\\' -> append("\\\\") + '"' -> append("\\\"") + '\n' -> append("\\n") + '\r' -> append("\\r") + '\t' -> append("\\t") + else -> append(c) + } + } + append('"') + } +} \ No newline at end of file diff --git a/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/write/CommunityEditorController.kt b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/write/CommunityEditorController.kt new file mode 100644 index 00000000..3e3f300d --- /dev/null +++ b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/write/CommunityEditorController.kt @@ -0,0 +1,34 @@ +package com.kus.feature.community.ui.write + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.Stable +import androidx.compose.runtime.remember + +@Stable +class CommunityEditorController { + + var delegate: EditorDelegate? = null + var expectsContent: Boolean = false + + fun setHtml(html: String) { + expectsContent = true + delegate?.setHtml(html) + } + + fun insertImage(url: String) = delegate?.insertImage(url) + fun undo() = delegate?.undo() + fun redo() = delegate?.redo() + fun toggleBold() = delegate?.toggleBold() +} + +interface EditorDelegate { + fun setHtml(html: String) + fun insertImage(url: String) + fun undo() + fun redo() + fun toggleBold() +} + +@Composable +fun rememberCommunityEditorController(): CommunityEditorController = + remember { CommunityEditorController() } \ No newline at end of file diff --git a/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/write/CommunityEditorRenderer.kt b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/write/CommunityEditorRenderer.kt new file mode 100644 index 00000000..e7ecf41c --- /dev/null +++ b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/write/CommunityEditorRenderer.kt @@ -0,0 +1,14 @@ +package com.kus.feature.community.ui.write + +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier + +interface CommunityEditorRenderer { + @Composable + fun Render( + controller: CommunityEditorController, + modifier: Modifier, + onHtmlChange: (String) -> Unit, + onEditorReady: () -> Unit, + ) +} \ No newline at end of file diff --git a/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/write/CommunityWriteScreen.kt b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/write/CommunityWriteScreen.kt new file mode 100644 index 00000000..ced4792d --- /dev/null +++ b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/write/CommunityWriteScreen.kt @@ -0,0 +1,442 @@ +package com.kus.feature.community.ui.write + +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.imePadding +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.text.BasicTextField +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.DropdownMenu +import androidx.compose.material3.DropdownMenuItem +import androidx.compose.material3.HorizontalDivider +import androidx.compose.material3.Icon +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableIntStateOf +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.draw.clipToBounds +import androidx.compose.ui.layout.onSizeChanged +import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.DpOffset +import androidx.compose.ui.unit.dp +import com.kus.designsystem.theme.KusTheme +import com.kus.designsystem.util.noRippleClickable +import com.kus.domain.community.model.PostCategory +import com.kus.feature.community.model.CommunityPostModifyPayload +import com.kus.feature.community.ui.write.image.PlatformImagePicker +import kotlinx.coroutines.launch +import kustaurant.shared.core.designsystem.generated.resources.ic_arrow_back +import org.jetbrains.compose.resources.painterResource +import org.koin.compose.viewmodel.koinViewModel +import kustaurant.shared.core.designsystem.generated.resources.Res as CoreRes +import kustaurant.shared.feature.community.generated.resources.Res +import kustaurant.shared.feature.community.generated.resources.ic_drop_down +import kustaurant.shared.feature.community.generated.resources.ic_undo +import kustaurant.shared.feature.community.generated.resources.ic_insert_image +import kustaurant.shared.feature.community.generated.resources.ic_bold +import kustaurant.shared.feature.community.generated.resources.ic_redo + +@Composable +fun CommunityWriteScreen( + initial: CommunityPostModifyPayload?, + onBackClick: () -> Unit, + onFinishCreate: (Long) -> Unit, + onFinishModify: (CommunityPostModifyPayload) -> Unit, + onShowMessage: (String) -> Unit, + editorRenderer: CommunityEditorRenderer, + imagePicker: PlatformImagePicker, +) { + val viewModel: CommunityWriteViewModel = koinViewModel() + val uiState by viewModel.uiState.collectAsState() + val controller = rememberCommunityEditorController() + + LaunchedEffect(initial?.postId) { + viewModel.init(initial) + } + + LaunchedEffect(uiState.toastMessage) { + uiState.toastMessage?.let { + onShowMessage(it) + viewModel.clearToast() + } + } + + + LaunchedEffect(uiState.finishState) { + when (uiState.finishState) { + PostFinishState.CREATE_OK -> { + onShowMessage("게시글이 성공적으로 업로드되었습니다.") + viewModel.consumeFinishState() + uiState.editPostId?.let(onFinishCreate) + } + + PostFinishState.MODIFY_OK -> { + onShowMessage("게시글이 성공적으로 수정되었습니다.") + viewModel.consumeFinishState() + + val postId = uiState.editPostId ?: return@LaunchedEffect + val category = uiState.category ?: return@LaunchedEffect + + onFinishModify( + CommunityPostModifyPayload( + postId = postId, + category = category, + title = uiState.title, + body = uiState.html, + totalLikes = uiState.totalLikes, + commentCount = uiState.commentCount + ) + ) + } + + PostFinishState.ERR -> viewModel.consumeFinishState() + PostFinishState.IDLE -> Unit + } + } + + LaunchedEffect(uiState.initialHtmlToSet) { + uiState.initialHtmlToSet?.let { html -> + controller.setHtml(html) + viewModel.consumeInitialHtml() + } + } + + val scope = rememberCoroutineScope() + + val onPickImageClick = { + imagePicker.pickImage { imagePath -> + if (imagePath == null) return@pickImage + scope.launch { + val url = viewModel.uploadImageAndGetUrl(imagePath) ?: return@launch + controller.insertImage(url) + } + } + } + + val titleText = if (uiState.isEditMode) "게시글 수정" else "게시글 작성" + val canSubmit = uiState.isSendReady && uiState.phase != CommunityWritePhase.Loading + + Scaffold( + topBar = { + KusTopBarSlots( + modifier = Modifier + .fillMaxWidth() + .height(64.dp) + .padding(horizontal = 16.dp), + left = { + Icon( + painter = painterResource(CoreRes.drawable.ic_arrow_back), + contentDescription = "뒤로가기 버튼입니다.", + modifier = Modifier.noRippleClickable { onBackClick() } + ) + }, + right = { + Box( + modifier = Modifier + .size(width = 54.dp, height = 32.dp) + .background( + color = if (canSubmit) KusTheme.colors.c_43AB38 else KusTheme.colors.c_AAAAAA, + shape = RoundedCornerShape(100.dp) + ) + .noRippleClickable { if (canSubmit) viewModel.submit() }, + contentAlignment = Alignment.Center + ) { + Text( + text = "완료", + style = KusTheme.typography.type14r, + color = KusTheme.colors.c_FFFFFF, + textAlign = TextAlign.Center, + maxLines = 1 + ) + } + } + ) { + Text( + text = titleText, + style = KusTheme.typography.type17sb, + color = KusTheme.colors.c_323232 + ) + } + }, + modifier = Modifier + .fillMaxSize() + .background(KusTheme.colors.c_FFFFFF), + contentWindowInsets = WindowInsets(0.dp, 0.dp, 0.dp, 0.dp), + ) { inner -> + Column( + modifier = Modifier + .fillMaxSize() + .background(KusTheme.colors.c_FFFFFF) + .padding(inner) + .imePadding() + ) { + Spacer(modifier = Modifier.height(20.dp)) + + CommunityCategorySelectorPopup( + selected = uiState.category, + onSelect = viewModel::onCategoryChange, + modifier = Modifier.padding(horizontal = 16.dp) + ) + + Spacer(modifier = Modifier.height(39.dp)) + + BasicTextField( + value = uiState.title, + onValueChange = viewModel::onTitleChange, + singleLine = true, + textStyle = KusTheme.typography.type17sb.copy(color = KusTheme.colors.c_323232), + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp) + .height(32.dp), + decorationBox = { innerTextField -> + Column( + modifier = Modifier.fillMaxSize() + ) { + Box( + contentAlignment = Alignment.CenterStart + ) { + if (uiState.title.isEmpty()) { + Text( + text = "제목을 입력해주세요", + style = KusTheme.typography.type17sb, + color = KusTheme.colors.c_AAAAAA + ) + } + innerTextField() + } + + Spacer(Modifier.height(4.dp)) + + HorizontalDivider( + modifier = Modifier.height(0.5.dp), + color = KusTheme.colors.c_AAAAAA + ) + } + } + ) + + Spacer(Modifier.height(10.dp)) + + Box( + modifier = Modifier + .weight(1f) + .clipToBounds() + ) { + editorRenderer.Render( + controller = controller, + modifier = Modifier.fillMaxSize(), + onHtmlChange = viewModel::onHtmlChange, + onEditorReady = viewModel::onEditorReady + ) + + if (uiState.phase == CommunityWritePhase.Loading || uiState.isImageUploading) { + Box(Modifier + .fillMaxSize() + .background( + color = KusTheme.colors.c_FFFFFF.copy(alpha = 0.3f)), + contentAlignment = Alignment.Center + ) { + CircularProgressIndicator(color = KusTheme.colors.c_43AB38) + } + } + } + + Box( + modifier = Modifier + .fillMaxWidth() + .background(color = KusTheme.colors.c_FFFFFF) + ) { + CommunityWriteBottomToolbar( + onPickImage = onPickImageClick, + onUndo = controller::undo, + onRedo = controller::redo, + onBold = controller::toggleBold, + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp, vertical = 12.dp) + ) + } + } + } +} + +@Composable +private fun CommunityCategorySelectorPopup( + selected: PostCategory?, + onSelect: (PostCategory) -> Unit, + modifier: Modifier = Modifier, +) { + var expanded by remember { mutableStateOf(false) } + + val density = LocalDensity.current + val shape = RoundedCornerShape(14.dp) + + var anchorWidthPx by remember { mutableIntStateOf(0) } + var iconWidthPx by remember { mutableIntStateOf(0) } + var anchorHeightPx by remember { mutableIntStateOf(0) } + val yOffsetDp = with(density) { (-anchorHeightPx).toDp() } + val spacerPx = with(density) { 6.dp.roundToPx() } + val menuWidthDp = with(density) { + (anchorWidthPx - iconWidthPx - spacerPx).toDp() + } + + Box(modifier) { + Row( + modifier = Modifier + .width(102.dp) + .onSizeChanged { + anchorWidthPx = it.width + anchorHeightPx = it.height + } + .clip(shape) + .background(KusTheme.colors.c_FFFFFF) + .border(1.dp, KusTheme.colors.c_43AB38, shape) + .noRippleClickable { expanded = true } + .padding(horizontal = 12.dp, vertical = 8.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Text( + text = selected?.displayName ?: "게시판 선택", + style = KusTheme.typography.type12m, + color = KusTheme.colors.c_43AB38, + modifier = Modifier.weight(1f) + ) + Spacer(Modifier.width(6.dp)) + Icon( + painter = painterResource(Res.drawable.ic_drop_down), + contentDescription = null, + tint = KusTheme.colors.c_43AB38, + modifier = Modifier.onSizeChanged { + iconWidthPx = it.width + } + ) + } + + DropdownMenu( + expanded = expanded, + onDismissRequest = { expanded = false }, + offset = DpOffset(x = 0.dp, y = yOffsetDp), + shape = RoundedCornerShape(13.dp), + containerColor = KusTheme.colors.c_E0E0E0, + modifier = Modifier + .then(if (anchorWidthPx > 0) Modifier.width(menuWidthDp) else Modifier), + ) { + Box( + modifier = + Modifier + .fillMaxWidth() + .height(32.dp), + contentAlignment = Alignment.Center + ) { + Text( + text = "게시판 선택", + style = KusTheme.typography.type14r, + color = KusTheme.colors.c_AAAAAA, + textAlign = TextAlign.Center, + modifier = Modifier + .fillMaxWidth() + .padding(bottom = 1.dp) + ) + } + + listOf(PostCategory.FREE, PostCategory.SUGGESTION, PostCategory.COLUMN).forEach { c -> + DropdownMenuItem( + modifier = Modifier.height(32.dp), + text = { + Box( + modifier = + Modifier + .fillMaxWidth() + .padding(bottom = 1.dp), + contentAlignment = Alignment.Center + ) { + Text( + text = c.displayName, + style = KusTheme.typography.type14r, + color = KusTheme.colors.c_666666 + ) + } + }, + onClick = { + expanded = false + onSelect(c) + }, + ) + } + } + } +} + +@Composable +private fun CommunityWriteBottomToolbar( + onPickImage: () -> Unit, + onUndo: () -> Unit, + onRedo: () -> Unit, + onBold: () -> Unit, + modifier: Modifier = Modifier, +) { + Column(modifier = Modifier.fillMaxWidth()){ + HorizontalDivider(thickness = 1.dp, color = KusTheme.colors.c_E0E0E0) + Row( + modifier = modifier.padding(vertical = 4.dp, horizontal = 16.dp), + horizontalArrangement = Arrangement.spacedBy(8.dp), + verticalAlignment = Alignment.CenterVertically, + ) { + Image( + painter = painterResource(Res.drawable.ic_insert_image), + contentDescription = "이미지 삽입 아이콘입니다.", + modifier = Modifier + .size(18.dp) + .noRippleClickable { onPickImage() }) + Spacer(Modifier.width(18.dp)) + Image( + painter = painterResource(Res.drawable.ic_undo), + contentDescription = "뒤로가기 아이콘입니다.", + modifier = Modifier + .size(width = 16.61.dp, height = 14.05.dp) + .noRippleClickable { onUndo() }) + Spacer(Modifier.width(18.dp)) + Image( + painter = painterResource(Res.drawable.ic_redo), + contentDescription = "되돌리기 아이콘입니다.", + modifier = Modifier + .size(width = 16.61.dp, height = 14.05.dp) + .noRippleClickable { onRedo() }) + Spacer(Modifier.width(18.dp)) + Image( + painter = painterResource(Res.drawable.ic_bold), + contentDescription = "굵게 처리 아이콘입니다.", + modifier = Modifier + .size(width = 15.dp, height = 14.dp) + .noRippleClickable { onBold() }) + } + + HorizontalDivider(thickness = 1.dp, color = KusTheme.colors.c_E0E0E0) + } + +} \ No newline at end of file diff --git a/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/write/CommunityWriteUiState.kt b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/write/CommunityWriteUiState.kt new file mode 100644 index 00000000..7692bdb6 --- /dev/null +++ b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/write/CommunityWriteUiState.kt @@ -0,0 +1,30 @@ +package com.kus.feature.community.ui.write + +import com.kus.domain.community.model.PostCategory + +enum class CommunityWritePhase { Idle, Loading } +enum class PostFinishState { IDLE, ERR, MODIFY_OK, CREATE_OK } + +data class CommunityWriteUiState( + val phase: CommunityWritePhase = CommunityWritePhase.Idle, + + val isEditMode: Boolean = false, + val editPostId: Long? = null, + + val category: PostCategory? = null, + val title: String = "", + val html: String = "", + + val nickname: String = "", + val writerIconUrl: String? = null, + val timeAgo: String = "", + val totalLikes: Long = 0L, + val commentCount: Long = 0L, + + val isImageUploading: Boolean = false, + val isSendReady: Boolean = false, + val finishState: PostFinishState = PostFinishState.IDLE, + val toastMessage: String? = null, + + val initialHtmlToSet: String? = null, +) \ No newline at end of file diff --git a/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/write/CommunityWriteViewModel.kt b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/write/CommunityWriteViewModel.kt new file mode 100644 index 00000000..571b3326 --- /dev/null +++ b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/write/CommunityWriteViewModel.kt @@ -0,0 +1,180 @@ +package com.kus.feature.community.ui.write + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.kus.domain.community.model.PostCategory +import com.kus.domain.community.model.UploadImageException +import com.kus.domain.community.usecase.PatchPostModifyUseCase +import com.kus.domain.community.usecase.PostCommunityPostCreateUseCase +import com.kus.domain.community.usecase.PostCommunityUploadImageUseCase +import com.kus.feature.community.model.CommunityPostModifyPayload +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch + +class CommunityWriteViewModel( + private val postCreateUseCase: PostCommunityPostCreateUseCase, + private val postUploadImageUseCase: PostCommunityUploadImageUseCase, + private val patchPostModifyUseCase: PatchPostModifyUseCase, +) : ViewModel() { + private val _uiState = MutableStateFlow(CommunityWriteUiState()) + val uiState: StateFlow = _uiState.asStateFlow() + + fun init(payload: CommunityPostModifyPayload?) { + if (payload == null) { + _uiState.update { + it.copy( + isEditMode = false, + editPostId = null, + category = null, + title = "", + html = "", + nickname = "", + writerIconUrl = null, + timeAgo = "", + totalLikes = 0L, + commentCount = 0L, + isSendReady = false, + finishState = PostFinishState.IDLE, + toastMessage = null, + initialHtmlToSet = "", + ) + } + } else { + _uiState.update { + it.copy( + isEditMode = true, + editPostId = payload.postId, + category = payload.category, + title = payload.title, + html = payload.body, + totalLikes = payload.totalLikes, + commentCount = payload.commentCount, + isSendReady = computeSendReady( + category = payload.category, + title = payload.title, + html = payload.body + ), + finishState = PostFinishState.IDLE, + toastMessage = null, + initialHtmlToSet = payload.body, + ) + } + } + } + + fun consumeInitialHtml() { + _uiState.update { it.copy(initialHtmlToSet = null) } + } + + fun clearToast() { + _uiState.update { it.copy(toastMessage = null) } + } + + fun onEditorReady() { + _uiState.update { it.copy(phase = CommunityWritePhase.Idle) } + } + + fun consumeFinishState() { + _uiState.update { it.copy(finishState = PostFinishState.IDLE) } + } + + fun onTitleChange(title: String) { + _uiState.update { s -> + val next = s.copy(title = title) + next.copy(isSendReady = computeSendReady(next.category, next.title, next.html)) + } + } + + fun onCategoryChange(category: PostCategory) { + _uiState.update { s -> + val next = s.copy(category = category) + next.copy(isSendReady = computeSendReady(next.category, next.title, next.html)) + } + } + + fun onHtmlChange(html: String) { + _uiState.update { s -> + val next = s.copy(html = html) + next.copy(isSendReady = computeSendReady(next.category, next.title, next.html)) + } + } + + fun submit() { + val s = _uiState.value + if (!s.isSendReady) return + + viewModelScope.launch { + _uiState.update { it.copy(phase = CommunityWritePhase.Loading) } + var editPostId = 0L + runCatching { + if (s.isEditMode) { + val postId = s.editPostId ?: error("editPostId null") + + patchPostModifyUseCase( + postId = postId.toString(), + title = s.title, + postCategory = s.category ?: PostCategory.FREE, + content = s.html + ) + editPostId = postId + PostFinishState.MODIFY_OK + } else { + val res = postCreateUseCase( + title = s.title, + postCategory = s.category ?: PostCategory.FREE, + content = s.html + ) + editPostId = res.postId + PostFinishState.CREATE_OK + } + }.onSuccess { finish -> + _uiState.update { + it.copy( + phase = CommunityWritePhase.Idle, + finishState = finish, + editPostId = editPostId + ) + } + }.onFailure { e -> + _uiState.update { + it.copy( + phase = CommunityWritePhase.Idle, + finishState = PostFinishState.ERR, + toastMessage = e.message ?: "게시글 처리 중 오류가 발생했습니다." + ) + } + } + } + } + + suspend fun uploadImageAndGetUrl(imagePath: String): String? { + _uiState.update { it.copy(isImageUploading = true) } + + return runCatching { + postUploadImageUseCase(imagePath) + }.onSuccess { + _uiState.update { it.copy(isImageUploading = false) } + }.onFailure { e -> + _uiState.update { it.copy(isImageUploading = false) } + val msg = when (e) { + is UploadImageException.TooLarge -> "이미지는 1MB 이하만 업로드 가능합니다." + is UploadImageException.ReadFailed -> "이미지를 읽을 수 없습니다." + else -> e.message ?: "업로드 중 오류가 발생했습니다." + } + _uiState.update { it.copy(toastMessage = msg) } + }.getOrNull() + } + + private fun computeSendReady(category: PostCategory?, title: String, html: String): Boolean { + if (category == null || category == PostCategory.ALL) return false + if (title.isBlank()) return false + + val cleaned = html + .replace(Regex("


|
|

"), "") + .trim() + return cleaned.isNotEmpty() + } +} \ No newline at end of file diff --git a/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/write/KusTopBarSlots.kt b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/write/KusTopBarSlots.kt new file mode 100644 index 00000000..cc78e43e --- /dev/null +++ b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/write/KusTopBarSlots.kt @@ -0,0 +1,74 @@ +package com.kus.feature.community.ui.write + +import androidx.compose.foundation.layout.* +import androidx.compose.material3.HorizontalDivider +import androidx.compose.runtime.* +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.layout.onSizeChanged +import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.unit.dp +import com.kus.designsystem.theme.KusTheme + +@Composable +fun KusTopBarSlots( + modifier: Modifier = Modifier, + left: @Composable (() -> Unit)? = null, + right: @Composable (RowScope.() -> Unit)? = null, + content: @Composable () -> Unit, +) { + var leftWidthPx by remember { mutableIntStateOf(0) } + var rightWidthPx by remember { mutableIntStateOf(0) } + + val density = LocalDensity.current + val leftWidthDp = with(density) { leftWidthPx.toDp() } + val rightWidthDp = with(density) { rightWidthPx.toDp() } + + val safeSidePadding = maxOf(leftWidthDp, rightWidthDp) + + Column( + modifier = modifier, + horizontalAlignment = Alignment.CenterHorizontally + ) { + Box( + modifier = modifier, + contentAlignment = Alignment.Center + ) { + Box( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = safeSidePadding), + contentAlignment = Alignment.Center + ) { + content() + } + + if (left != null) { + Box( + modifier = Modifier + .align(Alignment.CenterStart) + .onSizeChanged { leftWidthPx = it.width } + ) { + left() + } + } else { + LaunchedEffect(Unit) { leftWidthPx = 0 } + } + + if (right != null) { + Row( + modifier = Modifier + .align(Alignment.CenterEnd) + .onSizeChanged { rightWidthPx = it.width }, + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.End, + content = right + ) + } else { + LaunchedEffect(Unit) { rightWidthPx = 0 } + } + } + + HorizontalDivider(thickness = 1.5.dp, color = KusTheme.colors.c_EAEAEA) + } +} \ No newline at end of file diff --git a/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/write/image/PlatformImagePicker.kt b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/write/image/PlatformImagePicker.kt new file mode 100644 index 00000000..9a0dd424 --- /dev/null +++ b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/write/image/PlatformImagePicker.kt @@ -0,0 +1,5 @@ +package com.kus.feature.community.ui.write.image + +fun interface PlatformImagePicker { + fun pickImage(onPicked: (String?) -> Unit) +} \ No newline at end of file diff --git a/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/write/image/PlatformImagePickerFactory.kt b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/write/image/PlatformImagePickerFactory.kt new file mode 100644 index 00000000..aedf3eef --- /dev/null +++ b/shared/feature/community/src/commonMain/kotlin/com/kus/feature/community/ui/write/image/PlatformImagePickerFactory.kt @@ -0,0 +1,8 @@ +package com.kus.feature.community.ui.write.image + +import androidx.compose.runtime.Composable + +interface PlatformImagePickerFactory { + @Composable + fun rememberPicker(): PlatformImagePicker +} \ No newline at end of file diff --git a/shared/feature/community/src/desktopMain/kotlin/com/kus/feature/community/ui/detail/HtmlBodyView.desktop.kt b/shared/feature/community/src/desktopMain/kotlin/com/kus/feature/community/ui/detail/HtmlBodyView.desktop.kt new file mode 100644 index 00000000..d001c8bb --- /dev/null +++ b/shared/feature/community/src/desktopMain/kotlin/com/kus/feature/community/ui/detail/HtmlBodyView.desktop.kt @@ -0,0 +1,7 @@ +package com.kus.feature.community.ui.detail + +import androidx.compose.ui.Modifier + +@androidx.compose.runtime.Composable +actual fun HtmlBodyView(html: String, modifier: Modifier) { +} \ No newline at end of file diff --git a/shared/feature/community/src/iosMain/kotlin/com/kus/feature/community/ui/detail/HtmlBodyView.ios.kt b/shared/feature/community/src/iosMain/kotlin/com/kus/feature/community/ui/detail/HtmlBodyView.ios.kt new file mode 100644 index 00000000..a99740c6 --- /dev/null +++ b/shared/feature/community/src/iosMain/kotlin/com/kus/feature/community/ui/detail/HtmlBodyView.ios.kt @@ -0,0 +1,89 @@ +package com.kus.feature.community.ui.detail + +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import platform.UIKit.UIColor +import platform.WebKit.WKWebView +import androidx.compose.ui.viewinterop.UIKitView +import kotlinx.cinterop.ExperimentalForeignApi +import platform.CoreGraphics.CGRectMake +import platform.UIKit.UIUserInterfaceStyle +import platform.WebKit.WKNavigation +import platform.WebKit.WKNavigationDelegateProtocol +import platform.darwin.NSObject + +@OptIn(ExperimentalForeignApi::class) +@Composable +actual fun HtmlBodyView( + html: String, + modifier: Modifier +) { + var webViewHeight by remember { mutableStateOf(300) } + + val styledHtml = remember(html) { + """ + + + + + + $html + + """.trimIndent() + } + + val delegate = remember { + object : NSObject(), WKNavigationDelegateProtocol { + override fun webView( + webView: WKWebView, + didFinishNavigation: WKNavigation? + ) { + webView.evaluateJavaScript("document.body.scrollHeight") { result, _ -> + val height = (result as? Double)?.toInt() ?: 0 + if (height > 0) { + webViewHeight = height + } + } + } + } + } + + UIKitView( + modifier = modifier + .fillMaxWidth() + .height(webViewHeight.dp), + factory = { + val webView = WKWebView(frame = CGRectMake(0.0, 0.0, 300.0, 300.0)) + webView.navigationDelegate = delegate + webView.opaque = true + webView.backgroundColor = UIColor.whiteColor + webView.scrollView.backgroundColor = UIColor.whiteColor + webView.scrollView.scrollEnabled = false + + webView.overrideUserInterfaceStyle = UIUserInterfaceStyle.UIUserInterfaceStyleLight + + webView + }, + update = { webView -> + webView.loadHTMLString(styledHtml, baseURL = null) + } + ) +} \ No newline at end of file diff --git a/shared/feature/home/src/commonMain/kotlin/com/kus/feature/home/model/CategoryData.kt b/shared/feature/home/src/commonMain/kotlin/com/kus/feature/home/model/CategoryData.kt index 76098479..0d3c1e7d 100644 --- a/shared/feature/home/src/commonMain/kotlin/com/kus/feature/home/model/CategoryData.kt +++ b/shared/feature/home/src/commonMain/kotlin/com/kus/feature/home/model/CategoryData.kt @@ -1,5 +1,6 @@ package com.kus.feature.home.model +import com.kus.shared.domain.model.tier.filter.Cuisine import kustaurant.shared.feature.home.generated.resources.Res import kustaurant.shared.feature.home.generated.resources.img_category_all import kustaurant.shared.feature.home.generated.resources.img_category_asian @@ -23,21 +24,22 @@ enum class Category( val image: DrawableResource, val title: String, val id: String, + val cuisine: Cuisine, ) { - ALL(Res.drawable.img_category_all, "전체", "ALL"), - KOREA(Res.drawable.img_category_korea, "한식", "KO"), - JAPAN(Res.drawable.img_category_japan, "일식", "JA"), - CHINA(Res.drawable.img_category_china, "중식", "CH"), - WESTERN(Res.drawable.img_category_western, "양식", "WE"), - ASIAN(Res.drawable.img_category_asian, "아시안", "AS"), - MEAT(Res.drawable.img_category_meat, "고기", "ME"), - SEAFOOD(Res.drawable.img_category_seafood, "해산물", "SE"), - CHICKEN(Res.drawable.img_category_chicken, "치킨", "CK"), - HAMBURGER_PIZZA(Res.drawable.img_category_hamburger_pizza, "햄버거/피자", "HP"), - TTEOKBOKKI(Res.drawable.img_category_tteokbokki, "분식", "BS"), - PUB(Res.drawable.img_category_beer, "술집", "PU"), - CAFE_DESSERT(Res.drawable.img_category_cafe, "카페/디저트", "CA"), - BAKERY(Res.drawable.img_category_bakery, "베이커리", "BA"), - SALAD(Res.drawable.img_category_salad, "샐러드", "SA"), - BENEFIT(Res.drawable.img_category_benefit, "제휴업체", "JH"), + ALL(Res.drawable.img_category_all, "전체", "ALL", Cuisine.ALL), + KOREA(Res.drawable.img_category_korea, "한식", "KO", Cuisine.KOREAN), + JAPAN(Res.drawable.img_category_japan, "일식", "JA", Cuisine.JAPANESE), + CHINA(Res.drawable.img_category_china, "중식", "CH", Cuisine.CHINESE), + WESTERN(Res.drawable.img_category_western, "양식", "WE", Cuisine.WESTERN), + ASIAN(Res.drawable.img_category_asian, "아시안", "AS", Cuisine.ASIAN), + MEAT(Res.drawable.img_category_meat, "고기", "ME", Cuisine.MEAT), + SEAFOOD(Res.drawable.img_category_seafood, "해산물", "SE", Cuisine.SEAFOOD), + CHICKEN(Res.drawable.img_category_chicken, "치킨", "CK", Cuisine.CHICKEN), + HAMBURGER_PIZZA(Res.drawable.img_category_hamburger_pizza, "햄버거/피자", "HP", Cuisine.BURGER_PIZZA), + TTEOKBOKKI(Res.drawable.img_category_tteokbokki, "분식", "BS", Cuisine.BUNSIK), + PUB(Res.drawable.img_category_beer, "술집", "PU", Cuisine.PUB), + CAFE_DESSERT(Res.drawable.img_category_cafe, "카페/디저트", "CA", Cuisine.CAFE_DESSERT), + BAKERY(Res.drawable.img_category_bakery, "베이커리", "BA", Cuisine.BAKERY), + SALAD(Res.drawable.img_category_salad, "샐러드", "SA", Cuisine.SALAD), + BENEFIT(Res.drawable.img_category_benefit, "제휴업체", "JH", Cuisine.PARTNERSHIP), } diff --git a/shared/feature/home/src/commonMain/kotlin/com/kus/feature/home/navigation/HomeNavGraph.kt b/shared/feature/home/src/commonMain/kotlin/com/kus/feature/home/navigation/HomeNavGraph.kt index 4022aefc..5ea586b8 100644 --- a/shared/feature/home/src/commonMain/kotlin/com/kus/feature/home/navigation/HomeNavGraph.kt +++ b/shared/feature/home/src/commonMain/kotlin/com/kus/feature/home/navigation/HomeNavGraph.kt @@ -5,6 +5,7 @@ import androidx.navigation.NavGraphBuilder import androidx.navigation.NavOptions import androidx.navigation.compose.composable import com.kus.feature.home.ui.HomeRoute +import com.kus.shared.domain.model.tier.filter.Cuisine import kotlinx.serialization.Serializable @Serializable @@ -17,7 +18,7 @@ fun NavController.navigateToHome( fun NavGraphBuilder.homeNavGraph( navigateToSearch: () -> Unit, navigateToAlert: () -> Unit, - navigateToTier: (String) -> Unit, + navigateToTier: (Cuisine) -> Unit, navigateToDetail: (Long) -> Unit, ) { composable { diff --git a/shared/feature/home/src/commonMain/kotlin/com/kus/feature/home/ui/HomeScreen.kt b/shared/feature/home/src/commonMain/kotlin/com/kus/feature/home/ui/HomeScreen.kt index f3f6caae..194d3401 100644 --- a/shared/feature/home/src/commonMain/kotlin/com/kus/feature/home/ui/HomeScreen.kt +++ b/shared/feature/home/src/commonMain/kotlin/com/kus/feature/home/ui/HomeScreen.kt @@ -31,6 +31,7 @@ import com.kus.feature.home.component.HomeRestaurants import com.kus.feature.home.component.KusSearchBoxWithNoAction import com.kus.feature.home.model.Category import com.kus.shared.domain.model.restaurant.RestaurantItem +import com.kus.shared.domain.model.tier.filter.Cuisine import kustaurant.shared.feature.home.generated.resources.Res import kustaurant.shared.feature.home.generated.resources.ic_alarm import kustaurant.shared.feature.home.generated.resources.img_home_logo @@ -42,7 +43,7 @@ import org.koin.compose.viewmodel.koinViewModel fun HomeRoute( onSearchNavigate: () -> Unit, onAlertNavigate: () -> Unit, - onTierNavigate: (String) -> Unit, + onTierNavigate: (Cuisine) -> Unit, onRestaurantDetailNavigate: (Long) -> Unit, viewModel: HomeViewModel = koinViewModel(), ) { @@ -70,7 +71,7 @@ fun HomeRoute( banners = data.photoUrls, onSearchBoxClick = onSearchNavigate, onAlertButtonClick = onAlertNavigate, - onCategoryClick = onTierNavigate, + onCategoryClick = { category -> onTierNavigate(category) }, onRestaurantClick = onRestaurantDetailNavigate, ) } @@ -87,7 +88,7 @@ private fun HomeSuccessScreen( banners: List, onSearchBoxClick: () -> Unit, onAlertButtonClick: () -> Unit, - onCategoryClick: (String) -> Unit, + onCategoryClick: (Cuisine) -> Unit, onRestaurantClick: (Long) -> Unit, ) { val paddedModifier = Modifier.padding(horizontal = 20.dp) @@ -142,7 +143,7 @@ private fun HomeSuccessScreen( categoryName = category.title, categoryImage = painterResource(category.image), modifier = Modifier.weight(1f), - onClick = { onCategoryClick(category.id) }, + onClick = { onCategoryClick(category.cuisine) }, ) } } diff --git a/shared/feature/login/src/androidMain/kotlin/com/kus/feature/login/navigation/LoginRoute.android.kt b/shared/feature/login/src/androidMain/kotlin/com/kus/feature/login/navigation/LoginRoute.android.kt index 092cf66e..27843247 100644 --- a/shared/feature/login/src/androidMain/kotlin/com/kus/feature/login/navigation/LoginRoute.android.kt +++ b/shared/feature/login/src/androidMain/kotlin/com/kus/feature/login/navigation/LoginRoute.android.kt @@ -73,6 +73,7 @@ actual fun LoginRoute( } }) }, - onNavigateToHome = navigateToHome + onNavigateToHome = navigateToHome, + onSkipLogin = {viewModel.deleteUserInfo()} ) } diff --git a/shared/feature/login/src/commonMain/kotlin/com/kus/feature/login/ui/LoginScreen.kt b/shared/feature/login/src/commonMain/kotlin/com/kus/feature/login/ui/LoginScreen.kt index d0501702..67400c9e 100644 --- a/shared/feature/login/src/commonMain/kotlin/com/kus/feature/login/ui/LoginScreen.kt +++ b/shared/feature/login/src/commonMain/kotlin/com/kus/feature/login/ui/LoginScreen.kt @@ -38,6 +38,7 @@ import kustaurant.shared.core.designsystem.generated.resources.Res as CoreRes fun LoginScreen( modifier: Modifier = Modifier, onNaverClick: () -> Unit, + onSkipLogin: () -> Unit, onNavigateToHome: () -> Unit, ) { Box( @@ -117,7 +118,10 @@ fun LoginScreen( style = KusTheme.typography.type12m, color = KusTheme.colors.c_AAAAAA, modifier = Modifier - .noRippleClickable{ onNavigateToHome() } + .noRippleClickable{ + onSkipLogin() + onNavigateToHome() + } .padding(vertical = 8.dp) ) diff --git a/shared/feature/login/src/commonMain/kotlin/com/kus/feature/login/ui/LoginViewModel.kt b/shared/feature/login/src/commonMain/kotlin/com/kus/feature/login/ui/LoginViewModel.kt index a7d63522..0917f91f 100644 --- a/shared/feature/login/src/commonMain/kotlin/com/kus/feature/login/ui/LoginViewModel.kt +++ b/shared/feature/login/src/commonMain/kotlin/com/kus/feature/login/ui/LoginViewModel.kt @@ -3,6 +3,7 @@ package com.kus.feature.login.ui import UiError import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import com.kus.domain.auth.usecase.DeleteUserInfoUseCase import com.kus.domain.auth.usecase.PostNaverLoginUseCase import com.kus.feature.login.model.SocialAuthResult import kotlinx.coroutines.flow.MutableStateFlow @@ -13,6 +14,7 @@ import kotlinx.coroutines.launch class LoginViewModel( private val postNaverLoginUseCase: PostNaverLoginUseCase, + private val deleteUserInfoUseCase : DeleteUserInfoUseCase ) : ViewModel() { private val _uiState = MutableStateFlow( LoginUiState( @@ -49,6 +51,12 @@ class LoginViewModel( } } + fun deleteUserInfo() { + viewModelScope.launch { + deleteUserInfoUseCase() + } + } + fun onNaverAuthReady(providerId: String, naverAccessToken: String) { val s = _uiState.value if (s.phase == LoginPhase.Exchanging || s.phase == LoginPhase.Success) return diff --git a/shared/feature/login/src/iosMain/kotlin/com/kus/feature/login/navigation/LoginRoute.ios.kt b/shared/feature/login/src/iosMain/kotlin/com/kus/feature/login/navigation/LoginRoute.ios.kt index dd89ad6e..036db494 100644 --- a/shared/feature/login/src/iosMain/kotlin/com/kus/feature/login/navigation/LoginRoute.ios.kt +++ b/shared/feature/login/src/iosMain/kotlin/com/kus/feature/login/navigation/LoginRoute.ios.kt @@ -56,6 +56,7 @@ actual fun LoginRoute( } } }, - onNavigateToHome = navigateToHome + onNavigateToHome = navigateToHome, + onSkipLogin = { viewModel.deleteUserInfo() } ) } diff --git a/shared/feature/tier/src/androidMain/kotlin/com/kus/feature/tier/ui/map/TierMapPlatformAndroid.kt b/shared/feature/tier/src/androidMain/kotlin/com/kus/feature/tier/ui/map/TierMapAndroidPlatform.kt similarity index 96% rename from shared/feature/tier/src/androidMain/kotlin/com/kus/feature/tier/ui/map/TierMapPlatformAndroid.kt rename to shared/feature/tier/src/androidMain/kotlin/com/kus/feature/tier/ui/map/TierMapAndroidPlatform.kt index e81fc4d5..6bbdcb18 100644 --- a/shared/feature/tier/src/androidMain/kotlin/com/kus/feature/tier/ui/map/TierMapPlatformAndroid.kt +++ b/shared/feature/tier/src/androidMain/kotlin/com/kus/feature/tier/ui/map/TierMapAndroidPlatform.kt @@ -6,7 +6,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import com.naver.maps.map.MapView -class TierMapPlatformAndroid : TierMapPlatform { +class TierMapAndroidPlatform : TierMapPlatform { @Composable override fun rememberMapInstance(): Any { val context = LocalContext.current diff --git a/shared/feature/tier/src/androidMain/kotlin/com/kus/feature/tier/ui/map/TierMapAndroidScreen.kt b/shared/feature/tier/src/androidMain/kotlin/com/kus/feature/tier/ui/map/TierMapAndroidScreen.kt index 874907b0..eb8d8b2c 100644 --- a/shared/feature/tier/src/androidMain/kotlin/com/kus/feature/tier/ui/map/TierMapAndroidScreen.kt +++ b/shared/feature/tier/src/androidMain/kotlin/com/kus/feature/tier/ui/map/TierMapAndroidScreen.kt @@ -95,7 +95,6 @@ fun TierMapAndroidScreen( mapInstance.isLoaded = true } - // ✅ 카메라 Idle일 때만 줌 기반 마커/오버레이 갱신 map.addOnCameraIdleListener { val pos = map.cameraPosition currentZoom = pos.zoom.toInt() @@ -152,9 +151,7 @@ fun TierMapAndroidScreen( outlineColor = outlineColorInt, ) - // bounds 변경시에만 카메라 이동 if (isBoundsChanged) { - // 2. 새로운 영역으로 이동하기 전에 holder 값 업데이트 mapInstance.lastBounds = data.visibleBounds isMapReadyToShow = false @@ -244,18 +241,14 @@ private fun moveCameraToBoundsAndClampZoomOnce( LatLng(visibleBounds[3], visibleBounds[1]) ) - // 1) bounds 맞추기 map.moveCamera(CameraUpdate.fitBounds(bounds, paddingPx)) - // 2) 결과 줌이 minZoom보다 작으면 즉시 보정 (Idle 기다리지 않고 바로) val z = map.cameraPosition.zoom if (z < minZoom) { map.moveCamera(CameraUpdate.scrollAndZoomTo(bounds.center, minZoom)) } } - - private fun updateMap( map: NaverMap, mapData: TierMapData, @@ -377,14 +370,17 @@ private fun createRestaurantMarker( private fun getMarkerIcon(restaurant: TierRestaurant): OverlayImage { return if (restaurant.isFavorite) { OverlayImage.fromResource(R.drawable.ic_saved) - } else { + } else if(restaurant.partnershipInfo.isNotEmpty()) { + OverlayImage.fromResource(com.kus.feature.tier.R.drawable.ic_marker_partnership) + } else + { if(restaurant.isTempTier) { when (restaurant.mainTier) { 1 -> OverlayImage.fromResource(R.drawable.ic_temp_tier_1) 2 -> OverlayImage.fromResource(R.drawable.ic_temp_tier_2) 3 -> OverlayImage.fromResource(R.drawable.ic_temp_tier_3) 4 -> OverlayImage.fromResource(R.drawable.ic_temp_tier_4) - else -> OverlayImage.fromResource(com.kus.feature.tier.R.drawable.ic_map_marker) + else -> OverlayImage.fromResource(com.kus.feature.tier.R.drawable.ic_marker_none) } } else { when (restaurant.mainTier) { @@ -392,7 +388,7 @@ private fun getMarkerIcon(restaurant: TierRestaurant): OverlayImage { 2 -> OverlayImage.fromResource(R.drawable.ic_tier_2) 3 -> OverlayImage.fromResource(R.drawable.ic_tier_3) 4 -> OverlayImage.fromResource(R.drawable.ic_tier_4) - else -> OverlayImage.fromResource(com.kus.feature.tier.R.drawable.ic_map_marker) + else -> OverlayImage.fromResource(com.kus.feature.tier.R.drawable.ic_marker_none) } } } diff --git a/shared/feature/tier/src/androidMain/kotlin/di/androidTierMapPlatformModule.kt b/shared/feature/tier/src/androidMain/kotlin/di/androidTierMapPlatformModule.kt index 3effd56c..ea66ea70 100644 --- a/shared/feature/tier/src/androidMain/kotlin/di/androidTierMapPlatformModule.kt +++ b/shared/feature/tier/src/androidMain/kotlin/di/androidTierMapPlatformModule.kt @@ -1,11 +1,11 @@ package di import com.kus.feature.tier.ui.map.TierMapPlatform -import com.kus.feature.tier.ui.map.TierMapPlatformAndroid +import com.kus.feature.tier.ui.map.TierMapAndroidPlatform import org.koin.core.module.dsl.singleOf import org.koin.dsl.bind import org.koin.dsl.module val androidTierMapPlatformModule = module { - singleOf(::TierMapPlatformAndroid) bind TierMapPlatform::class + singleOf(::TierMapAndroidPlatform) bind TierMapPlatform::class } \ No newline at end of file diff --git a/shared/feature/tier/src/androidMain/res/drawable/ic_map_marker.xml b/shared/feature/tier/src/androidMain/res/drawable/ic_map_marker.xml deleted file mode 100644 index d37114ce..00000000 --- a/shared/feature/tier/src/androidMain/res/drawable/ic_map_marker.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - diff --git a/shared/feature/tier/src/androidMain/res/drawable/ic_marker_none.xml b/shared/feature/tier/src/androidMain/res/drawable/ic_marker_none.xml new file mode 100644 index 00000000..84769524 --- /dev/null +++ b/shared/feature/tier/src/androidMain/res/drawable/ic_marker_none.xml @@ -0,0 +1,12 @@ + + + + diff --git a/shared/feature/tier/src/androidMain/res/drawable/ic_marker_partnership.xml b/shared/feature/tier/src/androidMain/res/drawable/ic_marker_partnership.xml new file mode 100644 index 00000000..3c468aac --- /dev/null +++ b/shared/feature/tier/src/androidMain/res/drawable/ic_marker_partnership.xml @@ -0,0 +1,12 @@ + + + + diff --git a/shared/feature/tier/src/commonMain/kotlin/com/kus/feature/tier/config/TierKeys.kt b/shared/feature/tier/src/commonMain/kotlin/com/kus/feature/tier/config/TierKeys.kt new file mode 100644 index 00000000..0ff6fff4 --- /dev/null +++ b/shared/feature/tier/src/commonMain/kotlin/com/kus/feature/tier/config/TierKeys.kt @@ -0,0 +1,6 @@ +package com.kus.feature.tier.config + +object TierKeys { + const val TIER_INITIAL_JSON = "tier_initial_json" + const val TIER_RESULT_JSON = "tier_result_json" +} \ No newline at end of file diff --git a/shared/feature/tier/src/commonMain/kotlin/com/kus/feature/tier/navigation/TierGraph.kt b/shared/feature/tier/src/commonMain/kotlin/com/kus/feature/tier/navigation/TierGraph.kt index 69345fcd..2a3c21ed 100644 --- a/shared/feature/tier/src/commonMain/kotlin/com/kus/feature/tier/navigation/TierGraph.kt +++ b/shared/feature/tier/src/commonMain/kotlin/com/kus/feature/tier/navigation/TierGraph.kt @@ -17,6 +17,7 @@ data object Tier data object TierCategorySelect fun NavGraphBuilder.tierNavGraph( + onShowMessage: (String) -> Unit, initialProvider: () -> TierFilterState, navigateToTierCategorySelect: (TierFilterState) -> Unit, navigateToDetail: (Long) -> Unit, @@ -33,10 +34,12 @@ fun NavGraphBuilder.tierNavGraph( } TierRoute( + initialFilter = initialProvider, navigateToTierCategorySelect = navigateToTierCategorySelect, navigateToDetail = navigateToDetail, resultFilter = result, consumeResult = { entry.savedStateHandle[TierKeys.RESULT_FILTER] = null }, + onShowMessage = onShowMessage ) } diff --git a/shared/feature/tier/src/commonMain/kotlin/com/kus/feature/tier/navigation/TierRoute.kt b/shared/feature/tier/src/commonMain/kotlin/com/kus/feature/tier/navigation/TierRoute.kt index 20013e0e..4ec5e2c9 100644 --- a/shared/feature/tier/src/commonMain/kotlin/com/kus/feature/tier/navigation/TierRoute.kt +++ b/shared/feature/tier/src/commonMain/kotlin/com/kus/feature/tier/navigation/TierRoute.kt @@ -3,6 +3,7 @@ package com.kus.feature.tier.navigation import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.kus.feature.tier.ui.TierFilterState import com.kus.feature.tier.ui.TierScreen @@ -12,13 +13,28 @@ import org.koin.compose.viewmodel.koinViewModel @Composable fun TierRoute( navigateToTierCategorySelect: (TierFilterState) -> Unit, + initialFilter: () -> TierFilterState, navigateToDetail: (Long) -> Unit, resultFilter: TierFilterState?, consumeResult: () -> Unit, + onShowMessage: (String) -> Unit, ) { val viewModel: TierViewModel = koinViewModel() val uiState by viewModel.uiState.collectAsStateWithLifecycle() + val initialFilter = remember { initialFilter() } + + LaunchedEffect(Unit) { + val isDefault = initialFilter == TierFilterState() + if (!isDefault) { + viewModel.setCategory( + cuisines = initialFilter.cuisines, + situations = initialFilter.situations, + locations = initialFilter.locations, + ) + } + } + LaunchedEffect(resultFilter) { val result = resultFilter ?: return@LaunchedEffect @@ -33,6 +49,7 @@ fun TierRoute( TierScreen( onFilterClick = { navigateToTierCategorySelect(uiState.filterState) }, + onShowMessage = onShowMessage, onNavigateRestaurantDetail = navigateToDetail, ) } diff --git a/shared/feature/tier/src/commonMain/kotlin/com/kus/feature/tier/ui/TierScreen.kt b/shared/feature/tier/src/commonMain/kotlin/com/kus/feature/tier/ui/TierScreen.kt index 73d9463b..203b557d 100644 --- a/shared/feature/tier/src/commonMain/kotlin/com/kus/feature/tier/ui/TierScreen.kt +++ b/shared/feature/tier/src/commonMain/kotlin/com/kus/feature/tier/ui/TierScreen.kt @@ -2,19 +2,19 @@ package com.kus.feature.tier.ui import androidx.compose.foundation.Image import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.runtime.remember -import androidx.compose.ui.Modifier -import androidx.compose.ui.unit.dp -import com.kus.designsystem.component.KusTopBar -import com.kus.designsystem.theme.KusTheme -import org.jetbrains.compose.resources.painterResource -import androidx.compose.foundation.layout.* +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyListState import androidx.compose.foundation.lazy.LazyRow import androidx.compose.foundation.lazy.items @@ -25,8 +25,19 @@ import androidx.compose.material3.Tab import androidx.compose.material3.TabRow import androidx.compose.material3.TabRowDefaults import androidx.compose.material3.TabRowDefaults.tabIndicatorOffset -import androidx.compose.runtime.* +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.derivedStateOf +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.runtime.setValue +import androidx.compose.runtime.snapshotFlow import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier import androidx.compose.ui.draw.drawWithContent import androidx.compose.ui.geometry.Offset import androidx.compose.ui.graphics.BlendMode @@ -35,9 +46,13 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.CompositingStrategy import androidx.compose.ui.graphics.graphicsLayer import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.text.style.TextDecoration import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.kus.designsystem.component.KusChip +import com.kus.designsystem.component.KusTopBar +import com.kus.designsystem.theme.KusTheme import com.kus.designsystem.util.noRippleClickable import com.kus.feature.tier.ui.list.TierListScreen import com.kus.feature.tier.ui.map.TierMapPlatform @@ -45,11 +60,14 @@ import kotlinx.coroutines.launch import kustaurant.shared.core.designsystem.generated.resources.ic_alarm_off import kustaurant.shared.core.designsystem.generated.resources.ic_arrow_back import kustaurant.shared.core.designsystem.generated.resources.ic_search -import kustaurant.shared.core.designsystem.generated.resources.Res as CoreRes import kustaurant.shared.feature.tier.generated.resources.Res +import kustaurant.shared.feature.tier.generated.resources.ic_ai_filter_off +import kustaurant.shared.feature.tier.generated.resources.ic_ai_filter_on import kustaurant.shared.feature.tier.generated.resources.ic_filter +import org.jetbrains.compose.resources.painterResource import org.koin.compose.koinInject import org.koin.compose.viewmodel.koinViewModel +import kustaurant.shared.core.designsystem.generated.resources.Res as CoreRes @Composable fun TierScreen( @@ -58,6 +76,7 @@ fun TierScreen( onSearchClick: () -> Unit = {}, onAlarmClick: () -> Unit = {}, onFilterClick: () -> Unit = {}, + onShowMessage: (String) -> Unit, onNavigateRestaurantDetail: (Long) -> Unit = {}, ) { val tabs = remember { TierTab.entries } @@ -69,14 +88,19 @@ fun TierScreen( val sharedMapInstance = mapPlatform.rememberMapInstance() val listState = rememberLazyListState() + LaunchedEffect(Unit) { + viewModel.fetchFirstRestaurants() + } - LaunchedEffect(Unit) { viewModel.fetchFirstRestaurants() } - LaunchedEffect(pagerState.currentPage) { - viewModel.onTabSelected(tabs[pagerState.currentPage]) + LaunchedEffect(uiState.toastMessage) { + uiState.toastMessage?.let { + onShowMessage(it) + viewModel.clearToast() + } } - LaunchedEffect(uiState.filterState) { - listState.scrollToItem(0) + LaunchedEffect(pagerState.currentPage) { + viewModel.onTabSelected(tabs[pagerState.currentPage]) } Column(modifier = modifier.fillMaxSize().background(Color.White)) { @@ -298,3 +322,75 @@ private fun FadingEdgeLazyRow( } +@Composable +private fun TierAiToggleRow( + modifier: Modifier = Modifier, + onTierGuideClick: () -> Unit = {}, +) { + var isAiOn by rememberSaveable { mutableStateOf(false) } + + val iconRes = if (isAiOn) { + Res.drawable.ic_ai_filter_on + } else { + Res.drawable.ic_ai_filter_off + } + + Row( + modifier = modifier + .fillMaxWidth() + .background(color = KusTheme.colors.c_FFFFFF) + .padding(horizontal = 16.dp, vertical = 10.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Row( + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier + .clickable { isAiOn = !isAiOn } + ) { + Image( + painter = painterResource(iconRes), + contentDescription = null, + modifier = Modifier.size(14.dp) + ) + + Text( + text = "AI 기반 티어 보기", + modifier = Modifier.padding(start = 6.dp), + style = KusTheme.typography.type12m.copy(color = KusTheme.colors.c_AAAAAA) + ) + } + + Spacer(modifier = Modifier.weight(1f)) + + Text( + text = "티어란?", + style = KusTheme.typography.type12m.copy( + color = KusTheme.colors.c_666666, + textDecoration = TextDecoration.Underline + ), + modifier = Modifier.clickable(onClick = onTierGuideClick) + ) + } +} + +@Composable +private fun InfiniteScrollEffect( + listState: LazyListState, + buffer: Int = 4, + onLoadMore: () -> Unit, +) { + LaunchedEffect(listState) { + snapshotFlow { + val layoutInfo = listState.layoutInfo + val total = layoutInfo.totalItemsCount + val lastVisible = layoutInfo.visibleItemsInfo.lastOrNull()?.index ?: 0 + total to lastVisible + }.collect { (total, lastVisible) -> + if (total > 0 && lastVisible >= total - 1 - buffer) { + onLoadMore() + } + } + } +} + + diff --git a/shared/feature/tier/src/commonMain/kotlin/com/kus/feature/tier/ui/TierState.kt b/shared/feature/tier/src/commonMain/kotlin/com/kus/feature/tier/ui/TierState.kt index 617b5d2d..ee4e1586 100644 --- a/shared/feature/tier/src/commonMain/kotlin/com/kus/feature/tier/ui/TierState.kt +++ b/shared/feature/tier/src/commonMain/kotlin/com/kus/feature/tier/ui/TierState.kt @@ -70,4 +70,5 @@ data class TierUiState( val categoryChangeMap: Boolean = true, val mapUiState: TierMapUiState = TierMapUiState(), + val toastMessage: String? = null, ) \ No newline at end of file diff --git a/shared/feature/tier/src/commonMain/kotlin/com/kus/feature/tier/ui/TierViewModel.kt b/shared/feature/tier/src/commonMain/kotlin/com/kus/feature/tier/ui/TierViewModel.kt index bb35b0f3..69ecfd17 100644 --- a/shared/feature/tier/src/commonMain/kotlin/com/kus/feature/tier/ui/TierViewModel.kt +++ b/shared/feature/tier/src/commonMain/kotlin/com/kus/feature/tier/ui/TierViewModel.kt @@ -15,6 +15,7 @@ import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch + class TierViewModel( private val getTierRestaurantListUseCase: GetTierRestaurantListUseCase, private val getTierRestaurantMapUseCase: GetTierRestaurantMapUseCase, @@ -22,10 +23,6 @@ class TierViewModel( private val _uiState = MutableStateFlow(TierUiState()) val uiState: StateFlow = _uiState.asStateFlow() - init { - loadRestaurant() - } - fun setShowBottomSheet(show: Boolean) { _uiState.update { it.copy(mapUiState = it.mapUiState.copy(isShowBottomSheet = show)) } } @@ -58,14 +55,6 @@ class TierViewModel( ensureDataForCurrentTab(force = true) } - fun loadRestaurant() { - _uiState.update { it.copy(selectedCategories = it.filterState.selectedCategoriesForDisplay()) } - when (_uiState.value.selectedTab) { - TierTab.LIST -> fetchFirstRestaurants() - TierTab.MAP -> fetchMap() - } - } - fun fetchFirstRestaurants() { _uiState.update { it.copy( @@ -108,6 +97,10 @@ class TierViewModel( } } + fun clearToast() { + _uiState.update { it.copy(toastMessage = null) } + } + fun onTabSelected(tab: TierTab) { _uiState.update { it.copy(selectedTab = tab) } ensureDataForCurrentTab() @@ -139,8 +132,6 @@ class TierViewModel( } } - - fun onRestaurantMarkerClicked(id: Long) { _uiState.update { cur -> cur.copy( @@ -225,8 +216,9 @@ class TierViewModel( }.onFailure { e -> _uiState.update { it.copy( - listState = UiState.Failure(UiError.Message(e.message ?: "loadRestaurantList error")), - pageState = it.pageState.copy(phase = TierPhase.Idle) + listState = UiState.Failure(UiError.Message(e.message ?: "음식점 리스트를 불러오는데 오류가 발생했습니다.")), + pageState = it.pageState.copy(phase = TierPhase.Idle), + toastMessage = "음식점 리스트를 불러오는데 오류가 발생했습니다." ) } } diff --git a/shared/feature/tier/src/commonMain/kotlin/com/kus/feature/tier/ui/category/TierCategorySelectScreen.kt b/shared/feature/tier/src/commonMain/kotlin/com/kus/feature/tier/ui/category/TierCategorySelectScreen.kt index e1cbf7c5..8fa008bf 100644 --- a/shared/feature/tier/src/commonMain/kotlin/com/kus/feature/tier/ui/category/TierCategorySelectScreen.kt +++ b/shared/feature/tier/src/commonMain/kotlin/com/kus/feature/tier/ui/category/TierCategorySelectScreen.kt @@ -126,8 +126,7 @@ fun TierCategorySelectScreen( buttonName = "적용하기", roundedCornerShape = RoundedCornerShape(50.dp), modifier = Modifier - .fillMaxWidth() - .height(32.dp), + .fillMaxWidth() , containerColor = container, borderColor = container, onClick = { onApply(viewModel.buildResult()) } diff --git a/shared/feature/tier/src/commonMain/kotlin/com/kus/feature/tier/ui/list/TierListScreen.kt b/shared/feature/tier/src/commonMain/kotlin/com/kus/feature/tier/ui/list/TierListScreen.kt index 7e812cf0..7ed97fec 100644 --- a/shared/feature/tier/src/commonMain/kotlin/com/kus/feature/tier/ui/list/TierListScreen.kt +++ b/shared/feature/tier/src/commonMain/kotlin/com/kus/feature/tier/ui/list/TierListScreen.kt @@ -2,7 +2,6 @@ package com.kus.feature.tier.ui.list import UiState import androidx.compose.foundation.background -import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -14,7 +13,7 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyListState -import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.lazy.items import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -82,7 +81,7 @@ fun TierListScreen( modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center ) { - CircularProgressIndicator() + CircularProgressIndicator(color = KusTheme.colors.c_43AB38) } } @@ -131,18 +130,19 @@ fun TierListScreen( } else { LazyColumn( state = listState, - modifier = Modifier.fillMaxSize(), + modifier = Modifier.fillMaxSize().background(KusTheme.colors.c_F3F3F3), contentPadding = PaddingValues(start = 16.dp, end = 16.dp, bottom = 18.dp), verticalArrangement = Arrangement.spacedBy(10.dp) ) { + item { Spacer(modifier = Modifier.height(8.dp))} + items( items = list, key = { it.restaurantId } ) { restaurant -> KusRestThumbnail( modifier = Modifier - .fillMaxWidth() - .clickable { onRestaurantClick(restaurant) }, + .fillMaxWidth(), tier = restaurant.mainTier, restName = restaurant.restaurantName, restThumbnail = restaurant.restaurantImgUrl, @@ -163,7 +163,7 @@ fun TierListScreen( .padding(vertical = 14.dp), contentAlignment = Alignment.Center ) { - CircularProgressIndicator() + CircularProgressIndicator(color = KusTheme.colors.c_43AB38) } } } diff --git a/shared/feature/tier/src/commonMain/kotlin/com/kus/feature/tier/ui/popup/TierInfoPopup.kt b/shared/feature/tier/src/commonMain/kotlin/com/kus/feature/tier/ui/popup/TierInfoPopup.kt index b3eddb87..8c0bd524 100644 --- a/shared/feature/tier/src/commonMain/kotlin/com/kus/feature/tier/ui/popup/TierInfoPopup.kt +++ b/shared/feature/tier/src/commonMain/kotlin/com/kus/feature/tier/ui/popup/TierInfoPopup.kt @@ -28,8 +28,8 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.compose.ui.window.Dialog import com.kus.designsystem.theme.KusTheme -import kustaurant.shared.feature.tier.generated.resources.Res -import kustaurant.shared.feature.tier.generated.resources.ic_crown +import kustaurant.shared.core.designsystem.generated.resources.ic_crown +import kustaurant.shared.core.designsystem.generated.resources.Res import org.jetbrains.compose.resources.painterResource @Composable From 17772f06f9fa90a116ab938ea0693562637bf98f Mon Sep 17 00:00:00 2001 From: TaejungKim <92737123+imtaejugkim@users.noreply.github.com> Date: Wed, 11 Mar 2026 00:58:17 +0900 Subject: [PATCH 19/22] =?UTF-8?q?[fix/#31]=20=EB=A8=B8=EC=A7=80=20?= =?UTF-8?q?=EA=B3=BC=EC=A0=95=20=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- composeApp/src/commonMain/kotlin/com/kus/kustaurant/App.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composeApp/src/commonMain/kotlin/com/kus/kustaurant/App.kt b/composeApp/src/commonMain/kotlin/com/kus/kustaurant/App.kt index 24f75e0a..ddf48ed2 100644 --- a/composeApp/src/commonMain/kotlin/com/kus/kustaurant/App.kt +++ b/composeApp/src/commonMain/kotlin/com/kus/kustaurant/App.kt @@ -1,6 +1,5 @@ package com.kus.kustaurant -import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.fillMaxSize @@ -170,6 +169,7 @@ fun SetNavigation() { } } } + } } From ec45b5270c69a35ed8c381a6aef87c4983ac1531 Mon Sep 17 00:00:00 2001 From: TaejungKim <92737123+imtaejugkim@users.noreply.github.com> Date: Wed, 11 Mar 2026 01:06:15 +0900 Subject: [PATCH 20/22] =?UTF-8?q?[ui/#31]=20=EB=A1=9C=EB=94=A9=20=EB=B0=8F?= =?UTF-8?q?=20=EC=8B=A4=ED=8C=A8=20=EC=8B=9C=EB=8F=84=20=EC=83=81=EB=8B=A8?= =?UTF-8?q?=20=EB=B0=94=20=EC=B6=9C=EB=A0=A5=EB=90=98=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kus/feature/evaluate/ui/EvaluateScreen.kt | 160 +++++++++++------- 1 file changed, 97 insertions(+), 63 deletions(-) diff --git a/shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/ui/EvaluateScreen.kt b/shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/ui/EvaluateScreen.kt index 6b719046..d629152e 100644 --- a/shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/ui/EvaluateScreen.kt +++ b/shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/ui/EvaluateScreen.kt @@ -4,6 +4,7 @@ import UiState import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height @@ -23,7 +24,6 @@ import androidx.compose.ui.unit.dp import com.kus.designsystem.component.KusButton import com.kus.designsystem.component.KusTopBar import com.kus.designsystem.theme.KusTheme -import com.kus.designsystem.util.noRippleClickable import com.kus.feature.evaluate.component.EvaluationImage import com.kus.feature.evaluate.component.EvaluationKeyword import com.kus.feature.evaluate.component.EvaluationRestInfoCard @@ -56,43 +56,106 @@ fun EvaluateRoute( } } - when (val evaluationState = uiState.evaluation) { - is UiState.Loading -> { - Box( - modifier = Modifier.fillMaxSize() - .background(color = KusTheme.colors.c_FFFFFF), - contentAlignment = Alignment.Center, - ) { - CircularProgressIndicator(color = KusTheme.colors.c_43AB38) - } - } + Column( + modifier = Modifier + .fillMaxSize() + .background(color = KusTheme.colors.c_FFFFFF) + ) { + EvaluateTopBar(onBackClick = onBackClick) - is UiState.Success -> { - EvaluateSuccessScreen( - restaurant = uiState.restaurant, - evaluation = evaluationState.data, - submitState = uiState.submitState, - onBackClick = onBackClick, - onScoreChanged = { viewModel.updateEvaluationScore(it) }, - onSituationsChanged = { viewModel.updateEvaluationSituations(it) }, - onCommentChanged = { viewModel.updateEvaluationComment(it) }, - onImageSelected = { viewModel.updateImageBytes(it) }, - onSubmitClick = { viewModel.submitEvaluation() }, - ) - } + Box( + modifier = Modifier + .fillMaxWidth() + .weight(1f) + ) { + when (val evaluationState = uiState.evaluation) { + is UiState.Loading, UiState.Idle -> { + Box( + modifier = Modifier.fillMaxSize(), + contentAlignment = Alignment.Center, + ) { + CircularProgressIndicator(color = KusTheme.colors.c_43AB38) + } + } + + is UiState.Success -> { + EvaluateSuccessScreen( + restaurant = uiState.restaurant, + evaluation = evaluationState.data, + submitState = uiState.submitState, + onScoreChanged = { viewModel.updateEvaluationScore(it) }, + onSituationsChanged = { viewModel.updateEvaluationSituations(it) }, + onCommentChanged = { viewModel.updateEvaluationComment(it) }, + onImageSelected = { viewModel.updateImageBytes(it) }, + onSubmitClick = { viewModel.submitEvaluation() }, + ) + } - is UiState.Failure -> { - Box( - modifier = Modifier - .fillMaxSize() - .background(color = KusTheme.colors.c_FFFFFF), - contentAlignment = Alignment.Center, - ) { - Text(text = "서버 연결이 불안정합니다. 다시 시도해주세요.") + is UiState.Failure -> { + EvaluateFailureScreen( + onRetryClick = { viewModel.getPreviousEvaluation(restaurantId) } + ) + } } } + } +} + +@Composable +private fun EvaluateTopBar(onBackClick: () -> Unit) { + Column( + modifier = Modifier + .fillMaxWidth() + ) { + KusTopBar( + leftIcon = painterResource(Res.drawable.ic_arrow_back), + onLeftClicked = onBackClick, + leftIconModifier = Modifier.padding(all = 5.dp), + iconTint = KusTheme.colors.c_000000, + modifier = Modifier + .fillMaxWidth() + .background(KusTheme.colors.c_FFFFFF), + content = { + Text( + text = "평가하기", + style = KusTheme.typography.type17sb + ) + } + ) - is UiState.Idle -> {} + HorizontalDivider( + thickness = 1.dp, + color = KusTheme.colors.c_EAEAEA + ) + } +} + +@Composable +private fun EvaluateFailureScreen(onRetryClick: () -> Unit) { + Column( + modifier = Modifier + .fillMaxSize() + .padding(horizontal = 20.dp), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center, + ) { + Text( + text = "서버 연결이 불안정합니다. 다시 시도해주세요.", + style = KusTheme.typography.type16sb, + color = KusTheme.colors.c_666666, + ) + + Box( + modifier = Modifier + .padding(top = 16.dp) + ) { + KusButton( + enabled = true, + buttonName = "다시 시도", + roundedCornerShape = RoundedCornerShape(50.dp), + onClick = onRetryClick, + ) + } } } @@ -101,7 +164,6 @@ private fun EvaluateSuccessScreen( restaurant: EvaluateRestaurant, evaluation: Evaluation, submitState: UiState, - onBackClick: () -> Unit, onScoreChanged: (Double) -> Unit, onSituationsChanged: (List) -> Unit, onCommentChanged: (String) -> Unit, @@ -156,40 +218,12 @@ private fun EvaluateSuccessScreen( item { Box( modifier = Modifier - .fillMaxWidth() + .fillMaxWidth() .height(72.dp) ) } } - Column( - modifier = Modifier - .fillMaxWidth() - .align(Alignment.TopCenter) - ) { - KusTopBar( - leftIcon = painterResource(Res.drawable.ic_arrow_back), - leftIconModifier = Modifier - .noRippleClickable { onBackClick() } - .padding(all = 5.dp), - iconTint = KusTheme.colors.c_000000, - modifier = Modifier - .fillMaxWidth() - .background(KusTheme.colors.c_FFFFFF), - content = { - Text( - text = "평가하기", - style = KusTheme.typography.type17sb - ) - } - ) - - HorizontalDivider( - thickness = 1.dp, - color = KusTheme.colors.c_EAEAEA - ) - } - Box( modifier = Modifier .background(color = KusTheme.colors.c_FFFFFF) From 16abd9239bf22d941feef848d73da6c1d2901786 Mon Sep 17 00:00:00 2001 From: TaejungKim <92737123+imtaejugkim@users.noreply.github.com> Date: Wed, 11 Mar 2026 01:21:30 +0900 Subject: [PATCH 21/22] =?UTF-8?q?[chore/#31]=20=EC=9E=90=EA=B0=84=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- composeApp/src/commonMain/kotlin/com/kus/kustaurant/App.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/composeApp/src/commonMain/kotlin/com/kus/kustaurant/App.kt b/composeApp/src/commonMain/kotlin/com/kus/kustaurant/App.kt index ddf48ed2..9c0a4988 100644 --- a/composeApp/src/commonMain/kotlin/com/kus/kustaurant/App.kt +++ b/composeApp/src/commonMain/kotlin/com/kus/kustaurant/App.kt @@ -117,7 +117,7 @@ fun SetNavigation() { val showBottomBar = shouldShowBottomBar(destination) val currentRoute = destination?.route val selectedKey = BottomTab.fromRoute(currentRoute).key - + val applySystemBarsPadding = !isEdgeToEdgeScreen(currentRoute) val isWriter = navBackStackEntry?.destination?.hasRoute() == true || @@ -135,7 +135,7 @@ fun SetNavigation() { navController = navController, ) }, - modifier = if (applySystemBarsPadding) Modifier.systemBarsPadding() else Modifier, + modifier = if (applySystemBarsPadding) Modifier.systemBarsPadding() else Modifier, contentWindowInsets = WindowInsets.systemBars, ) { padding -> Box( From 9b1e8fbef920f576a84211cbaee7fc8d3da9c52e Mon Sep 17 00:00:00 2001 From: TaejungKim <92737123+imtaejugkim@users.noreply.github.com> Date: Wed, 11 Mar 2026 23:08:04 +0900 Subject: [PATCH 22/22] =?UTF-8?q?[feat/#31]=20=ED=8F=89=EA=B0=80=20?= =?UTF-8?q?=EC=99=84=EB=A3=8C=20=EC=8B=9C=20=EC=83=81=EC=84=B8=ED=99=94?= =?UTF-8?q?=EB=A9=B4=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EA=B0=B1=EC=8B=A0=20?= =?UTF-8?q?=EB=B0=8F=20UI=20=EB=B3=B5=EA=B5=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/kus/kustaurant/navigation/KusNavHost.kt | 12 ++++++++++-- .../com/kus/feature/detail/config/DetailKeys.kt | 5 +++++ .../kus/feature/detail/navigation/DetailNavGraph.kt | 11 +++++++++++ .../kotlin/com/kus/feature/detail/ui/DetailScreen.kt | 8 ++++++++ .../com/kus/feature/detail/ui/DetailViewModel.kt | 9 +++++++++ .../feature/evaluate/navigation/EvaluateNavGraph.kt | 2 ++ .../com/kus/feature/evaluate/ui/EvaluateScreen.kt | 3 ++- 7 files changed, 47 insertions(+), 3 deletions(-) create mode 100644 shared/feature/detail/src/commonMain/kotlin/com/kus/feature/detail/config/DetailKeys.kt diff --git a/composeApp/src/commonMain/kotlin/com/kus/kustaurant/navigation/KusNavHost.kt b/composeApp/src/commonMain/kotlin/com/kus/kustaurant/navigation/KusNavHost.kt index 14001c75..477c4218 100644 --- a/composeApp/src/commonMain/kotlin/com/kus/kustaurant/navigation/KusNavHost.kt +++ b/composeApp/src/commonMain/kotlin/com/kus/kustaurant/navigation/KusNavHost.kt @@ -21,6 +21,7 @@ import com.kus.feature.community.navigation.CommunityWrite import com.kus.feature.community.navigation.CommunityWriteModify import com.kus.feature.community.navigation.communityNavGraph import com.kus.feature.detail.navigation.Detail +import com.kus.feature.detail.config.DetailKeys.DETAIL_EVALUATE_REFRESH import com.kus.feature.detail.navigation.detailNavGraph import com.kus.feature.draw.navigation.drawNavGraph import com.kus.feature.evaluate.navigation.Evaluate @@ -246,7 +247,14 @@ fun KusNavHost( ) evaluateNavGraph( - onBackClick = { navController.popBackStack() } + onBackClick = { navController.popBackStack() }, + onSubmitSuccess = { + navController.previousBackStackEntry + ?.savedStateHandle + ?.set(DETAIL_EVALUATE_REFRESH, true) + + navController.popBackStack() + } ) searchNavGraph( @@ -254,4 +262,4 @@ fun KusNavHost( navigateToRestDetail = { /* Todo: 상세화면 연결 */ }, ) } -} \ No newline at end of file +} diff --git a/shared/feature/detail/src/commonMain/kotlin/com/kus/feature/detail/config/DetailKeys.kt b/shared/feature/detail/src/commonMain/kotlin/com/kus/feature/detail/config/DetailKeys.kt new file mode 100644 index 00000000..9b5cfbaf --- /dev/null +++ b/shared/feature/detail/src/commonMain/kotlin/com/kus/feature/detail/config/DetailKeys.kt @@ -0,0 +1,5 @@ +package com.kus.feature.detail.config + +object DetailKeys { + const val DETAIL_EVALUATE_REFRESH = "detail_evaluate_refresh" +} diff --git a/shared/feature/detail/src/commonMain/kotlin/com/kus/feature/detail/navigation/DetailNavGraph.kt b/shared/feature/detail/src/commonMain/kotlin/com/kus/feature/detail/navigation/DetailNavGraph.kt index 024f4e3d..62a1374f 100644 --- a/shared/feature/detail/src/commonMain/kotlin/com/kus/feature/detail/navigation/DetailNavGraph.kt +++ b/shared/feature/detail/src/commonMain/kotlin/com/kus/feature/detail/navigation/DetailNavGraph.kt @@ -1,8 +1,11 @@ package com.kus.feature.detail.navigation +import androidx.compose.runtime.getValue +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.navigation.NavGraphBuilder import androidx.navigation.compose.composable import androidx.navigation.toRoute +import com.kus.feature.detail.config.DetailKeys import com.kus.feature.detail.ui.DetailRoute import com.kus.shared.domain.model.detail.RestaurantDetail import kotlinx.serialization.Serializable @@ -16,10 +19,18 @@ fun NavGraphBuilder.detailNavGraph( ) { composable { backStackEntry -> val route = backStackEntry.toRoute() + val shouldRefreshFromEvaluate by backStackEntry.savedStateHandle + .getStateFlow(DetailKeys.DETAIL_EVALUATE_REFRESH, false) + .collectAsStateWithLifecycle() + DetailRoute( restaurantId = route.restaurantId, navigateToEvaluate = navigateToEvaluate, navigateToUp = navigateToUp, + shouldRefreshFromEvaluate = shouldRefreshFromEvaluate, + clearEvaluateRefreshFlag = { + backStackEntry.savedStateHandle[DetailKeys.DETAIL_EVALUATE_REFRESH] = false + }, ) } } diff --git a/shared/feature/detail/src/commonMain/kotlin/com/kus/feature/detail/ui/DetailScreen.kt b/shared/feature/detail/src/commonMain/kotlin/com/kus/feature/detail/ui/DetailScreen.kt index b352b9d4..57b5e33c 100644 --- a/shared/feature/detail/src/commonMain/kotlin/com/kus/feature/detail/ui/DetailScreen.kt +++ b/shared/feature/detail/src/commonMain/kotlin/com/kus/feature/detail/ui/DetailScreen.kt @@ -67,6 +67,8 @@ fun DetailRoute( restaurantId: Long = 510L, navigateToEvaluate: (RestaurantDetail) -> Unit, navigateToUp: () -> Unit, + shouldRefreshFromEvaluate: Boolean = false, + clearEvaluateRefreshFlag: () -> Unit = {}, viewModel: DetailViewModel = koinViewModel(), ) { val uiState by viewModel.uiState.collectAsStateWithLifecycle() @@ -75,6 +77,12 @@ fun DetailRoute( viewModel.getRestaurantDetail(restaurantId) } + LaunchedEffect(shouldRefreshFromEvaluate) { + if (!shouldRefreshFromEvaluate) return@LaunchedEffect + viewModel.refreshAfterEvaluation() + clearEvaluateRefreshFlag() + } + when (val restaurantState = uiState.restaurant) { is UiState.Loading -> { Box( diff --git a/shared/feature/detail/src/commonMain/kotlin/com/kus/feature/detail/ui/DetailViewModel.kt b/shared/feature/detail/src/commonMain/kotlin/com/kus/feature/detail/ui/DetailViewModel.kt index 2ea21636..3bf34744 100644 --- a/shared/feature/detail/src/commonMain/kotlin/com/kus/feature/detail/ui/DetailViewModel.kt +++ b/shared/feature/detail/src/commonMain/kotlin/com/kus/feature/detail/ui/DetailViewModel.kt @@ -86,6 +86,15 @@ class DetailViewModel( } } + fun refreshAfterEvaluation() { + if (currentRestaurantId == 0L) return + getRestaurantDetail(currentRestaurantId) + + if (_uiState.value.reviews !is UiState.Idle) { + getRestaurantReviews(_uiState.value.reviewSort) + } + } + fun onReviewLikeClick(evalId: Int) { onReviewReactionClick(evalId, targetReaction = "LIKE") } diff --git a/shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/navigation/EvaluateNavGraph.kt b/shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/navigation/EvaluateNavGraph.kt index bfab7fa2..617ee290 100644 --- a/shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/navigation/EvaluateNavGraph.kt +++ b/shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/navigation/EvaluateNavGraph.kt @@ -22,6 +22,7 @@ data class Evaluate( fun NavGraphBuilder.evaluateNavGraph( onBackClick: () -> Unit, + onSubmitSuccess: () -> Unit, ) { composable { backStackEntry -> val evaluate = backStackEntry.toRoute() @@ -39,6 +40,7 @@ fun NavGraphBuilder.evaluateNavGraph( partnershipInfo = evaluate.partnershipInfo, ), onBackClick = onBackClick, + onSubmitSuccess = onSubmitSuccess, ) } } diff --git a/shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/ui/EvaluateScreen.kt b/shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/ui/EvaluateScreen.kt index d629152e..c4087dfa 100644 --- a/shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/ui/EvaluateScreen.kt +++ b/shared/feature/evaluate/src/commonMain/kotlin/com/kus/feature/evaluate/ui/EvaluateScreen.kt @@ -41,6 +41,7 @@ fun EvaluateRoute( restaurantId: Long, restaurant: EvaluateRestaurant, onBackClick: () -> Unit, + onSubmitSuccess: () -> Unit, viewModel: EvaluateViewModel = koinViewModel(), ) { val uiState by viewModel.uiState.collectAsState() @@ -52,7 +53,7 @@ fun EvaluateRoute( LaunchedEffect(uiState.submitState) { if (uiState.submitState is UiState.Success) { - onBackClick() + onSubmitSuccess() } }