@ozdao/martyrs 0.2.468 → 0.2.470

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.
Files changed (135) hide show
  1. package/dist/{Media-DwVcRIAX.mjs → Media-C4Ges_Sd.mjs} +1 -1
  2. package/dist/{Media-DCGbUujy.js → Media-CR0V1zvB.js} +1 -1
  3. package/dist/chats.server.js +14 -13
  4. package/dist/chats.server.mjs +14 -13
  5. package/dist/globals.server.js +20 -12
  6. package/dist/globals.server.mjs +20 -12
  7. package/dist/{main-DEHjtgLs.mjs → main-CTcal9qN.mjs} +900 -884
  8. package/dist/{main-UVdexuMN.js → main-CsZAG5Wz.js} +5 -5
  9. package/dist/martyrs/src/components/Block/Block.vue.cjs +1 -1
  10. package/dist/martyrs/src/components/Block/Block.vue.js +1 -1
  11. package/dist/martyrs/src/components/SelectMulti/{SelectMulti.vue2.cjs → SelectMulti.vue.cjs} +2 -2
  12. package/dist/martyrs/src/components/SelectMulti/{SelectMulti.vue2.js.map → SelectMulti.vue.cjs.map} +1 -1
  13. package/dist/martyrs/src/components/SelectMulti/{SelectMulti.vue2.js → SelectMulti.vue.js} +2 -2
  14. package/dist/martyrs/src/components/SelectMulti/SelectMulti.vue.js.map +1 -0
  15. package/dist/martyrs/src/components/Tooltip/{Tooltip.vue.cjs → Tooltip.vue2.cjs} +2 -2
  16. package/dist/martyrs/src/components/Tooltip/Tooltip.vue2.cjs.map +1 -0
  17. package/dist/martyrs/src/components/Tooltip/{Tooltip.vue.js → Tooltip.vue2.js} +2 -2
  18. package/dist/martyrs/src/components/Tooltip/{Tooltip.vue.cjs.map → Tooltip.vue2.js.map} +1 -1
  19. package/dist/martyrs/src/modules/backoffice/components/partials/Sidebar.vue.cjs +1 -1
  20. package/dist/martyrs/src/modules/backoffice/components/partials/Sidebar.vue.js +1 -1
  21. package/dist/martyrs/src/modules/chats/store/chat.store.cjs +47 -16
  22. package/dist/martyrs/src/modules/chats/store/chat.store.cjs.map +1 -1
  23. package/dist/martyrs/src/modules/chats/store/chat.store.js +47 -16
  24. package/dist/martyrs/src/modules/chats/store/chat.store.js.map +1 -1
  25. package/dist/martyrs/src/modules/community/components/blocks/CardBlogpost.vue.cjs +1 -1
  26. package/dist/martyrs/src/modules/community/components/blocks/CardBlogpost.vue.cjs.map +1 -1
  27. package/dist/martyrs/src/modules/community/components/blocks/CardBlogpost.vue.js +1 -1
  28. package/dist/martyrs/src/modules/community/components/blocks/CardBlogpost.vue.js.map +1 -1
  29. package/dist/martyrs/src/modules/community/components/pages/Blog.vue.cjs +1 -1
  30. package/dist/martyrs/src/modules/community/components/pages/Blog.vue.cjs.map +1 -1
  31. package/dist/martyrs/src/modules/community/components/pages/Blog.vue.js +1 -1
  32. package/dist/martyrs/src/modules/community/components/pages/Blog.vue.js.map +1 -1
  33. package/dist/martyrs/src/modules/community/components/pages/BlogPost.vue.cjs +4 -1
  34. package/dist/martyrs/src/modules/community/components/pages/BlogPost.vue.cjs.map +1 -1
  35. package/dist/martyrs/src/modules/community/components/pages/BlogPost.vue.js +4 -1
  36. package/dist/martyrs/src/modules/community/components/pages/BlogPost.vue.js.map +1 -1
  37. package/dist/martyrs/src/modules/community/components/pages/CreateBlogPost.vue.cjs +3 -3
  38. package/dist/martyrs/src/modules/community/components/pages/CreateBlogPost.vue.cjs.map +1 -1
  39. package/dist/martyrs/src/modules/community/components/pages/CreateBlogPost.vue.js +3 -3
  40. package/dist/martyrs/src/modules/community/components/pages/CreateBlogPost.vue.js.map +1 -1
  41. package/dist/martyrs/src/modules/constructor/components/elements/VideoPlayer.vue.cjs +1 -1
  42. package/dist/martyrs/src/modules/constructor/components/elements/VideoPlayer.vue.cjs.map +1 -1
  43. package/dist/martyrs/src/modules/constructor/components/elements/VideoPlayer.vue.js +1 -1
  44. package/dist/martyrs/src/modules/constructor/components/elements/VideoPlayer.vue.js.map +1 -1
  45. package/dist/martyrs/src/modules/constructor/components/sections/Constructor.vue.cjs +9 -9
  46. package/dist/martyrs/src/modules/constructor/components/sections/Constructor.vue.cjs.map +1 -1
  47. package/dist/martyrs/src/modules/constructor/components/sections/Constructor.vue.js +9 -9
  48. package/dist/martyrs/src/modules/constructor/components/sections/Constructor.vue.js.map +1 -1
  49. package/dist/martyrs/src/modules/events/components/pages/EditEvent.vue.cjs +2 -2
  50. package/dist/martyrs/src/modules/events/components/pages/EditEvent.vue.cjs.map +1 -1
  51. package/dist/martyrs/src/modules/events/components/pages/EditEvent.vue.js +2 -2
  52. package/dist/martyrs/src/modules/events/components/pages/EditEvent.vue.js.map +1 -1
  53. package/dist/martyrs/src/modules/gallery/components/sections/BackofficeGallery.vue.cjs +1 -1
  54. package/dist/martyrs/src/modules/gallery/components/sections/BackofficeGallery.vue.js +1 -1
  55. package/dist/martyrs/src/modules/globals/globals.client.cjs +0 -9
  56. package/dist/martyrs/src/modules/globals/globals.client.cjs.map +1 -1
  57. package/dist/martyrs/src/modules/globals/globals.client.js +0 -9
  58. package/dist/martyrs/src/modules/globals/globals.client.js.map +1 -1
  59. package/dist/martyrs/src/modules/globals/views/classes/globals.websocket.cjs +40 -97
  60. package/dist/martyrs/src/modules/globals/views/classes/globals.websocket.cjs.map +1 -1
  61. package/dist/martyrs/src/modules/globals/views/classes/globals.websocket.js +40 -97
  62. package/dist/martyrs/src/modules/globals/views/classes/globals.websocket.js.map +1 -1
  63. package/dist/martyrs/src/modules/globals/views/components/blocks/CardHeader.vue.cjs +1 -1
  64. package/dist/martyrs/src/modules/globals/views/components/blocks/CardHeader.vue.js +1 -1
  65. package/dist/martyrs/src/modules/icons/skeletons/SkeletonBlogpost.vue.cjs +1 -1
  66. package/dist/martyrs/src/modules/icons/skeletons/SkeletonBlogpost.vue.cjs.map +1 -1
  67. package/dist/martyrs/src/modules/icons/skeletons/SkeletonBlogpost.vue.js +1 -1
  68. package/dist/martyrs/src/modules/icons/skeletons/SkeletonBlogpost.vue.js.map +1 -1
  69. package/dist/martyrs/src/modules/notifications/notifications.client.cjs +35 -9
  70. package/dist/martyrs/src/modules/notifications/notifications.client.cjs.map +1 -1
  71. package/dist/martyrs/src/modules/notifications/notifications.client.js +35 -9
  72. package/dist/martyrs/src/modules/notifications/notifications.client.js.map +1 -1
  73. package/dist/martyrs/src/modules/orders/components/blocks/CardOrderUser.vue.cjs +1 -1
  74. package/dist/martyrs/src/modules/orders/components/blocks/CardOrderUser.vue.js +1 -1
  75. package/dist/martyrs/src/modules/orders/components/pages/OrderBackoffice.vue.cjs +1 -1
  76. package/dist/martyrs/src/modules/orders/components/pages/OrderBackoffice.vue.js +1 -1
  77. package/dist/martyrs/src/modules/orders/components/pages/OrderCreate.vue.cjs +7 -7
  78. package/dist/martyrs/src/modules/orders/components/pages/OrderCreate.vue.cjs.map +1 -1
  79. package/dist/martyrs/src/modules/orders/components/pages/OrderCreate.vue.js +8 -8
  80. package/dist/martyrs/src/modules/orders/components/pages/OrderCreate.vue.js.map +1 -1
  81. package/dist/martyrs/src/modules/orders/components/pages/OrderCreateBackoffice.vue.cjs +1 -1
  82. package/dist/martyrs/src/modules/orders/components/pages/OrderCreateBackoffice.vue.js +1 -1
  83. package/dist/martyrs/src/modules/organizations/components/pages/Members.vue.cjs +1 -1
  84. package/dist/martyrs/src/modules/organizations/components/pages/Members.vue.js +1 -1
  85. package/dist/martyrs/src/modules/organizations/components/pages/OrganizationBackoffice.vue.cjs +1 -1
  86. package/dist/martyrs/src/modules/organizations/components/pages/OrganizationBackoffice.vue.js +1 -1
  87. package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.cjs +1 -1
  88. package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.js +1 -1
  89. package/dist/martyrs/src/modules/pages/views/components/pages/PageEdit.vue.cjs +1 -1
  90. package/dist/martyrs/src/modules/pages/views/components/pages/PageEdit.vue.js +1 -1
  91. package/dist/martyrs/src/modules/products/components/blocks/CardPosition.vue.cjs +1 -1
  92. package/dist/martyrs/src/modules/products/components/blocks/CardPosition.vue.js +1 -1
  93. package/dist/martyrs/src/modules/products/components/pages/EditLeftover.vue.cjs +1 -1
  94. package/dist/martyrs/src/modules/products/components/pages/EditLeftover.vue.js +1 -1
  95. package/dist/martyrs/src/modules/products/components/pages/Product.vue.cjs +6 -5
  96. package/dist/martyrs/src/modules/products/components/pages/Product.vue.cjs.map +1 -1
  97. package/dist/martyrs/src/modules/products/components/pages/Product.vue.js +6 -5
  98. package/dist/martyrs/src/modules/products/components/pages/Product.vue.js.map +1 -1
  99. package/dist/martyrs/src/modules/rents/views/components/pages/RentsEdit.vue.cjs +1 -1
  100. package/dist/martyrs/src/modules/rents/views/components/pages/RentsEdit.vue.js +1 -1
  101. package/dist/martyrs.cjs.js +1 -1
  102. package/dist/martyrs.css +1 -1
  103. package/dist/martyrs.es.js +1 -1
  104. package/dist/notifications.server.js +69 -13
  105. package/dist/notifications.server.mjs +69 -13
  106. package/dist/orders.server.js +1 -0
  107. package/dist/orders.server.mjs +1 -0
  108. package/package.json +1 -1
  109. package/src/components/Shader/Shader.vue +44 -25
  110. package/src/modules/chats/routes/chats.routes.js +21 -17
  111. package/src/modules/chats/store/chat.store.js +55 -28
  112. package/src/modules/community/components/blocks/CardBlogpost.vue +1 -1
  113. package/src/modules/community/components/pages/Blog.vue +1 -1
  114. package/src/modules/community/components/pages/BlogPost.vue +1 -0
  115. package/src/modules/community/components/pages/CreateBlogPost.vue +3 -3
  116. package/src/modules/constructor/components/elements/VideoPlayer.vue +1 -1
  117. package/src/modules/constructor/components/sections/Constructor.vue +9 -9
  118. package/src/modules/events/components/pages/EditEvent.vue +1 -1
  119. package/src/modules/globals/controllers/classes/globals.websocket.js +29 -21
  120. package/src/modules/globals/globals.client.js +0 -12
  121. package/src/modules/globals/views/classes/globals.websocket.js +46 -146
  122. package/src/modules/icons/skeletons/SkeletonBlogpost.vue +2 -2
  123. package/src/modules/notifications/controllers/notifications.controller.js +2 -2
  124. package/src/modules/notifications/notifications.client.js +57 -19
  125. package/src/modules/notifications/notifications.server.js +3 -1
  126. package/src/modules/notifications/routes/notifications.routes.js +2 -2
  127. package/src/modules/notifications/services/notification.service.js +34 -15
  128. package/src/modules/notifications/services/web-push.service.js +7 -6
  129. package/src/modules/orders/components/pages/OrderCreate.vue +3 -4
  130. package/src/modules/orders/controllers/orders.controller.js +2 -0
  131. package/src/modules/products/components/pages/Product.vue +7 -6
  132. package/dist/martyrs/src/components/SelectMulti/SelectMulti.vue2.cjs.map +0 -1
  133. package/dist/martyrs/src/components/Tooltip/Tooltip.vue.js.map +0 -1
  134. package/src/modules/notifications/notifications2.client.js +0 -256
  135. package/src/modules/notifications/services/websocket.service.js +0 -100
