namespace BookStack\Theming;
-use BookStack\Auth\Access\SocialAuthService;
+use BookStack\Access\SocialDriverManager;
+use BookStack\Exceptions\ThemeException;
+use Illuminate\Console\Application;
+use Illuminate\Console\Application as Artisan;
+use Symfony\Component\Console\Command\Command;
class ThemeService
{
- protected $listeners = [];
+ /**
+ * @var array<string, callable[]>
+ */
+ protected array $listeners = [];
+
+ /**
+ * Get the currently configured theme.
+ * Returns an empty string if not configured.
+ */
+ public function getTheme(): string
+ {
+ return config('view.theme') ?? '';
+ }
/**
* Listen to a given custom theme event,
* setting up the action to be ran when the event occurs.
*/
- public function listen(string $event, callable $action)
+ public function listen(string $event, callable $action): void
{
if (!isset($this->listeners[$event])) {
$this->listeners[$event] = [];
*
* If a callback returns a non-null value, this method will
* stop and return that value itself.
- *
- * @return mixed
*/
- public function dispatch(string $event, ...$args)
+ public function dispatch(string $event, ...$args): mixed
{
foreach ($this->listeners[$event] ?? [] as $action) {
$result = call_user_func_array($action, $args);
return null;
}
+ /**
+ * Check if there are listeners registered for the given event name.
+ */
+ public function hasListeners(string $event): bool
+ {
+ return count($this->listeners[$event] ?? []) > 0;
+ }
+
+ /**
+ * Register a new custom artisan command to be available.
+ */
+ public function registerCommand(Command $command): void
+ {
+ Artisan::starting(function (Application $application) use ($command) {
+ $application->addCommands([$command]);
+ });
+ }
+
/**
* Read any actions from the set theme path if the 'functions.php' file exists.
*/
- public function readThemeActions()
+ public function readThemeActions(): void
{
$themeActionsFile = theme_path('functions.php');
- if (file_exists($themeActionsFile)) {
- require $themeActionsFile;
+ if ($themeActionsFile && file_exists($themeActionsFile)) {
+ try {
+ require $themeActionsFile;
+ } catch (\Error $exception) {
+ throw new ThemeException("Failed loading theme functions file at \"{$themeActionsFile}\" with error: {$exception->getMessage()}");
+ }
}
}
/**
- * @see SocialAuthService::addSocialDriver
+ * @see SocialDriverManager::addSocialDriver
*/
- public function addSocialDriver(string $driverName, array $config, string $socialiteHandler, callable $configureForRedirect = null)
+ public function addSocialDriver(string $driverName, array $config, string $socialiteHandler, ?callable $configureForRedirect = null): void
{
- $socialAuthService = app()->make(SocialAuthService::class);
- $socialAuthService->addSocialDriver($driverName, $config, $socialiteHandler, $configureForRedirect);
+ $driverManager = app()->make(SocialDriverManager::class);
+ $driverManager->addSocialDriver($driverName, $config, $socialiteHandler, $configureForRedirect);
}
}