Skip to content

Commit b07a192

Browse files
authored
Merge pull request #1204 from DimensionDev/bugfix/reference_status
fix reference status not being deleted
2 parents cbc4487 + 4f72e03 commit b07a192

File tree

12 files changed

+104
-51
lines changed

12 files changed

+104
-51
lines changed

shared/src/commonMain/kotlin/dev/dimension/flare/data/database/cache/mapper/Microblog.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,10 @@ internal suspend fun saveToDatabase(
9090
).let {
9191
database.statusDao().insertAll(it)
9292
}
93+
items.map { it.status.status.data.statusKey }.let {
94+
// in case of timeline change, remove old references
95+
database.statusReferenceDao().delete(it)
96+
}
9397
items.flatMap { it.status.references }.map { it.reference }.let {
9498
database.statusReferenceDao().delete(it.map { it.statusKey })
9599
database.statusReferenceDao().insertAll(it)

shared/src/commonMain/kotlin/dev/dimension/flare/data/datasource/bluesky/BlueskyDataSource.kt

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ import dev.dimension.flare.common.MemCacheable
6767
import dev.dimension.flare.common.encodeJson
6868
import dev.dimension.flare.data.database.app.AppDatabase
6969
import dev.dimension.flare.data.database.cache.CacheDatabase
70+
import dev.dimension.flare.data.database.cache.connect
7071
import dev.dimension.flare.data.database.cache.mapper.Bluesky
7172
import dev.dimension.flare.data.database.cache.mapper.toDbUser
7273
import dev.dimension.flare.data.database.cache.model.MessageContent
@@ -121,7 +122,6 @@ import kotlinx.coroutines.CoroutineScope
121122
import kotlinx.coroutines.flow.Flow
122123
import kotlinx.coroutines.flow.combine
123124
import kotlinx.coroutines.flow.distinctUntilChanged
124-
import kotlinx.coroutines.flow.filterIsInstance
125125
import kotlinx.coroutines.flow.flow
126126
import kotlinx.coroutines.flow.map
127127
import kotlinx.coroutines.flow.mapNotNull
@@ -862,14 +862,17 @@ internal class BlueskyDataSource(
862862
),
863863
)
864864
// delete status from cache
865-
database.statusDao().delete(
866-
statusKey = statusKey,
867-
accountType = AccountType.Specific(accountKey),
868-
)
869-
database.pagingTimelineDao().deleteStatus(
870-
accountKey = accountKey,
871-
statusKey = statusKey,
872-
)
865+
database.connect {
866+
database.statusDao().delete(
867+
statusKey = statusKey,
868+
accountType = AccountType.Specific(accountKey),
869+
)
870+
database.statusReferenceDao().delete(statusKey)
871+
database.pagingTimelineDao().deleteStatus(
872+
accountKey = accountKey,
873+
statusKey = statusKey,
874+
)
875+
}
873876
}
874877
}
875878

shared/src/commonMain/kotlin/dev/dimension/flare/data/datasource/mastodon/MastodonDataSource.kt

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import dev.dimension.flare.common.CacheData
1212
import dev.dimension.flare.common.Cacheable
1313
import dev.dimension.flare.common.MemCacheable
1414
import dev.dimension.flare.data.database.cache.CacheDatabase
15+
import dev.dimension.flare.data.database.cache.connect
1516
import dev.dimension.flare.data.database.cache.mapper.Mastodon
1617
import dev.dimension.flare.data.database.cache.mapper.toDb
1718
import dev.dimension.flare.data.database.cache.mapper.toDbUser
@@ -533,14 +534,17 @@ internal open class MastodonDataSource(
533534
tryRun {
534535
service.delete(statusKey.id)
535536
// delete status from cache
536-
database.statusDao().delete(
537-
statusKey = statusKey,
538-
accountType = AccountType.Specific(accountKey),
539-
)
540-
database.pagingTimelineDao().deleteStatus(
541-
accountKey = accountKey,
542-
statusKey = statusKey,
543-
)
537+
database.connect {
538+
database.statusDao().delete(
539+
statusKey = statusKey,
540+
accountType = AccountType.Specific(accountKey),
541+
)
542+
database.statusReferenceDao().delete(statusKey)
543+
database.pagingTimelineDao().deleteStatus(
544+
accountKey = accountKey,
545+
statusKey = statusKey,
546+
)
547+
}
544548
}
545549
}
546550

shared/src/commonMain/kotlin/dev/dimension/flare/data/datasource/misskey/MisskeyDataSource.kt

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import dev.dimension.flare.common.CacheData
1212
import dev.dimension.flare.common.Cacheable
1313
import dev.dimension.flare.common.MemCacheable
1414
import dev.dimension.flare.data.database.cache.CacheDatabase
15+
import dev.dimension.flare.data.database.cache.connect
1516
import dev.dimension.flare.data.database.cache.mapper.Misskey
1617
import dev.dimension.flare.data.database.cache.mapper.toDb
1718
import dev.dimension.flare.data.database.cache.mapper.toDbUser
@@ -446,14 +447,17 @@ internal class MisskeyDataSource(
446447
)
447448

