From 37ed9bc074d24e380aba8593f9c2f25d50b8ea64 Mon Sep 17 00:00:00 2001 From: hamid zarghami Date: Sun, 12 Oct 2025 14:45:30 +0330 Subject: [PATCH] learning --- src/config/Pages.ts | 2 + src/pages/seller/CreateLearning.tsx | 162 +++++++++++++++ src/pages/seller/Learning.tsx | 90 +++++++++ src/pages/seller/UpdateLearning.tsx | 188 ++++++++++++++++++ .../seller/components/LearningTableRow.tsx | 88 ++++++++ src/pages/seller/hooks/useSellerData.ts | 20 +- src/pages/seller/service/SellerService.ts | 13 +- src/pages/seller/types/Types.ts | 20 ++ src/router/Main.tsx | 7 +- 9 files changed, 587 insertions(+), 3 deletions(-) create mode 100644 src/pages/seller/CreateLearning.tsx create mode 100644 src/pages/seller/Learning.tsx create mode 100644 src/pages/seller/UpdateLearning.tsx create mode 100644 src/pages/seller/components/LearningTableRow.tsx diff --git a/src/config/Pages.ts b/src/config/Pages.ts index 0d63f49..888cd56 100644 --- a/src/config/Pages.ts +++ b/src/config/Pages.ts @@ -202,5 +202,7 @@ export const Pages = { requestCreateProduct: "/sellers/request-create-product", learningCategory: "/sellers/learning-category", learning: "/sellers/learning", + learningCreate: "/sellers/learning/create", + learningUpdate: "/sellers/learning/update/", }, }; diff --git a/src/pages/seller/CreateLearning.tsx b/src/pages/seller/CreateLearning.tsx new file mode 100644 index 0000000..c633dc7 --- /dev/null +++ b/src/pages/seller/CreateLearning.tsx @@ -0,0 +1,162 @@ +import { type FC, useState } from 'react' +import { useFormik } from 'formik' +import { type CreateLearningType } from './types/Types' +import * as Yup from 'yup' +import { useCreateLearning, useGetLearningCategory } from './hooks/useSellerData' +import { useNavigate } from 'react-router-dom' +import Input from '../../components/Input' +import Select from '../../components/Select' +import Textarea from '../../components/Textarea' +import Button from '../../components/Button' +import { TickCircle } from 'iconsax-react' +import { useUploadSingle } from '../uploader/hooks/useUploaderData' +import UploadBoxDraggble from '@/components/UploadBoxDraggble' +import { toast } from 'react-toastify' +import { extractErrorMessage } from '@/helpers/utils' +import { Pages } from '@/config/Pages' + +const CreateLearning: FC = () => { + const navigate = useNavigate() + const { data: categoriesData } = useGetLearningCategory() + const uploadSingle = useUploadSingle() + const createLearningMutation = useCreateLearning() + + const [videoFile, setVideoFile] = useState([]) + const [coverFile, setCoverFile] = useState([]) + + const formik = useFormik({ + initialValues: { + title: '', + description: '', + videoUrl: '', + cover: '', + category: '' + }, + validationSchema: Yup.object({ + title: Yup.string().required('عنوان یادگیری الزامی است'), + description: Yup.string().required('توضیحات یادگیری الزامی است'), + category: Yup.string().required('دسته‌بندی یادگیری الزامی است') + }), + onSubmit: async (values) => { + let videoUrl = values.videoUrl + let coverUrl = values.cover + + if (videoFile.length > 0) { + const videoResponse = await uploadSingle.mutateAsync(videoFile[0]) + videoUrl = videoResponse.results?.url?.url || '' + } + + if (coverFile.length > 0) { + const coverResponse = await uploadSingle.mutateAsync(coverFile[0]) + coverUrl = coverResponse.results?.url?.url || '' + } + + const submitData = { + ...values, + videoUrl, + cover: coverUrl + } + + createLearningMutation.mutate(submitData, { + onSuccess: () => { + toast.success('یادگیری با موفقیت ایجاد شد') + navigate(Pages.sellers.learning) + }, + onError: (error) => { + toast.error(extractErrorMessage(error)) + } + }) + }, + }) + + const categories = categoriesData?.results?.learningCategory || [] + const categoryOptions = categories.map(category => ({ + value: category._id, + label: category.title + })) + + console.log(formik.errors); + + + return ( +
+
+
+

ساخت یادگیری جدید

+
+
+ +
+
+ +
+ {/* اطلاعات اصلی */} +
+

اطلاعات اصلی

+ +
+ + +