Skip to content

Commit b92c970

Browse files
committed
Use a key that doesn't change to avoid re-render issues; closes pterodactyl#2203
1 parent 21a4ce8 commit b92c970

File tree

6 files changed

+12
-11
lines changed

6 files changed

+12
-11
lines changed

resources/scripts/api/server/files/loadDirectory.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import http from '@/api/http';
22
import { rawDataToFileObject } from '@/api/transformers';
33

44
export interface FileObject {
5-
uuid: string;
5+
key: string;
66
name: string;
77
mode: string;
88
size: number;

resources/scripts/api/transformers.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { Allocation } from '@/api/server/getServer';
22
import { FractalResponseData } from '@/api/http';
33
import { FileObject } from '@/api/server/files/loadDirectory';
4-
import v4 from 'uuid/v4';
54

65
export const rawDataToServerAllocation = (data: FractalResponseData): Allocation => ({
76
id: data.attributes.id,
@@ -13,7 +12,7 @@ export const rawDataToServerAllocation = (data: FractalResponseData): Allocation
1312
});
1413

1514
export const rawDataToFileObject = (data: FractalResponseData): FileObject => ({
16-
uuid: v4(),
15+
key: `${data.attributes.is_file ? 'file' : 'dir'}_${data.attributes.name}`,
1716
name: data.attributes.name,
1817
mode: data.attributes.mode,
1918
size: Number(data.attributes.size),

resources/scripts/components/server/files/FileDropdownMenu.tsx

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { useRef, useState } from 'react';
1+
import React, { memo, useRef, useState } from 'react';
22
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
33
import {
44
faBoxOpen,
@@ -29,6 +29,7 @@ import styled from 'styled-components/macro';
2929
import useEventListener from '@/plugins/useEventListener';
3030
import compressFiles from '@/api/server/files/compressFiles';
3131
import decompressFiles from '@/api/server/files/decompressFiles';
32+
import isEqual from 'react-fast-compare';
3233

3334
type ModalType = 'rename' | 'move';
3435

@@ -50,7 +51,7 @@ const Row = ({ icon, title, ...props }: RowProps) => (
5051
</StyledRow>
5152
);
5253

53-
export default ({ file }: { file: FileObject }) => {
54+
const FileDropdownMenu = ({ file }: { file: FileObject }) => {
5455
const onClickRef = useRef<DropdownMenu>(null);
5556
const [ showSpinner, setShowSpinner ] = useState(false);
5657
const [ modal, setModal ] = useState<ModalType | null>(null);
@@ -60,7 +61,7 @@ export default ({ file }: { file: FileObject }) => {
6061
const { clearAndAddHttpError, clearFlashes } = useFlash();
6162
const directory = ServerContext.useStoreState(state => state.files.directory);
6263

63-
useEventListener(`pterodactyl:files:ctx:${file.uuid}`, (e: CustomEvent) => {
64+
useEventListener(`pterodactyl:files:ctx:${file.key}`, (e: CustomEvent) => {
6465
if (onClickRef.current) {
6566
onClickRef.current.triggerMenu(e.detail);
6667
}
@@ -71,7 +72,7 @@ export default ({ file }: { file: FileObject }) => {
7172

7273
// For UI speed, immediately remove the file from the listing before calling the deletion function.
7374
// If the delete actually fails, we'll fetch the current directory contents again automatically.
74-
mutate(files => files.filter(f => f.uuid !== file.uuid), false);
75+
mutate(files => files.filter(f => f.key !== file.key), false);
7576

7677
deleteFiles(uuid, directory, [ file.name ]).catch(error => {
7778
mutate();
@@ -166,3 +167,5 @@ export default ({ file }: { file: FileObject }) => {
166167
</DropdownMenu>
167168
);
168169
};
170+
171+
export default memo(FileDropdownMenu, isEqual);

resources/scripts/components/server/files/FileManagerContainer.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ export default () => {
6565
}
6666
{
6767
sortFiles(files.slice(0, 250)).map(file => (
68-
<FileObjectRow key={file.uuid} file={file}/>
68+
<FileObjectRow key={file.key} file={file}/>
6969
))
7070
}
7171
<MassActionsBar/>

resources/scripts/components/server/files/FileObjectRow.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ const FileObjectRow = ({ file }: { file: FileObject }) => {
3939
key={file.name}
4040
onContextMenu={e => {
4141
e.preventDefault();
42-
window.dispatchEvent(new CustomEvent(`pterodactyl:files:ctx:${file.uuid}`, { detail: e.clientX }));
42+
window.dispatchEvent(new CustomEvent(`pterodactyl:files:ctx:${file.key}`, { detail: e.clientX }));
4343
}}
4444
>
4545
<SelectFileCheckbox name={file.name}/>

resources/scripts/components/server/files/NewDirectoryButton.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import Field from '@/components/elements/Field';
66
import { join } from 'path';
77
import { object, string } from 'yup';
88
import createDirectory from '@/api/server/files/createDirectory';
9-
import v4 from 'uuid/v4';
109
import tw from 'twin.macro';
1110
import Button from '@/components/elements/Button';
1211
import { mutate } from 'swr';
@@ -24,7 +23,7 @@ const schema = object().shape({
2423
});
2524

2625
const generateDirectoryData = (name: string): FileObject => ({
27-
uuid: v4(),
26+
key: `dir_${name}`,
2827
name: name,
2928
mode: '0644',
3029
size: 0,

0 commit comments

Comments
 (0)