@nocobase/plugin-notification-manager 2.1.0-beta.13 → 2.1.0-beta.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -7,4 +7,4 @@
7
7
  * For more information, please refer to: https://www.nocobase.com/agreement.
8
8
  */
9
9
 
10
- !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("@formily/core"),require("@formily/shared"),require("@nocobase/client"),require("react"),require("@formily/antd-v5"),require("@nocobase/flow-engine"),require("@formily/react"),require("@nocobase/utils/client"),require("@ant-design/icons"),require("antd"),require("react-i18next")):"function"==typeof define&&define.amd?define("@nocobase/plugin-notification-manager",["@formily/core","@formily/shared","@nocobase/client","react","@formily/antd-v5","@nocobase/flow-engine","@formily/react","@nocobase/utils/client","@ant-design/icons","antd","react-i18next"],t):"object"==typeof exports?exports["@nocobase/plugin-notification-manager"]=t(require("@formily/core"),require("@formily/shared"),require("@nocobase/client"),require("react"),require("@formily/antd-v5"),require("@nocobase/flow-engine"),require("@formily/react"),require("@nocobase/utils/client"),require("@ant-design/icons"),require("antd"),require("react-i18next")):e["@nocobase/plugin-notification-manager"]=t(e["@formily/core"],e["@formily/shared"],e["@nocobase/client"],e.react,e["@formily/antd-v5"],e["@nocobase/flow-engine"],e["@formily/react"],e["@nocobase/utils/client"],e["@ant-design/icons"],e.antd,e["react-i18next"])}(self,function(e,t,n,r,o,i,a,u,l,c,s){return function(){var f,p,y,d,m,b,v={466:function(e,t,n){"use strict";n.r(t),n.d(t,{NotificationVariableProvider:function(){return b},UserAddition:function(){return E},MessageConfigForm:function(){return O},UserSelect:function(){return P},useNotificationVariableOptions:function(){return m},NotificationVariableContext:function(){return d},default:function(){return L},ContentConfigForm:function(){return S},PluginNotificationManagerClient:function(){return z}});var r=n(772),o=n(551),i=n(655),a=n(584),u=function(){var e;function t(){var e,n;if(!(this instanceof t))throw TypeError("Cannot call a class as a function");e="channelTypes",n=new a.Registry,e in this?Object.defineProperty(this,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):this[e]=n}return e=[{key:"registerChannelType",value:function(e){this.channelTypes.register(e.type,e)}}],function(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}(t.prototype,e),t}();n(563);var l=n(505),c=n(721),s=n(156),f=n.n(s);function p(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}(0,s.createContext)({typeMap:{}}).displayName="ChannelTypesContext";var y=function(){var e=(0,o.oG)().t,t=(0,r.usePlugin)(L),n={},i=!0,a=!1,u=void 0;try{for(var c,s=t.channelTypes.getEntities()[Symbol.iterator]();!(i=(c=s.next()).done);i=!0){var f,y=(f=c.value,function(e){if(Array.isArray(e))return e}(f)||function(e,t){var n,r,o=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=o){var i=[],a=!0,u=!1;try{for(o=o.call(e);!(a=(n=o.next()).done)&&(i.push(n.value),i.length!==t);a=!0);}catch(e){u=!0,r=e}finally{try{a||null==o.return||o.return()}finally{if(u)throw r}}return i}}(f,2)||function(e,t){if(e){if("string"==typeof e)return p(e,2);var n=Object.prototype.toString.call(e).slice(8,-1);if("Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n)return Array.from(n);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return p(e,t)}}(f,2)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),d=(y[0],y[1]),m=function(e,t){return t=null!=t?t:{},Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):(function(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n.push.apply(n,r)}return n})(Object(t)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))}),e}(function(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{},r=Object.keys(n);"function"==typeof Object.getOwnPropertySymbols&&(r=r.concat(Object.getOwnPropertySymbols(n).filter(function(e){return Object.getOwnPropertyDescriptor(n,e).enumerable}))),r.forEach(function(t){var r;r=n[t],t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r})}return e}({},d),{title:l.Schema.compile(d.title,{t:e})});n[d.type]=m}}catch(e){a=!0,u=e}finally{try{i||null==s.return||s.return()}finally{if(a)throw u}}return n},d=(0,s.createContext)([]),m=function(){return{scope:(0,s.useContext)(d)}},b=function(e){var t=e.value,n=e.children;return f().createElement(d.Provider,{value:t},n)},v=n(632),h=n(296);function g(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function w(e,t,n,r,o,i,a){try{var u=e[i](a),l=u.value}catch(e){n(e);return}u.done?t(l):Promise.resolve(l).then(r,o)}var O=(0,l.observer)(function(e){var t,n=e.variableOptions,i=(0,l.useField)().form.values.channelName,a=(t=(0,s.useState)(null),function(e){if(Array.isArray(e))return e}(t)||function(e,t){var n,r,o=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=o){var i=[],a=!0,u=!1;try{for(o=o.call(e);!(a=(n=o.next()).done)&&(i.push(n.value),i.length!==t);a=!0);}catch(e){u=!0,r=e}finally{try{a||null==o.return||o.return()}finally{if(u)throw r}}return i}}(t,2)||function(e,t){if(e){if("string"==typeof e)return g(e,2);var n=Object.prototype.toString.call(e).slice(8,-1);if("Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n)return Array.from(n);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return g(e,t)}}(t,2)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),u=a[0],c=a[1],p=(0,o.oG)().t,d=(0,r.useAPIClient)();(0,s.useEffect)(function(){var e,t;(e=function(){var e,t;return function(e,t){var n,r,o,i,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:u(0),throw:u(1),return:u(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function u(i){return function(u){var l=[i,u];if(n)throw TypeError("Generator is already executing.");for(;a;)try{if(n=1,r&&(o=2&l[0]?r.return:l[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,l[1])).done)return o;switch(r=0,o&&(l=[2&l[0],o.value]),l[0]){case 0:case 1:o=l;break;case 4:return a.label++,{value:l[1],done:!1};case 5:a.label++,r=l[1],l=[0];continue;case 7:l=a.ops.pop(),a.trys.pop();continue;default:if(!(o=(o=a.trys).length>0&&o[o.length-1])&&(6===l[0]||2===l[0])){a=0;continue}if(3===l[0]&&(!o||l[1]>o[0]&&l[1]<o[3])){a.label=l[1];break}if(6===l[0]&&a.label<o[1]){a.label=o[1],o=l;break}if(o&&a.label<o[2]){a.label=o[2],a.ops.push(l);break}o[2]&&a.ops.pop(),a.trys.pop();continue}l=t.call(e,a)}catch(e){l=[6,e],r=0}finally{n=o=0}if(5&l[0])throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}}}(this,function(n){switch(n.label){case 0:if(!i)return c(null),[2];return[4,d.request({url:"/".concat(h.O.channels,":get"),method:"get",params:{filterByTk:i}})];case 1:return c(null==(t=n.sent().data)||null==(e=t.data)?void 0:e.notificationType),[2]}})},t=function(){var t=this,n=arguments;return new Promise(function(r,o){var i=e.apply(t,n);function a(e){w(i,r,o,a,u,"next",e)}function u(e){w(i,r,o,a,u,"throw",e)}a(void 0)})},function(){return t.apply(this,arguments)})()},[i,d]);var m=y(),b=((u?m[u]:{}).components||{}).MessageConfigForm,O={type:"void",properties:{channelName:{type:"string",title:'{{t("Channel")}}',required:!0,"x-decorator":"FormItem","x-component":"RemoteSelect","x-component-props":{multiple:!1,manual:!1,fieldNames:{label:"title",value:"name"},service:{resource:h.O.channels,action:"list"},style:{width:"100%"}}},message:{type:"void","x-component":"MessageConfigForm","x-component-props":{variableOptions:n}}}};return f().createElement(r.SchemaComponent,{schema:O,components:{MessageConfigForm:void 0===b?function(){return null}:b,ArrayItems:v.ArrayItems},scope:{t:p}})},{displayName:"MessageConfigForm"}),C=n(667),S=(0,r.withDynamicSchemaProps)((0,C.observer)(function(e){var t,n=e.variableOptions,r=e.channelType,o=y(),i=((null==(t=r?o[r]:{})?void 0:t.components)||{}).ContentConfigForm;return f().createElement(void 0===i?function(){return null}:i,{variableOptions:n})},{displayName:"ContentConfigForm"}));function x(e){var t=e.value,n=e.onChange,o=e.variableOptions;return f().createElement(r.Variable.Input,{scope:o,value:t,onChange:n},f().createElement(r.RemoteSelect,{fieldNames:{label:"nickname",value:"id"},service:{resource:"users",defaultParams:t?{filter:{id:t}}:void 0},manual:!1,value:t,onChange:n}))}function j(e){var t=(0,l.useField)(),n=(0,r.useCollectionFilterOptions)("users"),o=(0,r.useToken)().token,i=(0,s.useCallback)(function(t){var n=t.value,o=t.onChange,i=t.renderSchemaComponent;return f().createElement(r.Variable.Input,{value:n,onChange:o,scope:e.variableOptions},i())},[e.variableOptions]);return f().createElement("div",{style:{border:"1px dashed ".concat(o.colorBorder),padding:o.paddingSM}},f().createElement(r.SchemaComponent,{basePath:t.address,schema:{type:"void",properties:{filter:{type:"object","x-component":"Filter","x-component-props":{options:n,dynamicComponent:i}}}}}))}function P(e){var t;return"object"==((t=e.value)&&"undefined"!=typeof Symbol&&t.constructor===Symbol?"symbol":typeof t)&&e.value?f().createElement(j,e):f().createElement(x,e)}var k=n(482);function A(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function E(){var e,t=(e=(0,s.useState)(!1),function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n,r,o=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=o){var i=[],a=!0,u=!1;try{for(o=o.call(e);!(a=(n=o.next()).done)&&(i.push(n.value),i.length!==t);a=!0);}catch(e){u=!0,r=e}finally{try{a||null==o.return||o.return()}finally{if(u)throw r}}return i}}(e,2)||function(e,t){if(e){if("string"==typeof e)return A(e,2);var n=Object.prototype.toString.call(e).slice(8,-1);if("Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n)return Array.from(n);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return A(e,t)}}(e,2)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),n=t[0],r=t[1],i=(0,o.oG)().t,a=v.ArrayItems.useArray(),u=(0,l.useForm)(),p=(null==u?void 0:u.disabled)===!0,y=(0,s.useCallback)(function(){a.field.push(""),r(!1)},[a.field]),d=(0,s.useCallback)(function(){a.field.push({filter:{}}),r(!1)},[a.field]),m=f().createElement(c.Button,{icon:f().createElement(k.PlusOutlined,null),type:"dashed",block:!0,disabled:p,className:"ant-formily-array-base-addition"},i("Add user"));return p?m:f().createElement(c.Popover,{open:n,onOpenChange:r,content:f().createElement(c.Space,{direction:"vertical",size:"small"},f().createElement(c.Button,{type:"text",onClick:y},i("Select users")),f().createElement(c.Button,{type:"text",onClick:d},i("Query users")))},m)}var T=n(581);function _(e,t,n,r,o,i,a){try{var u=e[i](a),l=u.value}catch(e){n(e);return}u.done?t(l):Promise.resolve(l).then(r,o)}function M(e){return function(){var t=this,n=arguments;return new Promise(function(r,o){var i=e.apply(t,n);function a(e){_(i,r,o,a,u,"next",e)}function u(e){_(i,r,o,a,u,"throw",e)}a(void 0)})}}function q(e,t,n){return(q=B()?Reflect.construct:function(e,t,n){var r=[null];r.push.apply(r,t);var o=new(Function.bind.apply(e,r));return n&&F(o,n.prototype),o}).apply(null,arguments)}function N(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function I(e){return(I=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function F(e,t){return(F=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}function D(e){var t="function"==typeof Map?new Map:void 0;return(D=function(e){if(null===e||-1===Function.toString.call(e).indexOf("[native code]"))return e;if("function"!=typeof e)throw TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,n)}function n(){return q(e,arguments,I(this).constructor)}return n.prototype=Object.create(e.prototype,{constructor:{value:n,enumerable:!1,writable:!0,configurable:!0}}),F(n,e)})(e)}function B(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(e){}return(B=function(){return!!e})()}function R(e,t){var n,r,o,i,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:u(0),throw:u(1),return:u(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function u(i){return function(u){var l=[i,u];if(n)throw TypeError("Generator is already executing.");for(;a;)try{if(n=1,r&&(o=2&l[0]?r.return:l[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,l[1])).done)return o;switch(r=0,o&&(l=[2&l[0],o.value]),l[0]){case 0:case 1:o=l;break;case 4:return a.label++,{value:l[1],done:!1};case 5:a.label++,r=l[1],l=[0];continue;case 7:l=a.ops.pop(),a.trys.pop();continue;default:if(!(o=(o=a.trys).length>0&&o[o.length-1])&&(6===l[0]||2===l[0])){a=0;continue}if(3===l[0]&&(!o||l[1]>o[0]&&l[1]<o[3])){a.label=l[1];break}if(6===l[0]&&a.label<o[1]){a.label=o[1],o=l;break}if(o&&a.label<o[2]){a.label=o[2],a.ops.push(l);break}o[2]&&a.ops.pop(),a.trys.pop();continue}l=t.call(e,a)}catch(e){l=[6,e],r=0}finally{n=o=0}if(5&l[0])throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}}}var G=(0,r.lazy)(function(){return T("imported_54jlgb_component",n.e("843").then(n.bind(n,709)))},"ChannelManager").ChannelManager,U=(0,r.lazy)(function(){return T("imported_-ql9itg_component",n.e("969").then(n.bind(n,358)))},"LogManager").LogManager,V="notification-manager",z=function(e){var t;if("function"!=typeof e&&null!==e)throw TypeError("Super expression must either be null or a function");function n(){var e,t,r;if(!(this instanceof n))throw TypeError("Cannot call a class as a function");return t=n,r=arguments,t=I(t),N(e=function(e,t){var n;if(t&&("object"==((n=t)&&"undefined"!=typeof Symbol&&n.constructor===Symbol?"symbol":typeof n)||"function"==typeof t))return t;if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(this,B()?Reflect.construct(t,r||[],I(this).constructor):t.apply(this,r)),"manager",void 0),N(e,"useNotificationTypes",i.aT),e}return n.prototype=Object.create(e&&e.prototype,{constructor:{value:n,writable:!0,configurable:!0}}),e&&F(n,e),t=[{key:"channelTypes",get:function(){return this.manager.channelTypes}},{key:"registerChannelType",value:function(e){this.manager.registerChannelType(e)}},{key:"afterAdd",value:function(){return M(function(){return R(this,function(e){return[2]})})()}},{key:"beforeLoad",value:function(){var e=this;return M(function(){return R(this,function(t){return e.manager=new u,[2]})})()}},{key:"load",value:function(){var e=this;return M(function(){return R(this,function(t){return e.app.pluginSettingsManager.add(V,{title:(0,o.KQ)("Notification manager"),icon:"NotificationOutlined",aclSnippet:"pm.notification"}),e.app.pluginSettingsManager.add("".concat(V,".channels"),{title:(0,o.KQ)("Channels"),Component:G,aclSnippet:"pm.notification.channels",sort:1}),e.app.pluginSettingsManager.add("".concat(V,".logs"),{title:(0,o.KQ)("Logs"),Component:U,aclSnippet:"pm.notification.logs",sort:3}),[2]})})()}}],function(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}(n.prototype,t),n}(D(r.Plugin)),L=z},765:function(e,t,n){"use strict";n.d(t,{CZ:function(){return l},tZ:function(){return c},th:function(){return a},wi:function(){return u}});var r=n(156),o=n.n(r);function i(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}var a=(0,r.createContext)({name:"",setName:function(){}});a.displayName="ChannelTypeContext";var u=(0,r.createContext)({channelTypes:[]});u.displayName="ChannelTypesContext";var l=function(){return(0,r.useContext)(u).channelTypes};function c(){var e,t=(e=(0,r.useState)(""),function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n,r,o=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=o){var i=[],a=!0,u=!1;try{for(o=o.call(e);!(a=(n=o.next()).done)&&(i.push(n.value),i.length!==t);a=!0);}catch(e){u=!0,r=e}finally{try{a||null==o.return||o.return()}finally{if(u)throw r}}return i}}(e,2)||function(e,t){if(e){if("string"==typeof e)return i(e,2);var n=Object.prototype.toString.call(e).slice(8,-1);if("Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n)return Array.from(n);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return i(e,t)}}(e,2)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),n=t[0],u=t[1];return{name:n,setName:u,NotificationTypeNameProvider:function(e){var t=e.children;return o().createElement(a.Provider,{value:{name:n,setName:u}},t)}}}},655:function(e,t,n){"use strict";n.d(t,{$l:function(){return C},Bj:function(){return O},G8:function(){return g},Uc:function(){return S},Uy:function(){return x},aT:function(){return j},cD:function(){return h},fC:function(){return w}});var r=n(563),o=n(505),i=n(875),a=n(772),u=n(721),l=n(156),c=n(466),s=n(551),f=n(765);function p(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function y(e,t,n,r,o,i,a){try{var u=e[i](a),l=u.value}catch(e){n(e);return}u.done?t(l):Promise.resolve(l).then(r,o)}function d(e){return function(){var t=this,n=arguments;return new Promise(function(r,o){var i=e.apply(t,n);function a(e){y(i,r,o,a,u,"next",e)}function u(e){y(i,r,o,a,u,"throw",e)}a(void 0)})}}function m(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{},r=Object.keys(n);"function"==typeof Object.getOwnPropertySymbols&&(r=r.concat(Object.getOwnPropertySymbols(n).filter(function(e){return Object.getOwnPropertyDescriptor(n,e).enumerable}))),r.forEach(function(t){var r;r=n[t],t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r})}return e}function b(e,t){return t=null!=t?t:{},Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):(function(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n.push.apply(n,r)}return n})(Object(t)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))}),e}function v(e,t){var n,r,o,i,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:u(0),throw:u(1),return:u(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function u(i){return function(u){var l=[i,u];if(n)throw TypeError("Generator is already executing.");for(;a;)try{if(n=1,r&&(o=2&l[0]?r.return:l[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,l[1])).done)return o;switch(r=0,o&&(l=[2&l[0],o.value]),l[0]){case 0:case 1:o=l;break;case 4:return a.label++,{value:l[1],done:!1};case 5:a.label++,r=l[1],l=[0];continue;case 7:l=a.ops.pop(),a.trys.pop();continue;default:if(!(o=(o=a.trys).length>0&&o[o.length-1])&&(6===l[0]||2===l[0])){a=0;continue}if(3===l[0]&&(!o||l[1]>o[0]&&l[1]<o[3])){a.label=l[1];break}if(6===l[0]&&a.label<o[1]){a.label=o[1],o=l;break}if(o&&a.label<o[2]){a.label=o[2],a.ops.push(l);break}o[2]&&a.ops.pop(),a.trys.pop();continue}l=t.call(e,a)}catch(e){l=[6,e],r=0}finally{n=o=0}if(5&l[0])throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}}}var h=function(){var e=(0,a.useActionContext)(),t=e.setVisible,n=e.setSubmitted;u.App.useApp().message;var r=(0,o.useForm)(),i=(0,a.useDataBlockResource)(),l=(0,a.useBlockRequestContext)().service;return{type:"primary",onClick:function(e,o){return d(function(){var e,a,u,c,s,f,p,y,d;return v(this,function(v){switch(v.label){case 0:return[4,r.submit()];case 1:return v.sent(),a=r.values,[4,i.create({values:a})];case 2:return v.sent(),s=void 0===(c=(u=(null==l||null==(e=l.data)?void 0:e.meta)||{}).count)?0:c,p=void 0===(f=u.page)?0:f,s%(void 0===(y=u.pageSize)?0:y)==1&&1!==p&&l.run(b(m({},null==l||null==(d=l.params)?void 0:d[0]),{page:p-1})),o&&(null==o||o()),null==n||n(!0),null==t||t(!1),[2]}})})()}}},g=function(){var e=(0,a.useActionContext)(),t=e.setVisible,n=e.setSubmitted;u.App.useApp().message;var r=(0,o.useForm)(),i=(0,a.useDataBlockResource)(),l=(0,a.useBlockRequestContext)().service,c=(0,a.useCollection)();return{type:"primary",onClick:function(e,o){return d(function(){var e,a,u,s,f,p,y,d,h;return v(this,function(v){switch(v.label){case 0:return[4,r.submit()];case 1:return v.sent(),a=r.values,[4,i.update({values:a,filterByTk:a[c.filterTargetKey]})];case 2:return v.sent(),f=void 0===(s=(u=(null==l||null==(e=l.data)?void 0:e.meta)||{}).count)?0:s,y=void 0===(p=u.page)?0:p,f%(void 0===(d=u.pageSize)?0:d)==1&&1!==y&&l.run(b(m({},null==l||null==(h=l.params)?void 0:h[0]),{page:y-1})),o&&(null==o||o()),null==n||n(!0),null==t||t(!1),[2]}})})()}}},w=function(){var e=(0,a.useCollectionRecordData)();return{form:(0,l.useMemo)(function(){return(0,r.createForm)({initialValues:e})},[])}},O=function(){var e,t=(0,a.useCollectionRecordData)(),n=null==t||null==(e=t.meta)?void 0:e.editable,r={};return!1===n&&(r.display="none"),{style:r}},C=function(){var e,t=(0,a.useCollectionRecordData)(),n=null==t||null==(e=t.meta)?void 0:e.deletable,r={},o=(0,a.useDestroyActionProps)();return!1===n&&(r.display="none"),b(m({},o),{style:r})},S=function(){(0,a.useActionContext)();var e=(0,l.useContext)(f.th).name;return{form:(0,l.useMemo)(function(){return(0,r.createForm)({values:{name:"s_".concat((0,i.uid)()),notificationType:e}})},[e])}},x=function(){var e=(0,a.useActionContext)().setVisible;return{type:"default",onClick:function(){e(!1)}}},j=function(){var e=(0,s.oG)().t,t=(0,a.usePlugin)(c.PluginNotificationManagerClient),n=[],r=!0,i=!1,u=void 0;try{for(var l,f=t.channelTypes.getEntities()[Symbol.iterator]();!(r=(l=f.next()).done);r=!0){var y,d=(y=l.value,function(e){if(Array.isArray(e))return e}(y)||function(e,t){var n,r,o=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=o){var i=[],a=!0,u=!1;try{for(o=o.call(e);!(a=(n=o.next()).done)&&(i.push(n.value),i.length!==t);a=!0);}catch(e){u=!0,r=e}finally{try{a||null==o.return||o.return()}finally{if(u)throw r}}return i}}(y,2)||function(e,t){if(e){if("string"==typeof e)return p(e,2);var n=Object.prototype.toString.call(e).slice(8,-1);if("Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n)return Array.from(n);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return p(e,t)}}(y,2)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),v=(d[0],d[1]),h=o.Schema.compile(v.title,{t:e}),g=b(m({},v),{name:v.type,key:v.type,value:v.type,title:h,label:h});n.push(g)}}catch(e){i=!0,u=e}finally{try{r||null==f.return||f.return()}finally{if(i)throw u}}return n}},551:function(e,t,n){"use strict";n.d(t,{KQ:function(){return a},oG:function(){return u}});var r=n(772),o=n(238),i="notification-manager";function a(e){return r.i18n.t(e,{ns:i})}function u(){return(0,o.useTranslation)([i,"client","data-source-manager"],{nsMode:"fallback"})}},296:function(e,t,n){"use strict";n.d(t,{O:function(){return o}});var r,o=((r={}).templates="templates",r.channels="notificationChannels",r.messages="messages",r.logs="notificationSendLogs",r)},581:function(e){e.exports=function(e,t){return"undefined"!=typeof __deoptimization_sideEffect__&&__deoptimization_sideEffect__(e,t),t}},482:function(e){"use strict";e.exports=l},632:function(e){"use strict";e.exports=o},563:function(t){"use strict";t.exports=e},505:function(e){"use strict";e.exports=a},875:function(e){"use strict";e.exports=t},772:function(e){"use strict";e.exports=n},667:function(e){"use strict";e.exports=i},584:function(e){"use strict";e.exports=u},721:function(e){"use strict";e.exports=c},156:function(e){"use strict";e.exports=r},238:function(e){"use strict";e.exports=s}},h={};function g(e){var t=h[e];if(void 0!==t)return t.exports;var n=h[e]={exports:{}};return v[e](n,n.exports,g),n.exports}return g.m=v,g.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return g.d(t,{a:t}),t},g.d=function(e,t){for(var n in t)g.o(t,n)&&!g.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},g.f={},g.e=function(e){return Promise.all(Object.keys(g.f).reduce(function(t,n){return g.f[n](e,t),t},[]))},g.u=function(e){return""+({843:"b1941306dc0db9f3",969:"035b24990a46d186"})[e]+".js"},g.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||Function("return this")()}catch(e){if("object"==typeof window)return window}}(),g.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},f={},p="@nocobase/plugin-notification-manager:",g.l=function(e,t,n,r){if(f[e])return void f[e].push(t);if(void 0!==n)for(var o,i,a=document.getElementsByTagName("script"),u=0;u<a.length;u++){var l=a[u];if(l.getAttribute("src")==e||l.getAttribute("data-webpack")==p+n){o=l;break}}o||(i=!0,(o=document.createElement("script")).charset="utf-8",o.timeout=120,g.nc&&o.setAttribute("nonce",g.nc),o.setAttribute("data-webpack",p+n),o.src=e),f[e]=[t];var c=function(t,n){o.onerror=o.onload=null,clearTimeout(s);var r=f[e];if(delete f[e],o.parentNode&&o.parentNode.removeChild(o),r&&r.forEach(function(e){return e(n)}),t)return t(n)},s=setTimeout(c.bind(null,void 0,{type:"timeout",target:o}),12e4);o.onerror=c.bind(null,o.onerror),o.onload=c.bind(null,o.onload),i&&document.head.appendChild(o)},g.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(y=window.__webpack_public_path__||"/").endsWith("/")||(y+="/"),g.p=y+"static/plugins/@nocobase/plugin-notification-manager/dist/client/",d={909:0},g.f.j=function(e,t){var n=g.o(d,e)?d[e]:void 0;if(0!==n)if(n)t.push(n[2]);else{var r=new Promise(function(t,r){n=d[e]=[t,r]});t.push(n[2]=r);var o=g.p+g.u(e),i=Error();g.l(o,function(t){if(g.o(d,e)&&(0!==(n=d[e])&&(d[e]=void 0),n)){var r=t&&("load"===t.type?"missing":t.type),o=t&&t.target&&t.target.src;i.message="Loading chunk "+e+" failed.\n("+r+": "+o+")",i.name="ChunkLoadError",i.type=r,i.request=o,n[1](i)}},"chunk-"+e,e)}},m=function(e,t){var n,r,o=t[0],i=t[1],a=t[2],u=0;if(o.some(function(e){return 0!==d[e]})){for(n in i)g.o(i,n)&&(g.m[n]=i[n]);a&&a(g)}for(e&&e(t);u<o.length;u++)r=o[u],g.o(d,r)&&d[r]&&d[r][0](),d[r]=0},(b=self.webpackChunk_nocobase_plugin_notification_manager=self.webpackChunk_nocobase_plugin_notification_manager||[]).forEach(m.bind(null,0)),b.push=m.bind(null,b.push.bind(b)),g(466)}()});
10
+ !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("@formily/core"),require("@formily/shared"),require("@nocobase/client"),require("react"),require("@formily/antd-v5"),require("@nocobase/flow-engine"),require("@formily/react"),require("@nocobase/utils/client"),require("@ant-design/icons"),require("antd"),require("react-i18next")):"function"==typeof define&&define.amd?define("@nocobase/plugin-notification-manager",["@formily/core","@formily/shared","@nocobase/client","react","@formily/antd-v5","@nocobase/flow-engine","@formily/react","@nocobase/utils/client","@ant-design/icons","antd","react-i18next"],t):"object"==typeof exports?exports["@nocobase/plugin-notification-manager"]=t(require("@formily/core"),require("@formily/shared"),require("@nocobase/client"),require("react"),require("@formily/antd-v5"),require("@nocobase/flow-engine"),require("@formily/react"),require("@nocobase/utils/client"),require("@ant-design/icons"),require("antd"),require("react-i18next")):e["@nocobase/plugin-notification-manager"]=t(e["@formily/core"],e["@formily/shared"],e["@nocobase/client"],e.react,e["@formily/antd-v5"],e["@nocobase/flow-engine"],e["@formily/react"],e["@nocobase/utils/client"],e["@ant-design/icons"],e.antd,e["react-i18next"])}(self,function(e,t,n,r,o,i,a,u,l,c,s){return function(){var f,p,y,d,m,b,v={466:function(e,t,n){"use strict";n.r(t),n.d(t,{NotificationVariableProvider:function(){return b},UserAddition:function(){return E},MessageConfigForm:function(){return O},UserSelect:function(){return P},useNotificationVariableOptions:function(){return m},NotificationVariableContext:function(){return d},default:function(){return L},ContentConfigForm:function(){return S},PluginNotificationManagerClient:function(){return z}});var r=n(772),o=n(551),i=n(655),a=n(584),u=function(){var e;function t(){var e,n;if(!(this instanceof t))throw TypeError("Cannot call a class as a function");e="channelTypes",n=new a.Registry,e in this?Object.defineProperty(this,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):this[e]=n}return e=[{key:"registerChannelType",value:function(e){this.channelTypes.register(e.type,e)}}],function(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}(t.prototype,e),t}();n(563);var l=n(505),c=n(721),s=n(156),f=n.n(s);function p(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}(0,s.createContext)({typeMap:{}}).displayName="ChannelTypesContext";var y=function(){var e=(0,o.oG)().t,t=(0,r.usePlugin)(L),n={},i=!0,a=!1,u=void 0;try{for(var c,s=t.channelTypes.getEntities()[Symbol.iterator]();!(i=(c=s.next()).done);i=!0){var f,y=(f=c.value,function(e){if(Array.isArray(e))return e}(f)||function(e,t){var n,r,o=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=o){var i=[],a=!0,u=!1;try{for(o=o.call(e);!(a=(n=o.next()).done)&&(i.push(n.value),i.length!==t);a=!0);}catch(e){u=!0,r=e}finally{try{a||null==o.return||o.return()}finally{if(u)throw r}}return i}}(f,2)||function(e,t){if(e){if("string"==typeof e)return p(e,2);var n=Object.prototype.toString.call(e).slice(8,-1);if("Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n)return Array.from(n);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return p(e,t)}}(f,2)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),d=(y[0],y[1]),m=function(e,t){return t=null!=t?t:{},Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):(function(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n.push.apply(n,r)}return n})(Object(t)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))}),e}(function(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{},r=Object.keys(n);"function"==typeof Object.getOwnPropertySymbols&&(r=r.concat(Object.getOwnPropertySymbols(n).filter(function(e){return Object.getOwnPropertyDescriptor(n,e).enumerable}))),r.forEach(function(t){var r;r=n[t],t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r})}return e}({},d),{title:l.Schema.compile(d.title,{t:e})});n[d.type]=m}}catch(e){a=!0,u=e}finally{try{i||null==s.return||s.return()}finally{if(a)throw u}}return n},d=(0,s.createContext)([]),m=function(){return{scope:(0,s.useContext)(d)}},b=function(e){var t=e.value,n=e.children;return f().createElement(d.Provider,{value:t},n)},v=n(632),h=n(296);function g(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function w(e,t,n,r,o,i,a){try{var u=e[i](a),l=u.value}catch(e){n(e);return}u.done?t(l):Promise.resolve(l).then(r,o)}var O=(0,l.observer)(function(e){var t,n=e.variableOptions,i=(0,l.useField)().form.values.channelName,a=(t=(0,s.useState)(null),function(e){if(Array.isArray(e))return e}(t)||function(e,t){var n,r,o=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=o){var i=[],a=!0,u=!1;try{for(o=o.call(e);!(a=(n=o.next()).done)&&(i.push(n.value),i.length!==t);a=!0);}catch(e){u=!0,r=e}finally{try{a||null==o.return||o.return()}finally{if(u)throw r}}return i}}(t,2)||function(e,t){if(e){if("string"==typeof e)return g(e,2);var n=Object.prototype.toString.call(e).slice(8,-1);if("Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n)return Array.from(n);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return g(e,t)}}(t,2)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),u=a[0],c=a[1],p=(0,o.oG)().t,d=(0,r.useAPIClient)();(0,s.useEffect)(function(){var e,t;(e=function(){var e,t;return function(e,t){var n,r,o,i,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:u(0),throw:u(1),return:u(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function u(i){return function(u){var l=[i,u];if(n)throw TypeError("Generator is already executing.");for(;a;)try{if(n=1,r&&(o=2&l[0]?r.return:l[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,l[1])).done)return o;switch(r=0,o&&(l=[2&l[0],o.value]),l[0]){case 0:case 1:o=l;break;case 4:return a.label++,{value:l[1],done:!1};case 5:a.label++,r=l[1],l=[0];continue;case 7:l=a.ops.pop(),a.trys.pop();continue;default:if(!(o=(o=a.trys).length>0&&o[o.length-1])&&(6===l[0]||2===l[0])){a=0;continue}if(3===l[0]&&(!o||l[1]>o[0]&&l[1]<o[3])){a.label=l[1];break}if(6===l[0]&&a.label<o[1]){a.label=o[1],o=l;break}if(o&&a.label<o[2]){a.label=o[2],a.ops.push(l);break}o[2]&&a.ops.pop(),a.trys.pop();continue}l=t.call(e,a)}catch(e){l=[6,e],r=0}finally{n=o=0}if(5&l[0])throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}}}(this,function(n){switch(n.label){case 0:if(!i)return c(null),[2];return[4,d.request({url:"/".concat(h.O.channels,":get"),method:"get",params:{filterByTk:i}})];case 1:return c(null==(t=n.sent().data)||null==(e=t.data)?void 0:e.notificationType),[2]}})},t=function(){var t=this,n=arguments;return new Promise(function(r,o){var i=e.apply(t,n);function a(e){w(i,r,o,a,u,"next",e)}function u(e){w(i,r,o,a,u,"throw",e)}a(void 0)})},function(){return t.apply(this,arguments)})()},[i,d]);var m=y(),b=((u?m[u]:{}).components||{}).MessageConfigForm,O={type:"void",properties:{channelName:{type:"string",title:'{{t("Channel")}}',required:!0,"x-decorator":"FormItem","x-component":"RemoteSelect","x-component-props":{multiple:!1,manual:!1,fieldNames:{label:"title",value:"name"},service:{resource:h.O.channels,action:"list"},style:{width:"100%"}}},message:{type:"void","x-component":"MessageConfigForm","x-component-props":{variableOptions:n}}}};return f().createElement(r.SchemaComponent,{schema:O,components:{MessageConfigForm:void 0===b?function(){return null}:b,ArrayItems:v.ArrayItems},scope:{t:p}})},{displayName:"MessageConfigForm"}),C=n(667),S=(0,r.withDynamicSchemaProps)((0,C.observer)(function(e){var t,n=e.variableOptions,r=e.channelType,o=y(),i=((null==(t=r?o[r]:{})?void 0:t.components)||{}).ContentConfigForm;return f().createElement(void 0===i?function(){return null}:i,{variableOptions:n})},{displayName:"ContentConfigForm"}));function x(e){var t=e.value,n=e.onChange,o=e.variableOptions;return f().createElement(r.Variable.Input,{scope:o,value:t,onChange:n},f().createElement(r.RemoteSelect,{fieldNames:{label:"nickname",value:"id"},service:{resource:"users",defaultParams:t?{filter:{id:t}}:void 0},manual:!1,value:t,onChange:n}))}function j(e){var t=(0,l.useField)(),n=(0,r.useCollectionFilterOptions)("users"),o=(0,r.useToken)().token,i=(0,s.useCallback)(function(t){var n=t.value,o=t.onChange,i=t.renderSchemaComponent;return f().createElement(r.Variable.Input,{value:n,onChange:o,scope:e.variableOptions},i())},[e.variableOptions]);return f().createElement("div",{style:{border:"1px dashed ".concat(o.colorBorder),padding:o.paddingSM}},f().createElement(r.SchemaComponent,{basePath:t.address,schema:{type:"void",properties:{filter:{type:"object","x-component":"Filter","x-component-props":{options:n,dynamicComponent:i}}}}}))}function P(e){var t;return"object"==((t=e.value)&&"undefined"!=typeof Symbol&&t.constructor===Symbol?"symbol":typeof t)&&e.value?f().createElement(j,e):f().createElement(x,e)}var k=n(482);function A(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function E(){var e,t=(e=(0,s.useState)(!1),function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n,r,o=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=o){var i=[],a=!0,u=!1;try{for(o=o.call(e);!(a=(n=o.next()).done)&&(i.push(n.value),i.length!==t);a=!0);}catch(e){u=!0,r=e}finally{try{a||null==o.return||o.return()}finally{if(u)throw r}}return i}}(e,2)||function(e,t){if(e){if("string"==typeof e)return A(e,2);var n=Object.prototype.toString.call(e).slice(8,-1);if("Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n)return Array.from(n);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return A(e,t)}}(e,2)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),n=t[0],r=t[1],i=(0,o.oG)().t,a=v.ArrayItems.useArray(),u=(0,l.useForm)(),p=(null==u?void 0:u.disabled)===!0,y=(0,s.useCallback)(function(){a.field.push(""),r(!1)},[a.field]),d=(0,s.useCallback)(function(){a.field.push({filter:{}}),r(!1)},[a.field]),m=f().createElement(c.Button,{icon:f().createElement(k.PlusOutlined,null),type:"dashed",block:!0,disabled:p,className:"ant-formily-array-base-addition"},i("Add user"));return p?m:f().createElement(c.Popover,{open:n,onOpenChange:r,content:f().createElement(c.Space,{direction:"vertical",size:"small"},f().createElement(c.Button,{type:"text",onClick:y},i("Select users")),f().createElement(c.Button,{type:"text",onClick:d},i("Query users")))},m)}var T=n(581);function _(e,t,n,r,o,i,a){try{var u=e[i](a),l=u.value}catch(e){n(e);return}u.done?t(l):Promise.resolve(l).then(r,o)}function M(e){return function(){var t=this,n=arguments;return new Promise(function(r,o){var i=e.apply(t,n);function a(e){_(i,r,o,a,u,"next",e)}function u(e){_(i,r,o,a,u,"throw",e)}a(void 0)})}}function q(e,t,n){return(q=B()?Reflect.construct:function(e,t,n){var r=[null];r.push.apply(r,t);var o=new(Function.bind.apply(e,r));return n&&F(o,n.prototype),o}).apply(null,arguments)}function N(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function I(e){return(I=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function F(e,t){return(F=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}function D(e){var t="function"==typeof Map?new Map:void 0;return(D=function(e){if(null===e||-1===Function.toString.call(e).indexOf("[native code]"))return e;if("function"!=typeof e)throw TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,n)}function n(){return q(e,arguments,I(this).constructor)}return n.prototype=Object.create(e.prototype,{constructor:{value:n,enumerable:!1,writable:!0,configurable:!0}}),F(n,e)})(e)}function B(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(e){}return(B=function(){return!!e})()}function R(e,t){var n,r,o,i,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:u(0),throw:u(1),return:u(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function u(i){return function(u){var l=[i,u];if(n)throw TypeError("Generator is already executing.");for(;a;)try{if(n=1,r&&(o=2&l[0]?r.return:l[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,l[1])).done)return o;switch(r=0,o&&(l=[2&l[0],o.value]),l[0]){case 0:case 1:o=l;break;case 4:return a.label++,{value:l[1],done:!1};case 5:a.label++,r=l[1],l=[0];continue;case 7:l=a.ops.pop(),a.trys.pop();continue;default:if(!(o=(o=a.trys).length>0&&o[o.length-1])&&(6===l[0]||2===l[0])){a=0;continue}if(3===l[0]&&(!o||l[1]>o[0]&&l[1]<o[3])){a.label=l[1];break}if(6===l[0]&&a.label<o[1]){a.label=o[1],o=l;break}if(o&&a.label<o[2]){a.label=o[2],a.ops.push(l);break}o[2]&&a.ops.pop(),a.trys.pop();continue}l=t.call(e,a)}catch(e){l=[6,e],r=0}finally{n=o=0}if(5&l[0])throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}}}var G=(0,r.lazy)(function(){return T("imported_54jlgb_component",n.e("843").then(n.bind(n,709)))},"ChannelManager").ChannelManager,U=(0,r.lazy)(function(){return T("imported_-ql9itg_component",n.e("969").then(n.bind(n,358)))},"LogManager").LogManager,V="notification-manager",z=function(e){var t;if("function"!=typeof e&&null!==e)throw TypeError("Super expression must either be null or a function");function n(){var e,t,r;if(!(this instanceof n))throw TypeError("Cannot call a class as a function");return t=n,r=arguments,t=I(t),N(e=function(e,t){var n;if(t&&("object"==((n=t)&&"undefined"!=typeof Symbol&&n.constructor===Symbol?"symbol":typeof n)||"function"==typeof t))return t;if(void 0===e)throw ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(this,B()?Reflect.construct(t,r||[],I(this).constructor):t.apply(this,r)),"manager",void 0),N(e,"useNotificationTypes",i.aT),e}return n.prototype=Object.create(e&&e.prototype,{constructor:{value:n,writable:!0,configurable:!0}}),e&&F(n,e),t=[{key:"channelTypes",get:function(){return this.manager.channelTypes}},{key:"registerChannelType",value:function(e){this.manager.registerChannelType(e)}},{key:"afterAdd",value:function(){return M(function(){return R(this,function(e){return[2]})})()}},{key:"beforeLoad",value:function(){var e=this;return M(function(){return R(this,function(t){return e.manager=new u,[2]})})()}},{key:"load",value:function(){var e=this;return M(function(){return R(this,function(t){return e.app.pluginSettingsManager.add(V,{title:(0,o.KQ)("Notification manager"),icon:"NotificationOutlined",aclSnippet:"pm.notification"}),e.app.pluginSettingsManager.add("".concat(V,".channels"),{title:(0,o.KQ)("Channels"),Component:G,aclSnippet:"pm.notification.channels",sort:1}),e.app.pluginSettingsManager.add("".concat(V,".logs"),{title:(0,o.KQ)("Logs"),Component:U,aclSnippet:"pm.notification.logs",sort:3}),[2]})})()}}],function(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}(n.prototype,t),n}(D(r.Plugin)),L=z},765:function(e,t,n){"use strict";n.d(t,{CZ:function(){return l},tZ:function(){return c},th:function(){return a},wi:function(){return u}});var r=n(156),o=n.n(r);function i(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}var a=(0,r.createContext)({name:"",setName:function(){}});a.displayName="ChannelTypeContext";var u=(0,r.createContext)({channelTypes:[]});u.displayName="ChannelTypesContext";var l=function(){return(0,r.useContext)(u).channelTypes};function c(){var e,t=(e=(0,r.useState)(""),function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n,r,o=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=o){var i=[],a=!0,u=!1;try{for(o=o.call(e);!(a=(n=o.next()).done)&&(i.push(n.value),i.length!==t);a=!0);}catch(e){u=!0,r=e}finally{try{a||null==o.return||o.return()}finally{if(u)throw r}}return i}}(e,2)||function(e,t){if(e){if("string"==typeof e)return i(e,2);var n=Object.prototype.toString.call(e).slice(8,-1);if("Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n)return Array.from(n);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return i(e,t)}}(e,2)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),n=t[0],u=t[1];return{name:n,setName:u,NotificationTypeNameProvider:function(e){var t=e.children;return o().createElement(a.Provider,{value:{name:n,setName:u}},t)}}}},655:function(e,t,n){"use strict";n.d(t,{$l:function(){return C},Bj:function(){return O},G8:function(){return g},Uc:function(){return S},Uy:function(){return x},aT:function(){return j},cD:function(){return h},fC:function(){return w}});var r=n(563),o=n(505),i=n(875),a=n(772),u=n(721),l=n(156),c=n(466),s=n(551),f=n(765);function p(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function y(e,t,n,r,o,i,a){try{var u=e[i](a),l=u.value}catch(e){n(e);return}u.done?t(l):Promise.resolve(l).then(r,o)}function d(e){return function(){var t=this,n=arguments;return new Promise(function(r,o){var i=e.apply(t,n);function a(e){y(i,r,o,a,u,"next",e)}function u(e){y(i,r,o,a,u,"throw",e)}a(void 0)})}}function m(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{},r=Object.keys(n);"function"==typeof Object.getOwnPropertySymbols&&(r=r.concat(Object.getOwnPropertySymbols(n).filter(function(e){return Object.getOwnPropertyDescriptor(n,e).enumerable}))),r.forEach(function(t){var r;r=n[t],t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r})}return e}function b(e,t){return t=null!=t?t:{},Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):(function(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n.push.apply(n,r)}return n})(Object(t)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))}),e}function v(e,t){var n,r,o,i,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:u(0),throw:u(1),return:u(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function u(i){return function(u){var l=[i,u];if(n)throw TypeError("Generator is already executing.");for(;a;)try{if(n=1,r&&(o=2&l[0]?r.return:l[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,l[1])).done)return o;switch(r=0,o&&(l=[2&l[0],o.value]),l[0]){case 0:case 1:o=l;break;case 4:return a.label++,{value:l[1],done:!1};case 5:a.label++,r=l[1],l=[0];continue;case 7:l=a.ops.pop(),a.trys.pop();continue;default:if(!(o=(o=a.trys).length>0&&o[o.length-1])&&(6===l[0]||2===l[0])){a=0;continue}if(3===l[0]&&(!o||l[1]>o[0]&&l[1]<o[3])){a.label=l[1];break}if(6===l[0]&&a.label<o[1]){a.label=o[1],o=l;break}if(o&&a.label<o[2]){a.label=o[2],a.ops.push(l);break}o[2]&&a.ops.pop(),a.trys.pop();continue}l=t.call(e,a)}catch(e){l=[6,e],r=0}finally{n=o=0}if(5&l[0])throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}}}var h=function(){var e=(0,a.useActionContext)(),t=e.setVisible,n=e.setSubmitted;u.App.useApp().message;var r=(0,o.useForm)(),i=(0,a.useDataBlockResource)(),l=(0,a.useBlockRequestContext)().service;return{type:"primary",onClick:function(e,o){return d(function(){var e,a,u,c,s,f,p,y,d;return v(this,function(v){switch(v.label){case 0:return[4,r.submit()];case 1:return v.sent(),a=r.values,[4,i.create({values:a})];case 2:return v.sent(),s=void 0===(c=(u=(null==l||null==(e=l.data)?void 0:e.meta)||{}).count)?0:c,p=void 0===(f=u.page)?0:f,s%(void 0===(y=u.pageSize)?0:y)==1&&1!==p&&l.run(b(m({},null==l||null==(d=l.params)?void 0:d[0]),{page:p-1})),o&&(null==o||o()),null==n||n(!0),null==t||t(!1),[2]}})})()}}},g=function(){var e=(0,a.useActionContext)(),t=e.setVisible,n=e.setSubmitted;u.App.useApp().message;var r=(0,o.useForm)(),i=(0,a.useDataBlockResource)(),l=(0,a.useBlockRequestContext)().service,c=(0,a.useCollection)();return{type:"primary",onClick:function(e,o){return d(function(){var e,a,u,s,f,p,y,d,h;return v(this,function(v){switch(v.label){case 0:return[4,r.submit()];case 1:return v.sent(),a=r.values,[4,i.update({values:a,filterByTk:a[c.filterTargetKey]})];case 2:return v.sent(),f=void 0===(s=(u=(null==l||null==(e=l.data)?void 0:e.meta)||{}).count)?0:s,y=void 0===(p=u.page)?0:p,f%(void 0===(d=u.pageSize)?0:d)==1&&1!==y&&l.run(b(m({},null==l||null==(h=l.params)?void 0:h[0]),{page:y-1})),o&&(null==o||o()),null==n||n(!0),null==t||t(!1),[2]}})})()}}},w=function(){var e=(0,a.useCollectionRecordData)();return{form:(0,l.useMemo)(function(){return(0,r.createForm)({initialValues:e})},[])}},O=function(){var e,t=(0,a.useCollectionRecordData)(),n=null==t||null==(e=t.meta)?void 0:e.editable,r={};return!1===n&&(r.display="none"),{style:r}},C=function(){var e,t=(0,a.useCollectionRecordData)(),n=null==t||null==(e=t.meta)?void 0:e.deletable,r={},o=(0,a.useDestroyActionProps)();return!1===n&&(r.display="none"),b(m({},o),{style:r})},S=function(){(0,a.useActionContext)();var e=(0,l.useContext)(f.th).name;return{form:(0,l.useMemo)(function(){return(0,r.createForm)({values:{name:"s_".concat((0,i.uid)()),notificationType:e}})},[e])}},x=function(){var e=(0,a.useActionContext)().setVisible;return{type:"default",onClick:function(){e(!1)}}},j=function(){var e=(0,s.oG)().t,t=(0,a.usePlugin)(c.PluginNotificationManagerClient),n=[],r=!0,i=!1,u=void 0;try{for(var l,f=t.channelTypes.getEntities()[Symbol.iterator]();!(r=(l=f.next()).done);r=!0){var y,d=(y=l.value,function(e){if(Array.isArray(e))return e}(y)||function(e,t){var n,r,o=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=o){var i=[],a=!0,u=!1;try{for(o=o.call(e);!(a=(n=o.next()).done)&&(i.push(n.value),i.length!==t);a=!0);}catch(e){u=!0,r=e}finally{try{a||null==o.return||o.return()}finally{if(u)throw r}}return i}}(y,2)||function(e,t){if(e){if("string"==typeof e)return p(e,2);var n=Object.prototype.toString.call(e).slice(8,-1);if("Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n)return Array.from(n);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return p(e,t)}}(y,2)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),v=(d[0],d[1]),h=o.Schema.compile(v.title,{t:e}),g=b(m({},v),{name:v.type,key:v.type,value:v.type,title:h,label:h});n.push(g)}}catch(e){i=!0,u=e}finally{try{r||null==f.return||f.return()}finally{if(i)throw u}}return n}},551:function(e,t,n){"use strict";n.d(t,{KQ:function(){return a},oG:function(){return u}});var r=n(772),o=n(238),i="notification-manager";function a(e){return r.i18n.t(e,{ns:i})}function u(){return(0,o.useTranslation)([i,"client","data-source-manager"],{nsMode:"fallback"})}},296:function(e,t,n){"use strict";n.d(t,{O:function(){return o}});var r,o=((r={}).templates="templates",r.channels="notificationChannels",r.messages="messages",r.logs="notificationSendLogs",r)},581:function(e){e.exports=function(e,t){return"undefined"!=typeof __deoptimization_sideEffect__&&__deoptimization_sideEffect__(e,t),t}},482:function(e){"use strict";e.exports=l},632:function(e){"use strict";e.exports=o},563:function(t){"use strict";t.exports=e},505:function(e){"use strict";e.exports=a},875:function(e){"use strict";e.exports=t},772:function(e){"use strict";e.exports=n},667:function(e){"use strict";e.exports=i},584:function(e){"use strict";e.exports=u},721:function(e){"use strict";e.exports=c},156:function(e){"use strict";e.exports=r},238:function(e){"use strict";e.exports=s}},h={};function g(e){var t=h[e];if(void 0!==t)return t.exports;var n=h[e]={exports:{}};return v[e](n,n.exports,g),n.exports}return g.m=v,g.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return g.d(t,{a:t}),t},g.d=function(e,t){for(var n in t)g.o(t,n)&&!g.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},g.f={},g.e=function(e){return Promise.all(Object.keys(g.f).reduce(function(t,n){return g.f[n](e,t),t},[]))},g.u=function(e){return""+e+"."+({843:"9728e7889a97b1a3",969:"540c69b377b22218"})[e]+".js"},g.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||Function("return this")()}catch(e){if("object"==typeof window)return window}}(),g.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},f={},p="@nocobase/plugin-notification-manager:",g.l=function(e,t,n,r){if(f[e])return void f[e].push(t);if(void 0!==n)for(var o,i,a=document.getElementsByTagName("script"),u=0;u<a.length;u++){var l=a[u];if(l.getAttribute("src")==e||l.getAttribute("data-webpack")==p+n){o=l;break}}o||(i=!0,(o=document.createElement("script")).charset="utf-8",o.timeout=120,g.nc&&o.setAttribute("nonce",g.nc),o.setAttribute("data-webpack",p+n),o.src=e),f[e]=[t];var c=function(t,n){o.onerror=o.onload=null,clearTimeout(s);var r=f[e];if(delete f[e],o.parentNode&&o.parentNode.removeChild(o),r&&r.forEach(function(e){return e(n)}),t)return t(n)},s=setTimeout(c.bind(null,void 0,{type:"timeout",target:o}),12e4);o.onerror=c.bind(null,o.onerror),o.onload=c.bind(null,o.onload),i&&document.head.appendChild(o)},g.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(y=window.__webpack_public_path__||"/").endsWith("/")||(y+="/"),g.p=y+"static/plugins/@nocobase/plugin-notification-manager/dist/client/",d={909:0},g.f.j=function(e,t){var n=g.o(d,e)?d[e]:void 0;if(0!==n)if(n)t.push(n[2]);else{var r=new Promise(function(t,r){n=d[e]=[t,r]});t.push(n[2]=r);var o=g.p+g.u(e),i=Error();g.l(o,function(t){if(g.o(d,e)&&(0!==(n=d[e])&&(d[e]=void 0),n)){var r=t&&("load"===t.type?"missing":t.type),o=t&&t.target&&t.target.src;i.message="Loading chunk "+e+" failed.\n("+r+": "+o+")",i.name="ChunkLoadError",i.type=r,i.request=o,n[1](i)}},"chunk-"+e,e)}},m=function(e,t){var n,r,o=t[0],i=t[1],a=t[2],u=0;if(o.some(function(e){return 0!==d[e]})){for(n in i)g.o(i,n)&&(g.m[n]=i[n]);a&&a(g)}for(e&&e(t);u<o.length;u++)r=o[u],g.o(d,r)&&d[r]&&d[r][0](),d[r]=0},(b=self.webpackChunk_nocobase_plugin_notification_manager=self.webpackChunk_nocobase_plugin_notification_manager||[]).forEach(m.bind(null,0)),b.push=m.bind(null,b.push.bind(b)),g(466)}()});
@@ -10,17 +10,18 @@
10
10
  module.exports = {
11
11
  "react": "18.2.0",
12
12
  "antd": "5.24.2",
13
- "@nocobase/client": "2.1.0-beta.13",
14
- "@nocobase/utils": "2.1.0-beta.13",
15
- "@nocobase/server": "2.1.0-beta.13",
16
- "@nocobase/logger": "2.1.0-beta.13",
13
+ "@nocobase/client": "2.1.0-beta.14",
14
+ "@nocobase/utils": "2.1.0-beta.14",
15
+ "@nocobase/database": "2.1.0-beta.14",
16
+ "@nocobase/server": "2.1.0-beta.14",
17
+ "@nocobase/cache": "2.1.0-beta.14",
18
+ "@nocobase/logger": "2.1.0-beta.14",
17
19
  "@formily/react": "2.3.7",
18
20
  "@formily/core": "2.3.7",
19
21
  "react-i18next": "11.18.6",
20
- "@nocobase/database": "2.1.0-beta.13",
21
22
  "@formily/shared": "2.3.7",
22
23
  "@ant-design/icons": "5.6.1",
23
- "@nocobase/flow-engine": "2.1.0-beta.13",
24
+ "@nocobase/flow-engine": "2.1.0-beta.14",
24
25
  "@formily/antd-v5": "1.2.3",
25
- "@nocobase/plugin-workflow": "2.1.0-beta.13"
26
+ "@nocobase/plugin-workflow": "2.1.0-beta.14"
26
27
  };
@@ -6,6 +6,7 @@
6
6
  * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
7
  * For more information, please refer to: https://www.nocobase.com/agreement.
8
8
  */
9
+ import { Transactionable } from '@nocobase/database';
9
10
  import { Application } from '@nocobase/server';
10
11
  import { ChannelOptions, ReceiversOptions } from './types';
11
12
  export declare abstract class BaseNotificationChannel<Message = any> {
@@ -15,9 +16,10 @@ export declare abstract class BaseNotificationChannel<Message = any> {
15
16
  channel: ChannelOptions;
16
17
  message: Message;
17
18
  receivers?: ReceiversOptions;
19
+ transaction?: Transactionable['transaction'];
18
20
  }): Promise<{
19
21
  message: Message;
20
- status: 'success' | 'fail';
22
+ status: 'success' | 'failure';
21
23
  reason?: string;
22
24
  }>;
23
25
  }
@@ -8,8 +8,10 @@
8
8
  */
9
9
  import { Registry } from '@nocobase/utils';
10
10
  import PluginNotificationManagerServer from './plugin';
11
- import type { NotificationChannelConstructor, RegisterServerTypeFnParams, SendOptions, SendUserOptions, WriteLogOptions } from './types';
11
+ import type { NotificationQueueMessage, NotificationChannelConstructor, RegisterServerTypeFnParams, ReceiversOptions, SendOptions, SendUserOptions, WriteLogOptions } from './types';
12
+ import { Transactionable } from '@nocobase/database';
12
13
  export declare class NotificationManager implements NotificationManager {
14
+ private static readonly SLOW_SEND_THRESHOLD_MS;
13
15
  private plugin;
14
16
  channelTypes: Registry<{
15
17
  Channel: NotificationChannelConstructor;
@@ -18,9 +20,38 @@ export declare class NotificationManager implements NotificationManager {
18
20
  plugin: PluginNotificationManagerServer;
19
21
  });
20
22
  registerType({ type, Channel }: RegisterServerTypeFnParams): void;
21
- createSendingRecord: (options: WriteLogOptions) => Promise<any>;
23
+ createSendingRecord: (options: WriteLogOptions & Transactionable) => Promise<any>;
24
+ private toQueueMessage;
25
+ private getQueuedResult;
26
+ private enqueue;
22
27
  findChannel(name: string): Promise<any>;
23
- send(params: SendOptions): Promise<any>;
24
- sendToUsers(options: SendUserOptions): Promise<any[]>;
28
+ private getReceiverMeta;
29
+ send(params: SendOptions): Promise<{
30
+ status: "success";
31
+ triggerFrom: string;
32
+ channelName: string;
33
+ receivers: ReceiversOptions;
34
+ queued: boolean;
35
+ } | {
36
+ status: "failure";
37
+ reason: string;
38
+ triggerFrom: string;
39
+ channelName: string;
40
+ receivers: ReceiversOptions;
41
+ }>;
42
+ sendNow(params: NotificationQueueMessage): Promise<any>;
43
+ sendToUsers(options: SendUserOptions): Promise<({
44
+ status: "success";
45
+ triggerFrom: string;
46
+ channelName: string;
47
+ receivers: ReceiversOptions;
48
+ queued: boolean;
49
+ } | {
50
+ status: "failure";
51
+ reason: string;
52
+ triggerFrom: string;
53
+ channelName: string;
54
+ receivers: ReceiversOptions;
55
+ })[]>;
25
56
  }
26
57
  export default NotificationManager;
@@ -34,6 +34,7 @@ var import_utils = require("@nocobase/utils");
34
34
  var import_constant = require("../constant");
35
35
  var import_compile = require("./utils/compile");
36
36
  class NotificationManager {
37
+ static SLOW_SEND_THRESHOLD_MS = 500;
37
38
  plugin;
38
39
  channelTypes = new import_utils.Registry();
39
40
  constructor({ plugin }) {
@@ -44,52 +45,153 @@ class NotificationManager {
44
45
  }
45
46
  createSendingRecord = async (options) => {
46
47
  const logsRepo = this.plugin.app.db.getRepository(import_constant.COLLECTION_NAME.logs);
47
- return logsRepo.create({ values: options });
48
+ const { transaction, ...values } = options;
49
+ return logsRepo.create({ values, transaction });
48
50
  };
51
+ toQueueMessage(params) {
52
+ const { transaction, ...message } = params;
53
+ return message;
54
+ }
55
+ getQueuedResult(params) {
56
+ return {
57
+ status: "success",
58
+ triggerFrom: params.triggerFrom,
59
+ channelName: params.channelName,
60
+ receivers: params.receivers,
61
+ queued: true
62
+ };
63
+ }
64
+ async enqueue(message) {
65
+ await this.plugin.app.eventQueue.publish(this.plugin.sendQueueChannel, message);
66
+ }
49
67
  async findChannel(name) {
50
- const repository = this.plugin.app.db.getRepository(import_constant.COLLECTION_NAME.channels);
51
- const instance = await repository.findOne({ filterByTk: name });
52
- if (!instance) {
53
- return null;
68
+ return await this.plugin.getChannel(name);
69
+ }
70
+ getReceiverMeta(receivers) {
71
+ if (!receivers) {
72
+ return {};
73
+ }
74
+ if (receivers.type === "userId") {
75
+ return {
76
+ receiverType: receivers.type,
77
+ receiverCount: receivers.value.length
78
+ };
54
79
  }
55
- return this.plugin.app.environment.renderJsonTemplate(instance.toJSON());
80
+ return {
81
+ receiverType: receivers.type
82
+ };
56
83
  }
57
84
  async send(params) {
58
- this.plugin.logger.info("receive sending message request", params);
85
+ const queueMessage = this.toQueueMessage(params);
86
+ const transaction = params.transaction;
87
+ if (transaction == null ? void 0 : transaction.afterCommit) {
88
+ transaction.afterCommit(() => {
89
+ void this.enqueue(queueMessage).catch((error) => {
90
+ this.plugin.logger.error("notification queue publish failed after transaction committed", {
91
+ channelName: params.channelName,
92
+ triggerFrom: params.triggerFrom,
93
+ reason: error instanceof Error ? `${error.name}: ${error.message}` : JSON.stringify(error)
94
+ });
95
+ });
96
+ });
97
+ return this.getQueuedResult(params);
98
+ }
99
+ try {
100
+ await this.enqueue(queueMessage);
101
+ return this.getQueuedResult(params);
102
+ } catch (error) {
103
+ const reason = error instanceof Error ? `${error.name}: ${error.message}` : JSON.stringify(error);
104
+ this.plugin.logger.error("notification queue publish failed", {
105
+ channelName: params.channelName,
106
+ triggerFrom: params.triggerFrom,
107
+ reason
108
+ });
109
+ return {
110
+ status: "failure",
111
+ reason,
112
+ triggerFrom: params.triggerFrom,
113
+ channelName: params.channelName,
114
+ receivers: params.receivers
115
+ };
116
+ }
117
+ }
118
+ async sendNow(params) {
119
+ const startedAt = Date.now();
120
+ const receiverMeta = this.getReceiverMeta(params.receivers);
121
+ const compileStartedAt = Date.now();
59
122
  const message = (0, import_compile.compile)(params.message ?? {}, params.data ?? {});
123
+ const compileMs = Date.now() - compileStartedAt;
60
124
  const messageData = { ...params.receivers ? { receivers: params.receivers } : {}, ...message };
61
125
  const logData = {
62
126
  triggerFrom: params.triggerFrom,
63
127
  channelName: params.channelName,
64
128
  message: messageData
65
129
  };
130
+ let findChannelMs = 0;
131
+ let channelSendMs = 0;
66
132
  try {
133
+ const findChannelStartedAt = Date.now();
67
134
  const channel = await this.findChannel(params.channelName);
135
+ findChannelMs = Date.now() - findChannelStartedAt;
68
136
  if (channel) {
69
137
  const Channel = this.channelTypes.get(channel.notificationType).Channel;
70
138
  const instance = new Channel(this.plugin.app);
71
139
  logData.channelTitle = channel.title;
72
140
  logData.notificationType = channel.notificationType;
73
141
  logData.receivers = params.receivers;
74
- const result = await instance.send({ message, channel, receivers: params.receivers });
142
+ const channelSendStartedAt = Date.now();
143
+ const result = await instance.send({
144
+ message,
145
+ channel,
146
+ receivers: params.receivers
147
+ });
148
+ channelSendMs = Date.now() - channelSendStartedAt;
75
149
  logData.status = result.status;
76
150
  logData.reason = result.reason;
77
151
  } else {
78
152
  logData.status = "failure";
79
153
  logData.reason = "channel not found";
80
154
  }
81
- this.createSendingRecord(logData);
155
+ await this.createSendingRecord(logData);
156
+ const totalMs = Date.now() - startedAt;
157
+ if (totalMs >= NotificationManager.SLOW_SEND_THRESHOLD_MS) {
158
+ this.plugin.logger.warn("notification send is slow", {
159
+ channelName: params.channelName,
160
+ triggerFrom: params.triggerFrom,
161
+ status: logData.status,
162
+ notificationType: logData.notificationType,
163
+ compileMs,
164
+ findChannelMs,
165
+ channelSendMs,
166
+ totalMs,
167
+ ...receiverMeta
168
+ });
169
+ }
82
170
  return logData;
83
171
  } catch (error) {
84
172
  logData.status = "failure";
85
- this.plugin.logger.error(`notification send failed, options: ${JSON.stringify(error)}`);
86
- logData.reason = JSON.stringify(error);
87
- this.createSendingRecord(logData);
173
+ const totalMs = Date.now() - startedAt;
174
+ const reason = error instanceof Error ? `${error.name}: ${error.message}` : JSON.stringify(error);
175
+ this.plugin.logger.error("notification send failed", {
176
+ channelName: params.channelName,
177
+ triggerFrom: params.triggerFrom,
178
+ compileMs,
179
+ findChannelMs,
180
+ channelSendMs,
181
+ totalMs,
182
+ reason,
183
+ ...receiverMeta
184
+ });
185
+ logData.reason = reason;
186
+ await this.createSendingRecord(logData);
88
187
  return logData;
89
188
  }
90
189
  }
91
190
  async sendToUsers(options) {
92
- this.plugin.logger.info(`notificationManager.sendToUsers options: ${JSON.stringify(options)}`);
191
+ this.plugin.logger.debug("notificationManager.sendToUsers", {
192
+ channelCount: options.channels.length,
193
+ userCount: options.userIds.length
194
+ });
93
195
  const { userIds, channels, message, data = {} } = options;
94
196
  return await Promise.all(
95
197
  channels.map(
@@ -98,7 +200,8 @@ class NotificationManager {
98
200
  message,
99
201
  data,
100
202
  triggerFrom: "sendToUsers",
101
- receivers: { value: userIds, type: "userId" }
203
+ receivers: { value: userIds, type: "userId" },
204
+ transaction: options.transaction
102
205
  })
103
206
  )
104
207
  );
@@ -6,18 +6,52 @@
6
6
  * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
7
  * For more information, please refer to: https://www.nocobase.com/agreement.
8
8
  */
9
+ import type { Cache } from '@nocobase/cache';
9
10
  import type { Logger } from '@nocobase/logger';
11
+ import { Transactionable } from '@nocobase/database';
10
12
  import { Plugin } from '@nocobase/server';
11
13
  import { RegisterServerTypeFnParams, SendOptions, SendUserOptions } from './types';
12
14
  export declare class PluginNotificationManagerServer extends Plugin {
15
+ private static readonly CHANNELS_CACHE_KEY;
13
16
  private manager;
14
17
  logger: Logger;
18
+ cache: Cache;
19
+ get sendQueueChannel(): string;
20
+ private ensureCache;
21
+ parseChannel(instance: any): any;
22
+ loadChannels(options?: Transactionable): Promise<void>;
23
+ getChannel(name: string): Promise<any>;
15
24
  get channelTypes(): import("@nocobase/utils").Registry<{
16
25
  Channel: import("./types").NotificationChannelConstructor;
17
26
  }>;
18
27
  registerChannelType(params: RegisterServerTypeFnParams): void;
19
- send(options: SendOptions): Promise<any>;
20
- sendToUsers(options: SendUserOptions): Promise<any[]>;
28
+ send(options: SendOptions): Promise<{
29
+ status: "success";
30
+ triggerFrom: string;
31
+ channelName: string;
32
+ receivers: import("./types").ReceiversOptions;
33
+ queued: boolean;
34
+ } | {
35
+ status: "failure";
36
+ reason: string;
37
+ triggerFrom: string;
38
+ channelName: string;
39
+ receivers: import("./types").ReceiversOptions;
40
+ }>;
41
+ sendNow(options: SendOptions): Promise<any>;
42
+ sendToUsers(options: SendUserOptions): Promise<({
43
+ status: "success";
44
+ triggerFrom: string;
45
+ channelName: string;
46
+ receivers: import("./types").ReceiversOptions;
47
+ queued: boolean;
48
+ } | {
49
+ status: "failure";
50
+ reason: string;
51
+ triggerFrom: string;
52
+ channelName: string;
53
+ receivers: import("./types").ReceiversOptions;
54
+ })[]>;
21
55
  afterAdd(): Promise<void>;
22
56
  beforeLoad(): Promise<void>;
23
57
  load(): Promise<void>;
@@ -41,10 +41,50 @@ __export(plugin_exports, {
41
41
  });
42
42
  module.exports = __toCommonJS(plugin_exports);
43
43
  var import_server = require("@nocobase/server");
44
+ var import_constant = require("../constant");
44
45
  var import_manager = __toESM(require("./manager"));
45
46
  class PluginNotificationManagerServer extends import_server.Plugin {
47
+ static CHANNELS_CACHE_KEY = "channels";
46
48
  manager;
47
49
  logger;
50
+ cache;
51
+ get sendQueueChannel() {
52
+ return `${this.name}.send`;
53
+ }
54
+ async ensureCache() {
55
+ if (!this.cache) {
56
+ this.cache = await this.app.cacheManager.createCache({
57
+ name: this.name,
58
+ prefix: this.name
59
+ });
60
+ }
61
+ return this.cache;
62
+ }
63
+ parseChannel(instance) {
64
+ return this.app.environment.renderJsonTemplate(instance.toJSON());
65
+ }
66
+ async loadChannels(options) {
67
+ const cache = await this.ensureCache();
68
+ const repository = this.app.db.getRepository(import_constant.COLLECTION_NAME.channels);
69
+ const channels = await repository.find({
70
+ transaction: options == null ? void 0 : options.transaction
71
+ });
72
+ const channelsCache = {};
73
+ for (const channel of channels) {
74
+ channelsCache[channel.get("name")] = this.parseChannel(channel);
75
+ }
76
+ await cache.set(PluginNotificationManagerServer.CHANNELS_CACHE_KEY, channelsCache);
77
+ }
78
+ async getChannel(name) {
79
+ const cache = await this.ensureCache();
80
+ const channels = await cache.get(PluginNotificationManagerServer.CHANNELS_CACHE_KEY) || void 0;
81
+ if (!channels) {
82
+ await this.loadChannels();
83
+ const reloadedChannels = await cache.get(PluginNotificationManagerServer.CHANNELS_CACHE_KEY);
84
+ return (reloadedChannels == null ? void 0 : reloadedChannels[name]) || null;
85
+ }
86
+ return channels[name] || null;
87
+ }
48
88
  get channelTypes() {
49
89
  return this.manager.channelTypes;
50
90
  }
@@ -54,6 +94,10 @@ class PluginNotificationManagerServer extends import_server.Plugin {
54
94
  async send(options) {
55
95
  return await this.manager.send(options);
56
96
  }
97
+ async sendNow(options) {
98
+ const { transaction, ...message } = options;
99
+ return await this.manager.sendNow(message);
100
+ }
57
101
  async sendToUsers(options) {
58
102
  return await this.manager.sendToUsers(options);
59
103
  }
@@ -69,8 +113,8 @@ class PluginNotificationManagerServer extends import_server.Plugin {
69
113
  this.app.resourceManager.registerActionHandler("messages:send", async (ctx, next) => {
70
114
  var _a, _b;
71
115
  const sendOptions = (_b = (_a = ctx.action) == null ? void 0 : _a.params) == null ? void 0 : _b.values;
72
- this.manager.send(sendOptions);
73
- next();
116
+ await this.manager.send(sendOptions);
117
+ await next();
74
118
  });
75
119
  this.app.acl.registerSnippet({
76
120
  name: "pm.notification.channels",
@@ -80,16 +124,35 @@ class PluginNotificationManagerServer extends import_server.Plugin {
80
124
  name: "pm.notification.logs",
81
125
  actions: ["notificationSendLogs:*"]
82
126
  });
127
+ this.app.on("afterStart", async () => {
128
+ await this.loadChannels();
129
+ });
83
130
  }
84
131
  async load() {
132
+ const Channel = this.app.db.getModel(import_constant.COLLECTION_NAME.channels);
133
+ Channel.afterSave(async (_model, { transaction }) => {
134
+ await this.loadChannels({ transaction });
135
+ });
136
+ Channel.afterDestroy(async (_model, { transaction }) => {
137
+ await this.loadChannels({ transaction });
138
+ });
139
+ this.app.eventQueue.subscribe(this.sendQueueChannel, {
140
+ concurrency: 1,
141
+ idle: () => true,
142
+ process: async (message) => {
143
+ await this.manager.sendNow(message);
144
+ }
145
+ });
85
146
  }
86
147
  async install() {
87
148
  }
88
149
  async afterEnable() {
89
150
  }
90
151
  async afterDisable() {
152
+ this.app.eventQueue.unsubscribe(this.sendQueueChannel);
91
153
  }
92
154
  async remove() {
155
+ this.app.eventQueue.unsubscribe(this.sendQueueChannel);
93
156
  }
94
157
  }
95
158
  var plugin_default = PluginNotificationManagerServer;
@@ -6,6 +6,7 @@
6
6
  * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
7
  * For more information, please refer to: https://www.nocobase.com/agreement.
8
8
  */
9
+ import { Transactionable } from '@nocobase/database';
9
10
  import { Application } from '@nocobase/server';
10
11
  import { BaseNotificationChannel } from './base-notification-channel';
11
12
  /**
@@ -33,9 +34,10 @@ export type SendFnType<Message> = (args: {
33
34
  message: Message;
34
35
  channel: ChannelOptions;
35
36
  receivers?: ReceiversOptions;
37
+ transaction?: Transactionable['transaction'];
36
38
  }) => Promise<{
37
39
  message: Message;
38
- status: 'success' | 'fail';
40
+ status: 'success' | 'failure';
39
41
  reason?: string;
40
42
  }>;
41
43
  export type ReceiversOptions = {
@@ -46,14 +48,15 @@ export type ReceiversOptions = {
46
48
  type: 'channel-self-defined';
47
49
  channelType: string;
48
50
  };
49
- export interface SendOptions {
51
+ export interface SendOptions extends Transactionable {
50
52
  channelName: string;
51
53
  message: Record<string, any>;
52
54
  triggerFrom: string;
53
55
  receivers?: ReceiversOptions;
54
56
  data?: Record<string, any>;
55
57
  }
56
- export interface SendUserOptions {
58
+ export type NotificationQueueMessage = Omit<SendOptions, 'transaction'>;
59
+ export interface SendUserOptions extends Transactionable {
57
60
  userIds: number[];
58
61
  channels: string[];
59
62
  message: Record<string, any>;
package/package.json CHANGED
@@ -6,7 +6,7 @@
6
6
  "description.ru-RU": "Предоставляет единый сервис управления, включающий конфигурирование каналов, логирование и другие функции, поддерживает настройку различных каналов уведомлений, включая внутренние сообщения и электронную почту.",
7
7
  "displayName.zh-CN": "通知管理",
8
8
  "description.zh-CN": "提供统一的管理服务,涵盖渠道配置、日志记录等功能,支持多种通知渠道的配置,包括站内信和电子邮件等。",
9
- "version": "2.1.0-beta.13",
9
+ "version": "2.1.0-beta.14",
10
10
  "homepage": "https://docs.nocobase.com/handbook/notification-manager",
11
11
  "homepage.ru-RU": "https://docs-ru.nocobase.com/handbook/notification-manager",
12
12
  "homepage.zh-CN": "https://docs-cn.nocobase.com/handbook/notification-manager",
@@ -35,5 +35,5 @@
35
35
  "Notification"
36
36
  ],
37
37
  "license": "Apache-2.0",
38
- "gitHead": "691716e5f4e5f8bd3859d65bc8a29b4e3c32209b"
38
+ "gitHead": "cd55c9a14596d834c30c83a82c38f1f719f7aac4"
39
39
  }