Skip to content

Commit 657f67d

Browse files
committed
[BOOK-304] refactor: remember + LaunchedEffect를 produceState로 변경
1 parent e079b91 commit 657f67d

2 files changed

Lines changed: 25 additions & 32 deletions

File tree

  • core/ui/src/main/kotlin/com/ninecraft/booket/core/ui/component
  • feature/record/src/main/kotlin/com/ninecraft/booket/feature/record/ocr

core/ui/src/main/kotlin/com/ninecraft/booket/core/ui/component/ReedLoadingIndicator.kt

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,8 @@ import androidx.compose.foundation.layout.Box
44
import androidx.compose.foundation.layout.fillMaxSize
55
import androidx.compose.material3.CircularProgressIndicator
66
import androidx.compose.runtime.Composable
7-
import androidx.compose.runtime.LaunchedEffect
87
import androidx.compose.runtime.getValue
9-
import androidx.compose.runtime.mutableStateOf
10-
import androidx.compose.runtime.remember
11-
import androidx.compose.runtime.setValue
8+
import androidx.compose.runtime.produceState
129
import androidx.compose.ui.Alignment
1310
import androidx.compose.ui.Modifier
1411
import com.ninecraft.booket.core.common.extensions.noRippleClickable
@@ -21,11 +18,9 @@ fun ReedLoadingIndicator(
2118
modifier: Modifier = Modifier,
2219
delayMillis: Long = 500L,
2320
) {
24-
var showProgressBar by remember { mutableStateOf(false) }
25-
26-
LaunchedEffect(Unit) {
21+
val showProgressBar by produceState(initialValue = false, key1 = delayMillis) {
2722
delay(delayMillis)
28-
showProgressBar = true
23+
value = true
2924
}
3025

3126
if (showProgressBar) {

feature/record/src/main/kotlin/com/ninecraft/booket/feature/record/ocr/OcrUi.kt

Lines changed: 22 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,8 @@ import androidx.compose.runtime.Composable
3737
import androidx.compose.runtime.DisposableEffect
3838
import androidx.compose.runtime.LaunchedEffect
3939
import androidx.compose.runtime.getValue
40-
import androidx.compose.runtime.mutableStateOf
40+
import androidx.compose.runtime.produceState
4141
import androidx.compose.runtime.remember
42-
import androidx.compose.runtime.setValue
4342
import androidx.compose.ui.Alignment
4443
import androidx.compose.ui.Modifier
4544
import androidx.compose.ui.graphics.Color
@@ -101,16 +100,31 @@ private fun CameraPreview(
101100
/**
102101
* Camera Permission Request
103102
*/
104-
var isGranted by remember {
105-
mutableStateOf(
106-
ContextCompat.checkSelfPermission(context, permission) == PackageManager.PERMISSION_GRANTED,
107-
)
103+
val isGranted by produceState(
104+
initialValue = ContextCompat.checkSelfPermission(context, permission) == PackageManager.PERMISSION_GRANTED,
105+
key1 = lifecycleOwner, // lifecycle 변경 시 재설정
106+
) {
107+
// 최초 동기화
108+
value = ContextCompat.checkSelfPermission(context, permission) == PackageManager.PERMISSION_GRANTED
109+
110+
// 포그라운드 복귀 시 OS 권한 동기화
111+
val observer = LifecycleEventObserver { _, event ->
112+
if (event == Lifecycle.Event.ON_RESUME) {
113+
value = ContextCompat.checkSelfPermission(context, permission) == PackageManager.PERMISSION_GRANTED
114+
if (value) {
115+
state.eventSink(OcrUiEvent.OnHidePermissionDialog)
116+
} else {
117+
state.eventSink(OcrUiEvent.OnShowPermissionDialog)
118+
}
119+
}
120+
}
121+
lifecycleOwner.lifecycle.addObserver(observer)
122+
awaitDispose { lifecycleOwner.lifecycle.removeObserver(observer) }
108123
}
124+
109125
val permissionLauncher = rememberLauncherForActivityResult(
110126
contract = ActivityResultContracts.RequestPermission(),
111127
) { granted ->
112-
isGranted = granted
113-
114128
if (!granted) {
115129
state.eventSink(OcrUiEvent.OnShowPermissionDialog)
116130
}
@@ -127,22 +141,6 @@ private fun CameraPreview(
127141
}
128142
}
129143

130-
// 앱이 포그라운드로 북귀할 때 OS 권한 동기화
131-
DisposableEffect(Unit) {
132-
val observer = LifecycleEventObserver { _, event ->
133-
if (event == Lifecycle.Event.ON_RESUME) {
134-
isGranted = ContextCompat.checkSelfPermission(context, permission) == PackageManager.PERMISSION_GRANTED
135-
if (isGranted) {
136-
state.eventSink(OcrUiEvent.OnHidePermissionDialog)
137-
} else {
138-
state.eventSink(OcrUiEvent.OnShowPermissionDialog)
139-
}
140-
}
141-
}
142-
lifecycleOwner.lifecycle.addObserver(observer)
143-
onDispose { lifecycleOwner.lifecycle.removeObserver(observer) }
144-
}
145-
146144
/**
147145
* Camera Controller
148146
*/

0 commit comments

Comments
 (0)