diff --git a/extensions/messages/js/src/common/models/Dialog.ts b/extensions/messages/js/src/common/models/Dialog.ts index 1d54ebb82..25dca9a81 100644 --- a/extensions/messages/js/src/common/models/Dialog.ts +++ b/extensions/messages/js/src/common/models/Dialog.ts @@ -30,6 +30,9 @@ export default class Dialog extends Model { unreadCount() { return Model.attribute('unreadCount').call(this); } + lastMessageId() { + return Model.attribute('lastMessageId').call(this); + } lastReadMessageId() { return Model.attribute('lastReadMessageId').call(this); } diff --git a/extensions/messages/js/src/forum/utils/MessageControls.tsx b/extensions/messages/js/src/forum/utils/MessageControls.tsx index c008417a2..2294f4a24 100644 --- a/extensions/messages/js/src/forum/utils/MessageControls.tsx +++ b/extensions/messages/js/src/forum/utils/MessageControls.tsx @@ -60,19 +60,53 @@ const MessageControls = { return message.delete().then(() => { context.attrs.state.remove(message); - const noMessagesLeft = - context.attrs.state.getAllItems().filter((m) => { - const mDialog = m.dialog(); - const messageDialog = message.dialog(); + const dialog = message.dialog(); - if (!mDialog || !messageDialog) return false; + if (dialog) { + const noMessagesLeft = + context.attrs.state.getAllItems().filter((m) => { + const mDialog = m.dialog(); - return mDialog?.id() === messageDialog!.id(); - }).length === 0; + if (!mDialog) return false; - if (noMessagesLeft && message.dialog()) { - app.dialogs.remove(message.dialog()!); - m.route.set(app.route('messages')); + return mDialog?.id() === dialog!.id(); + }).length === 0; + + if (noMessagesLeft) { + app.dialogs.remove(dialog!); + m.route.set(app.route('messages')); + } + + if (parseInt(message.id()!) === dialog.lastMessageId()) { + const lastMessage = context.attrs.state + .getAllItems() + .filter((m) => { + const mDialog = m.dialog(); + + if (!mDialog) return false; + + return mDialog.id() === dialog?.id(); + }) + .sort((a, b) => parseInt(a.id()!) - parseInt(b.id()!)) + .pop(); + + if (lastMessage) { + dialog!.pushData({ + relationships: { + ...dialog!.data.relationships, + lastMessage: { + data: { + type: 'dialog-messages', + id: lastMessage.id()!, + }, + }, + }, + }); + dialog.pushAttributes({ + lastMessageId: parseInt(lastMessage.id()!), + }); + } + } } m.redraw(); diff --git a/extensions/messages/src/Api/Resource/DialogResource.php b/extensions/messages/src/Api/Resource/DialogResource.php index f6f5a6ed9..6340dfb7f 100644 --- a/extensions/messages/src/Api/Resource/DialogResource.php +++ b/extensions/messages/src/Api/Resource/DialogResource.php @@ -68,9 +68,6 @@ class DialogResource extends Resource\AbstractDatabaseResource $connection = UserDialogState::query()->getConnection(); $grammar = UserDialogState::query()->getGrammar(); - $table = $grammar->wrapTable('dialogs'); - $column = $grammar->wrap('last_message_id'); - UserDialogState::query() ->where('dialog_user.user_id', $context->getActor()->id) ->update([ @@ -121,6 +118,7 @@ class DialogResource extends Resource\AbstractDatabaseResource ->get(function (Dialog $dialog) { return $dialog->state->last_read_at; }), + Schema\Integer::make('lastMessageId'), Schema\Integer::make('lastReadMessageId') ->visible(fn (Dialog $dialog) => $dialog->state !== null) ->get(function (Dialog $dialog) { diff --git a/extensions/messages/src/DialogMessage.php b/extensions/messages/src/DialogMessage.php index 653af2e88..3b25fe6be 100644 --- a/extensions/messages/src/DialogMessage.php +++ b/extensions/messages/src/DialogMessage.php @@ -79,6 +79,12 @@ class DialogMessage extends AbstractModel implements Formattable $message->dialog->setFirstMessage( $message->dialog->messages()->oldest('id')->first() ); + $message->dialog->save(); + } elseif ($message->dialog->last_message_id === $message->id) { + $message->dialog->setLastMessage( + $message->dialog->messages()->latest('id')->first() + ); + $message->dialog->save(); } } });