fix: Fix saved search not restoring Filter.Group properly

This happened when Filter.Group ordering doesn't match the old ordering.
This commit is contained in:
Ahmad Ansori Palembani 2025-05-09 10:44:30 +07:00
parent f74662c0f3
commit f362b0bda0
Signed by: null2264
GPG key ID: BA64F8B60AF3EFB6

View file

@ -16,6 +16,7 @@ import kotlinx.serialization.json.jsonObject
import kotlinx.serialization.json.jsonPrimitive import kotlinx.serialization.json.jsonPrimitive
import kotlinx.serialization.json.put import kotlinx.serialization.json.put
import kotlinx.serialization.json.putJsonArray import kotlinx.serialization.json.putJsonArray
import kotlinx.serialization.json.putJsonObject
interface Serializer<in T : Filter<out Any?>> { interface Serializer<in T : Filter<out Any?>> {
fun JsonObjectBuilder.serialize(filter: T) {} fun JsonObjectBuilder.serialize(filter: T) {}
@ -103,26 +104,45 @@ class GroupSerializer(override val serializer: FilterSerializer) : Serializer<Fi
override val clazz = Filter.Group::class override val clazz = Filter.Group::class
override fun JsonObjectBuilder.serialize(filter: Filter.Group<Any?>) { override fun JsonObjectBuilder.serialize(filter: Filter.Group<Any?>) {
putJsonArray(Serializer.STATE) { putJsonObject(VALUES) {
filter.state.forEach { state -> filter.state.forEach { item ->
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST", "SafeCastWithReturn")
add((state as? Filter<Any?>)?.let { serializer.serialize(it) } ?: JsonNull) item as? Filter<Any?> ?: return@forEach
// Assuming `item.name` is unique, not sure if it is tho...
put(item.name, serializer.serialize(item))
} }
} }
} }
override fun deserialize(json: JsonObject, filter: Filter.Group<Any?>) { override fun deserialize(json: JsonObject, filter: Filter.Group<Any?>) {
json[Serializer.STATE]!!.jsonArray.forEachIndexed { index, element -> val values = json[VALUES]?.jsonObject
if (values == null) {
// TODO: Delete later
json[Serializer.STATE]?.jsonArray?.forEachIndexed { index, element ->
if (element == JsonNull) return@forEachIndexed if (element == JsonNull) return@forEachIndexed
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
serializer.deserialize(filter.state[index] as Filter<Any?>, element.jsonObject) serializer.deserialize(filter.state[index] as Filter<Any?>, element.jsonObject)
} }
return
}
filter.state.forEach { item ->
@Suppress("UNCHECKED_CAST", "SafeCastWithReturn")
item as? Filter<Any?> ?: return@forEach
val itemJson = values[item.name]?.jsonObject ?: return@forEach
serializer.deserialize(item, itemJson)
}
} }
override fun mappings() = listOf( override fun mappings() = listOf(
Serializer.NAME to Filter.Group<Any?>::name, Serializer.NAME to Filter.Group<Any?>::name,
) )
companion object {
const val VALUES = "values"
}
} }
class SortSerializer(override val serializer: FilterSerializer) : Serializer<Filter.Sort> { class SortSerializer(override val serializer: FilterSerializer) : Serializer<Filter.Sort> {