From fc06dba1b35481aba96a269326634ccc8329ef50 Mon Sep 17 00:00:00 2001 From: Ian Morland <16573496+imorland@users.noreply.github.com> Date: Sun, 12 Dec 2021 23:48:10 +0000 Subject: [PATCH] feat: Display suspension to user (#41) --- extensions/suspend/extend.php | 5 +- .../js/src/forum/checkForSuspension.ts | 19 +++ extensions/suspend/js/src/forum/compat.js | 13 ++ .../src/forum/components/SuspendUserModal.js | 153 ++++++++++++------ .../forum/components/SuspensionInfoModal.js | 48 ++++++ .../components/UserSuspendedNotification.js | 10 +- .../components/UserUnsuspendedNotification.js | 1 + .../js/src/forum/helpers/suspensionHelper.ts | 16 ++ extensions/suspend/js/src/forum/index.js | 11 ++ extensions/suspend/locale/en.yml | 33 ++++ ..._000000_add_suspend_reason_and_message.php | 15 ++ .../suspend/src/AddUserSuspendAttributes.php | 5 + .../src/Listener/SaveSuspensionToDatabase.php | 14 +- .../Notification/UserSuspendedBlueprint.php | 20 ++- .../Notification/UserUnsuspendedBlueprint.php | 23 ++- .../suspend/views/emails/suspended.blade.php | 4 + .../views/emails/unsuspended.blade.php | 4 + 17 files changed, 333 insertions(+), 61 deletions(-) create mode 100644 extensions/suspend/js/src/forum/checkForSuspension.ts create mode 100644 extensions/suspend/js/src/forum/compat.js create mode 100644 extensions/suspend/js/src/forum/components/SuspensionInfoModal.js create mode 100644 extensions/suspend/js/src/forum/helpers/suspensionHelper.ts create mode 100644 extensions/suspend/migrations/2021_10_27_000000_add_suspend_reason_and_message.php create mode 100644 extensions/suspend/views/emails/suspended.blade.php create mode 100644 extensions/suspend/views/emails/unsuspended.blade.php diff --git a/extensions/suspend/extend.php b/extensions/suspend/extend.php index 860e75a55..7e66e7609 100644 --- a/extensions/suspend/extend.php +++ b/extensions/suspend/extend.php @@ -60,5 +60,8 @@ return [ ->addFilter(SuspendedFilterGambit::class), (new Extend\SimpleFlarumSearch(UserSearcher::class)) - ->addGambit(SuspendedFilterGambit::class) + ->addGambit(SuspendedFilterGambit::class), + + (new Extend\View()) + ->namespace('flarum-suspend', __DIR__.'/views'), ]; diff --git a/extensions/suspend/js/src/forum/checkForSuspension.ts b/extensions/suspend/js/src/forum/checkForSuspension.ts new file mode 100644 index 000000000..cab627836 --- /dev/null +++ b/extensions/suspend/js/src/forum/checkForSuspension.ts @@ -0,0 +1,19 @@ +import app from 'flarum/forum/app'; +import SuspensionInfoModal from './components/SuspensionInfoModal'; +import { localStorageKey } from './helpers/suspensionHelper'; + +export default function () { + return setTimeout(() => { + if (app.session.user) { + const message = app.session.user.suspendMessage(); + const until = app.session.user.suspendedUntil(); + const alreadyDisplayed = localStorage.getItem(localStorageKey()) === until.getTime().toString(); + + if (message && !alreadyDisplayed) { + app.modal.show(SuspensionInfoModal, { message, until }); + } else if (!until && localStorage.getItem(localStorageKey())) { + localStorage.removeItem(localStorageKey()); + } + } + }, 0); +} diff --git a/extensions/suspend/js/src/forum/compat.js b/extensions/suspend/js/src/forum/compat.js new file mode 100644 index 000000000..f1931b7c3 --- /dev/null +++ b/extensions/suspend/js/src/forum/compat.js @@ -0,0 +1,13 @@ +import SuspendUserModal from './components/SuspendUserModal'; +import SuspensionInfoModal from './components/SuspensionInfoModal'; +import UserSuspendedNotification from './components/UserSuspendedNotification'; +import UserUnsuspendedNotification from './components/UserUnsuspendedNotification'; +import checkForSuspension from './checkForSuspension'; + +export default { + 'suspend/components/suspendUserModal': SuspendUserModal, + 'suspend/components/suspensionInfoModal': SuspensionInfoModal, + 'suspend/components/UserSuspendedNotification': UserSuspendedNotification, + 'suspend/components/UserUnsuspendedNotification': UserUnsuspendedNotification, + 'suspend/checkForSuspension': checkForSuspension, +}; diff --git a/extensions/suspend/js/src/forum/components/SuspendUserModal.js b/extensions/suspend/js/src/forum/components/SuspendUserModal.js index 305b4d6d6..d45cf3de6 100644 --- a/extensions/suspend/js/src/forum/components/SuspendUserModal.js +++ b/extensions/suspend/js/src/forum/components/SuspendUserModal.js @@ -1,14 +1,19 @@ +import app from 'flarum/forum/app'; import Modal from 'flarum/components/Modal'; import Button from 'flarum/components/Button'; import Stream from 'flarum/utils/Stream'; import withAttr from 'flarum/utils/withAttr'; +import ItemList from 'flarum/common/utils/ItemList'; +import { getPermanentSuspensionDate } from '../helpers/suspensionHelper'; export default class SuspendUserModal extends Modal { oninit(vnode) { super.oninit(vnode); let until = this.attrs.user.suspendedUntil(); + const reason = this.attrs.user.suspendReason(); + const message = this.attrs.user.suspendMessage(); let status = null; if (new Date() > until) until = null; @@ -19,11 +24,13 @@ export default class SuspendUserModal extends Modal { } this.status = Stream(status); + this.reason = Stream(reason); + this.message = Stream(message); this.daysRemaining = Stream(status === 'limited' && -dayjs().diff(until, 'days') + 1); } className() { - return 'SuspendUserModal Modal--small'; + return 'SuspendUserModal Modal--medium'; } title() { @@ -36,53 +43,7 @@ export default class SuspendUserModal extends Modal {
-
- - - - - -
+
{this.formItems().toArray()}
@@ -95,6 +56,96 @@ export default class SuspendUserModal extends Modal { ); } + radioItems() { + const items = new ItemList(); + + items.add( + 'not-suspended', + , + 100 + ); + + items.add( + 'indefinitely', + , + 90 + ); + + items.add( + 'time-suspension', + , + 80 + ); + + return items; + } + + formItems() { + const items = new ItemList(); + + items.add('radioItems',
{this.radioItems().toArray()}
, 100); + + items.add( + 'reason', +
+