Skip to content

Commit 32f11e0

Browse files
committed
Feat: click throttling 기능 추가
- 중복 클릭 방지를 위한 `ClickThrottler` 및 `throttled` Composable을 추가합니다.
1 parent e4bb0b9 commit 32f11e0

3 files changed

Lines changed: 39 additions & 14 deletions

File tree

core/designsystem/src/main/java/com/threegap/bitnagil/designsystem/component/block/BitnagilTopBar.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import com.threegap.bitnagil.designsystem.BitnagilTheme
1818
import com.threegap.bitnagil.designsystem.R
1919
import com.threegap.bitnagil.designsystem.component.atom.BitnagilIcon
2020
import com.threegap.bitnagil.designsystem.component.atom.BitnagilIconButton
21+
import com.threegap.bitnagil.designsystem.modifier.throttled
2122

2223
@Composable
2324
fun BitnagilTopBar(
@@ -35,7 +36,7 @@ fun BitnagilTopBar(
3536
if (showBackButton) {
3637
BitnagilIconButton(
3738
id = R.drawable.ic_chevron_left_lg,
38-
onClick = onBackClick,
39+
onClick = throttled { onBackClick() },
3940
tint = BitnagilTheme.colors.coolGray10,
4041
modifier = Modifier
4142
.align(Alignment.CenterStart),
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package com.threegap.bitnagil.designsystem.modifier
2+
3+
import android.os.SystemClock
4+
import androidx.compose.runtime.Composable
5+
import androidx.compose.runtime.remember
6+
7+
class ClickThrottler(private val throttleTimeMs: Long = 500L) {
8+
private var lastClickTime: Long = 0L
9+
10+
fun processEvent(event: () -> Unit) {
11+
val now = SystemClock.elapsedRealtime()
12+
if (now - lastClickTime >= throttleTimeMs) {
13+
lastClickTime = now
14+
event()
15+
}
16+
}
17+
}
18+
19+
@Composable
20+
fun throttled(
21+
throttleTimeMs: Long = 500L,
22+
onClick: () -> Unit
23+
): () -> Unit {
24+
val throttler = remember { ClickThrottler(throttleTimeMs) }
25+
26+
return remember(onClick) {
27+
{ throttler.processEvent(onClick) }
28+
}
29+
}
Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,19 @@
11
package com.threegap.bitnagil.designsystem.modifier
22

33
import androidx.compose.foundation.clickable
4-
import androidx.compose.foundation.interaction.MutableInteractionSource
5-
import androidx.compose.runtime.remember
64
import androidx.compose.ui.Modifier
7-
import androidx.compose.ui.composed
85
import androidx.compose.ui.semantics.Role
96

107
fun Modifier.clickableWithoutRipple(
118
enabled: Boolean = true,
129
onClickLabel: String? = null,
1310
role: Role? = null,
1411
onClick: () -> Unit,
15-
) = composed {
16-
clickable(
17-
indication = null,
18-
interactionSource = remember { MutableInteractionSource() },
19-
enabled = enabled,
20-
onClickLabel = onClickLabel,
21-
role = role,
22-
onClick = onClick,
23-
)
24-
}
12+
) = this.clickable(
13+
interactionSource = null,
14+
indication = null,
15+
enabled = enabled,
16+
onClickLabel = onClickLabel,
17+
role = role,
18+
onClick = onClick,
19+
)

0 commit comments

Comments
 (0)