80 lines
2.4 KiB
TypeScript
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)
|
|
} |