Files
Tg-job/mtucijobsweb2/fsd/widgets/ViewVacansy/EditVacancy/EditVacancy.tsx

142 lines
4.1 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
'use client';
import { useRouter, useParams } from 'next/navigation';
import { useQuery, useMutation } from 'react-query';
import { Form, Input, Button, notification, Select, Spin } from 'antd';
import { ExtendedJobData, JobData } from '@/types/types';
import { useEffect } from 'react';
import { fetchJobById, updateJob } from '@/api/api';
import { Option } from 'antd/es/mentions';
import style from './EditVacancy.module.scss'
interface EditVacancyProps {
id: number;
}
const EditVacancy: React.FC<EditVacancyProps> = ({id}) => {
const router = useRouter();
const [form] = Form.useForm();
const { data, error, isLoading } = useQuery<ExtendedJobData>(
['job', id],
() => fetchJobById(Number(id)),
{
enabled: !!id,
}
);
useEffect(() => {
if (data) {
form.setFieldsValue({
Job_name: data.Job_name || '',
Year: data.Year || '',
Qualification: data.Qualification || false,
Time: data.Time || [''],
Soft_skills: data.Soft_skills || '',
Salary: data.Salary || 0,
Email: data.Email || '',
Archive: data.Archive || false,
Responsibilities: data.Responsibilities || '',
Hardskills: ['React', 'JavaScript'],
});
}
}, [data]);
const mutation = useMutation((updatedJob: JobData) => updateJob(Number(id), updatedJob), {
onSuccess: () => {
notification.success({
message: 'Обновление прошло успешно',
description: 'Вакансия была успешно обновлена.',
});
router.push('/view'); // Перенаправление обратно на страницу списка вакансий
},
onError: () => {
notification.error({
message: 'Не удалось выполнить обновление',
description: 'Произошла ошибка при обновлении вакансии.',
});
},
});
const onFinish = (values: JobData) => {
mutation.mutate({ ...values}); // Обновление данных вакансии
};
if (isLoading) return <Spin size='large' className={style.spin} />;
if (error) return <div>Error loading job data</div>;
return (
<div style={{ maxWidth: '600px', margin: 'auto', padding: '20px' }}>
<h2 className={style.text}>Редактировать вакансию</h2>
<Form form={form} layout='vertical' onFinish={onFinish}>
<Form.Item
name='Job_name'
label='Название должности'
rules={[{ required: true }]}
>
<Input />
</Form.Item>
<Form.Item name='Year' label='Курс' rules={[{ required: true }]}>
<Input />
</Form.Item>
<Form.Item
name='Qualification'
label='Квалификация'
valuePropName='checked'
>
<Input type='checkbox' />
</Form.Item>
<Form.Item name='Time' label='Занятость' rules={[{ required: true }]}>
<Input />
</Form.Item>
<Form.Item name='Soft_skills' label='Soft Skills'>
<Input />
</Form.Item>
<Form.Item name='Salary' label='Оклад' rules={[{ required: true }]}>
<Input type='number' />
</Form.Item>
<Form.Item name='Email' label='Email' rules={[{ required: true }]}>
<Input type='email' />
</Form.Item>
<Form.Item name='Archive' label='Archive' valuePropName='checked'>
<Input type='checkbox' />
</Form.Item>
<Form.Item name='Responsibilities' label='Обязанности'>
<Input />
</Form.Item>
<Form.Item
name='Hardskills'
label='Hardskills'
rules={[
{
required: true,
message: 'Пожалуйста, укажите свои профессиональные навыки!',
},
]}
>
<Select
mode='tags'
style={{ width: '100%' }}
placeholder='Выбрать hardskills'
>
<Option value='JavaScript'>JavaScript</Option>
<Option value='TypeScript'>TypeScript</Option>
<Option value='React'>React</Option>
</Select>
</Form.Item>
<Form.Item>
<Button type='primary' htmlType='submit' loading={mutation.isLoading} className={style.edit_btn}>
Сохранить изменения
</Button>
</Form.Item>
</Form>
</div>
);
};
export default EditVacancy;