μ€κ°κ³ μ¬ κΈ°κ° μ 보λ΄μ
¨λμ.. μ λͺ»λ³΄λμ΅λλ€. νν
λ€μ νκΈ°μ 무쑰건 κΈ°μμ¬μ λ€μ΄κ°κ² λ€λ μκ°μ λ€μ νλ² ν΄λ³΄λ©΄μ, μ΄λ²μ£Ό WILμ μ κ³ μμ΅λλ€.
μ€κ° ν΄μκΈ°κ°λμ μ§μμ§μνκ² νλ‘μ νΈλ₯Ό 건λλ €λ³΄μμ΅λλ€.
1. μ΄μ μ μμλ, λ°ν μνΈ κ΄λ ¨ λ¬Έμ
κ° TodoItemλ§λ€ μλ λ°ν μνΈλ₯Ό λ μμλ‘ μ¬λ €μ κ΄λ¦¬νλλ‘ νλ€. μ΄μ μ΄λ€ ν¬λμμ μ° λ°ν μνΈμΈμ§ λ°λ‘ μ μ μκΈ° λλ¬Έμ, μ νλ ν¬λλ₯Ό μ μμνλ‘ κ΄λ¦¬νλλ‘ νλ€.
useBottomSheet.tsx
import { useRecoilState } from 'recoil';
import { ITodoItem } from '../interfaces/ITodoItem';
import { bottomSheetState } from '../stores/bottomSheet';
function useBottomSheet(initial: boolean) {
const [bottomSheet, setBottomSheet] = useRecoilState(bottomSheetState);
const { isOpen, selectedItem } = bottomSheet;
function onOpen(item: ITodoItem) {
setBottomSheet({ selectedItem: item, isOpen: true });
}
function onDismiss() {
setBottomSheet({ selectedItem: null, isOpen: false });
}
return { isOpen, selectedItem, onOpen, onDismiss };
}
export default useBottomSheet;
μ΄λ¦Ό/λ«ν μνμ μ νλ ν¬λλ₯Ό 리μ½μΌ atomμΌλ‘ λ§λ€μ΄ κ΄λ¦¬νλ€. κ°λ¨κ°λ¨μ°.
2. Todo κ΄λ ¨ λ‘μ§ μΆμν
UIμ»΄ν¬λνΈμμ μ΅λν λΉμ¦λμ€ λ‘μ§μ λΆλ¦¬νκ³ , 컀μ€ν
ν
μ μ΄μ©ν΄ λ겨λ°μ μ¬μ©νλ€.
μ λ²μ£Ό μ€ν°λ μκ°μ 보μ¬λλ Έλ λ΄μ©μ΄μ£ ??
const useTodo = () => {
const [todo, setTodo] = useRecoilState(todoState);
const insertTodo = (inputValue: string, category: ICategory) => {
if (inputValue) {
const newTodo = {
label: inputValue,
id: uuid(),
isDone: false,
category: category,
};
setTodo((prev) => [...prev, newTodo]);
}
};
const editTodo = (inputValue: string, id: string) => {
if (inputValue) {
const index = todo.findIndex((v) => v.id === id);
const temp = [...todo];
temp[index] = { ...temp[index], label: inputValue };
setTodo(temp);
}
};
const toggleTodo = (id: string) => {
const index = todo.findIndex((v) => v.id === id);
const temp = [...todo];
temp[index] = { ...temp[index], isDone: !temp[index].isDone };
setTodo(temp);
};
const deleteTodo = (id: string) => {
setTodo(todo.filter((v) => v.id !== id));
};
return { insertTodo, editTodo, toggleTodo, deleteTodo };
};
export default useTodo;
ν¬λ μμ νκΈ° λ±μ ν¨μλ₯Ό 컀μ€ν
ν
μ ν΅ν΄ λ°μμ¬ μ μκ³ , ν¬λ μν(μμ ν ν¬λμ id) λν μ μμΌλ‘ κ΄λ¦¬λκΈ° λλ¬Έμ νλ‘μ νΈ μ΄λμμλΌλ μ¬μ©ν μ μλ€. ν¬λ μ»΄ν¬λνΈμ λ¨μ΄μ Έμλ λ°ν
μνΈ μ»΄ν¬λνΈμμ λ°μμ μ¬μ©νκΈ°μ μ’λ€.
3. μΉκ΅¬ λͺ©λ‘ (λ¬Έμμ΄μμ μ΄λͺ¨μ§ λ€λ£¨κΈ°)
λλ¦ κ³ λ―Όμ λ§μ΄ νλ€.
const initialState: IFriend[] = [
{
userId: 'user1',
name: 'π¬κ·μ§',
profileImage: '',
statusMessage: 'μ΄μ©λ€ κ°μ',
},
{
userId: 'user2',
name: 'μ μ§',
profileImage: 'https://i.ibb.co/MgmDcz1/1021805078815985664.webp',
statusMessage: 'μ£Όλμ΄ PMμ΄ λκΈ° μν λ
Έλ ₯',
},
{
userId: 'user3',
name: 'κΉν
μ€νΈ',
profileImage: '',
statusMessage: 'user3',
}
];
μΉκ΅¬ κ°μ²΄λ μ΄λ° νμμ΄λ€. νλ‘ν μ΄λ―Έμ§ λΆλΆμμ μκ°μ λ§μ΄ μΌλ€.
νλ‘νμ΄λ―Έμ§κ° μμ λλ ν΄λΉ μ΄λ―Έμ§λ₯Ό λΆλ¬μ λ°±κ·ΈλΌμ΄λλ‘ λ³΄μ¬μ£Όκ³ , μμλλ μ΄λ¦μ 첫κΈμλ₯Ό 보μ¬μ€λ€.
FriendsIcon.tsx
const ProfileImage = styled.div<{ friend: IFriend; selected: boolean }>`
position: relative;
width: 40px;
height: 40px;
border-radius: 50px;
background-color: ${({ theme }) => theme.palette.mono.gray_f5};
${({ friend }) => getImageStyle(friend)}
border: ${({ selected, theme }) =>
selected && `2px solid ${theme.palette.mono.gray_44}`}
`;
const getImageStyle = (friend: IFriend) => {
switch (friend.profileImage.length) {
case 0:
return css`
::after {
content: '${sliceFirstWord(friend.name)}';
position: absolute;
left: 50%;
top: 50%;
transform: translate3d(-50%, -50%, 0);
font-weight: 500;
}
`;
default:
return css`
background-image: url(${friend.profileImage});
background-size: 40px 40px;
background-position: center;
`;
}
};
νλ‘ν μ΄λ―Έμ§μ κ΄ν λΆλΆλ§ λ°λ‘ λΉΌμ λ£μ΄μ£Όμλ€. μ΄λ¦μ 첫κΈμλ₯Ό 보μ¬μ€ λλ after κ°μ μ νμλ₯Ό μ΄μ©νλ€.
μ΄ κ³Όμ μμ λ¬Έμ κ° νλ μμλ€. ν¬λλ©μ΄νΈμ μ΄λ¦μ 첫κΈμλ‘ μ΄λͺ¨μ§λ₯Ό μ°λ κ²½μ°κ° λ§μλ°, νλ‘ν μ΄λ―Έμ§μ μ΄λͺ¨μ§κ° λ€μ΄κ°λ©΄ κ½€ μ΄μλ€. 무μμ λ¬Έμμ΄μ 첫λ²μ§Έ μΈλ±μ€λ₯Ό κ°μ Έμ€λκΉ μ΄λͺ¨μ§κ° κΉ¨μ‘λ€. μ΄λͺ¨μ§λ μ λμ½λλ₯Ό μ°λλ°, λ¬Έμμ΄λ‘ μ²λ¦¬λ λ κΈΈμ΄κ° λ§ 2,3 μ΄λ κ² λμ€λλΌ.
sliceFirstWord
const sliceFirstWord = (string: string) => {
// https://avengersrhydon1121.tistory.com/268
if (
/^([\u2700-\u27BF]|[\uE000-\uF8FF]|\uD83C[\uDC00-\uDFFF]|\uD83D[\uDC00-\uDFFF]|[\u2011-\u26FF]|\uD83E[\uDD10-\uDDFF])/.test(
string,
)
) {
return string.slice(0, 2);
} else {
return string[0];
}
};
λ°μ λ¬Έμμ΄μ΄ μ΄λͺ¨μ§λ‘ μμνλ©΄ 0,1 μΈλ±μ€λ₯Ό 리ν΄νκ³ , μλλ©΄ 0λ²μ§Έ μΈλ±μ€λ§ 리ν΄νλλ‘ νλ€. μ κ·μμ μ¬μ©νλλ°, /^ / λ₯Ό ν΅ν΄ μ΄λ ν λ¬Έμλ‘ μμνλμ§ μ μ μλ€.