No puedo decir que haya encontrado una solución ideal, pero sí descubrí cuál era el problema para mí.
El problema se puede encontrar aquí
https://github.com/discourse/Discourse-nav-links-component/blob/main/desktop/head_tag.html
Específicamente, esta parte:
api.modifyClass("component:navigation-item", {
pluginId: "discourse-nav-links-component",
active: Ember.computed("contentFilterMode", "filterMode", function() {
let contentFilterMode = this.get("content").get("filterMode");
if (window.location.pathname === location) {
return contentFilterMode === filter;
} else {
return this._super(contentFilterMode, this.get("filterMode"));
}
})
});
Parece que esto establece el estado “activo” en cada enlace de navegación. Francamente, la lógica de cómo decide y qué son todas estas variables es bastante opaca para mí. Pero el problema está aquí:
if (window.location.pathname === location) {
return contentFilterMode === filter;
} else {
return this._super(contentFilterMode, this.get("filterMode"));
}
Para mí, esto comprueba si la URL de la página es la misma que la ubicación de la URL de la barra de navegación y, si es así, devuelve el resultado de contentFilterMode === filter, siendo ambas variables un poco confusas para mí. Si la condición falla, parece que simplemente ejecuta la lógica normal de si algo debe marcarse como activo (que es por lo que mis enlaces no personalizados parecen funcionar bien). El problema es que, si bien este código se ejecuta correctamente una vez por cada enlace de navegación, la variable location siempre parece ser “categories”, por lo que la declaración if siempre es falsa para los enlaces personalizados. Además, incluso si corrijo la variable “location” reemplazándola con this.get("content").href, el valor de retorno también es siempre falso porque la variable filter también siempre se establece en “categories”.
Normalmente, haría una PR para solucionar esto, pero el problema raíz real todavía se me escapa. He ideado una solución alternativa que funciona para mí, pero altera ligeramente la funcionalidad documentada de este componente, por lo que preferiría no hacer una PR. Creo que habrá casos extremos en los que tampoco funcionará, como si tu página de inicio estuviera configurada en /latest
api.modifyClass("component:navigation-item", {
pluginId: "discourse-nav-links-component",
active: Ember.computed("contentFilterMode", "filterMode", function() {
return window.location.pathname.includes(this.get("content").href);
})
});
Básicamente, solo comprueba si la URL actual incluye la URL de la barra de navegación como una subcadena. Si es así, la resalta.