diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 884892bc..db44c8d5 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -10,8 +10,8 @@ android { defaultConfig { applicationId = "com.withpeace.withpeace" targetSdk = 34 - versionCode = 18 - versionName = "2.3.3" + versionCode = 19 + versionName = "3.0.0" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" vectorDrawables { diff --git a/core/data/src/main/kotlin/com/withpeace/withpeace/core/data/mapper/youthpolicy/PolicyDetailMapper.kt b/core/data/src/main/kotlin/com/withpeace/withpeace/core/data/mapper/youthpolicy/PolicyDetailMapper.kt index 76985b1e..477d2f96 100644 --- a/core/data/src/main/kotlin/com/withpeace/withpeace/core/data/mapper/youthpolicy/PolicyDetailMapper.kt +++ b/core/data/src/main/kotlin/com/withpeace/withpeace/core/data/mapper/youthpolicy/PolicyDetailMapper.kt @@ -3,16 +3,19 @@ package com.withpeace.withpeace.core.data.mapper.youthpolicy import com.withpeace.withpeace.core.domain.model.policy.YouthPolicyDetail import com.withpeace.withpeace.core.network.di.response.policy.PolicyDetailResponse -internal fun PolicyDetailResponse.toDomain(): YouthPolicyDetail { +fun PolicyDetailResponse.toDomain(): YouthPolicyDetail { return YouthPolicyDetail( id = id, title = title, introduce = introduce, - ageInfo = ageInfo, classification = classification.codeToPolicyClassification(), applicationDetails = applicationDetails, - residenceAndIncome = residenceAndIncome, + applicationPeriodStatus = applicationPeriodStatus, + operationPeriod = operationPeriod, + ageInfo = ageInfo, + residence = residence, + income = income, education = education, specialization = specialization, additionalNotes = additionalNotes, @@ -21,11 +24,11 @@ internal fun PolicyDetailResponse.toDomain(): YouthPolicyDetail { screeningAndAnnouncement = screeningAndAnnouncement, applicationSite = applicationSite, submissionDocuments = submissionDocuments, - additionalUsefulInformation = additionalUsefulInformation, - supervisingAuthority = supervisingAuthority, + etc = etc, + managingInstitution = managingInstitution, operatingOrganization = operatingOrganization, - businessRelatedReferenceSite1 = businessRelatedReferenceSite1, - businessRelatedReferenceSite2 = businessRelatedReferenceSite2, + referenceSite1 = referenceSite1, + referenceSite2 = referenceSite2, isBookmarked = isBookmarked, ) } \ No newline at end of file diff --git a/core/data/src/main/kotlin/com/withpeace/withpeace/core/data/mapper/youthpolicy/PolicyMapper.kt b/core/data/src/main/kotlin/com/withpeace/withpeace/core/data/mapper/youthpolicy/PolicyMapper.kt index 70e39794..2a57bdae 100644 --- a/core/data/src/main/kotlin/com/withpeace/withpeace/core/data/mapper/youthpolicy/PolicyMapper.kt +++ b/core/data/src/main/kotlin/com/withpeace/withpeace/core/data/mapper/youthpolicy/PolicyMapper.kt @@ -10,10 +10,11 @@ internal fun PolicyResponse.toDomain(): YouthPolicy { id = id, title = title, introduce = introduce, - region = region.codeToRegion(), + region = region.firstOrNull().codeToRegion(), //TODO 추후 변경 필요 policyClassification = classification.codeToPolicyClassification(), ageInfo = ageInfo, isBookmarked = isBookmarked, + applicationPeriodStatus = applicationPeriodStatus, ) } @@ -21,27 +22,27 @@ internal fun String?.codeToRegion(): PolicyRegion { return PolicyRegion.entries.find { it.toString() == this } ?: PolicyRegion.기타 } -internal fun PolicyRegion.toCode(): String { +internal fun PolicyRegion.toEnglish(): String { return when (this) { - PolicyRegion.중앙부처 -> "003001" - PolicyRegion.서울 -> "003002001" - PolicyRegion.부산 -> "003002002" - PolicyRegion.대구 -> "003002003" - PolicyRegion.인천 -> "003002004" - PolicyRegion.광주 -> "003002005" - PolicyRegion.대전 -> "003002006" - PolicyRegion.울산 -> "003002007" - PolicyRegion.경기 -> "003002008" - PolicyRegion.강원 -> "003002009" - PolicyRegion.충북 -> "003002010" - PolicyRegion.충남 -> "003002011" - PolicyRegion.전북 -> "003002012" - PolicyRegion.전남 -> "003002013" - PolicyRegion.경북 -> "003002014" - PolicyRegion.경남 -> "003002015" - PolicyRegion.제주 -> "003002016" - PolicyRegion.세종 -> "003002017" - PolicyRegion.기타 -> throw IllegalStateException("찾을 수 없는 지역입니다.") + PolicyRegion.전국 -> "NATIONWIDE" + PolicyRegion.서울 -> "SEOUL" + PolicyRegion.부산 -> "BUSAN" + PolicyRegion.대구 -> "DAEGU" + PolicyRegion.인천 -> "INCHEON" + PolicyRegion.광주 -> "GWANGJU" + PolicyRegion.대전 -> "DAEJEON" + PolicyRegion.울산 -> "ULSAN" + PolicyRegion.경기 -> "GYEONGGI" + PolicyRegion.강원 -> "GANGWON" + PolicyRegion.충북 -> "CHUNGBUK" + PolicyRegion.충남 -> "CHUNGNAM" + PolicyRegion.전북 -> "JEONBUK" + PolicyRegion.전남 -> "JEONNAM" + PolicyRegion.경북 -> "GYEONGBUK" + PolicyRegion.경남 -> "GYEONGNAM" + PolicyRegion.제주 -> "JEJU" + PolicyRegion.세종 -> "SEJONG" + PolicyRegion.기타 -> "ETC" } } @@ -49,13 +50,13 @@ internal fun String?.codeToPolicyClassification(): PolicyClassification { return PolicyClassification.entries.find { it.toString() == this } ?: PolicyClassification.ETC } -internal fun PolicyClassification.toCode(): String { +internal fun PolicyClassification.toEnglish(): String { return when (this) { - PolicyClassification.JOB -> "023010" - PolicyClassification.RESIDENT -> "023020" - PolicyClassification.EDUCATION -> "023030" - PolicyClassification.WELFARE_AND_CULTURE -> "023040" - PolicyClassification.PARTICIPATION_AND_RIGHT -> "023050" + PolicyClassification.JOB -> "JOB" + PolicyClassification.RESIDENT -> "RESIDENT" + PolicyClassification.EDUCATION -> "EDUCATION" + PolicyClassification.WELFARE_AND_CULTURE -> "WELFARE_AND_CULTURE" + PolicyClassification.PARTICIPATION_AND_RIGHT -> "PARTICIPATION_AND_RIGHT" PolicyClassification.ETC -> throw IllegalStateException("정책 분류를 찾을 수 없습니다.") } } \ No newline at end of file diff --git a/core/data/src/main/kotlin/com/withpeace/withpeace/core/data/paging/YouthPolicyPagingSource.kt b/core/data/src/main/kotlin/com/withpeace/withpeace/core/data/paging/YouthPolicyPagingSource.kt index 6b762a5b..8a895511 100644 --- a/core/data/src/main/kotlin/com/withpeace/withpeace/core/data/paging/YouthPolicyPagingSource.kt +++ b/core/data/src/main/kotlin/com/withpeace/withpeace/core/data/paging/YouthPolicyPagingSource.kt @@ -1,9 +1,12 @@ package com.withpeace.withpeace.core.data.paging +import android.util.Log import androidx.paging.PagingSource import androidx.paging.PagingState import com.skydoves.sandwich.ApiResponse -import com.withpeace.withpeace.core.data.mapper.youthpolicy.toCode +import com.skydoves.sandwich.message +import com.skydoves.sandwich.onFailure +import com.withpeace.withpeace.core.data.mapper.youthpolicy.toEnglish import com.withpeace.withpeace.core.data.mapper.youthpolicy.toDomain import com.withpeace.withpeace.core.domain.model.error.CheonghaError import com.withpeace.withpeace.core.domain.model.error.ClientError @@ -26,8 +29,8 @@ class YouthPolicyPagingSource( val response = youthPolicyService.getPolicies( display = params.loadSize, pageIndex = pageIndex, - region = filterInfo.regions.joinToString(",") { it.toCode() }, - classification = filterInfo.classifications.joinToString(",") { it.toCode() }, + region = filterInfo.regions.joinToString(",") { it.toEnglish() }, + classification = filterInfo.classifications.joinToString(",") { it.toEnglish() }, ) if (response is ApiResponse.Success) { @@ -38,6 +41,9 @@ class YouthPolicyPagingSource( nextKey = if (successResponse.data.isEmpty()) null else pageIndex + (params.loadSize / pageSize), ) } else { + response.onFailure { + Log.d("TAG12", "load: ${this.message()}") + } // 방법1 Error exception 으로 구분 // 방법2 exception을 하단에서 방출 return LoadResult.Error(IllegalStateException("api state error")) diff --git a/core/data/src/main/kotlin/com/withpeace/withpeace/core/data/repository/DefaultUserRepository.kt b/core/data/src/main/kotlin/com/withpeace/withpeace/core/data/repository/DefaultUserRepository.kt index 4a8b6664..d3302e23 100644 --- a/core/data/src/main/kotlin/com/withpeace/withpeace/core/data/repository/DefaultUserRepository.kt +++ b/core/data/src/main/kotlin/com/withpeace/withpeace/core/data/repository/DefaultUserRepository.kt @@ -7,7 +7,7 @@ import com.withpeace.withpeace.core.analytics.AnalyticsEvent import com.withpeace.withpeace.core.analytics.AnalyticsHelper import com.withpeace.withpeace.core.data.analytics.event import com.withpeace.withpeace.core.data.mapper.toDomain -import com.withpeace.withpeace.core.data.mapper.youthpolicy.toCode +import com.withpeace.withpeace.core.data.mapper.youthpolicy.toEnglish import com.withpeace.withpeace.core.data.mapper.youthpolicy.toDomain import com.withpeace.withpeace.core.data.util.convertToFile import com.withpeace.withpeace.core.data.util.handleApiFailure @@ -141,8 +141,8 @@ class DefaultUserRepository @Inject constructor( onError: suspend (CheonghaError) -> Unit, ): Flow = flow { userService.patchPolicyFilter( - region = policyFilters.regions.joinToString(",") { it.toCode() }, - classification = policyFilters.classifications.joinToString(",") { it.toCode() }, + region = policyFilters.regions.joinToString(",") { it.toEnglish() }, + classification = policyFilters.classifications.joinToString(",") { it.toEnglish() }, ).suspendMapSuccess { emit(Unit) }.handleApiFailure(onError) diff --git a/core/data/src/main/kotlin/com/withpeace/withpeace/core/data/repository/DefaultYouthPolicyRepository.kt b/core/data/src/main/kotlin/com/withpeace/withpeace/core/data/repository/DefaultYouthPolicyRepository.kt index ad625e6e..92aeffb6 100644 --- a/core/data/src/main/kotlin/com/withpeace/withpeace/core/data/repository/DefaultYouthPolicyRepository.kt +++ b/core/data/src/main/kotlin/com/withpeace/withpeace/core/data/repository/DefaultYouthPolicyRepository.kt @@ -4,6 +4,8 @@ import android.util.Log import androidx.paging.Pager import androidx.paging.PagingConfig import androidx.paging.PagingData +import com.skydoves.sandwich.message +import com.skydoves.sandwich.onFailure import com.skydoves.sandwich.suspendMapSuccess import com.withpeace.withpeace.core.data.mapper.youthpolicy.toDomain import com.withpeace.withpeace.core.data.paging.PolicySearchPagingSource @@ -50,6 +52,8 @@ class DefaultYouthPolicyRepository @Inject constructor( ): Flow = flow { youthPolicyService.getPolicyDetail(policyId).suspendMapSuccess { emit(data.toDomain()) + }.onFailure { + Log.d("TAG12", "getPolicy: ${this.message()}") }.handleApiFailure { onErrorWithAuthExpired(it, onError) } diff --git a/core/domain/src/main/java/com/withpeace/withpeace/core/domain/model/balancegame/BalanceGame.kt b/core/domain/src/main/java/com/withpeace/withpeace/core/domain/model/balancegame/BalanceGame.kt index 0ec02abb..d27726c4 100644 --- a/core/domain/src/main/java/com/withpeace/withpeace/core/domain/model/balancegame/BalanceGame.kt +++ b/core/domain/src/main/java/com/withpeace/withpeace/core/domain/model/balancegame/BalanceGame.kt @@ -19,9 +19,6 @@ data class BalanceGame( ) { fun getAPercentage(): Int { val totalSum = optionACount.toDouble() + optionBCount.toDouble() - if(id== 7L) { - println(totalSum) - } if (totalSum == 0.0) { return 0 } diff --git a/core/domain/src/main/java/com/withpeace/withpeace/core/domain/model/policy/PolicyRegion.kt b/core/domain/src/main/java/com/withpeace/withpeace/core/domain/model/policy/PolicyRegion.kt index 7d7b0232..ef997c08 100644 --- a/core/domain/src/main/java/com/withpeace/withpeace/core/domain/model/policy/PolicyRegion.kt +++ b/core/domain/src/main/java/com/withpeace/withpeace/core/domain/model/policy/PolicyRegion.kt @@ -1,5 +1,5 @@ package com.withpeace.withpeace.core.domain.model.policy enum class PolicyRegion { - 중앙부처, 서울, 부산, 대구, 인천, 광주, 대전, 울산, 경기, 강원, 충북, 충남, 전북, 전남, 경북, 경남, 제주, 세종, 기타 + 전국, 서울, 부산, 대구, 인천, 광주, 대전, 울산, 경기, 강원, 충북, 충남, 전북, 전남, 경북, 경남, 제주, 세종, 기타, } \ No newline at end of file diff --git a/core/domain/src/main/java/com/withpeace/withpeace/core/domain/model/policy/YouthPolicy.kt b/core/domain/src/main/java/com/withpeace/withpeace/core/domain/model/policy/YouthPolicy.kt index 9190476e..7b2a5d02 100644 --- a/core/domain/src/main/java/com/withpeace/withpeace/core/domain/model/policy/YouthPolicy.kt +++ b/core/domain/src/main/java/com/withpeace/withpeace/core/domain/model/policy/YouthPolicy.kt @@ -8,4 +8,5 @@ data class YouthPolicy( val policyClassification: PolicyClassification, val ageInfo: String, val isBookmarked: Boolean, + val applicationPeriodStatus: String, ) diff --git a/core/domain/src/main/java/com/withpeace/withpeace/core/domain/model/policy/YouthPolicyDetail.kt b/core/domain/src/main/java/com/withpeace/withpeace/core/domain/model/policy/YouthPolicyDetail.kt index 0f8c1c46..1670aeb4 100644 --- a/core/domain/src/main/java/com/withpeace/withpeace/core/domain/model/policy/YouthPolicyDetail.kt +++ b/core/domain/src/main/java/com/withpeace/withpeace/core/domain/model/policy/YouthPolicyDetail.kt @@ -4,11 +4,14 @@ data class YouthPolicyDetail( val id: String, val title: String, val introduce: String, - val ageInfo: String, val classification: PolicyClassification, val applicationDetails: String, - val residenceAndIncome: String, + val applicationPeriodStatus: String, + val operationPeriod: String, + val ageInfo: String, + val residence: String, + val income: String, val education: String, val specialization: String, val additionalNotes: String, @@ -17,11 +20,10 @@ data class YouthPolicyDetail( val screeningAndAnnouncement: String, val applicationSite: String, val submissionDocuments: String, - - val additionalUsefulInformation: String, - val supervisingAuthority: String, + val etc: String, + val managingInstitution: String, val operatingOrganization: String, - val businessRelatedReferenceSite1: String, - val businessRelatedReferenceSite2: String, + val referenceSite1: String, + val referenceSite2: String, val isBookmarked: Boolean, -) +) \ No newline at end of file diff --git a/core/network/src/main/java/com/withpeace/withpeace/core/network/di/response/policy/PolicyDetailResponse.kt b/core/network/src/main/java/com/withpeace/withpeace/core/network/di/response/policy/PolicyDetailResponse.kt index 5fc6e946..6e24ed5e 100644 --- a/core/network/src/main/java/com/withpeace/withpeace/core/network/di/response/policy/PolicyDetailResponse.kt +++ b/core/network/src/main/java/com/withpeace/withpeace/core/network/di/response/policy/PolicyDetailResponse.kt @@ -10,8 +10,11 @@ data class PolicyDetailResponse( val introduce: String, // 정책 소개 val classification: String, // 정책 분야 val applicationDetails: String, // 지원 내용 + val applicationPeriodStatus: String, // 신청기간 상태 + val operationPeriod: String, // 운영 기간 val ageInfo: String, // 연령 - val residenceAndIncome: String, // 거주지 및 소득 + val residence: String, // 거주지 + val income: String, // 소득 val education: String, // 학력 val specialization: String, // 특화 분야 val additionalNotes: String, // 추가 단서 사항 @@ -20,10 +23,10 @@ data class PolicyDetailResponse( val screeningAndAnnouncement: String, // 심사 및 발표 val applicationSite: String, // 신청 사이트 val submissionDocuments: String, // 제출 서류 - val additionalUsefulInformation: String, // 기타 유익 정보 - val supervisingAuthority: String, // 주관 기관 + val etc: String, // 기타 유익 정보 + val managingInstitution: String, // 주관 기관 val operatingOrganization: String, // 운영 기관 - val businessRelatedReferenceSite1: String, // 사업관련 참고 사이트 1 - val businessRelatedReferenceSite2: String, // 사업관련 참고 사이트 2 - @SerialName("isFavorite") val isBookmarked: Boolean, -) + val referenceSite1: String, // 참고 사이트 1 + val referenceSite2: String, // 참고 사이트 2 + @SerialName("isFavorite") val isBookmarked: Boolean // 찜하기 여부 +) \ No newline at end of file diff --git a/core/network/src/main/java/com/withpeace/withpeace/core/network/di/response/policy/PolicyResponse.kt b/core/network/src/main/java/com/withpeace/withpeace/core/network/di/response/policy/PolicyResponse.kt index cb844d40..fac6334b 100644 --- a/core/network/src/main/java/com/withpeace/withpeace/core/network/di/response/policy/PolicyResponse.kt +++ b/core/network/src/main/java/com/withpeace/withpeace/core/network/di/response/policy/PolicyResponse.kt @@ -9,7 +9,8 @@ data class PolicyResponse( val title: String, val introduce: String, val classification: String, - val region: String, + val region: List, val ageInfo: String, @SerialName("isFavorite") val isBookmarked: Boolean = false, + val applicationPeriodStatus: String, ) diff --git a/core/ui/src/main/java/com/withpeace/withpeace/core/ui/policy/RegionUiModel.kt b/core/ui/src/main/java/com/withpeace/withpeace/core/ui/policy/RegionUiModel.kt index bae625cd..b4b3e56e 100644 --- a/core/ui/src/main/java/com/withpeace/withpeace/core/ui/policy/RegionUiModel.kt +++ b/core/ui/src/main/java/com/withpeace/withpeace/core/ui/policy/RegionUiModel.kt @@ -4,7 +4,7 @@ import com.withpeace.withpeace.core.domain.model.policy.PolicyRegion @kotlinx.serialization.Serializable enum class RegionUiModel { - 중앙부처, 서울, 부산, 대구, 인천, 광주, 대전, 울산, 경기, 강원, 충북, 충남, 전북, 전남, 경북, 경남, 제주, 세종, 기타 + 전국, 서울, 부산, 대구, 인천, 광주, 대전, 울산, 경기, 강원, 충북, 충남, 전북, 전남, 경북, 경남, 제주, 세종, 기타, } fun PolicyRegion.toUiModel(): RegionUiModel { diff --git a/core/ui/src/main/java/com/withpeace/withpeace/core/ui/policy/YouthPolicyUiModel.kt b/core/ui/src/main/java/com/withpeace/withpeace/core/ui/policy/YouthPolicyUiModel.kt index 329bdaed..ef3b1cfa 100644 --- a/core/ui/src/main/java/com/withpeace/withpeace/core/ui/policy/YouthPolicyUiModel.kt +++ b/core/ui/src/main/java/com/withpeace/withpeace/core/ui/policy/YouthPolicyUiModel.kt @@ -10,6 +10,7 @@ data class YouthPolicyUiModel( val ageInfo: String, val classification: ClassificationUiModel, val isBookmarked: Boolean, + val applicationPeriodStatus: String, ) fun YouthPolicy.toUiModel(): YouthPolicyUiModel { @@ -21,6 +22,7 @@ fun YouthPolicy.toUiModel(): YouthPolicyUiModel { ageInfo = ageInfo, classification = policyClassification.toUiModel(), isBookmarked = isBookmarked, + applicationPeriodStatus = applicationPeriodStatus, ) } @@ -33,5 +35,6 @@ fun YouthPolicyUiModel.toDomain(): YouthPolicy { policyClassification = classification.toDomain(), ageInfo = ageInfo, isBookmarked = isBookmarked, + applicationPeriodStatus = applicationPeriodStatus, ) } diff --git a/feature/home/src/main/java/com/withpeace/withpeace/feature/home/uistate/YouthPolicyUiModel.kt b/feature/home/src/main/java/com/withpeace/withpeace/feature/home/uistate/YouthPolicyUiModel.kt index 71553529..faf5df0c 100644 --- a/feature/home/src/main/java/com/withpeace/withpeace/feature/home/uistate/YouthPolicyUiModel.kt +++ b/feature/home/src/main/java/com/withpeace/withpeace/feature/home/uistate/YouthPolicyUiModel.kt @@ -14,6 +14,7 @@ data class YouthPolicyUiModel( val ageInfo: String, val classification: ClassificationUiModel, val isBookmarked: Boolean, + val applicationPeriodStatus: String, ) fun YouthPolicy.toUiModel(): YouthPolicyUiModel { @@ -25,6 +26,7 @@ fun YouthPolicy.toUiModel(): YouthPolicyUiModel { ageInfo = ageInfo, classification = policyClassification.toUiModel(), isBookmarked = isBookmarked, + applicationPeriodStatus = applicationPeriodStatus, ) } @@ -37,6 +39,7 @@ fun YouthPolicyUiModel.toDomain(): YouthPolicy { policyClassification = classification.toDomain(), ageInfo = ageInfo, isBookmarked = isBookmarked, + applicationPeriodStatus = applicationPeriodStatus ) } diff --git a/feature/policydetail/src/main/java/com/withpeace/withpeace/feature/policydetail/PolicyDetailScreen.kt b/feature/policydetail/src/main/java/com/withpeace/withpeace/feature/policydetail/PolicyDetailScreen.kt index f83d0254..30a11cab 100644 --- a/feature/policydetail/src/main/java/com/withpeace/withpeace/feature/policydetail/PolicyDetailScreen.kt +++ b/feature/policydetail/src/main/java/com/withpeace/withpeace/feature/policydetail/PolicyDetailScreen.kt @@ -6,12 +6,15 @@ import androidx.compose.animation.fadeOut import androidx.compose.foundation.Image import androidx.compose.foundation.background 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.width import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.verticalScroll import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Text @@ -20,7 +23,9 @@ import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color import androidx.compose.ui.layout.onGloballyPositioned import androidx.compose.ui.layout.positionInParent import androidx.compose.ui.res.painterResource @@ -50,7 +55,7 @@ import eu.wewox.textflow.TextFlowObstacleAlignment fun PolicyDetailRoute( onShowSnackBar: (message: String) -> Unit, onNavigationSnackbar: (message: String) -> Unit, - viewModel: PolicyDetailViewModel = hiltViewModel(), + viewModel: PolicyDetailViewModel = hiltViewModel(), onClickBackButton: () -> Unit, ) { val policyDetailUiState = viewModel.policyDetailUiState.collectAsStateWithLifecycle() @@ -211,11 +216,69 @@ private fun TitleSection( modifier = modifier.padding(horizontal = 24.dp), ) { Spacer(modifier = modifier.height(24.dp)) - Text( - text = policy.title, - style = WithpeaceTheme.typography.title1, - color = WithpeaceTheme.colors.SystemBlack, - ) + Row(verticalAlignment = Alignment.CenterVertically) { + val policyApplicationPeriodStatus = policy.applicationPeriodStatus + if(policyApplicationPeriodStatus.contains("D-")) { + val period = policyApplicationPeriodStatus.substringAfter("D-").toIntOrNull() ?: 99 + if(period <= 7) { + Text( + policyApplicationPeriodStatus, + modifier = modifier + .background( + shape = RoundedCornerShape(10.dp), + color = Color(0xFFFF6868), + ) + .padding(horizontal = 8.dp, vertical = 4.dp), + style = WithpeaceTheme.typography.Tag, + color = WithpeaceTheme.colors.SystemGray3, + ) + } else if(period in 8..14) { + Text( + policyApplicationPeriodStatus, + modifier = modifier + .background( + shape = RoundedCornerShape(10.dp), + color = Color(0xFFFFB762), + ) + .padding(horizontal = 8.dp, vertical = 4.dp), + style = WithpeaceTheme.typography.Tag, + color = WithpeaceTheme.colors.SystemGray3, + ) + } else { + Text( + policyApplicationPeriodStatus, + modifier = modifier + .background( + shape = RoundedCornerShape(10.dp), + color = Color(0xFF61B0FF), + ) + .padding(horizontal = 8.dp, vertical = 4.dp), + style = WithpeaceTheme.typography.Tag, + color = WithpeaceTheme.colors.SystemGray3, + ) + } + } else { + Text( + policyApplicationPeriodStatus, + modifier = modifier + .background( + shape = RoundedCornerShape(10.dp), + color = Color(0xFF61B0FF), + ) + .padding(horizontal = 8.dp, vertical = 4.dp), + style = WithpeaceTheme.typography.Tag, + color = WithpeaceTheme.colors.SystemGray3, + ) + } + + Spacer(modifier = modifier.width(8.dp)) + Text( + text = policy.title, + style = WithpeaceTheme.typography.title1, + color = WithpeaceTheme.colors.SystemBlack, + ) + } + Spacer( modifier = modifier .fillMaxWidth() @@ -268,6 +331,11 @@ fun PolicySummarySection(modifier: Modifier = Modifier, policy: YouthPolicyDetai title = "지원 내용", content = policy.applicationDetails, ) + DescriptionTitleAndContent( + modifier = modifier, + title = "운영 기간", + content = policy.operationPeriod, + ) Spacer(modifier = modifier.height(8.dp)) } @@ -289,8 +357,13 @@ fun ApplyQualificationSection( DescriptionTitleAndContent(modifier = modifier, title = "연령", content = policy.ageInfo) DescriptionTitleAndContent( modifier = modifier, - title = "거주지 및 소득", - content = policy.residenceAndIncome, + title = "거주지", + content = policy.residence, + ) + DescriptionTitleAndContent( + modifier = modifier, + title = "소득", + content = policy.income, ) DescriptionTitleAndContent(modifier = modifier, title = "학력", content = policy.education) DescriptionTitleAndContent( @@ -380,12 +453,12 @@ fun AdditionalInfoSection( HyperLinkDescriptionTitleAndContent( modifier = modifier, title = "사업관련 참고 사이트 1", - content = policy.businessRelatedReferenceSite1, + content = policy.referenceSite1, ) HyperLinkDescriptionTitleAndContent( modifier = modifier, title = "사업관련 참고 사이트 2", - content = policy.businessRelatedReferenceSite2, + content = policy.referenceSite2, ) Spacer(modifier = modifier.height(24.dp)) } @@ -397,27 +470,30 @@ fun PolicyDetailPreview() { WithpeaceTheme { PolicyDetailContent( policy = YouthPolicyDetailUiModel( - id = "sociosqu", - title = "facilis", - content = "가나다라마사바가나다라마사바가나다라마사바가나다라마사바가나다라마사바가나다라마사바가나다라마사바가나다라마사바가나다라마사바가나다라마사바가나다라마사바가나다라마사바가나다라마사바가나다라마사바가나다라마사바가나다라마사바가나다라마사바가나다라마사바가나다라마사바가나다라마사바가나다라마사바가나다라마사바가나다라마사바", - ageInfo = "cum", - applicationDetails = "지원내용들.....", - residenceAndIncome = "sale", - education = "vestibulum", - specialization = "mattis", - additionalNotes = "arcu", - participationRestrictions = "urna", - applicationProcess = "deterruisset", - screeningAndAnnouncement = "adolescens", - applicationSite = "consul", - submissionDocuments = "an", + id = "vestibulum", + title = "delenit", + content = "adipiscing", + ageInfo = "vocent", classification = ClassificationUiModel.JOB, - additionalUsefulInformation = "lorem", - supervisingAuthority = "congue", - operatingOrganization = "brute", - businessRelatedReferenceSite1 = "noluisse", - businessRelatedReferenceSite2 = "quo", - isBookmarked = false + applicationDetails = "sociis", + applicationPeriodStatus = "epicurei", + operationPeriod = "animal", + residence = "fugit", + income = "ferri", + education = "populo", + specialization = "duis", + additionalNotes = "mel", + participationRestrictions = "nunc", + applicationProcess = "sea", + screeningAndAnnouncement = "ridens", + applicationSite = "malesuada", + submissionDocuments = "fuisset", + additionalUsefulInformation = "conceptam", + supervisingAuthority = "tortor", + operatingOrganization = "iisque", + referenceSite1 = "dolores", + referenceSite2 = "interpretaris", + isBookmarked = false, ), onClickBackButton = {}, onBookmarkClick = {}, diff --git a/feature/policydetail/src/main/java/com/withpeace/withpeace/feature/policydetail/uistate/YouthPolicyDetailUiModel.kt b/feature/policydetail/src/main/java/com/withpeace/withpeace/feature/policydetail/uistate/YouthPolicyDetailUiModel.kt index 01113dec..34c15f5f 100644 --- a/feature/policydetail/src/main/java/com/withpeace/withpeace/feature/policydetail/uistate/YouthPolicyDetailUiModel.kt +++ b/feature/policydetail/src/main/java/com/withpeace/withpeace/feature/policydetail/uistate/YouthPolicyDetailUiModel.kt @@ -13,7 +13,10 @@ data class YouthPolicyDetailUiModel( val classification: ClassificationUiModel, val applicationDetails: String, - val residenceAndIncome: String, + val applicationPeriodStatus: String, + val operationPeriod: String, + val residence: String, + val income: String, val education: String, val specialization: String, val additionalNotes: String, @@ -23,12 +26,12 @@ data class YouthPolicyDetailUiModel( val applicationSite: String, val submissionDocuments: String, - //추가 정보를 확인해 보세요 + // 추가 정보를 확인해 보세요 val additionalUsefulInformation: String, val supervisingAuthority: String, val operatingOrganization: String, - val businessRelatedReferenceSite1: String, - val businessRelatedReferenceSite2: String, + val referenceSite1: String, + val referenceSite2: String, val isBookmarked: Boolean, ) @@ -42,7 +45,10 @@ fun YouthPolicyDetail.toUiModel(): YouthPolicyDetailUiModel { classification = classification.toUiModel(), applicationDetails = applicationDetails, - residenceAndIncome = residenceAndIncome, + applicationPeriodStatus = applicationPeriodStatus, + operationPeriod = operationPeriod, + residence = residence, + income = income, education = education, specialization = specialization, additionalNotes = additionalNotes, @@ -51,11 +57,11 @@ fun YouthPolicyDetail.toUiModel(): YouthPolicyDetailUiModel { screeningAndAnnouncement = screeningAndAnnouncement, applicationSite = applicationSite, submissionDocuments = submissionDocuments, - additionalUsefulInformation = additionalUsefulInformation, - supervisingAuthority = supervisingAuthority, + additionalUsefulInformation = etc, + supervisingAuthority = managingInstitution, operatingOrganization = operatingOrganization, - businessRelatedReferenceSite1 = businessRelatedReferenceSite1, - businessRelatedReferenceSite2 = businessRelatedReferenceSite2, + referenceSite1 = referenceSite1, + referenceSite2 = referenceSite2, isBookmarked = isBookmarked, ) } @@ -69,7 +75,10 @@ fun YouthPolicyDetailUiModel.toDomain(): YouthPolicyDetail { classification = classification.toDomain(), applicationDetails = applicationDetails, - residenceAndIncome = residenceAndIncome, + applicationPeriodStatus = applicationPeriodStatus, + operationPeriod = operationPeriod, + residence = residence, + income = income, education = education, specialization = specialization, additionalNotes = additionalNotes, @@ -78,11 +87,11 @@ fun YouthPolicyDetailUiModel.toDomain(): YouthPolicyDetail { screeningAndAnnouncement = screeningAndAnnouncement, applicationSite = applicationSite, submissionDocuments = submissionDocuments, - additionalUsefulInformation = additionalUsefulInformation, - supervisingAuthority = supervisingAuthority, + etc = additionalUsefulInformation, + managingInstitution = supervisingAuthority, operatingOrganization = operatingOrganization, - businessRelatedReferenceSite1 = businessRelatedReferenceSite1, - businessRelatedReferenceSite2 = businessRelatedReferenceSite2, + referenceSite1 = referenceSite1, + referenceSite2 = referenceSite2, isBookmarked = isBookmarked, ) -} \ No newline at end of file +} diff --git a/feature/policylist/src/main/java/com/withpeace/withpeace/feature/policylist/PolicyListScreen.kt b/feature/policylist/src/main/java/com/withpeace/withpeace/feature/policylist/PolicyListScreen.kt index 84df4d84..d16db690 100644 --- a/feature/policylist/src/main/java/com/withpeace/withpeace/feature/policylist/PolicyListScreen.kt +++ b/feature/policylist/src/main/java/com/withpeace/withpeace/feature/policylist/PolicyListScreen.kt @@ -42,6 +42,7 @@ import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp +import androidx.constraintlayout.compose.ChainStyle import androidx.constraintlayout.compose.ConstraintLayout import androidx.constraintlayout.compose.Dimension import androidx.hilt.navigation.compose.hiltViewModel @@ -368,9 +369,11 @@ private fun YouthPolicyCard( ) { val ( title, content, - region, ageRange, thumbnail, heart, + region, ageRange, thumbnail, heart, dDay, ) = createRefs() + createVerticalChain(thumbnail, dDay, chainStyle = ChainStyle.SpreadInside) + Text( text = youthPolicy.title, modifier.constrainAs( @@ -468,11 +471,97 @@ private fun YouthPolicyCard( start.linkTo(title.end) end.linkTo(parent.end) top.linkTo(parent.top) + bottom.linkTo(dDay.top) }, ), painter = painterResource(id = youthPolicy.classification.drawableResId), contentDescription = stringResource(R.string.policy_classification_image), ) + val policyApplicationPeriodStatus = youthPolicy.applicationPeriodStatus + if (policyApplicationPeriodStatus.contains("D-")) { + val period = policyApplicationPeriodStatus.substringAfter("D-").toIntOrNull() ?: 99 + if (period <= 7) { + Text( + policyApplicationPeriodStatus, + modifier = modifier + .background( + shape = RoundedCornerShape(10.dp), + color = Color(0xFFFF6868), + ) + .padding(horizontal = 8.dp, vertical = 4.dp) + .constrainAs( + dDay, + { + top.linkTo(thumbnail.bottom) + end.linkTo(parent.end) + bottom.linkTo(parent.bottom) + }, + ), + style = WithpeaceTheme.typography.Tag, + color = WithpeaceTheme.colors.SystemGray3, + ) + } else if (period in 8..14) { + Text( + policyApplicationPeriodStatus, + modifier = modifier + .background( + shape = RoundedCornerShape(10.dp), + color = Color(0xFFFFB762), + ) + .padding(horizontal = 8.dp, vertical = 4.dp) + .constrainAs( + dDay, + { + top.linkTo(thumbnail.bottom) + end.linkTo(parent.end) + bottom.linkTo(parent.bottom) + }, + ), + style = WithpeaceTheme.typography.Tag, + color = WithpeaceTheme.colors.SystemGray3, + ) + } else { + Text( + policyApplicationPeriodStatus, + modifier = modifier + .background( + shape = RoundedCornerShape(10.dp), + color = Color(0xFF61B0FF), + ) + .padding(horizontal = 8.dp, vertical = 4.dp) + .constrainAs( + dDay, + { + top.linkTo(thumbnail.bottom) + end.linkTo(parent.end) + bottom.linkTo(parent.bottom) + }, + ), + style = WithpeaceTheme.typography.Tag, + color = WithpeaceTheme.colors.SystemGray3, + ) + } + } else { + Text( + policyApplicationPeriodStatus, + modifier = modifier + .background( + shape = RoundedCornerShape(10.dp), + color = Color(0xFF61B0FF), + ) + .padding(horizontal = 8.dp, vertical = 4.dp) + .constrainAs( + dDay, + { + top.linkTo(thumbnail.bottom) + end.linkTo(parent.end) + bottom.linkTo(parent.bottom) + }, + ), + style = WithpeaceTheme.typography.Tag, + color = WithpeaceTheme.colors.SystemGray3, + ) + } } } } @@ -494,6 +583,7 @@ fun PolicyListPreview() { ageInfo = "quo", classification = ClassificationUiModel.JOB, isBookmarked = false, + applicationPeriodStatus = "D-7", ), ), ),