From ae7c8215626ea15b6d42ad0e3bd04bc140320075 Mon Sep 17 00:00:00 2001 From: Sergey Elpashev Date: Fri, 10 Jan 2025 16:02:21 +0300 Subject: [PATCH] Feat: edit tier level name --- src/App.tsx | 7 +++-- src/components/EditTierModal.tsx | 52 ++++++++++++++++++++++++++++++++ src/components/Tier.tsx | 12 ++++++-- src/store.ts | 4 +++ 4 files changed, 70 insertions(+), 5 deletions(-) create mode 100644 src/components/EditTierModal.tsx diff --git a/src/App.tsx b/src/App.tsx index b76c696..91d2087 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -2,6 +2,7 @@ import { DndContext, DragEndEvent } from '@dnd-kit/core'; import { useRef } from 'react'; import { useShallow } from 'zustand/shallow'; import './App.scss'; +import { EditTierModal } from './components/EditTierModal'; import { TierImage } from './components/Image'; import { Tier } from './components/Tier'; import { TierModal } from './components/TierModal'; @@ -41,11 +42,12 @@ const App = () => { color={tier_level.color} textColor={tier_level.textColor} name={tier_level.name} - key={tier_level.name} + id={tier_level.id} + key={tier_level.id ?? tier_level.name} /> ))} -
+
{images .filter(image => image.category === '') .map((image, index) => ( @@ -79,6 +81,7 @@ const App = () => { />
+ ); }; diff --git a/src/components/EditTierModal.tsx b/src/components/EditTierModal.tsx new file mode 100644 index 0000000..6225d24 --- /dev/null +++ b/src/components/EditTierModal.tsx @@ -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 ( +
{ + e.preventDefault(); + e.stopPropagation(); + setTierLevel(null); + }} + > +
{ + e.preventDefault(); + e.stopPropagation(); + }} + > + {tierLevel && ( +
+ setNewName(e.target.value)} + > + + +
+ )} +
+
+ ); +}; diff --git a/src/components/Tier.tsx b/src/components/Tier.tsx index 2f1b36c..87123f6 100644 --- a/src/components/Tier.tsx +++ b/src/components/Tier.tsx @@ -1,4 +1,5 @@ import EditIcon from '@mui/icons-material/Edit'; +import { useShallow } from 'zustand/shallow'; import useStore from '../store'; import { TierImage } from './Image'; import './Tier.scss'; @@ -9,10 +10,10 @@ export interface TierProps { textColor: string; id?: string; } -export const Tier = ({ color, name, textColor }: TierProps) => { +export const Tier = ({ color, name, textColor, id }: TierProps) => { let color_code = ''; let text_color_code = ''; - const tierImages = useStore(state => state.images); + const [tierImages, setEditingTierLevel] = useStore(useShallow(state => [state.images, state.setEditingTierLevel])); switch (color) { case 'green': color_code = '#00b894'; @@ -47,7 +48,12 @@ export const Tier = ({ color, name, textColor }: TierProps) => { backgroundColor: color_code, }} > -

{name}

diff --git a/src/store.ts b/src/store.ts index 37ec246..f120236 100644 --- a/src/store.ts +++ b/src/store.ts @@ -14,6 +14,8 @@ interface tierStore { tierLevels: TierProps[]; addTierLevel: (name: string, color: string, textColor: string) => void; editTierLevelName: (id: string, name: string) => void; + editingTierLevel: TierProps | null; + setEditingTierLevel: (level: TierProps | null) => void; } const useStore = create( @@ -43,6 +45,8 @@ const useStore = create( set(state => ({ tierLevels: [...state.tierLevels, generateTierLevel(name, color, textColor)] })), editTierLevelName: (id: string, name: string) => set(state => ({ tierLevels: state.tierLevels.map(t => (t.id === id ? { ...t, name } : t)) })), + editingTierLevel: null, + setEditingTierLevel: (level: TierProps | null) => set({ editingTierLevel: level }), }), { name: 'tierStore' }, ),