- KT-NEGOWIZ /chat 을 현재 아키텍처(Vite·React Router·feature 구조)로 이식 - 사이드 ItemSection(+이미지 확대), 헤더 잔여시간, 채팅(메시지/템플릿/입력), 메뉴 섹션 - 메시지 템플릿: 협상 성공률·협상요약·투찰요약·재협상/재견적 폼 - zustand 스토어 + mock 데이터(정적 쇼케이스, 제출 시 로컬 append) - Next.js·KT 의존 제거(next/image·navigation, 로고·서비스명·연락처, 팝업 보류) - ChatPage 배선: ChatContainer / ItemSection / RemainingTime + auth SidebarFooter 재사용 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
50 lines
1.0 KiB
TypeScript
50 lines
1.0 KiB
TypeScript
import { useNavigate } from 'react-router'
|
|
import { List } from 'lucide-react'
|
|
import { cn, interactive } from '@/lib'
|
|
import { MainLayout, MainHeaderBar } from '@/layouts'
|
|
import { ChatContainer, ItemSection, RemainingTime } from '@/features/chat'
|
|
import { SidebarFooter } from '@/features/auth'
|
|
|
|
export function ChatPage() {
|
|
return (
|
|
<MainLayout
|
|
sidebarWidth="chat"
|
|
scrollX
|
|
logoAction={<ListNavButton />}
|
|
sidebar={<Sidebar />}
|
|
header={
|
|
<MainHeaderBar className="px-[140px]">
|
|
<RemainingTime />
|
|
</MainHeaderBar>
|
|
}
|
|
>
|
|
<ChatContainer />
|
|
</MainLayout>
|
|
)
|
|
}
|
|
|
|
function ListNavButton() {
|
|
const navigate = useNavigate()
|
|
return (
|
|
<button
|
|
type="button"
|
|
aria-label="목록으로 이동"
|
|
onClick={() => navigate('/list')}
|
|
className={cn('text-foreground', interactive)}
|
|
>
|
|
<List size={24} />
|
|
</button>
|
|
)
|
|
}
|
|
|
|
function Sidebar() {
|
|
return (
|
|
<>
|
|
<ItemSection />
|
|
<SidebarFooter />
|
|
</>
|
|
)
|
|
}
|
|
|
|
export default ChatPage
|