# Messaging Features
Complete guide to all messaging features in nself-chat.
---
## Overview
nself-chat provides 14 messaging features covering everything from basic text to voice messages.
| Feature | Flag | Default |
| --------------- | ----------------------- | ------- |
| Edit Messages | `messages.edit` | Enabled |
| Delete Messages | `messages.delete` | Enabled |
| Reactions | `messages.reactions` | Enabled |
| Threads | `messages.threads` | Enabled |
| Pins | `messages.pins` | Enabled |
| Bookmarks | `messages.bookmarks` | Enabled |
| Forward | `messages.forward` | Enabled |
| Schedule | `messages.schedule` | Enabled |
| Voice Messages | `messages.voice` | Enabled |
| Code Blocks | `messages.codeBlocks` | Enabled |
| Markdown | `messages.markdown` | Enabled |
| Link Previews | `messages.linkPreviews` | Enabled |
| Mentions | `messages.mentions` | Enabled |
| Quotes | `messages.quotes` | Enabled |
---
## Edit Messages
Allow users to modify sent messages within a configurable time window.
### Configuration
```typescript
const editConfig = {
enabled: true,
timeWindow: 3600, // seconds (1 hour default)
showEditHistory: true,
markAsEdited: true,
}
```
### Usage
```typescript
import { useMessages } from '@/hooks/use-messages'
function MessageEditor({ messageId, content }) {
const { editMessage } = useMessages()
const handleEdit = async (newContent: string) => {
await editMessage(messageId, newContent)
}
return
}
```
### Edit History
View previous versions of edited messages:
```typescript
import { useMessageVersions } from '@/hooks/use-message-versions'
function EditHistory({ messageId }) {
const { versions } = useMessageVersions(messageId)
return (
{versions.map((v) => (
-
Version {v.version}: {v.content} ({v.editedAt})
))}
)
}
```
---
## Delete Messages
Allow users to remove their own messages.
### Configuration
```typescript
const deleteConfig = {
enabled: true,
timeWindow: 86400, // seconds (24 hours)
softDelete: true, // Keep in database, hide from UI
adminCanDeleteAny: true,
}
```
### Soft vs Hard Delete
- **Soft Delete**: Message hidden but retained for compliance
- **Hard Delete**: Permanently removed from database
---
## Reactions
Emoji reactions on messages.
### Adding Reactions
```typescript
import { useReactions } from '@/hooks/use-reactions'
function ReactionButton({ messageId }) {
const { addReaction, removeReaction } = useReactions(messageId)
return (
addReaction(emoji)}
/>
)
}
```
### Reaction Display
```tsx
```
### Configuration
```typescript
const reactionConfig = {
enabled: true,
maxPerMessage: 20,
maxPerUser: 5,
allowCustomEmoji: true,
}
```
---
## Threads
Threaded replies to messages.
### Thread Structure
```
Message (parent)
├── Reply 1
├── Reply 2
│ └── (threads can be nested or flat)
└── Reply 3
```
### Creating Thread Replies
```typescript
import { useThreads } from '@/hooks/use-threads'
function ThreadReply({ parentMessageId }) {
const { createReply } = useThreads(parentMessageId)
return (
createReply(content)}
placeholder="Reply in thread..."
/>
)
}
```
### Thread Panel
```tsx
setSelectedMessage(null)} />
```
---
## Pins
Pin important messages to channel.
### Pinning Messages
```typescript
import { usePins } from '@/hooks/use-pins'
function PinButton({ messageId, channelId }) {
const { pinMessage, unpinMessage, isPinned } = usePins(channelId)
return (
)
}
```
### Viewing Pinned Messages
```tsx
```
---
## Bookmarks
Save messages for personal reference.
### Bookmarking
```typescript
import { useBookmarks } from '@/lib/bookmarks'
function BookmarkButton({ messageId }) {
const { addBookmark, removeBookmark, isBookmarked } = useBookmarks()
return (
)
}
```
### Saved Messages Page
Access at `/saved` - shows all bookmarked messages with organization options.
---
## Forward Messages
Forward messages to other channels or users.
### Forward Dialog
```tsx
forwardMessage(message.id, targetId, type)}
/>
```
### Forward Options
- Forward to channel
- Forward to direct message
- Forward with comment
- Forward multiple messages
---
## Scheduled Messages
Schedule messages to send later.
### Scheduling
```typescript
import { useScheduled } from '@/lib/scheduled'
function ScheduleButton({ content, channelId }) {
const { scheduleMessage } = useScheduled()
return (
scheduleMessage({
content,
channelId,
sendAt: date
})}
/>
)
}
```
### Managing Scheduled Messages
Access at `/drafts` - view and manage all scheduled messages.
---
## Voice Messages
Record and send audio messages.
### Recording
```typescript
import { useVoiceRecorder } from '@/lib/voice'
function VoiceRecorder({ onSend }) {
const {
isRecording,
duration,
start,
stop,
cancel
} = useVoiceRecorder()
return (
{isRecording ? (
<>
{duration}s
>
) : (
)}
)
}
```
### Playback
```tsx
```
---
## Code Blocks
Syntax-highlighted code snippets.
### Syntax
````markdown
```javascript
const greeting = 'Hello, World!'
console.log(greeting)
```
````
### Supported Languages
50+ languages including:
- JavaScript/TypeScript
- Python
- Go
- Rust
- Java
- C/C++
- SQL
- And more...
### Configuration
```typescript
const codeBlockConfig = {
enabled: true,
lineNumbers: true,
maxLines: 100,
copyButton: true,
theme: 'github-dark',
}
```
---
## Markdown Support
Rich text formatting using Markdown.
### Supported Syntax
| Syntax | Result |
| ------------- | ------------- |
| `**bold**` | **bold** |
| `*italic*` | _italic_ |
| `~~strike~~` | ~~strike~~ |
| `` `code` `` | `code` |
| `[link](url)` | link |
| `> quote` | blockquote |
| `- item` | bullet list |
| `1. item` | numbered list |
### Configuration
```typescript
const markdownConfig = {
enabled: true,
allowHtml: false,
sanitize: true,
linkify: true,
}
```
---
## Link Previews
Automatic URL unfurling with preview cards.
### Supported Sites
- General websites (Open Graph)
- YouTube videos
- Twitter/X posts
- GitHub repos/issues
- And more...
### Configuration
```typescript
const linkPreviewConfig = {
enabled: true,
timeout: 5000,
maxWidth: 400,
showImage: true,
showDescription: true,
}
```
---
## Mentions
@mention users and channels.
### Mention Types
| Type | Syntax | Description |
| -------- | ----------- | --------------------- |
| User | `@username` | Mention specific user |
| Channel | `#channel` | Link to channel |
| Everyone | `@everyone` | Notify all members |
| Here | `@here` | Notify online members |
### Autocomplete
```tsx
insertMention(mention)} filter={searchText} />
```
### Configuration
```typescript
const mentionConfig = {
enabled: true,
allowEveryone: 'admin', // 'all' | 'admin' | 'none'
allowHere: 'admin',
highlightStyle: 'background', // 'background' | 'bold' | 'color'
}
```
---
## Quotes
Quote previous messages in replies.
### Quote Syntax
```
> Original message content
> - @author
My reply to this
```
### Quote Component
```tsx
scrollToMessage(quotedMessage.id)} />
```
---
## Message Configuration Summary
```typescript
// Full message configuration
const messageConfig = {
maxLength: 10000,
edit: {
enabled: true,
timeWindow: 3600,
showHistory: true,
},
delete: {
enabled: true,
timeWindow: 86400,
softDelete: true,
},
reactions: {
enabled: true,
maxPerMessage: 20,
},
threads: {
enabled: true,
maxDepth: 1,
},
pins: {
enabled: true,
maxPerChannel: 50,
},
bookmarks: {
enabled: true,
maxPerUser: 1000,
},
voice: {
enabled: true,
maxDuration: 300,
format: 'webm',
},
codeBlocks: {
enabled: true,
lineNumbers: true,
},
markdown: {
enabled: true,
sanitize: true,
},
linkPreviews: {
enabled: true,
timeout: 5000,
},
mentions: {
enabled: true,
allowEveryone: 'admin',
},
}
```
---
## Related Documentation
- [Features Overview](Features)
- [Real-time Features](Features-Realtime)
- [Emoji & Reactions](Features-Emoji)
- [Voice Messages](Features-Voice)