Le modal de sélection d'avatar plante avec "t.split n'est pas une fonction" (avatar-selector.gjs)

Résumé :
L’ouverture de la modale de sélection d’avatar (pour changer l’avatar du profil) génère une erreur JavaScript et la fenêtre contextuelle ne fonctionne pas correctement.

Version de Discourse : v2026.7.0-latest (commit 59588b5d2a)
Version d’Ember : v6.10.1

Étapes pour reproduire :

  1. Aller sur le profil utilisateur
  2. Cliquer sur l’option pour changer l’avatar
  3. La modale de sélection d’avatar s’ouvre (déclenchée via un flux de confirmation de déplacement « résolu », selon la trace de la pile)
  4. L’erreur apparaît immédiatement dans la console du navigateur et la modale ne se comporte pas correctement

Comportement attendu :
La modale de sélection d’avatar devrait s’ouvrir normalement et permettre à l’utilisateur de choisir/télécharger un avatar.

Comportement réel :
La console affiche : TypeError: t.split n'est pas une fonction dans le getter selectableAvatars de avatar-selector.gjs.

Dépannage déjà effectué :

  • Testé en mode sans échec avec tous les thèmes et plugins désactivés, l’erreur se produit toujours, donc cela ne semble pas être causé par un thème ou un plugin.

Navigateur / OS :

Brave / Windows 11

Journal de la console / trace de la pile :
```
?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 n’est pas une fonction
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 « J'aime »

Pouvez-vous reproduire ce problème ici sur meta ?

Le message d’erreur ci-dessus provient-il de votre instance et êtes-vous derrière Cloudflare ? Cette partie semblerait l’indiquer.

1 « J'aime »

Bonjour,

Merci pour ta réponse et pour avoir souligné ce point.

Pour répondre à ta question : non, je ne peux pas reproduire ce problème sur meta.discourse.org, uniquement sur mon propre forum.

Concernant Cloudflare : oui, mon forum est derrière Cloudflare, mais cette ligne spécifique de la console (beacon.min.js / ERR_BLOCKED_BY_CLIENT) n’a aucun lien avec le bug en question. Elle est causée par les Brave Shields qui bloquent le script d’analyse de Cloudflare. J’ai désactivé complètement les Brave Shields et cette ligne a disparu, mais l’erreur du sélecteur d’avatar (TypeError: t.split n’est pas une fonction) se produit exactement de la même manière.

Pour donner du contexte : je fais fonctionner mon forum derrière Cloudflare depuis près de 3 ans, et le changement d’avatar de profil a toujours fonctionné sans problème jusqu’à présent. Il semble donc s’agir d’une régression plutôt que d’un problème lié à Cloudflare existant depuis longtemps.

Puisque cela ne se reproduit pas sur meta, cela pourrait être spécifique à quelque chose dans ma configuration. Je suis disposé à examiner tous les paramètres ou journaux qui pourraient aider à restreindre les causes. Dis-moi ce qui serait utile de vérifier (par exemple, la valeur du paramètre de site « avatars sélectionnables », ou tout ce qui est lié au plugin Solved, que j’ai remarqué apparaître dans la trace de pile comme déclencheur de cette fenêtre modale).

Merci de t’y être penché.

2 « J'aime »

oui, tu as raison, ce n’est probablement pas Cloudflare.

J’ai testé cela sur une instance séparée, où j’ai activé uniquement les avatars sélectionnables. J’ai dû télécharger deux avatars (exigence du paramètre du site) puis les activer.

Peux-tu modifier ces deux paramètres et voir si cela change quelque chose de ton côté ?

2 « J'aime »

Salut,

Merci d’avoir creusé la question. Tu avais raison.

J’ai téléchargé deux avatars dans le paramètre « avatars sélectionnables » comme tu l’as suggéré, et l’erreur a disparu. Le sélecteur d’avatars s’ouvre désormais et fonctionne correctement.

Il semble donc que la cause racine soit la suivante : lorsque l’option « avatars sélectionnables » est activée mais qu’il y a moins d’avatars téléchargés que le nombre requis (ou qu’elle est vide), la modale plante au lieu de gérer l’erreur de manière élégante. Dans mon cas, le paramètre était activé sans aucun avatar téléchargé, ce qui a déclenché l’erreur t.split n’est pas une fonction.

Je pense toujours que cela mérite d’être corrigé au niveau du code principal. Même si le paramètre est mal configuré, la modale ne devrait pas générer une TypeError non capturée et bloquer complètement la sélection d’avatars. Idéalement, elle devrait :

  • revenir à la sélection d’avatars normale (ignorer la fonctionnalité « avatars sélectionnables ») si la liste est vide ou invalide, ou
  • afficher un message d’erreur de validation clair au lieu de planter silencieusement en JavaScript

Merci encore pour ton aide pour cerner le problème !

2 « J'aime »

Oui, c’est juste. Souhaites-tu proposer une correction ? Si tu es familier avec le projet, je serai ravi d’accepter une Pull Request à ce sujet.

1 « J'aime »

Je m’intéresse au développement logiciel, mais je n’ai pas beaucoup d’expérience dans ce domaine. Je suis donc un peu hésitant à proposer moi-même une correction, au risque de me tromper. Si quelqu’un de l’équipe principale veut reprendre la main, ce serait génial. Mais je peux ouvrir un ticket sur GitHub si vous le souhaitez.

3 « J'aime »

Pas de problème, cela devrait résoudre le problème : DEV: Fix JS error in modal when selected avatars is misconfigured - Pull Request #41663 - discourse/discourse - GitHub

1 « J'aime »