import { h } from "virtual-dom"; let _renderers = []; const REPLACEMENTS = { "d-tracking": "circle", "d-muted": "times-circle", "d-regular": "circle-o", "d-watching": "exclamation-circle", "d-watching-first": "dot-circle-o", "d-drop-expanded": "caret-down", "d-drop-collapsed": "caret-right", "d-unliked": "heart-o", "d-liked": "heart", "notification.mentioned": "at", "notification.group_mentioned": "at", "notification.quoted": "quote-right", "notification.replied": "reply", "notification.posted": "reply", "notification.edited": "pencil", "notification.liked": "heart", "notification.liked_2": "heart", "notification.liked_many": "heart", "notification.private_message": "envelope-o", "notification.invited_to_private_message": "envelope-o", "notification.invited_to_topic": "hand-o-right", "notification.invitee_accepted": "user", "notification.moved_post": "sign-out", "notification.linked": "link", "notification.granted_badge": "certificate", "notification.topic_reminder": "hand-o-right", "notification.watching_first_post": "dot-circle-o", "notification.group_message_summary": "group" }; export function replaceIcon(source, destination) { REPLACEMENTS[source] = destination; } export function renderIcon(renderType, id, params) { for (let i = 0; i < _renderers.length; i++) { let renderer = _renderers[i]; let rendererForType = renderer[renderType]; if (rendererForType) { const icon = { id, replacementId: REPLACEMENTS[id] }; let result = rendererForType(icon, params || {}); if (result) { return result; } } } } export function iconHTML(id, params) { return renderIcon("string", id, params); } export function iconNode(id, params) { return renderIcon("node", id, params); } // TODO: Improve how helpers are registered for vdom compliation if (typeof Discourse !== "undefined") { Discourse.__widget_helpers.iconNode = iconNode; } export function registerIconRenderer(renderer) { _renderers.unshift(renderer); } // Support for font awesome icons function faClasses(icon, params) { let classNames = `fa fa-${icon.replacementId || icon.id} d-icon d-icon-${ icon.id }`; if (params) { if (params.modifier) { classNames += " fa-" + params.modifier; } if (params["class"]) { classNames += " " + params["class"]; } } return classNames; } // default resolver is font awesome registerIconRenderer({ name: "font-awesome", string(icon, params) { let tagName = params.tagName || "i"; let html = `<${tagName} class='${faClasses(icon, params)}'`; if (params.title) { html += ` title='${I18n.t(params.title)}'`; } if (params.label) { html += " aria-hidden='true'"; } html += `>`; if (params.label) { html += `${params.label}`; } return html; }, node(icon, params) { let tagName = params.tagName || "i"; const properties = { className: faClasses(icon, params), attributes: { "aria-hidden": true } }; if (params.title) { properties.attributes.title = params.title; } if (params.label) { return h(tagName, properties, h("span.sr-only", I18n.t(params.label))); } else { return h(tagName, properties); } } });