Roughly implement change password/email, delete account modals

This commit is contained in:
Toby Zerner
2015-05-26 18:03:02 +09:30
parent a4a0092513
commit e5532d9618
7 changed files with 123 additions and 8 deletions

View File

@ -0,0 +1,44 @@
import FormModal from 'flarum/components/form-modal';
import Alert from 'flarum/components/alert';
export default class ChangeEmailModal extends FormModal {
constructor(props) {
super(props);
this.email = m.prop(app.session.user().email());
}
view() {
return super.view({
className: 'modal-sm change-email-modal',
title: 'Change Email',
body: [
m('div.form-group', [
m('input.form-control[type=email][name=email][placeholder=Email]', {value: this.email(), onchange: m.withAttr('value', this.email)})
]),
m('div.form-group', [
m('button.btn.btn-primary.btn-block[type=submit]', 'Save Changes')
])
]
});
}
onsubmit(e) {
e.preventDefault();
if (this.email() === app.session.user().email()) {
this.hide();
return;
}
this.loading(true);
app.session.user().save({ email: this.email() }).then(() => {
this.hide();
}, response => {
this.loading(false);
this.alert = new Alert({ type: 'warning', message: response.errors.map((error, k) => [error.detail, k < response.errors.length - 1 ? m('br') : '']) });
m.redraw();
this.$('[name='+response.errors[0].path+']').select();
});
}
}

View File

@ -0,0 +1,30 @@
import FormModal from 'flarum/components/form-modal';
export default class ChangePasswordModal extends FormModal {
view() {
return super.view({
className: 'modal-sm change-password-modal',
title: 'Change Password',
body: [
m('p.help-text', 'Click the button below and check your email for a link to change your password.'),
m('div.form-group', [
m('button.btn.btn-primary.btn-block[type=submit]', 'Send Password Reset Email')
])
]
});
}
onsubmit(e) {
e.preventDefault();
this.loading(true);
m.request({
method: 'POST',
url: app.config['api_url']+'/forgot',
data: {email: app.session.user().email()},
background: true
}).then(response => {
this.hide();
});
}
}

View File

@ -0,0 +1,34 @@
import FormModal from 'flarum/components/form-modal';
export default class DeleteAccountModal extends FormModal {
constructor(props) {
super(props);
this.confirmation = m.prop();
}
view() {
return super.view({
className: 'modal-sm change-password-modal',
title: 'Delete Account',
body: [
m('p.help-text', 'Hold up there skippy! If you delete your account, there\'s no going back. All of your posts will be kept, but no longer associated with your account.'),
m('div.form-group', [
m('input.form-control[name=confirm][placeholder=Type "DELETE" to proceed]', {oninput: m.withAttr('value', this.confirmation)})
]),
m('div.form-group', [
m('button.btn.btn-primary.btn-block[type=submit]', {disabled: this.loading() || this.confirmation() != 'DELETE'}, 'Delete Account')
])
]
});
}
onsubmit(e) {
e.preventDefault();
if (this.confirmation() !== 'DELETE') return;
this.loading(true);
app.session.user().delete().then(() => app.session.logout());
}
}

View File

@ -4,6 +4,9 @@ import SwitchInput from 'flarum/components/switch-input';
import ActionButton from 'flarum/components/action-button'; import ActionButton from 'flarum/components/action-button';
import FieldSet from 'flarum/components/field-set'; import FieldSet from 'flarum/components/field-set';
import NotificationGrid from 'flarum/components/notification-grid'; import NotificationGrid from 'flarum/components/notification-grid';
import ChangePasswordModal from 'flarum/components/change-password-modal';
import ChangeEmailModal from 'flarum/components/change-email-modal';
import DeleteAccountModal from 'flarum/components/delete-account-modal';
import listItems from 'flarum/helpers/list-items'; import listItems from 'flarum/helpers/list-items';
import icon from 'flarum/helpers/icon'; import icon from 'flarum/helpers/icon';
@ -62,21 +65,24 @@ export default class SettingsPage extends UserPage {
items.add('changePassword', items.add('changePassword',
ActionButton.component({ ActionButton.component({
label: 'Change Password', label: 'Change Password',
className: 'btn btn-default' className: 'btn btn-default',
onclick: () => app.modal.show(new ChangePasswordModal())
}) })
); );
items.add('changeEmail', items.add('changeEmail',
ActionButton.component({ ActionButton.component({
label: 'Change Email', label: 'Change Email',
className: 'btn btn-default' className: 'btn btn-default',
onclick: () => app.modal.show(new ChangeEmailModal())
}) })
); );
items.add('deleteAccount', items.add('deleteAccount',
ActionButton.component({ ActionButton.component({
label: 'Delete Account', label: 'Delete Account',
className: 'btn btn-default btn-danger' className: 'btn btn-default btn-danger',
onclick: () => app.modal.show(new DeleteAccountModal())
}) })
); );

View File

@ -214,7 +214,7 @@ class CoreServiceProvider extends ServiceProvider
}); });
// Allow a user to edit their own account. // Allow a user to edit their own account.
User::grantPermission('edit', function ($grant, $user) { User::grantPermission(['edit', 'delete'], function ($grant, $user) {
$grant->where('id', $user->id); $grant->where('id', $user->id);
}); });

View File

@ -38,9 +38,9 @@ class EmailConfirmationMailer
'url' => route('flarum.forum.confirm', ['id' => $user->id, 'token' => $user->confirmation_token]) 'url' => route('flarum.forum.confirm', ['id' => $user->id, 'token' => $user->confirmation_token])
]; ];
$this->mailer->send(['text' => 'flarum::emails.confirm'], $data, function ($message) use ($user, $forumTitle) { $this->mailer->send(['text' => 'flarum::emails.confirm'], $data, function ($message) use ($user) {
$message->to($user->email); $message->to($user->email);
$message->subject('['.$forumTitle.'] Email Address Confirmation'); $message->subject('Email Address Confirmation');
}); });
} }

View File

@ -17,8 +17,9 @@ class LoginWithCookie
public function handle($request, Closure $next) public function handle($request, Closure $next)
{ {
if (($token = $request->cookie('flarum_remember')) && if (($token = $request->cookie('flarum_remember')) &&
($accessToken = AccessToken::where('id', $token)->first())) { ($accessToken = AccessToken::where('id', $token)->first()) &&
$this->actor->setUser($user = $accessToken->user); ($user = $accessToken->user)) {
$this->actor->setUser($user);
$user->updateLastSeen()->save(); $user->updateLastSeen()->save();
} }