diff --git a/js/dist/admin.js.map b/js/dist/admin.js.map
index 9fa05ee..7c6aee9 100644
--- a/js/dist/admin.js.map
+++ b/js/dist/admin.js.map
@@ -1 +1 @@
-{"version":3,"file":"admin.js","mappings":"MACA,IAAIA,EAAsB,CCA1BA,EAAyBC,IACxB,IAAIC,EAASD,GAAUA,EAAOE,WAC7B,IAAOF,EAAiB,QACxB,IAAM,EAEP,OADAD,EAAoBI,EAAEF,EAAQ,CAAEG,IACzBH,CAAM,ECLdF,EAAwB,CAACM,EAASC,KACjC,IAAI,IAAIC,KAAOD,EACXP,EAAoBS,EAAEF,EAAYC,KAASR,EAAoBS,EAAEH,EAASE,IAC5EE,OAAOC,eAAeL,EAASE,EAAK,CAAEI,YAAY,EAAMC,IAAKN,EAAWC,IAE1E,ECNDR,EAAwB,CAACc,EAAKC,IAAUL,OAAOM,UAAUC,eAAeC,KAAKJ,EAAKC,GCClFf,EAAyBM,IACH,oBAAXa,QAA0BA,OAAOC,aAC1CV,OAAOC,eAAeL,EAASa,OAAOC,YAAa,CAAEC,MAAO,WAE7DX,OAAOC,eAAeL,EAAS,aAAc,CAAEe,OAAO,GAAO,G,+BCL9D,MAAM,EAA+BC,OAAOC,KAAKC,OAAO,a,aCExDC,IAAAA,aAAAA,IAAqB,iBAAiB,WACpCA,IAAAA,cAAAA,IAAsB,iBAAiBC,mBACrC,CACEC,KAAM,wBACNC,MAAOH,IAAAA,WAAAA,MAAqB,yDAC5BI,WAAY,kBAEd,WAEH,G","sources":["webpack://@fof/spamblock/webpack/bootstrap","webpack://@fof/spamblock/webpack/runtime/compat get default export","webpack://@fof/spamblock/webpack/runtime/define property getters","webpack://@fof/spamblock/webpack/runtime/hasOwnProperty shorthand","webpack://@fof/spamblock/webpack/runtime/make namespace object","webpack://@fof/spamblock/external root \"flarum.core.compat['admin/app']\"","webpack://@fof/spamblock/./src/admin/index.ts"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['admin/app'];","import app from 'flarum/admin/app';\n\napp.initializers.add('fof-spamblock', () => {\n app.extensionData.for('fof-spamblock').registerPermission(\n {\n icon: 'fas fa-pastafarianism',\n label: app.translator.trans('fof-spamblock.admin.permissions.spamblock_users_label'),\n permission: 'user.spamblock',\n },\n 'moderate'\n );\n});\n"],"names":["__webpack_require__","module","getter","__esModule","d","a","exports","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","flarum","core","compat","app","registerPermission","icon","label","permission"],"sourceRoot":""}
\ No newline at end of file
+{"version":3,"file":"admin.js","mappings":"MACA,IAAIA,EAAsB,CCA1BA,EAAyBC,IACxB,IAAIC,EAASD,GAAUA,EAAOE,WAC7B,IAAOF,EAAiB,QACxB,IAAM,EAEP,OADAD,EAAoBI,EAAEF,EAAQ,CAAEG,IACzBH,CAAM,ECLdF,EAAwB,CAACM,EAASC,KACjC,IAAI,IAAIC,KAAOD,EACXP,EAAoBS,EAAEF,EAAYC,KAASR,EAAoBS,EAAEH,EAASE,IAC5EE,OAAOC,eAAeL,EAASE,EAAK,CAAEI,YAAY,EAAMC,IAAKN,EAAWC,IAE1E,ECNDR,EAAwB,CAACc,EAAKC,IAAUL,OAAOM,UAAUC,eAAeC,KAAKJ,EAAKC,GCClFf,EAAyBM,IACH,oBAAXa,QAA0BA,OAAOC,aAC1CV,OAAOC,eAAeL,EAASa,OAAOC,YAAa,CAAEC,MAAO,WAE7DX,OAAOC,eAAeL,EAAS,aAAc,CAAEe,OAAO,GAAO,G,+BCL9D,MAAM,EAA+BC,OAAOC,KAAKC,OAAO,a,aCExDC,IAAAA,aAAiBC,IAAI,iBAAiB,WACpCD,IAAAA,cAAiB,IAAK,iBAAiBE,mBACrC,CACEC,KAAM,wBACNC,MAAOJ,IAAAA,WAAeK,MAAM,yDAC5BC,WAAY,kBAEd,WAEJ,G","sources":["webpack://@fof/spamblock/webpack/bootstrap","webpack://@fof/spamblock/webpack/runtime/compat get default export","webpack://@fof/spamblock/webpack/runtime/define property getters","webpack://@fof/spamblock/webpack/runtime/hasOwnProperty shorthand","webpack://@fof/spamblock/webpack/runtime/make namespace object","webpack://@fof/spamblock/external root \"flarum.core.compat['admin/app']\"","webpack://@fof/spamblock/./src/admin/index.ts"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['admin/app'];","import app from 'flarum/admin/app';\n\napp.initializers.add('fof-spamblock', () => {\n app.extensionData.for('fof-spamblock').registerPermission(\n {\n icon: 'fas fa-pastafarianism',\n label: app.translator.trans('fof-spamblock.admin.permissions.spamblock_users_label'),\n permission: 'user.spamblock',\n },\n 'moderate'\n );\n});\n"],"names":["__webpack_require__","module","getter","__esModule","d","a","exports","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","flarum","core","compat","app","add","registerPermission","icon","label","trans","permission"],"sourceRoot":""}
\ No newline at end of file
diff --git a/js/dist/forum.js.map b/js/dist/forum.js.map
index 50f56ac..b99e4b1 100644
--- a/js/dist/forum.js.map
+++ b/js/dist/forum.js.map
@@ -1 +1 @@
-{"version":3,"file":"forum.js","mappings":"MACA,IAAIA,EAAsB,CCA1BA,EAAyBC,IACxB,IAAIC,EAASD,GAAUA,EAAOE,WAC7B,IAAOF,EAAiB,QACxB,IAAM,EAEP,OADAD,EAAoBI,EAAEF,EAAQ,CAAEG,EAAGH,IAC5BA,CAAM,ECLdF,EAAwB,CAACM,EAASC,KACjC,IAAI,IAAIC,KAAOD,EACXP,EAAoBS,EAAEF,EAAYC,KAASR,EAAoBS,EAAEH,EAASE,IAC5EE,OAAOC,eAAeL,EAASE,EAAK,CAAEI,YAAY,EAAMC,IAAKN,EAAWC,IAE1E,ECNDR,EAAwB,CAACc,EAAKC,IAAUL,OAAOM,UAAUC,eAAeC,KAAKJ,EAAKC,GCClFf,EAAyBM,IACH,oBAAXa,QAA0BA,OAAOC,aAC1CV,OAAOC,eAAeL,EAASa,OAAOC,YAAa,CAAEC,MAAO,WAE7DX,OAAOC,eAAeL,EAAS,aAAc,CAAEe,OAAO,GAAO,G,+BCL9D,MAAM,EAA+BC,OAAOC,KAAKC,OAAO,a,aCAxD,MAAM,EAA+BF,OAAOC,KAAKC,OAAO,iBCAlD,EAA+BF,OAAOC,KAAKC,OAAO,4B,aCAxD,MAAM,EAA+BF,OAAOC,KAAKC,OAAO,4B,aCAxD,MAAM,EAA+BF,OAAOC,KAAKC,OAAO,sB,aCAxD,MAAM,EAA+BF,OAAOC,KAAKC,OAAO,gB,aCSxDC,IAAAA,aAAAA,IAAqB,iBAAiB,WACpCC,IAAAA,UAAAA,aAA8BC,IAAAA,UAAgB,iBAE9CC,EAAAA,EAAAA,QAAOC,IAAc,sBAAsB,SAAUC,EAAiBC,GAChEA,EAAKC,gBACPF,EAAMG,IACJ,UACA,EAAC,IAAD,CACEC,KAAK,wBACLC,QAAS,WACFC,QAAQX,IAAAA,WAAAA,MAAqB,4DAElCA,IAAAA,QACW,CACPY,IAAQZ,IAAAA,MAAAA,UAAoB,UAAzB,UAA4CM,EAAKO,KAAjD,aACHC,OAAQ,SAETC,MAAK,kBAAMC,OAAOC,SAASC,QAAtB,GACT,GAEAlB,IAAAA,WAAAA,MAAqB,qDAI7B,GACF,G","sources":["webpack://@fof/spamblock/webpack/bootstrap","webpack://@fof/spamblock/webpack/runtime/compat get default export","webpack://@fof/spamblock/webpack/runtime/define property getters","webpack://@fof/spamblock/webpack/runtime/hasOwnProperty shorthand","webpack://@fof/spamblock/webpack/runtime/make namespace object","webpack://@fof/spamblock/external root \"flarum.core.compat['forum/app']\"","webpack://@fof/spamblock/external root \"flarum.core.compat['common/extend']\"","webpack://@fof/spamblock/external root \"flarum.core.compat['common/components/Button']\"","webpack://@fof/spamblock/external root \"flarum.core.compat['forum/utils/UserControls']\"","webpack://@fof/spamblock/external root \"flarum.core.compat['common/models/User']\"","webpack://@fof/spamblock/external root \"flarum.core.compat['common/Model']\"","webpack://@fof/spamblock/./src/forum/index.tsx"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['forum/app'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/extend'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/Button'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['forum/utils/UserControls'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/models/User'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/Model'];","import app from 'flarum/forum/app';\nimport { extend } from 'flarum/common/extend';\nimport Button from 'flarum/common/components/Button';\nimport UserControls from 'flarum/forum/utils/UserControls';\n\nimport User from 'flarum/common/models/User';\nimport Model from 'flarum/common/Model';\nimport ItemList from 'flarum/common/utils/ItemList';\n\napp.initializers.add('fof/spamblock', () => {\n User.prototype.canSpamblock = Model.attribute('canSpamblock');\n\n extend(UserControls, 'moderationControls', function (items: ItemList, user: User) {\n if (user.canSpamblock()) {\n items.add(\n 'spammer',\n \n );\n }\n });\n});\n"],"names":["__webpack_require__","module","getter","__esModule","d","a","exports","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","flarum","core","compat","app","User","Model","extend","UserControls","items","user","canSpamblock","add","icon","onclick","confirm","url","id","method","then","window","location","reload"],"sourceRoot":""}
\ No newline at end of file
+{"version":3,"file":"forum.js","mappings":"MACA,IAAIA,EAAsB,CCA1BA,EAAyBC,IACxB,IAAIC,EAASD,GAAUA,EAAOE,WAC7B,IAAOF,EAAiB,QACxB,IAAM,EAEP,OADAD,EAAoBI,EAAEF,EAAQ,CAAEG,EAAGH,IAC5BA,CAAM,ECLdF,EAAwB,CAACM,EAASC,KACjC,IAAI,IAAIC,KAAOD,EACXP,EAAoBS,EAAEF,EAAYC,KAASR,EAAoBS,EAAEH,EAASE,IAC5EE,OAAOC,eAAeL,EAASE,EAAK,CAAEI,YAAY,EAAMC,IAAKN,EAAWC,IAE1E,ECNDR,EAAwB,CAACc,EAAKC,IAAUL,OAAOM,UAAUC,eAAeC,KAAKJ,EAAKC,GCClFf,EAAyBM,IACH,oBAAXa,QAA0BA,OAAOC,aAC1CV,OAAOC,eAAeL,EAASa,OAAOC,YAAa,CAAEC,MAAO,WAE7DX,OAAOC,eAAeL,EAAS,aAAc,CAAEe,OAAO,GAAO,G,+BCL9D,MAAM,EAA+BC,OAAOC,KAAKC,OAAO,a,aCAxD,MAAM,EAA+BF,OAAOC,KAAKC,OAAO,iBCAlD,EAA+BF,OAAOC,KAAKC,OAAO,4B,aCAxD,MAAM,EAA+BF,OAAOC,KAAKC,OAAO,4B,aCAxD,MAAM,EAA+BF,OAAOC,KAAKC,OAAO,sB,aCAxD,MAAM,EAA+BF,OAAOC,KAAKC,OAAO,gB,aCSxDC,IAAAA,aAAiBC,IAAI,iBAAiB,WACpCC,IAAAA,UAAeC,aAAeC,IAAAA,UAAgB,iBAE9CC,EAAAA,EAAAA,QAAOC,IAAc,sBAAsB,SAAUC,EAAiBC,GAChEA,EAAKL,gBACPI,EAAMN,IACJ,UACAQ,EAACC,IAAM,CACLC,KAAK,wBACLC,QAAS,WACFC,QAAQb,IAAAA,WAAec,MAAM,4DAElCd,IAAAA,QACW,CACPe,IAAQf,IAAAA,MAAUgB,UAAU,UAAS,UAAUR,EAAKS,KAAI,aACxDC,OAAQ,SAETC,MAAK,kBAAMC,OAAOC,SAASC,QAAQ,GACxC,GAECtB,IAAAA,WAAec,MAAM,qDAI9B,GACF,G","sources":["webpack://@fof/spamblock/webpack/bootstrap","webpack://@fof/spamblock/webpack/runtime/compat get default export","webpack://@fof/spamblock/webpack/runtime/define property getters","webpack://@fof/spamblock/webpack/runtime/hasOwnProperty shorthand","webpack://@fof/spamblock/webpack/runtime/make namespace object","webpack://@fof/spamblock/external root \"flarum.core.compat['forum/app']\"","webpack://@fof/spamblock/external root \"flarum.core.compat['common/extend']\"","webpack://@fof/spamblock/external root \"flarum.core.compat['common/components/Button']\"","webpack://@fof/spamblock/external root \"flarum.core.compat['forum/utils/UserControls']\"","webpack://@fof/spamblock/external root \"flarum.core.compat['common/models/User']\"","webpack://@fof/spamblock/external root \"flarum.core.compat['common/Model']\"","webpack://@fof/spamblock/./src/forum/index.tsx"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['forum/app'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/extend'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/components/Button'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['forum/utils/UserControls'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/models/User'];","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.core.compat['common/Model'];","import app from 'flarum/forum/app';\nimport { extend } from 'flarum/common/extend';\nimport Button from 'flarum/common/components/Button';\nimport UserControls from 'flarum/forum/utils/UserControls';\n\nimport User from 'flarum/common/models/User';\nimport Model from 'flarum/common/Model';\nimport ItemList from 'flarum/common/utils/ItemList';\n\napp.initializers.add('fof/spamblock', () => {\n User.prototype.canSpamblock = Model.attribute('canSpamblock');\n\n extend(UserControls, 'moderationControls', function (items: ItemList, user: User) {\n if (user.canSpamblock()) {\n items.add(\n 'spammer',\n \n );\n }\n });\n});\n"],"names":["__webpack_require__","module","getter","__esModule","d","a","exports","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","flarum","core","compat","app","add","User","canSpamblock","Model","extend","UserControls","items","user","m","Button","icon","onclick","confirm","trans","url","attribute","id","method","then","window","location","reload"],"sourceRoot":""}
\ No newline at end of file