2
respostas

formData vindo vazio

Não sei porquê, mas o formData na função editarTodo está vindo vazio.
Com isso, quando vai tentar salvar um Todo editado, a descrição fica vazia lá na página.

import { useEffect, useState } from 'react'
import TodoContext from './TodoContext'

const TODOS = 'todos'

export default function TodoProvider({ children }) {

    const savedTodos = localStorage.getItem(TODOS)


    const [todos, setTodos] = useState(savedTodos ? JSON.parse(savedTodos) : [
        {
            id: 1,
            description: "JSX e componentes",
            completed: false,
            createdAt: "2022-10-31"
        }
    ])
    const [selectedTodo, setselectedTodo] = useState(null)
    const [mostrarModal, setmostrarModal] = useState(false)

    useEffect(() => {
        localStorage.setItem(TODOS, JSON.stringify(todos))
    }, [todos])

    const abrirModalForm = (todo) => {
        // if (todo) {
        //     setselectedTodo(todo)
        // }

        setmostrarModal(true)
    }

    const fecharModalForm = () => {
        setmostrarModal(false)
        setselectedTodo(null)
    }


    const addTodo = (formData) => {
        const description = formData.get('item')

        setTodos(prevState => {

            const todo = {
                id: prevState.length + 1,
                description: description,
                competed: false,
                createdAt: new Date().toISOString()
            }

            return [...prevState, todo]
        })
    }

    const alternarTodoCompleted = (todo) => {
        setTodos(prevState => {
            return prevState.map(t => {
                if (t.id === todo.id) {
                    return {
                        ...t,
                        completed: !t.completed
                    }
                } else {
                    return t
                }
            }
            )
        })
    }

    const editarTodo = (formData) => {
        setTodos(prevState => {
            return prevState.map(t => {
                if (t.id === selectedTodo.id) {
                    return {
                        ...t,
                        description: formData.get('description')
                    }
                }
                return t
            })
        })
    }

    const removerTodo = (todo) => {
        setTodos(prevState => {
            return prevState.filter(t => {
                return t.id !== todo.id
            })
        }

        )
    }

    const mostrarModalEditar = (todo) => {
        setselectedTodo(todo)
        abrirModalForm()

    }

    return (
        <TodoContext
            value={{
                todos,
                addTodo,
                alternarTodoCompleted,
                removerTodo,
                mostrarModal,
                abrirModalForm,
                fecharModalForm,
                selectedTodo,
                mostrarModalEditar,
                editarTodo
            }}>
            {children}
        </TodoContext>
    )
}
2 respostas

Salve, Leonardo!

Consegue compartilhar o código do formulário em si, pra gente ver como tá?

Boa noite

Compartilhando o código do TodoForm, App.jsx e do Dialog também por via das dúvidas.

TodoForm

import './ToDoForm.style.css'

import {TextInput} from '../TextInput'
import {Button} from '../Button'
import {use} from 'react'
import  TodoContext from '../TodoProvider/TodoContext';

export function ToDoForm({ onSubmit, defaultValue }) {

    const { selectedTodo } = use(TodoContext)

    return (
        <form action={onSubmit}>
            <TextInput name="item" placeholder="Digite o item que deseja adicionar" defaultValue={selectedTodo?.description} required />
            <Button>
                Salvar item
            </Button>
        </form>
    )
}

Dialog

import { useEffect, useRef } from 'react';
import { IconClose } from '../icons/index';
import './dialog.style.css'

export function Dialog(props) {

    // Usa-se  useRef para pegar a referência do objeto dialogoRef depois que de renderizar a página.
    // Ele serve para refernciar um objeto DOM
    const dialogRef = useRef(null);

    useEffect(() => {
        if (props.isOpen) {
            OpenDialog()
        } else {
            CloseDialog()
        }
    }, [props.isOpen])

    useEffect(() => {
        const dialog = dialogRef.current
        dialog.addEventListener('close', props.onClose)

        return () => {
            dialog.removeEventListener('close', props.onClose)
        }
    }, [props.onClose])

    // "Show the dialog" button opens the dialog modally
    const OpenDialog = () => {
        dialogRef.current.showModal();
    };

    // "Close" button closes the dialog
    const CloseDialog = () => {
        dialogRef.current.close();
    };

    return (
        <>
            <dialog className='dialog' ref={dialogRef}>
                <div className='btn-close-wrapper'>
                    <button className='btn-close' autoFocus onClick={props.onClose}>
                        <IconClose />
                    </button>
                </div>
                <div className='body-modal'>
                    {props.children}
                </div>
            </dialog>
        </>
    )
}

App.jsx

function App() {

  const { todos, addTodo, mostrarModal, abrirModalForm, fecharModalForm, selectedTodo, editarTodo } = use(TodoContext)
  
  const handleFormSubmit = (formData) => {
    console.log(formData)
    if (selectedTodo) {
      console.log('Entrei no IF')
      editarTodo(formData)
    } else {
      console.log('Entrei no Else')
      addTodo(formData)
    }

    fecharModalForm()
  }


  return (
    <main>
      <Container>
        <Header>
          <Heading>
            <IconSchool /> Plano de estudos
          </Heading>
        </Header>
        <ChecklistsWrapper>

          <TodoGroup
            Heading='Para estudar'
            items={todos.filter(todo => !todo.completed)}
          />

          <TodoGroup
            heading='Concluído'
            items={todos.filter(todo => todo.completed)}
          />

          <Footer>
            <Dialog isOpen={mostrarModal} onClose={fecharModalForm}>
              <ToDoForm onSubmit={handleFormSubmit} defaultValue={selectedTodo?.description} />
            </Dialog>
            <FabButton onClick={() => abrirModalForm()}>
              <IconPlus />
            </FabButton>
          </Footer>
        </ChecklistsWrapper>
      </Container>
    </main>
  )
}

export default App