'use client' import { useState } from 'react' import { VacancyRead } from '@/types/api' import { useVacancies } from '@/hooks/useVacancy' import Link from 'next/link' import { Search, MapPin, Clock, Banknote, Plus } from 'lucide-react' import VacancyUploadForm from '@/components/VacancyUploadForm' export default function HomePage() { const [searchTerm, setSearchTerm] = useState('') const [showCreateForm, setShowCreateForm] = useState(false) const [searchParams, setSearchParams] = useState({ active_only: true, title: undefined as string | undefined, }) const { data: vacancies = [], isLoading, error, refetch } = useVacancies(searchParams) const handleSearch = (e: React.FormEvent) => { e.preventDefault() setSearchParams({ active_only: true, title: searchTerm || undefined, }) } const formatSalary = (vacancy: VacancyRead) => { if (!vacancy.salary_from && !vacancy.salary_to) return 'Зарплата не указана' const currency = vacancy.salary_currency === 'RUR' ? '₽' : vacancy.salary_currency if (vacancy.salary_from && vacancy.salary_to) { return `${vacancy.salary_from.toLocaleString()} - ${vacancy.salary_to.toLocaleString()} ${currency}` } if (vacancy.salary_from) { return `от ${vacancy.salary_from.toLocaleString()} ${currency}` } if (vacancy.salary_to) { return `до ${vacancy.salary_to.toLocaleString()} ${currency}` } } const getExperienceText = (experience: string) => { const mapping = { noExperience: 'Без опыта', between1And3: '1-3 года', between3And6: '3-6 лет', moreThan6: 'Более 6 лет' } return mapping[experience as keyof typeof mapping] || experience } const getEmploymentText = (employment: string) => { const mapping = { full: 'Полная занятость', part: 'Частичная занятость', project: 'Проектная работа', volunteer: 'Волонтерство', probation: 'Стажировка' } return mapping[employment as keyof typeof mapping] || employment } const formatNullableField = (value: string | null | undefined) => { if (!value || value === 'null') return 'Не указано' return value } const VacancyPlaceholder = () => (
) const getVacanciesWithPlaceholders = (vacancies: VacancyRead[]) => { const itemsPerRow = 3 const remainder = vacancies.length % itemsPerRow const placeholdersNeeded = remainder === 0 ? 0 : itemsPerRow - remainder const placeholders = Array(placeholdersNeeded).fill(null).map((_, index) => ({ id: `placeholder-${index}`, isPlaceholder: true })) return [...vacancies, ...placeholders] } if (isLoading) { return (
) } return (
{/* Header */}

Найдите работу мечты

Выберите понравившуюся вам вакансию, заполните форму и прикрепите резюме.
После недолговременной обработки вашего документа мы предоставим вам возможность подключится к сессии для собеседования, если ваше резюме удовлетворит вакансию.

{/* Search */}
setSearchTerm(e.target.value)} />
{/* Error */} {error && (

Не удалось загрузить вакансии

)} {/* Vacancies Grid */} {!error && vacancies.length > 0 && (
{getVacanciesWithPlaceholders(vacancies).map((item, index) => { if ('isPlaceholder' in item) { return } const vacancy = item as VacancyRead return (

{vacancy.title}

{vacancy.premium && ( Premium )}
{formatSalary(vacancy)}
{formatNullableField(vacancy.area_name)}
{getExperienceText(vacancy.experience)}

{formatNullableField(vacancy.company_name)}

{formatNullableField(vacancy.description)}

{getEmploymentText(vacancy.employment_type)} {new Date(vacancy.published_at || vacancy.created_at).toLocaleDateString('ru-RU')}
) })}
)} {/* Empty State */} {!error && !isLoading && vacancies.length === 0 && (

Вакансии не найдены

Попробуйте изменить параметры поиска или вернитесь позже

)} {/* Create Vacancy Button */} {!showCreateForm && (
)} {/* Create Vacancy Form */} {showCreateForm && (
)}
) }