diff --git a/app/assets/javascripts/discourse/components/hamburger-category.js.es6 b/app/assets/javascripts/discourse/components/hamburger-category.js.es6
deleted file mode 100644
index 63b08fd70ee..00000000000
--- a/app/assets/javascripts/discourse/components/hamburger-category.js.es6
+++ /dev/null
@@ -1,13 +0,0 @@
-import computed from 'ember-addons/ember-computed-decorators';
-
-export default Ember.Component.extend({
- tagName: 'li',
- classNames: ['category-link'],
-
- @computed('category.unreadTopics', 'category.newTopics')
- unreadTotal(unreadTopics, newTopics) {
- return parseInt(unreadTopics, 10) + parseInt(newTopics, 10);
- },
-
- showTopicCount: Ember.computed.not('currentUser')
-});
diff --git a/app/assets/javascripts/discourse/templates/components/hamburger-category.hbs b/app/assets/javascripts/discourse/templates/components/hamburger-category.hbs
deleted file mode 100644
index 9204b3d42d9..00000000000
--- a/app/assets/javascripts/discourse/templates/components/hamburger-category.hbs
+++ /dev/null
@@ -1,9 +0,0 @@
-{{category-link category allowUncategorized="true"}}
-
-{{#if unreadTotal}}
- {{unreadTotal}}
-{{/if}}
-
-{{#if showTopicCount}}
- {{category.topic_count}}
-{{/if}}
diff --git a/app/assets/javascripts/discourse/templates/components/hamburger-menu.hbs b/app/assets/javascripts/discourse/templates/components/hamburger-menu.hbs
index 6c3640a6c79..f0bc9397ab0 100644
--- a/app/assets/javascripts/discourse/templates/components/hamburger-menu.hbs
+++ b/app/assets/javascripts/discourse/templates/components/hamburger-menu.hbs
@@ -74,19 +74,7 @@
{{plugin-outlet "site-map-links-last"}}
{{/menu-links}}
- {{#if categories}}
-
- -
- {{d-link class="heading"
- route="discovery.categories"
- class="categories-link"
- label="filters.categories.title"}}
-
- {{#each categories as |c|}}
- {{hamburger-category category=c}}
- {{/each}}
-
- {{/if}}
+ {{mount-widget widget='hamburger-categories' args=(as-hash categories=categories)}}
{{#menu-links omitRule="true"}}
diff --git a/app/assets/javascripts/discourse/widgets/category-link.js.es6 b/app/assets/javascripts/discourse/widgets/category-link.js.es6
new file mode 100644
index 00000000000..509f531f8af
--- /dev/null
+++ b/app/assets/javascripts/discourse/widgets/category-link.js.es6
@@ -0,0 +1,10 @@
+import RawHtml from 'discourse/widgets/raw-html';
+import { categoryBadgeHTML } from 'discourse/helpers/category-link';
+
+// Right now it's RawHTML. Eventually it should emit nodes
+export default class CategoryLink extends RawHtml {
+ constructor(attrs) {
+ attrs.html = categoryBadgeHTML(attrs.category, attrs);
+ super(attrs);
+ }
+};
diff --git a/app/assets/javascripts/discourse/widgets/hamburger-categories.js.es6 b/app/assets/javascripts/discourse/widgets/hamburger-categories.js.es6
new file mode 100644
index 00000000000..cb86752c36f
--- /dev/null
+++ b/app/assets/javascripts/discourse/widgets/hamburger-categories.js.es6
@@ -0,0 +1,36 @@
+import { createWidget } from 'discourse/widgets/widget';
+import { h } from 'virtual-dom';
+
+createWidget('hamburger-category', {
+ tagName: 'li.category-link',
+
+ html(c) {
+ const results = [ this.attach('category_link', { category: c, allowUncategorized: true }) ];
+
+ const unreadTotal = parseInt(c.get('unreadTopics'), 10) + parseInt(c.get('newTopics'), 10);
+ if (unreadTotal) {
+ results.push(h('a.badge.badge-notification', { attributes: { href: c.get('url') } }, unreadTotal.toString()));
+ }
+
+ if (!this.currentUser) {
+ results.push(h('b.topics-count', c.get('topic_count').toString()));
+ }
+
+ return results;
+ }
+});
+
+export default createWidget('hamburger-categories', {
+ tagName: 'ul.category-links.clearfix',
+
+ html(attrs) {
+ const href = Discourse.getURL('/categories');
+ const result = [h('li.heading',
+ h('a.d-link.categories-link', { attributes: { href } }, I18n.t('filters.categories.title'))
+ )];
+
+ const categories = attrs.categories;
+ if (categories.length === 0) { return; }
+ return result.concat(categories.map(c => this.attach('hamburger-category', c)));
+ }
+});