Files
danak-admin/src/pages/blog/BlogCategory.tsx
T
hamid zarghami 1990e73368
deploy to danak / build_and_deploy (push) Has been cancelled
permisisions
2026-07-26 08:59:39 +03:30

191 lines
9.5 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.
import { FC, useState } from 'react'
import { useTranslation } from 'react-i18next'
import Input from '../../components/Input'
import Td from '../../components/Td'
import SwitchComponent from '../../components/Switch'
import { TickCircle, Trash } from 'iconsax-react'
import "quill/dist/quill.snow.css";
import Button from '../../components/Button'
import { useCreateBlogCategory, useDeleteBlogCategory, useGetBlogCategories } from './hooks/useBlogData'
import { BlogCategoryType, CreateBlogCategoryType } from './types/BlogTypes'
import moment from 'moment-jalaali'
import { useFormik } from 'formik'
import * as Yup from 'yup'
import Textarea from '../../components/Textarea'
import UploadBoxDraggble from '../../components/UploadBoxDraggble'
import { useSingleUpload } from '../service/hooks/useServiceData'
import { toast } from '../../components/Toast';
import UpdateCategory from './components/UpdateCategory'
import { usePermissions } from '../../hooks/usePermissions'
const BlogCategory: FC = () => {
const { t } = useTranslation('global')
const getBlogCategories = useGetBlogCategories()
const [file, setFile] = useState<File>()
const singleUpload = useSingleUpload()
const createBlogCategory = useCreateBlogCategory()
const deleteBlogCategory = useDeleteBlogCategory()
const { canCreate, canUpdate, canDelete } = usePermissions()
const formik = useFormik<CreateBlogCategoryType>({
initialValues: {
title: '',
description: '',
iconUrl: '',
isActive: true
},
validationSchema: Yup.object({
title: Yup.string().required(t('errors.required')),
description: Yup.string().required(t('errors.required')),
}),
onSubmit: async (values) => {
if (!file) {
toast('فایل را انتخاب کنید', 'error')
return
}
const formData = new FormData()
formData.append('file', file)
await singleUpload.mutateAsync(formData, {
onSuccess: (data) => {
values.iconUrl = data.data.url
}
})
createBlogCategory.mutateAsync(values, {
onSuccess: () => {
toast('دسته بندی با موفقیت ثبت شد', 'success')
setFile(undefined)
formik.resetForm()
getBlogCategories.refetch()
}
})
}
})
return (
<div className='mt-4'>
<div className='flex justify-start items-center'>
<div>
{t('blog.blog_category')}
</div>
</div>
<div className='flex gap-6 xl:mt-8 mt-4'>
<div className='flex-1'>
<div className='bg-white min-h-[calc(100vh-245px)] mt-4 rounded-3xl'>
<div className='relative overflow-x-auto rounded-3xl w-full'>
<table className='w-full text-sm '>
<thead className='thead'>
<tr>
<Td text={''} />
<Td text={t('blog.blog_title')} />
<Td text={'توضیحات'} />
<Td text={t('blog.category')} />
<Td text={t('blog.shareDate')} />
<Td text={t('')} />
</tr>
</thead>
<tbody>
{
getBlogCategories.data?.data?.categories?.map((item: BlogCategoryType) => {
return (
<tr key={item.id} className='tr'>
<td>
<div className='flex justify-center'>
<img src={item.iconUrl} className='w-10' />
</div>
</td>
<Td text={item.title} />
<Td text={item.description} />
<Td text={t('')}>
<SwitchComponent
active={true}
onChange={() => { }}
/>
</Td>
<Td text={moment(item.createdAt).format('jYYYY/jMM/jDD')} />
<Td text={t('')}>
<div className='flex gap-2 items-center'>
{canUpdate('blog_categories') && (
<UpdateCategory id={item.id} />
)}
{canDelete('blog_categories') && (
<Trash size={20} color='red' onClick={() => {
deleteBlogCategory.mutateAsync(item.id, {
onSuccess: () => {
toast('دسته بندی با موفقیت حذف شد', 'success')
getBlogCategories.refetch()
}
})
}} />
)}
</div>
</Td>
</tr>
)
})
}
</tbody>
</table>
</div>
</div>
</div>
{canCreate('blog_categories') && (
<div className='relative bg-white min-h-[calc(100vh-185px)] w-sidebar xl:block hidden py-10 px-5 h-fit rounded-3xl'>
<p className='text-md'>{t('blog.add_category')}</p>
<div className='text-sm flex items-center justify-between mt-4'>
<p>
{t('blog.category_status')}
</p>
<div className='flex gap-1 text-xs items-center text-description'>
<div>
{t('ads.deactive')}
</div>
<SwitchComponent
active={formik.values.isActive}
onChange={(value) => formik.setFieldValue('isActive', value)}
/>
</div>
</div>
<div className='mt-6'>
<Input
label='عنوان'
{...formik.getFieldProps('title')}
error_text={formik.touched.title && formik.errors.title ? formik.errors.title : undefined}
/>
</div>
<div className='mt-6'>
<Textarea
label='توضیحات'
{...formik.getFieldProps('description')}
error_text={formik.touched.description && formik.errors.description ? formik.errors.description : undefined}
/>
</div>
<div className='mt-6'>
<UploadBoxDraggble
label='آپلود آیکون'
onChange={(file) => setFile(file[0])}
/>
</div>
<Button
className='w-[172px] absolute bottom-4 left-4'
onClick={() => formik.handleSubmit()}
isLoading={createBlogCategory.isPending || singleUpload.isPending}
>
<div className='flex gap-2 items-center'>
<TickCircle size={20} color='white' />
<div>
ذخیره
</div>
</div>
</Button>
</div>
)}
</div>
</div>
)
}
export default BlogCategory