mediawiki-extensions-Discus.../includes/Actions/SubscribeAction.php
Bartosz Dziewoński 316e741868 Support topic subscriptions when JavaScript is disabled
Unsubscribing was already available from Special:TopicSubscriptions
when JavaScript is disabled.

* Add links to subscribe/unsubscribe in CommentFormatter
* Update links in skin navigation
* Add support for subscribing in the actions

Bug: T321431
Change-Id: If3c4bf7df309d0d98237c3b7b9c129cc2f72cda3
2023-04-10 21:30:19 +02:00

173 lines
3.7 KiB
PHP

<?php
namespace MediaWiki\Extension\DiscussionTools\Actions;
use Article;
use ErrorPageError;
use FormAction;
use Html;
use HTMLForm;
use IContextSource;
use MediaWiki\Extension\DiscussionTools\SubscriptionStore;
use SpecialPage;
use Title;
use User;
use UserNotLoggedIn;
class SubscribeAction extends FormAction {
protected SubscriptionStore $subscriptionStore;
protected ?Title $subscriptionTitle = null;
protected ?string $subscriptionName = null;
public function __construct(
Article $page,
IContextSource $context,
SubscriptionStore $subscriptionStore
) {
parent::__construct( $page, $context );
$this->subscriptionStore = $subscriptionStore;
}
/**
* @inheritDoc
*/
protected function getPageTitle() {
if ( $this->subscriptionTitle && !str_starts_with( $this->subscriptionName, 'p-topics-' ) ) {
$title = $this->subscriptionTitle;
return htmlspecialchars( $title->getPrefixedText() ) .
$this->msg( 'pipe-separator' )->escaped() .
htmlspecialchars( $title->getFragment() );
} else {
return parent::getPageTitle();
}
}
/**
* @inheritDoc
*/
public function show() {
$commentName = $this->getRequest()->getVal( 'commentname' );
$section = $this->getRequest()->getVal( 'section', '' );
if ( $commentName !== null ) {
$this->subscriptionTitle = $this->getTitle()->createFragmentTarget( $section );
$this->subscriptionName = $commentName;
}
parent::show();
}
/**
* @inheritDoc
*/
public function getName() {
return 'dtsubscribe';
}
/**
* @inheritDoc
*/
public function requiresUnblock() {
return false;
}
/**
* @inheritDoc
*/
protected function getDescription() {
return '';
}
/**
* @inheritDoc
*/
protected function getFormFields() {
if ( $this->subscriptionTitle ) {
return [
'commentname' => [
'name' => 'commentname',
'type' => 'hidden',
'default' => $this->getRequest()->getVal( 'commentname' ),
],
'section' => [
'name' => 'section',
'type' => 'hidden',
'default' => $this->getRequest()->getVal( 'section', '' ),
],
'intro' => [
'type' => 'info',
'raw' => true,
'default' => $this->msg( str_starts_with( $this->subscriptionName, 'p-topics-' ) ?
'discussiontools-topicsubscription-action-subscribe-prompt-newtopics' :
'discussiontools-topicsubscription-action-subscribe-prompt' )->parse(),
],
];
} else {
return [];
}
}
/**
* @inheritDoc
*/
protected function alterForm( HTMLForm $form ) {
$form->setSubmitTextMsg( 'discussiontools-topicsubscription-action-subscribe-button' );
}
/**
* @inheritDoc
*/
public function onSubmit( $data ) {
return $this->subscriptionStore->addSubscriptionForUser(
$this->getUser(),
$this->subscriptionTitle,
$this->subscriptionName
);
}
/**
* @inheritDoc
*/
public function onSuccess() {
$this->getOutput()->addHTML(
Html::element(
'p',
[],
$this->msg( str_starts_with( $this->subscriptionName, 'p-topics-' ) ?
'discussiontools-newtopicssubscription-notify-subscribed-body' :
'discussiontools-topicsubscription-notify-subscribed-body' )->text()
)
);
$this->getOutput()->addReturnTo( $this->subscriptionTitle );
$this->getOutput()->addReturnTo( SpecialPage::getTitleFor( 'TopicSubscriptions' ) );
}
/**
* @inheritDoc
*/
protected function usesOOUI() {
return true;
}
/**
* @inheritDoc
* @throws ErrorPageError
*/
protected function checkCanExecute( User $user ) {
// Must be logged in
if ( $user->isAnon() ) {
throw new UserNotLoggedIn();
}
if ( !$this->subscriptionTitle ) {
throw new ErrorPageError(
'discussiontools-topicsubscription-error-not-found-title',
'discussiontools-topicsubscription-error-not-found-body'
);
}
parent::checkCanExecute( $user );
}
}