@@ -4,7 +4,8 @@
4
4
 
5
5
  <!-- Ask to login -->
6
6
  <AskToLogin class="mn-b-thin" v-if="auth.state.access.status === false" />
7
-
7
+ {{shopcart.state.organization}}
8
+ {{orderOrganization.value?._id}}
8
9
  <!-- Order form -->
9
10
  <div class="gap-small mn-b-thin cols-2">
10
11
  <!-- Empty State -->
@@ -179,16 +180,14 @@ onMounted(async()=> {
179
180
 
180
181
  isLocationLoading.value = true
181
182
 
182
-
183
183
  if (auth.state.user._id) {
184
184
  let data = await users.actions.read({ _id:auth.state.user._id, user: auth.state.user._id });
185
+
185
186
  orders.state.current.customer.profile.name = users.state.current.profile.name
186
187
  orders.state.current.customer.phone = users.state.current.phone
187
188
  orders.state.current.customer.phone = users.state.current.phone
188
189
  }
189
190
 
190
- orders.state.current.organization = shopcart.state.organization
191
-
192
191
  orderOrganization.value = await organizations.actions.read({
193
192
  _id: shopcart.state.organization,
194
193
  location: globals.state.position?.location,
@@ -366,6 +366,8 @@ const controllerFactory = (db) => {
366
366
  },
367
367
  userId: order.creator.target, // Assuming creator.target holds the user ID
368
368
  };
369
+
370
+ console.log('notifiocatio data', JSON.stringify(notificationData))
369
371
 
370
372
  // Send notification using the notification service
371
373
  const notificationResponse = await fetch(`${process.env.API_URL || ''}/api/notifications`, {
@@ -179,8 +179,8 @@ onMounted(async () => {
179
179
  currency: returnCurrency(), // Замените на вашу валюту, если отличается
180
180
  value: product.value.price || 0,
181
181
  items: [{
182
- item_id: product.value.id || product.value._id,
183
- item_name: product.value.name || product.value.title,
182
+ item_id: product.value._id,
183
+ item_name: product.value.name,
184
184
  price: product.value.price || 0,
185
185
  item_category: product.value.category || '',
186
186
  item_brand: product.value.owner?.target?.profile.name || ''
@@ -203,8 +203,11 @@ function validateToCard(product) {
203
203
 
204
204
  async function addToCart(product, selectedDates = null) {
205
205
  try {
206
+ if (!shopcart.state.organization) {
207
+ shopcart.state.organization = product.owner.target._id
208
+ }
206
209
  // Если организация товара отличается от текущей в корзине
207
- if (shopcart.state.organization && shopcart.state.organization !== product.owner.target._id) {
210
+ if (shopcart.state.organization !== product.owner.target._id) {
208
211
  const result = await proxy.$alert({
209
212
  title: 'Replace items in your cart?',
210
213
  message: `Your cart has items from another vendor. If you continue, we'll clear it so you can order from this one instead.`,
@@ -216,7 +219,6 @@ async function addToCart(product, selectedDates = null) {
216
219
 
217
220
  if (!result) throw error
218
221
 
219
- shopcart.state.organization = product.owner.target._id
220
222
  shopcart.state.positions = []
221
223
  }
222
224
 
@@ -234,8 +236,7 @@ async function addToCart(product, selectedDates = null) {
234
236
  }]
235
237
  });
236
238
  }
237
-
238
- console.log('organization is', product.owner.target._id)
239
+
239
240
  await shopcart.actions.addProductToCart(product, product.owner.target._id, selectedDates)
240
241
  return true
241
242
  } catch (error) {
@@ -1 +0,0 @@
1
- {"version":3,"file":"SelectMulti.vue2.cjs","sources":["../../../../../src/components/SelectMulti/SelectMulti.vue"],"sourcesContent":["<template>\n <div\n :tabindex=\"searchable ? -1 : tabindex\"\n :class=\"{ 'multiselect--active': isOpen, 'multiselect--disabled': disabled, 'multiselect--above': isAbove, 'multiselect--has-options-group': hasOptionGroup }\"\n @focus=\"activate()\"\n @blur=\"searchable ? false : deactivate()\"\n @keydown.self.down.prevent=\"pointerForward()\"\n @keydown.self.up.prevent=\"pointerBackward()\"\n @keypress.enter.tab.stop.self=\"addPointerElement($event)\"\n @keyup.esc=\"deactivate()\"\n class=\"multiselect flex flex-v-center\"\n role=\"combobox\"\n :aria-owns=\"'listbox-'+id\">\n \n <slot name=\"caret\" :toggle=\"toggle\">\n <div @mousedown.prevent.stop=\"toggle()\" class=\"multiselect__select\"></div>\n </slot>\n \n <slot name=\"clear\" :search=\"search\"></slot>\n \n <div ref=\"tags\" class=\"multiselect__tags\">\n <slot\n name=\"selection\"\n :search=\"search\"\n :remove=\"removeElement\"\n :values=\"visibleValues\"\n :is-open=\"isOpen\"\n >\n <div class=\"multiselect__tags-wrap\" v-show=\"visibleValues.length > 0\">\n <template v-for=\"(option, index) of visibleValues\" @mousedown.prevent>\n <slot name=\"tag\" :option=\"option\" :search=\"search\" :remove=\"removeElement\">\n <span class=\"multiselect__tag\" :key=\"index\">\n <span v-text=\"getOptionLabel(option)\"></span>\n <i tabindex=\"1\" @keypress.enter.prevent=\"removeElement(option)\"\n @mousedown.prevent=\"removeElement(option)\" class=\"multiselect__tag-icon\"></i>\n </span>\n </slot>\n </template>\n </div>\n <template v-if=\"internalValue && internalValue.length > limit\">\n <slot name=\"limit\">\n <strong class=\"multiselect__strong\" v-text=\"limitText(internalValue.length - limit)\"/>\n </slot>\n </template>\n </slot>\n <transition name=\"multiselect__loading\">\n <slot name=\"loading\">\n <div v-show=\"loading\" class=\"multiselect__spinner\"/>\n </slot>\n </transition>\n <input\n ref=\"search\"\n v-if=\"searchable\"\n :name=\"name\"\n :id=\"id\"\n type=\"text\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n :placeholder=\"placeholder\"\n :style=\"inputStyle\"\n :value=\"search\"\n :disabled=\"disabled\"\n :tabindex=\"tabindex\"\n @input=\"updateSearch($event.target.value)\"\n @focus.prevent=\"activate()\"\n @blur.prevent=\"deactivate()\"\n @keyup.esc=\"deactivate()\"\n @keydown.down.prevent=\"pointerForward()\"\n @keydown.up.prevent=\"pointerBackward()\"\n @keypress.enter.prevent.stop.self=\"addPointerElement($event)\"\n @keydown.delete.stop=\"removeLastElement()\"\n class=\"multiselect__input\"\n :aria-controls=\"'listbox-'+id\"\n />\n <span\n v-if=\"isSingleLabelVisible\"\n class=\"multiselect__single\"\n @mousedown.prevent=\"toggle\"\n >\n <slot name=\"singleLabel\" :option=\"singleValue\">\n {{ currentOptionLabel }}\n </slot>\n </span>\n <span\n v-if=\"isPlaceholderVisible\"\n class=\"multiselect__placeholder\"\n @mousedown.prevent=\"toggle\"\n >\n <slot name=\"placeholder\">\n {{ placeholder }}\n </slot>\n </span>\n </div>\n \n <transition name=\"multiselect\">\n <div\n class=\"multiselect__content-wrapper\"\n v-show=\"isOpen\"\n @focus=\"activate\"\n tabindex=\"-1\"\n @mousedown.prevent\n :style=\"{ maxHeight: optimizedHeight + 'px' }\"\n ref=\"list\"\n :class=\"$attrs.class\"\n >\n <ul class=\"multiselect__content\" :style=\"contentStyle\" role=\"listbox\" :id=\"'listbox-'+id\">\n <slot name=\"beforeList\"></slot>\n <li v-if=\"multiple && max === internalValue.length\">\n <span class=\"multiselect__option\">\n <slot name=\"maxElements\">Maximum of {{ max }} options selected. First remove a selected option to select another.</slot>\n </span>\n </li>\n <template v-if=\"!max || internalValue.length < max\">\n <li class=\"multiselect__element\"\n v-for=\"(option, index) of filteredOptions\"\n :key=\"index\"\n v-bind:id=\"id + '-' + index\"\n v-bind:role=\"!(option && (option.$isLabel || option.$isDisabled)) ? 'option' : null\">\n <span\n v-if=\"!(option && (option.$isLabel || option.$isDisabled))\"\n :class=\"optionHighlight(index, option)\"\n @click.stop=\"select(option)\"\n @mouseenter.self=\"pointerSet(index)\"\n :data-select=\"option && option.isTag ? tagPlaceholder : selectLabelText\"\n :data-selected=\"selectedLabelText\"\n :data-deselect=\"deselectLabelText\"\n class=\"multiselect__option\">\n <slot name=\"option\" :option=\"option\" :search=\"search\" :index=\"index\">\n <span>{{ getOptionLabel(option) }}</span>\n </slot>\n </span>\n <span\n v-if=\"option && (option.$isLabel || option.$isDisabled)\"\n :data-select=\"groupSelect && selectGroupLabelText\"\n :data-deselect=\"groupSelect && deselectGroupLabelText\"\n :class=\"groupHighlight(index, option)\"\n @mouseenter.self=\"groupSelect && pointerSet(index)\"\n @mousedown.prevent=\"selectGroup(option)\"\n class=\"multiselect__option\">\n <slot name=\"option\" :option=\"option\" :search=\"search\" :index=\"index\">\n <span>{{ getOptionLabel(option) }}</span>\n </slot>\n </span>\n </li>\n </template>\n <li v-show=\"showNoResults && (filteredOptions.length === 0 && search && !loading)\">\n <span class=\"multiselect__option\">\n <slot name=\"noResult\" :search=\"search\">No elements found. Consider changing the search query.</slot>\n </span>\n </li>\n <li v-show=\"showNoOptions && ((options.length === 0 || (hasOptionGroup === true && filteredOptions.length === 0)) && !search && !loading)\">\n <span class=\"multiselect__option\">\n <slot name=\"noOptions\">List is empty.</slot>\n </span>\n </li>\n <slot name=\"afterList\"></slot>\n </ul>\n </div>\n </transition>\n </div>\n</template>\n\n<script>\nimport multiselectMixin from './multiselectMixin'\nimport pointerMixin from './pointerMixin'\n\nexport default {\n name: 'vue-multiselect',\n mixins: [multiselectMixin, pointerMixin],\n compatConfig: {\n MODE: 3,\n ATTR_ENUMERATED_COERCION: false\n },\n props: {\n /**\n * name attribute to match optional label element\n * @default ''\n * @type {String}\n */\n name: {\n type: String,\n default: ''\n },\n /**\n * Presets the selected options value.\n * @type {Object||Array||String||Integer}\n */\n modelValue: {\n type: null,\n default () {\n return []\n }\n },\n /**\n * String to show when pointing to an option\n * @default 'Press enter to select'\n * @type {String}\n */\n selectLabel: {\n type: String,\n default: 'Press enter to select'\n },\n /**\n * String to show when pointing to an option\n * @default 'Press enter to select'\n * @type {String}\n */\n selectGroupLabel: {\n type: String,\n default: 'Press enter to select group'\n },\n /**\n * String to show next to selected option\n * @default 'Selected'\n * @type {String}\n */\n selectedLabel: {\n type: String,\n default: 'Selected'\n },\n /**\n * String to show when pointing to an already selected option\n * @default 'Press enter to remove'\n * @type {String}\n */\n deselectLabel: {\n type: String,\n default: 'Press enter to remove'\n },\n /**\n * String to show when pointing to an already selected option\n * @default 'Press enter to remove'\n * @type {String}\n */\n deselectGroupLabel: {\n type: String,\n default: 'Press enter to deselect group'\n },\n /**\n * Decide whether to show pointer labels\n * @default true\n * @type {Boolean}\n */\n showLabels: {\n type: Boolean,\n default: true\n },\n /**\n * Limit the display of selected options. The rest will be hidden within the limitText string.\n * @default 99999\n * @type {Integer}\n */\n limit: {\n type: Number,\n default: 99999\n },\n /**\n * Sets maxHeight style value of the dropdown\n * @default 300\n * @type {Integer}\n */\n maxHeight: {\n type: Number,\n default: 300\n },\n /**\n * Function that process the message shown when selected\n * elements pass the defined limit.\n * @default 'and * more'\n * @param {Int} count Number of elements more than limit\n * @type {Function}\n */\n limitText: {\n type: Function,\n default: (count) => `and ${count} more`\n },\n /**\n * Set true to trigger the loading spinner.\n * @default False\n * @type {Boolean}\n */\n loading: {\n type: Boolean,\n default: false\n },\n /**\n * Disables the multiselect if true.\n * @default false\n * @type {Boolean}\n */\n disabled: {\n type: Boolean,\n default: false\n },\n /**\n * Fixed opening direction\n * @default ''\n * @type {String}\n */\n openDirection: {\n type: String,\n default: ''\n },\n /**\n * Shows slot with message about empty options\n * @default true\n * @type {Boolean}\n */\n showNoOptions: {\n type: Boolean,\n default: true\n },\n showNoResults: {\n type: Boolean,\n default: true\n },\n tabindex: {\n type: Number,\n default: 0\n }\n },\n computed: {\n hasOptionGroup () {\n return this.groupValues && this.groupLabel && this.groupSelect\n },\n isSingleLabelVisible () {\n return (\n (this.singleValue || this.singleValue === 0) &&\n (!this.isOpen || !this.searchable) &&\n !this.visibleValues.length\n )\n },\n isPlaceholderVisible () {\n return !this.internalValue.length && (!this.searchable || !this.isOpen)\n },\n visibleValues () {\n return this.multiple ? this.internalValue.slice(0, this.limit) : []\n },\n singleValue () {\n return this.internalValue[0]\n },\n deselectLabelText () {\n return this.showLabels ? this.deselectLabel : ''\n },\n deselectGroupLabelText () {\n return this.showLabels ? this.deselectGroupLabel : ''\n },\n selectLabelText () {\n return this.showLabels ? this.selectLabel : ''\n },\n selectGroupLabelText () {\n return this.showLabels ? this.selectGroupLabel : ''\n },\n selectedLabelText () {\n return this.showLabels ? this.selectedLabel : ''\n },\n inputStyle () {\n if (\n this.searchable ||\n (this.multiple && this.modelValue && this.modelValue.length)\n ) {\n // Hide input by setting the width to 0 allowing it to receive focus\n return this.isOpen\n ? {width: '100%'}\n : {width: '0', position: 'absolute', padding: '0'}\n }\n return ''\n },\n contentStyle () {\n return this.options.length\n ? {display: 'inline-block'}\n : {display: 'block'}\n },\n isAbove () {\n if (this.openDirection === 'above' || this.openDirection === 'top') {\n return true\n } else if (\n this.openDirection === 'below' ||\n this.openDirection === 'bottom'\n ) {\n return false\n } else {\n return this.preferredOpenDirection === 'above'\n }\n },\n showSearchInput () {\n return (\n this.searchable &&\n (this.hasSingleSelectedSlot &&\n (this.visibleSingleValue || this.visibleSingleValue === 0)\n ? this.isOpen\n : true)\n )\n }\n }\n}\n</script>\n\n<style>\n\n fieldset[disabled] .multiselect {\n pointer-events: none;\n }\n\n .multiselect__spinner {\n position: absolute;\n right: 1px;\n top: 1px;\n width: 40px;\n height: 38px;\n background: #fff;\n display: block;\n }\n\n .multiselect__spinner::before,\n .multiselect__spinner::after {\n position: absolute;\n content: \"\";\n top: 50%;\n left: 50%;\n margin: -8px 0 0 -8px;\n width: 16px;\n height: 16px;\n border-radius: 100%;\n border-color: #41b883 transparent transparent;\n border-style: solid;\n border-width: 2px;\n box-shadow: 0 0 0 1px transparent;\n }\n\n .multiselect__spinner::before {\n animation: spinning 2.4s cubic-bezier(0.41, 0.26, 0.2, 0.62);\n animation-iteration-count: infinite;\n }\n\n .multiselect__spinner::after {\n animation: spinning 2.4s cubic-bezier(0.51, 0.09, 0.21, 0.8);\n animation-iteration-count: infinite;\n }\n\n .multiselect__loading-enter-active,\n .multiselect__loading-leave-active {\n transition: opacity 0.4s ease-in-out;\n opacity: 1;\n }\n\n .multiselect__loading-enter,\n .multiselect__loading-leave-active {\n opacity: 0;\n }\n\n .multiselect,\n .multiselect__input,\n .multiselect__single {\n font-family: inherit;\n touch-action: manipulation;\n }\n\n .multiselect {\n display: block;\n position: relative;\n width: 100%;\n min-height: 40px;\n }\n\n .multiselect * {\n box-sizing: border-box;\n }\n\n .multiselect:focus {\n outline: none;\n }\n\n .multiselect--disabled {\n background: #ededed;\n pointer-events: none;\n opacity: 0.6;\n }\n\n .multiselect--active {\n z-index: 50;\n }\n\n .multiselect--active:not(.multiselect--above) .multiselect__current,\n .multiselect--active:not(.multiselect--above) .multiselect__input,\n .multiselect--active:not(.multiselect--above) .multiselect__tags {\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n }\n\n .multiselect--active .multiselect__select {\n transform: rotateZ(180deg);\n }\n\n .multiselect--above.multiselect--active .multiselect__current,\n .multiselect--above.multiselect--active .multiselect__input,\n .multiselect--above.multiselect--active .multiselect__tags {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n }\n\n .multiselect__input,\n .multiselect__single,\n .multiselect__placeholder {\n position: relative;\n display: inline-block;\n min-height: 20px;\n line-height: 20px;\n border: none;\n width: calc(100%);\n height: inherit;\n box-sizing: border-box;\n vertical-align: top;\n display: flex;\n align-items: center;\n }\n\n .multiselect__input::placeholder {\n color: #35495e;\n }\n\n .multiselect__tag ~ .multiselect__input,\n .multiselect__tag ~ .multiselect__single {\n width: auto;\n }\n\n .multiselect__input:hover,\n .multiselect__single:hover {\n border-color: #cfcfcf;\n }\n\n .multiselect__input:focus,\n .multiselect__single:focus {\n border-color: #a8a8a8;\n outline: none;\n }\n\n .multiselect__tags-wrap {\n display: inline;\n }\n\n .multiselect__tags {\n display: block;\n height: inherit;\n }\n\n .multiselect__tag {\n position: relative;\n display: inline-block;\n padding: 4px 26px 4px 10px;\n border-radius: 5px;\n margin-right: 10px;\n color: #fff;\n line-height: 1;\n background: #41b883;\n margin-bottom: 5px;\n white-space: nowrap;\n overflow: hidden;\n max-width: 100%;\n text-overflow: ellipsis;\n }\n\n .multiselect__tag-icon {\n cursor: pointer;\n margin-left: 7px;\n position: absolute;\n right: 0;\n top: 0;\n bottom: 0;\n font-weight: 700;\n font-style: initial;\n width: 22px;\n text-align: center;\n line-height: 22px;\n transition: all 0.2s ease;\n border-radius: 5px;\n }\n\n .multiselect__tag-icon::after {\n content: \"×\";\n color: #266d4d;\n font-size: 14px;\n }\n\n /* // Remove these lines to avoid green closing button\n //.multiselect__tag-icon:focus,\n //.multiselect__tag-icon:hover {\n // background: #369a6e;\n //} */\n\n .multiselect__tag-icon:focus::after,\n .multiselect__tag-icon:hover::after {\n color: white;\n }\n\n .multiselect__current {\n line-height: 16px;\n min-height: 40px;\n box-sizing: border-box;\n display: block;\n overflow: hidden;\n padding: 8px 12px 0;\n padding-right: 30px;\n white-space: nowrap;\n margin: 0;\n text-decoration: none;\n border-radius: 5px;\n border: 1px solid #e8e8e8;\n cursor: pointer;\n }\n\n .multiselect__select {\n line-height: 16px;\n display: flex;\n align-items: center;\n justify-content: center;\n position: center;\n position: absolute;\n box-sizing: border-box;\n width: 40px;\n height: 38px;\n right: 1px;\n top: calc( 50% - 19px);\n padding: 4px 8px;\n margin: 0;\n text-decoration: none;\n text-align: center;\n cursor: pointer;\n transition: transform 0.2s ease;\n }\n\n .multiselect__select::before {\n position: relative;\n color: #999;\n margin-top: 4px;\n border-style: solid;\n border-width: 5px 5px 0 5px;\n border-color: #999 transparent transparent transparent;\n content: \"\";\n }\n\n\n .multiselect--active .multiselect__placeholder {\n display: none;\n }\n\n .multiselect__content-wrapper {\n position: absolute;\n display: block;\n background: #fff;\n width: 100%;\n max-height: 240px;\n height: min-content;\n overflow: auto;\n left: 0;\n border-top: none;\n border-bottom-left-radius: 5px;\n border-bottom-right-radius: 5px;\n z-index: 50;\n -webkit-overflow-scrolling: touch;\n }\n\n .multiselect__content {\n list-style: none;\n display: inline-block;\n padding: 0;\n margin: 0;\n min-width: 100%;\n vertical-align: top;\n }\n\n .multiselect--above .multiselect__content-wrapper {\n bottom: 100%;\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n border-top-left-radius: 5px;\n border-top-right-radius: 5px;\n border-bottom: none;\n border-top: 1px solid #e8e8e8;\n }\n\n .multiselect__content::-webkit-scrollbar {\n display: none;\n }\n\n .multiselect__element {\n display: block;\n }\n\n .multiselect__option {\n display: block;\n padding: 12px;\n min-height: 40px;\n line-height: 16px;\n text-decoration: none;\n text-transform: none;\n vertical-align: middle;\n position: relative;\n cursor: pointer;\n white-space: nowrap;\n }\n\n .multiselect__option::after {\n top: 0;\n right: 0;\n position: absolute;\n line-height: 40px;\n padding-right: 12px;\n padding-left: 20px;\n font-size: 13px;\n }\n\n .multiselect__option--highlight {\n background: rgba(var(--main),0.1);\n outline: none;\n }\n\n .multiselect__option--highlight::after {\n content: attr(data-select);\n }\n\n .multiselect__option--selected {\n background: #f3f3f3;\n color: #35495e;\n font-weight: bold;\n }\n\n .multiselect__option--selected::after {\n content: attr(data-selected);\n color: silver;\n background: inherit;\n }\n\n .multiselect__option--selected.multiselect__option--highlight {\n background: rgba(var(--red),0.1);\n }\n\n .multiselect__option--selected.multiselect__option--highlight::after {\n content: attr(data-deselect);\n }\n\n .multiselect--disabled .multiselect__current,\n .multiselect--disabled .multiselect__select {\n background: #ededed;\n color: #a6a6a6;\n }\n\n .multiselect__option--disabled {\n background: #ededed !important;\n color: #a6a6a6 !important;\n cursor: text;\n pointer-events: none;\n }\n\n .multiselect__option--group {\n background: #ededed;\n color: #35495e;\n }\n\n .multiselect__option--group.multiselect__option--highlight {\n background: #35495e;\n color: #fff;\n }\n\n .multiselect__option--group.multiselect__option--highlight::after {\n background: #35495e;\n }\n\n .multiselect__option--disabled.multiselect__option--highlight {\n background: #dedede;\n }\n\n .multiselect__option--group-selected.multiselect__option--highlight {\n background: #ff6a6a;\n color: #fff;\n }\n\n .multiselect__option--group-selected.multiselect__option--highlight::after {\n background: #ff6a6a;\n content: attr(data-deselect);\n color: #fff;\n }\n\n .multiselect-enter-active,\n .multiselect-leave-active {\n transition: all 0.15s ease;\n }\n\n .multiselect-enter,\n .multiselect-leave-active {\n opacity: 0;\n }\n\n .multiselect__strong {\n margin-bottom: 8px;\n line-height: 20px;\n display: inline-block;\n vertical-align: top;\n }\n\n *[dir=\"rtl\"] .multiselect {\n text-align: right;\n }\n\n *[dir=\"rtl\"] .multiselect__select {\n right: auto;\n left: 1px;\n }\n\n *[dir=\"rtl\"] .multiselect__tags {\n padding: 8px 8px 0 40px;\n }\n\n *[dir=\"rtl\"] .multiselect__content {\n text-align: right;\n }\n\n *[dir=\"rtl\"] .multiselect__option::after {\n right: auto;\n left: 0;\n }\n\n *[dir=\"rtl\"] .multiselect__clear {\n right: auto;\n left: 12px;\n }\n\n *[dir=\"rtl\"] .multiselect__spinner {\n right: auto;\n left: 1px;\n }\n\n @keyframes spinning {\n from {\n transform: rotate(0);\n }\n\n to {\n transform: rotate(2turn);\n }\n }\n</style>\n"],"names":["multiselectMixin","pointerMixin","_createElementBlock","_normalizeClass","_withKeys","_withModifiers","_renderSlot","_createElementVNode","_withDirectives","_openBlock","_Fragment","_renderList","_toDisplayString","_vShow","_createCommentVNode","_createVNode","_Transition","_withCtx","_normalizeStyle","_createTextVNode"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Tooltip.vue.js","sources":["../../../../../src/components/Tooltip/Tooltip.vue"],"sourcesContent":["<template>\n <div class=\"cursor-pointer tooltip-container\" @mouseover=\"showTooltip\" @mouseleave=\"hideTooltip\">\n <slot></slot>\n <div class=\"tooltip-content\" :style=\"tooltipStyle\">\n {{ text }}\n </div>\n </div>\n</template>\n\n<script setup>\nimport { ref, reactive } from 'vue';\n\nconst props = defineProps({\n text: {\n type: String,\n required: true\n }\n});\n\nconst visible = ref(false);\n\nconst tooltipStyle = reactive({\n position: 'absolute',\n width: 'max-content',\n zIndex: 1000,\n background: '#333',\n color: '#fff',\n padding: '5px 10px',\n borderRadius: '3px',\n fontSize: '14px',\n display: 'none',\n});\n\nfunction showTooltip(event) {\n visible.value = true;\n tooltipStyle.left = `${(event.clientX / 100) + 10 }px`;\n tooltipStyle.top = `${(event.clientY / 100) + 10 }px`;\n tooltipStyle.display = 'block';\n}\n\nfunction hideTooltip() {\n visible.value = false;\n tooltipStyle.display = 'none';\n}\n</script>\n\n<style >\n.tooltip-container {\n position: relative;\n display: inline-block;\n}\n\n.tooltip-content {\n pointer-events: none;\n}\n</style>"],"names":[],"mappings":";;;;;;;;;;;AAmBA,UAAM,UAAU,IAAI,KAAK;AAEzB,UAAM,eAAe,SAAS;AAAA,MAC5B,UAAU;AAAA,MACV,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,OAAO;AAAA,MACP,SAAS;AAAA,MACT,cAAc;AAAA,MACd,UAAU;AAAA,MACV,SAAS;AAAA,IACX,CAAC;AAED,aAAS,YAAY,OAAO;AAC1B,cAAQ,QAAQ;AAChB,mBAAa,OAAO,GAAI,MAAM,UAAU,MAAO,EAAE;AACjD,mBAAa,MAAM,GAAI,MAAM,UAAU,MAAO,EAAE;AAChD,mBAAa,UAAU;AAAA,IACzB;AAEA,aAAS,cAAc;AACrB,cAAQ,QAAQ;AAChB,mBAAa,UAAU;AAAA,IACzB;;;;;;;;;;;;;;;;"}
@@ -1,256 +0,0 @@
1
- import { watch, toRefs } from "vue";
2
- import routerNotifications from './router/notifications.router.js';
3
- import * as storeNotifications from './store/notifications.store.js';
4
- import * as auth from '@martyrs/src/modules/auth/views/store/auth';
5
- import globalWebSocket from '@martyrs/src/modules/globals/views/classes/globals.websocket.js';
6
- import NotificationsLayout from './components/layouts/NotificationsLayout.vue';
7
- import NotificationsList from './components/sections/NotificationsList.vue';
8
- import NotificationPreferences from './components/sections/NotificationPreferences.vue';
9
- import Notifications from './components/pages/Notifications.vue';
10
- import NotificationBadge from './components/elements/NotificationBadge.vue';
11
- import NotificationItem from './components/blocks/NotificationItem.vue';
12
-
13
- // WebSocket notification handlers
14
- const wsNotificationHandlers = {
15
- connect: (store, userId, options = {}) => {
16
- if (typeof window === 'undefined' || !userId) return Promise.resolve(false);
17
-
18
- return globalWebSocket.connect(userId).then(() => {
19
- const moduleName = 'notifications';
20
- const listeners = [];
21
-
22
- const addListener = (event, handler) => {
23
- listeners.push(globalWebSocket.addEventListener(event, handler, { module: moduleName }));
24
- };
25
-
26
- addListener('notification', (data) => {
27
- if (!data || !data.data) return;
28
- const notification = data.data;
29
-
30
- store.notifications.actions.addLocalNotification({
31
- _id: notification._id,
32
- title: notification.title,
33
- body: notification.body,
34
- type: notification.type || 'info',
35
- metadata: notification.metadata || {},
36
- status: 'unread',
37
- createdAt: notification.createdAt || new Date().toISOString(),
38
- updatedAt: notification.updatedAt || new Date().toISOString()
39
- });
40
- });
41
-
42
- addListener('notification_read', (data) => {
43
- store.notifications.actions.syncNotificationStatus(data.notificationId, 'read');
44
- });
45
-
46
- return { listeners, moduleName };
47
- });
48
- },
49
-
50
- disconnect: (moduleName, listeners) => {
51
- if (listeners) {
52
- globalWebSocket.removeModuleListeners(moduleName);
53
- }
54
- }
55
- };
56
-
57
- // Capacitor Push Notification handlers
58
- const pushNotificationHandlers = {
59
- initialize: async () => {
60
- if (typeof window === 'undefined') return false;
61
-
62
- try {
63
- const { Capacitor } = await import('@capacitor/core');
64
- const { PushNotifications } = await import('@capacitor/push-notifications');
65
- const { Device } = await import('@capacitor/device');
66
-
67
- if (!Capacitor.isNativePlatform()) return false;
68
-
69
- return { pushNotifications: PushNotifications, device: Device };
70
- } catch (error) {
71
- console.error('Error importing Capacitor plugins:', error);
72
- return false;
73
- }
74
- },
75
-
76
- requestPermissions: async (store) => {
77
- if (typeof window === 'undefined') return false;
78
-
79
- const plugins = await pushNotificationHandlers.initialize();
80
- if (!plugins) return false;
81
-
82
- const { pushNotifications, device } = plugins;
83
-
84
- const permissionResult = await pushNotifications.requestPermissions();
85
- if (permissionResult.receive !== 'granted') {
86
- console.log('Push notification permission denied');
87
- return false;
88
- }
89
-
90
- const setupListeners = () => {
91
- pushNotifications.addListener('registration', async (token) => {
92
- try {
93
- const deviceInfo = await device.getInfo();
94
- const deviceId = await device.getId();
95
-
96
- const deviceData = {
97
- deviceId: deviceId.uuid,
98
- deviceType: deviceInfo.platform.toLowerCase(),
99
- deviceToken: token.value
100
- };
101
-
102
- await store.notifications.actions.registerDevice(deviceData);
103
- } catch (error) {
104
- console.error('Error handling push registration:', error);
105
- }
106
- });
107
-
108
- pushNotifications.addListener('pushNotificationReceived', (notification) => {
109
- store.notifications.actions.addLocalNotification({
110
- title: notification.title,
111
- body: notification.body,
112
- data: notification.data || {}
113
- });
114
- });
115
-
116
- pushNotifications.addListener('pushNotificationActionPerformed', (actionData) => {
117
- if (actionData.notification && actionData.notification.data) {
118
- store.notifications.actions.handleNotificationAction(actionData.notification.data);
119
- }
120
- });
121
- };
122
-
123
- setupListeners();
124
- await pushNotifications.register();
125
- return true;
126
- },
127
-
128
- removeListeners: (pushNotifications) => {
129
- if (typeof window === 'undefined' || !pushNotifications) return;
130
- pushNotifications.removeAllListeners();
131
- }
132
- };
133
-
134
- // Notification utilities
135
- const notificationUtils = {
136
- initialize: async (store, options = {}) => {
137
- if (typeof window === 'undefined') return;
138
-
139
- const userId = store.auth.state.user?._id;
140
- if (!userId) {
141
- console.warn('Cannot initialize notifications: No user ID found in auth store');
142
- return;
143
- }
144
-
145
- let wsListeners = null;
146
- if (options.enablePush !== false) {
147
- await pushNotificationHandlers.requestPermissions(store);
148
- }
149
-
150
- wsListeners = await wsNotificationHandlers.connect(store, userId, options);
151
-
152
- await store.notifications.actions.getNotifications(userId);
153
-
154
- return {
155
- disconnect: () => {
156
- wsNotificationHandlers.disconnect(wsListeners?.moduleName, wsListeners?.listeners);
157
- pushNotificationHandlers.removeListeners(globalThis.pushNotifications);
158
- }
159
- };
160
- },
161
-
162
- prefetchForSSR: async (store, context) => {
163
- try {
164
- const userId = store.auth.state.user?._id;
165
- if (userId) {
166
- await store.notifications.actions.getNotifications(userId);
167
- }
168
- } catch (error) {
169
- console.error('Error pre-fetching notifications for SSR:', error);
170
- }
171
- }
172
- };
173
-
174
- // Main initialization function
175
- const initializeNotifications = (app, store, router, options = {}) => {
176
- const route = options.route || 'User Profile Root';
177
- router.addRoute(route, routerNotifications);
178
- store.addStore('notifications', storeNotifications);
179
-
180
- if (options.wsUrl) {
181
- globalWebSocket.initialize({ wsUrl: options.wsUrl });
182
- }
183
-
184
- const isServer = typeof window === 'undefined';
185
- const autoInit = !isServer && options.autoInit !== false;
186
-
187
- let notificationManager = null;
188
-
189
- if (autoInit) {
190
- const initNotifications = async () => {
191
- if (store.auth.state.isAuthenticated && store.auth.state.user?._id) {
192
- notificationManager = await notificationUtils.initialize(store, {
193
- enablePush: options.enablePush !== false,
194
- maxReconnectAttempts: options.maxReconnectAttempts || 5,
195
- reconnectDelay: options.reconnectDelay || 3000,
196
- pingInterval: options.pingInterval || 30000
197
- });
198
- }
199
- };
200
-
201
- watch(() => store.auth.state.isAuthenticated, (isAuthenticated) => {
202
- if (isAuthenticated) {
203
- initNotifications();
204
- } else if (notificationManager) {
205
- notificationManager.disconnect();
206
- store.notifications.mutations.resetNotifications();
207
- notificationManager = null;
208
- }
209
- });
210
-
211
- if (store.auth.state.isAuthenticated) {
212
- initNotifications();
213
- }
214
- }
215
-
216
- app.provide('useNotifications', () => ({
217
- ...toRefs(store.notifications.state),
218
- ...store.notifications.actions,
219
- ...store.notifications.mutations,
220
- init: () => notificationUtils.initialize(store, options),
221
- disconnect: () => notificationManager?.disconnect(),
222
- isServer
223
- }));
224
-
225
- return {
226
- SSR: { prefetchNotifications: notificationUtils.prefetchForSSR }
227
- };
228
- };
229
-
230
- const ModuleNotifications = {
231
- initialize: initializeNotifications,
232
- views: {
233
- store: { storeNotifications },
234
- router: { routerNotifications },
235
- components: {
236
- NotificationBadge,
237
- NotificationItem,
238
- NotificationsList,
239
- NotificationPreferences,
240
- Notifications,
241
- NotificationsLayout
242
- }
243
- }
244
- };
245
-
246
- export {
247
- NotificationBadge,
248
- NotificationItem,
249
- NotificationsList,
250
- NotificationPreferences,
251
- Notifications,
252
- NotificationsLayout,
253
- notificationUtils as SSRUtils
254
- };
255
-
256
- export default ModuleNotifications;
@@ -1,100 +0,0 @@
1
- // services/websocket.service.js
2
- const WebSocketService = (wss) => {
3
- const connections = new Map();
4
-
5
- // Добавление соединения
6
- const addConnection = (userId, ws) => {
7
- if (!connections.has(userId)) {
8
- connections.set(userId, new Set());
9
- }
10
- connections.get(userId).add(ws);
11
-
12
- // Отслеживаем закрытие соединения
13
- ws.on('close', () => {
14
- removeConnection(userId, ws);
15
- });
16
- };
17
-
18
- // Удаление соединения
19
- const removeConnection = (userId, ws) => {
20
- if (connections.has(userId)) {
21
- connections.get(userId).delete(ws);
22
- if (connections.get(userId).size === 0) {
23
- connections.delete(userId);
24
- }
25
- }
26
- };
27
-
28
- // Отправка сообщения конкретному пользователю
29
- const sendToUser = (userId, data) => {
30
- return new Promise((resolve) => {
31
- try {
32
- if (!connections.has(userId)) {
33
- // Пользователь не подключен
34
- return resolve({ delivered: false, reason: 'user-not-connected' });
35
- }
36
-
37
- const userSockets = connections.get(userId);
38
- let delivered = 0;
39
-
40
- userSockets.forEach((ws) => {
41
- if (ws.readyState === 1) { // 1 = OPEN
42
- ws.send(JSON.stringify({
43
- type: 'notification',
44
- data
45
- }));
46
- delivered++;
47
- }
48
- });
49
-
50
- console.log(userSockets)
51
-
52
- resolve({ delivered: delivered > 0, connections: delivered });
53
- } catch (error) {
54
- console.error('Ошибка отправки уведомления:', error);
55
- resolve({ delivered: false, reason: 'error', error: error.message });
56
- }
57
- });
58
- };
59
-
60
- // Рассылка всем подключенным клиентам
61
- const broadcast = (data) => {
62
- return new Promise((resolve) => {
63
- let count = 0;
64
-
65
- wss.clients.forEach((ws) => {
66
- if (ws.readyState === 1) { // 1 = OPEN
67
- try {
68
- ws.send(JSON.stringify({
69
- type: 'notification',
70
- data
71
- }));
72
- count++;
73
- } catch (e) {
74
- console.error('Ошибка рассылки клиенту:', e);
75
- }
76
- }
77
- });
78
-
79
- resolve({ delivered: count > 0, connections: count });
80
- });
81
- };
82
-
83
- // Настраиваем обработчик подключений для нашего сервиса
84
- wss.on('connection', (ws, req) => {
85
- // Если у соединения есть userId (аутентифицированный пользователь)
86
- if (req.userId) {
87
- // Просто добавляем соединение в наш трекер
88
- addConnection(req.userId, ws);
89
- }
90
- });
91
-
92
- return {
93
- addConnection,
94
- removeConnection,
95
- sendToUser,
96
- broadcast
97
- };
98
- };
99
-
100
- module.exports = WebSocketService;