From 761b1d1c46584a7e4206f362a14f2bae2a3a6095 Mon Sep 17 00:00:00 2001 From: Daniel Waxweiler Date: Sat, 11 Nov 2023 20:12:30 +0100 Subject: [PATCH] wip --- source/connector-mobilizon.php | 6 +++ source/front/blocks/events-list/edit.js | 25 +++++++++++- source/front/events-displayer.js | 2 +- source/includes/Api.php | 52 +++++++++++++++++++++++++ 4 files changed, 83 insertions(+), 2 deletions(-) create mode 100644 source/includes/Api.php diff --git a/source/connector-mobilizon.php b/source/connector-mobilizon.php index b9cac8a..6c9097a 100644 --- a/source/connector-mobilizon.php +++ b/source/connector-mobilizon.php @@ -13,6 +13,7 @@ require_once __DIR__ . '/includes/exceptions/GeneralException.php'; require_once __DIR__ . '/includes/exceptions/GroupNotFoundException.php'; require_once __DIR__ . '/includes/Constants.php'; +require_once __DIR__ . '/includes/Api.php'; require_once __DIR__ . '/includes/EventsCache.php'; require_once __DIR__ . '/includes/Settings.php'; require_once __DIR__ . '/includes/DateTimeWrapper.php'; @@ -30,6 +31,7 @@ if (!defined('ABSPATH')) { final class Mobilizon_Connector { private function __construct() { + add_action('init', [$this, 'register_api']); add_action('init', [$this, 'register_blocks']); add_action('init', [$this, 'register_settings'], 1); // required for register_blocks add_action('init', [$this, 'register_shortcut']); @@ -60,6 +62,10 @@ final class Mobilizon_Connector { wp_add_inline_script($scriptName, 'var MOBILIZON_CONNECTOR = ' . json_encode($settings), 'before'); } + public function register_api() { + MobilizonConnector\Api::init(); + } + public function register_blocks() { $scriptName = MobilizonConnector\EventsListBlock::initAndReturnScriptName(); $this->load_settings_globally_before_script($scriptName); diff --git a/source/front/blocks/events-list/edit.js b/source/front/blocks/events-list/edit.js index d1da0bf..3612b2f 100644 --- a/source/front/blocks/events-list/edit.js +++ b/source/front/blocks/events-list/edit.js @@ -1,5 +1,9 @@ /* eslint-disable @wordpress/i18n-ellipsis */ import { loadEventList } from '../../events-loader.js' +import { + showLoadingIndicator, + hideLoadingIndicator +} from '../../events-displayer.js' const { InspectorControls, useBlockProps } = wp.blockEditor const { PanelBody } = wp.components @@ -23,7 +27,25 @@ export default ({ attributes, setAttributes }) => { timer = setTimeout(() => { const container = document.getElementById(blockProps.id) if (container) { - loadEventList(container) + // loadEventList(container) + // TODO use API instead + + // TODO not using newest values yet + showLoadingIndicator(container) + const eventsCount = attributes.eventsCount + const groupName = attributes.groupName + let url = `/wp-json/connector-mobilizon/v1/events?eventsCount=${eventsCount}` + if (groupName) { + url += `&groupName=${groupName}` + } + fetch(url) + .then((response) => response.text()) // TODO also handle response.ok being false + .then((data) => { + console.log(data) // TODO handle + }) + .finally(() => { + hideLoadingIndicator(container) + }) } }, 500) } @@ -37,6 +59,7 @@ export default ({ attributes, setAttributes }) => { reloadEventList() } function updateGroupName(event) { + // TODO not triggered on pasting only setAttributes({ groupName: event.target.value }) reloadEventList() } diff --git a/source/front/events-displayer.js b/source/front/events-displayer.js index 96abf20..7c9a48b 100644 --- a/source/front/events-displayer.js +++ b/source/front/events-displayer.js @@ -84,7 +84,7 @@ export function showLoadingIndicator(container) { indicator.style.display = 'block' } -function hideLoadingIndicator(container) { +export function hideLoadingIndicator(container) { const indicator = container.querySelector('.loading-indicator') indicator.style.display = 'none' } diff --git a/source/includes/Api.php b/source/includes/Api.php new file mode 100644 index 0000000..a21449f --- /dev/null +++ b/source/includes/Api.php @@ -0,0 +1,52 @@ + 'GET', + 'callback' => 'MobilizonConnector\Api::get_events', + 'args' => [ + 'eventsCount' => [ + 'required' => true, + 'validate_callback' => function($param, $request, $key) { + return is_numeric($param) && $param > 0; + } + ], + 'groupName' => [ + 'validate_callback' => function($param, $request, $key) { + return !is_numeric($param); + } + ] + ] + ] + ); + } + + public static function get_events($request) { + $eventsCount = $request['eventsCount']; + $groupName = isset($request['groupName']) ? $request['groupName'] : ''; + + $url = Settings::getUrl(); + + try { + if ($groupName) { + $events = GraphQlClient::get_upcoming_events_by_group_name($url, (int) $eventsCount, $groupName); + } else { + $events = GraphQlClient::get_upcoming_events($url, (int) $eventsCount); + } + return $events; + } catch (GeneralException $e) { + return 'The events could not be loaded!'; + } catch (GroupNotFoundException $e) { + return sprintf('The group "%s" could not be found!', $groupName); + } + } +}