Feat: start working on dragndrop

This commit is contained in:
2025-01-08 17:16:33 +03:00
parent 4c8bcf07b3
commit a74b499d83
4 changed files with 44 additions and 12 deletions

View File

@@ -69,7 +69,7 @@ function App() {
{images {images
.filter(image => image.category === '') .filter(image => image.category === '')
.map((image, index) => ( .map((image, index) => (
<TierImage image={image.url} name='test' key={index} /> <TierImage image={image} key={index} />
))} ))}
</div> </div>
<div className='border border-black w-20 text-center cursor-pointer' onClick={clickUpload}> <div className='border border-black w-20 text-center cursor-pointer' onClick={clickUpload}>

View File

@@ -1,14 +1,23 @@
import { tierImage } from '../store';
interface ImageProps { interface ImageProps {
image: string; image: tierImage;
name: string; onDragStart?: () => void;
} }
export const TierImage = ({ image, name }: ImageProps) => { export const TierImage = ({ image, onDragStart }: ImageProps) => {
return ( return (
<div className='flex flex-wrap justify-center gap-4 mr-1'> <div
className='flex flex-wrap justify-center gap-4 mr-1'
onDragStart={() => {
// e.preventDefault();
if (onDragStart) onDragStart();
}}
>
<div className={`w-[calc(20rem*.5625)] h-80 relative`}> <div className={`w-[calc(20rem*.5625)] h-80 relative`}>
<img src={image} alt={name} className='h-full w-full object-cover' /> <img src={image.url} alt={image.name} className='h-full w-full object-cover' />
<div className='w-full bg-slate-500 text-white bg-opacity-70 text-center bottom-0 left-0 absolute'>{name}</div> <div className='w-full bg-slate-500 text-white bg-opacity-70 text-center bottom-0 left-0 absolute'>
{image.name}
</div>
</div> </div>
</div> </div>
); );

View File

@@ -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'; import { TierImage } from './Image';
export interface TierProps { export interface TierProps {
@@ -10,6 +12,7 @@ export const Tier = ({ color, name, textColor }: TierProps) => {
let color_code = ''; let color_code = '';
let text_color_code = ''; let text_color_code = '';
const tierImages = useAppSelector(state => state.tierImages); const tierImages = useAppSelector(state => state.tierImages);
const dispatch = useAppDispatch();
switch (color) { switch (color) {
case 'green': case 'green':
color_code = '#00b894'; color_code = '#00b894';
@@ -30,9 +33,23 @@ export const Tier = ({ color, name, textColor }: TierProps) => {
default: default:
text_color_code = '#2d3436'; text_color_code = '#2d3436';
} }
const [currentDragImage, setCurrentDragImage] = useState<tierImage | null>(null);
const onDragStart = (image: tierImage) => {
setCurrentDragImage(image);
};
return ( return (
<> <>
<div className='w-full min-h-64 bg-[#2d3436] h-auto flex flex-row'> <div
className='w-full min-h-64 bg-[#2d3436] h-auto flex flex-row'
onDragEnd={() => {
// e.preventDefault();
if (currentDragImage) dispatch(changeTierImage(currentDragImage));
setCurrentDragImage(null);
}}
>
<div <div
className='w-52 h-80 flex items-center justify-center' className='w-52 h-80 flex items-center justify-center'
style={{ style={{
@@ -46,7 +63,7 @@ export const Tier = ({ color, name, textColor }: TierProps) => {
{tierImages {tierImages
.filter(image => image.category === name) .filter(image => image.category === name)
.map((image, index) => ( .map((image, index) => (
<TierImage image={image.url} name={image.name} key={index} /> <TierImage image={image} key={index} onDragStart={() => onDragStart(image)} />
))} ))}
</div> </div>
</div> </div>

View File

@@ -1,6 +1,6 @@
import { configureStore, createSlice, PayloadAction } from '@reduxjs/toolkit'; import { configureStore, createSlice, PayloadAction } from '@reduxjs/toolkit';
interface tierImage { export interface tierImage {
name: string; name: string;
url: string; url: string;
category: string; category: string;
@@ -16,10 +16,16 @@ const tierImages = createSlice({
removeTierImage: (state, action: PayloadAction<string>) => { removeTierImage: (state, action: PayloadAction<string>) => {
return state.filter(image => image.name !== action.payload); return state.filter(image => image.name !== action.payload);
}, },
changeTierImage: (state, action: PayloadAction<tierImage>) => {
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({ const store = configureStore({
reducer: { reducer: {