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
| Field | Required | Description |
|---|---|---|
| senderId | Yes | The acting user; must match the connected userId |
| messageId | Yes | ID 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
| Issue | Check |
|---|---|
| messageId required | Pass the ID from metadata.id or chat history |
| Not connected | Reconnect before deleting |
| Message still in the UI after deletion | Update 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
| Issue | Check |
|---|---|
| ArgumentError: messageId required | Pass the ID from metadata.id or chat history |
| StateError: Not connected | Reconnect before deleting |
| Message still in the UI | Update 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
| Issue | Check |
|---|---|
| Missing message_id | Pass the ID from metadata.id or chat history |
| RuntimeError: Not connected | Reconnect before deleting |
| Message still in the UI | Update local state and refetch history if needed |