delete messages + fix layout overflow
- DELETE /api/channels/{id}/messages/{msg_id} — soft delete, own only
- Broadcasts WsEvent::Delete to subscribers
- UI: "Del" button on hover for own messages (turns red)
- Fix layout: h-full + overflow-hidden on flex containers
- ScrollArea gets min-h-0 to properly constrain in flex
- Messages no longer push compose past viewport
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
import { useCallback, useEffect, useRef, useState } from "react";
|
||||
import type { Channel } from "@/types/Channel";
|
||||
import type { Message } from "@/types/Message";
|
||||
import { getChannels, getMessages, getCurrentUsername } from "@/api";
|
||||
import { getChannels, getMessages, getCurrentUsername, deleteMessage } from "@/api";
|
||||
import { ChannelSidebar } from "@/components/ChannelSidebar";
|
||||
import { MessageItem } from "@/components/MessageItem";
|
||||
import { ComposeBox } from "@/components/ComposeBox";
|
||||
@@ -121,12 +121,12 @@ export default function App() {
|
||||
);
|
||||
|
||||
return (
|
||||
<div className="flex h-full">
|
||||
<div className="hidden md:block">
|
||||
<div className="flex h-full overflow-hidden">
|
||||
<div className="hidden md:flex md:flex-col md:h-full">
|
||||
{sidebar}
|
||||
</div>
|
||||
|
||||
<div className="flex-1 flex flex-col min-w-0">
|
||||
<div className="flex-1 flex flex-col min-w-0 h-full overflow-hidden">
|
||||
<div className="px-4 py-3 md:px-6 md:py-4 border-b-2 border-border flex items-center gap-3">
|
||||
<Sheet open={sheetOpen} onOpenChange={setSheetOpen}>
|
||||
<SheetTrigger className="md:hidden p-1 h-8 w-8 text-muted-foreground hover:text-primary font-mono font-bold text-lg">
|
||||
@@ -155,7 +155,7 @@ export default function App() {
|
||||
)}
|
||||
</div>
|
||||
|
||||
<ScrollArea ref={scrollRef} className="flex-1">
|
||||
<ScrollArea ref={scrollRef} className="flex-1 min-h-0">
|
||||
{loading && messages.length === 0 ? (
|
||||
<div className="p-5 space-y-4">
|
||||
{[1, 2, 3].map((i) => (
|
||||
@@ -178,12 +178,21 @@ export default function App() {
|
||||
key={msg.id}
|
||||
message={msg}
|
||||
replyTarget={msg.reply_to ? messagesById.get(msg.reply_to) : undefined}
|
||||
currentUsername={getCurrentUsername()}
|
||||
onReply={(id) => {
|
||||
const target = messagesById.get(id);
|
||||
if (target) {
|
||||
setReplyTo({ id, username: target.user.display_name, content: target.content });
|
||||
}
|
||||
}}
|
||||
onDelete={async (chId, msgId) => {
|
||||
try {
|
||||
await deleteMessage(chId, msgId);
|
||||
loadMessages();
|
||||
} catch {
|
||||
// ignore
|
||||
}
|
||||
}}
|
||||
/>
|
||||
))
|
||||
)}
|
||||
|
||||
Reference in New Issue
Block a user