'use client' 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 } from 'lucide-react' import TiptapEditor from '../qna/tiptap-editor' interface PolicyEditorProps { policyType: string currentPolicy?: any onSave: (policyType: string, version: string, content: string) => void onCancel: () => void onPreview: (policyType: string, content: string, version: string) => void isLoading?: boolean currentLocale?: 'ko' | 'en' } export function PolicyEditor({ policyType, currentPolicy, onSave, onCancel, onPreview, isLoading = false, currentLocale = 'ko' }: PolicyEditorProps) { const [version, setVersion] = useState('') const [content, setContent] = useState('') const [validationErrors, setValidationErrors] = useState([]) console.log(content) const policyLabels = { privacy_policy: '개인정보 처리방침', terms_of_service: '이용약관' } // 현재 정책 기반으로 다음 버전 생성 useEffect(() => { if (currentPolicy) { const currentVersion = currentPolicy.version const versionParts = currentVersion.split('.') const majorVersion = parseInt(versionParts[0]) || 1 const minorVersion = parseInt(versionParts[1]) || 0 // 마이너 버전 업 const nextVersion = `${majorVersion}.${minorVersion + 1}` setVersion(nextVersion) setContent(currentPolicy.content || '') } else { setVersion('1.0') setContent(getDefaultPolicyContent(policyType, currentLocale)) } }, [currentPolicy, policyType]) const getDefaultPolicyContent = (type: string, locale: 'ko' | 'en') => { if (type === 'privacy_policy') { if (locale === 'ko') { return `

개인정보 처리방침

제1조 (목적)

본 개인정보 처리방침은 eVCP(이하 "회사")가 개인정보 보호법 등 관련 법령에 따라 정보주체의 개인정보를 보호하고 이와 관련된 고충을 신속하고 원활하게 처리할 수 있도록 하기 위하여 다음과 같은 처리방침을 수립·공개합니다.

제2조 (개인정보의 수집 및 이용목적)

회사는 다음의 목적을 위하여 개인정보를 처리합니다:

제3조 (개인정보의 수집항목)

필수항목:

제4조 (개인정보의 보유 및 이용기간)

회사는 법령에 따른 개인정보 보유·이용기간 또는 정보주체로부터 개인정보를 수집 시에 동의받은 개인정보 보유·이용기간 내에서 개인정보를 처리·보유합니다.

제5조 (정보주체의 권리)

정보주체는 회사에 대해 언제든지 다음 각 호의 개인정보 보호 관련 권리를 행사할 수 있습니다:

` } else { return `

Privacy Policy

Article 1 (Purpose)

This Privacy Policy is established and disclosed by eVCP (hereinafter "the Company") in order to protect personal information of data subjects and promptly and smoothly handle grievances related thereto in accordance with the Personal Information Protection Act and other relevant laws.

Article 2 (Purpose of Collection and Use of Personal Information)

The Company processes personal information for the following purposes:

Article 3 (Items of Personal Information Collected)

Required items:

Article 4 (Retention and Use Period of Personal Information)

The Company processes and retains personal information within the period of retention and use of personal information according to laws or the period of retention and use of personal information agreed upon when collecting personal information from data subjects.

Article 5 (Rights of Data Subjects)

Data subjects may exercise the following rights related to personal information protection against the Company at any time:

` } } else { if (locale === 'ko') { return `

이용약관

제1조 (목적)

본 약관은 eVCP(이하 "회사")가 제공하는 서비스의 이용조건 및 절차, 회사와 회원 간의 권리, 의무 및 책임사항을 규정함을 목적으로 합니다.

제2조 (정의)

제3조 (약관의 효력 및 변경)

본 약관은 서비스를 이용하고자 하는 모든 회원에 대하여 그 효력을 발생합니다.

제4조 (회원가입)

회원가입은 신청자가 본 약관의 내용에 대하여 동의를 한 다음 회원가입신청을 하고 회사가 이러한 신청에 대하여 승낙함으로써 체결됩니다.

제5조 (서비스의 제공)

회사는 회원에게 다음과 같은 서비스를 제공합니다:

` } else { return `

Terms of Service

Article 1 (Purpose)

These Terms of Service are established to regulate the terms and procedures for using the services provided by eVCP (hereinafter "the Company"), and the rights, obligations, and responsibilities between the Company and its members.

Article 2 (Definitions)

Article 3 (Effectiveness and Amendment of Terms)

These Terms of Service take effect for all members who intend to use the service.

Article 4 (Member Registration)

Member registration is concluded when an applicant agrees to the contents of these Terms of Service, applies for member registration, and the Company approves such application.

Article 5 (Provision of Services)

The Company provides the following services to members:

` } } } const validateForm = () => { const errors: string[] = [] if (!version.trim()) { errors.push('버전을 입력해주세요.') } else if (!/^\d+\.\d+$/.test(version.trim())) { errors.push('버전은 "1.0" 형식으로 입력해주세요.') } if (!content.trim()) { errors.push('정책 내용을 입력해주세요.') } else if (content.trim().length < 100) { errors.push('정책 내용이 너무 짧습니다. (최소 100자)') } // 버전 중복 체크 (현재 정책이 있는 경우) if (currentPolicy && version === currentPolicy.version) { errors.push('이미 존재하는 버전입니다. 다른 버전을 입력해주세요.') } setValidationErrors(errors) return errors.length === 0 } const handleSave = () => { if (validateForm()) { onSave(policyType, version.trim(), content) } } const handlePreview = () => { if (validateForm()) { onPreview(policyType, content, version.trim()) } } return ( {currentPolicy ? '정책 편집' : '새 정책 생성'} - {policyLabels[policyType]} {currentPolicy ? `현재 버전 v${currentPolicy.version}을 기반으로 새 버전을 생성합니다.` : `${policyLabels[policyType]}의 첫 번째 버전을 생성합니다.` } {/* 경고 메시지 */} 새 버전을 저장하면 즉시 활성화되어 모든 사용자에게 적용됩니다. 저장하기 전에 미리보기로 내용을 확인해주세요. {/* 유효성 검사 오류 */} {validationErrors.length > 0 && (
    {validationErrors.map((error, index) => (
  • {error}
  • ))}
)} {/* 버전 입력 */}
setVersion(e.target.value)} disabled={isLoading} className="w-32" />

형식: 주.부 (예: 1.0, 1.1, 2.0)

{/* 정책 내용 편집기 */}

리치 텍스트 편집기를 사용하여 정책 내용을 작성하세요. 이미지, 표, 목록 등을 추가할 수 있습니다.

{/* 액션 버튼들 */}
) }