import { useCallback } from 'react' import { useParams } from 'react-router-dom' import { Button, FormControl, FormErrorMessage, Input, Modal, ModalBody, ModalCloseButton, ModalContent, ModalFooter, ModalHeader, ModalOverlay, } from '@chakra-ui/react' import { useSWRConfig } from 'swr' import { Field, FieldAttributes, FieldProps, Form, Formik, FormikHelpers, } from 'formik' import * as Yup from 'yup' import cx from 'classnames' import FileAPI, { List } from '@/client/api/file' import useFileListSearchParams from '@/hooks/use-file-list-params' import { useAppDispatch, useAppSelector } from '@/store/hook' import { renameModalDidClose } from '@/store/ui/files' type FormValues = { name: string } const FileRename = () => { const { mutate } = useSWRConfig() const dispatch = useAppDispatch() const { fileId } = useParams() const isModalOpen = useAppSelector( (state) => state.ui.files.isRenameModalOpen, ) const id = useAppSelector((state) => state.ui.files.selection[0]) const { data: file, mutate: mutateFile } = FileAPI.useGetById(id) const formSchema = Yup.object().shape({ name: Yup.string().required('Name is required').max(255), }) const fileListSearchParams = useFileListSearchParams() const handleSubmit = useCallback( async ( { name }: FormValues, { setSubmitting }: FormikHelpers, ) => { if (!file) { return } setSubmitting(true) try { await mutateFile(await FileAPI.rename(file.id, { name })) await mutate(`/files/${fileId}/list?${fileListSearchParams}`) setSubmitting(false) dispatch(renameModalDidClose()) } finally { setSubmitting(false) } }, [file, fileId, fileListSearchParams, dispatch, mutate, mutateFile], ) return ( dispatch(renameModalDidClose())} closeOnOverlayClick={false} > Rename File {({ errors, touched, isSubmitting }) => (
{({ field }: FieldAttributes) => ( {errors.name} )}
)}
) } export default FileRename