- 세션 목록을 useSessionListQuery 로 서버 조회(필터·정렬·페이지 위임), mock 제거. 정수 코드↔한국어 라벨 변환 어댑터(list/lib/adapter) - 협상 참여: useParticipateMutation, 성공 시 채팅 진입·실패 토스트 - 거부: 사유 입력 팝업(RejectPopup) + useRejectMutation, 상태별 차단 안내 - 선택/상태 검증을 토스트로 일원화(ActionSection 은 버튼만 담당) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
50 lines
1.2 KiB
TypeScript
50 lines
1.2 KiB
TypeScript
import { cn, interactive } from '@/lib'
|
|
|
|
const PILL =
|
|
'flex items-center justify-center w-full max-w-[130px] h-[50px] rounded-full py-4 px-6 ' +
|
|
'text-lg font-semibold whitespace-nowrap ' +
|
|
interactive
|
|
|
|
export interface ActionSectionProps {
|
|
isParticipating: boolean
|
|
isRejecting: boolean
|
|
onParticipate: () => void
|
|
onReject: () => void
|
|
}
|
|
|
|
export function ActionSection({
|
|
isParticipating,
|
|
isRejecting,
|
|
onParticipate,
|
|
onReject,
|
|
}: ActionSectionProps) {
|
|
return (
|
|
<div className="flex w-full py-[35px] items-center justify-end gap-3">
|
|
<button
|
|
type="button"
|
|
onClick={onParticipate}
|
|
disabled={isParticipating}
|
|
className={cn(
|
|
PILL,
|
|
'bg-primary text-primary-foreground',
|
|
isParticipating && 'opacity-50 cursor-not-allowed',
|
|
)}
|
|
>
|
|
협상 참여
|
|
</button>
|
|
<button
|
|
type="button"
|
|
onClick={onReject}
|
|
disabled={isRejecting}
|
|
className={cn(
|
|
PILL,
|
|
'bg-background text-primary border border-primary',
|
|
isRejecting && 'opacity-50 cursor-not-allowed',
|
|
)}
|
|
>
|
|
거부
|
|
</button>
|
|
</div>
|
|
)
|
|
}
|