Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 파이썬
- background script
- 갓생
- 디스코드 봇
- 백준 7579
- Message Passing
- nodejs
- discord.js
- 2156
- 백준
- TypeScript
- C언어로 쉽게 풀어쓴 자료구조
- Chrome Extension
- 백준 #7568번 #파이썬 #동적계획법
- react
- 포도주시식
- 자료구조
- X
- 크롬 익스텐션
- popup
- 프로그래머스 #정수삼각형 #동적계획법
- webpack
- content script
- supabase
- 동적계획법
- 크롬 확장자
- 캠스터디
- 공부시간측정어플
Archives
- Today
- Total
히치키치
typescript-todo : ListScreen & FocusScreen 작성 본문
💙 ListScreen
type Props = {};
const ListScreen: React.FC<Props> = () => {
const { addTask, tasks, setTasks, updateTaskCompletion } = useTaskStore();
// 할 일 내용 작성을 위한 state
const [newTaskLabel, setNewTaskLabel] = useState('');
// 1. 할 일 작성
const handleNewTaskLabel = (event: ChangeEvent<HTMLInputElement>) => {
setNewTaskLabel(event.target.value);
};
// 1. 할 일 추가
const submitNewTaskLabel = (event: React.FormEvent<HTMLFormElement>) => {
event.preventDefault();
if (newTaskLabel !== '') { // 할 일 내용 입력값이 있는 경우
addTask({ label: newTaskLabel });
setNewTaskLabel('');
} else {
alert('Enter Todo');
}
};
// 2. 할 일 완료 체크
const handleTaskCompleteChange =
(task: Task) => (event: ChangeEvent<HTMLInputElement>) => {
updateTaskCompletion(task.id, event.target.checked);
};
// 3. 완료된 할 일 일괄 삭제
const handleClearClick = () => {
setTasks((tasks: Task[]) => tasks.filter((task) => !task.isComplete));
};
// 4. 할 일 삭제
const handleTaskDelete = (handledTask: Task) => () => {
setTasks((tasks: Task[]) =>
tasks.filter((task) => task.id !== handledTask.id)
);
};
return (
<StyledRoot>
<List>
{tasks.map((task: Task) => (
<ListItem key={task.id}>
<CheckBox
checked={task.isComplete}
onChange={handleTaskCompleteChange(task)}
/>
<Spacer width={24} />
{task.label}
<Spacer flex={1} />
<DeleteButton onClick={handleTaskDelete(task)}>
<DeleteIcon />
</DeleteButton>
</ListItem>
))}
</List>
<Spacer height={30} />
<form onSubmit={submitNewTaskLabel}>
<Input
placeholder="Add a task"
value={newTaskLabel}
onChange={handleNewTaskLabel}
/>
</form>
<Spacer height={45} />
<TextButton style={{ alignSelf: 'center' }} onClick={handleClearClick}>
{' '}
Clear Completed
</TextButton>
</StyledRoot>
);
};
💙 FocusScreen
type Props = {};
const FocusScreen: React.FC<Props> = () => {
const {
focusedTask: task,
updateTaskCompletion,
shuffleFocusedTask, // 2. 할 일 미완료 중 랜덤으로 골라 화면에 띄우기
} = useTaskStore();
// 1. 할 일 완료 체크
const handleMarkComplete = () => {
if (task) {
updateTaskCompletion(task.id, true);
}
};
return task ? (
<StyledRoot>
<Task>{task.label}</Task>
<Button onClick={handleMarkComplete}>Mark Completed</Button>
<Spacer height={45} />
<TextButton onClick={shuffleFocusedTask}>Skip Task</TextButton>
</StyledRoot>
) : (
<StyledRoot>No More Incomplete Task!!</StyledRoot>
);
};
export default FocusScreen;
'typescript-todo' 카테고리의 다른 글
typescript-todo : localStorage에 tasks 저장을 위한 훅 작성 (0) | 2022.08.12 |
---|---|
typescript-todo : createContext & useContext 작성 (0) | 2022.08.12 |
typescript-todo : 전역 상태관리 & Screen 구조, 함수 설계 (0) | 2022.08.12 |
typescript-todo : 요구사항/화면 구상 & 디렉토리 설정 & 기술스택 (0) | 2022.08.11 |
typescript-todo : types.ts 작성하여 할 일과 CRUD 타입 지정 (0) | 2022.08.11 |
Comments