From ab3e22a91c107c6ee385862f7338ce0f6cab339d Mon Sep 17 00:00:00 2001 From: chanho0908 Date: Sat, 6 Jun 2026 14:28:06 +0900 Subject: [PATCH 1/5] =?UTF-8?q?=F0=9F=90=9B=20Fix:=20=EC=9D=B8=EC=A6=9D?= =?UTF-8?q?=EC=83=B7=20=EC=83=81=EC=84=B8=20=EB=A6=AC=EC=95=A1=EC=85=98?= =?UTF-8?q?=EB=B0=94=20=EC=9C=84=EC=B9=98=20=EA=B3=A0=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../photolog/detail/PhotologDetailScreen.kt | 46 +++++++++++++------ .../component/reaction/ReactionContent.kt | 6 +-- 2 files changed, 35 insertions(+), 17 deletions(-) diff --git a/feature/photolog/detail/src/main/java/com/twix/photolog/detail/PhotologDetailScreen.kt b/feature/photolog/detail/src/main/java/com/twix/photolog/detail/PhotologDetailScreen.kt index bd5b0c9db..243b8e791 100644 --- a/feature/photolog/detail/src/main/java/com/twix/photolog/detail/PhotologDetailScreen.kt +++ b/feature/photolog/detail/src/main/java/com/twix/photolog/detail/PhotologDetailScreen.kt @@ -11,6 +11,7 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf @@ -18,6 +19,7 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.rememberUpdatedState import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalDensity @@ -216,22 +218,34 @@ fun PhotologDetailScreen( onBack = onBack, onClickModify = onClickModify, ) - Spacer(Modifier.height(103.dp)) + BoxWithConstraints(Modifier.fillMaxSize()) { + val cardSize = maxWidth - photologCardHorizontalPadding + val reactionTopPadding = + photologCardTopPadding + cardSize + reactionBarTopSpacing - PhotologCardContent( - uiState = uiState, - isPokeDisabled = uiState.isPokeDisabled, - onSwipe = onSwipe, - onClickUpload = onClickUpload, - onPoke = onPoke, - ) + Column(Modifier.fillMaxSize()) { + Spacer(Modifier.height(photologCardTopPadding)) + + PhotologCardContent( + uiState = uiState, + isPokeDisabled = uiState.isPokeDisabled, + onSwipe = onSwipe, + onClickUpload = onClickUpload, + onPoke = onPoke, + ) + } - if (uiState.canReaction) { - ReactionContent( - screenHeightPx = screenHeightPx, - reaction = uiState.partnerPhotolog?.reaction, - onClickReaction = onClickReaction, - ) + if (uiState.canReaction) { + ReactionContent( + modifier = + Modifier + .align(Alignment.TopCenter) + .padding(top = reactionTopPadding), + screenHeightPx = screenHeightPx, + reaction = uiState.partnerPhotolog?.reaction, + onClickReaction = onClickReaction, + ) + } } } @@ -299,3 +313,7 @@ private fun PhotologDetailScreenPreview( ) } } + +private val photologCardTopPadding = 103.dp +private val photologCardHorizontalPadding = 54.dp +private val reactionBarTopSpacing = 85.dp diff --git a/feature/photolog/detail/src/main/java/com/twix/photolog/detail/component/reaction/ReactionContent.kt b/feature/photolog/detail/src/main/java/com/twix/photolog/detail/component/reaction/ReactionContent.kt index 4e9a2c11e..d525f7e83 100644 --- a/feature/photolog/detail/src/main/java/com/twix/photolog/detail/component/reaction/ReactionContent.kt +++ b/feature/photolog/detail/src/main/java/com/twix/photolog/detail/component/reaction/ReactionContent.kt @@ -18,6 +18,7 @@ import com.twix.domain.model.enums.GoalReactionType @Composable internal fun ReactionContent( screenHeightPx: Float, + modifier: Modifier = Modifier, reaction: GoalReactionType? = null, onClickReaction: (GoalReactionType) -> Unit, ) { @@ -25,9 +26,8 @@ internal fun ReactionContent( Box( modifier = - Modifier - .fillMaxSize() - .padding(top = 85.dp), + modifier + .fillMaxSize(), ) { ReactionBar( selectedReaction = reaction, From 53792bd4f307cc25c119f830712694a8ad20d0bc Mon Sep 17 00:00:00 2001 From: chanho0908 Date: Sat, 6 Jun 2026 15:10:01 +0900 Subject: [PATCH 2/5] =?UTF-8?q?=E2=9C=A8=20Feat:=20=EC=9D=B8=EC=A6=9D?= =?UTF-8?q?=EC=83=B7=20=EC=83=81=EC=84=B8=20=EC=83=88=EB=A1=9C=EA=B3=A0?= =?UTF-8?q?=EC=B9=A8=20=EC=83=81=ED=83=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../detail/contract/PhotologDetailIntent.kt | 2 + .../detail/contract/PhotologDetailUiState.kt | 45 ++----------------- 2 files changed, 6 insertions(+), 41 deletions(-) diff --git a/feature/photolog/detail/src/main/java/com/twix/photolog/detail/contract/PhotologDetailIntent.kt b/feature/photolog/detail/src/main/java/com/twix/photolog/detail/contract/PhotologDetailIntent.kt index 13f882126..5afaec7b2 100644 --- a/feature/photolog/detail/src/main/java/com/twix/photolog/detail/contract/PhotologDetailIntent.kt +++ b/feature/photolog/detail/src/main/java/com/twix/photolog/detail/contract/PhotologDetailIntent.kt @@ -6,6 +6,8 @@ import com.twix.ui.base.Intent sealed interface PhotologDetailIntent : Intent { data object Retry : PhotologDetailIntent + data object Refresh : PhotologDetailIntent + data class Reaction( val type: GoalReactionType, ) : PhotologDetailIntent diff --git a/feature/photolog/detail/src/main/java/com/twix/photolog/detail/contract/PhotologDetailUiState.kt b/feature/photolog/detail/src/main/java/com/twix/photolog/detail/contract/PhotologDetailUiState.kt index 5ac3ff551..f929ca40a 100644 --- a/feature/photolog/detail/src/main/java/com/twix/photolog/detail/contract/PhotologDetailUiState.kt +++ b/feature/photolog/detail/src/main/java/com/twix/photolog/detail/contract/PhotologDetailUiState.kt @@ -27,6 +27,7 @@ data class PhotologDetailUiState( * 내 인증샷에 상대방이 리액션을 남겼을 경우 최초 1회 인터렉션 렌더링을 위한 변수 */ val hasShownMyReaction: Boolean = false, + val isRefreshing: Boolean = false, override val isLoading: Boolean = true, override val error: AppError? = null, /** @@ -41,6 +42,9 @@ data class PhotologDetailUiState( val isPokeDisabled: Boolean get() = isPoking || pokeCooldownRemaining > 0 + val showContentLoading: Boolean + get() = (showOverlayLoading && !isRefreshing) || isPoking + /** * 현재 [currentShow]에 해당하는 사용자의 인증샷 인증 여부 * @@ -67,47 +71,6 @@ data class PhotologDetailUiState( BetweenUs.PARTNER -> partnerPhotolog?.uploadedAt } - /** - * 현재 [currentShow]에 해당하는 인증샷 URL - * - * - [BetweenUs.ME]: 내 인증샷 이미지 URL - * - [BetweenUs.PARTNER]: 파트너 인증샷 이미지 URL - * - */ - val displayedGoalImageUrl: String? - get() = - when (currentShow) { - BetweenUs.ME -> myPhotolog?.imageUrl - BetweenUs.PARTNER -> partnerPhotolog?.imageUrl - } - - /** - * 현재 [currentShow]에 해당하는 인증샷의 코멘트 - * - * - [BetweenUs.ME]: 내 코멘트 - * - [BetweenUs.PARTNER]: 파트너 코멘트 - * - */ - val displayedGoalComment: String? - get() = - when (currentShow) { - BetweenUs.ME -> myPhotolog?.comment - BetweenUs.PARTNER -> partnerPhotolog?.comment - } - - /** - * 현재 [currentShow]에 해당하는 사용자의 닉네임 - * - * - [BetweenUs.ME]: 내 닉네임 - * - [BetweenUs.PARTNER]: 파트너 닉네임 - */ - val displayedNickname: String - get() = - when (currentShow) { - BetweenUs.ME -> myNickname - BetweenUs.PARTNER -> partnerNickname - } - /** * 현재 화면이 내 인증샷을 표시하는 상태인지 여부 * From 1f773dd11c654cc2c33faa96bd4647ffb5a94f1f Mon Sep 17 00:00:00 2001 From: chanho0908 Date: Sat, 6 Jun 2026 15:10:06 +0900 Subject: [PATCH 3/5] =?UTF-8?q?=E2=9C=A8=20Feat:=20=EC=9D=B8=EC=A6=9D?= =?UTF-8?q?=EC=83=B7=20=EC=83=81=EC=84=B8=20=EC=83=88=EB=A1=9C=EA=B3=A0?= =?UTF-8?q?=EC=B9=A8=20=EC=B2=98=EB=A6=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/twix/photolog/detail/PhotologDetailViewModel.kt | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/feature/photolog/detail/src/main/java/com/twix/photolog/detail/PhotologDetailViewModel.kt b/feature/photolog/detail/src/main/java/com/twix/photolog/detail/PhotologDetailViewModel.kt index 4df175816..cb28fba84 100644 --- a/feature/photolog/detail/src/main/java/com/twix/photolog/detail/PhotologDetailViewModel.kt +++ b/feature/photolog/detail/src/main/java/com/twix/photolog/detail/PhotologDetailViewModel.kt @@ -69,11 +69,13 @@ class PhotologDetailViewModel( checkPokeCooldown() } - private fun fetchPhotolog() { + private fun fetchPhotolog(isUserRefresh: Boolean = false) { launchResult( + onStart = { reduce { copy(isRefreshing = isUserRefresh) } }, + onFinally = { reduce { copy(isRefreshing = false) } }, + onError = { handleFetchPhotologError() }, block = ::fetchPhotologs, onSuccess = ::handleFetchPhotologSuccess, - onError = { handleFetchPhotologError() }, ) } @@ -88,6 +90,7 @@ class PhotologDetailViewModel( argTargetDate, argIsCompleted, ).copy( + currentShow = currentState.currentShow, hasShownMyReaction = currentState.hasShownMyReaction, pokeCooldownRemaining = currentState.pokeCooldownRemaining, ) @@ -149,6 +152,7 @@ class PhotologDetailViewModel( override suspend fun handleIntent(intent: PhotologDetailIntent) { when (intent) { PhotologDetailIntent.Retry -> fetchPhotolog() + PhotologDetailIntent.Refresh -> fetchPhotolog(isUserRefresh = true) is PhotologDetailIntent.Reaction -> reduceReaction(intent.type) PhotologDetailIntent.Poke -> pokeToPartner() PhotologDetailIntent.SwipeCard -> reduceShownCard() From 05b9fe35fa554f3229b6f0d3932f414a2474a2cd Mon Sep 17 00:00:00 2001 From: chanho0908 Date: Sat, 6 Jun 2026 15:10:12 +0900 Subject: [PATCH 4/5] =?UTF-8?q?=E2=9C=A8=20Feat:=20=EC=9D=B8=EC=A6=9D?= =?UTF-8?q?=EC=83=B7=20=EC=83=81=EC=84=B8=20=EB=8B=B9=EA=B2=A8=EC=84=9C=20?= =?UTF-8?q?=EC=83=88=EB=A1=9C=EA=B3=A0=EC=B9=A8=20UI=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../photolog/detail/PhotologDetailScreen.kt | 206 +++++++++++++++--- 1 file changed, 177 insertions(+), 29 deletions(-) diff --git a/feature/photolog/detail/src/main/java/com/twix/photolog/detail/PhotologDetailScreen.kt b/feature/photolog/detail/src/main/java/com/twix/photolog/detail/PhotologDetailScreen.kt index 243b8e791..428af6d10 100644 --- a/feature/photolog/detail/src/main/java/com/twix/photolog/detail/PhotologDetailScreen.kt +++ b/feature/photolog/detail/src/main/java/com/twix/photolog/detail/PhotologDetailScreen.kt @@ -4,16 +4,24 @@ import android.Manifest import android.content.Context import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.contract.ActivityResultContracts +import androidx.compose.animation.core.animateFloatAsState +import androidx.compose.animation.core.spring import androidx.compose.foundation.background +import androidx.compose.foundation.gestures.detectVerticalDragGestures import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.BoxWithConstraints import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.offset import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.material3.CircularProgressIndicator import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableFloatStateOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope @@ -21,10 +29,12 @@ import androidx.compose.runtime.rememberUpdatedState import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.input.pointer.pointerInput import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.PreviewParameter +import androidx.compose.ui.unit.IntOffset import androidx.compose.ui.unit.dp import androidx.core.app.ActivityCompat import androidx.lifecycle.compose.collectAsStateWithLifecycle @@ -36,6 +46,7 @@ import com.twix.designsystem.components.toast.model.ToastData import com.twix.designsystem.components.toast.model.ToastType import com.twix.designsystem.extension.showCameraPermissionToastWithNavigateToSettingAction import com.twix.designsystem.theme.CommonColor +import com.twix.designsystem.theme.GrayColor import com.twix.designsystem.theme.TwixTheme import com.twix.domain.model.enums.BetweenUs import com.twix.domain.model.enums.GoalReactionType @@ -56,6 +67,7 @@ import kotlinx.coroutines.launch import org.koin.androidx.compose.koinViewModel import org.koin.compose.koinInject import java.time.LocalDate +import kotlin.math.roundToInt @Composable fun PhotologDetailRoute( @@ -140,6 +152,7 @@ fun PhotologDetailRoute( screenHeightPx = screenHeightPx, onBack = navigateToBack, onRetry = { viewModel.dispatch(PhotologDetailIntent.Retry) }, + onRefresh = { viewModel.dispatch(PhotologDetailIntent.Refresh) }, onClickModify = { navigateToEditor( uiState.goalId, @@ -183,6 +196,7 @@ fun PhotologDetailScreen( screenHeightPx: Float, onBack: () -> Unit, onRetry: () -> Unit, + onRefresh: () -> Unit, onClickModify: () -> Unit, onClickReaction: (GoalReactionType) -> Unit, onClickUpload: () -> Unit, @@ -218,38 +232,44 @@ fun PhotologDetailScreen( onBack = onBack, onClickModify = onClickModify, ) - BoxWithConstraints(Modifier.fillMaxSize()) { - val cardSize = maxWidth - photologCardHorizontalPadding - val reactionTopPadding = - photologCardTopPadding + cardSize + reactionBarTopSpacing - Column(Modifier.fillMaxSize()) { - Spacer(Modifier.height(photologCardTopPadding)) + PhotologDetailRefreshContent( + modifier = Modifier.weight(1f), + isRefreshing = uiState.isRefreshing, + onRefresh = onRefresh, + ) { + BoxWithConstraints(Modifier.fillMaxSize()) { + val cardSize = maxWidth - 54.dp + val reactionTopPadding = 103.dp + cardSize + 85.dp - PhotologCardContent( - uiState = uiState, - isPokeDisabled = uiState.isPokeDisabled, - onSwipe = onSwipe, - onClickUpload = onClickUpload, - onPoke = onPoke, - ) - } + Column(Modifier.fillMaxSize()) { + Spacer(Modifier.height(103.dp)) + + PhotologCardContent( + uiState = uiState, + isPokeDisabled = uiState.isPokeDisabled, + onSwipe = onSwipe, + onClickUpload = onClickUpload, + onPoke = onPoke, + ) + } - if (uiState.canReaction) { - ReactionContent( - modifier = - Modifier - .align(Alignment.TopCenter) - .padding(top = reactionTopPadding), - screenHeightPx = screenHeightPx, - reaction = uiState.partnerPhotolog?.reaction, - onClickReaction = onClickReaction, - ) + if (uiState.canReaction) { + ReactionContent( + modifier = + Modifier + .align(Alignment.TopCenter) + .padding(top = reactionTopPadding), + screenHeightPx = screenHeightPx, + reaction = uiState.partnerPhotolog?.reaction, + onClickReaction = onClickReaction, + ) + } } } } - if (uiState.showOverlayLoading || uiState.isPoking) { + if (uiState.showContentLoading) { TwixLoadingOverlay() } } @@ -257,6 +277,137 @@ fun PhotologDetailScreen( } } +/** + * 인증샷 상세 화면의 TopBar 하단 영역에 당겨서 새로고침 인터랙션을 제공한다. + * + * 상세 화면은 LazyColumn처럼 스크롤 가능한 자식이 없어 nested scroll 체인으로 드래그 이벤트를 + * 안정적으로 받을 수 없다. 그래서 이 컨테이너가 세로 드래그를 직접 감지해 아래로 당긴 거리만큼 + * 콘텐츠와 인디케이터를 함께 이동시키고, 기준 거리 이상에서 손을 떼면 [onRefresh]를 호출한다. + * + * [isRefreshing]이 true인 동안에는 콘텐츠를 고정 거리만큼 유지해 새로고침 진행 상태를 보여주고, + * 완료되면 누적된 당김 offset을 초기화한다. + */ +@Composable +private fun PhotologDetailRefreshContent( + modifier: Modifier = Modifier, + isRefreshing: Boolean, + onRefresh: () -> Unit, + content: @Composable () -> Unit, +) { + val density = LocalDensity.current + + // Home 화면의 당겨서 새로고침 감각과 맞춘 거리값들이다. + // trigger는 새로고침 실행 기준, hold는 새로고침 중 유지 거리, max는 과도한 당김 제한값이다. + val refreshTriggerPx = with(density) { 88.dp.toPx() } + val refreshingHoldPx = with(density) { 56.dp.toPx() } + val maxPullPx = with(density) { 140.dp.toPx() } + + var pullOffsetPx by remember { mutableFloatStateOf(0f) } + + // 사용자 드래그 중에는 누적 offset을 따라가고, 새로고침 중에는 hold 위치에 고정한다. + val animatedPullOffsetPx by animateFloatAsState( + targetValue = + when { + isRefreshing -> refreshingHoldPx + else -> pullOffsetPx + }, + animationSpec = spring(), + label = "photolog_detail_pull_offset", + ) + + LaunchedEffect(isRefreshing) { + if (!isRefreshing) { + // 새로고침이 끝나면 다음 당김을 위해 누적 offset을 초기화한다. + pullOffsetPx = 0f + } + } + + Box( + modifier = + modifier + .fillMaxSize() + .pointerInput(isRefreshing) { + detectVerticalDragGestures( + onVerticalDrag = { change, dragAmount -> + if (dragAmount > 0 && !isRefreshing) { + // 아래로 당길 때는 저항감을 주기 위해 실제 드래그 거리의 절반만 반영한다. + val newOffset = + (pullOffsetPx + (dragAmount * 0.5f)) + .coerceAtMost(maxPullPx) + pullOffsetPx = newOffset + change.consume() + } + + if (dragAmount < 0 && pullOffsetPx > 0f) { + // 손가락을 위로 되돌릴 때는 누적된 당김 offset만큼만 다시 줄인다. + pullOffsetPx = (pullOffsetPx + dragAmount).coerceAtLeast(0f) + change.consume() + } + }, + onDragEnd = { + // 기준 거리 이상 당긴 뒤 손을 떼면 새로고침을 시작하고, 부족하면 원위치로 복귀한다. + if (pullOffsetPx >= refreshTriggerPx && !isRefreshing) { + onRefresh() + } else if (!isRefreshing) { + pullOffsetPx = 0f + } + }, + onDragCancel = { + if (!isRefreshing) { + pullOffsetPx = 0f + } + }, + ) + }, + ) { + Column( + Modifier + .fillMaxSize() + .offset { + IntOffset( + x = 0, + y = animatedPullOffsetPx.roundToInt(), + ) + }.background(color = CommonColor.White), + ) { + content() + } + + // 당김 진행률만큼 indicator track을 점진적으로 드러낸다. + val indicatorAlpha = + if (animatedPullOffsetPx <= 0f) { + 0f + } else { + (animatedPullOffsetPx / refreshTriggerPx).coerceIn(0f, 1f) + } + + Box( + modifier = + Modifier + .align(Alignment.TopCenter) + .offset { + IntOffset( + x = 0, + y = + ((animatedPullOffsetPx - with(density) { 32.dp.toPx() }) / 2f) + .coerceAtLeast(0f) + .roundToInt(), + ) + }, + contentAlignment = Alignment.Center, + ) { + if (animatedPullOffsetPx > 0f || isRefreshing) { + CircularProgressIndicator( + modifier = Modifier.size(24.dp), + strokeWidth = 2.5.dp, + color = GrayColor.C500, + trackColor = GrayColor.C100.copy(alpha = indicatorAlpha), + ) + } + } + } +} + private fun formatCooldownTime( context: Context, cooldownTime: CooldownTime, @@ -295,6 +446,7 @@ private fun PhotologDetailScreenPreview( screenHeightPx = 0f, onBack = {}, onRetry = {}, + onRefresh = {}, onClickModify = {}, onClickReaction = {}, onClickUpload = {}, @@ -313,7 +465,3 @@ private fun PhotologDetailScreenPreview( ) } } - -private val photologCardTopPadding = 103.dp -private val photologCardHorizontalPadding = 54.dp -private val reactionBarTopSpacing = 85.dp From aded2c54ba2c787e78b67b0fd52da8d0cf910ada Mon Sep 17 00:00:00 2001 From: chanho0908 Date: Sun, 7 Jun 2026 10:19:16 +0900 Subject: [PATCH 5/5] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Refactor:=20PhotologDe?= =?UTF-8?q?tailScreen=20=EB=82=B4=20=EC=83=88=EB=A1=9C=EA=B3=A0=EC=B9=A8?= =?UTF-8?q?=20=EA=B1=B0=EB=A6=AC=20=EA=B4=80=EB=A0=A8=20=EC=A3=BC=EC=84=9D?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/twix/photolog/detail/PhotologDetailScreen.kt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/feature/photolog/detail/src/main/java/com/twix/photolog/detail/PhotologDetailScreen.kt b/feature/photolog/detail/src/main/java/com/twix/photolog/detail/PhotologDetailScreen.kt index 428af6d10..7733e27f2 100644 --- a/feature/photolog/detail/src/main/java/com/twix/photolog/detail/PhotologDetailScreen.kt +++ b/feature/photolog/detail/src/main/java/com/twix/photolog/detail/PhotologDetailScreen.kt @@ -296,10 +296,11 @@ private fun PhotologDetailRefreshContent( ) { val density = LocalDensity.current - // Home 화면의 당겨서 새로고침 감각과 맞춘 거리값들이다. - // trigger는 새로고침 실행 기준, hold는 새로고침 중 유지 거리, max는 과도한 당김 제한값이다. + // 새로고침 실행 기준 val refreshTriggerPx = with(density) { 88.dp.toPx() } + // 새로고침 중 유지 거리 val refreshingHoldPx = with(density) { 56.dp.toPx() } + // 과도한 당김을 제한하는 값 val maxPullPx = with(density) { 140.dp.toPx() } var pullOffsetPx by remember { mutableFloatStateOf(0f) }