complete notification plugin
This commit is contained in:
parent
4c3b5b1278
commit
c8ab358fd7
@ -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");
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -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
|
||||||
|
Reference in New Issue
Block a user