2
respostas

[Bug] Novos eventos não atualizam quando arrastados

Bom dia, boa tarde, ou boa noite. Tudo bem?

Esperei até o final do curso para ver se esse bug seria resolvido, mas não foi. Também tentei de tudo quanto foi jeito consertar, mas não consegui. Acredito que possa ser algum conflito com o Kalendar.

O BUG Ao final de todo drag and drop, o evento atualiza a data de início e fim, normalmente. Porém, quando um novo evento é criado, este não atualiza suas datas. Quando a gente "solta" ele até parece que atualizou, mas é só mover um evento que estava lá desde o início, pra ele voltar a data inicial.

COMO REPRODUZIR Crie um novo evento e arraste-a no calendário. Agora arraste outro evento (que esteja ali desde o início da aplicação) e observe o evento criado voltar a sua data inicial.

TESTES É como se o evento não existisse no hook, já que o .filter() aplicado no hook de eventos retorna undefined, conforme testes via console.log. Testei com o filter do instrutor, e também através do id, mas sem sucesso. Ah! Vale também lembrar que o Drop do evento criado não ativa o DebugObserver.

Por fim, vale ressaltar que fiz o download do projeto do github do prof e aconteceu o mesmo bug. Para quem quiser testar: https://github.com/alura-cursos/event-tracker/tree/aula-5

Fiquei muito curioso pra saber o causou e como resolver. Alguém?

2 respostas

Encontrei a solução em outro post do mesmo curso: https://cursos.alura.com.br/forum/topico-o-estado-nao-atualiza-e-tambem-algumas-duvidas-sobre-o-recoil-225073

O problema é que se o evento está setado como completo, ao arrastar esse estado muda para false (valor padrão). Isso acontece pois não passamos esse parâmetro quando atualizamos através do hook. O problema é que não temos acesso a isso através do Kalend, nem conseguimos encontrar o evento através do find... Enfim, ainda sem uma solução completa.

Você pode fazer algumas alterações para guardar esse booleano que diz se um evento foi completado ou não, e depois ter acesso a esse valor pelo parâmetro KalendEventoAtualizado da função OnEventDragFinish.

Ficaria assim:

// src/components/Calendario/index.tsx

// adiciona uma nova propriedade para guardar se o evento foi completado ou não 
interface IKalendEvento {
    id?: number
    startAt: string
    endAt: string
    summary: string
    color: string
    completed: boolean
}

const Calendario: React.FC = () => {

    // ...

    eventos.forEach(evento => {

        // ...

        // guarda o estado de completado 
        eventosKalend.get(chave)?.push({
            id: evento.id,
            startAt: evento.inicio.toISOString(),
            endAt: evento.fim.toISOString(),
            summary: evento.descricao,
            color: 'blue', 
            completed: evento.completo
        })
    })

    // agora temos acesso à propriedade completed no evento atualizado
    const onEventDragFinish: OnEventDragFinish = (
        kalendEventoInalterado: CalendarEvent,
        KalendEventoAtualizado: CalendarEvent,
    ) => {
        const evento = {
            id: KalendEventoAtualizado.id,
            descricao: KalendEventoAtualizado.summary,
            inicio: new Date(KalendEventoAtualizado.startAt),
            fim: new Date(KalendEventoAtualizado.endAt)
            completo: KalendEventoAtualizado.completed
        } as IEvento
        atualizarEvento(evento)
    };

    // ...

}