From 69a8bbc77981045470f0bfcc551a60bf2be3c88c Mon Sep 17 00:00:00 2001 From: hamid zarghami Date: Sun, 22 Feb 2026 14:34:22 +0330 Subject: [PATCH] learning crud --- src/pages/learning/Category.tsx | 3 - src/pages/learning/Create.tsx | 77 ++---- src/pages/learning/List.tsx | 3 - .../learning/components/CreateCategory.tsx | 16 +- .../components/CreateLearningSidebar.tsx | 4 - src/pages/learning/hooks/useLearningData.ts | 242 ++---------------- src/pages/learning/service/LearningService.ts | 8 +- 7 files changed, 60 insertions(+), 293 deletions(-) diff --git a/src/pages/learning/Category.tsx b/src/pages/learning/Category.tsx index 1eee25b..9b60ee4 100644 --- a/src/pages/learning/Category.tsx +++ b/src/pages/learning/Category.tsx @@ -9,9 +9,6 @@ import CreateCategory from './components/CreateCategory' const LearningCategory: FC = () => { - - // const { t } = useTranslation('global') - const t = (key: string) => key; // Mock translation function const [page, setPage] = useState(1) const getCategory = useGetCategory() diff --git a/src/pages/learning/Create.tsx b/src/pages/learning/Create.tsx index 968a07a..80bae34 100644 --- a/src/pages/learning/Create.tsx +++ b/src/pages/learning/Create.tsx @@ -5,46 +5,25 @@ import { useFormik } from 'formik' import { type CategoryLearningType, type CreateLearningType } from './hooks/useLearningData' import * as Yup from 'yup' import { useCreateLearning, useGetCategory } from './hooks/useLearningData' -// import { useSingleUpload } from '../service/hooks/useServiceData' +import { useSingleUpload } from '@/pages/uploader/hooks/useUploader' import { TickCircle } from 'iconsax-react' import Input from '../../components/Input' +import UploadBox from '../../components/UploadBox' import Select from '../../components/Select' import Textarea from '../../components/Textarea' import DefaultTableSkeleton from '../../components/DefaultTableSkeleton' import CreateLearningSidebar from './components/CreateLearningSidebar' -// import { ErrorType } from '../../helpers/types' -// Define ErrorType inline since we're using static data -type ErrorType = { - response?: { - data?: { - error: { - message: string[]; - }; - }; - }; -}; import { toast } from 'react-toastify' import { useNavigate } from 'react-router-dom' import { Paths } from '../../config/Paths' +import { extractErrorMessage } from '@/config/func' const CreateLearning: FC = () => { const navigate = useNavigate() // const { t } = useTranslation('global') const t = (key: string) => key; // Mock translation function - // const singleUpload = useSingleUpload() - - // Mock upload hook - const singleUpload = { - mutateAsync: (formData: FormData) => { - return Promise.resolve({ - data: { - url: "/src/assets/images/new_order.png" // Mock URL - } - }); - }, - isPending: false - }; + const singleUpload = useSingleUpload() const createLearning = useCreateLearning() const getCategory = useGetCategory() @@ -67,44 +46,26 @@ const CreateLearning: FC = () => { categoryId: Yup.string().required(t('errors.required')) }), onSubmit: async (values) => { - return /* if (videoFile && coverFile) { - const formData = new FormData() - formData.append('file', videoFile) - await singleUpload.mutateAsync(formData, { - onSuccess: (data) => { - values.videoUrl = data?.data?.url - }, - onError: (error: ErrorType) => { - toast.error(error.response?.data?.error?.message[0]) - } - }) + const videoResult = await singleUpload.mutateAsync(videoFile) + values.videoUrl = videoResult?.data?.url ?? '' - const formDataCover = new FormData() - formDataCover.append('file', coverFile) - await singleUpload.mutateAsync(formDataCover, { - onSuccess: (data) => { - values.coverUrl = data?.data?.url - }, - onError: (error: ErrorType) => { - toast.error(error.response?.data?.error?.message[0]) - } - }) + const coverResult = await singleUpload.mutateAsync(coverFile) + values.coverUrl = coverResult?.data?.url ?? '' createLearning.mutate(values, { onSuccess: () => { toast.success('با موفقیت ثبت شد') navigate(Paths.learning.list) }, - onError: (error: ErrorType) => { - toast.error(error.response?.data?.error?.message[0]) + onError: (error) => { + toast.error(extractErrorMessage(error)) } }) } else { toast.error('لطفا ویدیو و کاور را انتخاب کنید') } - */ } }) @@ -146,6 +107,22 @@ const CreateLearning: FC = () => { error_text={formik.touched.title && formik.errors.title ? formik.errors.title : ''} /> +
+
+ setCoverFile(files[0])} + /> +
+
+ + setVideoFile(files[0])} + /> +
+
+