From 34620d5a6477283b2e55e3dee2f4b5c559f56b2f Mon Sep 17 00:00:00 2001 From: maxim Date: Sun, 16 Mar 2025 22:18:32 +0300 Subject: [PATCH] fix `/media` route --- src/components/media/MediaFormUtils.tsx | 24 +++---- src/pages/media/create.tsx | 89 ++++++++++++++----------- src/pages/media/edit.tsx | 86 ++++++++++++------------ src/pages/media/show.tsx | 13 ++-- 4 files changed, 112 insertions(+), 100 deletions(-) diff --git a/src/components/media/MediaFormUtils.tsx b/src/components/media/MediaFormUtils.tsx index 0bf9005..7de9226 100644 --- a/src/components/media/MediaFormUtils.tsx +++ b/src/components/media/MediaFormUtils.tsx @@ -1,5 +1,5 @@ -import { useState } from 'react' -import { UseFormSetError, UseFormClearErrors, UseFormSetValue } from 'react-hook-form' +import {useState} from 'react' +import {UseFormSetError, UseFormClearErrors, UseFormSetValue} from 'react-hook-form' export const ALLOWED_IMAGE_TYPES = ['image/jpeg', 'image/png', 'image/gif', 'image/webp'] export const ALLOWED_VIDEO_TYPES = ['video/mp4', 'video/webm', 'video/ogg'] @@ -23,12 +23,7 @@ type UseMediaFileUploadProps = { setValue: UseFormSetValue } -export const useMediaFileUpload = ({ - selectedMediaType, - setError, - clearErrors, - setValue, -}: UseMediaFileUploadProps) => { +export const useMediaFileUpload = ({selectedMediaType, setError, clearErrors, setValue}: UseMediaFileUploadProps) => { const [selectedFile, setSelectedFile] = useState(null) const [previewUrl, setPreviewUrl] = useState(null) @@ -39,7 +34,7 @@ export const useMediaFileUpload = ({ if (selectedMediaType) { const error = validateFileType(file, selectedMediaType) if (error) { - setError('file', { type: 'manual', message: error }) + setError('file', {type: 'manual', message: error}) event.target.value = '' return } @@ -57,14 +52,13 @@ export const useMediaFileUpload = ({ } } - const handleMediaTypeChange = (event: any) => { - const newMediaType = event.target.value - setValue('media_type', newMediaType) + const handleMediaTypeChange = (newMediaType: number | null) => { + setValue('media_type', newMediaType || null) - if (selectedFile) { + if (selectedFile && newMediaType) { const error = validateFileType(selectedFile, newMediaType) if (error) { - setError('file', { type: 'manual', message: error }) + setError('file', {type: 'manual', message: error}) setValue('file', null) setSelectedFile(null) setPreviewUrl(null) @@ -82,4 +76,4 @@ export const useMediaFileUpload = ({ handleFileChange, handleMediaTypeChange, } -} \ No newline at end of file +} diff --git a/src/pages/media/create.tsx b/src/pages/media/create.tsx index 095663a..691fe18 100644 --- a/src/pages/media/create.tsx +++ b/src/pages/media/create.tsx @@ -1,22 +1,30 @@ -import {Box, TextField, Button, Typography, FormControl, InputLabel, Select, MenuItem} from '@mui/material' +import {Box, TextField, Button, Typography, Autocomplete} from '@mui/material' import {Create} from '@refinedev/mui' import {useForm} from '@refinedev/react-hook-form' +import {Controller} from 'react-hook-form' import {MEDIA_TYPES} from '../../lib/constants' import {ALLOWED_IMAGE_TYPES, ALLOWED_VIDEO_TYPES, useMediaFileUpload} from '../../components/media/MediaFormUtils' +type MediaFormValues = { + filename: string + media_type: number + file?: File +} + export const MediaCreate = () => { const { saveButtonProps, refineCore: {formLoading, onFinish}, register, + control, formState: {errors}, setValue, handleSubmit, watch, setError, clearErrors, - } = useForm({}) + } = useForm({}) const selectedMediaType = watch('media_type') @@ -44,6 +52,45 @@ export const MediaCreate = () => { }), }} > + ( + option.value === field.value) || null} + onChange={(_, value) => { + field.onChange(value?.value || null) + handleMediaTypeChange(value?.value || null) + }} + getOptionLabel={(item) => { + return item ? item.label : '' + }} + isOptionEqualToValue={(option, value) => { + return option.value === value?.value + }} + renderInput={(params) => } + /> + )} + /> + + + @@ -71,44 +118,6 @@ export const MediaCreate = () => { )} - - - Тип - - {errors.media_type && ( - - {(errors as any)?.media_type?.message} - - )} - - - ) diff --git a/src/pages/media/edit.tsx b/src/pages/media/edit.tsx index 2a79cf8..834e83f 100644 --- a/src/pages/media/edit.tsx +++ b/src/pages/media/edit.tsx @@ -1,8 +1,9 @@ -import {Box, TextField, Button, Typography, FormControl, InputLabel, Select, MenuItem} from '@mui/material' +import {Box, TextField, Button, Typography, Autocomplete} from '@mui/material' import {Edit} from '@refinedev/mui' import {useForm} from '@refinedev/react-hook-form' import {useEffect} from 'react' import {useShow} from '@refinedev/core' +import {Controller} from 'react-hook-form' import {MEDIA_TYPES} from '../../lib/constants' import {ALLOWED_IMAGE_TYPES, ALLOWED_VIDEO_TYPES, useMediaFileUpload} from '../../components/media/MediaFormUtils' @@ -24,6 +25,7 @@ export const MediaEdit = () => { watch, setError, clearErrors, + control, } = useForm({ defaultValues: { filename: '', @@ -68,7 +70,47 @@ export const MediaEdit = () => { }} > - + ( + option.value === field.value) || null} + onChange={(_, value) => { + field.onChange(value?.value || null) + handleMediaTypeChange(value?.value || null) + }} + getOptionLabel={(item) => { + return item ? item.label : '' + }} + isOptionEqualToValue={(option, value) => { + return option.value === value?.value + }} + renderInput={(params) => } + /> + )} + /> + + + +