diff --git a/app/assets/javascripts/discourse/app/components/header/contents.gjs b/app/assets/javascripts/discourse/app/components/header/contents.gjs index ef81f4704b231..27f45838f6d00 100644 --- a/app/assets/javascripts/discourse/app/components/header/contents.gjs +++ b/app/assets/javascripts/discourse/app/components/header/contents.gjs @@ -1,5 +1,4 @@ import Component from "@glimmer/component"; -import { hash } from "@ember/helper"; import { service } from "@ember/service"; import { and } from "truth-helpers"; import deprecatedOutletArgument from "discourse/helpers/deprecated-outlet-argument"; @@ -70,7 +69,7 @@ export default class Contents extends Component { topicInfo=@topicInfo topicInfoVisible=@topicInfoVisible }} - @deprecatedArgs={{hash + @deprecatedArgs={{lazyHash topic=(deprecatedOutletArgument value=this.header.topic message="The argument 'topic' is deprecated on the outlet 'header-contents__before', use 'topicInfo' or 'topicInfoVisible' instead" @@ -122,7 +121,7 @@ export default class Contents extends Component { topicInfo=@topicInfo topicInfoVisible=@topicInfoVisible }} - @deprecatedArgs={{hash + @deprecatedArgs={{lazyHash topic=(deprecatedOutletArgument value=this.header.topic message="The argument 'topic' is deprecated on the outlet 'before-header-panel', use 'topicInfo' or 'topicInfoVisible' instead" @@ -142,7 +141,7 @@ export default class Contents extends Component { topicInfo=@topicInfo topicInfoVisible=@topicInfoVisible }} - @deprecatedArgs={{hash + @deprecatedArgs={{lazyHash topic=(deprecatedOutletArgument value=this.header.topic message="The argument 'topic' is deprecated on the outlet 'after-header-panel', use 'topicInfo' or 'topicInfoVisible' instead" @@ -160,7 +159,7 @@ export default class Contents extends Component { topicInfo=@topicInfo topicInfoVisible=@topicInfoVisible }} - @deprecatedArgs={{hash + @deprecatedArgs={{lazyHash topic=(deprecatedOutletArgument value=this.header.topic message="The argument 'topic' is deprecated on the outlet 'header-contents__after', use 'topicInfo' or 'topicInfoVisible' instead" diff --git a/app/assets/javascripts/discourse/app/components/plugin-outlet.gjs b/app/assets/javascripts/discourse/app/components/plugin-outlet.gjs index ea2b3ec134264..a47b5f1bff319 100644 --- a/app/assets/javascripts/discourse/app/components/plugin-outlet.gjs +++ b/app/assets/javascripts/discourse/app/components/plugin-outlet.gjs @@ -1,9 +1,11 @@ import Component from "@glimmer/component"; import { cached } from "@glimmer/tracking"; +import ClassicComponent from "@ember/component"; import { concat } from "@ember/helper"; import { get } from "@ember/object"; import { getOwner } from "@ember/owner"; import { service } from "@ember/service"; +import curryComponent from "ember-curry-component"; import { or } from "truth-helpers"; import PluginConnector from "discourse/components/plugin-connector"; import PluginOutlet from "discourse/components/plugin-outlet"; @@ -124,6 +126,29 @@ export default class PluginOutletComponent extends Component { ); } + @bind + safeCurryComponent(component, args) { + if (component.prototype instanceof ClassicComponent) { + for (const arg of Object.keys(args)) { + if (component.prototype.hasOwnProperty(arg)) { + deprecated( + `Unable to set @${arg} on connector for ${this.args.name}, because a property on the component class clashes with the argument name. Resolve the clash, or convert to a glimmer component.`, + { + id: "discourse.plugin-outlet-classic-args-clash", + } + ); + + // Build a clone of `args`, without the offending key, while preserving getters + const descriptors = Object.getOwnPropertyDescriptors(args); + delete descriptors[arg]; + args = Object.defineProperties({}, descriptors); + } + } + } + + return curryComponent(component, args, getOwner(this)); + } +