From 34d8fd8323e59a4cd92f1ab8c7daccc9da79acea Mon Sep 17 00:00:00 2001
From: Albin Henriksson <albhe428@student.liu.se>
Date: Sun, 2 May 2021 08:52:34 +0200
Subject: [PATCH] Remake front-end code for moving slides

---
 .../PresentationEditorPage.tsx                | 73 +++++++------------
 1 file changed, 26 insertions(+), 47 deletions(-)

diff --git a/client/src/pages/presentationEditor/PresentationEditorPage.tsx b/client/src/pages/presentationEditor/PresentationEditorPage.tsx
index 0fb7a72f..caaaba46 100644
--- a/client/src/pages/presentationEditor/PresentationEditorPage.tsx
+++ b/client/src/pages/presentationEditor/PresentationEditorPage.tsx
@@ -51,7 +51,7 @@ interface CompetitionParams {
 const PresentationEditorPage: React.FC = () => {
   const { competitionId }: CompetitionParams = useParams()
   const dispatch = useAppDispatch()
-  const [slides, setSlides] = useState<RichSlide[]>([])
+  const [sortedSlides, setSortedSlides] = useState<RichSlide[]>([])
   const activeSlideId = useAppSelector((state) => state.editor.activeSlideId)
   const activeViewTypeId = useAppSelector((state) => state.editor.activeViewTypeId)
   const competition = useAppSelector((state) => state.editor.competition)
@@ -63,7 +63,7 @@ const PresentationEditorPage: React.FC = () => {
   }, [])
 
   useEffect(() => {
-    setSlides(competition.slides)
+    setSortedSlides(competition.slides.sort((a, b) => (a.order > b.order ? 1 : -1)))
   }, [competition])
 
   const setActiveSlideId = (id: number) => {
@@ -122,30 +122,11 @@ const PresentationEditorPage: React.FC = () => {
       return
     }
     const draggedIndex = result.source.index
-    const draggedSlideId = slides.find((slide) => slide.order === draggedIndex)?.id
-    const slidesCopy = slides
-    const diff = result.destination.index - result.source.index
-    slides.map((slide) => {
-      if (slide.order === draggedIndex && result.destination) {
-        slide.order = result.destination.index
-      } else if (
-        result.destination &&
-        diff > 0 &&
-        slide.order > result.source.index &&
-        slide.order <= result.destination.index
-      ) {
-        slide.order = slide.order - 1
-      } else if (
-        result.destination &&
-        diff < 0 &&
-        slide.order < result.source.index &&
-        slide.order >= result.destination.index
-      ) {
-        slide.order = slide.order + 1
-      }
-    })
-    setSlides(slidesCopy)
-
+    const draggedSlideId = sortedSlides.find((slide) => slide.order === draggedIndex)?.id
+    const slidesCopy = [...sortedSlides]
+    const [removed] = slidesCopy.splice(draggedIndex, 1)
+    slidesCopy.splice(result.destination.index, 0, removed)
+    setSortedSlides(slidesCopy)
     if (draggedSlideId) {
       await axios
         .put(`/api/competitions/${competitionId}/slides/${draggedSlideId}/order`, { order: result.destination.index })
@@ -190,27 +171,25 @@ const PresentationEditorPage: React.FC = () => {
               <Droppable droppableId="droppable">
                 {(provided) => (
                   <div ref={provided.innerRef} {...provided.droppableProps}>
-                    {slides
-                      .sort((a, b) => (a.order > b.order ? 1 : -1))
-                      .map((slide, index) => (
-                        <Draggable key={slide.id} draggableId={slide.id.toString()} index={index}>
-                          {(provided, snapshot) => (
-                            <div ref={provided.innerRef} {...provided.draggableProps} {...provided.dragHandleProps}>
-                              <SlideListItem
-                                divider
-                                key={slide.order}
-                                button
-                                selected={slide.id === activeSlideId}
-                                onClick={() => setActiveSlideId(slide.id)}
-                                onContextMenu={(event) => handleRightClick(event, slide.id)}
-                              >
-                                {renderSlideIcon(slide)}
-                                <ListItemText primary={`Sida ${slide.id}`} />
-                              </SlideListItem>
-                            </div>
-                          )}
-                        </Draggable>
-                      ))}
+                    {sortedSlides.map((slide, index) => (
+                      <Draggable key={slide.id} draggableId={slide.id.toString()} index={index}>
+                        {(provided, snapshot) => (
+                          <div ref={provided.innerRef} {...provided.draggableProps} {...provided.dragHandleProps}>
+                            <SlideListItem
+                              divider
+                              key={slide.order}
+                              button
+                              selected={slide.id === activeSlideId}
+                              onClick={() => setActiveSlideId(slide.id)}
+                              onContextMenu={(event) => handleRightClick(event, slide.id)}
+                            >
+                              {renderSlideIcon(slide)}
+                              <ListItemText primary={`Sida ${slide.id}`} />
+                            </SlideListItem>
+                          </div>
+                        )}
+                      </Draggable>
+                    ))}
                     {provided.placeholder}
                   </div>
                 )}
-- 
GitLab