Skip to content

Commit e9e04d2

Browse files
committed
refactor: Use a flag in UiState instead of passing a callback to the presenter
1 parent 203d189 commit e9e04d2

2 files changed

Lines changed: 12 additions & 6 deletions

File tree

feature/profilecard/src/commonMain/kotlin/io/github/droidkaigi/confsched/profilecard/CropImageScreen.kt

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import androidx.compose.material3.Scaffold
2020
import androidx.compose.material3.Text
2121
import androidx.compose.material3.TopAppBar
2222
import androidx.compose.runtime.Composable
23+
import androidx.compose.runtime.LaunchedEffect
2324
import androidx.compose.runtime.getValue
2425
import androidx.compose.runtime.mutableFloatStateOf
2526
import androidx.compose.runtime.mutableStateOf
@@ -73,6 +74,7 @@ internal sealed interface CropImageScreenState {
7374

7475
data class Confirm(
7576
val profileImage: ProfileImage,
77+
val shouldBack: Boolean,
7678
) : CropImageScreenState
7779
}
7880

@@ -83,11 +85,14 @@ internal fun CropImageScreen(
8385
onConfirm: () -> Unit,
8486
modifier: Modifier = Modifier,
8587
eventFlow: EventFlow<CropImageScreenEvent> = rememberEventFlow(),
86-
uiState: CropImageScreenState = cropImageScreenPresenter(
87-
onConfirm = onConfirm,
88-
events = eventFlow,
89-
),
88+
uiState: CropImageScreenState = cropImageScreenPresenter(eventFlow),
9089
) {
90+
LaunchedEffect(uiState is CropImageScreenState.Confirm && uiState.shouldBack) {
91+
if (uiState is CropImageScreenState.Confirm && uiState.shouldBack) {
92+
onConfirm()
93+
}
94+
}
95+
9196
Scaffold(
9297
modifier = modifier.fillMaxSize(),
9398
topBar = {

feature/profilecard/src/commonMain/kotlin/io/github/droidkaigi/confsched/profilecard/CropImageScreenPresenter.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,13 @@ internal sealed interface CropImageScreenEvent {
2424

2525
@Composable
2626
internal fun cropImageScreenPresenter(
27-
onConfirm: () -> Unit,
2827
events: Flow<CropImageScreenEvent>,
2928
repository: ProfileCardRepository = localProfileCardRepository(),
3029
): CropImageScreenState = providePresenterDefaults { _ ->
3130
val profileImageCandidate: ProfileImage? by rememberUpdatedState(repository.profileImageCandidate())
3231
var croppedProfileImage: ProfileImage? by remember { mutableStateOf(null) }
3332
var isProcessing: Boolean by remember { mutableStateOf(false) }
33+
var shouldBack: Boolean by remember { mutableStateOf(false) }
3434

3535
SafeLaunchedEffect(Unit) {
3636
events.collect { event ->
@@ -49,7 +49,7 @@ internal fun cropImageScreenPresenter(
4949
val result = requireNotNull(croppedProfileImage)
5050
repository.setProfileImageInEdit(result)
5151

52-
onConfirm()
52+
shouldBack = true
5353
}
5454

5555
is CropImageScreenEvent.Cancel -> {
@@ -76,6 +76,7 @@ internal fun cropImageScreenPresenter(
7676
else -> {
7777
CropImageScreenState.Confirm(
7878
profileImage = cropped,
79+
shouldBack = shouldBack,
7980
)
8081
}
8182
}

0 commit comments

Comments
 (0)