448449
// delete status from cache
449-
database.statusDao().delete(
450-
statusKey = statusKey,
451-
accountType = AccountType.Specific(accountKey),
452-
)
453-
database.pagingTimelineDao().deleteStatus(
454-
accountKey = accountKey,
455-
statusKey = statusKey,
456-
)
450+
database.connect {
451+
database.statusDao().delete(
452+
statusKey = statusKey,
453+
accountType = AccountType.Specific(accountKey),
454+
)
455+
database.statusReferenceDao().delete(statusKey)
456+
database.pagingTimelineDao().deleteStatus(
457+
accountKey = accountKey,
458+
statusKey = statusKey,
459+
)
460+
}
457461
}
458462
}
459463

shared/src/commonMain/kotlin/dev/dimension/flare/data/datasource/vvo/VVODataSource.kt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import dev.dimension.flare.common.InAppNotification
1313
import dev.dimension.flare.common.MemCacheable
1414
import dev.dimension.flare.common.decodeJson
1515
import dev.dimension.flare.data.database.cache.CacheDatabase
16+
import dev.dimension.flare.data.database.cache.connect
1617
import dev.dimension.flare.data.database.cache.mapper.VVO
1718
import dev.dimension.flare.data.database.cache.mapper.toDbUser
1819
import dev.dimension.flare.data.database.cache.model.StatusContent
@@ -394,6 +395,17 @@ internal class VVODataSource(
394395
mid = statusKey.id,
395396
st = st,
396397
)
398+
database.connect {
399+
database.statusDao().delete(
400+
statusKey = statusKey,
401+
accountType = AccountType.Specific(accountKey),
402+
)
403+
database.statusReferenceDao().delete(statusKey)
404+
database.pagingTimelineDao().deleteStatus(
405+
accountKey = accountKey,
406+
statusKey = statusKey,
407+
)
408+
}
397409
}
398410

399411
override fun searchStatus(query: String) =

shared/src/commonMain/kotlin/dev/dimension/flare/data/datasource/xqt/XQTDataSource.kt

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import dev.dimension.flare.common.MemCacheable
1616
import dev.dimension.flare.common.decodeJson
1717
import dev.dimension.flare.common.encodeJson
1818
import dev.dimension.flare.data.database.cache.CacheDatabase
19+
import dev.dimension.flare.data.database.cache.connect
1920
import dev.dimension.flare.data.database.cache.mapper.XQT
2021
import dev.dimension.flare.data.database.cache.mapper.cursor
2122
import dev.dimension.flare.data.database.cache.mapper.toDbUser
@@ -563,14 +564,17 @@ internal class XQTDataSource(
563564
),
564565
)
565566
// delete status from cache
566-
database.statusDao().delete(
567-
statusKey = statusKey,
568-
accountType = AccountType.Specific(accountKey),
569-
)
570-
database.pagingTimelineDao().deleteStatus(
571-
accountKey = accountKey,
572-
statusKey = statusKey,
573-
)
567+
database.connect {
568+
database.statusDao().delete(
569+
statusKey = statusKey,
570+
accountType = AccountType.Specific(accountKey),
571+
)
572+
database.statusReferenceDao().delete(statusKey)
573+
database.pagingTimelineDao().deleteStatus(
574+
accountKey = accountKey,
575+
statusKey = statusKey,
576+
)
577+
}
574578
}
575579
}
576580

