diff --git a/source/changelog.txt b/source/changelog.txt index 1cfb71b..9b244f7 100644 --- a/source/changelog.txt +++ b/source/changelog.txt @@ -1,5 +1,6 @@ ### [Unreleased] #### Added +- Display event picture if available #### Changed #### Deprecated #### Removed diff --git a/source/front/events-displayer.js b/source/front/events-displayer.js index 6eec340..c00b723 100644 --- a/source/front/events-displayer.js +++ b/source/front/events-displayer.js @@ -1,5 +1,5 @@ import Formatter from './formatter.js' -import { createAnchorElement } from './html-creator.js' +import { createAnchorElement, createImageElement } from './html-creator.js' export function clearEventsList(container) { const list = container.querySelector('ul') @@ -18,6 +18,19 @@ export function displayEvents({ events, document, container, maxEventsCount }) { const list = container.querySelector('ul') for (let i = 0; i < eventsCount; i++) { const li = document.createElement('li') + li.style.lineHeight = '150%' + li.style.marginTop = '20px' + + if (events[i].picture) { + const img = createImageElement({ + document, + alt: events[i].picture.alt ? events[i].picture.alt : '', + src: events[i].picture.base64 ? events[i].picture.base64 : '', + }) + img.style.display = 'block' + img.style.maxWidth = '100%' + li.appendChild(img) + } const a = createAnchorElement({ document, diff --git a/source/front/html-creator.js b/source/front/html-creator.js index d64503b..4c04b01 100644 --- a/source/front/html-creator.js +++ b/source/front/html-creator.js @@ -5,3 +5,10 @@ export function createAnchorElement({ document, text, url }) { a.innerHTML = text return a } + +export function createImageElement({ document, alt, src }) { + const img = document.createElement('img') + img.setAttribute('alt', alt) + img.setAttribute('src', src) + return img +} diff --git a/source/includes/GraphQlClient.php b/source/includes/GraphQlClient.php index b87dc88..fb687e3 100644 --- a/source/includes/GraphQlClient.php +++ b/source/includes/GraphQlClient.php @@ -40,6 +40,11 @@ final class GraphQlClient { physicalAddress { description, locality + }, + picture { + alt, + contentType, + url } }, total @@ -57,6 +62,17 @@ final class GraphQlClient { self::checkData($data); $events = $data['data']['events']['elements']; + foreach ($events as &$event) { + if ($event['picture']) { + $picture_response = self::download_image($event['picture']['url']); + if ($picture_response !== false) { + $picture_encoded = 'data:' . $event['picture']['contentType'] . ';base64,' . base64_encode($picture_response); + $event['picture']['base64'] = $picture_encoded; + } + } + unset($event); + } + EventsCache::set(['url' => $url, 'query' => $query, 'limit' => $limit], $events); return $events; } @@ -75,6 +91,11 @@ final class GraphQlClient { physicalAddress { description, locality + }, + picture { + alt, + contentType, + url } }, total @@ -95,6 +116,18 @@ final class GraphQlClient { self::checkData($data); $events = $data['data']['group']['organizedEvents']['elements']; + + foreach ($events as &$event) { + if ($event['picture']) { + $picture_response = self::download_image($event['picture']['url']); + if ($picture_response !== false) { + $picture_encoded = 'data:' . $event['picture']['contentType'] . ';base64,' . base64_encode($picture_response); + $event['picture']['base64'] = $picture_encoded; + } + } + unset($event); + } + EventsCache::set(['url' => $url, 'query' => $query, 'afterDatetime' => $afterDatetime, 'groupName' => $groupName, 'limit' => $limit], $events); return $events; } @@ -110,4 +143,28 @@ final class GraphQlClient { } } } + + private static function download_image($url) { + // Initialize curl handle + $ch = curl_init($url); + + // Set curl options + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); + curl_setopt($ch, CURLOPT_TIMEOUT, 60); // Set timeout to 60 seconds (adjust as needed) + + // Execute the request + $image_data = curl_exec($ch); + + // Check for errors + if (curl_errno($ch)) { + print_r(curl_error($ch)); + throw new \Error('Error: ' . curl_error($ch)); + } + + // Close curl handle + curl_close($ch); + + return $image_data; + } } diff --git a/source/view/events-list.php b/source/view/events-list.php index 8ad2958..0581c5d 100644 --- a/source/view/events-list.php +++ b/source/view/events-list.php @@ -8,8 +8,11 @@ if (!defined('ABSPATH')) { ?>