Feat: edit tier level name
This commit is contained in:
@@ -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>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
52
src/components/EditTierModal.tsx
Normal file
52
src/components/EditTierModal.tsx
Normal 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>
|
||||||
|
);
|
||||||
|
};
|
||||||
@@ -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>
|
||||||
|
|||||||
@@ -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' },
|
||||||
),
|
),
|
||||||
|
|||||||
Reference in New Issue
Block a user