Skip to content

Commit

Permalink
[FEAT/#220] 공고 상세 페이지 스크랩 다이얼로그 구분
Browse files Browse the repository at this point in the history
  • Loading branch information
arinming committed Sep 9, 2024
1 parent be0679b commit 011571f
Show file tree
Hide file tree
Showing 4 changed files with 66 additions and 114 deletions.
68 changes: 38 additions & 30 deletions feature/src/main/java/com/terning/feature/intern/InternRoute.kt
Original file line number Diff line number Diff line change
Expand Up @@ -73,20 +73,22 @@ fun InternRoute(
is UiState.Failure -> {}
is UiState.Success -> {
InternScreen(
announcementId = announcementId,
internUiState = internState,
modifier = modifier,
internInfo = (internState.loadState as UiState.Success).data,
navController = navController,
onDismissCancelDialog = {
viewModel.updateScrapDialogVisibility(false)
viewModel.updateScrapCancelDialogVisibility(false)
},
onDismissInternDialog = {
viewModel.updateScrapDialogVisibility(false)
onDismissScrapDialog = { viewModel.updateInternDialogVisibility(false) },
onClickCancelButton = {
viewModel.updateScrapCancelDialogVisibility(true)
},
onClickScrapButton = { detail ->
onClickScrapButton = {
with(viewModel) {
updateInternshipModel(detail)
updateScrapDialogVisibility(true)
updateInternshipModel(it)
updateInternDialogVisibility(true)
}
}
)
Expand All @@ -96,13 +98,14 @@ fun InternRoute(

@Composable
fun InternScreen(
announcementId: Long,
modifier: Modifier = Modifier,
navController: NavHostController,
viewModel: InternViewModel = hiltViewModel(),
internUiState: InternUiState,
internInfo: InternInfo,
onDismissCancelDialog: (Boolean) -> Unit,
onDismissInternDialog: () -> Unit,
onDismissScrapDialog: () -> Unit,
onClickCancelButton: (InternInfo) -> Unit,
onClickScrapButton: (InternInfo) -> Unit,
) {
val decimal = DecimalFormat("#,###")
Expand Down Expand Up @@ -245,33 +248,38 @@ fun InternScreen(

InternBottomBar(
modifier = Modifier,
scrapCount = decimal.format(internInfo.scrapCount),
scrapId = internInfo.scrapId,
internInfo = internInfo,
onScrapClick = {
viewModel.updateScrapDialogVisibility(true)
}
if (!internUiState.isScrappedState)
onClickScrapButton(internInfo)
else onClickCancelButton(internInfo)
},
)

if (internUiState.isCancelDialogVisibility) {
internUiState.scrapId?.run {
ScrapCancelDialog(
scrapId = this,
onDismissRequest = onDismissCancelDialog
)
}
}

if (internUiState.isScrapDialogVisibility) {
ScrapDialog(
title = internInfo.title,
scrapColor = CalRed,
deadline = internInfo.deadline,
startDate = internInfo.startDate,
workingPeriod = internInfo.workingPeriod,
companyImage = internInfo.companyImage,
isScrapped = internUiState.isScrappedState,
onDismissRequest = onDismissInternDialog,
if (internUiState.scrapDialogVisibility) {
ScrapCancelDialog(
internshipAnnouncementId = announcementId,
onDismissRequest = onDismissCancelDialog
)
}

if (internUiState.internDialogVisibility) {
internUiState.internshipModel?.let {
ScrapDialog(
title = internUiState.internshipModel.title,
scrapColor = CalRed,
deadline = internUiState.internshipModel.deadline,
startYearMonth = internUiState.internshipModel.startDate,
workingPeriod = internUiState.internshipModel.workingPeriod,
internshipAnnouncementId = announcementId,
companyImage = internUiState.internshipModel.companyImage,
isScrapped = false,
onDismissRequest = onDismissScrapDialog,
onClickChangeColor = { },
onClickNavigateButton = { }
)
}
}
}
}
90 changes: 18 additions & 72 deletions feature/src/main/java/com/terning/feature/intern/InternViewModel.kt
Original file line number Diff line number Diff line change
@@ -1,14 +1,12 @@
package com.terning.feature.intern

import androidx.compose.ui.graphics.Color
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.terning.core.state.UiState
import com.terning.domain.entity.calendar.CalendarScrapRequest
import com.terning.domain.entity.calendar.CalendarScrapDetail
import com.terning.domain.entity.intern.InternInfo
import com.terning.domain.repository.InternRepository
import com.terning.domain.repository.ScrapRepository
import com.terning.feature.R
import com.terning.feature.intern.model.InternScrapState
import com.terning.feature.intern.model.InternUiState
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.MutableSharedFlow
Expand All @@ -22,14 +20,11 @@ import javax.inject.Inject
@HiltViewModel
class InternViewModel @Inject constructor(
private val internRepository: InternRepository,
private val scrapRepository: ScrapRepository,
) : ViewModel() {

private val _internUiState = MutableStateFlow(InternUiState())
val internUiState get() = _internUiState.asStateFlow()

private val _scrapState: MutableStateFlow<InternScrapState> =
MutableStateFlow(InternScrapState())

private val _sideEffect: MutableSharedFlow<InternViewSideEffect> = MutableSharedFlow()
val sideEffect = _sideEffect.asSharedFlow()

Expand All @@ -47,76 +42,27 @@ class InternViewModel @Inject constructor(
}
}


fun postScrap(
id: Long,
color: Int,
) {
viewModelScope.launch {
scrapRepository.postScrap(
CalendarScrapRequest(id, color)
).onSuccess {
_scrapState.update {
it.copy(isScrap = UiState.Success(true))
}
getInternInfo(id)
updateScrapDialogVisible(false)
_sideEffect.emit(
InternViewSideEffect.Toast(R.string.intern_scrap_add_toast_message)
)
}.onFailure {
_sideEffect.emit(
InternViewSideEffect.Toast(R.string.server_failure)
)
}
fun updateInternshipModel(scrapDetailModel: InternInfo?) {
_internUiState.update { currentState ->
currentState.copy(
internshipModel = scrapDetailModel
)
}
}

fun deleteScrap(
scrapId: Long?,
announcementId: Long,
) {
viewModelScope.launch {
scrapId?.let { CalendarScrapRequest(it, null) }?.let { scrapRequestModel ->
scrapRepository.deleteScrap(
scrapRequestModel
).onSuccess {
_scrapState.update {
it.copy(isScrap = UiState.Success(false))
}
getInternInfo(announcementId)
updateScrapDialogVisible(false)
_sideEffect.emit(InternViewSideEffect.Toast(R.string.intern_scrap_delete_toast_message))
}.onFailure {
_sideEffect.emit(
InternViewSideEffect.Toast(R.string.server_failure)
)
}
}
fun updateScrapCancelDialogVisibility(visibility: Boolean) {
_internUiState.update { currentState ->
currentState.copy(
scrapDialogVisibility = visibility
)
}
}

fun updateSelectColor(newColor: Color) {
_internUiState.update {
it.copy(selectedColor = newColor)
}
}

fun updateScrapDialogVisible(visible: Boolean) {
_internUiState.update {
it.copy(isScrapDialogVisible = visible)
}
}

fun updatePaletteOpen(open: Boolean) {
_internUiState.update {
it.copy(isPaletteOpen = open)
}
}

fun updateColorChange(change: Boolean) {
_internUiState.update {
it.copy(isColorChange = change)
fun updateInternDialogVisibility(visibility: Boolean) {
_internUiState.update { currentState ->
currentState.copy(
internDialogVisibility = visibility
)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,15 +24,15 @@ import com.terning.core.designsystem.theme.TerningTheme
import com.terning.core.designsystem.theme.White
import com.terning.core.extension.customShadow
import com.terning.core.extension.noRippleClickable
import com.terning.domain.entity.intern.InternInfo
import com.terning.feature.R
import com.terning.feature.intern.InternViewModel

@Composable
fun InternBottomBar(
modifier: Modifier,
scrapCount: String,
scrapId: Long? = null,
onScrapClick: () -> Unit,
internInfo: InternInfo,
onScrapClick: (InternInfo) -> Unit,
viewModel: InternViewModel = hiltViewModel(),
) {

Expand Down Expand Up @@ -64,7 +64,7 @@ fun InternBottomBar(
Icon(
painter = painterResource(
id =
if (scrapId != null) R.drawable.ic_scrap_true_24
if (internInfo.scrapId != null) R.drawable.ic_scrap_true_24
else R.drawable.ic_scrap_false_24,
),
contentDescription = null,
Expand All @@ -73,15 +73,15 @@ fun InternBottomBar(
bottom = 6.dp
)
.noRippleClickable {
onScrapClick()
onScrapClick(internInfo)
},
tint = if (scrapId != null) TerningMain
tint = if (internInfo.scrapId != null) TerningMain
else Grey350
)
Text(
text = stringResource(
id = R.string.intern_view_count_detail,
scrapCount
internInfo.scrapCount
),
style = TerningTheme.typography.detail3,
color = Grey400
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,16 @@ package com.terning.feature.intern.model
import androidx.compose.ui.graphics.Color
import com.terning.core.designsystem.theme.CalRed
import com.terning.core.state.UiState
import com.terning.domain.entity.CalendarScrapDetail
import com.terning.domain.entity.intern.InternInfo

data class InternUiState(
val loadState: UiState<InternInfo> = UiState.Loading,
val isColorChange: Boolean = false,
val isPaletteOpen: Boolean = false,
val selectedColor: Color = CalRed,
val isCancelDialogVisibility: Boolean = false,
val isScrapDialogVisibility: Boolean = false,
val scrapDialogVisibility: Boolean = false,
val internDialogVisibility: Boolean = false,
val isScrappedState: Boolean = false,
val showWeb: Boolean = false,
val scrapId: Long? = null,
val internshipModel: InternInfo? = null
val internshipModel: InternInfo? = null,
)

0 comments on commit 011571f

Please sign in to comment.