Skip to content

Commit 4f72e03

Browse files
committed
fix reference status not being deleted
1 parent 4caf2f4 commit 4f72e03

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
@@ -120,7 +121,6 @@ import kotlinx.coroutines.CoroutineScope
120121
import kotlinx.coroutines.flow.Flow
121122
import kotlinx.coroutines.flow.combine
122123
import kotlinx.coroutines.flow.distinctUntilChanged
123-
import kotlinx.coroutines.flow.filterIsInstance
124124
import kotlinx.coroutines.flow.flow
125125
import kotlinx.coroutines.flow.map
126126
import kotlinx.coroutines.flow.mapNotNull
@@ -723,14 +723,17 @@ internal class BlueskyDataSource(
723723
),
724724
)
725725
// delete status from cache
726-
database.statusDao().delete(
727-
statusKey = statusKey,
728-
accountType = AccountType.Specific(accountKey),
729-
)
730-
database.pagingTimelineDao().deleteStatus(
731-
accountKey = accountKey,
732-
statusKey = statusKey,
733-
)
726+
database.connect {
727+
database.statusDao().delete(
728+
statusKey = statusKey,
729+
accountType = AccountType.Specific(accountKey),
730+
)
731+
database.statusReferenceDao().delete(statusKey)
732+
database.pagingTimelineDao().deleteStatus(
733+
accountKey = accountKey,
734+
statusKey = statusKey,
735+
)
736+
}
734737
}
735738
}
736739

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
@@ -531,14 +532,17 @@ internal open class MastodonDataSource(
531532
tryRun {
532533
service.delete(statusKey.id)
533534
// delete status from cache
534-
database.statusDao().delete(
535-
statusKey = statusKey,
536-
accountType = AccountType.Specific(accountKey),
537-
)
538-
database.pagingTimelineDao().deleteStatus(
539-
accountKey = accountKey,
540-
statusKey = statusKey,
541-
)
535+
database.connect {
536+
database.statusDao().delete(
537+
statusKey = statusKey,
538+
accountType = AccountType.Specific(accountKey),
539+
)
540+
database.statusReferenceDao().delete(statusKey)
541+
database.pagingTimelineDao().deleteStatus(
542+
accountKey = accountKey,
543+
statusKey = statusKey,
544+
)
545+
}
542546
}
543547
}
544548

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
@@ -444,14 +445,17 @@ internal class MisskeyDataSource(
444445
)
445446

446447
// delete status from cache
447-
database.statusDao().delete(
448-
statusKey = statusKey,
449-
accountType = AccountType.Specific(accountKey),
450-
)
451-
database.pagingTimelineDao().deleteStatus(
452-
accountKey = accountKey,
453-
statusKey = statusKey,
454-
)
448+
database.connect {
449+
database.statusDao().delete(
450+
statusKey = statusKey,
451+
accountType = AccountType.Specific(accountKey),
452+
)
453+
database.statusReferenceDao().delete(statusKey)
454+
database.pagingTimelineDao().deleteStatus(
455+
accountKey = accountKey,
456+
statusKey = statusKey,
457+
)
458+
}
455459
}
456460
}
457461

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
@@ -392,6 +393,17 @@ internal class VVODataSource(
392393
mid = statusKey.id,
393394
st = st,
394395
)
396+
database.connect {
397+
database.statusDao().delete(
398+
statusKey = statusKey,
399+
accountType = AccountType.Specific(accountKey),
400+
)
401+
database.statusReferenceDao().delete(statusKey)
402+
database.pagingTimelineDao().deleteStatus(
403+
accountKey = accountKey,
404+
statusKey = statusKey,
405+
)
406+
}
395407
}
396408

397409
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
@@ -561,14 +562,17 @@ internal class XQTDataSource(
561562
),
562563
)
563564
// delete status from cache
564-
database.statusDao().delete(
565-
statusKey = statusKey,
566-
accountType = AccountType.Specific(accountKey),
567-
)
568-
database.pagingTimelineDao().deleteStatus(
569-
accountKey = accountKey,
570-
statusKey = statusKey,
571-
)
565+
database.connect {
566+
database.statusDao().delete(
567+
statusKey = statusKey,
568+
accountType = AccountType.Specific(accountKey),
569+
)
570+
database.statusReferenceDao().delete(statusKey)
571+
database.pagingTimelineDao().deleteStatus(
572+
accountKey = accountKey,
573+
statusKey = statusKey,
574+
)
575+
}
572576
}
573577
}
574578

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
@@ -558,7 +558,7 @@ internal fun ProfileViewBasic.render(accountKey: MicroBlogKey): UiProfile {
558558
)
559559
return UiProfile(
560560
avatar = avatar?.uri.orEmpty(),
561-
name =
561+
nameInternal =
562562
Element("span")
563563
.apply {
564564
addChildren(TextNode(displayName.orEmpty()))
@@ -597,7 +597,7 @@ internal fun ProfileView.render(accountKey: MicroBlogKey): UiProfile {
597597
)
598598
return UiProfile(
599599
avatar = avatar?.uri.orEmpty(),
600-
name =
600+
nameInternal =
601601
Element("span")
602602
.apply {
603603
addChildren(TextNode(displayName.orEmpty()))
@@ -629,7 +629,7 @@ internal fun ProfileViewDetailed.render(accountKey: MicroBlogKey): UiProfile {
629629
)
630630
return UiProfile(
631631
avatar = avatar?.uri.orEmpty(),
632-
name =
632+
nameInternal =
633633
Element("span")
634634
.apply {
635635
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
@@ -540,7 +540,7 @@ internal fun Account.render(
540540
)
541541
return UiProfile(
542542
avatar = avatar.orEmpty(),
543-
name = parseName(this).toUi(),
543+
nameInternal = parseName(this).toUi(),
544544
handle = "@$username@$remoteHost",
545545
key = userKey,
546546
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 ->
@@ -624,7 +634,7 @@ internal fun UserLite.render(accountKey: MicroBlogKey): UiProfile {
624634
)
625635
return UiProfile(
626636
avatar = avatarUrl.orEmpty(),
627-
name = parseName(name.orEmpty(), accountKey, emojis).toUi(),
637+
nameInternal = parseName(name.orEmpty(), accountKey, emojis).toUi(),
628638
handle = "@$username@$remoteHost",
629639
key = userKey,
630640
banner = null,
@@ -658,7 +668,7 @@ internal fun User.render(accountKey: MicroBlogKey): UiProfile {
658668
)
659669
return UiProfile(
660670
avatar = avatarUrl.orEmpty(),
661-
name = parseName(name.orEmpty(), accountKey, emojis).toUi(),
671+
nameInternal = parseName(name.orEmpty(), accountKey, emojis).toUi(),
662672
handle = "@$username@$remoteHost",
663673
key = userKey,
664674
banner = bannerUrl,

0 commit comments

Comments
 (0)