complete notification plugin

This commit is contained in:
王劲鹏 2021-06-07 21:54:47 +08:00 committed by osborn
parent 4c3b5b1278
commit c8ab358fd7
4 changed files with 106 additions and 2 deletions

View File

@ -3,6 +3,7 @@
#include "plugin/DoricModalPlugin.h" #include "plugin/DoricModalPlugin.h"
#include "plugin/DoricNetworkPlugin.h" #include "plugin/DoricNetworkPlugin.h"
#include "plugin/DoricNotificationPlugin.h"
#include "plugin/DoricPopoverPlugin.h" #include "plugin/DoricPopoverPlugin.h"
#include "plugin/DoricShaderPlugin.h" #include "plugin/DoricShaderPlugin.h"
#include "plugin/DoricStoragePlugin.h" #include "plugin/DoricStoragePlugin.h"
@ -29,6 +30,7 @@ DoricRegistry::DoricRegistry() {
registerNativePlugin<DoricPopoverPlugin>("popover"); registerNativePlugin<DoricPopoverPlugin>("popover");
registerNativePlugin<DoricNetworkPlugin>("network"); registerNativePlugin<DoricNetworkPlugin>("network");
registerNativePlugin<DoricStoragePlugin>("storage"); registerNativePlugin<DoricStoragePlugin>("storage");
registerNativePlugin<DoricNotificationPlugin>("notification");
registerViewNode<DoricRootNode>("Root"); registerViewNode<DoricRootNode>("Root");
registerViewNode<DoricStackNode>("Stack"); registerViewNode<DoricStackNode>("Stack");

View File

@ -1,6 +1,7 @@
#include "DoricNotificationPlugin.h" #include "DoricNotificationPlugin.h"
#include "engine/DoricPromise.h" #include "engine/DoricPromise.h"
#include "utils/DoricGlobalBroadcast.h"
#include <QCoreApplication> #include <QCoreApplication>
#include <QJsonDocument> #include <QJsonDocument>
@ -11,6 +12,18 @@ void DoricNotificationPlugin::publish(QString jsValueString,
QJsonDocument document = QJsonDocument::fromJson(jsValueString.toUtf8()); QJsonDocument document = QJsonDocument::fromJson(jsValueString.toUtf8());
QJsonValue jsValue = document.object(); QJsonValue jsValue = document.object();
QString name = jsValue["name"].toString();
if (jsValue.toObject().contains("biz")) {
QString biz = jsValue["biz"].toString();
QString templateName = "__doric__%s1#%s2";
name = templateName.replace("%s1", biz).replace("%s2", name);
}
QString data = jsValue["data"].toString();
DoricGlobalBroadcast::getInstance()->publish(name, data);
getContext()->getDriver()->asyncCall( getContext()->getDriver()->asyncCall(
[this, callbackId] { [this, callbackId] {
QVariantList args; QVariantList args;
@ -24,9 +37,27 @@ void DoricNotificationPlugin::subscribe(QString jsValueString,
QJsonDocument document = QJsonDocument::fromJson(jsValueString.toUtf8()); QJsonDocument document = QJsonDocument::fromJson(jsValueString.toUtf8());
QJsonValue jsValue = document.object(); QJsonValue jsValue = document.object();
getContext()->getDriver()->asyncCall( QString name = jsValue["name"].toString();
[this, callbackId] {
if (jsValue.toObject().contains("biz")) {
QString biz = jsValue["biz"].toString();
QString templateName = "__doric__%s1#%s2";
name = templateName.replace("%s1", biz).replace("%s2", name);
}
QString notificationCallbackId = jsValue["callback"].toString();
QString subscribeId = DoricGlobalBroadcast::getInstance()->subscribe(
name, [this, notificationCallbackId](QString data) {
QVariantList args; QVariantList args;
args.append(data);
DoricPromise::resolve(getContext(), notificationCallbackId, args);
});
getContext()->getDriver()->asyncCall(
[this, callbackId, notificationCallbackId] {
QVariantList args;
args.append(notificationCallbackId);
DoricPromise::resolve(getContext(), callbackId, args); DoricPromise::resolve(getContext(), callbackId, args);
}, },
DoricThreadMode::JS); DoricThreadMode::JS);
@ -37,6 +68,8 @@ void DoricNotificationPlugin::unsubscribe(QString jsValueString,
QJsonDocument document = QJsonDocument::fromJson(jsValueString.toUtf8()); QJsonDocument document = QJsonDocument::fromJson(jsValueString.toUtf8());
QJsonValue jsValue = document.object(); QJsonValue jsValue = document.object();
DoricGlobalBroadcast::getInstance()->unsubscribe(jsValueString);
getContext()->getDriver()->asyncCall( getContext()->getDriver()->asyncCall(
[this, callbackId] { [this, callbackId] {
QVariantList args; QVariantList args;

View File

@ -1 +1,59 @@
#include "DoricGlobalBroadcast.h" #include "DoricGlobalBroadcast.h"
QString DoricGlobalBroadcast::subscribe(QString name,
std::function<void(QString)> callback) {
int id = this->idGenerator.fetchAndAddAcquire(1);
QPair<QString, std::function<void(QString)>> pair(QString::number(id),
callback);
if (this->subjects.contains(name)) {
QList<QPair<QString, std::function<void(QString)>>> value =
this->subjects[name];
value.append(pair);
this->subjects.insert(name, value);
} else {
QList<QPair<QString, std::function<void(QString)>>> value;
value.append(pair);
this->subjects.insert(name, value);
}
return QString::number(id);
}
void DoricGlobalBroadcast::unsubscribe(QString subscribeId) {
QString targetKey;
int targetIndex = -1;
foreach (QString key, this->subjects.keys()) {
QList<QPair<QString, std::function<void(QString)>>> value =
this->subjects[key];
for (int i = 0; i != value.size(); i++) {
QPair<QString, std::function<void(QString)>> pair = value.at(i);
if (pair.first == subscribeId) {
targetKey = key;
targetIndex = i;
}
}
}
if (targetKey.isEmpty()) {
return;
} else {
QList<QPair<QString, std::function<void(QString)>>> value =
this->subjects[targetKey];
value.removeAt(targetIndex);
this->subjects.insert(targetKey, value);
}
}
void DoricGlobalBroadcast::publish(QString name, QString data) {
if (this->subjects.contains(name)) {
QList<QPair<QString, std::function<void(QString)>>> value =
this->subjects[name];
for (int i = 0; i != value.size(); i++) {
QPair<QString, std::function<void(QString)>> pair = value.at(i);
pair.second(data);
}
}
}

View File

@ -15,6 +15,17 @@ public:
static DoricGlobalBroadcast instance; static DoricGlobalBroadcast instance;
return &instance; return &instance;
} }
QString subscribe(QString name, std::function<void(QString)> callback);
void unsubscribe(QString subscribeId);
void publish(QString name, QString data);
private:
QAtomicInt idGenerator;
QMap<QString, QList<QPair<QString, std::function<void(QString)>>>> subjects;
}; };
#endif // DORICGLOBALBROADCAST_H #endif // DORICGLOBALBROADCAST_H