Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Mz 306/ 통계 수정사항 반영 #5

Merged
merged 4 commits into from
Sep 10, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ class StatisticsRepositoryImpl @Inject constructor(
) : StatisticsRepository {
override suspend fun getMyStatistics(): MyStatistics {
val originalStatistic = statisticsService.getMyStatistics().getOrThrow().toModel()
val visibleRecentSpentCount = if (originalStatistic.recentSpent.size > 6) 6 else originalStatistic.recentSpent.size
val sortedRecentSpent = originalStatistic.recentSpent
.filter {
currentYear == it.title.substring(0 until 4).toInt()
Expand All @@ -24,6 +25,7 @@ class StatisticsRepositoryImpl @Inject constructor(
)
}
.sortedBy { it.title.toInt() }
.takeLast(visibleRecentSpentCount)

return MyStatistics(
highestAmountReceived = originalStatistic.highestAmountReceived,
Expand All @@ -43,6 +45,8 @@ class StatisticsRepositoryImpl @Inject constructor(
relationshipId = relationshipId,
categoryId = categoryId,
).getOrThrow().toModel()

val visibleRecentSpentCount = if (originalStatistic.recentSpent.size > 6) 6 else originalStatistic.recentSpent.size
val sortedRecentSpent = originalStatistic.recentSpent
.filter {
currentYear == it.title.substring(0 until 4).toInt()
Expand All @@ -54,6 +58,7 @@ class StatisticsRepositoryImpl @Inject constructor(
)
}
.sortedBy { it.title.toInt() }
.takeLast(visibleRecentSpentCount)

return SusuStatistics(
averageSent = originalStatistic.averageSent,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -202,6 +202,7 @@ internal fun MainScreen(
navigateToMyInfo = navigator::navigateMyPageInfo,
navigateToSent = navigator::navigateSent,
onShowDialog = viewModel::onShowDialog,
onShowSnackbar = viewModel::onShowSnackbar,
handleException = viewModel::handleException,
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import com.susu.core.designsystem.component.appbar.icon.LogoIcon
import com.susu.core.designsystem.component.screen.LoadingScreen
import com.susu.core.designsystem.theme.SusuTheme
import com.susu.core.ui.DialogToken
import com.susu.core.ui.SnackbarToken
import com.susu.core.ui.extension.collectWithLifecycle
import com.susu.feature.statistics.component.StatisticsTab
import com.susu.feature.statistics.content.my.MyStatisticsRoute
Expand All @@ -37,6 +38,7 @@ fun StatisticsRoute(
navigateToMyInfo: () -> Unit,
navigateToSent: () -> Unit,
onShowDialog: (DialogToken) -> Unit,
onShowSnackbar: (SnackbarToken) -> Unit,
handleException: (Throwable, () -> Unit) -> Unit,
) {
val uiState by viewModel.uiState.collectAsStateWithLifecycle()
Expand Down Expand Up @@ -64,6 +66,7 @@ fun StatisticsRoute(
navigateToMyInfo = navigateToMyInfo,
navigateToSent = navigateToSent,
onShowDialog = onShowDialog,
onShowSnackbar = onShowSnackbar,
handleException = handleException,
)
}
Expand All @@ -76,6 +79,7 @@ fun StatisticsScreen(
navigateToMyInfo: () -> Unit = {},
navigateToSent: () -> Unit = {},
onShowDialog: (DialogToken) -> Unit = {},
onShowSnackbar: (SnackbarToken) -> Unit = {},
handleException: (Throwable, () -> Unit) -> Unit = { _, _ -> },
) {
Box(
Expand Down Expand Up @@ -112,8 +116,8 @@ fun StatisticsScreen(
modifier = Modifier.fillMaxSize(),
handleException = handleException,
onShowDialog = onShowDialog,
onShowSnackbar = onShowSnackbar,
navigateToMyInfo = navigateToMyInfo,

)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ fun MyStatisticsContent(
spentData = uiState.statistics.recentSpent.toPersistentList(),
maximumAmount = uiState.statistics.recentMaximumSpent,
totalAmount = uiState.statistics.recentTotalSpent,
graphTitle = stringResource(R.string.statistics_recent_8_total_money),
graphTitle = stringResource(R.string.statistics_recent_6_total_money),
)
Row(
modifier = Modifier
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ import com.susu.core.designsystem.theme.Gray100
import com.susu.core.designsystem.theme.Gray40
import com.susu.core.designsystem.theme.SusuTheme
import com.susu.core.ui.DialogToken
import com.susu.core.ui.SnackbarToken
import com.susu.core.ui.extension.collectWithLifecycle
import com.susu.feature.statistics.R
import com.susu.feature.statistics.component.RecentSpentGraph
Expand All @@ -60,6 +61,7 @@ fun SusuStatisticsRoute(
viewModel: SusuStatisticsViewModel = hiltViewModel(),
navigateToMyInfo: () -> Unit,
onShowDialog: (DialogToken) -> Unit,
onShowSnackbar: (SnackbarToken) -> Unit,
handleException: (Throwable, () -> Unit) -> Unit,
) {
val uiState by viewModel.uiState.collectAsStateWithLifecycle()
Expand Down Expand Up @@ -110,6 +112,12 @@ fun SusuStatisticsRoute(
onConfirmRequest = navigateToMyInfo,
),
)

SusuStatisticsEffect.ShowNoDataSnackbar -> onShowSnackbar(
SnackbarToken(
message = context.getString(R.string.statistics_susu_no_data_snackbar),
),
)
}
}

Expand All @@ -124,6 +132,7 @@ fun SusuStatisticsRoute(
LaunchedEffect(key1 = Unit) {
viewModel.checkAdditionalInfo()
viewModel.getStatisticsOption()
viewModel.initAge()
}

LaunchedEffect(key1 = uiState.age, key2 = uiState.category, key3 = uiState.relationship) {
Expand Down Expand Up @@ -210,7 +219,7 @@ fun SusuStatisticsScreen(

RecentSpentGraph(
isActive = !uiState.isBlind,
graphTitle = stringResource(R.string.statistics_susu_this_year_spent),
graphTitle = stringResource(R.string.statistics_recent_6_total_money),
spentData = uiState.susuStatistics.recentSpent.toPersistentList(),
maximumAmount = uiState.susuStatistics.recentMaximumSpent,
totalAmount = uiState.susuStatistics.recentTotalSpent,
Expand Down Expand Up @@ -260,7 +269,9 @@ fun SusuStatisticsScreen(
}

PullToRefreshContainer(
modifier = Modifier.align(Alignment.TopCenter).offset(y = -(120).dp),
modifier = Modifier
.align(Alignment.TopCenter)
.offset(y = -(120).dp),
state = refreshState,
containerColor = Gray10,
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,12 @@ import com.susu.core.ui.base.SideEffect
import com.susu.core.ui.base.UiState
import kotlinx.collections.immutable.PersistentList
import kotlinx.collections.immutable.persistentListOf
import java.util.Calendar
import java.util.Date

sealed interface SusuStatisticsEffect : SideEffect {
data object ShowAdditionalInfoDialog : SusuStatisticsEffect
data object ShowNoDataSnackbar : SusuStatisticsEffect
data class HandleException(val throwable: Throwable, val retry: () -> Unit) : SusuStatisticsEffect
data class LogAgeOption(val age: StatisticsAge) : SusuStatisticsEffect
data class LogRelationshipOption(val relationship: String) : SusuStatisticsEffect
Expand All @@ -33,3 +36,19 @@ data class SusuStatisticsState(
enum class StatisticsAge(val num: Int) {
TEN(10), TWENTY(20), THIRTY(30), FOURTY(40), FIFTY(50), SIXTY(60), SEVENTY(70)
}

fun Int.toStatisticsAge(): StatisticsAge? {
val age = currentYear - this + 1
return when {
age in 0..19 -> StatisticsAge.TEN
age in 20..29 -> StatisticsAge.TWENTY
age in 30..39 -> StatisticsAge.THIRTY
age in 40..49 -> StatisticsAge.FOURTY
age in 50..59 -> StatisticsAge.FIFTY
age in 60..69 -> StatisticsAge.SIXTY
age >= 70 -> StatisticsAge.SEVENTY
else -> null
}
}

val currentYear = Calendar.getInstance().get(Calendar.YEAR)
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,8 @@ fun SusuStatisticsOptionSlot(
onCategoryClick: () -> Unit = {},
) {
Column(
modifier = modifier.fillMaxWidth()
modifier = modifier
.fillMaxWidth()
.background(color = Gray10, shape = RoundedCornerShape(4.dp))
.padding(SusuTheme.spacing.spacing_m),
) {
Expand All @@ -54,7 +55,9 @@ fun SusuStatisticsOptionSlot(
)
Spacer(modifier = Modifier.height(SusuTheme.spacing.spacing_xxs))
Column(
modifier = Modifier.fillMaxWidth().background(color = Orange10, shape = RoundedCornerShape(4.dp))
modifier = Modifier
.fillMaxWidth()
.background(color = Orange10, shape = RoundedCornerShape(4.dp))
.padding(horizontal = SusuTheme.spacing.spacing_s, vertical = SusuTheme.spacing.spacing_xxs),
) {
Row(
Expand Down Expand Up @@ -82,7 +85,7 @@ fun SusuStatisticsOptionSlot(
Row(
verticalAlignment = Alignment.Bottom,
) {
if (isBlind) {
if (isBlind || money == 0L) {
Text(
text = stringResource(id = R.string.word_unknown) +
stringResource(id = com.susu.core.designsystem.R.string.money_unit),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import com.susu.core.model.exception.UnknownException
import com.susu.core.ui.base.BaseViewModel
import com.susu.domain.usecase.categoryconfig.GetCategoryConfigUseCase
import com.susu.domain.usecase.envelope.GetRelationShipConfigListUseCase
import com.susu.domain.usecase.mypage.GetUserUseCase
import com.susu.domain.usecase.statistics.CheckAdditionalUserInfoUseCase
import com.susu.domain.usecase.statistics.GetSusuStatisticsUseCase
import dagger.hilt.android.lifecycle.HiltViewModel
Expand All @@ -20,8 +21,20 @@ class SusuStatisticsViewModel @Inject constructor(
private val getCategoryConfigUseCase: GetCategoryConfigUseCase,
private val getRelationShipConfigListUseCase: GetRelationShipConfigListUseCase,
private val getSusuStatisticsUseCase: GetSusuStatisticsUseCase,
private val getUserUseCase: GetUserUseCase,
) : BaseViewModel<SusuStatisticsState, SusuStatisticsEffect>(SusuStatisticsState()) {

fun initAge() {
viewModelScope.launch {
val userAge = getUserUseCase.invoke().getOrNull()?.birth?.toStatisticsAge() ?: StatisticsAge.TWENTY
intent {
copy(
age = userAge
)
}
}
}

fun checkAdditionalInfo() {
viewModelScope.launch {
intent { copy(isLoading = true) }
Expand Down Expand Up @@ -80,6 +93,11 @@ class SusuStatisticsViewModel @Inject constructor(
relationshipId = currentState.relationship.id.toInt(),
categoryId = currentState.category.id,
).onSuccess {

if (it.averageSent == 0L) {
postSideEffect(SusuStatisticsEffect.ShowNoDataSnackbar)
}

intent { copy(susuStatistics = it) }
}.onFailure {
postSideEffect(SusuStatisticsEffect.HandleException(it, ::getSusuStatistics))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import androidx.navigation.NavGraphBuilder
import androidx.navigation.NavOptions
import androidx.navigation.compose.composable
import com.susu.core.ui.DialogToken
import com.susu.core.ui.SnackbarToken
import com.susu.feature.statistics.StatisticsRoute

fun NavController.navigateStatistics(navOptions: NavOptions) {
Expand All @@ -17,6 +18,7 @@ fun NavGraphBuilder.statisticsNavGraph(
navigateToMyInfo: () -> Unit,
navigateToSent: () -> Unit,
onShowDialog: (DialogToken) -> Unit,
onShowSnackbar: (SnackbarToken) -> Unit,
handleException: (Throwable, () -> Unit) -> Unit,
) {
composable(route = StatisticsRoute.route) {
Expand All @@ -25,6 +27,7 @@ fun NavGraphBuilder.statisticsNavGraph(
navigateToMyInfo = navigateToMyInfo,
navigateToSent = navigateToSent,
onShowDialog = onShowDialog,
onShowSnackbar = onShowSnackbar,
handleException = handleException,
)
}
Expand Down
6 changes: 3 additions & 3 deletions feature/statistics/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="statistics_recent_8_total_money">최근 8개월 간 쓴 금액</string>
<string name="statistics_recent_6_total_money">최근 6개월 간 쓴 금액</string>
<string name="statistics_man_format">%s만원</string>
<string name="statistics_total_man_prefix">총 </string>
<string name="statistics_total_man_postfix">만원</string>
Expand All @@ -22,13 +22,13 @@
<string name="word_statistics_to">에</string>
<string name="word_statistics_send">을 보내고 있어요</string>
<string name="word_age_unit">%d대</string>
<string name="word_age_over_unit">%d대 이상</string>
<string name="word_age_over_unit">%d대+</string>
<string name="word_select_option">옵션 선택</string>
<string name="statistics_susu_average_title">지금 평균 수수 보기</string>
<string name="statistics_susu_relationship_average">관계 별 평균 수수</string>
<string name="statistics_susu_category_average">경조사 카테고리 별 평균 수수</string>
<string name="statistics_susu_this_year_spent">올해 쓴 금액</string>
<string name="statistics_my_dialog_title">아직 볼 수 있는 통계가 없어요</string>
<string name="statistics_my_dialog_description">작성된 봉투가 있는 경우 통계를 볼 수 있어요!\n정확한 데이터를 위해 약 3분 정도의 시간이 소요될 수 있어요</string>
<string name="statistics_my_dialog_confirm">봉투 작성하기</string>
<string name="statistics_susu_no_data_snackbar">아직 데이터가 충분하지 않아 금액을 표시할 수 없어요</string>
</resources>
Loading