تسبب نافذة اختيار الصورة الرمزية في تعطل النظام مع رسالة "t.split ليست دالة" (avatar-selector.gjs)

ملخص:
يؤدي فتح نافذة اختيار الصورة الرمزية (لتغيير صورة الملف الشخصي) إلى حدوث خطأ في جافاسكريبت، وتفشل النافذة المنبثقة في العمل بشكل صحيح.

إصدار Discourse: v2026.7.0-latest (الالتزام 59588b5d2a)
إصدار Ember: v6.10.1

خطوات إعادة إنتاج الخطأ:

  1. انتقل إلى ملف المستخدم الشخصي
  2. انقر على خيار تغيير الصورة الرمزية
  3. تفتح نافذة اختيار الصورة الرمزية (يتم تشغيلها عبر تدفق نافذة تأكيد “تم الحل”، استنادًا إلى تتبع المكدس)
  4. يظهر الخطأ فوراً في وحدة تحكم المتصفح ولا تتصرف النافذة بشكل صحيح

السلوك المتوقع:
يجب أن تفتح نافذة اختيار الصورة الرمزية بشكل طبيعي وتسمح للمستخدم باختيار/رفع صورة رمزية.

السلوك الفعلي:
تُظهر وحدة التحكم: TypeError: t.split is not a function داخل getter selectableAvatars في avatar-selector.gjs.

استكشاف الأخطاء وإصلاحها الذي تم بالفعل:

  • تم الاختبار في الوضع الآمن مع تعطيل جميع السمات والإضافات، ولا يزال الخطأ يحدث، لذا لا يبدو أن هذا ناتج عن سمة أو إضافة.

المتصفح / نظام التشغيل:

Brave / Windows 11

سجل وحدة التحكم / تتبع المكدس:
```
?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)

هل يمكنك إعادة إنتاج هذه المشكلة هنا على meta؟

هل رسالة الخطأ أعلاه من نسختك الخاصة، وهل أنت خلف Cloudflare؟ يبدو أن هذا الجزء يشير إلى ذلك.

إعجاب واحد (1)

مرحباً،

شكراً لردك ولإبراز هذه النقطة.

للإجابة على سؤالك: لا، لا يمكنني إعادة إنتاج هذه المشكلة على meta.discourse.org نفسها، بل فقط على منتداكي الخاص.

بالنسبة لـ Cloudflare: نعم، منتداكي يعمل خلف Cloudflare، لكن سطر وحدة التحكم المحدد (المتعلق بـ beacon.min.js / ERR_BLOCKED_BY_CLIENT) لا علاقة له بالخطأ الفعلي. إنه ناتج عن حظر دروع Brave (Brave Shields) لنص التحليلات الخاص بـ Cloudflare. قمت بتعطيل دروع Brave بالكامل واختفى هذا السطر، لكن خطأ محدد الرموز الشخصية (TypeError: t.split is not a function) لا يزال يحدث بنفس الطريقة تماماً.

لتوفير السياق: لقد كنت أدير منتداكي خلف Cloudflare منذ ما يقرب من 3 سنوات، وكان تغيير رمز الشخصية يعمل بشكل جيد دائماً حتى الآن. لذا، يبدو أن هذا خطأ انحداري (regression) وليس مشكلة قديمة مرتبطة بـ Cloudflare.

بما أن المشكلة لا تتكرر على meta، فقد تكون خاصة بشيء ما في إعداداتي. أنا مستعد للتحقق من أي إعدادات أو سجلات قد تساعد في تحديد المشكلة. أخبرني بما سيكون مفيداً التحقق منه (مثل قيمة إعداد الموقع “الرموز الشخصية القابلة للاختيار”، أو أي شيء يتعلق بإضافة Solved، التي لاحظت أنها تظهر في أثر المكدس كمشغل لهذا النافذة المنبثقة).

شكراً لك على متابعة هذا الأمر.

إعجابَين (2)

نعم، أنت على حق، من المرجح أنه ليس Cloudflare.

لقد أجريت الاختبار على نسخة منفصلة، حيث فعلت فقط الرموز القابلة للاختيار. كان عليّ رفع رمزين (متطلب إعداد الموقع) ثم تفعيله.

هل يمكنك تعديل هذين الإعدادين وملاحظة ما إذا كان ذلك يغير أي شيء من جانبك؟

إعجابَين (2)

مرحباً،

شكراً لك على التحقق من هذا الأمر. كنت محقاً.

لقد قمت برفع صورتين شخصيتين إلى إعداد “الصور الشخصية القابلة للاختيار” كما اقترحت، وختفى الخطأ. الآن يفتح منتقي الصور الشخصية ويعمل بشكل صحيح.

يبدو إذن أن السبب الجذري هو: عندما يكون إعداد “الصور الشخصية القابلة للاختيار” مفعلاً ولكن عدد الصور المرفوعة أقل من الحد المطلوب (أو يكون فارغاً)، ينهار النافذة المنبثقة بدلاً من التعامل مع الخطأ بهدوء. في حالتي، كان الإعداد مفعلاً دون رفع أي صور، مما أثار خطأ t.split is not a function.

لا أزال أعتقد أن هذا يستحق الإصلاح من جانب النظام الأساسي. حتى لو كان الإعداد غير صحيح، لا ينبغي أن تتسبب النافذة المنبثقة في حدوث خطأ TypeError غير محدد وتُعطّل اختيار الصور الشخصية تماماً. من الأفضل أن تقوم بأحد الأمرين:

  • التراجع إلى وضع اختيار الصور الشخصية العادي (تجاوز ميزة “الصور الشخصية القابلة للاختيار”) إذا كانت القائمة فارغة أو غير صالحة، أو
  • عرض رسالة خطأ تحقق واضحة بدلاً من حدوث تعطل صامت في JavaScript

شكراً جزيلاً لمساعدتك في تحديد نطاق المشكلة!

إعجابَين (2)

نعم، هذا منطقي. هل تريد تقديم إصلاح؟ إذا كنت على دراية بالموضوع، يسعدني قبول طلب السحب (Pull Request) لهذا الأمر.

إعجاب واحد (1)

أعمل في مجال تطوير البرمجيات، لكنني لا أملك الكثير من الخبرة في هذا النوع من الأمور. لذلك، أتردد قليلاً في تقديم الإصلاح بنفسي خوفاً من ارتكاب خطأ. إذا أراد أحد أعضاء الفريق الأساسي متابعة الأمر من هنا، فسيكون ذلك رائعاً. ولكن يمكنني فتح مشكلة على GitHub إذا أردتم.

3 إعجابات

لا مشكلة، يجب أن يكون هذا كافياً: DEV: Fix JS error in modal when selected avatars is misconfigured - Pull Request #41663 - discourse/discourse - GitHub

إعجاب واحد (1)