diff --git a/src/state/messages/convo.ts b/src/state/messages/convo.ts index 4bc9913f..c3d5ffc2 100644 --- a/src/state/messages/convo.ts +++ b/src/state/messages/convo.ts @@ -106,6 +106,7 @@ export class Convo { string, {id: string; message: ChatBskyConvoSendMessage.InputSchema['message']} > = new Map() + private deletedMessages: Set = new Set() private footerItems: Map = new Map() private pendingEventIngestion: Promise | undefined @@ -278,6 +279,8 @@ export class Convo { * this.pastMessages.set(log.message.id, log.message) */ this.pastMessages.delete(log.message.id) + this.newMessages.delete(log.message.id) + this.deletedMessages.delete(log.message.id) } } } @@ -411,6 +414,30 @@ export class Convo { } } + async deleteMessage(messageId: string) { + this.deletedMessages.add(messageId) + this.commit() + + try { + await this.agent.api.chat.bsky.convo.deleteMessageForSelf( + { + convoId: this.convoId, + messageId, + }, + { + encoding: 'application/json', + headers: { + Authorization: this.__tempFromUserDid, + }, + }, + ) + } catch (e) { + this.deletedMessages.delete(messageId) + this.commit() + throw e + } + } + /* * Items in reverse order, since FlatList inverts */ @@ -474,36 +501,43 @@ export class Convo { } }) - return items.map((item, i) => { - let nextMessage = null - const isMessage = isConvoItemMessage(item) - - if (isMessage) { - if ( - isMessage && - (ChatBskyConvoDefs.isMessageView(item.message) || - ChatBskyConvoDefs.isDeletedMessageView(item.message)) - ) { - const next = items[i - 1] + return items + .filter(item => { + if (isConvoItemMessage(item)) { + return !this.deletedMessages.has(item.message.id) + } + return true + }) + .map((item, i) => { + let nextMessage = null + const isMessage = isConvoItemMessage(item) + if (isMessage) { if ( - isConvoItemMessage(next) && - next && - (ChatBskyConvoDefs.isMessageView(next.message) || - ChatBskyConvoDefs.isDeletedMessageView(next.message)) + isMessage && + (ChatBskyConvoDefs.isMessageView(item.message) || + ChatBskyConvoDefs.isDeletedMessageView(item.message)) ) { - nextMessage = next.message + const next = items[i - 1] + + if ( + isConvoItemMessage(next) && + next && + (ChatBskyConvoDefs.isMessageView(next.message) || + ChatBskyConvoDefs.isDeletedMessageView(next.message)) + ) { + nextMessage = next.message + } + } + + return { + ...item, + nextMessage, } } - return { - ...item, - nextMessage, - } - } - - return item - }) + return item + }) } destroy() {