From f71aa55bbe7e4683a032bb0cb728e0597584dfcd Mon Sep 17 00:00:00 2001 From: Levi Bard Date: Fri, 10 Mar 2023 20:24:41 +0100 Subject: [PATCH] Remove stale pre-edit statuses from the thread view. (#3377) Fixes #3366 --- .../com/keylesspalace/tusky/appstore/Events.kt | 1 + .../components/timeline/TimelineFragment.kt | 4 ++++ .../components/viewthread/ViewThreadViewModel.kt | 16 ++++++++++++++++ .../tusky/service/SendStatusService.kt | 12 ++++++++---- 4 files changed, 29 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/keylesspalace/tusky/appstore/Events.kt b/app/src/main/java/com/keylesspalace/tusky/appstore/Events.kt index aef4525c..fcaecee8 100644 --- a/app/src/main/java/com/keylesspalace/tusky/appstore/Events.kt +++ b/app/src/main/java/com/keylesspalace/tusky/appstore/Events.kt @@ -15,6 +15,7 @@ data class MuteEvent(val accountId: String) : Dispatchable data class StatusDeletedEvent(val statusId: String) : Dispatchable data class StatusComposedEvent(val status: Status) : Dispatchable data class StatusScheduledEvent(val status: Status) : Dispatchable +data class StatusEditedEvent(val originalId: String, val status: Status) : Dispatchable data class ProfileEditedEvent(val newProfileData: Account) : Dispatchable data class PreferenceChangedEvent(val preferenceKey: String) : Dispatchable data class MainTabsChangedEvent(val newTabs: List) : Dispatchable diff --git a/app/src/main/java/com/keylesspalace/tusky/components/timeline/TimelineFragment.kt b/app/src/main/java/com/keylesspalace/tusky/components/timeline/TimelineFragment.kt index 317d8df1..ace770d3 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/timeline/TimelineFragment.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/timeline/TimelineFragment.kt @@ -45,6 +45,7 @@ import com.keylesspalace.tusky.adapter.StatusBaseViewHolder import com.keylesspalace.tusky.appstore.EventHub import com.keylesspalace.tusky.appstore.PreferenceChangedEvent import com.keylesspalace.tusky.appstore.StatusComposedEvent +import com.keylesspalace.tusky.appstore.StatusEditedEvent import com.keylesspalace.tusky.components.accountlist.AccountListActivity import com.keylesspalace.tusky.components.accountlist.AccountListActivity.Companion.newIntent import com.keylesspalace.tusky.components.preference.PreferencesFragment.ReadingOrder @@ -303,6 +304,9 @@ class TimelineFragment : val status = event.status handleStatusComposeEvent(status) } + is StatusEditedEvent -> { + handleStatusComposeEvent(event.status) + } } } } diff --git a/app/src/main/java/com/keylesspalace/tusky/components/viewthread/ViewThreadViewModel.kt b/app/src/main/java/com/keylesspalace/tusky/components/viewthread/ViewThreadViewModel.kt index 181b2642..5f497246 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/viewthread/ViewThreadViewModel.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/viewthread/ViewThreadViewModel.kt @@ -29,6 +29,7 @@ import com.keylesspalace.tusky.appstore.PinEvent import com.keylesspalace.tusky.appstore.ReblogEvent import com.keylesspalace.tusky.appstore.StatusComposedEvent import com.keylesspalace.tusky.appstore.StatusDeletedEvent +import com.keylesspalace.tusky.appstore.StatusEditedEvent import com.keylesspalace.tusky.components.timeline.toViewData import com.keylesspalace.tusky.components.timeline.util.ifExpected import com.keylesspalace.tusky.db.AccountManager @@ -92,6 +93,7 @@ class ViewThreadViewModel @Inject constructor( is BlockEvent -> removeAllByAccountId(event.accountId) is StatusComposedEvent -> handleStatusComposedEvent(event) is StatusDeletedEvent -> handleStatusDeletedEvent(event) + is StatusEditedEvent -> handleStatusEditedEvent(event) } } } @@ -327,6 +329,20 @@ class ViewThreadViewModel @Inject constructor( } } + private fun handleStatusEditedEvent(event: StatusEditedEvent) { + updateSuccess { uiState -> + uiState.copy( + statusViewData = uiState.statusViewData.map { status -> + if (status.actionableId == event.originalId) { + event.status.toViewData() + } else { + status + } + } + ) + } + } + private fun handleStatusDeletedEvent(event: StatusDeletedEvent) { updateSuccess { uiState -> uiState.copy( diff --git a/app/src/main/java/com/keylesspalace/tusky/service/SendStatusService.kt b/app/src/main/java/com/keylesspalace/tusky/service/SendStatusService.kt index 39dcefa0..fd7d32d0 100644 --- a/app/src/main/java/com/keylesspalace/tusky/service/SendStatusService.kt +++ b/app/src/main/java/com/keylesspalace/tusky/service/SendStatusService.kt @@ -21,6 +21,7 @@ import com.keylesspalace.tusky.MainActivity import com.keylesspalace.tusky.R import com.keylesspalace.tusky.appstore.EventHub import com.keylesspalace.tusky.appstore.StatusComposedEvent +import com.keylesspalace.tusky.appstore.StatusEditedEvent import com.keylesspalace.tusky.appstore.StatusScheduledEvent import com.keylesspalace.tusky.components.compose.MediaUploader import com.keylesspalace.tusky.components.compose.UploadEvent @@ -202,16 +203,17 @@ class SendStatusService : Service(), Injectable { }, ) - val sendResult = if (statusToSend.statusId == null) { - mastodonApi.createStatus( + val editing = (statusToSend.statusId != null) + val sendResult = if (editing) { + mastodonApi.editStatus( + statusToSend.statusId!!, "Bearer " + account.accessToken, account.domain, statusToSend.idempotencyKey, newStatus ) } else { - mastodonApi.editStatus( - statusToSend.statusId, + mastodonApi.createStatus( "Bearer " + account.accessToken, account.domain, statusToSend.idempotencyKey, @@ -232,6 +234,8 @@ class SendStatusService : Service(), Injectable { if (scheduled) { eventHub.dispatch(StatusScheduledEvent(sentStatus)) + } else if (editing) { + eventHub.dispatch(StatusEditedEvent(statusToSend.statusId!!, sentStatus)) } else { eventHub.dispatch(StatusComposedEvent(sentStatus)) }