diff --git a/src/app/jobs/components/Resume.tsx b/src/app/jobs/components/Resume.tsx index eeedf73..410a66e 100644 --- a/src/app/jobs/components/Resume.tsx +++ b/src/app/jobs/components/Resume.tsx @@ -44,7 +44,7 @@ const Resume: FC = ({ jobId }) => { const uploadFileMutation = useMutation({ mutationFn: api.uploadSingleFile, onSuccess: (data) => { - setValue('resumeUrl', data?.results?.url?.url) + setValue('resumeUrl', data?.results?.data?.url?.url) toast('فایل با موفقیت آپلود شد', 'success') }, onError: () => { diff --git a/src/app/jobs/types/Types.ts b/src/app/jobs/types/Types.ts index bb256b1..c0fd2cb 100644 --- a/src/app/jobs/types/Types.ts +++ b/src/app/jobs/types/Types.ts @@ -36,17 +36,20 @@ export type ResumeType = { }; export interface FileUrl { - originalname: string; size: number; url: string; type: string; } -export interface UploadResults { +export interface UploadData { message: string; url: FileUrl; } +export interface UploadResults { + data: UploadData; +} + export interface UploadResponse { status: number; success: boolean; diff --git a/src/app/profile/orders/[id]/return/components/ReturnConfirmation.tsx b/src/app/profile/orders/[id]/return/components/ReturnConfirmation.tsx index 83699ea..fbdebd4 100644 --- a/src/app/profile/orders/[id]/return/components/ReturnConfirmation.tsx +++ b/src/app/profile/orders/[id]/return/components/ReturnConfirmation.tsx @@ -9,8 +9,8 @@ interface ReturnConfirmationProps { quantities: { [key: string]: number } reason: string description: string - images: File[] - imagePreviewUrls: string[] + images: { [key: string]: File } + imagePreviewUrls: { [key: string]: string } returnReasons: Array<{ _id: string; title: string }> onSubmit: () => void onBack: () => void @@ -39,7 +39,7 @@ const ReturnConfirmation: React.FC = ({

محصولات انتخاب شده

{selectedItems.map((item) => ( -
+
= ({
+ {/* تصویر این آیتم */} + {imagePreviewUrls[item._id] && ( +
+
تصویر آپلود شده:
+ تصویر محصول +
+ )}
))} @@ -79,26 +92,6 @@ const ReturnConfirmation: React.FC = ({ - {/* تصاویر آپلود شده */} - {imagePreviewUrls.length > 0 && ( -
-

تصاویر آپلود شده

-
- {imagePreviewUrls.map((url, index) => ( -
- {`تصویر -
- ))} -
-
- )} - {/* اخطار */}
diff --git a/src/app/profile/orders/[id]/return/components/ReturnForm.tsx b/src/app/profile/orders/[id]/return/components/ReturnForm.tsx index fdc67ee..89bc24d 100644 --- a/src/app/profile/orders/[id]/return/components/ReturnForm.tsx +++ b/src/app/profile/orders/[id]/return/components/ReturnForm.tsx @@ -17,7 +17,7 @@ interface ReturnFormData { interface ReturnFormProps { selectedItems: ShipmentItemDetail[] - onSubmit: (data: { quantities: { [key: string]: number }; reason: string; description: string; images: File[] }) => void + onSubmit: (data: { quantities: { [key: string]: number }; reason: string; description: string; images: { [key: string]: File } }) => void onBack: () => void isLoading: boolean returnReasons: Array<{ _id: string; title: string }> @@ -47,9 +47,8 @@ const ReturnForm: React.FC = ({ isLoading, returnReasons }) => { - const [images, setImages] = useState([]) - const [imagePreviewUrls, setImagePreviewUrls] = useState([]) - const fileInputRef = useRef(null) + const [images, setImages] = useState<{ [key: string]: File }>({}) + const [imagePreviewUrls, setImagePreviewUrls] = useState<{ [key: string]: string }>({}) const { register, @@ -78,30 +77,33 @@ const ReturnForm: React.FC = ({ reset() } - const handleImageUpload = (event: React.ChangeEvent) => { - const files = Array.from(event.target.files || []) - const validFiles = files.filter(file => { - const isValidType = file.type === 'image/jpeg' || file.type === 'image/png' - const isValidSize = file.size <= 10 * 1024 * 1024 // 10MB - return isValidType && isValidSize - }) + const handleImageUpload = (itemId: string, event: React.ChangeEvent) => { + const file = event.target.files?.[0] + if (!file) return - if (validFiles.length !== files.length) { + const isValidType = file.type === 'image/jpeg' || file.type === 'image/png' + const isValidSize = file.size <= 10 * 1024 * 1024 // 10MB + + if (!isValidType || !isValidSize) { alert('فقط فایل‌های JPG و PNG با حداکثر حجم ۱۰ مگابایت مجاز هستند') + return } - const newImages = [...images, ...validFiles].slice(0, 5) // حداکثر ۵ عکس - setImages(newImages) - - const newPreviewUrls = newImages.map(file => URL.createObjectURL(file)) - setImagePreviewUrls(newPreviewUrls) + setImages(prev => ({ ...prev, [itemId]: file })) + setImagePreviewUrls(prev => ({ ...prev, [itemId]: URL.createObjectURL(file) })) } - const removeImage = (index: number) => { - const newImages = images.filter((_, i) => i !== index) - const newPreviewUrls = imagePreviewUrls.filter((_, i) => i !== index) - setImages(newImages) - setImagePreviewUrls(newPreviewUrls) + const removeImage = (itemId: string) => { + setImages(prev => { + const newImages = { ...prev } + delete newImages[itemId] + return newImages + }) + setImagePreviewUrls(prev => { + const newUrls = { ...prev } + delete newUrls[itemId] + return newUrls + }) } return ( @@ -110,12 +112,12 @@ const ReturnForm: React.FC = ({ {/* انتخاب تعداد مرجوعی برای هر آیتم */}
-

تعداد مرجوعی

+

تعداد مرجوعی و آپلود تصویر

{selectedItems.map((item) => { const availableQuantity = item.quantity - item.cancelled_quantity - item.returned_quantity return ( -
-
+
+
= ({ className='w-20 px-2 py-1 border rounded text-center' />
+ + {/* آپلود تصویر برای این آیتم */} +
+
+ تصویر محصول (JPG یا PNG، حداکثر ۱۰ مگابایت) +
+ {imagePreviewUrls[item._id] ? ( +
+ تصویر محصول + +
+ ) : ( +
+ handleImageUpload(item._id, e)} + className='hidden' + id={`file-${item._id}`} + /> + +
+ )} +
) })} @@ -178,60 +222,6 @@ const ReturnForm: React.FC = ({ )}
- {/* آپلود عکس */} -
-
آپلود عکس
-
- اگر ایراد کالا قابل مشاهده است به صورتی عکس بگیرید که مشخص باشد (با فرمت JPG یا PNG و هر عکس حداکثر ۱۰ مگابایت) -
- - {/* نمایش عکس‌های آپلود شده */} - {imagePreviewUrls.length > 0 && ( -
- {imagePreviewUrls.map((url, index) => ( -
- {`تصویر - -
- ))} -
- )} - - {/* دکمه آپلود */} - {images.length < 5 && ( -
- - -
- )} -
- {/* دکمه‌های عملیات */}