Fix mutation of directory name with slashes in it; closes #2377

This commit is contained in:
Dane Everitt 2020-09-22 20:50:44 -07:00
parent 36eb04893d
commit 4bfc91a30e
No known key found for this signature in database
GPG key ID: EEA66103B3D71F53

View file

@ -1,4 +1,4 @@
import React, { useState } from 'react'; import React, { useEffect, useState } from 'react';
import Modal from '@/components/elements/Modal'; import Modal from '@/components/elements/Modal';
import { ServerContext } from '@/state/server'; import { ServerContext } from '@/state/server';
import { Form, Formik, FormikHelpers } from 'formik'; import { Form, Formik, FormikHelpers } from 'formik';
@ -12,6 +12,7 @@ import { FileObject } from '@/api/server/files/loadDirectory';
import useFlash from '@/plugins/useFlash'; import useFlash from '@/plugins/useFlash';
import useFileManagerSwr from '@/plugins/useFileManagerSwr'; import useFileManagerSwr from '@/plugins/useFileManagerSwr';
import { WithClassname } from '@/components/types'; import { WithClassname } from '@/components/types';
import FlashMessageRender from '@/components/FlashMessageRender';
interface Values { interface Values {
directoryName: string; directoryName: string;
@ -22,8 +23,8 @@ const schema = object().shape({
}); });
const generateDirectoryData = (name: string): FileObject => ({ const generateDirectoryData = (name: string): FileObject => ({
key: `dir_${name}`, key: `dir_${name.split('/', 1)[0] ?? name}`,
name: name, name: name.split('/', 1)[0] ?? name,
mode: '0644', mode: '0644',
size: 0, size: 0,
isFile: false, isFile: false,
@ -37,12 +38,20 @@ const generateDirectoryData = (name: string): FileObject => ({
export default ({ className }: WithClassname) => { export default ({ className }: WithClassname) => {
const uuid = ServerContext.useStoreState(state => state.server.data!.uuid); const uuid = ServerContext.useStoreState(state => state.server.data!.uuid);
const { clearAndAddHttpError } = useFlash(); const { clearFlashes, clearAndAddHttpError } = useFlash();
const [ visible, setVisible ] = useState(false); const [ visible, setVisible ] = useState(false);
const { mutate } = useFileManagerSwr(); const { mutate } = useFileManagerSwr();
const directory = ServerContext.useStoreState(state => state.files.directory); const directory = ServerContext.useStoreState(state => state.files.directory);
useEffect(() => {
if (visible) {
return () => {
clearFlashes('files:directory-modal');
};
}
}, [ visible ]);
const submit = ({ directoryName }: Values, { setSubmitting }: FormikHelpers<Values>) => { const submit = ({ directoryName }: Values, { setSubmitting }: FormikHelpers<Values>) => {
createDirectory(uuid, directory, directoryName) createDirectory(uuid, directory, directoryName)
.then(() => mutate(data => [ ...data, generateDirectoryData(directoryName) ], false)) .then(() => mutate(data => [ ...data, generateDirectoryData(directoryName) ], false))
@ -50,7 +59,7 @@ export default ({ className }: WithClassname) => {
.catch(error => { .catch(error => {
console.error(error); console.error(error);
setSubmitting(false); setSubmitting(false);
clearAndAddHttpError({ key: 'files', error }); clearAndAddHttpError({ key: 'files:directory-modal', error });
}); });
}; };
@ -71,6 +80,7 @@ export default ({ className }: WithClassname) => {
resetForm(); resetForm();
}} }}
> >
<FlashMessageRender key={'files:directory-modal'}/>
<Form css={tw`m-0`}> <Form css={tw`m-0`}>
<Field <Field
autoFocus autoFocus