diff --git a/shared/src/commonMain/kotlin/dev/dimension/flare/data/datastore/AppDataStore.kt b/shared/src/commonMain/kotlin/dev/dimension/flare/data/datastore/AppDataStore.kt index 1411e5824..8b7c5460f 100644 --- a/shared/src/commonMain/kotlin/dev/dimension/flare/data/datastore/AppDataStore.kt +++ b/shared/src/commonMain/kotlin/dev/dimension/flare/data/datastore/AppDataStore.kt @@ -3,6 +3,8 @@ package dev.dimension.flare.data.datastore import androidx.datastore.core.DataStore import androidx.datastore.core.DataStoreFactory import androidx.datastore.core.okio.OkioStorage +import dev.dimension.flare.data.datastore.model.ComposeConfigData +import dev.dimension.flare.data.datastore.model.ComposeConfigDataSerializer import dev.dimension.flare.data.datastore.model.FlareConfig import dev.dimension.flare.data.datastore.model.FlareConfigSerializer import dev.dimension.flare.data.datastore.model.GuestData @@ -39,4 +41,17 @@ internal class AppDataStore( ), ) } + + val composeConfigData: DataStore by lazy { + DataStoreFactory.create( + storage = + OkioStorage( + fileSystem = FileSystem.SYSTEM, + serializer = ComposeConfigDataSerializer, + producePath = { + platformPathProducer.dataStoreFile("compose_config.pb") + }, + ), + ) + } } diff --git a/shared/src/commonMain/kotlin/dev/dimension/flare/data/datastore/model/ComposeConfigData.kt b/shared/src/commonMain/kotlin/dev/dimension/flare/data/datastore/model/ComposeConfigData.kt new file mode 100644 index 000000000..084e04bc1 --- /dev/null +++ b/shared/src/commonMain/kotlin/dev/dimension/flare/data/datastore/model/ComposeConfigData.kt @@ -0,0 +1,32 @@ +package dev.dimension.flare.data.datastore.model + +import androidx.datastore.core.okio.OkioSerializer +import dev.dimension.flare.ui.model.UiTimeline +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.Serializable +import kotlinx.serialization.decodeFromByteArray +import kotlinx.serialization.encodeToByteArray +import kotlinx.serialization.protobuf.ProtoBuf +import okio.BufferedSink +import okio.BufferedSource + +@Serializable +internal data class ComposeConfigData( + val visibility: UiTimeline.ItemContent.Status.TopEndContent.Visibility.Type = + UiTimeline.ItemContent.Status.TopEndContent.Visibility.Type.Public, +) + +@OptIn(ExperimentalSerializationApi::class) +internal data object ComposeConfigDataSerializer : OkioSerializer { + override val defaultValue: ComposeConfigData + get() = ComposeConfigData() + + override suspend fun readFrom(source: BufferedSource): ComposeConfigData = ProtoBuf.decodeFromByteArray(source.readByteArray()) + + override suspend fun writeTo( + t: ComposeConfigData, + sink: BufferedSink, + ) { + sink.write(ProtoBuf.encodeToByteArray(t)) + } +} diff --git a/shared/src/commonMain/kotlin/dev/dimension/flare/ui/model/UiTimeline.kt b/shared/src/commonMain/kotlin/dev/dimension/flare/ui/model/UiTimeline.kt index a0d729d88..e790e0e7e 100644 --- a/shared/src/commonMain/kotlin/dev/dimension/flare/ui/model/UiTimeline.kt +++ b/shared/src/commonMain/kotlin/dev/dimension/flare/ui/model/UiTimeline.kt @@ -12,6 +12,7 @@ import dev.dimension.flare.ui.render.UiRichText import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.ImmutableMap import kotlinx.collections.immutable.persistentListOf +import kotlinx.serialization.Serializable @Immutable public data class UiTimeline internal constructor( @@ -157,6 +158,7 @@ public data class UiTimeline internal constructor( public data class Visibility internal constructor( val visibility: Type, ) : TopEndContent() { + @Serializable public enum class Type { Public, Home, diff --git a/shared/src/commonMain/kotlin/dev/dimension/flare/ui/presenter/compose/ComposePresenter.kt b/shared/src/commonMain/kotlin/dev/dimension/flare/ui/presenter/compose/ComposePresenter.kt index 73a4d176d..ea12879b6 100644 --- a/shared/src/commonMain/kotlin/dev/dimension/flare/ui/presenter/compose/ComposePresenter.kt +++ b/shared/src/commonMain/kotlin/dev/dimension/flare/ui/presenter/compose/ComposePresenter.kt @@ -15,6 +15,7 @@ import dev.dimension.flare.data.datasource.microblog.AuthenticatedMicroblogDataS import dev.dimension.flare.data.datasource.microblog.ComposeConfig import dev.dimension.flare.data.datasource.microblog.ComposeData import dev.dimension.flare.data.datasource.microblog.ComposeType +import dev.dimension.flare.data.datastore.AppDataStore import dev.dimension.flare.data.repository.AccountRepository import dev.dimension.flare.data.repository.accountProvider import dev.dimension.flare.data.repository.accountServiceProvider @@ -51,6 +52,7 @@ public class ComposePresenter( KoinComponent { private val composeUseCase: ComposeUseCase by inject() private val accountRepository: AccountRepository by inject() + private val appDataStore: AppDataStore by inject() @Composable override fun body(): ComposeState { @@ -332,6 +334,11 @@ public class ComposePresenter( var visibility by remember { mutableStateOf(UiTimeline.ItemContent.Status.TopEndContent.Visibility.Type.Public) } + LaunchedEffect(appDataStore.composeConfigData.data) { + appDataStore.composeConfigData.data.collect { + visibility = it.visibility + } + } return object : VisibilityState { override val visibility: UiTimeline.ItemContent.Status.TopEndContent.Visibility.Type get() = visibility diff --git a/shared/src/commonMain/kotlin/dev/dimension/flare/ui/presenter/compose/ComposeUseCase.kt b/shared/src/commonMain/kotlin/dev/dimension/flare/ui/presenter/compose/ComposeUseCase.kt index 105ecf981..baa64252e 100644 --- a/shared/src/commonMain/kotlin/dev/dimension/flare/ui/presenter/compose/ComposeUseCase.kt +++ b/shared/src/commonMain/kotlin/dev/dimension/flare/ui/presenter/compose/ComposeUseCase.kt @@ -4,6 +4,7 @@ import androidx.compose.runtime.Immutable import dev.dimension.flare.common.InAppNotification import dev.dimension.flare.common.Message import dev.dimension.flare.data.datasource.microblog.ComposeData +import dev.dimension.flare.data.datastore.AppDataStore import dev.dimension.flare.data.repository.tryRun import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -13,6 +14,7 @@ import kotlinx.coroutines.withContext internal class ComposeUseCase( private val scope: CoroutineScope, private val inAppNotification: InAppNotification, + private val appDataStore: AppDataStore, ) { operator fun invoke(data: ComposeData) { invoke(data) { @@ -36,6 +38,11 @@ internal class ComposeUseCase( scope.launch { tryRun { progress.invoke(ComposeProgressState.Progress(0, 1)) + appDataStore.composeConfigData.updateData { + it.copy( + visibility = data.visibility, + ) + } data.account.dataSource.compose( data = data, progress = {