diff options
| -rw-r--r-- | plugin/src/Caelestia/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | plugin/src/Caelestia/requests.cpp | 35 | ||||
| -rw-r--r-- | plugin/src/Caelestia/requests.hpp | 23 | ||||
| -rw-r--r-- | services/Requests.qml | 36 | ||||
| -rw-r--r-- | services/Weather.qml | 1 |
5 files changed, 60 insertions, 36 deletions
diff --git a/plugin/src/Caelestia/CMakeLists.txt b/plugin/src/Caelestia/CMakeLists.txt index 25cae86..05cc350 100644 --- a/plugin/src/Caelestia/CMakeLists.txt +++ b/plugin/src/Caelestia/CMakeLists.txt @@ -23,6 +23,7 @@ qt_add_qml_module(caelestia audioprovider.hpp audioprovider.cpp cavaprovider.hpp cavaprovider.cpp appdb.hpp appdb.cpp + requests.hpp requests.cpp ) qt_query_qml_module(caelestia diff --git a/plugin/src/Caelestia/requests.cpp b/plugin/src/Caelestia/requests.cpp new file mode 100644 index 0000000..2ceddb3 --- /dev/null +++ b/plugin/src/Caelestia/requests.cpp @@ -0,0 +1,35 @@ +#include "requests.hpp" + +#include <qnetworkaccessmanager.h> +#include <qnetworkreply.h> +#include <qnetworkrequest.h> + +namespace caelestia { + +Requests::Requests(QObject* parent) + : QObject(parent) + , m_manager(new QNetworkAccessManager(this)) {} + +void Requests::get(const QUrl& url, QJSValue onSuccess, QJSValue onError) const { + if (!onSuccess.isCallable()) { + qWarning() << "Requests::get: onSuccess is not callable"; + return; + } + + QNetworkRequest request(url); + auto reply = m_manager->get(request); + + QObject::connect(reply, &QNetworkReply::finished, [reply, onSuccess, onError]() { + if (reply->error() == QNetworkReply::NoError) { + onSuccess.call({ QString(reply->readAll()) }); + } else if (onError.isCallable()) { + onError.call({ reply->errorString() }); + } else { + qWarning() << "Requests::get: request failed with error" << reply->errorString(); + } + + reply->deleteLater(); + }); +} + +} // namespace caelestia diff --git a/plugin/src/Caelestia/requests.hpp b/plugin/src/Caelestia/requests.hpp new file mode 100644 index 0000000..1db2f4c --- /dev/null +++ b/plugin/src/Caelestia/requests.hpp @@ -0,0 +1,23 @@ +#pragma once + +#include <qnetworkaccessmanager.h> +#include <qobject.h> +#include <qqmlengine.h> + +namespace caelestia { + +class Requests : public QObject { + Q_OBJECT + QML_ELEMENT + QML_SINGLETON + +public: + explicit Requests(QObject* parent = nullptr); + + Q_INVOKABLE void get(const QUrl& url, QJSValue callback, QJSValue onError = QJSValue()) const; + +private: + QNetworkAccessManager* m_manager; +}; + +} // namespace caelestia diff --git a/services/Requests.qml b/services/Requests.qml deleted file mode 100644 index a6a1d1d..0000000 --- a/services/Requests.qml +++ /dev/null @@ -1,36 +0,0 @@ -pragma Singleton - -import qs.config -import qs.utils -import Quickshell - -Singleton { - id: root - - function get(url: string, callback: var): void { - const xhr = new XMLHttpRequest(); - - const cleanup = () => { - xhr.abort(); - xhr.onreadystatechange = null; - xhr.onerror = null; - }; - - xhr.open("GET", url, true); - xhr.onreadystatechange = () => { - if (xhr.readyState === XMLHttpRequest.DONE) { - if (xhr.status === 200) - callback(xhr.responseText); - else - console.warn(`[REQUESTS] GET request to ${url} failed with status ${xhr.status}`); - cleanup(); - } - }; - xhr.onerror = () => { - console.warn(`[REQUESTS] GET request to ${url} failed`); - cleanup(); - }; - - xhr.send(); - } -} diff --git a/services/Weather.qml b/services/Weather.qml index f3147a8..73e0b77 100644 --- a/services/Weather.qml +++ b/services/Weather.qml @@ -2,6 +2,7 @@ pragma Singleton import qs.config import qs.utils +import Caelestia import Quickshell import QtQuick |