히치키치

typescript-todo : ListScreen & FocusScreen 작성 본문

typescript-todo

typescript-todo : ListScreen & FocusScreen 작성

히치키치 2022. 8. 12. 19:37

💙 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;
Comments