import { useState, useEffect } from 'react' import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { Label } from '@/components/ui/label' import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card' import { Alert, AlertDescription } from '@/components/ui/alert' import { Separator } from '@/components/ui/separator' import { Save, Eye, X, Info, AlertTriangle, Calendar, Clock } from 'lucide-react' import { Badge } from '../ui/badge' import { PolicyPreview } from './policy-preview' // ✅ 타입 정의 interface PolicyData { id: number policyType: 'privacy_policy' | 'terms_of_service' version: string content: string effectiveDate: string isCurrent: boolean createdAt: string } interface PolicyHistoryProps { policyType: 'privacy_policy' | 'terms_of_service' policies: PolicyData[] | null | undefined // ✅ null/undefined 허용 currentPolicy?: PolicyData | null onActivate: (policyId: number, policyType: string) => void onEdit: () => void onClose: () => void isLoading?: boolean } export function PolicyHistory({ policyType, policies, currentPolicy, onActivate, onEdit, onClose, isLoading = false }: PolicyHistoryProps) { const [viewingPolicy, setViewingPolicy] = useState(null) // ✅ 상세보기 상태 const policyLabels: Record = { privacy_policy: '개인정보 처리방침', terms_of_service: '이용약관' } // ✅ 디버깅 로그 console.log('PolicyHistory - policies:', policies, 'type:', typeof policies, 'isArray:', Array.isArray(policies)) // ✅ 안전한 배열 변환 const safePolicies = Array.isArray(policies) ? policies :Array.isArray(policies.data) ? policies.data : [] // ✅ 내용 미리보기 함수 const getContentPreview = (content: string): string => { if (!content) return '내용 없음' // HTML 태그 제거 및 텍스트 추출 const textContent = content.replace(/<[^>]*>/g, '').trim() return textContent.length > 200 ? textContent.substring(0, 200) + '...' : textContent } // ✅ 상세보기 핸들러 const handleViewDetail = (policy: PolicyData) => { setViewingPolicy(policy) } // ✅ 상세보기 닫기 핸들러 const handleCloseDetail = () => { setViewingPolicy(null) } // ✅ 상세보기 모드일 때 PolicyPreview 렌더링 if (viewingPolicy) { return ( ) } return (
정책 히스토리 {policyLabels[policyType]}의 모든 버전을 확인하고 관리합니다
{/* ✅ 로딩 상태 */} {isLoading && (
히스토리를 불러오는 중...
)} {/* ✅ 에러 상태 체크 */} {!isLoading && safePolicies && !Array.isArray(safePolicies) && ( 정책 데이터 형식이 올바르지 않습니다. (받은 데이터: {typeof safePolicies}) )} {/* ✅ 정책 목록 */} {!isLoading && (
{safePolicies.length === 0 ? (

등록된 정책 버전이 없습니다.

) : ( <> {/* ✅ 정책 개수 표시 */}
총 {safePolicies.length}개 버전
{currentPolicy && ( 현재: v{currentPolicy.version} )}
{/* ✅ 정책 목록 렌더링 */} {safePolicies.map((policy: PolicyData) => (
{/* ✅ 헤더 */}

버전 {policy.version}

{policy.isCurrent && ( 현재 활성 )}
{/* ✅ 메타 정보 */}
시행일: {new Date(policy.effectiveDate).toLocaleDateString('ko-KR')}
생성일: {new Date(policy.createdAt).toLocaleDateString('ko-KR')}
{/* ✅ 내용 미리보기 */}
{getContentPreview(policy.content)}
{/* ✅ 액션 버튼들 */}
{!policy.isCurrent && ( )}
))} )}
)}
) }