-
Notifications
You must be signed in to change notification settings - Fork 0
Message Actions Quick Reference
github-actions[bot] edited this page Sep 2, 2026
·
46 revisions
Quick reference for implementing message actions in nself-chat.
import { useMessageActions } from '@/hooks'
import { MessageActions, MessageContextMenu } from '@/components/chat'
function ChatMessage({ message }) {
const { handleAction, getPermissions } = useMessageActions({
channelId: message.channelId,
})
const permissions = getPermissions(message)
return (
<MessageContextMenu
message={message}
permissions={permissions}
onAction={(action, data) => handleAction(action, message, data)}
>
<div className="group relative">
<MessageItem message={message} />
<MessageActions
message={message}
permissions={permissions}
onAction={(action, data) => handleAction(action, message, data)}
/>
</div>
</MessageContextMenu>
)
}useMessageActions({
channelId: string // Required
onReplyMessage?: (msg) => void
onOpenThread?: (msg) => void
onEditMessage?: (msg) => void
onDeleteMessage?: (id) => Promise<void>
onForwardMessage?: (msg) => void
onReportMessage?: (msg) => void
onViewMessageDetails?: (msg) => void
enableBulkOperations?: boolean
})| Action | Description | Permission Required |
|---|---|---|
react |
Add emoji reaction | canReact |
reply |
Reply to message | canReply |
thread |
Start/view thread | canThread |
edit |
Edit message | canEdit |
delete |
Delete message | canDelete |
pin |
Pin to channel | canPin |
unpin |
Unpin from channel | canPin |
bookmark |
Save message | canBookmark |
unbookmark |
Unsave message | canBookmark |
forward |
Forward message | canForward |
copy |
Copy text | canCopy |
copy-link |
Copy message link | canCopy |
report |
Report message | canReport |
mark-unread |
Mark as unread | canMarkUnread |
| Permission | Guest | Member | Moderator | Owner |
|---|---|---|---|---|
| React | β | β | β | β |
| Reply | β | β | β | β |
| Thread | β | β | β | β |
| Edit | β | Own | Own | Own |
| Delete | β | Own | β | β |
| Pin | β | β | β | β |
| Bookmark | β | β | β | β |
| Forward | β | β | β | β |
| Report | β | β | β | β |
| Copy | β | β | β | β |
// Default - Hover action bar
<MessageActions variant="default" position="right" />
// Compact - Inline actions
<MessageActions variant="compact" />
// Mobile - Floating sheet
<MessageActions variant="mobile" onClose={() => {}} />// Full - Complete menu
<MessageContextMenu showAdvanced={true} />
// Simple - Minimal menu
<SimpleMessageContextMenu />const { handleAction } = useMessageActions({
channelId,
onReplyMessage: (msg) => {
setReplyTo(msg)
focusInput()
},
onDeleteMessage: async (id) => {
await deleteMessageMutation({ variables: { id } })
},
})const { selection, bulkHandlers } = useMessageActions({
channelId,
enableBulkOperations: true,
})
// Enter selection mode
selection.enterSelectionMode()
// Select messages
selection.toggleSelection(messageId)
selection.selectAll(messageIds)
// Bulk delete
await bulkHandlers.onBulkDelete(Array.from(selection.selectedMessages))
// Exit selection mode
selection.exitSelectionMode()const [deleteMessage] = useMutation(DELETE_MESSAGE)
const { handleAction } = useMessageActions({
channelId,
onDeleteMessage: async (id) => {
await deleteMessage({
variables: { id },
update(cache) {
cache.evict({ id: cache.identify({ __typename: 'Message', id }) })
},
})
},
})| Key | Action |
|---|---|
| βC | Copy text |
| ββ§C | Copy link |
| R | Reply |
| T | Thread |
| E | Edit |
| P | Pin/Unpin |
| S | Save |
| βF | Forward |
| U | Mark unread |
| ββ« | Delete |
function MobileMessage({ message }) {
const [showActions, setShowActions] = useState(false)
return (
<>
<div onTouchStart={() => setShowActions(true)}>
<MessageItem message={message} />
</div>
{showActions && (
<MessageActions
variant="mobile"
message={message}
permissions={getPermissions(message)}
onAction={handleAction}
onClose={() => setShowActions(false)}
/>
)}
</>
)
}{selection.isSelectionMode && (
<BulkMessageActions
selectedCount={selection.selectedMessages.size}
onDelete={() => bulkHandlers.onBulkDelete([...])}
onForward={() => bulkHandlers.onBulkForward([...])}
onCopy={() => bulkHandlers.onBulkCopy([...])}
onClearSelection={selection.clearSelection}
/>
)}// Get all permissions
const permissions = getPermissions(message)
// Check specific permission
if (permissions.canEdit) {
// Show edit UI
}
// Check action availability
if (canPerformAction('delete', message)) {
// Allow delete
}const { isLoading } = useMessageActions({ channelId })
{
isLoading && <LoadingSpinner />
}<MessageActions
className="custom-class"
message={message}
permissions={permissions}
onAction={handleAction}
/>// Hook
import { useMessageActions } from '@/hooks'
// Components
import {
MessageActions,
CompactMessageActions,
MobileMessageActions,
BulkMessageActions,
MessageContextMenu,
SimpleMessageContextMenu,
} from '@/components/chat'
// Types
import type { Message, MessageAction, MessageActionPermissions } from '@/types/message'- Don't forget to check permissions before showing actions
- Always provide onClose for mobile variant
- Use selection.exitSelectionMode() after bulk operations
- Wrap with MessageContextMenu for right-click support
- Handle loading states for async actions
Last Updated: February 1, 2026
nself-chat v0.3.0 | GitHub | Issues | Discussions | Demo
Edit this page | MIT License | Β© 2026
(See π Security section below for 2FA, PIN Lock, and security audits.)
(Search lives in π Reference below.)
- π¬ Advanced Messaging
- π E2EE Setup
- π Search Setup
- π Call Management
- πΊ Live Streaming
- π₯οΈ Screen Sharing
- πΉ Video Calling
- ποΈ Voice Calling
- π± Mobile Optimization
- π§ͺ Testing
- π i18n
- π API Overview
- π Complete Reference
- π» API Examples
- π€ Bot API
- π Auth API
- π GraphQL Schema
- π Deployment Overview
- π³ Docker
- βΈοΈ Kubernetes
- β Helm Charts
- β Production Checklist
- π Production Validation
- π’ Multi-Tenant
- ποΈ Architecture
- π Diagrams
- ποΈ Database Schema
- π Project Structure
- π TypeScript Types
- π SPORT Reference
- π 2FA
- π¬ Messaging
- π Call Management
- π Call State Machine
- π E2EE
- πΊ Live Streaming
- π± Mobile Calls
- π PIN Lock
- π Polls
- π₯οΈ Screen Sharing
- π Search
- π Social Media
- ποΈ Voice Calling
- π Security Overview
- π‘οΈ Security Audit
- β‘ Performance
- π Best Practices
- π 2FA
- π PIN Lock
- π E2EE
- π‘οΈ E2EE Audit
v1.0.0 β’ 2026