Skip to content

Commit

Permalink
Add empty eventmap module
Browse files Browse the repository at this point in the history
  • Loading branch information
takahirom committed Jun 15, 2024
1 parent 66dd855 commit 76051aa
Show file tree
Hide file tree
Showing 11 changed files with 189 additions and 1 deletion.
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package io.github.droidkaigi.confsched.data.eventmap

import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent

@Module
@InstallIn(SingletonComponent::class)
public class EventMapApiModule {
@Provides
public fun provideEventMapApi(): EventMapApiClient {
return FakeEventMapApiClient()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package io.github.droidkaigi.confsched.data.eventmap

import dagger.Binds
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import dagger.multibindings.ClassKey
import dagger.multibindings.IntoMap
import io.github.droidkaigi.confsched.data.di.RepositoryQualifier
import io.github.droidkaigi.confsched.model.EventMapRepository
import javax.inject.Singleton

@Module
@InstallIn(SingletonComponent::class)
public abstract class EventMapRepositoryModule {
@Binds
@RepositoryQualifier
@IntoMap
@ClassKey(EventMapRepository::class)
public abstract fun bind(repository: EventMapRepository): Any

public companion object {
@Provides
@Singleton
public fun provideEventMapRepository(
eventMapApi: EventMapApiClient,
): EventMapRepository {
return DefaultEventMapRepository(
eventMapApi = eventMapApi,
)
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package io.github.droidkaigi.confsched.data.eventmap

import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import io.github.droidkaigi.confsched.compose.SafeLaunchedEffect
import io.github.droidkaigi.confsched.compose.safeCollectAsState
import io.github.droidkaigi.confsched.model.EventMapEvent
import io.github.droidkaigi.confsched.model.EventMapRepository
import kotlinx.collections.immutable.PersistentList
import kotlinx.collections.immutable.persistentListOf
import kotlinx.collections.immutable.toPersistentList
import kotlinx.coroutines.flow.MutableStateFlow

public class DefaultEventMapRepository(
private val eventMapApi: EventMapApiClient,
) : EventMapRepository {
private val eventMapStateFlow =
MutableStateFlow<PersistentList<EventMapEvent>>(persistentListOf())

@Composable
override fun eventMapEvents(): PersistentList<EventMapEvent> {
val eventMap by eventMapStateFlow.safeCollectAsState()
SafeLaunchedEffect(Unit) {
if (eventMap.isEmpty()) {
refresh()
}
}
return eventMap
}

override suspend fun refresh() {
eventMapApi
.eventMapEvents()
.toPersistentList().also { eventMapStateFlow.value = it }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package io.github.droidkaigi.confsched.data.eventmap

import de.jensklingenberg.ktorfit.http.GET
import io.github.droidkaigi.confsched.data.eventmap.response.EventMapResponse
import io.github.droidkaigi.confsched.model.EventMapEvent
import kotlinx.collections.immutable.PersistentList
import kotlinx.collections.immutable.toPersistentList

internal interface EventMapApi {
@GET("/events/droidkaigi2023/eventmap")
suspend fun getEventMap(): EventMapResponse
}

public interface EventMapApiClient {

public suspend fun eventMapEvents(): PersistentList<EventMapEvent>
}

public fun EventMapResponse.toEventMapList(): PersistentList<EventMapEvent> {
return listOf(EventMapEvent()).toPersistentList()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package io.github.droidkaigi.confsched.data.eventmap

import io.github.droidkaigi.confsched.data.eventmap.response.EventMapResponse
import io.github.droidkaigi.confsched.model.EventMapEvent
import kotlinx.collections.immutable.PersistentList
import okio.IOException

public class FakeEventMapApiClient : EventMapApiClient {

public sealed class Status : EventMapApiClient {
public data object Operational : Status() {
override suspend fun eventMapEvents(): PersistentList<EventMapEvent> {
return EventMapResponse().toEventMapList()
}
}

public data object Error : Status() {
override suspend fun eventMapEvents(): PersistentList<EventMapEvent> {
throw IOException("Fake IO Exception")
}
}
}

private var status: Status = Status.Operational

public fun setup(status: Status) {
this.status = status
}

override suspend fun eventMapEvents(): PersistentList<EventMapEvent> {
return status.eventMapEvents()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
package io.github.droidkaigi.confsched.data.eventmap.response

public class EventMapResponse
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
package io.github.droidkaigi.confsched.model

class EventMapEvent
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package io.github.droidkaigi.confsched.model

import androidx.compose.runtime.Composable
import io.github.droidkaigi.confsched.model.compositionlocal.LocalRepositories
import kotlinx.collections.immutable.PersistentList

interface EventMapRepository {

suspend fun refresh()

@Composable
fun eventMapEvents(): PersistentList<EventMapEvent>
}

@Composable
fun localEventMapRepository(): EventMapRepository {
return LocalRepositories.current[EventMapRepository::class] as EventMapRepository
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ package io.github.droidkaigi.confsched.testing
import androidx.compose.ui.test.junit4.ComposeTestRule
import io.github.droidkaigi.confsched.data.contributors.ContributorsApiClient
import io.github.droidkaigi.confsched.data.contributors.FakeContributorsApiClient
import io.github.droidkaigi.confsched.data.eventmap.EventMapApiClient
import io.github.droidkaigi.confsched.data.eventmap.FakeEventMapApiClient
import io.github.droidkaigi.confsched.data.sessions.FakeSessionsApiClient
import io.github.droidkaigi.confsched.data.sessions.SessionsApiClient
import io.github.droidkaigi.confsched.testing.coroutines.runTestWithLogging
Expand Down Expand Up @@ -136,3 +138,25 @@ class DefaultContributorsServerRobot @Inject constructor(contributorsApiClient:
)
}
}

interface EventMapServerRobot {
enum class ServerStatus {
Operational,
Error,
}

fun setupContributorServer(serverStatus: ServerStatus)
}

class DefaultEventMapServerRobot @Inject constructor(contributorsApiClient: EventMapApiClient) :
EventMapServerRobot {
private val fakeEventMapApiClient = contributorsApiClient as FakeEventMapApiClient
override fun setupContributorServer(serverStatus: EventMapServerRobot.ServerStatus) {
fakeEventMapApiClient.setup(
when (serverStatus) {
EventMapServerRobot.ServerStatus.Operational -> FakeEventMapApiClient.Status.Operational
EventMapServerRobot.ServerStatus.Error -> FakeEventMapApiClient.Status.Error
},
)
}
}
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
app.ios.shared.debug=true

# gradle
org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
org.gradle.jvmargs=-Xmx6048m -Dfile.encoding=UTF-8
org.gradle.configureondemand=true
org.gradle.caching=true
org.gradle.parallel=true
Expand Down
1 change: 1 addition & 0 deletions settings.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ include(
":feature:main",
":feature:sessions",
":feature:contributors",
":feature:eventmap",
":core:designsystem",
":core:data",
":core:model",
Expand Down

0 comments on commit 76051aa

Please sign in to comment.