From a74b499d836a10476aba775a212e19992edc2dd8 Mon Sep 17 00:00:00 2001 From: Sergey Elpashev Date: Wed, 8 Jan 2025 17:16:33 +0300 Subject: [PATCH] Feat: start working on dragndrop --- src/App.tsx | 2 +- src/components/Image.tsx | 21 +++++++++++++++------ src/components/Tier.tsx | 23 ++++++++++++++++++++--- src/store.ts | 10 ++++++++-- 4 files changed, 44 insertions(+), 12 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index a85fef6..2440422 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -69,7 +69,7 @@ function App() { {images .filter(image => image.category === '') .map((image, index) => ( - + ))}
diff --git a/src/components/Image.tsx b/src/components/Image.tsx index cb32811..6958a1c 100644 --- a/src/components/Image.tsx +++ b/src/components/Image.tsx @@ -1,14 +1,23 @@ +import { tierImage } from '../store'; interface ImageProps { - image: string; - name: string; + image: tierImage; + onDragStart?: () => void; } -export const TierImage = ({ image, name }: ImageProps) => { +export const TierImage = ({ image, onDragStart }: ImageProps) => { return ( -
+
{ + // e.preventDefault(); + if (onDragStart) onDragStart(); + }} + >
- {name} -
{name}
+ {image.name} +
+ {image.name} +
); diff --git a/src/components/Tier.tsx b/src/components/Tier.tsx index 63c5c2d..b96189d 100644 --- a/src/components/Tier.tsx +++ b/src/components/Tier.tsx @@ -1,4 +1,6 @@ -import { useAppSelector } from '../hooks'; +import { useState } from 'react'; +import { useAppDispatch, useAppSelector } from '../hooks'; +import { changeTierImage, tierImage } from '../store'; import { TierImage } from './Image'; export interface TierProps { @@ -10,6 +12,7 @@ export const Tier = ({ color, name, textColor }: TierProps) => { let color_code = ''; let text_color_code = ''; const tierImages = useAppSelector(state => state.tierImages); + const dispatch = useAppDispatch(); switch (color) { case 'green': color_code = '#00b894'; @@ -30,9 +33,23 @@ export const Tier = ({ color, name, textColor }: TierProps) => { default: text_color_code = '#2d3436'; } + + const [currentDragImage, setCurrentDragImage] = useState(null); + + const onDragStart = (image: tierImage) => { + setCurrentDragImage(image); + }; + return ( <> -
+
{ + // e.preventDefault(); + if (currentDragImage) dispatch(changeTierImage(currentDragImage)); + setCurrentDragImage(null); + }} + >
{ {tierImages .filter(image => image.category === name) .map((image, index) => ( - + onDragStart(image)} /> ))}
diff --git a/src/store.ts b/src/store.ts index 4c17dd7..6406849 100644 --- a/src/store.ts +++ b/src/store.ts @@ -1,6 +1,6 @@ import { configureStore, createSlice, PayloadAction } from '@reduxjs/toolkit'; -interface tierImage { +export interface tierImage { name: string; url: string; category: string; @@ -16,10 +16,16 @@ const tierImages = createSlice({ removeTierImage: (state, action: PayloadAction) => { return state.filter(image => image.name !== action.payload); }, + changeTierImage: (state, action: PayloadAction) => { + return state.map(image => { + if (image.name == action.payload.name) return action.payload; + return image; + }); + }, }, }); -export const { addTierImage, removeTierImage } = tierImages.actions; +export const { addTierImage, removeTierImage, changeTierImage } = tierImages.actions; const store = configureStore({ reducer: {