From 1aa48801114d02e547fb1007baf64d0ccdb29b0b Mon Sep 17 00:00:00 2001 From: s9hn Date: Wed, 25 Sep 2024 16:23:52 +0900 Subject: [PATCH 01/20] =?UTF-8?q?feat:=20TodayFortuneBox=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../component/FortuneDetailBox.kt | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortundDetail/component/FortuneDetailBox.kt diff --git a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortundDetail/component/FortuneDetailBox.kt b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortundDetail/component/FortuneDetailBox.kt new file mode 100644 index 00000000..70cb3e54 --- /dev/null +++ b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortundDetail/component/FortuneDetailBox.kt @@ -0,0 +1,43 @@ +package org.sopt.official.feature.fortune.feature.fortundDetail.component + +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.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.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import org.sopt.official.designsystem.Gray700 + +@Composable +internal fun TodayFortuneBox( + content: @Composable () -> Unit, + modifier: Modifier = Modifier, +) { + Box( + contentAlignment = Alignment.Center, + modifier = modifier + .fillMaxWidth() + .padding(horizontal = 20.dp) + .background( + color = Gray700, + shape = RoundedCornerShape(12.dp), + ), + ) { + content() + } +} + +@Preview(showBackground = true) +@Composable +private fun TodayFortuneBoxPreview() { + TodayFortuneBox( + content = { Text("123") }, + modifier = Modifier.background(color = Color.White), + ) +} From 427fcc11481660cfefb06b78b0e6ff933858e05c Mon Sep 17 00:00:00 2001 From: s9hn Date: Wed, 25 Sep 2024 16:24:15 +0900 Subject: [PATCH 02/20] =?UTF-8?q?feat:=20=EC=98=A4=EB=8A=98=EC=9D=98=20?= =?UTF-8?q?=EC=9A=B4=EC=84=B8(TodayFortuneDashboard)=20UI=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../component/TodayFortuneDashboard.kt | 83 +++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortundDetail/component/TodayFortuneDashboard.kt diff --git a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortundDetail/component/TodayFortuneDashboard.kt b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortundDetail/component/TodayFortuneDashboard.kt new file mode 100644 index 00000000..cc494707 --- /dev/null +++ b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortundDetail/component/TodayFortuneDashboard.kt @@ -0,0 +1,83 @@ +/* + * MIT License + * Copyright 2024 SOPT - Shout Our Passion Together + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package org.sopt.official.feature.fortune.feature.fortundDetail.component + +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.height +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import org.sopt.official.designsystem.Gray100 +import org.sopt.official.designsystem.Gray30 +import org.sopt.official.designsystem.SoptTheme +import org.sopt.official.feature.fortune.R + +@Composable +fun TodayFortuneDashboard( + date: String, + modifier: Modifier = Modifier, +) { + TodayFortuneBox( + content = { + Column( + horizontalAlignment = Alignment.CenterHorizontally, + modifier = modifier, + ) { + Spacer(modifier = Modifier.height(height = 32.dp)) + Image( + painter = painterResource(R.drawable.img_fortune_title), + contentDescription = "오늘의 솝마디", + ) + Spacer(modifier = Modifier.height(height = 10.dp)) + Text( + text = date, + style = SoptTheme.typography.title18SB, + color = Gray100, + ) + Spacer(modifier = Modifier.height(height = 20.dp)) + Text( + text = date, + style = SoptTheme.typography.title24SB, + color = Gray30, + ) + Spacer(modifier = Modifier.height(height = 36.dp)) + } + } + ) +} + +@Preview(showBackground = true) +@Composable +private fun TodayFortuneDashboardPreview() { + SoptTheme { + TodayFortuneDashboard(date = "123") + } +} From 1a75a66bd742fa34cded156e2bfb0c32f790506a Mon Sep 17 00:00:00 2001 From: s9hn Date: Wed, 25 Sep 2024 16:24:41 +0900 Subject: [PATCH 03/20] =?UTF-8?q?feat:=20FortuneDetailRoute,=20FortuneDeta?= =?UTF-8?q?ilScreen=20=ED=8C=8C=EC=9D=BC=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fortundDetail/FortuneDetailRoute.kt | 17 +++++++ .../fortundDetail/FortuneDetailScreen.kt | 45 +++++-------------- 2 files changed, 27 insertions(+), 35 deletions(-) create mode 100644 feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortundDetail/FortuneDetailRoute.kt diff --git a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortundDetail/FortuneDetailRoute.kt b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortundDetail/FortuneDetailRoute.kt new file mode 100644 index 00000000..b5f3470b --- /dev/null +++ b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortundDetail/FortuneDetailRoute.kt @@ -0,0 +1,17 @@ +package org.sopt.official.feature.fortune.feature.fortundDetail + +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.runtime.Composable + +@Composable +internal fun FortuneDetailRoute( + paddingValue: PaddingValues, + date: String, + navigateToFortuneAmulet: () -> Unit, +) { + FortuneDetailScreen( + paddingValue = paddingValue, + date = date, + navigateToFortuneAmulet = navigateToFortuneAmulet + ) +} diff --git a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortundDetail/FortuneDetailScreen.kt b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortundDetail/FortuneDetailScreen.kt index a66f6044..e6eedd04 100644 --- a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortundDetail/FortuneDetailScreen.kt +++ b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortundDetail/FortuneDetailScreen.kt @@ -30,65 +30,40 @@ import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding -import androidx.compose.material3.Button -import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import org.sopt.official.designsystem.SoptTheme +import org.sopt.official.feature.fortune.feature.fortundDetail.component.TodayFortuneDashboard @Composable -fun FortuneDetailRoute( - paddingValue: PaddingValues, - date: String, - navigateToFortuneAmulet: () -> Unit, -) { - FortuneDetailScreen( - paddingValue = paddingValue, - date = date, - navigateToFortuneAmulet = navigateToFortuneAmulet - ) -} - -@Composable -fun FortuneDetailScreen( +internal fun FortuneDetailScreen( paddingValue: PaddingValues, date: String, navigateToFortuneAmulet: () -> Unit, + modifier: Modifier = Modifier, ) { Column( - modifier = Modifier - .padding(paddingValue) + horizontalAlignment = Alignment.CenterHorizontally, + modifier = modifier + .padding(paddingValues = paddingValue) .fillMaxSize(), - horizontalAlignment = Alignment.CenterHorizontally ) { - Text( - text = "Fortune Detail Screen: $date", - color = SoptTheme.colors.onBackground - ) - - Spacer(modifier = Modifier.weight(1f)) - - Button( - onClick = navigateToFortuneAmulet - ) { - Text(text = "Go to Fortune Amulet") - } - Spacer(modifier = Modifier.height(50.dp)) + Spacer(modifier = Modifier.height(height = 16.dp)) + TodayFortuneDashboard(date) } } - @Preview @Composable -fun FortuneDetailScreenPreview() { +private fun FortuneDetailScreenPreview() { SoptTheme { FortuneDetailScreen( paddingValue = PaddingValues(16.dp), date = "2024-09-09", - navigateToFortuneAmulet = {} + navigateToFortuneAmulet = {}, ) } } From e265c4e0ed5cf3d9336fcabefbb4cc593c22c157 Mon Sep 17 00:00:00 2001 From: s9hn Date: Wed, 25 Sep 2024 16:31:40 +0900 Subject: [PATCH 04/20] =?UTF-8?q?refactor:=20=ED=8C=A8=ED=82=A4=EC=A7=80?= =?UTF-8?q?=20=EB=84=A4=EC=9D=B4=EB=B0=8D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sopt/official/feature/fortune/FoundationScreen.kt | 4 ++-- .../FortuneDetailRoute.kt | 2 +- .../FortuneDetailScreen.kt | 10 +++++----- .../component/FortuneDetailBox.kt | 2 +- .../component/TodayFortuneDashboard.kt | 2 +- .../navigation/FortuneDetailNavGraph.kt | 4 ++-- 6 files changed, 12 insertions(+), 12 deletions(-) rename feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/{fortundDetail => fortuneDetail}/FortuneDetailRoute.kt (85%) rename feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/{fortundDetail => fortuneDetail}/FortuneDetailScreen.kt (89%) rename feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/{fortundDetail => fortuneDetail}/component/FortuneDetailBox.kt (95%) rename feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/{fortundDetail => fortuneDetail}/component/TodayFortuneDashboard.kt (97%) rename feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/{fortundDetail => fortuneDetail}/navigation/FortuneDetailNavGraph.kt (93%) diff --git a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/FoundationScreen.kt b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/FoundationScreen.kt index 9164495c..cb155d8f 100644 --- a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/FoundationScreen.kt +++ b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/FoundationScreen.kt @@ -37,8 +37,8 @@ import androidx.navigation.compose.NavHost import androidx.navigation.compose.rememberNavController import org.sopt.official.designsystem.SoptTheme import org.sopt.official.feature.fortune.component.FortuneTopBar -import org.sopt.official.feature.fortune.feature.fortundDetail.navigation.FortuneDetail -import org.sopt.official.feature.fortune.feature.fortundDetail.navigation.fortuneDetailNavGraph +import org.sopt.official.feature.fortune.feature.fortuneDetail.navigation.FortuneDetail +import org.sopt.official.feature.fortune.feature.fortuneDetail.navigation.fortuneDetailNavGraph import org.sopt.official.feature.fortune.feature.fortuneAmulet.navigation.FortuneAmulet import org.sopt.official.feature.fortune.feature.fortuneAmulet.navigation.fortuneAmuletNavGraph import org.sopt.official.feature.fortune.feature.home.navigation.Home diff --git a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortundDetail/FortuneDetailRoute.kt b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/FortuneDetailRoute.kt similarity index 85% rename from feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortundDetail/FortuneDetailRoute.kt rename to feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/FortuneDetailRoute.kt index b5f3470b..e18304de 100644 --- a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortundDetail/FortuneDetailRoute.kt +++ b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/FortuneDetailRoute.kt @@ -1,4 +1,4 @@ -package org.sopt.official.feature.fortune.feature.fortundDetail +package org.sopt.official.feature.fortune.feature.fortuneDetail import androidx.compose.foundation.layout.PaddingValues import androidx.compose.runtime.Composable diff --git a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortundDetail/FortuneDetailScreen.kt b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/FortuneDetailScreen.kt similarity index 89% rename from feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortundDetail/FortuneDetailScreen.kt rename to feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/FortuneDetailScreen.kt index e6eedd04..a6b2f86f 100644 --- a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortundDetail/FortuneDetailScreen.kt +++ b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/FortuneDetailScreen.kt @@ -22,7 +22,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ -package org.sopt.official.feature.fortune.feature.fortundDetail +package org.sopt.official.feature.fortune.feature.fortuneDetail import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues @@ -36,7 +36,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import org.sopt.official.designsystem.SoptTheme -import org.sopt.official.feature.fortune.feature.fortundDetail.component.TodayFortuneDashboard +import org.sopt.official.feature.fortune.feature.fortuneDetail.component.TodayFortuneDashboard @Composable internal fun FortuneDetailScreen( @@ -48,8 +48,8 @@ internal fun FortuneDetailScreen( Column( horizontalAlignment = Alignment.CenterHorizontally, modifier = modifier - .padding(paddingValues = paddingValue) - .fillMaxSize(), + .fillMaxSize() + .padding(paddingValues = paddingValue), ) { Spacer(modifier = Modifier.height(height = 16.dp)) TodayFortuneDashboard(date) @@ -61,7 +61,7 @@ internal fun FortuneDetailScreen( private fun FortuneDetailScreenPreview() { SoptTheme { FortuneDetailScreen( - paddingValue = PaddingValues(16.dp), + paddingValue = PaddingValues(vertical = 16.dp), date = "2024-09-09", navigateToFortuneAmulet = {}, ) diff --git a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortundDetail/component/FortuneDetailBox.kt b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/component/FortuneDetailBox.kt similarity index 95% rename from feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortundDetail/component/FortuneDetailBox.kt rename to feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/component/FortuneDetailBox.kt index 70cb3e54..d250065d 100644 --- a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortundDetail/component/FortuneDetailBox.kt +++ b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/component/FortuneDetailBox.kt @@ -1,4 +1,4 @@ -package org.sopt.official.feature.fortune.feature.fortundDetail.component +package org.sopt.official.feature.fortune.feature.fortuneDetail.component import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box diff --git a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortundDetail/component/TodayFortuneDashboard.kt b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/component/TodayFortuneDashboard.kt similarity index 97% rename from feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortundDetail/component/TodayFortuneDashboard.kt rename to feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/component/TodayFortuneDashboard.kt index cc494707..7f1512b1 100644 --- a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortundDetail/component/TodayFortuneDashboard.kt +++ b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/component/TodayFortuneDashboard.kt @@ -22,7 +22,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ -package org.sopt.official.feature.fortune.feature.fortundDetail.component +package org.sopt.official.feature.fortune.feature.fortuneDetail.component import androidx.compose.foundation.Image import androidx.compose.foundation.layout.Column diff --git a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortundDetail/navigation/FortuneDetailNavGraph.kt b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/navigation/FortuneDetailNavGraph.kt similarity index 93% rename from feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortundDetail/navigation/FortuneDetailNavGraph.kt rename to feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/navigation/FortuneDetailNavGraph.kt index 731995b4..c1be1f0b 100644 --- a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortundDetail/navigation/FortuneDetailNavGraph.kt +++ b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/navigation/FortuneDetailNavGraph.kt @@ -22,14 +22,14 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ -package org.sopt.official.feature.fortune.feature.fortundDetail.navigation +package org.sopt.official.feature.fortune.feature.fortuneDetail.navigation import androidx.compose.foundation.layout.PaddingValues import androidx.navigation.NavGraphBuilder import androidx.navigation.compose.composable import androidx.navigation.toRoute import kotlinx.serialization.Serializable -import org.sopt.official.feature.fortune.feature.fortundDetail.FortuneDetailRoute +import org.sopt.official.feature.fortune.feature.fortuneDetail.FortuneDetailRoute @Serializable data class FortuneDetail(val date: String) From 3b483acb1ffc47584881abf48a2282b21d1794d0 Mon Sep 17 00:00:00 2001 From: s9hn Date: Wed, 25 Sep 2024 17:45:51 +0900 Subject: [PATCH 05/20] =?UTF-8?q?feat:=20fortune=20=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=EB=A0=88=EC=9D=B4=EC=96=B4=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - di 모듈 추가 - network api 구현 --- data/fortune/.gitignore | 1 + data/fortune/build.gradle.kts | 39 +++++++++++++++++++ data/fortune/consumer-rules.pro | 0 data/fortune/src/main/AndroidManifest.xml | 4 ++ .../official/data/fortune/di/ApiModule.kt | 20 ++++++++++ .../data/fortune/di/RepositoryModule.kt | 18 +++++++++ .../data/fortune/remote/api/FortuneApi.kt | 17 ++++++++ .../response/TodayFortuneCardResponse.kt | 16 ++++++++ .../response/TodayFortuneWordResponse.kt | 12 ++++++ .../repository/DefaultFortuneRepository.kt | 17 ++++++++ settings.gradle.kts | 2 + 11 files changed, 146 insertions(+) create mode 100644 data/fortune/.gitignore create mode 100644 data/fortune/build.gradle.kts create mode 100644 data/fortune/consumer-rules.pro create mode 100644 data/fortune/src/main/AndroidManifest.xml create mode 100644 data/fortune/src/main/java/org/sopt/official/data/fortune/di/ApiModule.kt create mode 100644 data/fortune/src/main/java/org/sopt/official/data/fortune/di/RepositoryModule.kt create mode 100644 data/fortune/src/main/java/org/sopt/official/data/fortune/remote/api/FortuneApi.kt create mode 100644 data/fortune/src/main/java/org/sopt/official/data/fortune/remote/response/TodayFortuneCardResponse.kt create mode 100644 data/fortune/src/main/java/org/sopt/official/data/fortune/remote/response/TodayFortuneWordResponse.kt create mode 100644 data/fortune/src/main/java/org/sopt/official/data/fortune/repository/DefaultFortuneRepository.kt diff --git a/data/fortune/.gitignore b/data/fortune/.gitignore new file mode 100644 index 00000000..42afabfd --- /dev/null +++ b/data/fortune/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/data/fortune/build.gradle.kts b/data/fortune/build.gradle.kts new file mode 100644 index 00000000..99ec89b3 --- /dev/null +++ b/data/fortune/build.gradle.kts @@ -0,0 +1,39 @@ +/* + * MIT License + * Copyright 2023-2024 SOPT - Shout Our Passion Together + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +plugins { + sopt("feature") +} + +android { + namespace = "org.sopt.official.data.fortune" +} + +dependencies { + implementation(projects.core.network) + implementation(projects.core.common) + implementation(platform(libs.okhttp.bom)) + implementation(libs.bundles.okhttp) +} diff --git a/data/fortune/consumer-rules.pro b/data/fortune/consumer-rules.pro new file mode 100644 index 00000000..e69de29b diff --git a/data/fortune/src/main/AndroidManifest.xml b/data/fortune/src/main/AndroidManifest.xml new file mode 100644 index 00000000..8bdb7e14 --- /dev/null +++ b/data/fortune/src/main/AndroidManifest.xml @@ -0,0 +1,4 @@ + + + + diff --git a/data/fortune/src/main/java/org/sopt/official/data/fortune/di/ApiModule.kt b/data/fortune/src/main/java/org/sopt/official/data/fortune/di/ApiModule.kt new file mode 100644 index 00000000..a630f13b --- /dev/null +++ b/data/fortune/src/main/java/org/sopt/official/data/fortune/di/ApiModule.kt @@ -0,0 +1,20 @@ +package org.sopt.official.data.fortune.di + +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import org.sopt.official.common.di.AppRetrofit +import org.sopt.official.data.fortune.remote.api.FortuneApi +import retrofit2.Retrofit +import retrofit2.create +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +object ApiModule { + + @Provides + @Singleton + fun provideNovelApi(@AppRetrofit retrofit: Retrofit): FortuneApi = retrofit.create() +} diff --git a/data/fortune/src/main/java/org/sopt/official/data/fortune/di/RepositoryModule.kt b/data/fortune/src/main/java/org/sopt/official/data/fortune/di/RepositoryModule.kt new file mode 100644 index 00000000..99aa7125 --- /dev/null +++ b/data/fortune/src/main/java/org/sopt/official/data/fortune/di/RepositoryModule.kt @@ -0,0 +1,18 @@ +package org.sopt.official.data.fortune.di + +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import org.sopt.official.data.fortune.remote.api.FortuneApi +import org.sopt.official.data.fortune.repository.DefaultFortuneRepository +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +object RepositoryModule { + + @Provides + @Singleton + fun provideDefaultFortuneRepository(fortuneApi: FortuneApi): DefaultFortuneRepository = DefaultFortuneRepository(fortuneApi) +} diff --git a/data/fortune/src/main/java/org/sopt/official/data/fortune/remote/api/FortuneApi.kt b/data/fortune/src/main/java/org/sopt/official/data/fortune/remote/api/FortuneApi.kt new file mode 100644 index 00000000..3b4d0bb8 --- /dev/null +++ b/data/fortune/src/main/java/org/sopt/official/data/fortune/remote/api/FortuneApi.kt @@ -0,0 +1,17 @@ +package org.sopt.official.data.fortune.remote.api + +import org.sopt.official.data.fortune.remote.response.TodayFortuneCardResponse +import org.sopt.official.data.fortune.remote.response.TodayFortuneWordResponse +import retrofit2.http.GET +import retrofit2.http.Query + +interface FortuneApi { + + @GET("/api/v2/fortune/word") + suspend fun getTodayFortuneWord( + @Query("todayDate") todayDate: String, + ): TodayFortuneWordResponse + + @GET("/api/v2/fortune/card/today") + suspend fun getTodayFortuneCard(): TodayFortuneCardResponse +} diff --git a/data/fortune/src/main/java/org/sopt/official/data/fortune/remote/response/TodayFortuneCardResponse.kt b/data/fortune/src/main/java/org/sopt/official/data/fortune/remote/response/TodayFortuneCardResponse.kt new file mode 100644 index 00000000..be91b4b7 --- /dev/null +++ b/data/fortune/src/main/java/org/sopt/official/data/fortune/remote/response/TodayFortuneCardResponse.kt @@ -0,0 +1,16 @@ +package org.sopt.official.data.fortune.remote.response + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class TodayFortuneCardResponse( + @SerialName("description") + val description: String, + @SerialName("imageColorCode") + val imageColorCode: String, + @SerialName("imageUrl") + val imageUrl: String, + @SerialName("name") + val name: String, +) diff --git a/data/fortune/src/main/java/org/sopt/official/data/fortune/remote/response/TodayFortuneWordResponse.kt b/data/fortune/src/main/java/org/sopt/official/data/fortune/remote/response/TodayFortuneWordResponse.kt new file mode 100644 index 00000000..36144267 --- /dev/null +++ b/data/fortune/src/main/java/org/sopt/official/data/fortune/remote/response/TodayFortuneWordResponse.kt @@ -0,0 +1,12 @@ +package org.sopt.official.data.fortune.remote.response + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class TodayFortuneWordResponse( + @SerialName("userName") + val userName: String, + @SerialName("title") + val title: String, +) diff --git a/data/fortune/src/main/java/org/sopt/official/data/fortune/repository/DefaultFortuneRepository.kt b/data/fortune/src/main/java/org/sopt/official/data/fortune/repository/DefaultFortuneRepository.kt new file mode 100644 index 00000000..5417f0e7 --- /dev/null +++ b/data/fortune/src/main/java/org/sopt/official/data/fortune/repository/DefaultFortuneRepository.kt @@ -0,0 +1,17 @@ +package org.sopt.official.data.fortune.repository + +import org.sopt.official.data.fortune.remote.api.FortuneApi +import javax.inject.Inject + +class DefaultFortuneRepository @Inject constructor( + private val fortuneApi: FortuneApi, +) { + + suspend fun fetchTodayFortuneWord() { + fortuneApi + } + + suspend fun fetchTodayFortuneCard() { + fortuneApi + } +} diff --git a/settings.gradle.kts b/settings.gradle.kts index 81a7a14e..d9b6f8ed 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -41,3 +41,5 @@ include( ":feature:poke", ":feature:fortune" ) +include(":domain:fortune") +include(":data:fortune") From 4241e3f8b957aaaf6cc40f2d898b3fb168036958 Mon Sep 17 00:00:00 2001 From: s9hn Date: Wed, 25 Sep 2024 18:07:44 +0900 Subject: [PATCH 06/20] =?UTF-8?q?feat:=20fortune=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=EB=A0=88=EC=9D=B4=EC=96=B4=20=EA=B5=AC=ED=98=84,=20in?= =?UTF-8?q?ternal=20=ED=82=A4=EC=9B=8C=EB=93=9C=20=EC=9D=BC=EA=B4=84=20?= =?UTF-8?q?=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - mapper 구현 - 레포지토리 인터페이스 생성 및 적용 - 힐트모듈 수정 --- data/fortune/build.gradle.kts | 1 + .../official/data/fortune/di/ApiModule.kt | 2 +- .../data/fortune/di/RepositoryModule.kt | 10 +++--- .../data/fortune/mapper/FortuneMapper.kt | 18 ++++++++++ .../data/fortune/remote/api/FortuneApi.kt | 6 ++-- .../response/TodayFortuneCardResponse.kt | 2 +- .../response/TodayFortuneWordResponse.kt | 2 +- .../repository/DefaultFortuneRepository.kt | 16 ++++----- domain/fortune/.gitignore | 1 + domain/fortune/build.gradle.kts | 36 +++++++++++++++++++ .../domain/fortune/model/TodayFortuneCard.kt | 8 +++++ .../domain/fortune/model/TodayFortuneWord.kt | 6 ++++ .../fortune/repository/FortuneRepository.kt | 9 +++++ settings.gradle.kts | 2 +- 14 files changed, 99 insertions(+), 20 deletions(-) create mode 100644 data/fortune/src/main/java/org/sopt/official/data/fortune/mapper/FortuneMapper.kt create mode 100644 domain/fortune/.gitignore create mode 100644 domain/fortune/build.gradle.kts create mode 100644 domain/fortune/src/main/java/org/sopt/official/domain/fortune/model/TodayFortuneCard.kt create mode 100644 domain/fortune/src/main/java/org/sopt/official/domain/fortune/model/TodayFortuneWord.kt create mode 100644 domain/fortune/src/main/java/org/sopt/official/domain/fortune/repository/FortuneRepository.kt diff --git a/data/fortune/build.gradle.kts b/data/fortune/build.gradle.kts index 99ec89b3..d1631627 100644 --- a/data/fortune/build.gradle.kts +++ b/data/fortune/build.gradle.kts @@ -32,6 +32,7 @@ android { } dependencies { + implementation(projects.domain.fortune) implementation(projects.core.network) implementation(projects.core.common) implementation(platform(libs.okhttp.bom)) diff --git a/data/fortune/src/main/java/org/sopt/official/data/fortune/di/ApiModule.kt b/data/fortune/src/main/java/org/sopt/official/data/fortune/di/ApiModule.kt index a630f13b..04178e0f 100644 --- a/data/fortune/src/main/java/org/sopt/official/data/fortune/di/ApiModule.kt +++ b/data/fortune/src/main/java/org/sopt/official/data/fortune/di/ApiModule.kt @@ -12,7 +12,7 @@ import javax.inject.Singleton @Module @InstallIn(SingletonComponent::class) -object ApiModule { +internal object ApiModule { @Provides @Singleton diff --git a/data/fortune/src/main/java/org/sopt/official/data/fortune/di/RepositoryModule.kt b/data/fortune/src/main/java/org/sopt/official/data/fortune/di/RepositoryModule.kt index 99aa7125..d720c093 100644 --- a/data/fortune/src/main/java/org/sopt/official/data/fortune/di/RepositoryModule.kt +++ b/data/fortune/src/main/java/org/sopt/official/data/fortune/di/RepositoryModule.kt @@ -1,18 +1,18 @@ package org.sopt.official.data.fortune.di +import dagger.Binds import dagger.Module -import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent -import org.sopt.official.data.fortune.remote.api.FortuneApi import org.sopt.official.data.fortune.repository.DefaultFortuneRepository +import org.sopt.official.domain.fortune.repository.FortuneRepository import javax.inject.Singleton @Module @InstallIn(SingletonComponent::class) -object RepositoryModule { +internal interface RepositoryModule { - @Provides + @Binds @Singleton - fun provideDefaultFortuneRepository(fortuneApi: FortuneApi): DefaultFortuneRepository = DefaultFortuneRepository(fortuneApi) + abstract fun bindDefaultFortuneRepository(defaultFortuneRepository: DefaultFortuneRepository): FortuneRepository } diff --git a/data/fortune/src/main/java/org/sopt/official/data/fortune/mapper/FortuneMapper.kt b/data/fortune/src/main/java/org/sopt/official/data/fortune/mapper/FortuneMapper.kt new file mode 100644 index 00000000..bb7d2081 --- /dev/null +++ b/data/fortune/src/main/java/org/sopt/official/data/fortune/mapper/FortuneMapper.kt @@ -0,0 +1,18 @@ +package org.sopt.official.data.fortune.mapper + +import org.sopt.official.data.fortune.remote.response.TodayFortuneCardResponse +import org.sopt.official.data.fortune.remote.response.TodayFortuneWordResponse +import org.sopt.official.domain.fortune.model.TodayFortuneCard +import org.sopt.official.domain.fortune.model.TodayFortuneWord + +internal fun TodayFortuneCardResponse.toDomain(): TodayFortuneCard = TodayFortuneCard( + description = description, + imageColorCode = imageColorCode, + imageUrl = imageUrl, + name = name, +) + +internal fun TodayFortuneWordResponse.toDomain(): TodayFortuneWord = TodayFortuneWord( + userName = userName, + title = title, +) diff --git a/data/fortune/src/main/java/org/sopt/official/data/fortune/remote/api/FortuneApi.kt b/data/fortune/src/main/java/org/sopt/official/data/fortune/remote/api/FortuneApi.kt index 3b4d0bb8..7188abd1 100644 --- a/data/fortune/src/main/java/org/sopt/official/data/fortune/remote/api/FortuneApi.kt +++ b/data/fortune/src/main/java/org/sopt/official/data/fortune/remote/api/FortuneApi.kt @@ -5,13 +5,13 @@ import org.sopt.official.data.fortune.remote.response.TodayFortuneWordResponse import retrofit2.http.GET import retrofit2.http.Query -interface FortuneApi { +internal interface FortuneApi { - @GET("/api/v2/fortune/word") + @GET("api/v2/fortune/word") suspend fun getTodayFortuneWord( @Query("todayDate") todayDate: String, ): TodayFortuneWordResponse - @GET("/api/v2/fortune/card/today") + @GET("api/v2/fortune/card/today") suspend fun getTodayFortuneCard(): TodayFortuneCardResponse } diff --git a/data/fortune/src/main/java/org/sopt/official/data/fortune/remote/response/TodayFortuneCardResponse.kt b/data/fortune/src/main/java/org/sopt/official/data/fortune/remote/response/TodayFortuneCardResponse.kt index be91b4b7..053214cb 100644 --- a/data/fortune/src/main/java/org/sopt/official/data/fortune/remote/response/TodayFortuneCardResponse.kt +++ b/data/fortune/src/main/java/org/sopt/official/data/fortune/remote/response/TodayFortuneCardResponse.kt @@ -4,7 +4,7 @@ import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable -data class TodayFortuneCardResponse( +internal data class TodayFortuneCardResponse( @SerialName("description") val description: String, @SerialName("imageColorCode") diff --git a/data/fortune/src/main/java/org/sopt/official/data/fortune/remote/response/TodayFortuneWordResponse.kt b/data/fortune/src/main/java/org/sopt/official/data/fortune/remote/response/TodayFortuneWordResponse.kt index 36144267..e374976c 100644 --- a/data/fortune/src/main/java/org/sopt/official/data/fortune/remote/response/TodayFortuneWordResponse.kt +++ b/data/fortune/src/main/java/org/sopt/official/data/fortune/remote/response/TodayFortuneWordResponse.kt @@ -4,7 +4,7 @@ import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable -data class TodayFortuneWordResponse( +internal data class TodayFortuneWordResponse( @SerialName("userName") val userName: String, @SerialName("title") diff --git a/data/fortune/src/main/java/org/sopt/official/data/fortune/repository/DefaultFortuneRepository.kt b/data/fortune/src/main/java/org/sopt/official/data/fortune/repository/DefaultFortuneRepository.kt index 5417f0e7..2a79bd48 100644 --- a/data/fortune/src/main/java/org/sopt/official/data/fortune/repository/DefaultFortuneRepository.kt +++ b/data/fortune/src/main/java/org/sopt/official/data/fortune/repository/DefaultFortuneRepository.kt @@ -1,17 +1,17 @@ package org.sopt.official.data.fortune.repository +import org.sopt.official.data.fortune.mapper.toDomain import org.sopt.official.data.fortune.remote.api.FortuneApi +import org.sopt.official.domain.fortune.model.TodayFortuneCard +import org.sopt.official.domain.fortune.model.TodayFortuneWord +import org.sopt.official.domain.fortune.repository.FortuneRepository import javax.inject.Inject -class DefaultFortuneRepository @Inject constructor( +internal class DefaultFortuneRepository @Inject constructor( private val fortuneApi: FortuneApi, -) { +) : FortuneRepository { - suspend fun fetchTodayFortuneWord() { - fortuneApi - } + override suspend fun fetchTodayFortuneWord(date: String): TodayFortuneWord = fortuneApi.getTodayFortuneWord(date).toDomain() - suspend fun fetchTodayFortuneCard() { - fortuneApi - } + override suspend fun fetchTodayFortuneCard(): TodayFortuneCard = fortuneApi.getTodayFortuneCard().toDomain() } diff --git a/domain/fortune/.gitignore b/domain/fortune/.gitignore new file mode 100644 index 00000000..42afabfd --- /dev/null +++ b/domain/fortune/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/domain/fortune/build.gradle.kts b/domain/fortune/build.gradle.kts new file mode 100644 index 00000000..0adbfe1a --- /dev/null +++ b/domain/fortune/build.gradle.kts @@ -0,0 +1,36 @@ +/* + * MIT License + * Copyright 2023-2024 SOPT - Shout Our Passion Together + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +plugins { + sopt("kotlin") +} + +kotlin { + jvmToolchain(17) +} + +dependencies { + implementation(libs.javax.inject) +} diff --git a/domain/fortune/src/main/java/org/sopt/official/domain/fortune/model/TodayFortuneCard.kt b/domain/fortune/src/main/java/org/sopt/official/domain/fortune/model/TodayFortuneCard.kt new file mode 100644 index 00000000..72f7708c --- /dev/null +++ b/domain/fortune/src/main/java/org/sopt/official/domain/fortune/model/TodayFortuneCard.kt @@ -0,0 +1,8 @@ +package org.sopt.official.domain.fortune.model + +internal data class TodayFortuneCard( + val description: String, + val imageColorCode: String, + val imageUrl: String, + val name: String, +) diff --git a/domain/fortune/src/main/java/org/sopt/official/domain/fortune/model/TodayFortuneWord.kt b/domain/fortune/src/main/java/org/sopt/official/domain/fortune/model/TodayFortuneWord.kt new file mode 100644 index 00000000..eae07ccb --- /dev/null +++ b/domain/fortune/src/main/java/org/sopt/official/domain/fortune/model/TodayFortuneWord.kt @@ -0,0 +1,6 @@ +package org.sopt.official.domain.fortune.model + +internal data class TodayFortuneWord( + val userName: String, + val title: String, +) diff --git a/domain/fortune/src/main/java/org/sopt/official/domain/fortune/repository/FortuneRepository.kt b/domain/fortune/src/main/java/org/sopt/official/domain/fortune/repository/FortuneRepository.kt new file mode 100644 index 00000000..be260fc3 --- /dev/null +++ b/domain/fortune/src/main/java/org/sopt/official/domain/fortune/repository/FortuneRepository.kt @@ -0,0 +1,9 @@ +package org.sopt.official.domain.fortune.repository + +import org.sopt.official.domain.fortune.model.TodayFortuneCard +import org.sopt.official.domain.fortune.model.TodayFortuneWord + +internal interface FortuneRepository { + suspend fun fetchTodayFortuneWord(date: String): TodayFortuneWord + suspend fun fetchTodayFortuneCard(): TodayFortuneCard +} diff --git a/settings.gradle.kts b/settings.gradle.kts index d9b6f8ed..afe515da 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -41,5 +41,5 @@ include( ":feature:poke", ":feature:fortune" ) -include(":domain:fortune") include(":data:fortune") +include(":domain:fortune") From 533a29fa924626fb17826209b476f9a6e6a4b880 Mon Sep 17 00:00:00 2001 From: s9hn Date: Wed, 25 Sep 2024 18:08:00 +0900 Subject: [PATCH 07/20] =?UTF-8?q?refactor:=20internal=20=ED=82=A4=EC=9B=8C?= =?UTF-8?q?=EB=93=9C=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/fortune/src/main/AndroidManifest.xml | 25 ++++++++++++++++++- .../domain/fortune/model/TodayFortuneCard.kt | 2 +- .../domain/fortune/model/TodayFortuneWord.kt | 2 +- .../fortune/repository/FortuneRepository.kt | 2 +- 4 files changed, 27 insertions(+), 4 deletions(-) diff --git a/data/fortune/src/main/AndroidManifest.xml b/data/fortune/src/main/AndroidManifest.xml index 8bdb7e14..3414a818 100644 --- a/data/fortune/src/main/AndroidManifest.xml +++ b/data/fortune/src/main/AndroidManifest.xml @@ -1,4 +1,27 @@ - + + diff --git a/domain/fortune/src/main/java/org/sopt/official/domain/fortune/model/TodayFortuneCard.kt b/domain/fortune/src/main/java/org/sopt/official/domain/fortune/model/TodayFortuneCard.kt index 72f7708c..97c8e77c 100644 --- a/domain/fortune/src/main/java/org/sopt/official/domain/fortune/model/TodayFortuneCard.kt +++ b/domain/fortune/src/main/java/org/sopt/official/domain/fortune/model/TodayFortuneCard.kt @@ -1,6 +1,6 @@ package org.sopt.official.domain.fortune.model -internal data class TodayFortuneCard( +data class TodayFortuneCard( val description: String, val imageColorCode: String, val imageUrl: String, diff --git a/domain/fortune/src/main/java/org/sopt/official/domain/fortune/model/TodayFortuneWord.kt b/domain/fortune/src/main/java/org/sopt/official/domain/fortune/model/TodayFortuneWord.kt index eae07ccb..52ef6e94 100644 --- a/domain/fortune/src/main/java/org/sopt/official/domain/fortune/model/TodayFortuneWord.kt +++ b/domain/fortune/src/main/java/org/sopt/official/domain/fortune/model/TodayFortuneWord.kt @@ -1,6 +1,6 @@ package org.sopt.official.domain.fortune.model -internal data class TodayFortuneWord( +data class TodayFortuneWord( val userName: String, val title: String, ) diff --git a/domain/fortune/src/main/java/org/sopt/official/domain/fortune/repository/FortuneRepository.kt b/domain/fortune/src/main/java/org/sopt/official/domain/fortune/repository/FortuneRepository.kt index be260fc3..7932187f 100644 --- a/domain/fortune/src/main/java/org/sopt/official/domain/fortune/repository/FortuneRepository.kt +++ b/domain/fortune/src/main/java/org/sopt/official/domain/fortune/repository/FortuneRepository.kt @@ -3,7 +3,7 @@ package org.sopt.official.domain.fortune.repository import org.sopt.official.domain.fortune.model.TodayFortuneCard import org.sopt.official.domain.fortune.model.TodayFortuneWord -internal interface FortuneRepository { +interface FortuneRepository { suspend fun fetchTodayFortuneWord(date: String): TodayFortuneWord suspend fun fetchTodayFortuneCard(): TodayFortuneCard } From f655b506f54156d3be530003f58079d5bc894e2d Mon Sep 17 00:00:00 2001 From: s9hn Date: Wed, 25 Sep 2024 19:00:59 +0900 Subject: [PATCH 08/20] =?UTF-8?q?refactor:=20=ED=95=A8=EC=88=98=20?= =?UTF-8?q?=EB=84=A4=EC=9D=B4=EB=B0=8D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/org/sopt/official/data/fortune/di/ApiModule.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/fortune/src/main/java/org/sopt/official/data/fortune/di/ApiModule.kt b/data/fortune/src/main/java/org/sopt/official/data/fortune/di/ApiModule.kt index 04178e0f..f76849ab 100644 --- a/data/fortune/src/main/java/org/sopt/official/data/fortune/di/ApiModule.kt +++ b/data/fortune/src/main/java/org/sopt/official/data/fortune/di/ApiModule.kt @@ -16,5 +16,5 @@ internal object ApiModule { @Provides @Singleton - fun provideNovelApi(@AppRetrofit retrofit: Retrofit): FortuneApi = retrofit.create() + internal fun provideFortuneApi(@AppRetrofit retrofit: Retrofit): FortuneApi = retrofit.create() } From e26989c30d507a968bb12b98ff3684763f80a9cf Mon Sep 17 00:00:00 2001 From: s9hn Date: Wed, 25 Sep 2024 19:03:57 +0900 Subject: [PATCH 09/20] =?UTF-8?q?feat:=20=EB=A0=88=EC=9D=B4=EC=96=B4=20?= =?UTF-8?q?=EC=9D=98=EC=A1=B4=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 --- app/build.gradle.kts | 2 ++ feature/fortune/build.gradle.kts | 3 +++ 2 files changed, 5 insertions(+) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 29b90051..5c566336 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -117,8 +117,10 @@ dependencies { implementation(projects.domain.soptamp) implementation(projects.domain.mypage) implementation(projects.domain.poke) + implementation(projects.domain.fortune) implementation(projects.domain.notification) implementation(projects.feature.soptamp) + implementation(projects.data.fortune) implementation(projects.data.soptamp) implementation(projects.data.mypage) implementation(projects.data.poke) diff --git a/feature/fortune/build.gradle.kts b/feature/fortune/build.gradle.kts index d3f4bfad..9b444c2f 100644 --- a/feature/fortune/build.gradle.kts +++ b/feature/fortune/build.gradle.kts @@ -32,6 +32,9 @@ android { } dependencies { + // domain + implementation(projects.domain.fortune) + // core implementation(projects.core.common) implementation(projects.core.designsystem) From 5950cecb624cc2aa53e1285385267a604f2d9dab Mon Sep 17 00:00:00 2001 From: s9hn Date: Thu, 26 Sep 2024 15:34:23 +0900 Subject: [PATCH 10/20] =?UTF-8?q?refactor:=20=EB=84=A4=ED=8A=B8=EC=9B=8C?= =?UTF-8?q?=ED=81=AC=20path=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/org/sopt/official/data/fortune/di/ApiModule.kt | 2 +- .../org/sopt/official/data/fortune/remote/api/FortuneApi.kt | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/data/fortune/src/main/java/org/sopt/official/data/fortune/di/ApiModule.kt b/data/fortune/src/main/java/org/sopt/official/data/fortune/di/ApiModule.kt index f76849ab..bd74040d 100644 --- a/data/fortune/src/main/java/org/sopt/official/data/fortune/di/ApiModule.kt +++ b/data/fortune/src/main/java/org/sopt/official/data/fortune/di/ApiModule.kt @@ -16,5 +16,5 @@ internal object ApiModule { @Provides @Singleton - internal fun provideFortuneApi(@AppRetrofit retrofit: Retrofit): FortuneApi = retrofit.create() + internal fun provideFortuneApi(@AppRetrofit(true) retrofit: Retrofit): FortuneApi = retrofit.create() } diff --git a/data/fortune/src/main/java/org/sopt/official/data/fortune/remote/api/FortuneApi.kt b/data/fortune/src/main/java/org/sopt/official/data/fortune/remote/api/FortuneApi.kt index 7188abd1..e7a5c415 100644 --- a/data/fortune/src/main/java/org/sopt/official/data/fortune/remote/api/FortuneApi.kt +++ b/data/fortune/src/main/java/org/sopt/official/data/fortune/remote/api/FortuneApi.kt @@ -7,11 +7,11 @@ import retrofit2.http.Query internal interface FortuneApi { - @GET("api/v2/fortune/word") + @GET("fortune/word") suspend fun getTodayFortuneWord( @Query("todayDate") todayDate: String, ): TodayFortuneWordResponse - @GET("api/v2/fortune/card/today") + @GET("fortune/card/today") suspend fun getTodayFortuneCard(): TodayFortuneCardResponse } From 71001df35d7f7b520416fbb6b7e3f0405fe369e6 Mon Sep 17 00:00:00 2001 From: s9hn Date: Thu, 26 Sep 2024 15:35:25 +0900 Subject: [PATCH 11/20] =?UTF-8?q?feat:=20=EB=84=A4=ED=8A=B8=EC=9B=8C?= =?UTF-8?q?=ED=81=AC=20=ED=86=B5=EC=8B=A0=20=EA=B5=AC=ED=98=84=20=EB=B0=8F?= =?UTF-8?q?=20state=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fortuneDetail/FortuneDetailRoute.kt | 11 ++++- .../fortuneDetail/FortuneDetailScreen.kt | 30 +++++++++++-- .../fortuneDetail/FortuneDetailViewModel.kt | 45 +++++++++++++++++++ .../model/FortuneDetailUiState.kt | 23 ++++++++++ 4 files changed, 104 insertions(+), 5 deletions(-) create mode 100644 feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/FortuneDetailViewModel.kt create mode 100644 feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/model/FortuneDetailUiState.kt diff --git a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/FortuneDetailRoute.kt b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/FortuneDetailRoute.kt index e18304de..6a552c62 100644 --- a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/FortuneDetailRoute.kt +++ b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/FortuneDetailRoute.kt @@ -2,16 +2,23 @@ package org.sopt.official.feature.fortune.feature.fortuneDetail import androidx.compose.foundation.layout.PaddingValues import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.hilt.navigation.compose.hiltViewModel +import androidx.lifecycle.compose.collectAsStateWithLifecycle @Composable internal fun FortuneDetailRoute( paddingValue: PaddingValues, date: String, - navigateToFortuneAmulet: () -> Unit, + onFortuneAmuletClick: () -> Unit, + viewModel: FortuneDetailViewModel = hiltViewModel(), ) { + val uiState by viewModel.uiState.collectAsStateWithLifecycle() + FortuneDetailScreen( paddingValue = paddingValue, date = date, - navigateToFortuneAmulet = navigateToFortuneAmulet + onFortuneAmuletClick = onFortuneAmuletClick, + uiState = uiState, ) } diff --git a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/FortuneDetailScreen.kt b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/FortuneDetailScreen.kt index a6b2f86f..69ad15cb 100644 --- a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/FortuneDetailScreen.kt +++ b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/FortuneDetailScreen.kt @@ -37,13 +37,18 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import org.sopt.official.designsystem.SoptTheme import org.sopt.official.feature.fortune.feature.fortuneDetail.component.TodayFortuneDashboard +import org.sopt.official.feature.fortune.feature.fortuneDetail.model.FortuneDetailUiState +import org.sopt.official.feature.fortune.feature.fortuneDetail.model.FortuneDetailUiState.Error +import org.sopt.official.feature.fortune.feature.fortuneDetail.model.FortuneDetailUiState.Loading +import org.sopt.official.feature.fortune.feature.fortuneDetail.model.FortuneDetailUiState.TodaySentence @Composable internal fun FortuneDetailScreen( paddingValue: PaddingValues, date: String, - navigateToFortuneAmulet: () -> Unit, + onFortuneAmuletClick: () -> Unit, modifier: Modifier = Modifier, + uiState: FortuneDetailUiState = Loading, ) { Column( horizontalAlignment = Alignment.CenterHorizontally, @@ -52,7 +57,22 @@ internal fun FortuneDetailScreen( .padding(paddingValues = paddingValue), ) { Spacer(modifier = Modifier.height(height = 16.dp)) - TodayFortuneDashboard(date) + when (uiState) { + is TodaySentence -> { + TodayFortuneDashboard( + date = date, + todaySentence = uiState.message, + ) + } + + is Error -> { + // 오류 처리 + } + + is Loading -> { + // 로딩 뷰 + } + } } } @@ -63,7 +83,11 @@ private fun FortuneDetailScreenPreview() { FortuneDetailScreen( paddingValue = PaddingValues(vertical = 16.dp), date = "2024-09-09", - navigateToFortuneAmulet = {}, + onFortuneAmuletClick = {}, + uiState = TodaySentence( + userName = "누누", + content = "오늘 하루종일 기분 좋을 것 같은 날이네요." + ) ) } } diff --git a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/FortuneDetailViewModel.kt b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/FortuneDetailViewModel.kt new file mode 100644 index 00000000..dabecd8a --- /dev/null +++ b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/FortuneDetailViewModel.kt @@ -0,0 +1,45 @@ +package org.sopt.official.feature.fortune.feature.fortuneDetail + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch +import org.sopt.official.domain.fortune.usecase.GetTodayFortuneUseCase +import org.sopt.official.feature.fortune.feature.fortuneDetail.model.FortuneDetailUiState +import org.sopt.official.feature.fortune.feature.fortuneDetail.model.FortuneDetailUiState.Error +import org.sopt.official.feature.fortune.feature.fortuneDetail.model.FortuneDetailUiState.Loading +import org.sopt.official.feature.fortune.feature.fortuneDetail.model.FortuneDetailUiState.TodaySentence +import javax.inject.Inject + +@HiltViewModel +class FortuneDetailViewModel @Inject constructor( + getTodayFortuneUseCase: GetTodayFortuneUseCase, +) : ViewModel() { + private val _uiState: MutableStateFlow = MutableStateFlow(Loading) + val uiState: StateFlow get() = _uiState.asStateFlow() + + init { + viewModelScope.launch { + runCatching { + getTodayFortuneUseCase() + }.onSuccess { result -> + _uiState.update { + TodaySentence( + userName = result.userName, + content = result.title, + ) + } + }.onFailure { error -> + _uiState.update { + Error(error) + } + } + } + } +} + + diff --git a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/model/FortuneDetailUiState.kt b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/model/FortuneDetailUiState.kt new file mode 100644 index 00000000..0bb4e936 --- /dev/null +++ b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/model/FortuneDetailUiState.kt @@ -0,0 +1,23 @@ +package org.sopt.official.feature.fortune.feature.fortuneDetail.model + +import androidx.compose.runtime.Immutable +import androidx.compose.runtime.Stable + +@Stable +sealed interface FortuneDetailUiState { + + @Immutable + data class TodaySentence( + val userName: String, + val content: String, + ) : FortuneDetailUiState { + val message: String + get() = "${userName}님,\n${content}" + } + + @Immutable + data object Loading : FortuneDetailUiState + + @Immutable + data class Error(val errorMessage: Throwable) : FortuneDetailUiState +} From 1e42c44be70d40257b6c97c8d3ad02376cc0ab6d Mon Sep 17 00:00:00 2001 From: s9hn Date: Thu, 26 Sep 2024 15:35:38 +0900 Subject: [PATCH 12/20] =?UTF-8?q?feat:=20=EC=98=A4=EB=8A=98=EC=9D=98=20?= =?UTF-8?q?=EC=86=9D=EB=A7=88=EB=94=94=20=EA=B4=80=EB=A0=A8=20=EC=9C=A0?= =?UTF-8?q?=EC=A6=88=EC=BC=80=EC=9D=B4=EC=8A=A4=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fortune/usecase/GetTodayDateUseCase.kt | 17 +++++++++++++++++ .../fortune/usecase/GetTodayFortuneUseCase.kt | 13 +++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 domain/fortune/src/main/java/org/sopt/official/domain/fortune/usecase/GetTodayDateUseCase.kt create mode 100644 domain/fortune/src/main/java/org/sopt/official/domain/fortune/usecase/GetTodayFortuneUseCase.kt diff --git a/domain/fortune/src/main/java/org/sopt/official/domain/fortune/usecase/GetTodayDateUseCase.kt b/domain/fortune/src/main/java/org/sopt/official/domain/fortune/usecase/GetTodayDateUseCase.kt new file mode 100644 index 00000000..0d167c1f --- /dev/null +++ b/domain/fortune/src/main/java/org/sopt/official/domain/fortune/usecase/GetTodayDateUseCase.kt @@ -0,0 +1,17 @@ +package org.sopt.official.domain.fortune.usecase + +import java.time.LocalDate +import javax.inject.Inject + +class GetTodayDateUseCase @Inject constructor() { + private val currentDate by lazy { LocalDate.now() } + + operator fun invoke(): String = currentDate.toFormattedDate() + + private fun LocalDate.toFormattedDate(): String { + val month = monthValue.toString().padStart(2, '0') + val day = dayOfMonth.toString().padStart(2, '0') + + return "$year-$month-$day" + } +} diff --git a/domain/fortune/src/main/java/org/sopt/official/domain/fortune/usecase/GetTodayFortuneUseCase.kt b/domain/fortune/src/main/java/org/sopt/official/domain/fortune/usecase/GetTodayFortuneUseCase.kt new file mode 100644 index 00000000..df3d656a --- /dev/null +++ b/domain/fortune/src/main/java/org/sopt/official/domain/fortune/usecase/GetTodayFortuneUseCase.kt @@ -0,0 +1,13 @@ +package org.sopt.official.domain.fortune.usecase + +import org.sopt.official.domain.fortune.model.TodayFortuneWord +import org.sopt.official.domain.fortune.repository.FortuneRepository +import javax.inject.Inject + +class GetTodayFortuneUseCase @Inject constructor( + private val fortuneRepository: FortuneRepository, + private val getTodayDateUseCase: GetTodayDateUseCase, +) { + + suspend operator fun invoke(): TodayFortuneWord = fortuneRepository.fetchTodayFortuneWord(getTodayDateUseCase()) +} From 625d11ef9ba4b8cdb2a5116374266f89c7d674d5 Mon Sep 17 00:00:00 2001 From: s9hn Date: Thu, 26 Sep 2024 15:35:59 +0900 Subject: [PATCH 13/20] =?UTF-8?q?refactor:=20TodayFortuneBox=20=ED=8C=A8?= =?UTF-8?q?=EB=94=A9=EA=B0=92=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../component/TodayFortuneDashboard.kt | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/component/TodayFortuneDashboard.kt b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/component/TodayFortuneDashboard.kt index 7f1512b1..c093bf38 100644 --- a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/component/TodayFortuneDashboard.kt +++ b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/component/TodayFortuneDashboard.kt @@ -27,12 +27,15 @@ package org.sopt.official.feature.fortune.feature.fortuneDetail.component import androidx.compose.foundation.Image import androidx.compose.foundation.layout.Column 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.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import org.sopt.official.designsystem.Gray100 @@ -43,6 +46,7 @@ import org.sopt.official.feature.fortune.R @Composable fun TodayFortuneDashboard( date: String, + todaySentence: String, modifier: Modifier = Modifier, ) { TodayFortuneBox( @@ -64,9 +68,13 @@ fun TodayFortuneDashboard( ) Spacer(modifier = Modifier.height(height = 20.dp)) Text( - text = date, + text = todaySentence, style = SoptTheme.typography.title24SB, color = Gray30, + textAlign = TextAlign.Center, + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 68.dp), ) Spacer(modifier = Modifier.height(height = 36.dp)) } @@ -78,6 +86,9 @@ fun TodayFortuneDashboard( @Composable private fun TodayFortuneDashboardPreview() { SoptTheme { - TodayFortuneDashboard(date = "123") + TodayFortuneDashboard( + date = "2024-09-09", + todaySentence = "안녕하세우안녕하세우안녕하세우안녕하세우안녕하세우안녕하세우", + ) } } From 430b830a7d13e5a079a2eb6b810624b78780fe46 Mon Sep 17 00:00:00 2001 From: s9hn Date: Thu, 26 Sep 2024 15:36:12 +0900 Subject: [PATCH 14/20] =?UTF-8?q?refactor:=20=ED=83=80=EC=9E=85=20?= =?UTF-8?q?=EB=B0=8F=20=EB=84=A4=EC=9D=B4=EB=B0=8D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../feature/fortuneDetail/navigation/FortuneDetailNavGraph.kt | 2 +- .../feature/fortune/feature/home/navigation/HomeNavGraph.kt | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/navigation/FortuneDetailNavGraph.kt b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/navigation/FortuneDetailNavGraph.kt index c1be1f0b..25c9369e 100644 --- a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/navigation/FortuneDetailNavGraph.kt +++ b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/navigation/FortuneDetailNavGraph.kt @@ -43,7 +43,7 @@ fun NavGraphBuilder.fortuneDetailNavGraph( FortuneDetailRoute( paddingValue = paddingValue, date = items.date, - navigateToFortuneAmulet = navigateToFortuneAmulet + onFortuneAmuletClick = navigateToFortuneAmulet ) } } diff --git a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/home/navigation/HomeNavGraph.kt b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/home/navigation/HomeNavGraph.kt index 03473bc0..adb65ced 100644 --- a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/home/navigation/HomeNavGraph.kt +++ b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/home/navigation/HomeNavGraph.kt @@ -28,7 +28,6 @@ import androidx.compose.foundation.layout.PaddingValues import androidx.navigation.NavGraphBuilder import androidx.navigation.compose.composable import kotlinx.serialization.Serializable -import org.sopt.official.feature.fortune.feature.fortuneAmulet.navigation.FortuneAmulet import org.sopt.official.feature.fortune.feature.home.HomeRoute @Serializable @@ -38,7 +37,7 @@ fun NavGraphBuilder.homeNavGraph( paddingValue: PaddingValues, navigateToFortuneDetail: (String) -> Unit, ) { - composable { + composable { HomeRoute( paddingValue = paddingValue, navigateToFortuneDetail = navigateToFortuneDetail From 83c06415812e094394911e1c6c6cec0b642a41c0 Mon Sep 17 00:00:00 2001 From: s9hn Date: Thu, 26 Sep 2024 16:19:20 +0900 Subject: [PATCH 15/20] =?UTF-8?q?refactor:=20internal=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../feature/fortuneDetail/FortuneDetailViewModel.kt | 2 +- .../fortuneDetail/component/TodayFortuneDashboard.kt | 7 +++++-- .../feature/fortuneDetail/model/FortuneDetailUiState.kt | 2 +- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/FortuneDetailViewModel.kt b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/FortuneDetailViewModel.kt index dabecd8a..ea3ed4f8 100644 --- a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/FortuneDetailViewModel.kt +++ b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/FortuneDetailViewModel.kt @@ -16,7 +16,7 @@ import org.sopt.official.feature.fortune.feature.fortuneDetail.model.FortuneDeta import javax.inject.Inject @HiltViewModel -class FortuneDetailViewModel @Inject constructor( +internal class FortuneDetailViewModel @Inject constructor( getTodayFortuneUseCase: GetTodayFortuneUseCase, ) : ViewModel() { private val _uiState: MutableStateFlow = MutableStateFlow(Loading) diff --git a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/component/TodayFortuneDashboard.kt b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/component/TodayFortuneDashboard.kt index c093bf38..db25720d 100644 --- a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/component/TodayFortuneDashboard.kt +++ b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/component/TodayFortuneDashboard.kt @@ -35,6 +35,8 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.painterResource +import androidx.compose.ui.semantics.contentDescription +import androidx.compose.ui.semantics.semantics import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp @@ -44,7 +46,7 @@ import org.sopt.official.designsystem.SoptTheme import org.sopt.official.feature.fortune.R @Composable -fun TodayFortuneDashboard( +internal fun TodayFortuneDashboard( date: String, todaySentence: String, modifier: Modifier = Modifier, @@ -74,7 +76,8 @@ fun TodayFortuneDashboard( textAlign = TextAlign.Center, modifier = Modifier .fillMaxWidth() - .padding(horizontal = 68.dp), + .padding(horizontal = 68.dp) + .semantics { contentDescription = "todaySentence" }, ) Spacer(modifier = Modifier.height(height = 36.dp)) } diff --git a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/model/FortuneDetailUiState.kt b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/model/FortuneDetailUiState.kt index 0bb4e936..9cda0165 100644 --- a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/model/FortuneDetailUiState.kt +++ b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/model/FortuneDetailUiState.kt @@ -4,7 +4,7 @@ import androidx.compose.runtime.Immutable import androidx.compose.runtime.Stable @Stable -sealed interface FortuneDetailUiState { +internal sealed interface FortuneDetailUiState { @Immutable data class TodaySentence( From 8d86bcbf3e6c4a1a51f30684c18c1b02ba55b6d8 Mon Sep 17 00:00:00 2001 From: s9hn Date: Thu, 26 Sep 2024 16:19:29 +0900 Subject: [PATCH 16/20] =?UTF-8?q?test:=20FortuneDetailScreenTest=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- feature/fortune/build.gradle.kts | 1 + .../fortuneDetail/FortuneDetailScreenTest.kt | 54 +++++++++++++++++++ 2 files changed, 55 insertions(+) create mode 100644 feature/fortune/src/androidTest/java/org/sopt/official/feature/fortune/fortuneDetail/FortuneDetailScreenTest.kt diff --git a/feature/fortune/build.gradle.kts b/feature/fortune/build.gradle.kts index 9b444c2f..8fb80b14 100644 --- a/feature/fortune/build.gradle.kts +++ b/feature/fortune/build.gradle.kts @@ -25,6 +25,7 @@ plugins { sopt("feature") sopt("compose") + sopt("test") } android { diff --git a/feature/fortune/src/androidTest/java/org/sopt/official/feature/fortune/fortuneDetail/FortuneDetailScreenTest.kt b/feature/fortune/src/androidTest/java/org/sopt/official/feature/fortune/fortuneDetail/FortuneDetailScreenTest.kt new file mode 100644 index 00000000..688ff96a --- /dev/null +++ b/feature/fortune/src/androidTest/java/org/sopt/official/feature/fortune/fortuneDetail/FortuneDetailScreenTest.kt @@ -0,0 +1,54 @@ +package org.sopt.official.feature.fortune.fortuneDetail + +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.ui.semantics.SemanticsProperties +import androidx.compose.ui.semantics.getOrNull +import androidx.compose.ui.test.assertIsDisplayed +import androidx.compose.ui.test.junit4.createComposeRule +import androidx.compose.ui.test.onNodeWithContentDescription +import androidx.compose.ui.test.onNodeWithText +import org.junit.Rule +import org.junit.Test +import org.sopt.official.designsystem.SoptTheme +import org.sopt.official.feature.fortune.feature.fortuneDetail.FortuneDetailScreen +import org.sopt.official.feature.fortune.feature.fortuneDetail.model.FortuneDetailUiState + +internal class FortuneDetailScreenTest { + + @get:Rule + val composeRule = createComposeRule() + + @Test + fun 서버통신이_성공하면_이름_솝마디_날짜가_노출된다() { + // given: + val date = "2024-09-26" + val name = "이현우" + val content = "안녕하세요안녕하세요안녕하세요안녕하세요안녕하세요" + + // when: + + composeRule.setContent { + SoptTheme { + FortuneDetailScreen( + paddingValue = PaddingValues(), + date = date, + onFortuneAmuletClick = { }, + uiState = FortuneDetailUiState.TodaySentence( + userName = name, + content = content, + ) + ) + } + } + + // then: + val todayFortune = composeRule.onNodeWithContentDescription("todaySentence") + .fetchSemanticsNode().config.getOrNull(SemanticsProperties.Text)?.joinToString(separator = "").orEmpty() + + composeRule.waitForIdle() + + composeRule.onNodeWithText(date).assertIsDisplayed() + assert(todayFortune.contains(name)) + assert(todayFortune.contains(content)) + } +} From 2f9ffffbda58c4eb829ee2e92ed6ead6b59d1096 Mon Sep 17 00:00:00 2001 From: s9hn Date: Fri, 27 Sep 2024 01:29:09 +0900 Subject: [PATCH 17/20] =?UTF-8?q?refactor:=20SimpleDataFormatter=EB=A1=9C?= =?UTF-8?q?=20=EB=A6=AC=ED=8C=A9=ED=84=B0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/fortune/usecase/GetTodayDateUseCase.kt | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/domain/fortune/src/main/java/org/sopt/official/domain/fortune/usecase/GetTodayDateUseCase.kt b/domain/fortune/src/main/java/org/sopt/official/domain/fortune/usecase/GetTodayDateUseCase.kt index 0d167c1f..b6380d57 100644 --- a/domain/fortune/src/main/java/org/sopt/official/domain/fortune/usecase/GetTodayDateUseCase.kt +++ b/domain/fortune/src/main/java/org/sopt/official/domain/fortune/usecase/GetTodayDateUseCase.kt @@ -1,17 +1,14 @@ package org.sopt.official.domain.fortune.usecase -import java.time.LocalDate +import java.text.SimpleDateFormat +import java.util.Locale import javax.inject.Inject class GetTodayDateUseCase @Inject constructor() { - private val currentDate by lazy { LocalDate.now() } - operator fun invoke(): String = currentDate.toFormattedDate() + operator fun invoke(): String { + val currentDate = System.currentTimeMillis() - private fun LocalDate.toFormattedDate(): String { - val month = monthValue.toString().padStart(2, '0') - val day = dayOfMonth.toString().padStart(2, '0') - - return "$year-$month-$day" + return SimpleDateFormat("yyyy-MM-dd", Locale.KOREAN).format(currentDate) } } From 69a0acc7c4bfd2cd74e41ed88b480cd889473961 Mon Sep 17 00:00:00 2001 From: s9hn Date: Fri, 27 Sep 2024 01:37:47 +0900 Subject: [PATCH 18/20] =?UTF-8?q?refactor:=20Timber=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fortuneDetail/FortuneDetailScreen.kt | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/FortuneDetailScreen.kt b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/FortuneDetailScreen.kt index 11846e10..96f5fa7e 100644 --- a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/FortuneDetailScreen.kt +++ b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/FortuneDetailScreen.kt @@ -41,6 +41,7 @@ import org.sopt.official.feature.fortune.feature.fortuneDetail.model.FortuneDeta import org.sopt.official.feature.fortune.feature.fortuneDetail.model.FortuneDetailUiState.Error import org.sopt.official.feature.fortune.feature.fortuneDetail.model.FortuneDetailUiState.Loading import org.sopt.official.feature.fortune.feature.fortuneDetail.model.FortuneDetailUiState.TodaySentence +import timber.log.Timber @Composable internal fun FortuneDetailScreen( @@ -52,9 +53,7 @@ internal fun FortuneDetailScreen( ) { Column( horizontalAlignment = Alignment.CenterHorizontally, - modifier = modifier - .fillMaxSize() - .padding(paddingValues = paddingValue), + modifier = modifier.fillMaxSize().padding(paddingValues = paddingValue), ) { Spacer(modifier = Modifier.height(height = 16.dp)) when (uiState) { @@ -65,10 +64,7 @@ internal fun FortuneDetailScreen( ) } - is Error -> { - // 오류 처리 - } - + is Error -> Timber.e(uiState.errorMessage) is Loading -> { // 로딩 뷰 } @@ -81,12 +77,8 @@ internal fun FortuneDetailScreen( private fun FortuneDetailScreenPreview() { SoptTheme { FortuneDetailScreen( - paddingValue = PaddingValues(vertical = 16.dp), - date = "2024-09-09", - onFortuneAmuletClick = {}, - uiState = TodaySentence( - userName = "누누", - content = "오늘 하루종일 기분 좋을 것 같은 날이네요." + paddingValue = PaddingValues(vertical = 16.dp), date = "2024-09-09", onFortuneAmuletClick = {}, uiState = TodaySentence( + userName = "누누", content = "오늘 하루종일 기분 좋을 것 같은 날이네요." ) ) } From 8981910b67ef48e23934ae915f4c9f648d52bfa7 Mon Sep 17 00:00:00 2001 From: s9hn Date: Fri, 27 Sep 2024 01:43:29 +0900 Subject: [PATCH 19/20] =?UTF-8?q?build:=20=EC=9D=98=EC=A1=B4=EC=84=B1=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 --- settings.gradle.kts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/settings.gradle.kts b/settings.gradle.kts index afe515da..0340a6ea 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -30,6 +30,8 @@ include( ":data:notification", ":data:soptamp", ":data:poke", + ":data:fortune", + ":domain:fortune", ":domain:mypage", ":domain:notification", ":domain:soptamp", @@ -41,5 +43,3 @@ include( ":feature:poke", ":feature:fortune" ) -include(":data:fortune") -include(":domain:fortune") From a7c5b504998b469dfc8904d364e27c007211774a Mon Sep 17 00:00:00 2001 From: s9hn Date: Fri, 27 Sep 2024 01:55:48 +0900 Subject: [PATCH 20/20] =?UTF-8?q?refactor:=20break=20strategy=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../feature/fortuneDetail/FortuneDetailScreen.kt | 10 +++++++--- .../fortuneDetail/component/TodayFortuneDashboard.kt | 7 +++++-- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/FortuneDetailScreen.kt b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/FortuneDetailScreen.kt index 96f5fa7e..d8dac0c8 100644 --- a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/FortuneDetailScreen.kt +++ b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/FortuneDetailScreen.kt @@ -77,9 +77,13 @@ internal fun FortuneDetailScreen( private fun FortuneDetailScreenPreview() { SoptTheme { FortuneDetailScreen( - paddingValue = PaddingValues(vertical = 16.dp), date = "2024-09-09", onFortuneAmuletClick = {}, uiState = TodaySentence( - userName = "누누", content = "오늘 하루종일 기분 좋을 것 같은 날이네요." - ) + paddingValue = PaddingValues(vertical = 16.dp), + date = "2024-09-09", + onFortuneAmuletClick = {}, + uiState = TodaySentence( + userName = "누누", + content = "오늘 하루종일 기분 좋을 것 같은 날이네요.", + ), ) } } diff --git a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/component/TodayFortuneDashboard.kt b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/component/TodayFortuneDashboard.kt index db25720d..1d23ff55 100644 --- a/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/component/TodayFortuneDashboard.kt +++ b/feature/fortune/src/main/java/org/sopt/official/feature/fortune/feature/fortuneDetail/component/TodayFortuneDashboard.kt @@ -37,6 +37,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.res.painterResource import androidx.compose.ui.semantics.contentDescription import androidx.compose.ui.semantics.semantics +import androidx.compose.ui.text.style.LineBreak import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp @@ -71,7 +72,9 @@ internal fun TodayFortuneDashboard( Spacer(modifier = Modifier.height(height = 20.dp)) Text( text = todaySentence, - style = SoptTheme.typography.title24SB, + style = SoptTheme.typography.title24SB.copy( + lineBreak = LineBreak.Simple, + ), color = Gray30, textAlign = TextAlign.Center, modifier = Modifier @@ -91,7 +94,7 @@ private fun TodayFortuneDashboardPreview() { SoptTheme { TodayFortuneDashboard( date = "2024-09-09", - todaySentence = "안녕하세우안녕하세우안녕하세우안녕하세우안녕하세우안녕하세우", + todaySentence = "hi my name is Sehun kim, nice to meet you", ) } }