Modal do seletor de avatar trava com "t.split não é uma função" (avatar-selector.gjs)

Resumo:
Abrir o modal do seletor de avatar (para alterar o avatar do perfil) gera um erro JavaScript e a janela pop-up não funciona corretamente.

Versão do Discourse: v2026.7.0-latest (commit 59588b5d2a)
Versão do Ember: v6.10.1

Passos para reproduzir:

  1. Acesse o perfil do usuário
  2. Clique na opção para alterar o avatar
  3. O modal do seletor de avatar abre (acionado por meio de um fluxo de confirmação de movimento “resolvido”, com base na pilha de rastreamento)
  4. O erro aparece imediatamente no console do navegador e o modal não se comporta corretamente

Comportamento esperado:
O seletor de avatar deve abrir normalmente e permitir que o usuário escolha/faça upload de um avatar.

Comportamento atual:
O console exibe: TypeError: t.split is not a function dentro do getter selectableAvatars em avatar-selector.gjs.

Solução de problemas já realizada:

  • Testado no Modo Seguro com todos os temas e plugins desativados; o erro ainda ocorre, portanto, não parece ser causado por um tema ou plugin.

Navegador / SO:

Brave / Windows 11

Log do console / pilha de rastreamento:
```
?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 is not a function
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
```

2 curtidas

Você consegue reproduzir esse problema aqui no meta?

A mensagem de erro acima é da sua instância e você está atrás do Cloudflare? Essa parte parece indicar isso.

1 curtida

Olá,

Obrigado pela resposta e por ter apontado isso.

Para responder à sua pergunta: não, não consigo reproduzir isso no meta.discourse.org, apenas no meu próprio fórum.

Quanto ao Cloudflare: sim, meu fórum está atrás do Cloudflare, mas aquela linha específica do console (a do beacon.min.js / ERR_BLOCKED_BY_CLIENT) não está relacionada ao bug em si. É causada pelos Brave Shields bloqueando o script de análise do Cloudflare. Desativei os Brave Shields por completo e aquela linha desapareceu, mas o erro do seletor de avatar (TypeError: t.split is not a function) continua ocorrendo exatamente da mesma forma.

Para contextualizar: estou executando meu fórum atrás do Cloudflare há quase 3 anos, e a alteração do avatar do perfil sempre funcionou bem até agora. Portanto, isso parece ser uma regressão, em vez de um problema antigo relacionado ao Cloudflare.

Como não se reproduz no meta, isso pode ser específico de algo na minha configuração. Estou feliz em investigar quaisquer configurações ou logs que ajudem a narrowing down. Me avise o que seria útil verificar (por exemplo, o valor da configuração do site “selectable avatars”, ou qualquer coisa relacionada ao plugin Solved, que notei aparecer no stack trace como o gatilho para este modal).

Obrigado por investigar isso.

2 curtidas

sim, você está certo, provavelmente não é o Cloudflare.

Testei isso em uma instância separada, onde habilitei apenas os avatares selecionáveis. Tive que fazer o upload de dois avatares (requisito da configuração do site) e depois habilitar.

Você pode modificar essas duas configurações e ver se isso muda algo do seu lado?

2 curtidas

Olá,

Obrigado por investigar isso. Você estava certo.

Carreguei dois avatares na configuração de “avatares selecionáveis”, conforme sugerido, e o erro desapareceu. O seletor de avatares agora abre e funciona corretamente.

Parece, portanto, que a causa raiz é: quando a opção “avatares selecionáveis” está ativada, mas há menos avatares carregados do que o necessário (ou está vazia), o modal falha em vez de lidar com o erro de forma elegante. No meu caso, a configuração estava ativada sem nenhum avatar carregado, o que acionou o erro t.split não é uma função.

Ainda acho que isso deve ser corrigido no código principal. Mesmo que a configuração esteja incorreta, o modal não deve gerar um TypeError não tratado e quebrar completamente a seleção de avatares. Idealmente, ele deveria:

  • recorrer à seleção normal de avatares (ignorar o recurso de “avatares selecionáveis”) se a lista estiver vazia ou inválida, ou
  • exibir uma mensagem de erro de validação clara em vez de uma falha silenciosa no JavaScript

Obrigado novamente por ajudar a identificar a causa!

2 curtidas

É, faz sentido. Quer enviar uma correção? Se estiver familiarizado com o processo, ficarei feliz em aceitar um Pull Request para isso.

1 curtida

Trabalho com desenvolvimento de software, mas não tenho muita experiência com esse tipo de coisa. Por isso, estou um pouco relutante em enviar uma correção por conta própria e correr o risco de errar. Se alguém da equipe principal quiser assumir a partir daqui, seria ótimo. Mas posso abrir uma issue no GitHub, se preferirem.

3 curtidas

Sem problemas, isso deve resolver: DEV: Fix JS error in modal when selected avatars is misconfigured - Pull Request #41663 - discourse/discourse - GitHub

1 curtida