shared/src/commonMain/kotlin/dev/dimension/flare/ui/model/UiProfile.kt

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,27 @@ public data class UiProfile internal constructor(
1616
override val key: MicroBlogKey,
1717
override val handle: String,
1818
override val avatar: String,
19-
override val name: UiRichText,
19+
private val nameInternal: UiRichText,
2020
override val platformType: PlatformType,
2121
override val onClicked: ClickContext.() -> Unit,
22-
val banner: String?,
23-
val description: UiRichText?,
24-
val matrices: Matrices,
25-
val mark: ImmutableList<Mark>,
26-
val bottomContent: BottomContent?,
22+
public val banner: String?,
23+
public val description: UiRichText?,
24+
public val matrices: Matrices,
25+
public val mark: ImmutableList<Mark>,
26+
public val bottomContent: BottomContent?,
2727
) : UiUserV2 {
28+
// If name is blank, use handle without @ as display name
29+
override val name: UiRichText by lazy {
30+
if (nameInternal.raw.isEmpty() || nameInternal.raw.isBlank()) {
31+
Element("span")
32+
.apply {
33+
appendText(handleWithoutAtAndHost)
34+
}.toUi()
35+
} else {
36+
nameInternal
37+
}
38+
}
39+
2840
@Immutable
2941
public data class Matrices internal constructor(
3042
val fansCount: Long,
@@ -86,7 +98,7 @@ public fun createSampleUser(): UiProfile =
8698
key = MicroBlogKey("sampleKey", "sampleHost"),
8799
handle = "@sampleUser",
88100
avatar = "https://example.com/avatar.jpg",
89-
name = Element("span").toUi(),
101+
nameInternal = Element("span").toUi(),
90102
platformType = PlatformType.Mastodon,
91103
onClicked = { /* Handle click */ },
92104
banner = "https://example.com/banner.jpg",

shared/src/commonMain/kotlin/dev/dimension/flare/ui/model/mapper/Bluesky.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -574,7 +574,7 @@ internal fun ProfileViewBasic.render(accountKey: MicroBlogKey): UiProfile {
574574
)
575575
return UiProfile(
576576
avatar = avatar?.uri.orEmpty(),
577-
name =
577+
nameInternal =
578578
Element("span")
579579
.apply {
580580
addChildren(TextNode(displayName.orEmpty()))
@@ -613,7 +613,7 @@ internal fun ProfileView.render(accountKey: MicroBlogKey): UiProfile {
613613
)
614614
return UiProfile(
615615
avatar = avatar?.uri.orEmpty(),
616-
name =
616+
nameInternal =
617617
Element("span")
618618
.apply {
619619
addChildren(TextNode(displayName.orEmpty()))
@@ -645,7 +645,7 @@ internal fun ProfileViewDetailed.render(accountKey: MicroBlogKey): UiProfile {
645645
)
646646
return UiProfile(
647647
avatar = avatar?.uri.orEmpty(),
648-
name =
648+
nameInternal =
649649
Element("span")
650650
.apply {
651651
addChildren(TextNode(displayName.orEmpty()))

shared/src/commonMain/kotlin/dev/dimension/flare/ui/model/mapper/Mastodon.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -549,7 +549,7 @@ internal fun Account.render(
549549
)
550550
return UiProfile(
551551
avatar = avatar.orEmpty(),
552-
name = parseName(this).toUi(),
552+
nameInternal = parseName(this).toUi(),
553553
handle = "@$username@$remoteHost",
554554
key = userKey,
555555
banner = header,

shared/src/commonMain/kotlin/dev/dimension/flare/ui/model/mapper/Misskey.kt

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -298,7 +298,7 @@ internal fun Note.render(
298298
onClicked = {},
299299
statusKey = currentStatus.statusKey,
300300
)
301-
} else if (renote == null || !text.isNullOrEmpty()) {
301+
} else if ((renote == null && renoteId == null) || !text.isNullOrEmpty()) {
302302
null
303303
} else {
304304
UiTimeline.TopMessage(
@@ -320,20 +320,23 @@ internal fun Note.render(
320320
}
321321
return UiTimeline(
322322
topMessage = topMessage,
323-
content = actualStatus.renderStatus(accountKey, event),
323+
// TODO: show deleted placeholder when renote is deleted
324+
content = actualStatus.renderStatus(accountKey, event, references),
324325
)
325326
}
326327

327328
private fun Note.renderStatus(
328329
accountKey: MicroBlogKey,
329330
event: StatusEvent.Misskey,
331+
references: Map<ReferenceType, List<StatusContent>> = mapOf(),
330332
): UiTimeline.ItemContent.Status {
331333
val remoteHost =
332334
if (user.host.isNullOrEmpty()) {
333335
accountKey.host
334336
} else {
335337
user.host
336338
}
339+
val parent = references[ReferenceType.Reply]?.firstOrNull() as? StatusContent.Misskey
337340
val user = user.render(accountKey)
338341
val isFromMe = user.key == accountKey
339342
val canReblog = visibility in listOf(Visibility.Public, Visibility.Home) || (isFromMe && visibility != Visibility.Specified)
@@ -369,6 +372,13 @@ private fun Note.renderStatus(
369372
}.sortedByDescending { it.count }
370373
.toPersistentList()
371374
return UiTimeline.ItemContent.Status(
375+
parents =
376+
listOfNotNull(
377+
parent?.data?.renderStatus(
378+
accountKey,
379+
event,
380+
),
381+
).toPersistentList(),
372382
images =
373383
files
374384
?.mapNotNull { file ->
@@ -635,7 +645,7 @@ internal fun UserLite.render(accountKey: MicroBlogKey): UiProfile {
635645
)
636646
return UiProfile(
637647
avatar = avatarUrl.orEmpty(),
638-
name = parseName(name.orEmpty(), accountKey, emojis).toUi(),
648+
nameInternal = parseName(name.orEmpty(), accountKey, emojis).toUi(),
639649
handle = "@$username@$remoteHost",
640650
key = userKey,
641651
banner = null,
@@ -669,7 +679,7 @@ internal fun User.render(accountKey: MicroBlogKey): UiProfile {
669679
)
670680
return UiProfile(
671681
avatar = avatarUrl.orEmpty(),
672-
name = parseName(name.orEmpty(), accountKey, emojis).toUi(),
682+
nameInternal = parseName(name.orEmpty(), accountKey, emojis).toUi(),
673683
handle = "@$username@$remoteHost",
674684
key = userKey,
675685
banner = bannerUrl,

0 commit comments

Comments
 (0)