PlaguPoster/posts/panel/src/commonMain/kotlin/PanelButtonsAPI.kt

41 lines
1.5 KiB
Kotlin
Raw Normal View History

2022-09-14 19:39:51 +00:00
package dev.inmo.plaguposter.posts.panel
2022-09-14 20:15:35 +00:00
import dev.inmo.plaguposter.posts.models.PostId
2022-09-14 19:39:51 +00:00
import dev.inmo.tgbotapi.types.buttons.InlineKeyboardButtons.CallbackDataInlineKeyboardButton
2022-09-14 20:15:35 +00:00
import kotlinx.coroutines.flow.MutableSharedFlow
2022-09-14 19:39:51 +00:00
class PanelButtonsAPI(
2022-11-18 06:43:53 +00:00
private val preset: Map<Int, List<PanelButtonBuilder>>,
2022-09-14 19:39:51 +00:00
private val rootPanelButtonText: String
) {
2022-11-18 06:43:53 +00:00
private val _buttonsMap = mutableMapOf<Int, MutableList<PanelButtonBuilder>>().also {
it.putAll(preset.map { it.key to it.value.toMutableList() })
2022-09-14 19:39:51 +00:00
}
internal val buttonsBuilders: List<PanelButtonBuilder>
2022-11-18 06:43:53 +00:00
get() = _buttonsMap.toList().sortedBy { it.first }.flatMap { it.second }
2022-09-14 20:15:35 +00:00
internal val forceRefreshFlow = MutableSharedFlow<PostId>()
2022-09-14 19:39:51 +00:00
val RootPanelButtonBuilder = PanelButtonBuilder {
CallbackDataInlineKeyboardButton(
rootPanelButtonText,
"$openGlobalMenuDataPrefix${it.id.string}"
)
}
2022-11-18 06:43:53 +00:00
fun add(button: PanelButtonBuilder, weight: Int = button.weight) = _buttonsMap.getOrPut(weight) { mutableListOf() }.add(button)
fun remove(button: PanelButtonBuilder) = _buttonsMap.mapNotNull { (k, v) ->
v.remove(button)
k.takeIf { v.isEmpty() }
}.forEach {
_buttonsMap.remove(it)
}
2022-09-14 20:15:35 +00:00
suspend fun forceRefresh(postId: PostId) {
forceRefreshFlow.emit(postId)
}
2022-09-14 19:39:51 +00:00
companion object {
internal const val openGlobalMenuData = "force_refresh_panel"
internal const val openGlobalMenuDataPrefix = "$openGlobalMenuData "
}
}