diff --git a/frontend/src/ui/components/chat/ChatInputWrapper.tsx b/frontend/src/ui/components/chat/ChatInputWrapper.tsx
index 19f4dd3..3912ece 100644
--- a/frontend/src/ui/components/chat/ChatInputWrapper.tsx
+++ b/frontend/src/ui/components/chat/ChatInputWrapper.tsx
@@ -1,11 +1,14 @@
import { useState } from "react";
import { RichTextArea } from "../core/RichTextArea";
+import type { Message } from "../../../core/types";
interface ChatInputWrapperProps {
- onSendMessage: (message: string) => void;
+ onSendMessage: (message: string) => void | ((message: string) => void);
+ replyTo?: Message | null;
+ onClearReply?: () => void;
}
-export function ChatInputWrapper({ onSendMessage }: ChatInputWrapperProps) {
+export function ChatInputWrapper({ onSendMessage, replyTo, onClearReply }: ChatInputWrapperProps) {
const [message, setMessage] = useState("");
const handleSubmit = async (e: React.FormEvent | Event) => {
@@ -13,6 +16,7 @@ export function ChatInputWrapper({ onSendMessage }: ChatInputWrapperProps) {
if (message.trim()) {
onSendMessage(message);
setMessage("");
+ if (onClearReply) onClearReply();
}
};
@@ -20,6 +24,17 @@ export function ChatInputWrapper({ onSendMessage }: ChatInputWrapperProps) {
);
diff --git a/frontend/src/ui/panels/DMPanel.ts b/frontend/src/ui/panels/DMPanel.ts
index 5b3cd90..d97d968 100644
--- a/frontend/src/ui/panels/DMPanel.ts
+++ b/frontend/src/ui/panels/DMPanel.ts
@@ -88,7 +88,7 @@ export class DMPanel extends MessagePanel {
}
}
- async sendMessage(content: string): Promise {
+ async sendMessage(content: string, _replyToId?: number): Promise {
if (!this.currentUser.authToken || !this.dmData || !content.trim()) return;
try {
diff --git a/frontend/src/ui/panels/MessagePanel.ts b/frontend/src/ui/panels/MessagePanel.ts
index 146e23c..da704c3 100644
--- a/frontend/src/ui/panels/MessagePanel.ts
+++ b/frontend/src/ui/panels/MessagePanel.ts
@@ -48,7 +48,7 @@ export abstract class MessagePanel {
abstract activate(): Promise;
abstract deactivate(): void;
abstract loadMessages(): Promise;
- abstract sendMessage(content: string): Promise;
+ abstract sendMessage(content: string, replyToId?: number): Promise;
abstract isDm(): boolean;
// Optional WebSocket message handler (can be overridden by subclasses)
@@ -115,8 +115,8 @@ export abstract class MessagePanel {
}
// Event handlers
- handleSendMessage = (content: string): void => {
- this.sendMessage(content);
+ handleSendMessage = (content: string, replyToId?: number): void => {
+ this.sendMessage(content, replyToId);
};
handleEditMessage = (messageId: number, content: string): void => {
diff --git a/frontend/src/ui/panels/PublicChatPanel.ts b/frontend/src/ui/panels/PublicChatPanel.ts
index 457e762..d32cf79 100644
--- a/frontend/src/ui/panels/PublicChatPanel.ts
+++ b/frontend/src/ui/panels/PublicChatPanel.ts
@@ -61,12 +61,12 @@ export class PublicChatPanel extends MessagePanel {
}
}
- async sendMessage(content: string): Promise {
+ async sendMessage(content: string, replyToId?: number): Promise {
if (!this.currentUser.authToken || !content.trim()) return;
try {
const response = await request({
- data: { content: content.trim() },
+ data: { content: content.trim(), ...(replyToId ? { reply_to_id: replyToId } : {}) },
credentials: {
scheme: "Bearer",
credentials: this.currentUser.authToken