El modal del selector de avatar se bloquea con "t.split no es una función" (avatar-selector.gjs)

Resumen:
Al abrir el modal del selector de avatar (para cambiar el avatar del perfil) se produce un error de JavaScript y el cuadro emergente no funciona correctamente.

Versión de Discourse: v2026.7.0-latest (commit 59588b5d2a)
Versión de Ember: v6.10.1

Pasos para reproducir:

  1. Ir al perfil de usuario
  2. Hacer clic en la opción para cambiar el avatar
  3. Se abre el modal del selector de avatar (activado a través de un flujo de confirmación de movimiento “resuelto”, según la traza de la pila)
  4. Aparece un error inmediatamente en la consola del navegador y el modal no se comporta correctamente

Comportamiento esperado:
El selector de avatar debería abrirse normalmente y permitir al usuario seleccionar/cargar un avatar.

Comportamiento real:
La consola muestra: TypeError: t.split no es una función dentro del getter selectableAvatars en avatar-selector.gjs.

Solución de problemas ya realizada:

  • Se probó en Modo Seguro con todos los temas y complementos deshabilitados y el error persiste, por lo que no parece estar causado por un tema o complemento.

Navegador / Sistema operativo:

Brave / Windows 11

Registro de la consola / traza de la pila:
```
?safe_mode=no_themes,no_plugins:346 GET https://static.cloudflareinsights.com/beacon.min.js/v4513226cdae34746b4dedf0b4dfa099e1781791509496 net::ERR_BLOCKED_BY_CLIENT
app.js:365 :information_source: Discourse v2026.7.0-latest — Commits · discourse/discourse · GitHub — Ember v6.10.1
avatar-selector.gjs:47 Uncaught (in promise) TypeError: t.split no es una función
at get selectableAvatars (avatar-selector.gjs:47:47)
at R (cache-DtDz7X5V.js:1647:15)
at index.js:87:32
at index.js:64:37
at zn (index.js:396:5)
at j (index.js:62:16)
at index-DaCZcoCY.js:4335:20
at index.js:64:37
at zn (index.js:396:5)
at j (index.js:62:16)
at index-DaCZcoCY.js:4335:20
at index.js:64:37
at zn (index.js:396:5)
at j (index.js:62:16)
at index.js:158:20
at index.js:64:37
at zn (index.js:396:5)
at j (index.js:62:16)
at Object.evaluate (index.js:1970:16)
at Object.evaluate (index.js:103:106)
at zb.evaluateSyscall (index.js:2873:20)
at zb.evaluateInner (index.js:2852:64)
at zb.evaluateOuter (index.js:2849:10)
at e.next (index.js:4167:45)
at e._execute (index.js:4157:21)
at e.execute (index.js:4133:41)
at _x.handleException (index.js:3450:19)
at bx.handleException (index.js:3592:52)
at hx.throw (index.js:3414:16)
at iy.evaluate (index.js:565:37)
at hx._execute (index.js:3401:34)
at hx.execute (index.js:3393:17)
at xx.rerender (index.js:3610:8)
at ww.render (index-DaCZcoCY.js:5211:23)
at index-DaCZcoCY.js:5409:16
at xb (index.js:2414:7)
at e.renderRoots (index-DaCZcoCY.js:5389:7)
at #o (index-DaCZcoCY.js:5374:12)
at e.revalidate (index-DaCZcoCY.js:5435:10)
at invoke (index.js:264:14)
at Rc.flush (index.js:180:11)
at zc.flush (index.js:334:19)
at pl._end (index.js:762:32)
at _boundAutorunEnd (index.js:499:12)
selectableAvatars @ avatar-selector.gjs:47
_getProp @ cache-DtDz7X5V.js:1647
(anonymous) @ index.js:87
(anonymous) @ index.js:64
track @ index.js:396
valueForRef @ index.js:62
(anonymous) @ index-DaCZcoCY.js:4335
(anonymous) @ index.js:64
track @ index.js:396
valueForRef @ index.js:62
(anonymous) @ index-DaCZcoCY.js:4335
(anonymous) @ index.js:64
track @ index.js:396
valueForRef @ index.js:62
(anonymous) @ index.js:158
(anonymous) @ index.js:64
track @ index.js:396
valueForRef @ index.js:62
(anonymous) @ index.js:1970
evaluate @ index.js:103
evaluateSyscall @ index.js:2873
evaluateInner @ index.js:2852
evaluateOuter @ index.js:2849
next @ index.js:4167
_execute @ index.js:4157
execute @ index.js:4133
handleException @ index.js:3450
handleException @ index.js:3592
throw @ index.js:3414
evaluate @ index.js:565
_execute @ index.js:3401
execute @ index.js:3393
rerender @ index.js:3610
(anonymous) @ index-DaCZcoCY.js:5211
(anonymous) @ index-DaCZcoCY.js:5409
inTransaction @ index.js:2414
renderRoots @ index-DaCZcoCY.js:5389
#o @ index-DaCZcoCY.js:5374
revalidate @ index-DaCZcoCY.js:5435
invoke @ index.js:264
flush @ index.js:180
flush @ index.js:334
_end @ index.js:762
(anonymous) @ index.js:499
Promise.then
(anonymous) @ index.js:18
flush @ index.js:29
_scheduleAutorun @ index.js:928
_end @ index.js:768
(anonymous) @ index.js:499
Promise.then
(anonymous) @ index.js:18
flush @ index.js:29
_scheduleAutorun @ index.js:928
_end @ index.js:768
(anonymous) @ index.js:499
Promise.then
(anonymous) @ index.js:18
flush @ index.js:29
_scheduleAutorun @ index.js:928
_ensureInstance @ index.js:919
ensureInstance @ index.js:731
scheduleRevalidate @ index-DaCZcoCY.js:4146
dirtyTag @ index.js:229
dirtyTagFor @ index.js:848
setter @ index.js:871
set @ cache-DtDz7X5V.js:1886
show @ modal.js:57
await in show
showAvatarSelector @ account.js:43
_join @ index.js:788
join @ index.js:605
join @ index.js:152
(anonymous) @ route-action.js:48
(anonymous) @ index.js:2534
(anonymous) @ d-button.gts:216
invoke @ index.js:264
flush @ index.js:180
flush @ index.js:334
_end @ index.js:762
end @ index.js:565
_runExpiredTimers @ index.js:869
setTimeout
setTimeout @ index.js:39
_installTimerTimeout @ index.js:912
_reinstallTimerTimeout @ index.js:896
_later @ index.js:829
later @ index.js:652
next @ index.js:562
_triggerAction @ d-button.gts:213
click @ d-button.gts:167
```

