chore: test deploy snapshot

This commit is contained in:
2026-05-27 11:19:49 +09:00
parent 4c4b3c8d2c
commit 7e9c3bd097
5 changed files with 122 additions and 39 deletions

View File

@@ -1,4 +1,4 @@
import { AppstoreOutlined, CheckOutlined, CloseOutlined, CopyOutlined, DeleteOutlined, DownOutlined, EyeInvisibleOutlined, EyeOutlined, FileTextOutlined, FilterOutlined, FullscreenOutlined, LeftOutlined, PlusOutlined, ReloadOutlined, RightOutlined, SearchOutlined, SendOutlined, SettingOutlined, ThunderboltOutlined, UpOutlined } from '@ant-design/icons';
import { AppstoreOutlined, CheckOutlined, CloseOutlined, CopyOutlined, DeleteOutlined, DownOutlined, EditOutlined, EyeInvisibleOutlined, EyeOutlined, FileTextOutlined, FilterOutlined, FullscreenOutlined, LeftOutlined, PlusOutlined, ReloadOutlined, RightOutlined, SearchOutlined, SendOutlined, SettingOutlined, ThunderboltOutlined, UpOutlined } from '@ant-design/icons';
import { Alert, App, Button, Checkbox, Drawer, Dropdown, Input, Modal, Select, Spin, Tabs, Tag, Typography, type MenuProps } from 'antd';
import type { TextAreaRef } from 'antd/es/input/TextArea';
import { Suspense, lazy, useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState, type ClipboardEvent, type FocusEvent, type KeyboardEvent, type PointerEvent as ReactPointerEvent, type ReactNode } from 'react';
@@ -3006,6 +3006,7 @@ export function ChatSharePage() {
const [isRoomSettingsOpen, setIsRoomSettingsOpen] = useState(false);
const [isSavingRoomSettings, setIsSavingRoomSettings] = useState(false);
const [roomSettingsTabKey, setRoomSettingsTabKey] = useState<'chat-type' | 'default-contexts' | 'room-context' | 'notifications' | 'security'>('chat-type');
const [editingRoomTitle, setEditingRoomTitle] = useState('');
const [editingRoomChatTypeId, setEditingRoomChatTypeId] = useState<string | null>(null);
const [editingRoomDefaultContextIds, setEditingRoomDefaultContextIds] = useState<string[]>([]);
const [isEditingRoomDefaultContextsDirty, setIsEditingRoomDefaultContextsDirty] = useState(false);
@@ -3482,6 +3483,12 @@ export function ChatSharePage() {
}
const nextChatTypeId = currentSharedChatTypeId ?? enabledChatTypes[0]?.id ?? null;
const fallbackRoomTitle =
snapshot.conversation.title?.trim()
|| snapshot.targetRequest.userText?.trim()
|| snapshot.requests?.[0]?.userText?.trim()
|| '-';
setEditingRoomTitle(fallbackRoomTitle);
setEditingRoomChatTypeId(nextChatTypeId);
setEditingRoomDefaultContextIds(resolveShareRoomDefaultContextIds(activeRoomContextSettings, chatTypeDefaults, nextChatTypeId));
setIsEditingRoomDefaultContextsDirty(false);
@@ -3501,9 +3508,12 @@ export function ChatSharePage() {
currentSharedChatTypeId,
enabledChatTypes,
snapshot?.conversation.notifyOffline,
snapshot?.conversation.title,
snapshot?.requests,
snapshot?.share.accessPinPromptTtlMinutes,
snapshot?.share.hasAccessPin,
snapshot?.conversation.sessionId,
snapshot?.targetRequest.userText,
]);
useEffect(() => {
if (!isRoomSettingsOpen) {
@@ -3542,6 +3552,7 @@ export function ChatSharePage() {
const nextCustomContextContent = editingRoomCustomContextContent.trim();
const shouldPersistRoomDefaultContextIds = !areStringListsEqual(normalizedDefaultContextIds, inheritedDefaultContextIds);
const shouldPersistRoomCustomContext = Boolean(nextCustomContextTitle || nextCustomContextContent);
const normalizedRoomTitle = editingRoomTitle.trim();
const normalizedAccessPin = editingRoomAccessPin.trim();
const currentHasAccessPin = snapshot?.share.hasAccessPin === true;
const currentAccessPinPromptTtlMinutes = resolveAccessPinPromptTtlMinutes(snapshot?.share.accessPinPromptTtlMinutes);
@@ -3549,10 +3560,17 @@ export function ChatSharePage() {
canManageSharedRoomSettings
&& Boolean(nextChatType)
&& (
currentSharedChatTypeId !== nextChatType.id
normalizedRoomTitle !== (snapshot?.conversation.title?.trim() || '')
|| !(snapshot?.conversation.title?.trim())
|| currentSharedChatTypeId !== nextChatType.id
|| snapshot.conversation.notifyOffline !== editingRoomNotifyOffline
);
if (canManageSharedRoomSettings && !normalizedRoomTitle) {
message.warning('채팅방 이름을 입력하세요.');
return;
}
if (canEditSharedRoomAccessPin && editingRoomUseAccessPin && !currentHasAccessPin && !normalizedAccessPin) {
message.warning('비밀번호를 새로 켜려면 숫자 4자리를 입력하세요.');
return;
@@ -3623,6 +3641,7 @@ export function ChatSharePage() {
accessPinPromptTtlMinutes: editingRoomUseAccessPin ? editingRoomAccessPinPromptTtlMinutes : null,
chatTypeId: shouldSaveConversationSettings ? nextChatType?.id ?? null : undefined,
chatTypeLabel: shouldSaveConversationSettings ? nextChatType?.name ?? null : undefined,
title: shouldSaveConversationSettings ? normalizedRoomTitle : undefined,
notifyOffline: shouldSaveConversationSettings ? editingRoomNotifyOffline : undefined,
});
@@ -3669,6 +3688,7 @@ export function ChatSharePage() {
canManageSharedRoomSettings,
defaultContexts,
editingRoomChatTypeId,
editingRoomTitle,
editingRoomAccessPin,
editingRoomAccessPinPromptTtlMinutes,
editingRoomCustomContextContent,
@@ -5214,6 +5234,15 @@ export function ChatSharePage() {
return currentRequest ?? latestRequest ?? sortedRequests[0] ?? null;
}, [currentRequest, displayedRequests, latestRequest, sortedRequests]);
const headerTitleText = useMemo(() => {
const savedConversationTitle = snapshot?.conversation.title?.trim() || '';
if (savedConversationTitle) {
return savedConversationTitle;
}
return headerInquiryRequest?.userText.trim() || '-';
}, [headerInquiryRequest?.userText, snapshot?.conversation.title]);
const hiddenBeforeCount = expandMode === 'latest' && latestRequestIndex >= 0 ? latestRequestIndex : 0;
const hiddenAfterCount =
expandMode === 'latest' && latestRequestIndex >= 0 ? Math.max(0, sortedRequests.length - latestRequestIndex - 1) : 0;
@@ -6538,13 +6567,28 @@ export function ChatSharePage() {
<section className="chat-share-page__first-inquiry">
<div className="chat-share-page__first-inquiry-head">
<div className="chat-share-page__first-inquiry-copy">
<Title
level={5}
className="chat-share-page__first-inquiry-title"
ellipsis={{ rows: 1, tooltip: headerInquiryRequest.userText.trim() || '-' }}
>
{headerInquiryRequest.userText.trim() || '-'}
</Title>
<div className="chat-share-page__first-inquiry-title-row">
<Title
level={5}
className="chat-share-page__first-inquiry-title"
ellipsis={{ rows: 1, tooltip: headerTitleText }}
>
{headerTitleText}
</Title>
{canOpenSharedRoomSettings ? (
<Button
type="text"
size="small"
className="chat-share-page__section-action chat-share-page__section-action--tool"
aria-label="채팅방 이름 및 설정 편집"
title="채팅방 이름 및 설정 편집"
icon={<EditOutlined />}
onClick={() => {
openSharedRoomSettings();
}}
/>
) : null}
</div>
</div>
<Dropdown
trigger={['click']}
@@ -7023,6 +7067,19 @@ export function ChatSharePage() {
label: '채팅유형',
children: (
<div className="chat-share-page__room-settings-panel">
<div className="chat-share-page__room-settings-panel-head">
<Text strong> </Text>
<Text type="secondary"> .</Text>
</div>
<Input
value={editingRoomTitle}
placeholder="예: 관리자 공유 채팅"
readOnly={!canManageSharedRoomSettings}
maxLength={200}
onChange={(event) => {
setEditingRoomTitle(event.target.value);
}}
/>
<div className="chat-share-page__room-settings-panel-head">
<Text strong> </Text>
<Text type="secondary"> .</Text>