Este problema ha existido durante un par de meses y puedo reproducirlo aquí en Meta usando un dispositivo Android/Chrome (ambos con la última versión); de hecho, esto ha estado ocurriendo desde hace varios meses, desde enero aproximadamente.
El editor de mensajes parece “fallar” de vez en cuando cuando se elige un emoji propuesto.
Pasos para reproducir:
Publica una respuesta a un tema y agrega algo de texto.
Comienza a agregar un pulgar hacia arriba escribiendo “:+1” y luego toca el emoji propuesto .
Qué sucede:
El editor parece fallar de alguna manera o se vuelve a dibujar. Por lo general, se pierde algo del texto escrito.
No es reproducible al 100 %, pero puedo encontrar el problema fácilmente en menos de un minuto de probar.
El error ocurre porque selectedOption es 0 (una sola sugerencia, es decir, la primera), mientras que autocompleteOptions es de alguna manera null.
Investigando el porqué ahora…
Así que, por ahora, no estoy seguro de la causa. Al principio sospechaba de esta PR de @Osama:
Pero añadí bastantes puntos de interrupción y no puedo encontrar realmente «quién» está mutando autocompleteOptions y estableciéndolo en null.
Que autocompleteOptions provenga del ámbito del cierre padre dos niveles hacia arriba también es bastante extraño y hace que el código sea un poco difícil de seguir y depurar.
@ljpp / @falco ¿pueden seguir reproduciendo este error? He probado muchas variaciones al insertar un emoji y no he logrado reproducirlo ni una sola vez. Si todavía pueden reproducirlo, ¿podrían compartir los pasos exactos, por favor? ¡Gracias!
Acabo de probarlo y no pude reproducirlo fácilmente. Sin embargo, estoy bastante seguro de que lo he visto varias veces durante el verano, de forma accidental mientras escribía una publicación real.
Edición: Preguntaré a nuestra comunidad si pueden proporcionar una cobertura de pruebas más extensa.
Edición 2: Ah, sí, ahora lo he reproducido yo mismo. Nuestra comunidad está probando y parece que hay más reproducciones por parte de usuarios habituales.
Todavía tenemos esto en nuestra lista; simplemente estamos encontrando que es extremadamente difícil de reproducir y depurar.
No puedo realmente colocar un pr-welcome en esto porque es demasiado difícil. Lo revisaremos en algún momento, estableciendo un temporizador de 6 meses.
Sí, sigue presente. Personalmente, no pude reproducirlo tras 15 minutos de pruebas intensivas, por lo que pedí apoyo a nuestra comunidad. Varios usuarios lograron reproducirlo e incluso uno lo demostró con una captura de pantalla. Los síntomas permanecen sin cambios: una vez que tocas el emoji de pulgar arriba en el selector, el teclado se pliega y se pierde parte del contenido escrito en el editor.
Antes podía reproducirlo muy fácilmente, pero ahora no logro encontrar la forma exacta. El problema existe, pero no es reproducible al 100%. Seguiremos probando para intentar determinar si hay algún paso de la interfaz de usuario que desencadene esto.
Siento que los selectores de emojis de plataformas no nativas sean el verdadero error aquí. ¿La solución trivial es usar el selector de emojis nativo de tu sistema operativo preferido?
Ok, he vuelto a revisar esto hoy y logré reproducirlo después de cambiar el teclado virtual de mi teléfono a Gboard. Gboard a veces dispara los eventos keydown y keyup dos veces por una sola pulsación de tecla y si eso sucede con la última tecla que presionas antes de seleccionar un emoji del autocompletado, obtendrás un error.
No estoy seguro de qué causa que Gboard dispare estos eventos dos veces, pero parece depender de lo que hayas escrito y de tu configuración de Gboard.
Los eventos dobles causan un error debido a la forma en que está diseñada nuestra biblioteca de autocompletado. La biblioteca escucha los eventos keydown y keyup, y en keydown borra las sugerencias de autocompletado y en keyup ofrece nuevas sugerencias basadas en el nuevo término de autocompletado.
Sin embargo, hay una pequeña protección/optimización para evitar que la biblioteca realice trabajo duplicado cuando el término no ha cambiado desde las sugerencias anteriores, y aquí es donde ocurre el problema. El primer par de eventos keydown y keyup borra las sugerencias antiguas y ofrece nuevas como se esperaba, pero el segundo par erróneo borrará las sugerencias nuevamente en keydown pero no ofrecerá nuevas en keyup porque el término de autocompletado no ha cambiado.
La única “solución” menos improvisada que se me ocurre es eliminar la protección/optimización para que la biblioteca siempre ofrezca nuevas sugerencias en keyup, pero no estoy seguro de si esto es deseable o vale la pena.
Sé que queremos reescribir nuestra biblioteca de autocompletado en algún momento (es uno de los códigos más antiguos de la base de código y necesita desesperadamente una reescritura), así que tal vez este error podría esperar hasta que lleguemos a la reescritura.
No, el bloqueo se debe al acceso a una variable nula. Cuando se borran las sugerencias, la variable autocompleteOptions se establece en null y luego, cuando se toca una de las sugerencias renderizadas, esperamos que autocompleteOptions sea un array, pero es null.
Esto me da otra idea: ¿quizás podríamos comprobar si autocompleteOptions es null cuando se selecciona una sugerencia y, si la variable es null, volver a obtener las sugerencias para el término dado?
Ah, me siento tan tonto por no haber informado este detalle. Mi teléfono anterior era un Android One limpio, por lo que tenía Gboard por defecto, y me ha seguido desde entonces al siguiente dispositivo (Sammy A42 5G). Pero la mayoría de los dispositivos Android que se venden hoy en día usan una aplicación de teclado de terceros por defecto.