1 me gusta

¿Puedes reproducir este problema aquí en meta?

¿El mensaje de error anterior proviene de tu instancia y estás detrás de Cloudflare? Esta parte del mismo parecería indicar que sí.

Hola,

Gracias por la respuesta y por señalar eso.

Para responder a tu pregunta: no, no puedo reproducir esto en meta.discourse.org, solo en mi propio foro.

Respecto a Cloudflare: sí, mi foro está detrás de Cloudflare, pero esa línea específica de la consola (la de beacon.min.js / ERR_BLOCKED_BY_CLIENT) no está relacionada con el error real. Es causada por Brave Shields bloqueando el script de análisis de Cloudflare. Desactivé Brave Shields por completo y esa línea desaparece, pero el error del selector de avatar (TypeError: t.split no es una función) sigue ocurriendo exactamente de la misma manera.

Para dar contexto: he estado ejecutando mi foro detrás de Cloudflare durante casi 3 años, y cambiar el avatar del perfil siempre ha funcionado bien hasta ahora. Así que esto parece ser una regresión en lugar de un problema relacionado con Cloudflare de larga data.

Dado que no se reproduce en meta, esto podría ser específico de algo en mi configuración. Estaré encantado de profundizar en cualquier configuración o registro que ayude a acotar el problema. Dime qué sería útil verificar (por ejemplo, el valor de la configuración del sitio “selectable avatars”, o cualquier cosa relacionada con el plugin Solved, que noté que aparece en la traza de la pila como el desencadenante de este modal).

Gracias por investigar esto.

1 me gusta

sí, tienes razón, es probable que no sea Cloudflare.

Lo probé en una instancia separada, donde habilité solo los avatares seleccionables. Tuve que subir dos avatares (requisito de la configuración del sitio) y luego habilitarlos.

¿Puedes modificar estos dos ajustes y ver si cambia algo en tu extremo?

1 me gusta

Hola,

Gracias por investigar esto. Tenías razón.

Subí dos avatares a la configuración de «avatares seleccionables», como sugeriste, y el error ha desaparecido. El selector de avatares ahora se abre y funciona correctamente.

Parece que la causa raíz es la siguiente: cuando la opción «avatares seleccionables» está habilitada pero hay menos avatares subidos de los requeridos (o está vacía), el cuadro de diálogo se bloquea en lugar de fallar de forma controlada. En mi caso, la opción estaba habilitada sin haber subido ningún avatar, lo que provocó el error t.split no es una función.

Sigo creyendo que esto debería corregirse a nivel del núcleo. Aunque la configuración esté mal ajustada, el cuadro de diálogo no debería lanzar un TypeError sin capturar y romper por completo la selección de avatares. Lo ideal sería que:

  • volviera a la selección normal de avatares (omitiera la función de «avatares seleccionables») si la lista está vacía o es inválida, o
  • mostrara un mensaje de error de validación claro en lugar de un fallo silencioso de JavaScript

¡Gracias otra vez por la ayuda para reducir las posibilidades!

1 me gusta

Sí, tiene sentido. ¿Quieres enviar una corrección? Si te sientes cómodo con ello, estaré encantado de aceptar una solicitud de extracción (Pull Request) para esto.

Me dedico al desarrollo de software, pero no tengo mucha experiencia con este tipo de cosas. Así que me siento un poco reacio a enviar una corrección yo mismo y arriesgarme a hacerlo mal. Si alguien del equipo principal quiere tomar el relevo, eso sería genial. Pero puedo abrir un issue en GitHub si queréis.

2 Me gusta