Skip to content

Commit 04df9da

Browse files
committed
Launch a coroutines job for each event
1 parent c83399c commit 04df9da

File tree

25 files changed

+267
-269
lines changed

25 files changed

+267
-269
lines changed

README.md

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -97,18 +97,16 @@ TimetableScreen ----> timetableScreenPresenter -> sessionsRepository
9797
```kotlin
9898
@Composable
9999
fun timetableScreenPresenter(
100-
events: Flow<TimetableScreenEvent>,
100+
events: EventEmitter<TimetableScreenEvent>,
101101
sessionsRepository: SessionsRepository = localSessionsRepository(),
102102
): TimetableScreenUiState = providePresenterDefaults { userMessageStateHolder ->
103103
...
104-
SafeLaunchedEffect(Unit) {
105-
events.collect { event ->
106-
when (event) {
107-
is Bookmark -> {
108-
sessionsRepository.toggleBookmark(event.timetableItem.id)
109-
}
110-
...
104+
EventEffect(Unit) { event ->
105+
when (event) {
106+
is Bookmark -> {
107+
sessionsRepository.toggleBookmark(event.timetableItem.id)
111108
}
109+
...
112110
}
113111
}
114112
...
@@ -176,7 +174,7 @@ SessionsRepository ----> timetableScreenPresenter
176174
```kotlin
177175
@Composable
178176
fun timetableScreenPresenter(
179-
events: Flow<TimetableScreenEvent>,
177+
events: EventEmitter<TimetableScreenEvent>,
180178
sessionsRepository: SessionsRepository = localSessionsRepository(),
181179
): TimetableScreenUiState = providePresenterDefaults { userMessageStateHolder ->
182180
// Sessions are updated in the timetable() function
@@ -189,10 +187,8 @@ fun timetableScreenPresenter(
189187
),
190188
)
191189
...
192-
SafeLaunchedEffect(Unit) {
193-
events.collect { event ->
194-
...
195-
}
190+
EventEffect(events) { event ->
191+
...
196192
}
197193
TimetableScreenUiState(
198194
contentUiState = timetableUiState,

core/common/src/commonMain/kotlin/io/github/droidkaigi/confsched/compose/EventEmitter.kt

Lines changed: 0 additions & 14 deletions
This file was deleted.
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package io.github.droidkaigi.confsched.compose
2+
3+
import androidx.compose.runtime.Composable
4+
import androidx.compose.runtime.remember
5+
import kotlinx.coroutines.CoroutineScope
6+
import kotlinx.coroutines.flow.MutableSharedFlow
7+
import kotlinx.coroutines.launch
8+
9+
typealias EventFlow<T> = MutableSharedFlow<T>
10+
11+
@Composable
12+
fun <T> rememberEventFlow(): EventFlow<T> {
13+
return remember {
14+
MutableSharedFlow(extraBufferCapacity = 20)
15+
}
16+
}
17+
18+
@Composable
19+
fun <EVENT> EventEffect(
20+
eventFlow: EventFlow<EVENT>,
21+
block: suspend CoroutineScope.(EVENT) -> Unit,
22+
) {
23+
SafeLaunchedEffect(eventFlow) {
24+
eventFlow.collect { event ->
25+
launch {
26+
block(event)
27+
}
28+
}
29+
}
30+
}

feature/contributors/src/commonMain/kotlin/io/github/droidkaigi/confsched/contributors/ContributorsScreen.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import androidx.compose.ui.platform.testTag
2020
import androidx.navigation.NavGraphBuilder
2121
import androidx.navigation.compose.composable
2222
import conference_app_2024.feature.contributors.generated.resources.contributor_title
23-
import io.github.droidkaigi.confsched.compose.rememberEventEmitter
23+
import io.github.droidkaigi.confsched.compose.rememberEventFlow
2424
import io.github.droidkaigi.confsched.contributors.component.ContributorsItem
2525
import io.github.droidkaigi.confsched.droidkaigiui.SnackbarMessageEffect
2626
import io.github.droidkaigi.confsched.droidkaigiui.UserMessageStateHolder
@@ -65,7 +65,7 @@ fun ContributorsScreen(
6565
modifier: Modifier = Modifier,
6666
isTopAppBarHidden: Boolean = false,
6767
) {
68-
val eventEmitter = rememberEventEmitter<ContributorsScreenEvent>()
68+
val eventEmitter = rememberEventFlow<ContributorsScreenEvent>()
6969
val uiState = contributorsScreenPresenter(
7070
events = eventEmitter,
7171
)

feature/contributors/src/commonMain/kotlin/io/github/droidkaigi/confsched/contributors/ContributorsScreenPresenter.kt

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,21 @@ package io.github.droidkaigi.confsched.contributors
33
import androidx.compose.runtime.Composable
44
import androidx.compose.runtime.getValue
55
import androidx.compose.runtime.rememberUpdatedState
6-
import io.github.droidkaigi.confsched.compose.SafeLaunchedEffect
6+
import io.github.droidkaigi.confsched.compose.EventEffect
7+
import io.github.droidkaigi.confsched.compose.EventFlow
78
import io.github.droidkaigi.confsched.droidkaigiui.providePresenterDefaults
89
import io.github.droidkaigi.confsched.model.ContributorsRepository
910
import io.github.droidkaigi.confsched.model.localContributorsRepository
10-
import kotlinx.coroutines.flow.Flow
1111

1212
sealed interface ContributorsScreenEvent
1313

1414
@Composable
1515
fun contributorsScreenPresenter(
16-
events: Flow<ContributorsScreenEvent>,
16+
events: EventFlow<ContributorsScreenEvent>,
1717
contributorsRepository: ContributorsRepository = localContributorsRepository(),
1818
): ContributorsUiState = providePresenterDefaults { userMessageStateHolder ->
1919
val contributors by rememberUpdatedState(contributorsRepository.contributors())
20-
SafeLaunchedEffect(Unit) {
21-
events.collect {
22-
}
20+
EventEffect(events) { event ->
2321
}
2422
ContributorsUiState(
2523
contributors = contributors,

feature/contributors/src/iosMain/kotlin/io/github/droidkaigi/confsched/contributors/ContributorsViewController.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.github.droidkaigi.confsched.contributors
22

3+
import io.github.droidkaigi.confsched.compose.EventFlow
34
import io.github.droidkaigi.confsched.data.Repositories
45
import io.github.droidkaigi.confsched.droidkaigiui.composeViewController
56
import io.github.droidkaigi.confsched.droidkaigiui.presenterStateFlow
@@ -22,7 +23,7 @@ fun contributorsViewController(
2223
@Suppress("unused")
2324
fun contributorsScreenPresenterStateFlow(
2425
repositories: Map<KClass<*>, Any>,
25-
events: Flow<ContributorsScreenEvent>,
26+
events: EventFlow<ContributorsScreenEvent>,
2627
): Flow<ContributorsUiState> = presenterStateFlow(
2728
events = events,
2829
repositories = repositories,

feature/eventmap/src/commonMain/kotlin/io/github/droidkaigi/confsched/eventmap/EventMapScreen.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ import androidx.navigation.NavGraphBuilder
2929
import androidx.navigation.compose.composable
3030
import co.touchlab.kermit.Logger
3131
import conference_app_2024.feature.eventmap.generated.resources.eventmap
32-
import io.github.droidkaigi.confsched.compose.rememberEventEmitter
32+
import io.github.droidkaigi.confsched.compose.rememberEventFlow
3333
import io.github.droidkaigi.confsched.droidkaigiui.SnackbarMessageEffect
3434
import io.github.droidkaigi.confsched.droidkaigiui.UserMessageStateHolder
3535
import io.github.droidkaigi.confsched.droidkaigiui.component.AnimatedTextTopAppBar
@@ -81,7 +81,7 @@ fun EventMapScreen(
8181
modifier: Modifier = Modifier,
8282
contentPadding: PaddingValues = PaddingValues(),
8383
) {
84-
val eventEmitter = rememberEventEmitter<EventMapScreenEvent>()
84+
val eventEmitter = rememberEventFlow<EventMapScreenEvent>()
8585
val uiState = eventMapScreenPresenter(
8686
events = eventEmitter,
8787
)

feature/eventmap/src/commonMain/kotlin/io/github/droidkaigi/confsched/eventmap/EventMapScreenPresenter.kt

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,21 @@ package io.github.droidkaigi.confsched.eventmap
33
import androidx.compose.runtime.Composable
44
import androidx.compose.runtime.getValue
55
import androidx.compose.runtime.rememberUpdatedState
6-
import io.github.droidkaigi.confsched.compose.SafeLaunchedEffect
6+
import io.github.droidkaigi.confsched.compose.EventEffect
7+
import io.github.droidkaigi.confsched.compose.EventFlow
78
import io.github.droidkaigi.confsched.droidkaigiui.providePresenterDefaults
89
import io.github.droidkaigi.confsched.model.EventMapRepository
910
import io.github.droidkaigi.confsched.model.localEventMapRepository
10-
import kotlinx.coroutines.flow.Flow
1111

1212
sealed interface EventMapScreenEvent
1313

1414
@Composable
1515
fun eventMapScreenPresenter(
16-
events: Flow<EventMapScreenEvent>,
16+
events: EventFlow<EventMapScreenEvent>,
1717
eventMapRepository: EventMapRepository = localEventMapRepository(),
1818
): EventMapUiState = providePresenterDefaults { userMessageStateHolder ->
1919
val eventMap by rememberUpdatedState(eventMapRepository.eventMapEvents())
20-
SafeLaunchedEffect(Unit) {
21-
events.collect {
22-
}
20+
EventEffect(events) { event ->
2321
}
2422
EventMapUiState(
2523
eventMap = eventMap,

feature/favorites/src/commonMain/kotlin/io/github/droidkaigi/confsched/favorites/FavoritesScreen.kt

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ import androidx.navigation.NavGraph.Companion.findStartDestination
2525
import androidx.navigation.NavGraphBuilder
2626
import androidx.navigation.compose.composable
2727
import conference_app_2024.feature.favorites.generated.resources.favorite
28-
import io.github.droidkaigi.confsched.compose.EventEmitter
29-
import io.github.droidkaigi.confsched.compose.rememberEventEmitter
28+
import io.github.droidkaigi.confsched.compose.EventFlow
29+
import io.github.droidkaigi.confsched.compose.rememberEventFlow
3030
import io.github.droidkaigi.confsched.designsystem.theme.KaigiTheme
3131
import io.github.droidkaigi.confsched.droidkaigiui.SnackbarMessageEffect
3232
import io.github.droidkaigi.confsched.droidkaigiui.UserMessageStateHolder
@@ -79,8 +79,8 @@ fun FavoritesScreen(
7979
onTimetableItemClick: (TimetableItem) -> Unit,
8080
modifier: Modifier = Modifier,
8181
contentPadding: PaddingValues = PaddingValues(),
82-
eventEmitter: EventEmitter<FavoritesScreenEvent> = rememberEventEmitter(),
83-
uiState: FavoritesScreenUiState = favoritesScreenPresenter(events = eventEmitter),
82+
eventFlow: EventFlow<FavoritesScreenEvent> = rememberEventFlow(),
83+
uiState: FavoritesScreenUiState = favoritesScreenPresenter(events = eventFlow),
8484
) {
8585
val snackbarHostState = remember { SnackbarHostState() }
8686

@@ -93,16 +93,16 @@ fun FavoritesScreen(
9393
snackbarHostState = snackbarHostState,
9494
onTimetableItemClick = onTimetableItemClick,
9595
onAllFilterChipClick = {
96-
eventEmitter.tryEmit(FavoritesScreenEvent.AllFilter)
96+
eventFlow.tryEmit(FavoritesScreenEvent.AllFilter)
9797
},
9898
onDay1FilterChipClick = {
99-
eventEmitter.tryEmit(FavoritesScreenEvent.Day1Filter)
99+
eventFlow.tryEmit(FavoritesScreenEvent.Day1Filter)
100100
},
101101
onDay2FilterChipClick = {
102-
eventEmitter.tryEmit(FavoritesScreenEvent.Day2Filter)
102+
eventFlow.tryEmit(FavoritesScreenEvent.Day2Filter)
103103
},
104104
onBookmarkClick = { timetableItem ->
105-
eventEmitter.tryEmit(FavoritesScreenEvent.Bookmark(timetableItem))
105+
eventFlow.tryEmit(FavoritesScreenEvent.Bookmark(timetableItem))
106106
},
107107
contentPadding = contentPadding,
108108
modifier = modifier,

feature/favorites/src/commonMain/kotlin/io/github/droidkaigi/confsched/favorites/FavoritesScreenPresenter.kt

Lines changed: 21 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ import androidx.compose.runtime.mutableStateOf
66
import androidx.compose.runtime.remember
77
import androidx.compose.runtime.rememberUpdatedState
88
import androidx.compose.runtime.setValue
9-
import io.github.droidkaigi.confsched.compose.SafeLaunchedEffect
9+
import io.github.droidkaigi.confsched.compose.EventEffect
10+
import io.github.droidkaigi.confsched.compose.EventFlow
1011
import io.github.droidkaigi.confsched.droidkaigiui.providePresenterDefaults
1112
import io.github.droidkaigi.confsched.favorites.FavoritesScreenEvent.AllFilter
1213
import io.github.droidkaigi.confsched.favorites.FavoritesScreenEvent.Bookmark
@@ -26,7 +27,6 @@ import kotlinx.collections.immutable.PersistentSet
2627
import kotlinx.collections.immutable.toPersistentList
2728
import kotlinx.collections.immutable.toPersistentMap
2829
import kotlinx.collections.immutable.toPersistentSet
29-
import kotlinx.coroutines.flow.Flow
3030

3131
sealed interface FavoritesScreenEvent {
3232
data class Bookmark(val timetableItem: TimetableItem) : FavoritesScreenEvent
@@ -38,7 +38,7 @@ sealed interface FavoritesScreenEvent {
3838

3939
@Composable
4040
fun favoritesScreenPresenter(
41-
events: Flow<FavoritesScreenEvent>,
41+
events: EventFlow<FavoritesScreenEvent>,
4242
sessionsRepository: SessionsRepository = localSessionsRepository(),
4343
): FavoritesScreenUiState = providePresenterDefaults { userMessageStateHolder ->
4444
val favoriteSessions by rememberUpdatedState(
@@ -56,33 +56,32 @@ fun favoritesScreenPresenter(
5656
),
5757
)
5858

59-
SafeLaunchedEffect(Unit) {
60-
events.collect { event ->
61-
when (event) {
62-
is Bookmark -> {
63-
sessionsRepository.toggleBookmark(event.timetableItem.id)
64-
}
59+
EventEffect(events) { event ->
60+
when (event) {
61+
is Bookmark -> {
62+
sessionsRepository.toggleBookmark(event.timetableItem.id)
63+
}
6564

66-
AllFilter -> {
67-
allFilterSelected = true
68-
currentDayFilters = emptySet()
69-
}
65+
AllFilter -> {
66+
allFilterSelected = true
67+
currentDayFilters = emptySet()
68+
}
7069

71-
Day1Filter, Day2Filter -> {
72-
allFilterSelected = false
70+
Day1Filter, Day2Filter -> {
71+
allFilterSelected = false
7372

74-
val dayType = if (event is Day1Filter) {
75-
ConferenceDay1
76-
} else {
77-
ConferenceDay2
78-
}
73+
val dayType = if (event is Day1Filter) {
74+
ConferenceDay1
75+
} else {
76+
ConferenceDay2
77+
}
7978

80-
currentDayFilters = if (currentDayFilters.contains(dayType) && currentDayFilters.size >= 2) {
79+
currentDayFilters =
80+
if (currentDayFilters.contains(dayType) && currentDayFilters.size >= 2) {
8181
currentDayFilters - dayType
8282
} else {
8383
currentDayFilters + dayType
8484
}
85-
}
8685
}
8786
}
8887
}

0 commit comments

Comments
 (0)