mirror of
https://github.com/Poniverse/Pony.fm.git
synced 2024-11-22 13:07:59 +01:00
#25: Built out email unsubscription UI and further tweaked the email template.
This commit is contained in:
parent
b6b3f036cc
commit
b7088ccfb7
11 changed files with 120 additions and 9 deletions
|
@ -21,9 +21,11 @@
|
||||||
namespace Poniverse\Ponyfm\Http\Controllers;
|
namespace Poniverse\Ponyfm\Http\Controllers;
|
||||||
|
|
||||||
use App;
|
use App;
|
||||||
|
use Auth;
|
||||||
use DB;
|
use DB;
|
||||||
use Poniverse\Ponyfm\Models\Email;
|
use Poniverse\Ponyfm\Models\Email;
|
||||||
use Poniverse\Ponyfm\Models\EmailSubscription;
|
use Poniverse\Ponyfm\Models\EmailSubscription;
|
||||||
|
use View;
|
||||||
|
|
||||||
|
|
||||||
class NotificationsController extends Controller {
|
class NotificationsController extends Controller {
|
||||||
|
@ -45,9 +47,24 @@ class NotificationsController extends Controller {
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getEmailUnsubscribe($subscriptionKey) {
|
public function getEmailUnsubscribe($subscriptionKey) {
|
||||||
|
/** @var EmailSubscription $subscription */
|
||||||
$subscription = EmailSubscription::findOrFail($subscriptionKey);
|
$subscription = EmailSubscription::findOrFail($subscriptionKey);
|
||||||
$subscription->delete();
|
$subscription->delete();
|
||||||
|
|
||||||
return 'Unsubscribed!';
|
if (Auth::check() && $subscription->user->id === Auth::user()->id) {
|
||||||
|
return redirect(route('account:settings', [
|
||||||
|
'slug' => $subscription->user->slug,
|
||||||
|
'unsubscribedMessageKey' => $subscription->activity_type
|
||||||
|
]), 303);
|
||||||
|
} else {
|
||||||
|
return redirect(route('email:confirm-unsubscribed', [
|
||||||
|
'unsubscribedUser' => $subscription->user->display_name,
|
||||||
|
'unsubscribedMessageKey' => $subscription->activity_type
|
||||||
|
]), 303);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getEmailUnsubscribePage() {
|
||||||
|
return View::make('shared.null');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -127,8 +127,10 @@ abstract class BaseNotification extends Mailable {
|
||||||
->text("emails.plaintext.notifications.{$templateName}")
|
->text("emails.plaintext.notifications.{$templateName}")
|
||||||
->with(array_merge($extraVariables, [
|
->with(array_merge($extraVariables, [
|
||||||
'notificationUrl' => $this->generateNotificationUrl(),
|
'notificationUrl' => $this->generateNotificationUrl(),
|
||||||
'unsubscribeUrl' => $this->generateUnsubscribeUrl(),
|
'unsubscribeUrl' => $this->generateUnsubscribeUrl(),
|
||||||
'thumbnailUrl' => $this->activityRecord->thumbnail_url
|
'thumbnailUrl' => $this->activityRecord->thumbnail_url,
|
||||||
|
'recipientName' => $this->emailRecord->getUser()->display_name,
|
||||||
|
'accountSettingsUrl' => $this->emailRecord->getUser()->getSettingsUrl(),
|
||||||
]));
|
]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -338,6 +338,11 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon
|
||||||
return Gravatar::getUrl($email, Image::$ImageTypes[$type]['width']);
|
return Gravatar::getUrl($email, Image::$ImageTypes[$type]['width']);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getSettingsUrl()
|
||||||
|
{
|
||||||
|
return route('account:settings', ['slug' => $this->slug]);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the token value for the "remember me" session.
|
* Get the token value for the "remember me" session.
|
||||||
*
|
*
|
||||||
|
|
|
@ -44,6 +44,10 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-8" ng-if="::settings.can_manage_notifications">
|
<div class="col-md-8" ng-if="::settings.can_manage_notifications">
|
||||||
|
<div class="alert alert-warning" ng-if="unsubscribeMessage">
|
||||||
|
<p>{{ ::unsubscribeMessage }}</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
<h3>Notification settings</h3>
|
<h3>Notification settings</h3>
|
||||||
<p>On-site notifications are always on. That way, you can always see
|
<p>On-site notifications are always on. That way, you can always see
|
||||||
what you've missed whenever you log on to Pony.fm!</p>
|
what you've missed whenever you log on to Pony.fm!</p>
|
||||||
|
|
3
public/templates/home/email-unsubscribed.html
Normal file
3
public/templates/home/email-unsubscribed.html
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
<div class="alert alert-warning" ng-if="unsubscribeMessage">
|
||||||
|
<p>{{ ::unsubscribeMessage }}</p>
|
||||||
|
</div>
|
|
@ -307,8 +307,12 @@ ponyfm.config [
|
||||||
templateUrl: '/templates/admin/announcement-show.html'
|
templateUrl: '/templates/admin/announcement-show.html'
|
||||||
controller: 'admin-announcement-edit'
|
controller: 'admin-announcement-edit'
|
||||||
|
|
||||||
# Homepage
|
state.state 'notifications-email-unsubscribed',
|
||||||
|
url: '/notifications/email/unsubscribed',
|
||||||
|
controller: 'notifications-email-unsubscribed',
|
||||||
|
templateUrl: '/templates/home/email-unsubscribed.html'
|
||||||
|
|
||||||
|
# Homepage
|
||||||
if window.pfm.auth.isLogged
|
if window.pfm.auth.isLogged
|
||||||
state.state 'home',
|
state.state 'home',
|
||||||
url: '/'
|
url: '/'
|
||||||
|
|
|
@ -15,11 +15,12 @@
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
module.exports = angular.module('ponyfm').controller "account-settings", [
|
module.exports = angular.module('ponyfm').controller "account-settings", [
|
||||||
'$scope', 'auth', '$state'
|
'$scope', 'auth', '$state', 'activity-types',
|
||||||
($scope, auth, $state) ->
|
($scope, auth, $state, activityTypes) ->
|
||||||
$scope.settings = {}
|
$scope.settings = {}
|
||||||
$scope.errors = {}
|
$scope.errors = {}
|
||||||
$scope.isDirty = false
|
$scope.isDirty = false
|
||||||
|
$scope.unsubscribeMessage = activityTypes.getUnsubscribeMessage()
|
||||||
|
|
||||||
$scope.touchModel = () ->
|
$scope.touchModel = () ->
|
||||||
$scope.isDirty = true
|
$scope.isDirty = true
|
||||||
|
|
|
@ -0,0 +1,24 @@
|
||||||
|
# Pony.fm - A community for pony fan music.
|
||||||
|
# Copyright (C) 2016 Peter Deltchev
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU Affero General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU Affero General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU Affero General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
module.exports = angular.module('ponyfm').controller "notifications-email-unsubscribed", [
|
||||||
|
'$scope', 'activity-types',
|
||||||
|
($scope, activityTypes) ->
|
||||||
|
console.log("boom")
|
||||||
|
|
||||||
|
$scope.unsubscribeMessage = activityTypes.getUnsubscribeMessage()
|
||||||
|
|
||||||
|
]
|
50
resources/assets/scripts/app/services/activity-types.coffee
Normal file
50
resources/assets/scripts/app/services/activity-types.coffee
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
# Pony.fm - A community for pony fan music.
|
||||||
|
# Copyright (C) 2016 Peter Deltchev
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU Affero General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU Affero General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU Affero General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
module.exports = angular.module('ponyfm').factory('activity-types', [
|
||||||
|
'$location',
|
||||||
|
($location) ->
|
||||||
|
self =
|
||||||
|
getUnsubscribeMessage: () ->
|
||||||
|
if $location.search().unsubscribedMessageKey?
|
||||||
|
if $location.search().unsubscribedUser?
|
||||||
|
return self.generateUnsubscribeMessage(
|
||||||
|
$location.search().unsubscribedMessageKey,
|
||||||
|
$location.search().unsubscribedUser,
|
||||||
|
)
|
||||||
|
else
|
||||||
|
return self.generateUnsubscribeMessage($location.search().unsubscribedMessageKey)
|
||||||
|
else
|
||||||
|
return null
|
||||||
|
|
||||||
|
generateUnsubscribeMessage: (activityType, displayName = null) ->
|
||||||
|
# TODO: get these messages from the backend
|
||||||
|
switch parseInt(activityType)
|
||||||
|
when 1 then activityString = 'updates from the Pony.fm team'
|
||||||
|
when 2 then activityString = 'new tracks by users you follow'
|
||||||
|
when 3 then activityString = 'new albums by users you follow'
|
||||||
|
when 4 then activityString = 'new playlists by users you follow'
|
||||||
|
when 5 then activityString = 'when you get new followers'
|
||||||
|
when 6 then activityString = 'when someone leaves you a comment'
|
||||||
|
when 7 then activityString = 'when something of yours is favourited'
|
||||||
|
else throw "#{activityType} is an invalid activity type!"
|
||||||
|
|
||||||
|
if displayName
|
||||||
|
return "#{displayName} - you've been unsubscribed from email notifications for #{activityString}. You can re-enable them by logging in and going to your account settings."
|
||||||
|
else
|
||||||
|
return "You successfully unsubscribed from email notifications for #{activityString}. If you want, you can re-subscribe below."
|
||||||
|
return self
|
||||||
|
])
|
|
@ -24,13 +24,13 @@
|
||||||
<row>
|
<row>
|
||||||
<columns large="6">
|
<columns large="6">
|
||||||
<h6>What's this?</h6>
|
<h6>What's this?</h6>
|
||||||
<p><small>Pony.fm can now send you notifications via email! You can control what you get email notifications for in your <a href="#">account settings</a>.</small></p>
|
<p><small>Pony.fm can now send you notifications via email! You can control what you get email notifications for in your <a href="\{{ $accountSettingsUrl }}">account settings</a>.</small></p>
|
||||||
<p><small><a href="\{{ $unsubscribeUrl }}" target="_blank">Unsubscribe from this kind of email</a></small></p>
|
<p><small><a href="\{{ $unsubscribeUrl }}" target="_blank">Unsubscribe from this kind of email</a></small></p>
|
||||||
</columns>
|
</columns>
|
||||||
<columns large="6">
|
<columns large="6">
|
||||||
<br>
|
<br>
|
||||||
<p><small>
|
<p><small>
|
||||||
Sent with ♥<br>
|
Sent with ♥ to \{{ $recipientName }}<br>
|
||||||
<br>
|
<br>
|
||||||
Poniverse<br>
|
Poniverse<br>
|
||||||
248-1641 Lonsdale Avenue<br>
|
248-1641 Lonsdale Avenue<br>
|
||||||
|
|
|
@ -80,6 +80,7 @@ Route::get('notifications', 'AccountController@getNotifications');
|
||||||
|
|
||||||
Route::group(['prefix' => 'notifications/email'], function() {
|
Route::group(['prefix' => 'notifications/email'], function() {
|
||||||
Route::get('/unsubscribe/{subscriptionKey}', 'NotificationsController@getEmailUnsubscribe')->name('email:unsubscribe');
|
Route::get('/unsubscribe/{subscriptionKey}', 'NotificationsController@getEmailUnsubscribe')->name('email:unsubscribe');
|
||||||
|
Route::get('/unsubscribed', 'NotificationsController@getEmailUnsubscribePage')->name('email:confirm-unsubscribed');
|
||||||
Route::get('/click/{emailKey}', 'NotificationsController@getEmailClick')->name('email:click');
|
Route::get('/click/{emailKey}', 'NotificationsController@getEmailClick')->name('email:click');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -246,7 +247,7 @@ Route::group(['prefix' => '{slug}'], function () {
|
||||||
|
|
||||||
Route::get('/uploader', 'UploaderController@getIndex');
|
Route::get('/uploader', 'UploaderController@getIndex');
|
||||||
|
|
||||||
Route::get('/', 'AccountController@getIndex');
|
Route::get('/', 'AccountController@getIndex')->name('account:settings');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue