TypeError durante l'invio di un flag con contenuto personalizzato (flag require_message)

Descrizione del Bug

Quando un utente seleziona un tipo di segnalazione che richiede un messaggio personalizzato (ad esempio notify_moderators, notify_user o qualsiasi segnalazione personalizzata creata dall’amministratore con “Richiedi messaggio” abilitato), compila il messaggio e invia il modulo, il browser genera un TypeError non catturato e la segnalazione non viene mai inviata.

Passaggi per Riprodurre

  1. Visita qualsiasi post di un argomento
  2. Clicca sul pulsante di segnalazione per aprire la finestra modale delle segnalazioni
  3. Seleziona un tipo di segnalazione che richiede un messaggio (ad esempio “Qualcos’altro” / notify_moderators, o qualsiasi segnalazione personalizzata creata in Amministrazione → Segnalazioni con “Richiedi messaggio” abilitato)
  4. Digita un messaggio nell’area di testo (abbastanza lungo da superare la lunghezza minima)
  5. Clicca sul pulsante Invia

Comportamento Atteso

La segnalazione viene inviata con successo.

Comportamento Effettivo

La finestra modale delle segnalazioni si chiude, ma la segnalazione non viene inviata. La console del browser mostra:

Uncaught (in promise) TypeError: Cannot read properties of undefined (reading 'act')
    at n.create (flag.js:24:8)
    at S.createFlag (flag.gjs:205:32)
    at S.takeAction (flag.gjs:196:12)
    at m.perform (reviewable-bundled-action.gjs:47:17)
    at ej._boundaryActionHandler (select-kit.js:685:34)
    ...

Analisi della Causa Radice

Il crash ha origine in Flag#create (flag.js:24):

create(flagModal, opts) {
  const postAction = this.postActionFor(flagModal); // restituisce undefined
  // ...
  postAction.act(...) // ← TypeError: Cannot read properties of undefined
}

postActionFor in PostFlag cerca la segnalazione selezionata tramite l’id numerico all’interno di actions_summary:

// post-flag.js
postActionFor(flagModal) {
  return flagModal.args.model.flagModel.actions_summary.find(
    (item) => item.id === flagModal.selected.id
  );
}

Il PostSerializer backend include una voce di segnalazione in actions_summary solo se almeno uno tra can_act, count o acted è truthy:

result << summary if summary[:can_act] || summary[:count] || summary[:acted]

Per le segnalazioni con require_message: true (che sono tutte notify_type: true), post_can_act? imposta can_act: false quando already_did_flagging è vero — cioè quando l’utente ha già inviato una segnalazione di tipo notifica su quel post. In tal caso, la voce è assente da actions_summary, postActionFor restituisce undefined e si verifica il crash.

Nel frattempo, Post#flagsAvailable (che controlla cosa l’utente può selezionare nell’interfaccia) utilizza la mappa actionByName costruita al caricamento della pagina, quindi la segnalazione può comunque apparire selezionabile anche dopo che actions_summary non la contiene più.

Bug Secondario

C’è anche un confronto errato in flag.gjs:

const NOTIFY_MODERATORS_KEY = "notify_moderators"; // string

get notifyModeratorsFlag() {
  return this.flagsAvailable.find((f) => f.id === NOTIFY_MODERATORS_KEY);
  //                                      ^ number   ^ string — sempre falso
}

f.id è un numero ma NOTIFY_MODERATORS_KEY è una stringa, quindi === restituisce sempre false e notifyModeratorsFlag è sempre undefined. Questo rompe la logica del pulsante “Segnala per revisione” in flagForReview().

Soluzione Suggerita

PostFlag#postActionFor dovrebbe utilizzare la mappa actionByName (indicizzata per name_key) invece di cercare in actions_summary per id, in modo coerente con il funzionamento già esistente di TopicFlag#postActionFor:

// post-flag.js
postActionFor(flagModal) {
  return flagModal.args.model.flagModel.actionByName[
    flagModal.selected.name_key
  ];
}

E notifyModeratorsFlag dovrebbe confrontare per name_key invece che per id:

get notifyModeratorsFlag() {
  return this.flagsAvailable.find((f) => f.name_key === NOTIFY_MODERATORS_KEY);
}

Versione di Discourse

2026.5.0-latest

Riproducibile su

  • Ultimo ramo main
1 Mi Piace