'use client' import { useState } from 'react' import InputMask from 'react-input-mask' import { ResumeCreate } from '@/types/api' import { useCreateResume, useResumesByVacancy } from '@/hooks/useResume' import { Upload, FileText, X, CheckCircle, Clock } from 'lucide-react' interface ResumeUploadFormProps { vacancyId: number vacancyTitle: string onSuccess?: () => void } export default function ResumeUploadForm({ vacancyId, vacancyTitle, onSuccess }: ResumeUploadFormProps) { const [formData, setFormData] = useState({ applicant_name: '', applicant_email: '', applicant_phone: '', cover_letter: '', }) const [file, setFile] = useState(null) const [success, setSuccess] = useState(false) const createResumeMutation = useCreateResume() const { data: existingResumes, isLoading: isLoadingResumes } = useResumesByVacancy(vacancyId) // Проверяем есть ли уже резюме для этой вакансии в текущей сессии const hasExistingResume = existingResumes && existingResumes.length > 0 const handleInputChange = (e: React.ChangeEvent) => { const { name, value } = e.target setFormData(prev => ({ ...prev, [name]: value })) } const handleFileChange = (e: React.ChangeEvent) => { const selectedFile = e.target.files?.[0] if (selectedFile) { // Check file size (max 10MB) if (selectedFile.size > 10 * 1024 * 1024) { return } // Check file type const allowedTypes = [ 'application/pdf', 'application/msword', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'text/plain' ] if (!allowedTypes.includes(selectedFile.type)) { return } setFile(selectedFile) } } const removeFile = () => { setFile(null) } const handleSubmit = (e: React.FormEvent) => { e.preventDefault() console.log('Submit data check:', { file, formData, vacancyId }) if (!file) { console.log('No file selected') return } if (!formData.applicant_name || !formData.applicant_email) { console.log('Missing required fields:', { applicant_name: formData.applicant_name, applicant_email: formData.applicant_email }) return } const resumeData: ResumeCreate = { vacancy_id: vacancyId, applicant_name: formData.applicant_name, applicant_email: formData.applicant_email, applicant_phone: formData.applicant_phone || undefined, cover_letter: formData.cover_letter || undefined, resume_file: file, } console.log('Sending resume data:', resumeData) createResumeMutation.mutate(resumeData, { onSuccess: () => { setSuccess(true) // Reset form setFormData({ applicant_name: '', applicant_email: '', applicant_phone: '', cover_letter: '', }) setFile(null) if (onSuccess) { onSuccess() } } }) } if (isLoadingResumes) { return (
Проверяем ваши заявки...
) } if (success || hasExistingResume) { return (

{success ? 'Резюме успешно отправлено!' : 'Ваше резюме уже отправлено!'}

Готовим для вас сессию для собеседования. Мы свяжемся с вами в ближайшее время.

{hasExistingResume && existingResumes && (
{existingResumes.map((resume) => (
Отправлено: {new Date(resume.created_at).toLocaleDateString('ru-RU', { day: 'numeric', month: 'long', hour: '2-digit', minute: '2-digit' })} • Статус: {resume.status === 'pending' ? 'На рассмотрении' : resume.status === 'under_review' ? 'На проверке' : resume.status === 'interview_scheduled' ? 'Собеседование назначено' : resume.status === 'interviewed' ? 'Проведено собеседование' : resume.status === 'accepted' ? 'Принят' : resume.status === 'rejected' ? 'Отклонен' : resume.status}
))}
)}
) } return (

Откликнуться на вакансию

{vacancyTitle}

{/* Personal Information */}
{() => ( )}
{/* Cover Letter */}