1
0
mirror of https://github.com/flarum/core.git synced 2025-08-24 00:53:27 +02:00

fix: handle message deletion effects

This commit is contained in:
Sami Mazouz
2025-08-22 14:32:03 +01:00
parent 1f09ff1942
commit 8fd6dbc3fd
4 changed files with 54 additions and 13 deletions

View File

@@ -30,6 +30,9 @@ export default class Dialog extends Model {
unreadCount() { unreadCount() {
return Model.attribute<number>('unreadCount').call(this); return Model.attribute<number>('unreadCount').call(this);
} }
lastMessageId() {
return Model.attribute<number>('lastMessageId').call(this);
}
lastReadMessageId() { lastReadMessageId() {
return Model.attribute<number>('lastReadMessageId').call(this); return Model.attribute<number>('lastReadMessageId').call(this);
} }

View File

@@ -60,19 +60,53 @@ const MessageControls = {
return message.delete().then(() => { return message.delete().then(() => {
context.attrs.state.remove(message); context.attrs.state.remove(message);
const noMessagesLeft = const dialog = message.dialog();
context.attrs.state.getAllItems().filter((m) => {
const mDialog = m.dialog();
const messageDialog = 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(); if (!mDialog) return false;
}).length === 0;
if (noMessagesLeft && message.dialog()) { return mDialog?.id() === dialog!.id();
app.dialogs.remove(message.dialog()!); }).length === 0;
m.route.set(app.route('messages'));
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(); m.redraw();

View File

@@ -68,9 +68,6 @@ class DialogResource extends Resource\AbstractDatabaseResource
$connection = UserDialogState::query()->getConnection(); $connection = UserDialogState::query()->getConnection();
$grammar = UserDialogState::query()->getGrammar(); $grammar = UserDialogState::query()->getGrammar();
$table = $grammar->wrapTable('dialogs');
$column = $grammar->wrap('last_message_id');
UserDialogState::query() UserDialogState::query()
->where('dialog_user.user_id', $context->getActor()->id) ->where('dialog_user.user_id', $context->getActor()->id)
->update([ ->update([
@@ -121,6 +118,7 @@ class DialogResource extends Resource\AbstractDatabaseResource
->get(function (Dialog $dialog) { ->get(function (Dialog $dialog) {
return $dialog->state->last_read_at; return $dialog->state->last_read_at;
}), }),
Schema\Integer::make('lastMessageId'),
Schema\Integer::make('lastReadMessageId') Schema\Integer::make('lastReadMessageId')
->visible(fn (Dialog $dialog) => $dialog->state !== null) ->visible(fn (Dialog $dialog) => $dialog->state !== null)
->get(function (Dialog $dialog) { ->get(function (Dialog $dialog) {

View File

@@ -79,6 +79,12 @@ class DialogMessage extends AbstractModel implements Formattable
$message->dialog->setFirstMessage( $message->dialog->setFirstMessage(
$message->dialog->messages()->oldest('id')->first() $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();
} }
} }
}); });