fix(realtime,ui): sync message deletes and channel delete/leave behavior
All checks were successful
CI / test (push) Successful in 23s
All checks were successful
CI / test (push) Successful in 23s
This commit is contained in:
@@ -94,6 +94,7 @@ export function MessageList() {
|
||||
const hasMore = Boolean(activeChatId && hasMoreByChat[activeChatId]);
|
||||
const isLoadingMore = Boolean(activeChatId && loadingMoreByChat[activeChatId]);
|
||||
const selectedMessages = useMemo(() => messages.filter((m) => selectedIds.has(m.id)), [messages, selectedIds]);
|
||||
const channelOnlyDeleteForAll = activeChat?.type === "channel" && !activeChat?.is_saved;
|
||||
const canDeleteAllForSelection = useMemo(
|
||||
() => selectedMessages.length > 0 && selectedMessages.every((m) => canDeleteForEveryone(m, activeChat, me?.id)),
|
||||
[selectedMessages, activeChat, me?.id]
|
||||
@@ -329,9 +330,11 @@ export function MessageList() {
|
||||
<div className="flex items-center justify-between border-b border-slate-700/50 bg-slate-900/80 px-3 py-2 text-xs">
|
||||
<span className="font-semibold text-slate-200">{selectedIds.size} selected</span>
|
||||
<div className="flex items-center gap-2">
|
||||
<button className="rounded bg-red-500 px-2 py-1 font-semibold text-white" onClick={() => void deleteSelectedForMe()}>
|
||||
Delete for me
|
||||
</button>
|
||||
{!channelOnlyDeleteForAll ? (
|
||||
<button className="rounded bg-red-500 px-2 py-1 font-semibold text-white" onClick={() => void deleteSelectedForMe()}>
|
||||
Delete for me
|
||||
</button>
|
||||
) : null}
|
||||
{canDeleteAllForSelection ? (
|
||||
<button className="rounded bg-red-600 px-2 py-1 font-semibold text-white" onClick={() => void deleteSelectedForEveryone()}>
|
||||
Delete for everyone
|
||||
@@ -747,11 +750,17 @@ export function MessageList() {
|
||||
<div className="absolute inset-0 z-50 flex items-end justify-center bg-slate-950/55 p-3" onClick={() => setDeleteMessageId(null)}>
|
||||
<div className="w-full rounded-xl border border-slate-700/80 bg-slate-900 p-3" onClick={(event) => event.stopPropagation()}>
|
||||
<p className="mb-2 text-sm font-semibold">Delete message</p>
|
||||
<p className="mb-3 text-xs text-slate-400">Choose how to delete this message.</p>
|
||||
<p className="mb-3 text-xs text-slate-400">
|
||||
{channelOnlyDeleteForAll
|
||||
? "In channels, messages can only be deleted for everyone."
|
||||
: "Choose how to delete this message."}
|
||||
</p>
|
||||
<div className="space-y-2">
|
||||
<button className="w-full rounded bg-red-500 px-3 py-2 text-sm font-semibold text-white" onClick={() => void handleDelete(false)}>
|
||||
Delete for me
|
||||
</button>
|
||||
{!channelOnlyDeleteForAll ? (
|
||||
<button className="w-full rounded bg-red-500 px-3 py-2 text-sm font-semibold text-white" onClick={() => void handleDelete(false)}>
|
||||
Delete for me
|
||||
</button>
|
||||
) : null}
|
||||
{canDeleteForEveryone(messagesMap.get(deleteMessageId), activeChat, me?.id) ? (
|
||||
<button className="w-full rounded bg-red-600 px-3 py-2 text-sm font-semibold text-white" onClick={() => void handleDelete(true)}>
|
||||
Delete for everyone
|
||||
@@ -904,12 +913,15 @@ function chatLabel(chat: { display_title?: string | null; title: string | null;
|
||||
|
||||
function canDeleteForEveryone(
|
||||
message: { sender_id: number } | undefined,
|
||||
chat: { type: "private" | "group" | "channel"; is_saved?: boolean } | undefined,
|
||||
chat: { type: "private" | "group" | "channel"; is_saved?: boolean; my_role?: "owner" | "admin" | "member" | null } | undefined,
|
||||
meId: number | undefined
|
||||
): boolean {
|
||||
if (!message || !chat || !meId) return false;
|
||||
if (chat.is_saved) return false;
|
||||
if (chat.type === "private") return true;
|
||||
if (chat.type === "channel") {
|
||||
return chat.my_role === "owner" || chat.my_role === "admin";
|
||||
}
|
||||
return message.sender_id === meId;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user