@@ -16,6 +16,11 @@ import {
16
16
moveSense ,
17
17
orderSense ,
18
18
} from "goals/MergeDuplicates/Redux/MergeDupsActions" ;
19
+ import {
20
+ type CombineSenseMergePayload ,
21
+ type MoveSensePayload ,
22
+ type OrderSensePayload ,
23
+ } from "goals/MergeDuplicates/Redux/MergeDupsReduxTypes" ;
19
24
import { useAppDispatch , useAppSelector } from "rootRedux/hooks" ;
20
25
import { type StoreState } from "rootRedux/types" ;
21
26
import theme from "types/theme" ;
@@ -36,7 +41,10 @@ export default function MergeDragDrop(): ReactElement {
36
41
( state : StoreState ) => state . mergeDuplicateGoal . tree . words
37
42
) ;
38
43
39
- const [ senseToDelete , setSenseToDelete ] = useState < string > ( "" ) ;
44
+ const [ srcToDelete , setSrcToDelete ] = useState <
45
+ MergeTreeReference | undefined
46
+ > ( ) ;
47
+
40
48
const { t } = useTranslation ( ) ;
41
49
42
50
function handleDrop ( res : DropResult ) : void {
@@ -52,32 +60,27 @@ export default function MergeDragDrop(): ReactElement {
52
60
// Case 1a: Cannot delete a protected sense.
53
61
return ;
54
62
}
55
- setSenseToDelete ( res . draggableId ) ;
63
+ setSrcToDelete ( src ) ;
56
64
} else if ( res . combine ) {
57
65
// Case 2: the sense was dropped on another sense.
58
66
if ( src . isSenseProtected && ! src . order ) {
59
67
// Case 2a: Cannot merge a protected sense into another sense.
60
- if ( srcWordId !== res . combine . droppableId ) {
68
+ const destWordId = res . combine . droppableId ;
69
+ if ( srcWordId !== destWordId ) {
61
70
// The target sense is in a different word, so move instead of combine.
62
- dispatch (
63
- moveSense ( {
64
- src,
65
- destWordId : res . combine . droppableId ,
66
- destOrder : 0 ,
67
- } )
68
- ) ;
71
+ dispatch ( moveSense ( { destOrder : 0 , destWordId, src } ) ) ;
69
72
}
70
73
return ;
71
74
}
72
- const combineRef : MergeTreeReference = JSON . parse (
73
- res . combine . draggableId
74
- ) ;
75
- if ( combineRef . order !== undefined ) {
75
+ const dest : MergeTreeReference = JSON . parse ( res . combine . draggableId ) ;
76
+ if ( dest . order !== undefined ) {
76
77
// Case 2b: If the target is a sidebar sub-sense, it cannot receive a combine.
77
78
return ;
78
79
}
79
- dispatch ( combineSense ( { src, dest : combineRef } ) ) ;
80
+ const combinePayload : CombineSenseMergePayload = { dest, src } ;
81
+ dispatch ( combineSense ( combinePayload ) ) ;
80
82
} else if ( res . destination ) {
83
+ const destOrder = res . destination . index ;
81
84
const destWordId = res . destination . droppableId ;
82
85
// Case 3: The sense was dropped in a droppable.
83
86
if ( srcWordId !== destWordId ) {
@@ -87,27 +90,28 @@ export default function MergeDragDrop(): ReactElement {
87
90
return ;
88
91
}
89
92
// Move the sense to the dest MergeWord.
90
- dispatch (
91
- moveSense ( { src, destWordId, destOrder : res . destination . index } )
92
- ) ;
93
+ const movePayload : MoveSensePayload = { destOrder, destWordId, src } ;
94
+ dispatch ( moveSense ( movePayload ) ) ;
93
95
} else {
94
96
// Case 3b: The source & dest droppables are the same, so we reorder, not move.
95
- const destOrder = res . destination . index ;
96
97
if (
97
98
src . order === destOrder ||
98
99
( destOrder === 0 && src . order !== undefined && sidebarProtected )
99
100
) {
100
101
// If the sense wasn't moved or was moved within the sidebar above a protected sense, do nothing.
101
102
return ;
102
103
}
103
- dispatch ( orderSense ( { src, destOrder } ) ) ;
104
+ const orderPayload : OrderSensePayload = { destOrder, src } ;
105
+ dispatch ( orderSense ( orderPayload ) ) ;
104
106
}
105
107
}
106
108
}
107
109
108
- function performDelete ( ) : void {
109
- dispatch ( deleteSense ( JSON . parse ( senseToDelete ) ) ) ;
110
- setSenseToDelete ( "" ) ;
110
+ function onConfirmDelete ( ) : void {
111
+ if ( srcToDelete ) {
112
+ dispatch ( deleteSense ( srcToDelete ) ) ;
113
+ setSrcToDelete ( undefined ) ;
114
+ }
111
115
}
112
116
113
117
function renderSidebar ( ) : ReactElement {
@@ -170,10 +174,10 @@ export default function MergeDragDrop(): ReactElement {
170
174
</ ImageListItem >
171
175
{ renderSidebar ( ) }
172
176
< CancelConfirmDialog
173
- open = { ! ! senseToDelete }
177
+ open = { ! ! srcToDelete }
174
178
text = "mergeDups.helpText.deleteDialog"
175
- handleCancel = { ( ) => setSenseToDelete ( "" ) }
176
- handleConfirm = { performDelete }
179
+ handleCancel = { ( ) => setSrcToDelete ( undefined ) }
180
+ handleConfirm = { onConfirmDelete }
177
181
/>
178
182
</ ImageList >
179
183
</ Grid >
0 commit comments