Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/develop' into feat/#117-place-se…
Browse files Browse the repository at this point in the history
…arch-api
angryPodo committed Jan 22, 2025
2 parents be2bc37 + 127be24 commit e1d9e0d
Showing 7 changed files with 323 additions and 244 deletions.
1 change: 1 addition & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -20,6 +20,7 @@
android:name=".presentation.MainActivity"
android:exported="true"
android:label="@string/app_name"
android:windowSoftInputMode="adjustResize"
android:theme="@style/Theme.SpoonyAndroid">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.spoony.spoony.presentation.placeDetail

sealed class PlaceDetailSideEffect {
data class ShowSnackbar(val message: String) : PlaceDetailSideEffect()
}
Original file line number Diff line number Diff line change
@@ -9,7 +9,9 @@ import com.spoony.spoony.domain.repository.PostRepository
import com.spoony.spoony.presentation.placeDetail.navigation.PlaceDetail
import dagger.hilt.android.lifecycle.HiltViewModel
import javax.inject.Inject
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.SharedFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.launch

@@ -22,6 +24,10 @@ class PlaceDetailViewModel @Inject constructor(
val state: StateFlow<PlaceDetailState>
get() = _state

private val _sideEffect = MutableSharedFlow<PlaceDetailSideEffect>()
val sideEffect: SharedFlow<PlaceDetailSideEffect>
get() = _sideEffect

init {
val postArgs = savedStateHandle.toRoute<PlaceDetail>()
_state.value = _state.value.copy(
@@ -69,6 +75,7 @@ class PlaceDetailViewModel @Inject constructor(
viewModelScope.launch {
postRepository.postAddMap(userId = userId, postId = postId)
.onSuccess { response ->
_sideEffect.emit(PlaceDetailSideEffect.ShowSnackbar("내 지도에 추가되었어요."))
(_state.value.postEntity as? UiState.Success)?.data?.let { currentPostEntity ->
with(currentPostEntity) {
_state.value = _state.value.copy(
@@ -92,6 +99,7 @@ class PlaceDetailViewModel @Inject constructor(
viewModelScope.launch {
postRepository.deletePinMap(userId = userId, postId = postId)
.onSuccess { response ->
_sideEffect.emit(PlaceDetailSideEffect.ShowSnackbar("내 지도에서 삭제되었어요."))
(_state.value.postEntity as? UiState.Success)?.data?.let { currentPostEntity ->
with(currentPostEntity) {
_state.value = _state.value.copy(
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
package com.spoony.spoony.presentation.placeDetail.component

import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.IntrinsicSize
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.sizeIn
import androidx.compose.foundation.layout.width
import androidx.compose.material3.Icon
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.graphics.vector.ImageVector
import androidx.compose.ui.res.vectorResource
import androidx.compose.ui.unit.dp
import com.spoony.spoony.R
import com.spoony.spoony.core.designsystem.component.button.SpoonyButton
import com.spoony.spoony.core.designsystem.theme.SpoonyAndroidTheme
import com.spoony.spoony.core.designsystem.type.ButtonSize
import com.spoony.spoony.core.designsystem.type.ButtonStyle
import com.spoony.spoony.core.util.extension.noRippleClickable

@Composable
fun PlaceDetailBottomBar(
addMapCount: Int,
onScoopButtonClick: () -> Unit,
onSearchMapClick: () -> Unit,
onAddMapButtonClick: () -> Unit,
onDeletePinMapButtonClick: () -> Unit,
modifier: Modifier = Modifier,
isScooped: Boolean = false,
isAddMap: Boolean = false
) {
Row(
modifier = modifier
.fillMaxWidth()
.background(SpoonyAndroidTheme.colors.white)
.padding(
horizontal = 20.dp,
vertical = 10.dp
)
.height(IntrinsicSize.Max),
verticalAlignment = Alignment.CenterVertically
) {
if (isScooped) {
SpoonyButton(
text = "길찾기",
onClick = onSearchMapClick,
style = ButtonStyle.Secondary,
size = ButtonSize.Medium,
modifier = Modifier.weight(1f)
)

Spacer(modifier = Modifier.width(15.dp))

Column(
modifier = Modifier
.fillMaxHeight()
.sizeIn(minWidth = 56.dp)
.noRippleClickable(
if (isAddMap) {
onDeletePinMapButtonClick
} else {
onAddMapButtonClick
}
),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
) {
Icon(
imageVector = ImageVector.vectorResource(id = if (isAddMap) R.drawable.ic_add_map_main400_24 else R.drawable.ic_add_map_gray400_24),
modifier = Modifier
.size(32.dp),
contentDescription = null,
tint = Color.Unspecified
)

Spacer(modifier = Modifier.height(4.dp))

Text(
text = addMapCount.toString(),
style = SpoonyAndroidTheme.typography.caption1m,
color = if (isAddMap) SpoonyAndroidTheme.colors.main400 else SpoonyAndroidTheme.colors.gray800
)
}
} else {
SpoonyButton(
text = "떠먹기",
style = ButtonStyle.Secondary,
size = ButtonSize.Medium,
onClick = onScoopButtonClick,
modifier = Modifier.weight(1f),
icon = {
Icon(
imageVector = ImageVector.vectorResource(R.drawable.ic_button_spoon_32),
modifier = Modifier.size(32.dp),
contentDescription = null,
tint = Color.Unspecified
)
}
)
}
}
}
Original file line number Diff line number Diff line change
@@ -5,8 +5,13 @@ import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.ime
import androidx.compose.foundation.layout.imePadding
import androidx.compose.foundation.layout.navigationBarsPadding
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.rememberScrollState
@@ -16,12 +21,14 @@ import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.Icon
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.platform.LocalFocusManager
import androidx.compose.ui.res.vectorResource
import androidx.compose.ui.tooling.preview.Preview
@@ -91,11 +98,20 @@ private fun ReportScreen(
onOpenDialogClick: () -> Unit
) {
val focusManager = LocalFocusManager.current
val scrollState = rememberScrollState()
val imeInsets = WindowInsets.ime // 키보드 상태를 관찰
val imeHeight = imeInsets.getBottom(LocalDensity.current)

LaunchedEffect(imeHeight) {
if (imeHeight > 0) {
scrollState.scrollTo(scrollState.maxValue)
}
}

Column(
modifier = Modifier
.addFocusCleaner(focusManager)
.padding(bottom = paddingValues.calculateBottomPadding())
.navigationBarsPadding()
) {
TitleTopAppBar(
title = "신고하기",
@@ -109,10 +125,11 @@ private fun ReportScreen(

Column(
modifier = Modifier
.fillMaxWidth()
.fillMaxSize()
.background(color = SpoonyAndroidTheme.colors.white)
.padding(horizontal = 20.dp)
.verticalScroll(rememberScrollState())
.verticalScroll(scrollState)
.imePadding()
) {
Spacer(modifier = Modifier.height(31.dp))

@@ -177,6 +194,8 @@ private fun ReportScreen(

Spacer(modifier = Modifier.height(20.dp))

Spacer(modifier = Modifier.weight(1f))

SpoonyButton(
text = "신고하기",
onClick = onOpenDialogClick,
Original file line number Diff line number Diff line change
@@ -53,6 +53,8 @@ fun ReportRadioButton(
Text(
text = option.text,
modifier = Modifier.noRippleClickable { onOptionSelected(option) },
style = SpoonyAndroidTheme.typography.body1m,
color = SpoonyAndroidTheme.colors.gray900,
maxLines = 1,
overflow = TextOverflow.Ellipsis
)

0 comments on commit e1d9e0d

Please sign in to comment.