Use new BeforeTemplateRenderedEvent for share template loading

Signed-off-by: Joas Schilling <coding@schilljs.com>
This commit is contained in:
Joas Schilling 2020-07-16 11:36:35 +02:00
Родитель 35bb655d79
Коммит 79a97a9db2
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 7076EA9751AACDDA
3 изменённых файлов: 36 добавлений и 57 удалений

Просмотреть файл

@ -23,6 +23,7 @@ declare(strict_types=1);
namespace OCA\Talk\AppInfo;
use OCA\Files_Sharing\Event\BeforeTemplateRenderedEvent;
use OCA\Talk\Activity\Listener as ActivityListener;
use OCA\Talk\Capabilities;
use OCA\Talk\Chat\Changelog\Listener as ChangelogListener;
@ -87,6 +88,8 @@ class Application extends App implements IBootstrap {
$context->registerEventListener(AddFeaturePolicyEvent::class, FeaturePolicyListener::class);
$context->registerEventListener(UserDeletedEvent::class, UserDeletedListener::class);
$context->registerEventListener(BeforeUserLoggedOutEvent::class, BeforeUserLoggedOutListener::class);
$context->registerEventListener(BeforeTemplateRenderedEvent::class, PublicShareTemplateLoader::class);
$context->registerEventListener(BeforeTemplateRenderedEvent::class, PublicShareAuthTemplateLoader::class);
}
public function boot(IBootContext $context): void {
@ -105,8 +108,6 @@ class Application extends App implements IBootstrap {
SystemMessageListener::register($dispatcher);
ParserListener::register($dispatcher);
PublicShareAuthListener::register($dispatcher);
PublicShareAuthTemplateLoader::register($dispatcher);
PublicShareTemplateLoader::register($dispatcher);
FilesListener::register($dispatcher);
FilesTemplateLoader::register($dispatcher);
RestrictStartingCallsListener::register($dispatcher);

Просмотреть файл

@ -25,25 +25,23 @@ declare(strict_types=1);
namespace OCA\Talk\PublicShare;
use OCA\Files_Sharing\Event\BeforeTemplateRenderedEvent;
use OCA\Talk\Config;
use OCA\Talk\TInitialState;
use OCP\EventDispatcher\IEventDispatcher;
use OCP\EventDispatcher\Event;
use OCP\EventDispatcher\IEventListener;
use OCP\Files\FileInfo;
use OCP\ICacheFactory;
use OCP\IConfig;
use OCP\IInitialStateService;
use OCP\Share\IShare;
use OCP\Util;
use Symfony\Component\EventDispatcher\GenericEvent;
/**
* Helper class to extend the "publicshare" template from the server.
*
* The "loadTalkSidebarUi" method loads additional scripts that, when run on the
* browser, adjust the page generated by the server to inject the Talk UI as
* needed.
* The additional scripts modify the page in the browser to inject the Talk UI as needed.
*/
class TemplateLoader {
class TemplateLoader implements IEventListener {
use TInitialState;
public function __construct(IInitialStateService $initialStateService,
@ -56,30 +54,26 @@ class TemplateLoader {
$this->serverConfig = $serverConfig;
}
public static function register(IEventDispatcher $dispatcher): void {
$dispatcher->addListener('OCA\Files_Sharing::loadAdditionalScripts', static function (GenericEvent $event) {
/** @var IShare $share */
$share = $event->getArgument('share');
/** @var self $templateLoader */
$templateLoader = \OC::$server->query(self::class);
$templateLoader->loadTalkSidebarUi($share);
});
}
/**
* Load the "Talk sidebar" UI in the public share page for the given share.
*
* This method should be called when loading additional scripts for the
* public share page of the server.
*
* @param IShare $share
* @param Event $event
*/
public function loadTalkSidebarUi(IShare $share): void {
public function handle(Event $event): void {
if (!$event instanceof BeforeTemplateRenderedEvent) {
return;
}
if ($event->getScope() !== null) {
// If the event has a scope, it's not the default share page, but e.g. authentication
return;
}
if ($this->serverConfig->getAppValue('spreed', 'conversations_files', '1') !== '1' ||
$this->serverConfig->getAppValue('spreed', 'conversations_files_public_shares', '1') !== '1') {
return;
}
$share = $event->getShare();
if ($share->getNodeType() !== FileInfo::TYPE_FILE) {
return;
}

Просмотреть файл

@ -1,6 +1,7 @@
<?php
declare(strict_types=1);
/**
*
* @copyright Copyright (c) 2018, Daniel Calviño Sánchez (danxuliu@gmail.com)
@ -24,24 +25,22 @@ declare(strict_types=1);
namespace OCA\Talk\PublicShareAuth;
use OCA\Files_Sharing\Event\BeforeTemplateRenderedEvent;
use OCA\Talk\Config;
use OCA\Talk\TInitialState;
use OCP\EventDispatcher\IEventDispatcher;
use OCP\EventDispatcher\Event;
use OCP\EventDispatcher\IEventListener;
use OCP\ICacheFactory;
use OCP\IConfig;
use OCP\IInitialStateService;
use OCP\Share\IShare;
use OCP\Util;
use Symfony\Component\EventDispatcher\GenericEvent;
/**
* Helper class to extend the "publicshareauth" template from the server.
*
* The "loadRequestPasswordByTalkUi" method loads additional scripts that, when
* run on the browser, adjust the page generated by the server to inject the
* Talk UI as needed.
* The additional scripts modify the page in the browser to inject the Talk UI as needed.
*/
class TemplateLoader {
class TemplateLoader implements IEventListener {
use TInitialState;
public function __construct(IInitialStateService $initialStateService,
@ -49,43 +48,28 @@ class TemplateLoader {
Config $talkConfig,
IConfig $serverConfig) {
$this->initialStateService = $initialStateService;
$this->memcacheFactory = $memcacheFactory;
$this->talkConfig = $talkConfig;
$this->memcacheFactory = $memcacheFactory;
$this->serverConfig = $serverConfig;
}
public static function register(IEventDispatcher $dispatcher): void {
$listener = static function (GenericEvent $event) {
/** @var IShare $share */
$share = $event->getArgument('share');
/** @var self $templateLoader */
$templateLoader = \OC::$server->query(self::class);
$templateLoader->loadRequestPasswordByTalkUi($share);
};
$dispatcher->addListener('OCA\Files_Sharing::loadAdditionalScripts::publicShareAuth', $listener);
}
/**
* Load the "Request password by Talk" UI in the public share authentication
* page for the given share.
*
* If the "Send Password by Talk" option is not set in the share then no UI
* to request the password is provided.
*
* This method should be called when loading additional scripts for the
* public share authentication page of the server.
*
* @param IShare $share
* Load the "Video verification" UI in the public share auth page.
* @param Event $event
*/
public function loadRequestPasswordByTalkUi(IShare $share): void {
if (!$share->getSendPasswordByTalk()) {
public function handle(Event $event): void {
if (!$event instanceof BeforeTemplateRenderedEvent) {
return;
}
if ($event->getScope() !== BeforeTemplateRenderedEvent::SCOPE_PUBLIC_SHARE_AUTH) {
// If the scope is not the authentication page we don't load this part of the Talk UI
return;
}
Util::addStyle('spreed', 'merged-share-auth');
Util::addScript('spreed', 'talk-public-share-auth-sidebar');
$this->publishInitialStateForGuest();
}
}