global fix and update bot Api
This commit is contained in:
@@ -2,13 +2,13 @@
|
||||
|
||||
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
||||
import Link from 'next/link';
|
||||
import { ArrowLeft, BarChart3, CalendarDays, ImageIcon, Loader2, MessageCircle, Paperclip, Search, Send, Settings, Smile, Trash2, X } from 'lucide-react';
|
||||
import { ArrowLeft, BarChart3, CalendarDays, ImageIcon, Loader2, MessageCircle, Paperclip, Pin, Search, Send, Settings, Smile, Trash2, X } from 'lucide-react';
|
||||
import { AvatarWithPresence } from '@/components/family/avatar-with-presence';
|
||||
import { FamilyBotChat, BotMiniAppSheet } from '@/components/family/family-bot-chat';
|
||||
import { ChatRoomAvatarDisplay } from '@/components/family/chat-room-avatar-display';
|
||||
import { ChatDateSeparator } from '@/components/chat/chat-date-separator';
|
||||
import { ChatEmojiContent } from '@/components/chat/chat-emoji-content';
|
||||
import { ChatMessageContextMenu, SelectableMessageWrapper } from '@/components/chat/chat-message-context-menu';
|
||||
import { ChatMessageContextMenu, ChatSelectionContextMenu, SelectableMessageWrapper } from '@/components/chat/chat-message-context-menu';
|
||||
import { ChatDeleteMessageDialog } from '@/components/chat/chat-delete-message-dialog';
|
||||
import { ChatMessageEditBanner } from '@/components/chat/chat-message-edit-banner';
|
||||
import { ChatMessageReactions } from '@/components/chat/chat-message-reactions';
|
||||
@@ -44,6 +44,7 @@ import {
|
||||
markChatRoomRead,
|
||||
sendBotMessage,
|
||||
sendChatMessage,
|
||||
setChatMessagePinned,
|
||||
toggleChatMessageReaction,
|
||||
uploadMediaObject,
|
||||
voteChatPoll
|
||||
@@ -516,6 +517,35 @@ export function MiniFamilyChat() {
|
||||
requestDeleteMessages(selected.map((message) => message.id));
|
||||
}
|
||||
|
||||
async function handleTogglePin(message: ChatMessage) {
|
||||
if (!token) return;
|
||||
try {
|
||||
const updated = await setChatMessagePinned(message.id, !message.isPinned, token);
|
||||
setMessages((current) => current.map((item) => (item.id === updated.id ? updated : item)));
|
||||
showToast(updated.isPinned ? 'Сообщение закреплено' : 'Сообщение откреплено');
|
||||
} catch (error) {
|
||||
showToast(getApiErrorMessage(error, 'Не удалось изменить закрепление') ?? 'Ошибка');
|
||||
}
|
||||
}
|
||||
|
||||
function handleSelectionReply() {
|
||||
const selected = getSelectedMessages();
|
||||
if (selected.length !== 1) {
|
||||
showToast('Ответить можно только на одно сообщение');
|
||||
return;
|
||||
}
|
||||
showToast('Ответ доступен в полном виде семьи');
|
||||
}
|
||||
|
||||
function handleSelectionPin() {
|
||||
const selected = getSelectedMessages();
|
||||
if (selected.length !== 1) {
|
||||
showToast('Закрепить можно только одно сообщение');
|
||||
return;
|
||||
}
|
||||
void handleTogglePin(selected[0]!);
|
||||
}
|
||||
|
||||
async function uploadChatFile(file: File) {
|
||||
if (!token || !activeRoom || sending) return;
|
||||
setSending(true);
|
||||
@@ -948,6 +978,12 @@ export function MiniFamilyChat() {
|
||||
)
|
||||
)}
|
||||
>
|
||||
{message.isPinned && !isLargeEmoji ? (
|
||||
<div className={cn('mb-1 flex items-center gap-1 text-[10px] font-medium', mine ? 'text-[#6c8f56]' : 'text-[#3390ec]')}>
|
||||
<Pin className="h-3 w-3" />
|
||||
Закреплено
|
||||
</div>
|
||||
) : null}
|
||||
{!mine && !isLargeEmoji ? (
|
||||
<p className="mb-0.5 text-[11px] font-semibold text-[#3390ec]">{message.senderName}</p>
|
||||
) : null}
|
||||
@@ -1045,14 +1081,26 @@ export function MiniFamilyChat() {
|
||||
/>
|
||||
) : null}
|
||||
{selectionMode ? (
|
||||
<SelectableMessageWrapper
|
||||
selected={isSelected}
|
||||
selectionMode
|
||||
align={mine ? 'right' : 'left'}
|
||||
onClick={() => toggleSelectedMessage(message.id)}
|
||||
<ChatSelectionContextMenu
|
||||
count={selectedMessageIds.length}
|
||||
canPin={selectedMessageIds.length === 1}
|
||||
pinned={getSelectedMessages()[0]?.isPinned}
|
||||
onReply={handleSelectionReply}
|
||||
onCopy={() => void handleBulkCopy()}
|
||||
onForward={() => showToast('Пересылка доступна в полном виде семьи')}
|
||||
onDelete={() => void handleBulkDelete()}
|
||||
onTogglePin={handleSelectionPin}
|
||||
onCancel={exitSelectionMode}
|
||||
>
|
||||
{bubble}
|
||||
</SelectableMessageWrapper>
|
||||
<SelectableMessageWrapper
|
||||
selected={isSelected}
|
||||
selectionMode
|
||||
align={mine ? 'right' : 'left'}
|
||||
onClick={() => toggleSelectedMessage(message.id)}
|
||||
>
|
||||
{bubble}
|
||||
</SelectableMessageWrapper>
|
||||
</ChatSelectionContextMenu>
|
||||
) : (
|
||||
<ChatMessageContextMenu
|
||||
message={message}
|
||||
@@ -1065,6 +1113,7 @@ export function MiniFamilyChat() {
|
||||
}}
|
||||
onDelete={() => requestDeleteMessages([message.id])}
|
||||
onForward={() => showToast('Пересылка доступна в полном виде семьи')}
|
||||
onTogglePin={() => void handleTogglePin(message)}
|
||||
onSelect={() => enterSelectionMode(message.id)}
|
||||
onToggleReaction={async (emoji) => {
|
||||
if (!token) return;
|
||||
|
||||
Reference in New Issue
Block a user