diff --git a/.env b/.env index 6a84cba..0b4d543 100644 --- a/.env +++ b/.env @@ -1,4 +1,4 @@ VITE_TOKEN_NAME = 'admin_token' VITE_REFRESH_TOKEN_NAME = 'admin_refresh_token' -VITE_BASE_URL = 'https://api.danakcorp.com' -# VITE_BASE_URL = 'http://192.168.1.117:4000' \ No newline at end of file +# VITE_BASE_URL = 'https://api.danakcorp.com' +VITE_BASE_URL = 'http://192.168.1.117:4000' \ No newline at end of file diff --git a/src/config/Pages.ts b/src/config/Pages.ts index 341f8ad..fd667ef 100644 --- a/src/config/Pages.ts +++ b/src/config/Pages.ts @@ -16,6 +16,11 @@ export const Pages = { plan: "/services/plan/", review: "/services/reviews", }, + sliders: { + list: "/sliders/list", + create: "/sliders/create", + detail: "/sliders/detail/", + }, transactions: "/transactions", receipts: { index: "/receipts/list", diff --git a/src/langs/fa.json b/src/langs/fa.json index 370a8de..0708ee4 100644 --- a/src/langs/fa.json +++ b/src/langs/fa.json @@ -69,7 +69,23 @@ "setting": "تنظیمات", "logout": "خروج", "card": "حساب های بانکی", - "payments": "پرداخت ها" + "payments": "پرداخت ها", + "sliders": "اسلایدر" + }, + "slider": { + "new_slider": "اسلایدر جدید", + "submit": "ثبت اسلایدر", + "title": "عنوان", + "link": "لینک", + "description": "توضیحات", + "image": "تصویر", + "order": "ترتیب", + "isActive": "فعال / غیرفعال", + "image_required": "تصویر الزامی می باشد", + "list_slider": "لیست اسلایدر ها", + "submit_slider": "اسلایدر جدید", + "active": "فعال", + "inactive": "غیرفعال" }, "submenu": { "services_list": "لیست سرویس ها", diff --git a/src/pages/slider/Create.tsx b/src/pages/slider/Create.tsx new file mode 100644 index 0000000..a16c618 --- /dev/null +++ b/src/pages/slider/Create.tsx @@ -0,0 +1,141 @@ +import { useFormik } from 'formik' +import { FC, useState } from 'react' +import { useTranslation } from 'react-i18next' +import { CreateSliderType } from './types/SliderTypes' +import * as Yup from 'yup' +import Button from '../../components/Button' +import { useCreateSlider } from './hooks/useSliderData' +import { TickCircle } from 'iconsax-react' +import Input from '../../components/Input' +import Textarea from '../../components/Textarea' +import UploadBox from '../../components/UploadBox' +import SwitchComponent from '../../components/Switch' +import { toast } from 'react-toastify' +import { useSingleUpload } from '../service/hooks/useServiceData' +import { Pages } from '../../config/Pages' +import { useNavigate } from 'react-router-dom' +import { ErrorType } from '../../helpers/types' +const CreateSlider: FC = () => { + + const navigate = useNavigate() + const { t } = useTranslation('global') + const createSlider = useCreateSlider() + const singleUpload = useSingleUpload() + const [file, setFile] = useState(null) + const formik = useFormik({ + initialValues: { + title: '', + description: '', + imageUrl: '', + link: '', + order: 0, + isActive: true, + }, + validationSchema: Yup.object({ + title: Yup.string().required(t('errors.required')), + description: Yup.string().required(t('errors.required')), + link: Yup.string().required(t('errors.required')), + order: Yup.number().required(t('errors.required')), + }), + onSubmit: async (values) => { + if (!file) { + toast.error(t('slider.image_required')) + return + } + + const formData = new FormData() + formData.append('file', file) + await singleUpload.mutateAsync(formData, { + onSuccess: (data) => { + values.imageUrl = data?.data?.url + } + }) + + values.order = +values.order + + createSlider.mutate(values, { + onSuccess: () => { + toast.success(t('slider.slider_created')) + navigate(Pages.sliders.list) + }, + onError: (error: ErrorType) => { + toast.error(error.response?.data?.error.message[0]) + } + }) + } + }) + + return ( +
+
+
+ {t('slider.new_slider')} +
+ +
+
+
+
+ + + +
+ +
+