Здравствуйте! Я пытаюсь решить одну задачу. Хочу отображать очки пользователя из плагина Discourse Gamification в верхней части сайта. Например, если у пользователя по имени Адам 700 очков, как можно показать это в заголовке? Где следует разместить код?
Имею в виду, что мне действительно нужно, чтобы пользователь видел свои собственные очки.
С наилучшими пожеланиями!
Этот запрос просто замечательный; мне тоже интересно узнать ответ.
Я считаю, что если бы каждый пользователь мог видеть свои очки вклада под своим именем, это значительно повысило бы вовлеченность сообщества.
«Я хочу переместить очки Cheer с карточек пользователей наверх главной страницы. Пользователь должен видеть свой счёт. Эти счёты берутся из таблицы лидеров.»
Я хочу переместить очки Cheer с карточек пользователей наверх главной страницы. Пользователь должен видеть свой счёт. Эти счёты берутся из таблицы лидеров.
Нет, сэр. Пользователь должен видеть свой счёт только в заголовке. Мне нужно добавить в заголовок раздел, который добавляется к карточке профиля. Этот счёт получен из таблицы лидеров и отражает баллы, заработанные за выполнение задач.
Каждый пользователь должен видеть свой счёт в заголовке на главной странице. Если есть код или метод для этого, пожалуйста, сообщите. Я уже 14 часов ломаю голову и сражаюсь со своей кошкой!
Существует множество примеров компонентов. Изучите репозитории #theme-component, чтобы увидеть примеры компонентов Glimmer с расширением .gjs и обратите внимание, как они прикрепляются к плагинам-контейнерам (Plugin Outlets).
import { apiInitializer } from "discourse/lib/api";
export default apiInitializer("0.8", (api) => {
api.onPageChange(() => {
const currentUser = api.getCurrentUser();
if (!currentUser) {
console.warn("Пользователь не авторизован");
return;
}
fetch(`/u/${currentUser.username}.json`)
.then(response => response.json())
.then(data => {
console.log("Данные геймификации:", data);
let score = data?.user?.gamification_score ?? 0;
// Если блок с очками уже существует, не добавлять его повторно
if (document.querySelector("#gamification-score")) return;
// Найти контейнер .contents заголовка
let headerContents = document.querySelector(".d-header>wrap .contents");
if (headerContents) {
// Создать блок с очками
let scoreContainer = document.createElement("a");
scoreContainer.id = "gamification-score";
scoreContainer.classList.add("gamification-box");
scoreContainer.href = "website";
scoreContainer.target = "_blank"; // Открыть в новой вкладке
// Золотая иконка
let icon = document.createElement("span");
icon.innerText = "T";
icon.classList.add("gold-icon");
// Текст с очками
let scoreText = document.createElement("span");
scoreText.innerText = `${score}`;
scoreText.classList.add("gold-text");
// Добавить иконку и текст в блок
scoreContainer.appendChild(icon);
scoreContainer.appendChild(scoreText);
// Добавить блок в заголовок
headerContents.appendChild(scoreContainer);
}
})
.catch(error => console.error("Ошибка при получении очков геймификации:", error));
});
});