Skip to content

Commit ad1080a

Browse files
committed
Fix DnD only moving one file to another folder
1 parent 8673e15 commit ad1080a

File tree

7 files changed

+30
-21
lines changed

7 files changed

+30
-21
lines changed

packages/chonky/src/action-definitions/essential.ts

+2-6
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import { reduxActions } from '../redux/reducers';
22
import {
33
getFileData,
44
getIsFileSelected,
5-
getSelectedFiles,
65
selectDisableSelection,
76
selectLastClickIndex,
87
selectParentFolder,
@@ -185,12 +184,9 @@ export const EssentialActions = {
185184
return;
186185
}
187186

188-
const selectedFiles = getSelectedFiles(
189-
getReduxState(),
190-
FileHelper.isDraggable
191-
);
187+
const { draggedFile, selectedFiles } = payload as EndDragNDropPayload;
192188
const droppedFiles =
193-
selectedFiles.length > 0 ? selectedFiles : [payload.draggedFile];
189+
selectedFiles.length > 0 ? selectedFiles : [draggedFile];
194190
reduxDispatch(
195191
thunkRequestFileAction(ChonkyActions.MoveFiles, {
196192
...payload,

packages/chonky/src/components/external/FolderChainButton.tsx

+4-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,10 @@ export interface FolderChainButtonProps {
2424
export const FolderChainButton: React.FC<FolderChainButtonProps> = React.memo(
2525
({ first, current, item }) => {
2626
const { file, disabled, onClick } = item;
27-
const { dndIsOver, dndCanDrop, drop } = useFileDrop(file, !!file && !current);
27+
const { dndIsOver, dndCanDrop, drop } = useFileDrop({
28+
file,
29+
forceDisableDrop: !!file && !current,
30+
});
2831
const dndState = useMemo<DndEntryState>(
2932
() => ({
3033
dndIsOver,

packages/chonky/src/components/file-list/DnDFileListDragLayer.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ export const DnDFileListDragLayer: React.FC<DnDFileListDragLayerProps> = () => {
6363
return null;
6464
}
6565

66-
const selectionSize = item.payload.selection.length;
66+
const selectionSize = item.payload.selectedFiles.length;
6767
return (
6868
<div style={layerStyles}>
6969
<div

packages/chonky/src/components/file-list/FileList.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ export const FileList: React.FC<FileListProps> = React.memo(() => {
2929
const viewConfig = useSelector(selectFileViewConfig);
3030

3131
const currentFolder = useSelector(selectCurrentFolder);
32-
const { dndCanDrop, drop } = useFileDrop(currentFolder);
32+
const { dndCanDrop, drop } = useFileDrop({ file: currentFolder });
3333

3434
const localClasses = useLocalStyles(dndCanDrop);
3535
const classes = useStyles(viewConfig);

packages/chonky/src/types/action-payloads.types.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ export interface StartDragNDropPayload {
2525
sourceInstanceId: string;
2626
source: Nullable<FileData>;
2727
draggedFile: FileData;
28-
selection: FileData[];
28+
selectedFiles: FileData[];
2929
}
3030

3131
export type EndDragNDropPayload = StartDragNDropPayload & {

packages/chonky/src/util/dnd.ts

+19-9
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ export const useFileDrag = (file: Nullable<FileData>) => {
3535
// We force non-null type below because by convention, if drag & drop for
3636
// this file was possible, it must have been non-null.
3737
draggedFile: fileRef.current!,
38-
selection: selectSelectedFiles(reduxState),
38+
selectedFiles: selectSelectedFiles(reduxState),
3939
};
4040
}, [store, fileRef]);
4141

@@ -104,7 +104,17 @@ export const useFileDrag = (file: Nullable<FileData>) => {
104104
return { dndIsDragging, drag };
105105
};
106106

107-
export const useFileDrop = (file: Nullable<FileData>, allowDrop: boolean = true) => {
107+
interface UseFileDropParams {
108+
file: Nullable<FileData>;
109+
forceDisableDrop?: boolean;
110+
includeChildrenDrops?: boolean;
111+
}
112+
113+
export const useFileDrop = ({
114+
file,
115+
forceDisableDrop,
116+
includeChildrenDrops,
117+
}: UseFileDropParams) => {
108118
const onDrop = useCallback(
109119
(item: ChonkyDndFileEntryItem, monitor) => {
110120
if (!monitor.canDrop()) return;
@@ -118,23 +128,23 @@ export const useFileDrop = (file: Nullable<FileData>, allowDrop: boolean = true)
118128
const canDrop = useCallback(
119129
(item: ChonkyDndFileEntryItem, monitor: DropTargetMonitor) => {
120130
if (
121-
!allowDrop ||
122-
!monitor.isOver({ shallow: true }) ||
123-
!FileHelper.isDroppable(file)
131+
forceDisableDrop ||
132+
!FileHelper.isDroppable(file) ||
133+
(!monitor.isOver({ shallow: true }) && !includeChildrenDrops)
124134
) {
125135
return false;
126136
}
127-
const { source, draggedFile, selection } = item.payload;
137+
const { source, draggedFile, selectedFiles } = item.payload;
128138

129-
const filesToCheck: FileData[] = [draggedFile, ...selection];
139+
const filesToCheck: FileData[] = [draggedFile, ...selectedFiles];
130140
if (source) filesToCheck.push(source);
131141
for (const currFile of filesToCheck) {
132142
if (file.id === currFile.id) return false;
133143
}
134144

135145
return true;
136146
},
137-
[allowDrop, file]
147+
[forceDisableDrop, file, includeChildrenDrops]
138148
);
139149
const collect = useCallback(
140150
(monitor) => ({
@@ -158,7 +168,7 @@ export const useFileDrop = (file: Nullable<FileData>, allowDrop: boolean = true)
158168

159169
export const useFileEntryDnD = (file: Nullable<FileData>) => {
160170
const { dndIsDragging, drag } = useFileDrag(file);
161-
const { dndIsOver, dndCanDrop, drop } = useFileDrop(file);
171+
const { dndIsOver, dndCanDrop, drop } = useFileDrop({ file });
162172
const dndState = useMemo<DndEntryState>(
163173
() => ({
164174
dndIsDragging,

packages/chonky/src/util/styles.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@ export const lightTheme = {
3939
cannotDropColor: 'red',
4040
canDropMask: 'rgba(180, 235, 180, 0.75)',
4141
cannotDropMask: 'rgba(235, 180, 180, 0.75)',
42-
fileListMaskOne: 'rgba(180, 235, 180, 0.15)',
43-
fileListMaskTwo: 'rgba(180, 235, 180, 0.25)',
42+
fileListMaskOne: 'rgba(180, 235, 180, 0.1)',
43+
fileListMaskTwo: 'rgba(180, 235, 180, 0.2)',
4444
},
4545

4646
dragLayer: {

0 commit comments

Comments
 (0)