Skip to content

Commit ba377e6

Browse files
committed
#5 [REFACTOR] 코드리뷰 반영
1 parent 32741e1 commit ba377e6

File tree

10 files changed

+67
-71
lines changed

10 files changed

+67
-71
lines changed

core/src/main/java/com/sopt/core/designsystem/component/button/NoostakFloatingActionButton.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import androidx.compose.material3.Text
1010
import androidx.compose.runtime.Composable
1111
import androidx.compose.ui.Modifier
1212
import androidx.compose.ui.graphics.vector.ImageVector
13+
import androidx.compose.ui.res.dimensionResource
1314
import androidx.compose.ui.res.vectorResource
1415
import androidx.compose.ui.unit.dp
1516
import com.sopt.core.R
@@ -24,7 +25,7 @@ fun NoostakFloatingActionButton(
2425
) {
2526
ExtendedFloatingActionButton(
2627
modifier = modifier,
27-
shape = RoundedCornerShape(30.dp),
28+
shape = RoundedCornerShape(dimensionResource(id = R.dimen.fab_radius)),
2829
containerColor = NoostakTheme.colors.black,
2930
contentColor = NoostakTheme.colors.white,
3031
elevation = FloatingActionButtonDefaults.elevation(4.dp),

core/src/main/java/com/sopt/core/designsystem/component/chip/NoostakCategoryChip.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@ package com.sopt.core.designsystem.component.chip
22

33
import androidx.compose.runtime.Composable
44
import androidx.compose.ui.graphics.Color
5+
import androidx.compose.ui.res.dimensionResource
56
import androidx.compose.ui.unit.dp
7+
import com.sopt.core.R
68
import com.sopt.core.designsystem.theme.NoostakTheme
79

810
@Composable
@@ -16,7 +18,7 @@ fun NoostakCategoryChip(
1618
textColor = NoostakTheme.colors.white,
1719
backgroundColor = backgroundColor,
1820
borderColor = Color.Transparent,
19-
horizontalPaddingValues = 15.dp,
20-
verticalPaddingValues = 6.dp
21+
horizontalPaddingValues = dimensionResource(id = R.dimen.category_chip_horizontal_padding),
22+
verticalPaddingValues = dimensionResource(id = R.dimen.category_chip_vertical_padding)
2123
)
2224
}

core/src/main/java/com/sopt/core/designsystem/component/chip/NoostakChip.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,14 @@ import androidx.compose.runtime.Composable
1212
import androidx.compose.ui.Alignment
1313
import androidx.compose.ui.Modifier
1414
import androidx.compose.ui.graphics.Color
15+
import androidx.compose.ui.res.dimensionResource
1516
import androidx.compose.ui.text.TextStyle
1617
import androidx.compose.ui.text.style.TextAlign
1718
import androidx.compose.ui.text.style.TextOverflow
1819
import androidx.compose.ui.tooling.preview.Preview
1920
import androidx.compose.ui.unit.Dp
2021
import androidx.compose.ui.unit.dp
22+
import com.sopt.core.R
2123
import com.sopt.core.designsystem.theme.NoostakAndroidTheme
2224
import com.sopt.core.designsystem.theme.NoostakTheme
2325

@@ -35,12 +37,12 @@ fun NoostakChip(
3537
modifier = Modifier
3638
.background(
3739
color = backgroundColor,
38-
shape = RoundedCornerShape(16.dp)
40+
shape = RoundedCornerShape(dimensionResource(id = R.dimen.chip_radius))
3941
)
4042
.border(
4143
width = 1.dp,
4244
color = borderColor,
43-
shape = RoundedCornerShape(16.dp)
45+
shape = RoundedCornerShape(dimensionResource(id = R.dimen.chip_radius))
4446
)
4547
.defaultMinSize(minWidth = 39.dp)
4648
.padding(horizontal = horizontalPaddingValues, vertical = verticalPaddingValues)

core/src/main/java/com/sopt/core/designsystem/component/chip/NoostakUserChip.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@ package com.sopt.core.designsystem.component.chip
22

33
import androidx.compose.runtime.Composable
44
import androidx.compose.ui.graphics.Color
5+
import androidx.compose.ui.res.dimensionResource
56
import androidx.compose.ui.unit.dp
7+
import com.sopt.core.R
68
import com.sopt.core.designsystem.theme.NoostakTheme
79

810
@Composable
@@ -18,7 +20,7 @@ fun NoostakUserChip(
1820
textColor = textColor,
1921
backgroundColor = backgroundColor,
2022
borderColor = borderColor,
21-
horizontalPaddingValues = 8.dp,
22-
verticalPaddingValues = 6.dp
23+
horizontalPaddingValues = dimensionResource(id = R.dimen.user_chip_horizontal_padding),
24+
verticalPaddingValues = dimensionResource(id = R.dimen.user_chip_vertical_padding)
2325
)
2426
}

core/src/main/java/com/sopt/core/designsystem/component/topappbar/NoostakTopAppBar.kt

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,10 @@ import androidx.compose.foundation.layout.padding
66
import androidx.compose.material3.CenterAlignedTopAppBar
77
import androidx.compose.material3.ExperimentalMaterial3Api
88
import androidx.compose.material3.Icon
9-
import androidx.compose.material3.IconButton
109
import androidx.compose.material3.Text
1110
import androidx.compose.material3.TopAppBarDefaults
1211
import androidx.compose.runtime.Composable
1312
import androidx.compose.ui.Modifier
14-
import androidx.compose.ui.graphics.Color
1513
import androidx.compose.ui.graphics.Color.Companion.White
1614
import androidx.compose.ui.res.painterResource
1715
import androidx.compose.ui.res.stringResource
@@ -21,7 +19,8 @@ import androidx.compose.ui.unit.dp
2119
import com.sopt.core.R
2220
import com.sopt.core.designsystem.theme.NoostakAndroidTheme
2321
import com.sopt.core.designsystem.theme.NoostakTheme
24-
import com.sopt.core.util.NoRippleInteractionSource
22+
import com.sopt.core.extension.noRippleClickable
23+
import com.sopt.core.extension.showIf
2524

2625
@OptIn(ExperimentalMaterial3Api::class)
2726
@Composable
@@ -42,19 +41,15 @@ fun NoostakTopAppBar(
4241
)
4342
},
4443
navigationIcon = {
45-
IconButton(
46-
onClick = { onBackButtonClick() },
47-
enabled = isIconVisible,
48-
interactionSource = NoRippleInteractionSource
49-
) {
50-
Icon(
51-
painter = painterResource(id = R.drawable.ic_back),
52-
contentDescription = stringResource(id = R.string.ic_back),
53-
modifier = Modifier
54-
.padding(start = 8.dp),
55-
tint = if (isIconVisible) NoostakTheme.colors.black else Color.Transparent
56-
)
57-
}
44+
Icon(
45+
painter = painterResource(id = R.drawable.ic_back),
46+
contentDescription = stringResource(id = R.string.ic_back),
47+
modifier = Modifier
48+
.padding(start = 8.dp)
49+
.noRippleClickable { onBackButtonClick() }
50+
.showIf(isIconVisible),
51+
tint = NoostakTheme.colors.black
52+
)
5853
},
5954
colors = TopAppBarDefaults.topAppBarColors(White),
6055
windowInsets = WindowInsets(0)
@@ -67,7 +62,7 @@ fun NoostakTopAppBarPreview() {
6762
NoostakAndroidTheme {
6863
NoostakTopAppBar(
6964
modifier = Modifier.fillMaxWidth(),
70-
isIconVisible = false,
65+
isIconVisible = true,
7166
title = "그룹"
7267
)
7368
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.sopt.core.util
2+
3+
import androidx.lifecycle.ViewModel
4+
import androidx.lifecycle.viewModelScope
5+
import kotlinx.coroutines.flow.MutableSharedFlow
6+
import kotlinx.coroutines.flow.SharedFlow
7+
import kotlinx.coroutines.flow.asSharedFlow
8+
import kotlinx.coroutines.launch
9+
10+
abstract class BaseViewModel<T> : ViewModel() {
11+
private val _sideEffects = MutableSharedFlow<T>()
12+
val sideEffects: SharedFlow<T> get() = _sideEffects.asSharedFlow()
13+
14+
protected fun emitSideEffect(sideEffect: T) {
15+
viewModelScope.launch {
16+
_sideEffects.emit(sideEffect)
17+
}
18+
}
19+
}

core/src/main/res/values/dimens.xml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<resources>
3+
<dimen name="chip_radius">16dp</dimen>
4+
<dimen name="user_chip_horizontal_padding">8dp</dimen>
5+
<dimen name="user_chip_vertical_padding">6dp</dimen>
6+
<dimen name="category_chip_horizontal_padding">15dp</dimen>
7+
<dimen name="category_chip_vertical_padding">6dp</dimen>
8+
<dimen name="fab_radius">30dp</dimen>
9+
</resources>

presentation/src/main/java/com/sopt/presentation/groupDetail/ConfirmedDetailViewModel.kt

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,14 @@
11
package com.sopt.presentation.groupDetail
22

3-
import androidx.lifecycle.ViewModel
4-
import androidx.lifecycle.viewModelScope
3+
import com.sopt.core.util.BaseViewModel
54
import com.sopt.domain.entity.ConfirmedDetailEntity
65
import dagger.hilt.android.lifecycle.HiltViewModel
7-
import kotlinx.coroutines.flow.MutableSharedFlow
8-
import kotlinx.coroutines.flow.SharedFlow
9-
import kotlinx.coroutines.flow.asSharedFlow
10-
import kotlinx.coroutines.launch
116
import javax.inject.Inject
127

138
@HiltViewModel
14-
class ConfirmedDetailViewModel @Inject constructor() : ViewModel() {
15-
private val _sideEffects: MutableSharedFlow<ConfirmedDetailSideEffect> = MutableSharedFlow()
16-
val sideEffects: SharedFlow<ConfirmedDetailSideEffect> get() = _sideEffects.asSharedFlow()
17-
9+
class ConfirmedDetailViewModel @Inject constructor() : BaseViewModel<ConfirmedDetailSideEffect>() {
1810
fun navigateUp() {
19-
viewModelScope.launch {
20-
_sideEffects.emit(ConfirmedDetailSideEffect.NavigateUp)
21-
}
11+
emitSideEffect(ConfirmedDetailSideEffect.NavigateUp)
2212
}
2313

2414
val mockConfirmedDetail = ConfirmedDetailEntity(
@@ -32,7 +22,7 @@ class ConfirmedDetailViewModel @Inject constructor() : ViewModel() {
3222
availableMembersCount = 5,
3323
availableMembers = listOf(
3424
"", "선우정아", "대한민국만세", "최영희", "정영수",
35-
"이가을", "김언지", "박유진", "임하늘", "변우석", "김혜윤", "카리나", "닝닝",
25+
"이가을", "김언지", "박유진", "임하늘", "변우석", "김혜윤", "정해인", "카리나", "닝닝",
3626
"지젤", "장원영", "이채연", "김민주", "김채원", "김민주", "김채원", "김민주"
3727
),
3828
unavailableMembersCount = 5,

presentation/src/main/java/com/sopt/presentation/groupDetail/GroupDetailViewModel.kt

Lines changed: 6 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,28 @@
11
package com.sopt.presentation.groupDetail
22

3-
import androidx.lifecycle.ViewModel
4-
import androidx.lifecycle.viewModelScope
3+
import com.sopt.core.util.BaseViewModel
54
import com.sopt.domain.entity.ConfirmedEntity
65
import com.sopt.domain.entity.GroupDetailEntity
76
import com.sopt.domain.entity.ProgressEntity
87
import dagger.hilt.android.lifecycle.HiltViewModel
9-
import kotlinx.coroutines.flow.MutableSharedFlow
10-
import kotlinx.coroutines.flow.SharedFlow
11-
import kotlinx.coroutines.flow.asSharedFlow
12-
import kotlinx.coroutines.launch
138
import okhttp3.internal.immutableListOf
149
import javax.inject.Inject
1510

1611
@HiltViewModel
17-
class GroupDetailViewModel @Inject constructor() : ViewModel() {
18-
private val _sideEffects: MutableSharedFlow<GroupDetailSideEffect> = MutableSharedFlow()
19-
val sideEffects: SharedFlow<GroupDetailSideEffect> get() = _sideEffects.asSharedFlow()
20-
12+
class GroupDetailViewModel @Inject constructor() : BaseViewModel<GroupDetailSideEffect>() {
2113
fun navigateUp() {
22-
viewModelScope.launch {
23-
_sideEffects.emit(GroupDetailSideEffect.NavigateUp)
24-
}
14+
emitSideEffect(GroupDetailSideEffect.NavigateUp)
2515
}
2616

2717
fun navigateToConfirmedDetail(groupId: Long, confirmedId: Long) {
28-
viewModelScope.launch {
29-
_sideEffects.emit(GroupDetailSideEffect.NavigateToConfirmedDetail(groupId, confirmedId))
30-
}
18+
emitSideEffect(GroupDetailSideEffect.NavigateToConfirmedDetail(groupId, confirmedId))
3119
}
3220

3321
fun navigateToGroupMember(groupId: Long) {
34-
viewModelScope.launch {
35-
_sideEffects.emit(GroupDetailSideEffect.NavigateToGroupMember(groupId))
36-
}
22+
emitSideEffect(GroupDetailSideEffect.NavigateToGroupMember(groupId))
3723
}
3824

39-
val tabs = immutableListOf("진행중", "완료")
25+
val tabs = immutableListOf("진행중", "확정")
4026
val mockGroupDetail = GroupDetailEntity(
4127
groupName = "누스탁",
4228
groupMembersCount = 10,

presentation/src/main/java/com/sopt/presentation/groupDetail/GroupMemberViewModel.kt

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,16 @@
11
package com.sopt.presentation.groupDetail
22

3-
import androidx.lifecycle.ViewModel
4-
import androidx.lifecycle.viewModelScope
3+
import com.sopt.core.util.BaseViewModel
54
import com.sopt.domain.entity.GroupLeaderEntity
65
import com.sopt.domain.entity.GroupMemberEntity
76
import com.sopt.domain.entity.GroupMembersEntity
87
import dagger.hilt.android.lifecycle.HiltViewModel
9-
import kotlinx.coroutines.flow.MutableSharedFlow
10-
import kotlinx.coroutines.flow.SharedFlow
11-
import kotlinx.coroutines.flow.asSharedFlow
12-
import kotlinx.coroutines.launch
138
import javax.inject.Inject
149

1510
@HiltViewModel
16-
class GroupMemberViewModel @Inject constructor() : ViewModel() {
17-
private val _sideEffects: MutableSharedFlow<GroupMemberSideEffect> = MutableSharedFlow()
18-
val sideEffects: SharedFlow<GroupMemberSideEffect> get() = _sideEffects.asSharedFlow()
19-
11+
class GroupMemberViewModel @Inject constructor() : BaseViewModel<GroupMemberSideEffect>() {
2012
fun navigateUp() {
21-
viewModelScope.launch {
22-
_sideEffects.emit(GroupMemberSideEffect.NavigateUp)
23-
}
13+
emitSideEffect(GroupMemberSideEffect.NavigateUp)
2414
}
2515

2616
val mockGroupMembers = GroupMembersEntity(

0 commit comments

Comments
 (0)