diff --git a/src/components/UploadBox.tsx b/src/components/UploadBox.tsx index ceb1d74..95b6eb5 100644 --- a/src/components/UploadBox.tsx +++ b/src/components/UploadBox.tsx @@ -9,6 +9,7 @@ type Props = { isMultiple?: boolean, onChange?: (file: File[]) => void; isReset?: boolean; + accept?: string; } const UploadBox: FC = (props: Props) => { @@ -32,7 +33,10 @@ const UploadBox: FC = (props: Props) => { } // eslint-disable-next-line react-hooks/exhaustive-deps }, [files]) - const { getRootProps, getInputProps } = useDropzone({ onDrop }) + const { getRootProps, getInputProps } = useDropzone({ + onDrop, + accept: props.accept ? { [props.accept]: [] } : undefined + }) const handleRemove = (index: number) => { const array = [...files] diff --git a/src/langs/fa.json b/src/langs/fa.json index 3c61af0..a19c6a3 100644 --- a/src/langs/fa.json +++ b/src/langs/fa.json @@ -851,7 +851,10 @@ "add_new_icon": "افزودن آیکون", "name": "نام", "icons_count": "تعداد آیکون ها", - "created_at": "تاریخ ایجاد" + "created_at": "تاریخ ایجاد", + "url": "آدرس", + "group": "گروه", + "select_group": "انتخاب گروه" }, "cancel": "لغو" } diff --git a/src/pages/icon/List.tsx b/src/pages/icon/List.tsx index e7c57d5..30fceb3 100644 --- a/src/pages/icon/List.tsx +++ b/src/pages/icon/List.tsx @@ -3,12 +3,13 @@ import { useGetIcons } from './hooks/useIconData' import { useTranslation } from 'react-i18next' import Button from '../../components/Button' import { Add } from 'iconsax-react' +import CreateIcon from './components/CreateIcon' const IconsList: FC = () => { const { t } = useTranslation('global') const [showModal, setShowModal] = useState(false) - const { data: icons, isLoading, refetch } = useGetIcons() + const { refetch } = useGetIcons() const handleCloseModal = () => { setShowModal(false) @@ -35,6 +36,10 @@ const IconsList: FC = () => { + ) } diff --git a/src/pages/icon/components/CreateIcon.tsx b/src/pages/icon/components/CreateIcon.tsx new file mode 100644 index 0000000..27d9a51 --- /dev/null +++ b/src/pages/icon/components/CreateIcon.tsx @@ -0,0 +1,139 @@ +import { FC, useState } from 'react' +import { useTranslation } from 'react-i18next' +import Button from '../../../components/Button' +import DefaulModal from '../../../components/DefaulModal' +import UploadBox from '../../../components/UploadBox' +import Select from '../../../components/Select' +import { useFormik } from 'formik' +import * as Yup from 'yup' +import { toast } from 'react-toastify' +import { TickCircle } from 'iconsax-react' +import { useCreateIcon, useGetGroupIcons } from '../hooks/useIconData' +import { useSingleUpload } from '../../service/hooks/useServiceData' +import { CreateIconType, GroupIconType } from '../types/Types' +import { ErrorType } from '../../../helpers/types' + +interface CreateIconProps { + open: boolean + close: () => void + onSuccess?: () => void +} + +const CreateIcon: FC = ({ open, close, onSuccess }) => { + const { t } = useTranslation('global') + const [file, setFile] = useState() + const createIcon = useCreateIcon() + const singleUpload = useSingleUpload() + const { data: groupIcons } = useGetGroupIcons() + + const groups = (groupIcons as unknown as { data?: GroupIconType[] })?.data || [] + const groupOptions = groups.map((group: GroupIconType) => ({ + value: group.id, + label: group.name + })) + + const handleCreateIcon = (values: CreateIconType) => { + createIcon.mutate(values, { + onSuccess: () => { + formik.resetForm() + setFile(undefined) + close() + toast.success(t('success')) + onSuccess?.() + }, + onError: (error: ErrorType) => { + toast.error(error.response?.data?.error?.message[0]) + } + }) + } + + const formik = useFormik({ + initialValues: { + url: '', + groupId: '' + }, + validationSchema: Yup.object({ + groupId: Yup.string() + .required(t('errors.required')) + }), + onSubmit: async (values) => { + if (!file) { + toast.error(t('errors.required')) + return + } + const formData = new FormData() + formData.append('file', file) + await singleUpload.mutateAsync(formData, { + onSuccess: (data) => { + values.url = data?.data?.url + handleCreateIcon(values) + }, + onError: (error: ErrorType) => { + toast.error(error.response?.data?.error?.message[0]) + } + }) + } + }) + + const handleClose = () => { + formik.resetForm() + setFile(undefined) + close() + } + + return ( + +
+ setFile(files[0])} + isReset={!open} + accept="image/svg+xml" + /> + +
+