Tutorial 13 of 18

How to Delete and Manage Chat Messages

Delete persisted chat messages, update local UI state, and optionally notify peers for immediate synchronization.

11 min read

Remove a persisted chat message with deleteChatHistoryMessage. Use this for user-initiated deletes, moderation, and compliance workflows.

API Contract

FieldRequiredDescription
senderIdYesThe acting user; must match the connected userId
messageIdYesID of the message to delete
await notifier.deleteChatHistoryMessage({
  senderId: "user-alice",
  messageId: "message-id-to-delete",
});

The messageId typically comes from metadata.id on received messages or from chat history results.

UX Pattern

  • The user long-presses or opens the menu for a message and selects delete.
  • Call deleteChatHistoryMessage with the message's ID.
  • Remove the message from local UI state after the delete succeeds.
  • Optionally notify the peer with a separate send() containing { type: "message-deleted", messageId } if your app needs live synchronization.

JavaScript / TypeScript

Delete persisted messages with deleteChatHistoryMessage.

Basic Delete

import WebSocket from "ws";
import { DNotifier } from "@dnotifier-realtime/dnotifier";

const MY_USER_ID = "user-alice";

const notifier = new DNotifier({
  appId: process.env.DNOTIFIER_APP_ID,
  secret: process.env.DNOTIFIER_SECRET,
  transport: "ws",
  userId: MY_USER_ID,
  WebSocketImpl: WebSocket,
  onConnected: () => {},
  onMessage: (msg) => {
    const body = msg.payload.toJSON();
    // Store msg.metadata.id with each rendered message.
  },
  onDisconnected: () => {},
});

await notifier.connect();

async function deleteMessage(messageId) {
  await notifier.deleteChatHistoryMessage({
    senderId: MY_USER_ID,
    messageId,
  });
  removeFromLocalState(messageId);
}

Delete From Message List UI

function onDeleteClick(message) {
  if (!message.id) return;

  deleteMessage(message.id).catch((err) => {
    showToast(`Delete failed: ${err.message}`);
  });
}

Notify Peer (Optional)

async function deleteAndNotifyPeer(messageId, peerId) {
  await notifier.deleteChatHistoryMessage({
    senderId: MY_USER_ID,
    messageId,
  });

  await notifier.send({
    senderId: MY_USER_ID,
    receiverId: peerId,
    data: { type: "message-deleted", messageId },
    saveHistory: false,
  });

  removeFromLocalState(messageId);
}

Handle the notification on the peer:

if (body?.type === "message-deleted") {
  removeFromLocalState(body.messageId);
}

Troubleshooting

IssueCheck
messageId requiredPass the ID from metadata.id or chat history
Not connectedReconnect before deleting
Message still in the UI after deletionUpdate local state and refetch history if needed

Dart / Flutter

Delete persisted messages with deleteChatHistoryMessage.

Basic Delete

import 'package:dnotifier/dnotifier.dart';

const myUserId = 'user-alice';

Future<void> deleteMessage(
  DNotifier notifier,
  String messageId,
) async {
  await notifier.deleteChatHistoryMessage(
    senderId: myUserId,
    messageId: messageId,
  );
  removeFromLocalState(messageId);
}

Delete From Message List UI

ListTile(
  title: Text(message.text),
  trailing: IconButton(
    icon: const Icon(Icons.delete),
    onPressed: () async {
      if (message.id == null) return;
      try {
        await deleteMessage(notifier, message.id!);
      } catch (e) {
        showSnackBar('Delete failed: $e');
      }
    },
  ),
)

Notify Peer (Optional)

Future<void> deleteAndNotifyPeer(
  DNotifier notifier,
  String messageId,
  String peerId,
) async {
  await notifier.deleteChatHistoryMessage(
    senderId: myUserId,
    messageId: messageId,
  );

  await notifier.send(
    senderId: myUserId,
    receiverId: peerId,
    data: {'type': 'message-deleted', 'messageId': messageId},
    saveHistory: false,
  );

  removeFromLocalState(messageId);
}

Handle the notification on the peer:

if (body is Map && body['type'] == 'message-deleted') {
  removeFromLocalState(body['messageId']?.toString());
}

Troubleshooting

IssueCheck
ArgumentError: messageId requiredPass the ID from metadata.id or chat history
StateError: Not connectedReconnect before deleting
Message still in the UIUpdate local state and refetch history if needed

Python

Delete persisted messages with delete_chat_history_message.

Basic Delete

from dnotifier import DNotifier

MY_USER_ID = "user-alice"

async def delete_message(notifier: DNotifier, message_id: str):
    await notifier.delete_chat_history_message(
        sender_id=MY_USER_ID,
        message_id=message_id,
    )
    remove_from_local_state(message_id)

Delete From Message List UI

async def handle_delete(notifier: DNotifier, message):
    if not message.id:
        return
    try:
        await delete_message(notifier, message.id)
    except Exception as error:
        print(f"Delete failed: {error}")

Notify Peer (Optional)

async def delete_and_notify_peer(
    notifier: DNotifier,
    message_id: str,
    peer_id: str,
):
    await notifier.delete_chat_history_message(
        sender_id=MY_USER_ID,
        message_id=message_id,
    )

    await notifier.send(
        sender_id=MY_USER_ID,
        receiver_id=peer_id,
        data={"type": "message-deleted", "messageId": message_id},
        save_history=False,
    )

    remove_from_local_state(message_id)

Handle the notification on the peer:

body = msg.payload.to_json()
if isinstance(body, dict) and body.get("type") == "message-deleted":
    remove_from_local_state(body.get("messageId"))

Troubleshooting

IssueCheck
Missing message_idPass the ID from metadata.id or chat history
RuntimeError: Not connectedReconnect before deleting
Message still in the UIUpdate local state and refetch history if needed