ai-hackaton-frontend/hooks/useVacancy.ts
2025-09-09 17:52:08 +05:00

80 lines
2.4 KiB
TypeScript

import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'
import { vacancyService } from '@/services/vacancy.service'
import { GetVacanciesParams } from '@/types/api'
import { useEffect, useRef } from 'react'
export const useVacancies = (params?: GetVacanciesParams) => {
return useQuery({
queryKey: ['vacancies', params],
queryFn: () => vacancyService.getVacancies(params),
staleTime: 0, // Данные сразу считаются устаревшими
refetchInterval: 5000, // Обновлять каждые 5 секунд
retry: 2,
})
}
export const useVacancy = (id: number) => {
return useQuery({
queryKey: ['vacancy', id],
queryFn: () => vacancyService.getVacancy(id),
enabled: !!id,
staleTime: 10 * 60 * 1000, // 10 minutes
retry: 2,
})
}
export const useParseVacancyFile = () => {
const mutation = useMutation({
mutationFn: ({ file, createVacancy }: { file: File; createVacancy?: boolean }) =>
vacancyService.parseFileAsync(file, createVacancy),
onSuccess: (data) => {
// Показать toast уведомление
showToast('Задача парсинга запущена! Скоро вакансия появится в списке.')
},
})
return mutation
}
// Простая функция для показа toast без React компонента
const showToast = (message: string) => {
// Создать элемент toast
const toast = document.createElement('div')
toast.textContent = message
toast.style.cssText = `
position: fixed;
bottom: 40px;
right: 20px;
background: #10b981;
color: white;
padding: 12px 20px;
border-radius: 8px;
box-shadow: 0 10px 25px rgba(0, 0, 0, 0.1);
font-family: system-ui, -apple-system, sans-serif;
font-size: 14px;
z-index: 9999;
max-width: 300px;
word-wrap: break-word;
transition: opacity 0.3s ease, transform 0.3s ease;
transform: translateX(100%);
`
// Добавить в DOM
document.body.appendChild(toast)
// Анимация появления
setTimeout(() => {
toast.style.transform = 'translateX(0)'
}, 10)
// Удалить через 5 секунд
setTimeout(() => {
toast.style.opacity = '0'
toast.style.transform = 'translateX(100%)'
setTimeout(() => {
if (toast.parentNode) {
document.body.removeChild(toast)
}
}, 300)
}, 10000)
}