Feat: edit tier level name

This commit is contained in:
2025-01-10 16:02:21 +03:00
parent c30855beda
commit ae7c821562
4 changed files with 70 additions and 5 deletions

View File

@@ -2,6 +2,7 @@ import { DndContext, DragEndEvent } from '@dnd-kit/core';
import { useRef } from 'react'; import { useRef } from 'react';
import { useShallow } from 'zustand/shallow'; import { useShallow } from 'zustand/shallow';
import './App.scss'; import './App.scss';
import { EditTierModal } from './components/EditTierModal';
import { TierImage } from './components/Image'; import { TierImage } from './components/Image';
import { Tier } from './components/Tier'; import { Tier } from './components/Tier';
import { TierModal } from './components/TierModal'; import { TierModal } from './components/TierModal';
@@ -41,11 +42,12 @@ const App = () => {
color={tier_level.color} color={tier_level.color}
textColor={tier_level.textColor} textColor={tier_level.textColor}
name={tier_level.name} name={tier_level.name}
key={tier_level.name} id={tier_level.id}
key={tier_level.id ?? tier_level.name}
/> />
))} ))}
</div> </div>
<div className='flex flex-row w-full '> <div className='flex flex-row w-full gap-1 p-5'>
{images {images
.filter(image => image.category === '') .filter(image => image.category === '')
.map((image, index) => ( .map((image, index) => (
@@ -79,6 +81,7 @@ const App = () => {
/> />
</div> </div>
<TierModal /> <TierModal />
<EditTierModal />
</DndContext> </DndContext>
); );
}; };

View File

@@ -0,0 +1,52 @@
import { useEffect, useState } from 'react';
import { useShallow } from 'zustand/shallow';
import useStore from '../store';
export const EditTierModal = () => {
const [tierLevel, setTierLevel, editTierLevel] = useStore(
useShallow(state => [state.editingTierLevel, state.setEditingTierLevel, state.editTierLevelName]),
);
const [newName, setNewName] = useState('');
useEffect(() => {
if (tierLevel) setNewName(tierLevel.name);
}, [tierLevel]);
return (
<div
className={`top-0 left-0 w-screen h-screen z-50 bg-black bg-opacity-50 ${tierLevel ? 'fixed' : 'hidden'}`}
onClick={e => {
e.preventDefault();
e.stopPropagation();
setTierLevel(null);
}}
>
<div
className={`absolute top-[50%] left-[50%] translate-x-[-50%] translate-y-[-50%] flex w-2/5 h-1/4 bg-[#2d3436] ps-8 pe-8 pt-8 pb-8 z-50 rounded-3xl flex-row gap-4 justify-center items-center text-white border-white border-2`}
onClick={e => {
e.preventDefault();
e.stopPropagation();
}}
>
{tierLevel && (
<div className='flex flex-col gap-4 justify-start items-center'>
<input
type='text'
defaultValue={tierLevel.name}
placeholder='Tier Name'
className='text-black'
onChange={e => setNewName(e.target.value)}
></input>
<button
onClick={() => {
editTierLevel(tierLevel.id as string, newName);
setTierLevel(null);
}}
>
Save
</button>
<button onClick={() => setTierLevel(null)}>Cancel</button>
</div>
)}
</div>
</div>
);
};

View File

@@ -1,4 +1,5 @@
import EditIcon from '@mui/icons-material/Edit'; import EditIcon from '@mui/icons-material/Edit';
import { useShallow } from 'zustand/shallow';
import useStore from '../store'; import useStore from '../store';
import { TierImage } from './Image'; import { TierImage } from './Image';
import './Tier.scss'; import './Tier.scss';
@@ -9,10 +10,10 @@ export interface TierProps {
textColor: string; textColor: string;
id?: string; id?: string;
} }
export const Tier = ({ color, name, textColor }: TierProps) => { export const Tier = ({ color, name, textColor, id }: TierProps) => {
let color_code = ''; let color_code = '';
let text_color_code = ''; let text_color_code = '';
const tierImages = useStore(state => state.images); const [tierImages, setEditingTierLevel] = useStore(useShallow(state => [state.images, state.setEditingTierLevel]));
switch (color) { switch (color) {
case 'green': case 'green':
color_code = '#00b894'; color_code = '#00b894';
@@ -47,7 +48,12 @@ export const Tier = ({ color, name, textColor }: TierProps) => {
backgroundColor: color_code, backgroundColor: color_code,
}} }}
> >
<button className='absolute right-[5%] top-[5%] opacity-0 transition duration-250 ease-in-out'> <button
className='absolute right-[5%] top-[5%] opacity-0 transition duration-250 ease-in-out'
onClick={() => {
setEditingTierLevel({ name, color, textColor, id });
}}
>
<EditIcon /> <EditIcon />
</button> </button>
<p>{name}</p> <p>{name}</p>

View File

@@ -14,6 +14,8 @@ interface tierStore {
tierLevels: TierProps[]; tierLevels: TierProps[];
addTierLevel: (name: string, color: string, textColor: string) => void; addTierLevel: (name: string, color: string, textColor: string) => void;
editTierLevelName: (id: string, name: string) => void; editTierLevelName: (id: string, name: string) => void;
editingTierLevel: TierProps | null;
setEditingTierLevel: (level: TierProps | null) => void;
} }
const useStore = create( const useStore = create(
@@ -43,6 +45,8 @@ const useStore = create(
set(state => ({ tierLevels: [...state.tierLevels, generateTierLevel(name, color, textColor)] })), set(state => ({ tierLevels: [...state.tierLevels, generateTierLevel(name, color, textColor)] })),
editTierLevelName: (id: string, name: string) => editTierLevelName: (id: string, name: string) =>
set(state => ({ tierLevels: state.tierLevels.map(t => (t.id === id ? { ...t, name } : t)) })), set(state => ({ tierLevels: state.tierLevels.map(t => (t.id === id ? { ...t, name } : t)) })),
editingTierLevel: null,
setEditingTierLevel: (level: TierProps | null) => set({ editingTierLevel: level }),
}), }),
{ name: 'tierStore' }, { name: 'tierStore' },
), ),