1
0
mirror of https://github.com/flarum/core.git synced 2025-08-23 08:33:45 +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() {
return Model.attribute<number>('unreadCount').call(this);
}
lastMessageId() {
return Model.attribute<number>('lastMessageId').call(this);
}
lastReadMessageId() {
return Model.attribute<number>('lastReadMessageId').call(this);
}

View File

@@ -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();

View File

@@ -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) {

View File

@@ -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();
}
}
});