@ozdao/martyrs 0.2.428 → 0.2.430

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 (165) hide show
  1. package/dist/community.server.js +1 -1
  2. package/dist/community.server.mjs +1 -1
  3. package/dist/events.server.js +1 -1
  4. package/dist/events.server.mjs +1 -1
  5. package/dist/gallery.server.js +1 -1
  6. package/dist/gallery.server.mjs +1 -1
  7. package/dist/{globals.logger-Deb_8o7C.mjs → globals.cache-BT6q3vOf.mjs} +0 -33
  8. package/dist/{globals.logger-BuG0pN80.js → globals.cache-CwWvNGFQ.js} +0 -33
  9. package/dist/globals.logger-BdjooLaD.js +34 -0
  10. package/dist/globals.logger-DusiFsxN.mjs +35 -0
  11. package/dist/martyrs/src/modules/chats/components/pages/ChatPage.vue.cjs +13 -3
  12. package/dist/martyrs/src/modules/chats/components/pages/ChatPage.vue.cjs.map +1 -1
  13. package/dist/martyrs/src/modules/chats/components/pages/ChatPage.vue.js +14 -4
  14. package/dist/martyrs/src/modules/chats/components/pages/ChatPage.vue.js.map +1 -1
  15. package/dist/martyrs/src/modules/chats/components/sections/ChatWindow.vue.cjs +24 -6
  16. package/dist/martyrs/src/modules/chats/components/sections/ChatWindow.vue.cjs.map +1 -1
  17. package/dist/martyrs/src/modules/chats/components/sections/ChatWindow.vue.js +25 -7
  18. package/dist/martyrs/src/modules/chats/components/sections/ChatWindow.vue.js.map +1 -1
  19. package/dist/martyrs/src/modules/chats/store/chat.store.cjs +7 -8
  20. package/dist/martyrs/src/modules/chats/store/chat.store.cjs.map +1 -1
  21. package/dist/martyrs/src/modules/chats/store/chat.store.js +7 -8
  22. package/dist/martyrs/src/modules/chats/store/chat.store.js.map +1 -1
  23. package/dist/martyrs/src/modules/globals/views/classes/globals.websocket.cjs +6 -8
  24. package/dist/martyrs/src/modules/globals/views/classes/globals.websocket.cjs.map +1 -1
  25. package/dist/martyrs/src/modules/globals/views/classes/globals.websocket.js +6 -8
  26. package/dist/martyrs/src/modules/globals/views/classes/globals.websocket.js.map +1 -1
  27. package/dist/martyrs/src/modules/globals/views/components/layouts/Client.vue.cjs +11 -8
  28. package/dist/martyrs/src/modules/globals/views/components/layouts/Client.vue.cjs.map +1 -1
  29. package/dist/martyrs/src/modules/globals/views/components/layouts/Client.vue.js +11 -8
  30. package/dist/martyrs/src/modules/globals/views/components/layouts/Client.vue.js.map +1 -1
  31. package/dist/martyrs/src/modules/globals/views/components/partials/Header.vue.cjs +5 -5
  32. package/dist/martyrs/src/modules/globals/views/components/partials/Header.vue.cjs.map +1 -1
  33. package/dist/martyrs/src/modules/globals/views/components/partials/Header.vue.js +5 -5
  34. package/dist/martyrs/src/modules/globals/views/components/partials/Header.vue.js.map +1 -1
  35. package/dist/martyrs/src/modules/globals/views/components/partials/Navigation.vue.cjs +17 -9
  36. package/dist/martyrs/src/modules/globals/views/components/partials/Navigation.vue.cjs.map +1 -1
  37. package/dist/martyrs/src/modules/globals/views/components/partials/Navigation.vue.js +17 -9
  38. package/dist/martyrs/src/modules/globals/views/components/partials/Navigation.vue.js.map +1 -1
  39. package/dist/martyrs/src/modules/globals/views/components/partials/Sidebar.vue.cjs +16 -4
  40. package/dist/martyrs/src/modules/globals/views/components/partials/Sidebar.vue.cjs.map +1 -1
  41. package/dist/martyrs/src/modules/globals/views/components/partials/Sidebar.vue.js +16 -4
  42. package/dist/martyrs/src/modules/globals/views/components/partials/Sidebar.vue.js.map +1 -1
  43. package/dist/martyrs/src/modules/marketplace/views/components/sections/SectionMenu.vue.cjs +1 -1
  44. package/dist/martyrs/src/modules/marketplace/views/components/sections/SectionMenu.vue.cjs.map +1 -1
  45. package/dist/martyrs/src/modules/marketplace/views/components/sections/SectionMenu.vue.js +1 -1
  46. package/dist/martyrs/src/modules/marketplace/views/components/sections/SectionMenu.vue.js.map +1 -1
  47. package/dist/martyrs/src/modules/notifications/components/elements/NotificationBadge.vue.cjs +7 -1
  48. package/dist/martyrs/src/modules/notifications/components/elements/NotificationBadge.vue.cjs.map +1 -1
  49. package/dist/martyrs/src/modules/notifications/components/elements/NotificationBadge.vue.js +7 -1
  50. package/dist/martyrs/src/modules/notifications/components/elements/NotificationBadge.vue.js.map +1 -1
  51. package/dist/martyrs/src/modules/orders/components/blocks/CardOrderBackoffice.vue.cjs +112 -0
  52. package/dist/martyrs/src/modules/orders/components/blocks/CardOrderBackoffice.vue.cjs.map +1 -0
  53. package/dist/martyrs/src/modules/orders/components/blocks/CardOrderBackoffice.vue.js +112 -0
  54. package/dist/martyrs/src/modules/orders/components/blocks/CardOrderBackoffice.vue.js.map +1 -0
  55. package/dist/martyrs/src/modules/orders/components/blocks/CardOrderItem.vue.cjs +2 -2
  56. package/dist/martyrs/src/modules/orders/components/blocks/CardOrderItem.vue.cjs.map +1 -1
  57. package/dist/martyrs/src/modules/orders/components/blocks/CardOrderItem.vue.js +2 -2
  58. package/dist/martyrs/src/modules/orders/components/blocks/CardOrderItem.vue.js.map +1 -1
  59. package/dist/martyrs/src/modules/orders/components/blocks/CardOrderUser.vue.cjs +18 -12
  60. package/dist/martyrs/src/modules/orders/components/blocks/CardOrderUser.vue.cjs.map +1 -1
  61. package/dist/martyrs/src/modules/orders/components/blocks/CardOrderUser.vue.js +18 -12
  62. package/dist/martyrs/src/modules/orders/components/blocks/CardOrderUser.vue.js.map +1 -1
  63. package/dist/martyrs/src/modules/orders/components/pages/OrderBackoffice.vue.cjs +200 -92
  64. package/dist/martyrs/src/modules/orders/components/pages/OrderBackoffice.vue.cjs.map +1 -1
  65. package/dist/martyrs/src/modules/orders/components/pages/OrderBackoffice.vue.js +213 -105
  66. package/dist/martyrs/src/modules/orders/components/pages/OrderBackoffice.vue.js.map +1 -1
  67. package/dist/martyrs/src/modules/orders/components/pages/OrderCreate.vue.cjs +9 -12
  68. package/dist/martyrs/src/modules/orders/components/pages/OrderCreate.vue.cjs.map +1 -1
  69. package/dist/martyrs/src/modules/orders/components/pages/OrderCreate.vue.js +10 -13
  70. package/dist/martyrs/src/modules/orders/components/pages/OrderCreate.vue.js.map +1 -1
  71. package/dist/martyrs/src/modules/orders/components/pages/OrderCreateBackoffice.vue.cjs +14 -6
  72. package/dist/martyrs/src/modules/orders/components/pages/OrderCreateBackoffice.vue.cjs.map +1 -1
  73. package/dist/martyrs/src/modules/orders/components/pages/OrderCreateBackoffice.vue.js +23 -15
  74. package/dist/martyrs/src/modules/orders/components/pages/OrderCreateBackoffice.vue.js.map +1 -1
  75. package/dist/martyrs/src/modules/orders/components/pages/Orders.vue.cjs +16 -99
  76. package/dist/martyrs/src/modules/orders/components/pages/Orders.vue.cjs.map +1 -1
  77. package/dist/martyrs/src/modules/orders/components/pages/Orders.vue.js +16 -99
  78. package/dist/martyrs/src/modules/orders/components/pages/Orders.vue.js.map +1 -1
  79. package/dist/martyrs/src/modules/orders/components/partials/ShopCart.vue.cjs +2 -2
  80. package/dist/martyrs/src/modules/orders/components/partials/ShopCart.vue.cjs.map +1 -1
  81. package/dist/martyrs/src/modules/orders/components/partials/ShopCart.vue.js +2 -2
  82. package/dist/martyrs/src/modules/orders/components/partials/ShopCart.vue.js.map +1 -1
  83. package/dist/martyrs/src/modules/orders/components/sections/FormDelivery.vue.cjs +99 -99
  84. package/dist/martyrs/src/modules/orders/components/sections/FormDelivery.vue.cjs.map +1 -1
  85. package/dist/martyrs/src/modules/orders/components/sections/FormDelivery.vue.js +102 -102
  86. package/dist/martyrs/src/modules/orders/components/sections/FormDelivery.vue.js.map +1 -1
  87. package/dist/martyrs/src/modules/orders/components/sections/FormPayment.vue.cjs +14 -8
  88. package/dist/martyrs/src/modules/orders/components/sections/FormPayment.vue.cjs.map +1 -1
  89. package/dist/martyrs/src/modules/orders/components/sections/FormPayment.vue.js +15 -9
  90. package/dist/martyrs/src/modules/orders/components/sections/FormPayment.vue.js.map +1 -1
  91. package/dist/martyrs/src/modules/orders/store/orders.cjs +51 -0
  92. package/dist/martyrs/src/modules/orders/store/orders.cjs.map +1 -1
  93. package/dist/martyrs/src/modules/orders/store/orders.js +51 -0
  94. package/dist/martyrs/src/modules/orders/store/orders.js.map +1 -1
  95. package/dist/martyrs/src/modules/organizations/components/pages/Organization.vue.cjs +59 -56
  96. package/dist/martyrs/src/modules/organizations/components/pages/Organization.vue.cjs.map +1 -1
  97. package/dist/martyrs/src/modules/organizations/components/pages/Organization.vue.js +63 -60
  98. package/dist/martyrs/src/modules/organizations/components/pages/Organization.vue.js.map +1 -1
  99. package/dist/martyrs/src/modules/organizations/store/organizations.cjs +0 -2
  100. package/dist/martyrs/src/modules/organizations/store/organizations.cjs.map +1 -1
  101. package/dist/martyrs/src/modules/organizations/store/organizations.js +1 -3
  102. package/dist/martyrs/src/modules/organizations/store/organizations.js.map +1 -1
  103. package/dist/martyrs/src/modules/products/components/pages/Products.vue.cjs +4 -3
  104. package/dist/martyrs/src/modules/products/components/pages/Products.vue.cjs.map +1 -1
  105. package/dist/martyrs/src/modules/products/components/pages/Products.vue.js +5 -4
  106. package/dist/martyrs/src/modules/products/components/pages/Products.vue.js.map +1 -1
  107. package/dist/martyrs/src/modules/spots/components/blocks/CardSpot.vue.cjs +15 -12
  108. package/dist/martyrs/src/modules/spots/components/blocks/CardSpot.vue.cjs.map +1 -1
  109. package/dist/martyrs/src/modules/spots/components/blocks/CardSpot.vue.js +15 -12
  110. package/dist/martyrs/src/modules/spots/components/blocks/CardSpot.vue.js.map +1 -1
  111. package/dist/martyrs/src/modules/spots/store/spots.cjs +2 -2
  112. package/dist/martyrs/src/modules/spots/store/spots.cjs.map +1 -1
  113. package/dist/martyrs/src/modules/spots/store/spots.js +2 -2
  114. package/dist/martyrs/src/modules/spots/store/spots.js.map +1 -1
  115. package/dist/martyrs.css +1 -1
  116. package/dist/orders.server.js +11 -4
  117. package/dist/orders.server.mjs +10 -3
  118. package/dist/organizations.server.js +33 -30
  119. package/dist/organizations.server.mjs +33 -30
  120. package/dist/products.server.js +1 -1
  121. package/dist/products.server.mjs +1 -1
  122. package/dist/{queryProcessor-CCmHM0yi.mjs → queryProcessor-CWnMIe2U.mjs} +4 -1
  123. package/dist/{queryProcessor-CwQakZkT.js → queryProcessor-D6GuKfTV.js} +4 -1
  124. package/dist/rents.server.js +4 -3
  125. package/dist/rents.server.mjs +3 -2
  126. package/dist/spots.server.js +41 -12
  127. package/dist/spots.server.mjs +41 -12
  128. package/dist/style.css +57 -65
  129. package/dist/wallet.server.js +1 -1
  130. package/dist/wallet.server.mjs +1 -1
  131. package/package.json +1 -1
  132. package/src/modules/chats/components/pages/ChatPage.vue +18 -23
  133. package/src/modules/chats/components/sections/ChatWindow.vue +55 -38
  134. package/src/modules/chats/store/chat.store.js +20 -21
  135. package/src/modules/globals/controllers/utils/queryProcessor.js +2 -1
  136. package/src/modules/globals/views/classes/globals.websocket.js +10 -11
  137. package/src/modules/globals/views/components/layouts/Client.vue +21 -15
  138. package/src/modules/globals/views/components/partials/Header.vue +3 -4
  139. package/src/modules/globals/views/components/partials/Navigation.vue +17 -19
  140. package/src/modules/globals/views/components/partials/Sidebar.vue +20 -9
  141. package/src/modules/marketplace/views/components/sections/SectionMenu.vue +1 -1
  142. package/src/modules/notifications/components/elements/NotificationBadge.vue +7 -0
  143. package/src/modules/orders/components/blocks/CardOrderBackoffice.vue +106 -0
  144. package/src/modules/orders/components/blocks/CardOrderItem.vue +2 -2
  145. package/src/modules/orders/components/blocks/CardOrderUser.vue +16 -9
  146. package/src/modules/orders/components/pages/OrderBackoffice.vue +146 -77
  147. package/src/modules/orders/components/pages/OrderCreate.vue +7 -12
  148. package/src/modules/orders/components/pages/OrderCreateBackoffice.vue +15 -3
  149. package/src/modules/orders/components/pages/Orders.vue +10 -93
  150. package/src/modules/orders/components/partials/ShopCart.vue +2 -2
  151. package/src/modules/orders/components/sections/FormDelivery.vue +35 -43
  152. package/src/modules/orders/components/sections/FormPayment.vue +17 -7
  153. package/src/modules/orders/controllers/orders.controller.js +12 -1
  154. package/src/modules/orders/store/orders.js +65 -0
  155. package/src/modules/organizations/components/pages/Organization.vue +48 -47
  156. package/src/modules/organizations/controllers/organizations.controller.js +57 -47
  157. package/src/modules/organizations/store/organizations.js +6 -6
  158. package/src/modules/products/components/pages/Products.vue +4 -3
  159. package/src/modules/spots/components/blocks/CardSpot.vue +8 -7
  160. package/src/modules/spots/controllers/spots.controller.js +47 -14
  161. package/src/modules/spots/routes/spots.routes.js +2 -3
  162. package/src/modules/spots/store/spots.js +4 -4
  163. package/src/styles/base/shadow_transitions_hover_refactor.scss +1 -0
  164. package/src/modules/landing/components/sections/HowToBuyWDR.vue +0 -130
  165. package/src/modules/landing/components/sections/WhatIsWDRSection.vue +0 -116
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  const _commonjsHelpers = require("./_commonjsHelpers-DHfMLFPC.js");
3
3
  const require$$0 = require("mongoose");
4
- const queryProcessor$2 = require("./queryProcessor-CwQakZkT.js");
4
+ const queryProcessor$2 = require("./queryProcessor-D6GuKfTV.js");
5
5
  require("util");
6
6
  const require$$0$1 = require("uuid");
7
7
  const index = require("./index-DQqZReAr.js");
@@ -1,6 +1,6 @@
1
1
  import { g as getDefaultExportFromCjs } from "./_commonjsHelpers-CUmg6egw.mjs";
2
2
  import require$$0 from "mongoose";
3
- import { r as requireQueryProcessor$2 } from "./queryProcessor-CCmHM0yi.mjs";
3
+ import { r as requireQueryProcessor$2 } from "./queryProcessor-CWnMIe2U.mjs";
4
4
  import "util";
5
5
  import require$$0$1 from "uuid";
6
6
  import { r as requireMiddlewares } from "./index-DICZTQ-1.mjs";
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  const _commonjsHelpers = require("./_commonjsHelpers-DHfMLFPC.js");
3
3
  const require$$0 = require("mongoose");
4
- const queryProcessor$1 = require("./queryProcessor-CwQakZkT.js");
4
+ const queryProcessor$1 = require("./queryProcessor-D6GuKfTV.js");
5
5
  const metadata_schema = require("./metadata.schema-CUkLXZ2f.js");
6
6
  const require$$0$1 = require("stripe");
7
7
  const tickets_controller = require("./tickets.controller-CcxkRHlX.js");
@@ -1,6 +1,6 @@
1
1
  import { g as getDefaultExportFromCjs } from "./_commonjsHelpers-CUmg6egw.mjs";
2
2
  import require$$0 from "mongoose";
3
- import { r as requireQueryProcessor$1 } from "./queryProcessor-CCmHM0yi.mjs";
3
+ import { r as requireQueryProcessor$1 } from "./queryProcessor-CWnMIe2U.mjs";
4
4
  import { a as requireSeoFriendlyUrl, r as requireMetadata_schema } from "./metadata.schema--tle-GU8.mjs";
5
5
  import require$$0$1 from "stripe";
6
6
  import { r as requireTickets_controller } from "./tickets.controller-Bbxe7kaF.mjs";
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  const _commonjsHelpers = require("./_commonjsHelpers-DHfMLFPC.js");
3
3
  const require$$0 = require("path");
4
- const queryProcessor = require("./queryProcessor-CwQakZkT.js");
4
+ const queryProcessor = require("./queryProcessor-D6GuKfTV.js");
5
5
  const index = require("./index-DQqZReAr.js");
6
6
  const common_schema = require("./common.schema-O0w_rDyC.js");
7
7
  const engagement_schema = require("./engagement.schema-DAiXsvh1.js");
@@ -1,6 +1,6 @@
1
1
  import { g as getDefaultExportFromCjs } from "./_commonjsHelpers-CUmg6egw.mjs";
2
2
  import require$$0 from "path";
3
- import { r as requireQueryProcessor } from "./queryProcessor-CCmHM0yi.mjs";
3
+ import { r as requireQueryProcessor } from "./queryProcessor-CWnMIe2U.mjs";
4
4
  import { r as requireMiddlewares } from "./index-DICZTQ-1.mjs";
5
5
  import { r as requireCommon_schema } from "./common.schema-C2m3O1XY.mjs";
6
6
  import { r as requireEngagement_schema } from "./engagement.schema-DnDD7Bn3.mjs";
@@ -135,39 +135,6 @@ function requireGlobals_cache() {
135
135
  globals_cache = Cache;
136
136
  return globals_cache;
137
137
  }
138
- var globals_logger;
139
- var hasRequiredGlobals_logger;
140
- function requireGlobals_logger() {
141
- if (hasRequiredGlobals_logger) return globals_logger;
142
- hasRequiredGlobals_logger = 1;
143
- class Logger {
144
- constructor(db) {
145
- this.LogModel = db.log;
146
- }
147
- async log(level, message) {
148
- const logEntry = new this.LogModel({
149
- level,
150
- message
151
- });
152
- try {
153
- await logEntry.save();
154
- console.info(`Logged: ${level} - ${message}`);
155
- } catch (err) {
156
- console.error("Logging error:", err);
157
- }
158
- }
159
- // Удобные методы для различных уровней логирования
160
- async info(message) {
161
- await this.log("info", message);
162
- }
163
- async error(message) {
164
- await this.log("error", message);
165
- }
166
- }
167
- globals_logger = Logger;
168
- return globals_logger;
169
- }
170
138
  export {
171
- requireGlobals_logger as a,
172
139
  requireGlobals_cache as r
173
140
  };
@@ -136,37 +136,4 @@ function requireGlobals_cache() {
136
136
  globals_cache = Cache;
137
137
  return globals_cache;
138
138
  }
139
- var globals_logger;
140
- var hasRequiredGlobals_logger;
141
- function requireGlobals_logger() {
142
- if (hasRequiredGlobals_logger) return globals_logger;
143
- hasRequiredGlobals_logger = 1;
144
- class Logger {
145
- constructor(db) {
146
- this.LogModel = db.log;
147
- }
148
- async log(level, message) {
149
- const logEntry = new this.LogModel({
150
- level,
151
- message
152
- });
153
- try {
154
- await logEntry.save();
155
- console.info(`Logged: ${level} - ${message}`);
156
- } catch (err) {
157
- console.error("Logging error:", err);
158
- }
159
- }
160
- // Удобные методы для различных уровней логирования
161
- async info(message) {
162
- await this.log("info", message);
163
- }
164
- async error(message) {
165
- await this.log("error", message);
166
- }
167
- }
168
- globals_logger = Logger;
169
- return globals_logger;
170
- }
171
139
  exports.requireGlobals_cache = requireGlobals_cache;
172
- exports.requireGlobals_logger = requireGlobals_logger;
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ var globals_logger;
3
+ var hasRequiredGlobals_logger;
4
+ function requireGlobals_logger() {
5
+ if (hasRequiredGlobals_logger) return globals_logger;
6
+ hasRequiredGlobals_logger = 1;
7
+ class Logger {
8
+ constructor(db) {
9
+ this.LogModel = db.log;
10
+ }
11
+ async log(level, message) {
12
+ const logEntry = new this.LogModel({
13
+ level,
14
+ message
15
+ });
16
+ try {
17
+ await logEntry.save();
18
+ console.info(`Logged: ${level} - ${message}`);
19
+ } catch (err) {
20
+ console.error("Logging error:", err);
21
+ }
22
+ }
23
+ // Удобные методы для различных уровней логирования
24
+ async info(message) {
25
+ await this.log("info", message);
26
+ }
27
+ async error(message) {
28
+ await this.log("error", message);
29
+ }
30
+ }
31
+ globals_logger = Logger;
32
+ return globals_logger;
33
+ }
34
+ exports.requireGlobals_logger = requireGlobals_logger;
@@ -0,0 +1,35 @@
1
+ var globals_logger;
2
+ var hasRequiredGlobals_logger;
3
+ function requireGlobals_logger() {
4
+ if (hasRequiredGlobals_logger) return globals_logger;
5
+ hasRequiredGlobals_logger = 1;
6
+ class Logger {
7
+ constructor(db) {
8
+ this.LogModel = db.log;
9
+ }
10
+ async log(level, message) {
11
+ const logEntry = new this.LogModel({
12
+ level,
13
+ message
14
+ });
15
+ try {
16
+ await logEntry.save();
17
+ console.info(`Logged: ${level} - ${message}`);
18
+ } catch (err) {
19
+ console.error("Logging error:", err);
20
+ }
21
+ }
22
+ // Удобные методы для различных уровней логирования
23
+ async info(message) {
24
+ await this.log("info", message);
25
+ }
26
+ async error(message) {
27
+ await this.log("error", message);
28
+ }
29
+ }
30
+ globals_logger = Logger;
31
+ return globals_logger;
32
+ }
33
+ export {
34
+ requireGlobals_logger as r
35
+ };
@@ -4,6 +4,7 @@ const vue = require("vue");
4
4
  const ChatWindow = require("../sections/ChatWindow.vue.cjs");
5
5
  const chat_store = require("../../store/chat.store.cjs");
6
6
  ;/* empty css */
7
+ const _hoisted_1 = { class: "chat-main" };
7
8
  const _sfc_main = {
8
9
  __name: "ChatPage",
9
10
  props: {
@@ -11,6 +12,10 @@ const _sfc_main = {
11
12
  type: String,
12
13
  required: true
13
14
  },
15
+ user: {
16
+ type: String,
17
+ required: true
18
+ },
14
19
  chatID: {
15
20
  type: String,
16
21
  required: true
@@ -20,11 +25,16 @@ const _sfc_main = {
20
25
  const props = __props;
21
26
  vue.onMounted(async () => {
22
27
  chat_store.default.methods.setUsername(props.username || "user");
23
- await chat_store.default.methods.connectWebSocket();
24
- chat_store.default.methods.setCurrentChat(props.chatID);
28
+ await chat_store.default.methods.connectWebSocket(props.user);
29
+ await chat_store.default.methods.setCurrentChat(props.chatID);
30
+ });
31
+ vue.onUnmounted(() => {
32
+ chat_store.default.methods.disconnectChat();
25
33
  });
26
34
  return (_ctx, _cache) => {
27
- return vue.openBlock(), vue.createBlock(ChatWindow.default);
35
+ return vue.openBlock(), vue.createElementBlock("main", _hoisted_1, [
36
+ vue.createVNode(ChatWindow.default)
37
+ ]);
28
38
  };
29
39
  }
30
40
  };
@@ -1 +1 @@
1
- {"version":3,"file":"ChatPage.vue.cjs","sources":["../../../../../../../src/modules/chats/components/pages/ChatPage.vue"],"sourcesContent":["<template>\n <!-- <div class=\"chat-page h-max-20r\"> -->\n <!-- <aside class=\"chat-list\"> -->\n <!-- Примерный список чатов. Должен быть дополнен реальной логикой -->\n <!-- <div v-for=\"chat in chats\" :key=\"chat.id\" @click=\"selectChat(chat.id)\">\n Чат {{ chat.name }}\n </div> -->\n <!-- </aside> -->\n <!-- <main class=\"chat-main\"> -->\n <ChatWindow />\n <!-- </main> -->\n <!-- </div> -->\n</template>\n\n<script setup>\nimport { ref, onMounted } from 'vue';\nimport ChatWindow from '../sections/ChatWindow.vue';\nimport chatStore from '../../store/chat.store.js';\n\nconst props = defineProps({\n username: {\n type: String,\n required: true\n },\n chatID: {\n type: String,\n required: true\n },\n})\n\n// const chats = ref([\n// // Примерный список. В реальном приложении, список чатов должен загружаться с сервера.\n// { id: 'chat1', name: 'Чат 1' },\n// { id: 'chat2', name: 'Чат 2' }\n// ]);\n\nconst selectChat = (chatId) => {\n chatStore.methods.setCurrentChat(chatId);\n};\n\nonMounted(async() => {\n chatStore.methods.setUsername(props.username || 'user'); // Установка имени пользователя\n await chatStore.methods.connectWebSocket(); // Подключение к WebSocket\n chatStore.methods.setCurrentChat(props.chatID);\n});\n</script>\n\n<style>\n/* Стили остаются без изменений */\n</style>\n"],"names":["onMounted","chatStore"],"mappings":";;;;;;;;;;;;;;;;;;;AAmBA,UAAM,QAAQ;AAqBdA,QAAAA,UAAU,YAAW;AACnBC,iBAAS,QAAC,QAAQ,YAAY,MAAM,YAAY,MAAM;AACtD,YAAMA,WAAS,QAAC,QAAQ;AACxBA,iBAAAA,QAAU,QAAQ,eAAe,MAAM,MAAM;AAAA,IAC/C,CAAC;;;;;;;"}
1
+ {"version":3,"file":"ChatPage.vue.cjs","sources":["../../../../../../../src/modules/chats/components/pages/ChatPage.vue"],"sourcesContent":["<template>\n <main class=\"chat-main\">\n <ChatWindow />\n </main>\n</template>\n\n<script setup>\nimport { ref, onMounted, onUnmounted } from 'vue';\nimport ChatWindow from '../sections/ChatWindow.vue';\nimport chatStore from '../../store/chat.store.js';\n\nconst props = defineProps({\n username: {\n type: String,\n required: true\n },\n user: {\n type: String,\n required: true\n },\n chatID: {\n type: String,\n required: true\n },\n});\n\nconst selectChat = (chatId) => {\n chatStore.methods.setCurrentChat(chatId);\n};\n\nonMounted(async () => {\n chatStore.methods.setUsername(props.username || 'user'); // Установка имени пользователя\n await chatStore.methods.connectWebSocket(props.user); // Подключение к WebSocket\n await chatStore.methods.setCurrentChat(props.chatID);\n});\n\nonUnmounted(() => {\n // Clean up when the component is unmounted (e.g., navigating away)\n chatStore.methods.disconnectChat();\n});\n</script>\n\n<style>\n/* Стили остаются без изменений */\n</style>"],"names":["onMounted","chatStore","onUnmounted"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAWA,UAAM,QAAQ;AAmBdA,QAAAA,UAAU,YAAY;AACpBC,iBAAS,QAAC,QAAQ,YAAY,MAAM,YAAY,MAAM;AACtD,YAAMA,WAAS,QAAC,QAAQ,iBAAiB,MAAM,IAAI;AACnD,YAAMA,WAAS,QAAC,QAAQ,eAAe,MAAM,MAAM;AAAA,IACrD,CAAC;AAEDC,QAAAA,YAAY,MAAM;AAEhBD,iBAAS,QAAC,QAAQ,eAAgB;AAAA,IACpC,CAAC;;;;;;;;;"}
@@ -1,7 +1,8 @@
1
- import { onMounted, createBlock, openBlock } from "vue";
1
+ import { onMounted, onUnmounted, createElementBlock, openBlock, createVNode } from "vue";
2
2
  import _sfc_main$1 from "../sections/ChatWindow.vue.js";
3
3
  import chatStore from "../../store/chat.store.js";
4
4
  /* empty css */
5
+ const _hoisted_1 = { class: "chat-main" };
5
6
  const _sfc_main = {
6
7
  __name: "ChatPage",
7
8
  props: {
@@ -9,6 +10,10 @@ const _sfc_main = {
9
10
  type: String,
10
11
  required: true
11
12
  },
13
+ user: {
14
+ type: String,
15
+ required: true
16
+ },
12
17
  chatID: {
13
18
  type: String,
14
19
  required: true
@@ -18,11 +23,16 @@ const _sfc_main = {
18
23
  const props = __props;
19
24
  onMounted(async () => {
20
25
  chatStore.methods.setUsername(props.username || "user");
21
- await chatStore.methods.connectWebSocket();
22
- chatStore.methods.setCurrentChat(props.chatID);
26
+ await chatStore.methods.connectWebSocket(props.user);
27
+ await chatStore.methods.setCurrentChat(props.chatID);
28
+ });
29
+ onUnmounted(() => {
30
+ chatStore.methods.disconnectChat();
23
31
  });
24
32
  return (_ctx, _cache) => {
25
- return openBlock(), createBlock(_sfc_main$1);
33
+ return openBlock(), createElementBlock("main", _hoisted_1, [
34
+ createVNode(_sfc_main$1)
35
+ ]);
26
36
  };
27
37
  }
28
38
  };
@@ -1 +1 @@
1
- {"version":3,"file":"ChatPage.vue.js","sources":["../../../../../../../src/modules/chats/components/pages/ChatPage.vue"],"sourcesContent":["<template>\n <!-- <div class=\"chat-page h-max-20r\"> -->\n <!-- <aside class=\"chat-list\"> -->\n <!-- Примерный список чатов. Должен быть дополнен реальной логикой -->\n <!-- <div v-for=\"chat in chats\" :key=\"chat.id\" @click=\"selectChat(chat.id)\">\n Чат {{ chat.name }}\n </div> -->\n <!-- </aside> -->\n <!-- <main class=\"chat-main\"> -->\n <ChatWindow />\n <!-- </main> -->\n <!-- </div> -->\n</template>\n\n<script setup>\nimport { ref, onMounted } from 'vue';\nimport ChatWindow from '../sections/ChatWindow.vue';\nimport chatStore from '../../store/chat.store.js';\n\nconst props = defineProps({\n username: {\n type: String,\n required: true\n },\n chatID: {\n type: String,\n required: true\n },\n})\n\n// const chats = ref([\n// // Примерный список. В реальном приложении, список чатов должен загружаться с сервера.\n// { id: 'chat1', name: 'Чат 1' },\n// { id: 'chat2', name: 'Чат 2' }\n// ]);\n\nconst selectChat = (chatId) => {\n chatStore.methods.setCurrentChat(chatId);\n};\n\nonMounted(async() => {\n chatStore.methods.setUsername(props.username || 'user'); // Установка имени пользователя\n await chatStore.methods.connectWebSocket(); // Подключение к WebSocket\n chatStore.methods.setCurrentChat(props.chatID);\n});\n</script>\n\n<style>\n/* Стили остаются без изменений */\n</style>\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAmBA,UAAM,QAAQ;AAqBd,cAAU,YAAW;AACnB,gBAAU,QAAQ,YAAY,MAAM,YAAY,MAAM;AACtD,YAAM,UAAU,QAAQ;AACxB,gBAAU,QAAQ,eAAe,MAAM,MAAM;AAAA,IAC/C,CAAC;;;;;;"}
1
+ {"version":3,"file":"ChatPage.vue.js","sources":["../../../../../../../src/modules/chats/components/pages/ChatPage.vue"],"sourcesContent":["<template>\n <main class=\"chat-main\">\n <ChatWindow />\n </main>\n</template>\n\n<script setup>\nimport { ref, onMounted, onUnmounted } from 'vue';\nimport ChatWindow from '../sections/ChatWindow.vue';\nimport chatStore from '../../store/chat.store.js';\n\nconst props = defineProps({\n username: {\n type: String,\n required: true\n },\n user: {\n type: String,\n required: true\n },\n chatID: {\n type: String,\n required: true\n },\n});\n\nconst selectChat = (chatId) => {\n chatStore.methods.setCurrentChat(chatId);\n};\n\nonMounted(async () => {\n chatStore.methods.setUsername(props.username || 'user'); // Установка имени пользователя\n await chatStore.methods.connectWebSocket(props.user); // Подключение к WebSocket\n await chatStore.methods.setCurrentChat(props.chatID);\n});\n\nonUnmounted(() => {\n // Clean up when the component is unmounted (e.g., navigating away)\n chatStore.methods.disconnectChat();\n});\n</script>\n\n<style>\n/* Стили остаются без изменений */\n</style>"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAWA,UAAM,QAAQ;AAmBd,cAAU,YAAY;AACpB,gBAAU,QAAQ,YAAY,MAAM,YAAY,MAAM;AACtD,YAAM,UAAU,QAAQ,iBAAiB,MAAM,IAAI;AACnD,YAAM,UAAU,QAAQ,eAAe,MAAM,MAAM;AAAA,IACrD,CAAC;AAED,gBAAY,MAAM;AAEhB,gBAAU,QAAQ,eAAgB;AAAA,IACpC,CAAC;;;;;;;;"}
@@ -19,7 +19,12 @@ const _sfc_main = {
19
19
  const newMessage = vue.ref("");
20
20
  const allMessages = vue.ref(null);
21
21
  const messages = vue.computed(() => chat_store.default.state.messages);
22
- const sendMessage = () => {
22
+ const scrollToBottom = () => {
23
+ if (allMessages.value) {
24
+ allMessages.value.scrollTop = allMessages.value.scrollHeight;
25
+ }
26
+ };
27
+ const sendMessage = async () => {
23
28
  if (newMessage.value) {
24
29
  const message = {
25
30
  text: newMessage.value,
@@ -27,13 +32,25 @@ const _sfc_main = {
27
32
  chatId: chat_store.default.state.currentChatId
28
33
  };
29
34
  chat_store.default.methods.addMessage(message);
30
- console.log(allMessages.value.lastElementChild.offsetHeight);
31
- allMessages.value.scrollTop = allMessages.value.lastElementChild.offsetHeight;
32
35
  newMessage.value = "";
36
+ await vue.nextTick();
37
+ await new Promise((resolve) => setTimeout(resolve, 100));
38
+ scrollToBottom();
33
39
  }
34
40
  };
35
- vue.watch(chat_store.default.state.messages, () => {
36
- allMessages.value.scrollTop = allMessages.value.lastElementChild.offsetHeight;
41
+ vue.onMounted(() => {
42
+ vue.nextTick(() => {
43
+ if (allMessages.value) {
44
+ allMessages.value.scrollTop = allMessages.value.scrollHeight;
45
+ }
46
+ });
47
+ });
48
+ vue.watch(messages, () => {
49
+ vue.nextTick(() => {
50
+ if (allMessages.value) {
51
+ allMessages.value.scrollTop = allMessages.value.scrollHeight;
52
+ }
53
+ });
37
54
  }, { deep: true });
38
55
  return (_ctx, _cache) => {
39
56
  return vue.openBlock(), vue.createElementBlock("div", _hoisted_1, [
@@ -56,7 +73,8 @@ const _sfc_main = {
56
73
  key: 1,
57
74
  name: "list",
58
75
  tag: "ul",
59
- class: "w-100 o-hidden"
76
+ class: "w-100 o-hidden",
77
+ onAfterEnter: scrollToBottom
60
78
  }, {
61
79
  default: vue.withCtx(() => [
62
80
  (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(messages.value, (message) => {
@@ -1 +1 @@
1
- {"version":3,"file":"ChatWindow.vue.cjs","sources":["../../../../../../../src/modules/chats/components/sections/ChatWindow.vue"],"sourcesContent":["<template>\n <div class=\"bg-white radius-semi bg-white o-hidden pos-relative\">\n \n <div ref=\"allMessages\" class=\"chat-messages o-scroll h-max-20r\">\n <div class=\"pos-relative h-min-20r flex-justify-end flex flex-column br-b br-solid br-black-transp-10\">\n <transition name=\"scaleIn\" mode=\"out-in\">\n <div v-if=\"messages.length < 1\" class=\"flex-center pd-small t-center w-100 h-100 flex-column flex pos-absolute\">\n <PlaceholderChat class=\"radius-100 mn-b-thin\"/>\n <h4 class='mn-b-thin'>Here you can view your chat history</h4>\n <p>Feel free to ask if you have any questions.</p>\n </div>\n\n <TransitionGroup v-else name=\"list\" tag=\"ul\" class=\"w-100 o-hidden\">\n <ChatMessage\n v-for=\"message in messages\"\n :key=\"message._id\"\n :message=\"message\"\n />\n\n </TransitionGroup>\n </transition>\n \n </div>\n </div>\n\n \n <div class=\"flex-nowrap flex-v-center flex bg-white w-100 radius-big pd-small\">\n <IconAdd\n class=\"mn-r-thin t-transp i-regular\"\n />\n <input class=\"\" placeholder=\"Enter your message\" type=\"text\" v-model=\"newMessage\" @keyup.enter=\"sendMessage\" />\n </div>\n </div>\n</template>\n\n<script setup>\nimport { ref, computed, watch } from 'vue';\n\nimport IconAdd from '@martyrs/src/modules/icons/navigation/IconAdd.vue'\nimport PlaceholderChat from '@martyrs/src/modules/icons/placeholders/PlaceholderChat.vue'\n\nimport ChatMessage from '../blocks/ChatMessage.vue';\nimport chatStore from '../../store/chat.store.js';\n\nconst newMessage = ref('');\nconst allMessages = ref(null)\n\n// Вычисляемые свойства\nconst messages = computed(() => chatStore.state.messages);\n\n// Функция для отправки сообщения\nconst sendMessage = () => {\n if (newMessage.value) {\n const message = {\n text: newMessage.value,\n username: chatStore.state.username,\n chatId: chatStore.state.currentChatId\n };\n\n chatStore.methods.addMessage(message);\n console.log(allMessages.value.lastElementChild.offsetHeight)\n allMessages.value.scrollTop = allMessages.value.lastElementChild.offsetHeight\n \n newMessage.value = '';\n }\n};\n\n// // При добавлении нового сообщения автоматически прокручиваем вниз\nwatch(chatStore.state.messages, () => {\n allMessages.value.scrollTop = allMessages.value.lastElementChild.offsetHeight\n}, {deep: true});\n\n</script>\n\n<style>\n.list-enter-active,\n.list-leave-active {\n transition: all 0.5s ease;\n}\n.list-enter-from,\n.list-leave-to {\n opacity: 0;\n transform: translateX(30px);\n}\n</style>\n"],"names":["ref","computed","chatStore","watch"],"mappings":";;;;;;;;;;;;;;;;;;AA4CA,UAAM,aAAaA,IAAG,IAAC,EAAE;AACzB,UAAM,cAAcA,IAAG,IAAC,IAAI;AAG5B,UAAM,WAAWC,IAAAA,SAAS,MAAMC,mBAAU,MAAM,QAAQ;AAGxD,UAAM,cAAc,MAAM;AACxB,UAAI,WAAW,OAAO;AACpB,cAAM,UAAU;AAAA,UACd,MAAM,WAAW;AAAA,UACjB,UAAUA,WAAAA,QAAU,MAAM;AAAA,UAC1B,QAAQA,WAAS,QAAC,MAAM;AAAA,QACzB;AAEDA,2BAAU,QAAQ,WAAW,OAAO;AACpC,gBAAQ,IAAI,YAAY,MAAM,iBAAiB,YAAY;AAC3D,oBAAY,MAAM,YAAY,YAAY,MAAM,iBAAiB;AAEjE,mBAAW,QAAQ;AAAA,MACvB;AAAA,IACA;AAGAC,QAAAA,MAAMD,WAAS,QAAC,MAAM,UAAU,MAAM;AACpC,kBAAY,MAAM,YAAY,YAAY,MAAM,iBAAiB;AAAA,IACnE,GAAG,EAAC,MAAM,KAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"ChatWindow.vue.cjs","sources":["../../../../../../../src/modules/chats/components/sections/ChatWindow.vue"],"sourcesContent":["<template>\n <div class=\"bg-white radius-semi bg-white o-hidden pos-relative\">\n <div ref=\"allMessages\" class=\"chat-messages o-scroll h-max-20r\">\n <div class=\"pos-relative h-min-20r flex-justify-end flex flex-column br-b br-solid br-black-transp-10\">\n <transition name=\"scaleIn\" mode=\"out-in\">\n <div v-if=\"messages.length < 1\" class=\"flex-center pd-small t-center w-100 h-100 flex-column flex pos-absolute\">\n <PlaceholderChat class=\"radius-100 mn-b-thin\"/>\n <h4 class='mn-b-thin'>Here you can view your chat history</h4>\n <p>Feel free to ask if you have any questions.</p>\n </div>\n\n <TransitionGroup v-else name=\"list\" tag=\"ul\" class=\"w-100 o-hidden\" @after-enter=\"scrollToBottom\">\n <ChatMessage\n v-for=\"message in messages\"\n :key=\"message._id\"\n :message=\"message\"\n />\n </TransitionGroup>\n </transition>\n </div>\n </div>\n\n <div class=\"flex-nowrap flex-v-center flex bg-white w-100 radius-big pd-small\">\n <IconAdd class=\"mn-r-thin t-transp i-regular\" />\n <input class=\"\" placeholder=\"Enter your message\" type=\"text\" v-model=\"newMessage\" @keyup.enter=\"sendMessage\" />\n </div>\n </div>\n</template>\n\n<script setup>\nimport { ref, computed, watch, onMounted, nextTick } from 'vue';\n\nimport IconAdd from '@martyrs/src/modules/icons/navigation/IconAdd.vue'\nimport PlaceholderChat from '@martyrs/src/modules/icons/placeholders/PlaceholderChat.vue'\n\nimport ChatMessage from '../blocks/ChatMessage.vue';\nimport chatStore from '../../store/chat.store.js';\n\nconst newMessage = ref('');\nconst allMessages = ref(null);\n\n// Вычисляемые свойства\nconst messages = computed(() => chatStore.state.messages);\n\n// Функция прокрутки вниз\nconst scrollToBottom = () => {\n if (allMessages.value) {\n allMessages.value.scrollTop = allMessages.value.scrollHeight;\n }\n};\n\n// Функция для отправки сообщения\nconst sendMessage = async () => {\n if (newMessage.value) {\n const message = {\n text: newMessage.value,\n username: chatStore.state.username,\n chatId: chatStore.state.currentChatId\n };\n\n chatStore.methods.addMessage(message);\n newMessage.value = '';\n\n // Ждем, пока все анимации и рендеринг завершатся\n await nextTick();\n await new Promise(resolve => setTimeout(resolve, 100)); // Небольшая задержка для анимаций\n scrollToBottom();\n }\n};\n\n// Прокрутка вниз при монтировании\nonMounted(() => {\n nextTick(() => {\n if (allMessages.value) {\n allMessages.value.scrollTop = allMessages.value.scrollHeight;\n }\n });\n});\n\n// Прокрутка вниз при изменении сообщений\nwatch(messages, () => {\n nextTick(() => {\n if (allMessages.value) {\n allMessages.value.scrollTop = allMessages.value.scrollHeight;\n }\n });\n}, { deep: true });\n\n// Обработчик после завершения анимации входа нового элемента\n</script>\n\n<style>\n.list-enter-active,\n.list-leave-active {\n transition: all 0.5s ease;\n}\n.list-enter-from,\n.list-leave-to {\n opacity: 0;\n transform: translateX(30px);\n}\n</style>"],"names":["ref","computed","chatStore","nextTick","onMounted","watch"],"mappings":";;;;;;;;;;;;;;;;;;AAsCA,UAAM,aAAaA,IAAG,IAAC,EAAE;AACzB,UAAM,cAAcA,IAAG,IAAC,IAAI;AAG5B,UAAM,WAAWC,IAAAA,SAAS,MAAMC,mBAAU,MAAM,QAAQ;AAGxD,UAAM,iBAAiB,MAAM;AAC3B,UAAI,YAAY,OAAO;AACrB,oBAAY,MAAM,YAAY,YAAY,MAAM;AAAA,MACpD;AAAA,IACA;AAGA,UAAM,cAAc,YAAY;AAC9B,UAAI,WAAW,OAAO;AACpB,cAAM,UAAU;AAAA,UACd,MAAM,WAAW;AAAA,UACjB,UAAUA,WAAAA,QAAU,MAAM;AAAA,UAC1B,QAAQA,WAAS,QAAC,MAAM;AAAA,QACzB;AAEDA,2BAAU,QAAQ,WAAW,OAAO;AACpC,mBAAW,QAAQ;AAGnB,cAAMC,aAAU;AAChB,cAAM,IAAI,QAAQ,aAAW,WAAW,SAAS,GAAG,CAAC;AACrD,uBAAgB;AAAA,MACpB;AAAA,IACA;AAGAC,QAAAA,UAAU,MAAM;AACdD,UAAAA,SAAS,MAAM;AACb,YAAI,YAAY,OAAO;AACrB,sBAAY,MAAM,YAAY,YAAY,MAAM;AAAA,QACtD;AAAA,MACA,CAAG;AAAA,IACH,CAAC;AAGDE,QAAK,MAAC,UAAU,MAAM;AACpBF,UAAAA,SAAS,MAAM;AACb,YAAI,YAAY,OAAO;AACrB,sBAAY,MAAM,YAAY,YAAY,MAAM;AAAA,QACtD;AAAA,MACA,CAAG;AAAA,IACH,GAAG,EAAE,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,4 +1,4 @@
1
- import { ref, computed, watch, createElementBlock, openBlock, createElementVNode, createVNode, Transition, withCtx, createBlock, TransitionGroup, Fragment, renderList, withDirectives, withKeys, vModelText } from "vue";
1
+ import { ref, computed, onMounted, nextTick, watch, createElementBlock, openBlock, createElementVNode, createVNode, Transition, withCtx, createBlock, TransitionGroup, Fragment, renderList, withDirectives, withKeys, vModelText } from "vue";
2
2
  import _sfc_main$1 from "../../../icons/navigation/IconAdd.vue.js";
3
3
  import PlaceholderChat from "../../../icons/placeholders/PlaceholderChat.vue.js";
4
4
  import ChatMessage from "../blocks/ChatMessage.vue.js";
@@ -17,7 +17,12 @@ const _sfc_main = {
17
17
  const newMessage = ref("");
18
18
  const allMessages = ref(null);
19
19
  const messages = computed(() => chatStore.state.messages);
20
- const sendMessage = () => {
20
+ const scrollToBottom = () => {
21
+ if (allMessages.value) {
22
+ allMessages.value.scrollTop = allMessages.value.scrollHeight;
23
+ }
24
+ };
25
+ const sendMessage = async () => {
21
26
  if (newMessage.value) {
22
27
  const message = {
23
28
  text: newMessage.value,
@@ -25,13 +30,25 @@ const _sfc_main = {
25
30
  chatId: chatStore.state.currentChatId
26
31
  };
27
32
  chatStore.methods.addMessage(message);
28
- console.log(allMessages.value.lastElementChild.offsetHeight);
29
- allMessages.value.scrollTop = allMessages.value.lastElementChild.offsetHeight;
30
33
  newMessage.value = "";
34
+ await nextTick();
35
+ await new Promise((resolve) => setTimeout(resolve, 100));
36
+ scrollToBottom();
31
37
  }
32
38
  };
33
- watch(chatStore.state.messages, () => {
34
- allMessages.value.scrollTop = allMessages.value.lastElementChild.offsetHeight;
39
+ onMounted(() => {
40
+ nextTick(() => {
41
+ if (allMessages.value) {
42
+ allMessages.value.scrollTop = allMessages.value.scrollHeight;
43
+ }
44
+ });
45
+ });
46
+ watch(messages, () => {
47
+ nextTick(() => {
48
+ if (allMessages.value) {
49
+ allMessages.value.scrollTop = allMessages.value.scrollHeight;
50
+ }
51
+ });
35
52
  }, { deep: true });
36
53
  return (_ctx, _cache) => {
37
54
  return openBlock(), createElementBlock("div", _hoisted_1, [
@@ -54,7 +71,8 @@ const _sfc_main = {
54
71
  key: 1,
55
72
  name: "list",
56
73
  tag: "ul",
57
- class: "w-100 o-hidden"
74
+ class: "w-100 o-hidden",
75
+ onAfterEnter: scrollToBottom
58
76
  }, {
59
77
  default: withCtx(() => [
60
78
  (openBlock(true), createElementBlock(Fragment, null, renderList(messages.value, (message) => {
@@ -1 +1 @@
1
- {"version":3,"file":"ChatWindow.vue.js","sources":["../../../../../../../src/modules/chats/components/sections/ChatWindow.vue"],"sourcesContent":["<template>\n <div class=\"bg-white radius-semi bg-white o-hidden pos-relative\">\n \n <div ref=\"allMessages\" class=\"chat-messages o-scroll h-max-20r\">\n <div class=\"pos-relative h-min-20r flex-justify-end flex flex-column br-b br-solid br-black-transp-10\">\n <transition name=\"scaleIn\" mode=\"out-in\">\n <div v-if=\"messages.length < 1\" class=\"flex-center pd-small t-center w-100 h-100 flex-column flex pos-absolute\">\n <PlaceholderChat class=\"radius-100 mn-b-thin\"/>\n <h4 class='mn-b-thin'>Here you can view your chat history</h4>\n <p>Feel free to ask if you have any questions.</p>\n </div>\n\n <TransitionGroup v-else name=\"list\" tag=\"ul\" class=\"w-100 o-hidden\">\n <ChatMessage\n v-for=\"message in messages\"\n :key=\"message._id\"\n :message=\"message\"\n />\n\n </TransitionGroup>\n </transition>\n \n </div>\n </div>\n\n \n <div class=\"flex-nowrap flex-v-center flex bg-white w-100 radius-big pd-small\">\n <IconAdd\n class=\"mn-r-thin t-transp i-regular\"\n />\n <input class=\"\" placeholder=\"Enter your message\" type=\"text\" v-model=\"newMessage\" @keyup.enter=\"sendMessage\" />\n </div>\n </div>\n</template>\n\n<script setup>\nimport { ref, computed, watch } from 'vue';\n\nimport IconAdd from '@martyrs/src/modules/icons/navigation/IconAdd.vue'\nimport PlaceholderChat from '@martyrs/src/modules/icons/placeholders/PlaceholderChat.vue'\n\nimport ChatMessage from '../blocks/ChatMessage.vue';\nimport chatStore from '../../store/chat.store.js';\n\nconst newMessage = ref('');\nconst allMessages = ref(null)\n\n// Вычисляемые свойства\nconst messages = computed(() => chatStore.state.messages);\n\n// Функция для отправки сообщения\nconst sendMessage = () => {\n if (newMessage.value) {\n const message = {\n text: newMessage.value,\n username: chatStore.state.username,\n chatId: chatStore.state.currentChatId\n };\n\n chatStore.methods.addMessage(message);\n console.log(allMessages.value.lastElementChild.offsetHeight)\n allMessages.value.scrollTop = allMessages.value.lastElementChild.offsetHeight\n \n newMessage.value = '';\n }\n};\n\n// // При добавлении нового сообщения автоматически прокручиваем вниз\nwatch(chatStore.state.messages, () => {\n allMessages.value.scrollTop = allMessages.value.lastElementChild.offsetHeight\n}, {deep: true});\n\n</script>\n\n<style>\n.list-enter-active,\n.list-leave-active {\n transition: all 0.5s ease;\n}\n.list-enter-from,\n.list-leave-to {\n opacity: 0;\n transform: translateX(30px);\n}\n</style>\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;AA4CA,UAAM,aAAa,IAAI,EAAE;AACzB,UAAM,cAAc,IAAI,IAAI;AAG5B,UAAM,WAAW,SAAS,MAAM,UAAU,MAAM,QAAQ;AAGxD,UAAM,cAAc,MAAM;AACxB,UAAI,WAAW,OAAO;AACpB,cAAM,UAAU;AAAA,UACd,MAAM,WAAW;AAAA,UACjB,UAAU,UAAU,MAAM;AAAA,UAC1B,QAAQ,UAAU,MAAM;AAAA,QACzB;AAED,kBAAU,QAAQ,WAAW,OAAO;AACpC,gBAAQ,IAAI,YAAY,MAAM,iBAAiB,YAAY;AAC3D,oBAAY,MAAM,YAAY,YAAY,MAAM,iBAAiB;AAEjE,mBAAW,QAAQ;AAAA,MACvB;AAAA,IACA;AAGA,UAAM,UAAU,MAAM,UAAU,MAAM;AACpC,kBAAY,MAAM,YAAY,YAAY,MAAM,iBAAiB;AAAA,IACnE,GAAG,EAAC,MAAM,KAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"ChatWindow.vue.js","sources":["../../../../../../../src/modules/chats/components/sections/ChatWindow.vue"],"sourcesContent":["<template>\n <div class=\"bg-white radius-semi bg-white o-hidden pos-relative\">\n <div ref=\"allMessages\" class=\"chat-messages o-scroll h-max-20r\">\n <div class=\"pos-relative h-min-20r flex-justify-end flex flex-column br-b br-solid br-black-transp-10\">\n <transition name=\"scaleIn\" mode=\"out-in\">\n <div v-if=\"messages.length < 1\" class=\"flex-center pd-small t-center w-100 h-100 flex-column flex pos-absolute\">\n <PlaceholderChat class=\"radius-100 mn-b-thin\"/>\n <h4 class='mn-b-thin'>Here you can view your chat history</h4>\n <p>Feel free to ask if you have any questions.</p>\n </div>\n\n <TransitionGroup v-else name=\"list\" tag=\"ul\" class=\"w-100 o-hidden\" @after-enter=\"scrollToBottom\">\n <ChatMessage\n v-for=\"message in messages\"\n :key=\"message._id\"\n :message=\"message\"\n />\n </TransitionGroup>\n </transition>\n </div>\n </div>\n\n <div class=\"flex-nowrap flex-v-center flex bg-white w-100 radius-big pd-small\">\n <IconAdd class=\"mn-r-thin t-transp i-regular\" />\n <input class=\"\" placeholder=\"Enter your message\" type=\"text\" v-model=\"newMessage\" @keyup.enter=\"sendMessage\" />\n </div>\n </div>\n</template>\n\n<script setup>\nimport { ref, computed, watch, onMounted, nextTick } from 'vue';\n\nimport IconAdd from '@martyrs/src/modules/icons/navigation/IconAdd.vue'\nimport PlaceholderChat from '@martyrs/src/modules/icons/placeholders/PlaceholderChat.vue'\n\nimport ChatMessage from '../blocks/ChatMessage.vue';\nimport chatStore from '../../store/chat.store.js';\n\nconst newMessage = ref('');\nconst allMessages = ref(null);\n\n// Вычисляемые свойства\nconst messages = computed(() => chatStore.state.messages);\n\n// Функция прокрутки вниз\nconst scrollToBottom = () => {\n if (allMessages.value) {\n allMessages.value.scrollTop = allMessages.value.scrollHeight;\n }\n};\n\n// Функция для отправки сообщения\nconst sendMessage = async () => {\n if (newMessage.value) {\n const message = {\n text: newMessage.value,\n username: chatStore.state.username,\n chatId: chatStore.state.currentChatId\n };\n\n chatStore.methods.addMessage(message);\n newMessage.value = '';\n\n // Ждем, пока все анимации и рендеринг завершатся\n await nextTick();\n await new Promise(resolve => setTimeout(resolve, 100)); // Небольшая задержка для анимаций\n scrollToBottom();\n }\n};\n\n// Прокрутка вниз при монтировании\nonMounted(() => {\n nextTick(() => {\n if (allMessages.value) {\n allMessages.value.scrollTop = allMessages.value.scrollHeight;\n }\n });\n});\n\n// Прокрутка вниз при изменении сообщений\nwatch(messages, () => {\n nextTick(() => {\n if (allMessages.value) {\n allMessages.value.scrollTop = allMessages.value.scrollHeight;\n }\n });\n}, { deep: true });\n\n// Обработчик после завершения анимации входа нового элемента\n</script>\n\n<style>\n.list-enter-active,\n.list-leave-active {\n transition: all 0.5s ease;\n}\n.list-enter-from,\n.list-leave-to {\n opacity: 0;\n transform: translateX(30px);\n}\n</style>"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAsCA,UAAM,aAAa,IAAI,EAAE;AACzB,UAAM,cAAc,IAAI,IAAI;AAG5B,UAAM,WAAW,SAAS,MAAM,UAAU,MAAM,QAAQ;AAGxD,UAAM,iBAAiB,MAAM;AAC3B,UAAI,YAAY,OAAO;AACrB,oBAAY,MAAM,YAAY,YAAY,MAAM;AAAA,MACpD;AAAA,IACA;AAGA,UAAM,cAAc,YAAY;AAC9B,UAAI,WAAW,OAAO;AACpB,cAAM,UAAU;AAAA,UACd,MAAM,WAAW;AAAA,UACjB,UAAU,UAAU,MAAM;AAAA,UAC1B,QAAQ,UAAU,MAAM;AAAA,QACzB;AAED,kBAAU,QAAQ,WAAW,OAAO;AACpC,mBAAW,QAAQ;AAGnB,cAAM,SAAU;AAChB,cAAM,IAAI,QAAQ,aAAW,WAAW,SAAS,GAAG,CAAC;AACrD,uBAAgB;AAAA,MACpB;AAAA,IACA;AAGA,cAAU,MAAM;AACd,eAAS,MAAM;AACb,YAAI,YAAY,OAAO;AACrB,sBAAY,MAAM,YAAY,YAAY,MAAM;AAAA,QACtD;AAAA,MACA,CAAG;AAAA,IACH,CAAC;AAGD,UAAM,UAAU,MAAM;AACpB,eAAS,MAAM;AACb,YAAI,YAAY,OAAO;AACrB,sBAAY,MAAM,YAAY,YAAY,MAAM;AAAA,QACtD;AAAA,MACA,CAAG;AAAA,IACH,GAAG,EAAE,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -8,13 +8,12 @@ const state = vue.reactive({
8
8
  username: null
9
9
  });
10
10
  const methods = {
11
- async connectWebSocket() {
12
- console.log("process env");
13
- console.log(process.env.WSS_URL);
11
+ async connectWebSocket(user) {
14
12
  try {
15
- const userId = window.__user_id || null;
16
- await globals_websocket.default.connect(userId);
17
- globals_websocket.default.addEventListener("message", (data) => {
13
+ console.log("connect", user);
14
+ await globals_websocket.default.connect(user);
15
+ globals_websocket.default.removeModuleListeners("chat");
16
+ const listenerId = globals_websocket.default.addEventListener("message", (data) => {
18
17
  if (data.chatId === state.currentChatId) {
19
18
  state.messages.push(data);
20
19
  }
@@ -29,8 +28,8 @@ const methods = {
29
28
  console.log(process.env.API_URL);
30
29
  state.messages = messages;
31
30
  },
32
- addMessage(message) {
33
- globals_websocket.default.send(message);
31
+ async addMessage(message) {
32
+ await globals_websocket.default.send(message);
34
33
  },
35
34
  async setCurrentChat(chatId) {
36
35
  state.currentChatId = chatId;
@@ -1 +1 @@
1
- {"version":3,"file":"chat.store.cjs","sources":["../../../../../../src/modules/chats/store/chat.store.js"],"sourcesContent":["import { reactive, readonly } from 'vue';\nimport globalWebSocket from '@martyrs/src/modules/globals/views/classes/globals.websocket.js';\n\nconst state = reactive({\n messages: [],\n currentChatId: null,\n username: null\n});\n\nconst methods = {\n async connectWebSocket() {\n console.log('process env')\n console.log(process.env.WSS_URL)\n\n // Use the global WebSocket instance\n try {\n // Get userId from auth store or another source if available\n const userId = window.__user_id || null;\n \n // Connect to the global WebSocket\n await globalWebSocket.connect(userId);\n \n // Register chat message event listener\n globalWebSocket.addEventListener('message', (data) => {\n if (data.chatId === state.currentChatId) {\n state.messages.push(data);\n }\n }, { module: 'chat' });\n \n return globalWebSocket;\n } catch (error) {\n console.error('Failed to connect to WebSocket:', error);\n throw error;\n }\n },\n \n setMessages(messages) {\n console.log(process.env.API_URL)\n state.messages = messages;\n },\n \n addMessage(message) {\n globalWebSocket.send(message);\n },\n \n async setCurrentChat(chatId) {\n state.currentChatId = chatId;\n state.messages = []; // Clear current messages when changing chat\n\n // Send join chat message through the WebSocket\n globalWebSocket.send({ type: 'joinChat', chatId });\n\n // Fetch chat history\n const response = await fetch(`/messages/${chatId}`);\n const messages = await response.json();\n\n methods.setMessages(messages);\n },\n \n setUsername(username) {\n state.username = username;\n },\n \n disconnectChat() {\n // Remove chat-specific listeners when leaving chat page\n globalWebSocket.removeModuleListeners('chat');\n }\n};\n\nexport default {\n state: readonly(state),\n methods\n};"],"names":["reactive","globalWebSocket","readonly"],"mappings":";;;;AAGA,MAAM,QAAQA,IAAAA,SAAS;AAAA,EACrB,UAAU,CAAE;AAAA,EACZ,eAAe;AAAA,EACf,UAAU;AACZ,CAAC;AAED,MAAM,UAAU;AAAA,EACd,MAAM,mBAAmB;AACvB,YAAQ,IAAI,aAAa;AACzB,YAAQ,IAAI,QAAQ,IAAI,OAAO;AAG/B,QAAI;AAEF,YAAM,SAAS,OAAO,aAAa;AAGnC,YAAMC,kBAAe,QAAC,QAAQ,MAAM;AAGpCA,wBAAAA,QAAgB,iBAAiB,WAAW,CAAC,SAAS;AACpD,YAAI,KAAK,WAAW,MAAM,eAAe;AACvC,gBAAM,SAAS,KAAK,IAAI;AAAA,QAClC;AAAA,MACA,GAAS,EAAE,QAAQ,QAAQ;AAErB,aAAOA,kBAAe;AAAA,IACvB,SAAQ,OAAO;AACd,cAAQ,MAAM,mCAAmC,KAAK;AACtD,YAAM;AAAA,IACZ;AAAA,EACG;AAAA,EAED,YAAY,UAAU;AACpB,YAAQ,IAAI,QAAQ,IAAI,OAAO;AAC/B,UAAM,WAAW;AAAA,EAClB;AAAA,EAED,WAAW,SAAS;AAClBA,sBAAe,QAAC,KAAK,OAAO;AAAA,EAC7B;AAAA,EAED,MAAM,eAAe,QAAQ;AAC3B,UAAM,gBAAgB;AACtB,UAAM,WAAW;AAGjBA,sBAAAA,QAAgB,KAAK,EAAE,MAAM,YAAY,OAAM,CAAE;AAGjD,UAAM,WAAW,MAAM,MAAM,aAAa,MAAM,EAAE;AAClD,UAAM,WAAW,MAAM,SAAS,KAAM;AAEtC,YAAQ,YAAY,QAAQ;AAAA,EAC7B;AAAA,EAED,YAAY,UAAU;AACpB,UAAM,WAAW;AAAA,EAClB;AAAA,EAED,iBAAiB;AAEfA,sBAAe,QAAC,sBAAsB,MAAM;AAAA,EAChD;AACA;AAEA,MAAe,YAAA;AAAA,EACb,OAAOC,IAAQ,SAAC,KAAK;AAAA,EACrB;AACF;;"}
1
+ {"version":3,"file":"chat.store.cjs","sources":["../../../../../../src/modules/chats/store/chat.store.js"],"sourcesContent":["import { reactive, readonly } from 'vue';\nimport globalWebSocket from '@martyrs/src/modules/globals/views/classes/globals.websocket.js';\n\nconst state = reactive({\n messages: [],\n currentChatId: null,\n username: null\n});\n\nconst methods = {\n async connectWebSocket(user) {\n // Use the global WebSocket instance\n try {\n console.log('connect', user);\n await globalWebSocket.connect(user);\n\n // Remove any existing 'message' listeners for the 'chat' module to avoid duplicates\n globalWebSocket.removeModuleListeners('chat');\n\n // Register chat message event listener\n const listenerId = globalWebSocket.addEventListener('message', (data) => {\n if (data.chatId === state.currentChatId) {\n state.messages.push(data);\n }\n }, { module: 'chat' });\n\n return globalWebSocket;\n } catch (error) {\n console.error('Failed to connect to WebSocket:', error);\n throw error;\n }\n },\n\n setMessages(messages) {\n console.log(process.env.API_URL);\n state.messages = messages;\n },\n\n async addMessage(message) {\n await globalWebSocket.send(message);\n },\n\n async setCurrentChat(chatId) {\n state.currentChatId = chatId;\n state.messages = []; // Clear current messages when changing chat\n\n // Send join chat message through the WebSocket\n globalWebSocket.send({ type: 'joinChat', chatId });\n\n // Fetch chat history\n const response = await fetch(`/messages/${chatId}`);\n const messages = await response.json();\n\n methods.setMessages(messages);\n },\n\n setUsername(username) {\n state.username = username;\n },\n\n disconnectChat() {\n // Remove all chat-specific listeners when leaving chat page\n globalWebSocket.removeModuleListeners('chat');\n // Optionally disconnect the WebSocket if no longer needed\n // globalWebSocket.disconnect(); // Uncomment if you want to fully disconnect\n }\n};\n\nexport default {\n state: readonly(state),\n methods\n};"],"names":["reactive","globalWebSocket","readonly"],"mappings":";;;;AAGA,MAAM,QAAQA,IAAAA,SAAS;AAAA,EACrB,UAAU,CAAE;AAAA,EACZ,eAAe;AAAA,EACf,UAAU;AACZ,CAAC;AAED,MAAM,UAAU;AAAA,EACd,MAAM,iBAAiB,MAAM;AAE3B,QAAI;AACF,cAAQ,IAAI,WAAW,IAAI;AAC3B,YAAMC,kBAAe,QAAC,QAAQ,IAAI;AAGlCA,wBAAe,QAAC,sBAAsB,MAAM;AAG5C,YAAM,aAAaA,kBAAe,QAAC,iBAAiB,WAAW,CAAC,SAAS;AACvE,YAAI,KAAK,WAAW,MAAM,eAAe;AACvC,gBAAM,SAAS,KAAK,IAAI;AAAA,QAClC;AAAA,MACA,GAAS,EAAE,QAAQ,QAAQ;AAErB,aAAOA,kBAAe;AAAA,IACvB,SAAQ,OAAO;AACd,cAAQ,MAAM,mCAAmC,KAAK;AACtD,YAAM;AAAA,IACZ;AAAA,EACG;AAAA,EAED,YAAY,UAAU;AACpB,YAAQ,IAAI,QAAQ,IAAI,OAAO;AAC/B,UAAM,WAAW;AAAA,EAClB;AAAA,EAED,MAAM,WAAW,SAAS;AACxB,UAAMA,kBAAe,QAAC,KAAK,OAAO;AAAA,EACnC;AAAA,EAED,MAAM,eAAe,QAAQ;AAC3B,UAAM,gBAAgB;AACtB,UAAM,WAAW;AAGjBA,sBAAAA,QAAgB,KAAK,EAAE,MAAM,YAAY,OAAM,CAAE;AAGjD,UAAM,WAAW,MAAM,MAAM,aAAa,MAAM,EAAE;AAClD,UAAM,WAAW,MAAM,SAAS,KAAM;AAEtC,YAAQ,YAAY,QAAQ;AAAA,EAC7B;AAAA,EAED,YAAY,UAAU;AACpB,UAAM,WAAW;AAAA,EAClB;AAAA,EAED,iBAAiB;AAEfA,sBAAe,QAAC,sBAAsB,MAAM;AAAA,EAGhD;AACA;AAEA,MAAe,YAAA;AAAA,EACb,OAAOC,IAAQ,SAAC,KAAK;AAAA,EACrB;AACF;;"}
@@ -6,13 +6,12 @@ const state = reactive({
6
6
  username: null
7
7
  });
8
8
  const methods = {
9
- async connectWebSocket() {
10
- console.log("process env");
11
- console.log(process.env.WSS_URL);
9
+ async connectWebSocket(user) {
12
10
  try {
13
- const userId = window.__user_id || null;
14
- await globalWebSocket.connect(userId);
15
- globalWebSocket.addEventListener("message", (data) => {
11
+ console.log("connect", user);
12
+ await globalWebSocket.connect(user);
13
+ globalWebSocket.removeModuleListeners("chat");
14
+ const listenerId = globalWebSocket.addEventListener("message", (data) => {
16
15
  if (data.chatId === state.currentChatId) {
17
16
  state.messages.push(data);
18
17
  }
@@ -27,8 +26,8 @@ const methods = {
27
26
  console.log(process.env.API_URL);
28
27
  state.messages = messages;
29
28
  },
30
- addMessage(message) {
31
- globalWebSocket.send(message);
29
+ async addMessage(message) {
30
+ await globalWebSocket.send(message);
32
31
  },
33
32
  async setCurrentChat(chatId) {
34
33
  state.currentChatId = chatId;
@@ -1 +1 @@
1
- {"version":3,"file":"chat.store.js","sources":["../../../../../../src/modules/chats/store/chat.store.js"],"sourcesContent":["import { reactive, readonly } from 'vue';\nimport globalWebSocket from '@martyrs/src/modules/globals/views/classes/globals.websocket.js';\n\nconst state = reactive({\n messages: [],\n currentChatId: null,\n username: null\n});\n\nconst methods = {\n async connectWebSocket() {\n console.log('process env')\n console.log(process.env.WSS_URL)\n\n // Use the global WebSocket instance\n try {\n // Get userId from auth store or another source if available\n const userId = window.__user_id || null;\n \n // Connect to the global WebSocket\n await globalWebSocket.connect(userId);\n \n // Register chat message event listener\n globalWebSocket.addEventListener('message', (data) => {\n if (data.chatId === state.currentChatId) {\n state.messages.push(data);\n }\n }, { module: 'chat' });\n \n return globalWebSocket;\n } catch (error) {\n console.error('Failed to connect to WebSocket:', error);\n throw error;\n }\n },\n \n setMessages(messages) {\n console.log(process.env.API_URL)\n state.messages = messages;\n },\n \n addMessage(message) {\n globalWebSocket.send(message);\n },\n \n async setCurrentChat(chatId) {\n state.currentChatId = chatId;\n state.messages = []; // Clear current messages when changing chat\n\n // Send join chat message through the WebSocket\n globalWebSocket.send({ type: 'joinChat', chatId });\n\n // Fetch chat history\n const response = await fetch(`/messages/${chatId}`);\n const messages = await response.json();\n\n methods.setMessages(messages);\n },\n \n setUsername(username) {\n state.username = username;\n },\n \n disconnectChat() {\n // Remove chat-specific listeners when leaving chat page\n globalWebSocket.removeModuleListeners('chat');\n }\n};\n\nexport default {\n state: readonly(state),\n methods\n};"],"names":[],"mappings":";;AAGA,MAAM,QAAQ,SAAS;AAAA,EACrB,UAAU,CAAE;AAAA,EACZ,eAAe;AAAA,EACf,UAAU;AACZ,CAAC;AAED,MAAM,UAAU;AAAA,EACd,MAAM,mBAAmB;AACvB,YAAQ,IAAI,aAAa;AACzB,YAAQ,IAAI,QAAQ,IAAI,OAAO;AAG/B,QAAI;AAEF,YAAM,SAAS,OAAO,aAAa;AAGnC,YAAM,gBAAgB,QAAQ,MAAM;AAGpC,sBAAgB,iBAAiB,WAAW,CAAC,SAAS;AACpD,YAAI,KAAK,WAAW,MAAM,eAAe;AACvC,gBAAM,SAAS,KAAK,IAAI;AAAA,QAClC;AAAA,MACA,GAAS,EAAE,QAAQ,QAAQ;AAErB,aAAO;AAAA,IACR,SAAQ,OAAO;AACd,cAAQ,MAAM,mCAAmC,KAAK;AACtD,YAAM;AAAA,IACZ;AAAA,EACG;AAAA,EAED,YAAY,UAAU;AACpB,YAAQ,IAAI,QAAQ,IAAI,OAAO;AAC/B,UAAM,WAAW;AAAA,EAClB;AAAA,EAED,WAAW,SAAS;AAClB,oBAAgB,KAAK,OAAO;AAAA,EAC7B;AAAA,EAED,MAAM,eAAe,QAAQ;AAC3B,UAAM,gBAAgB;AACtB,UAAM,WAAW;AAGjB,oBAAgB,KAAK,EAAE,MAAM,YAAY,OAAM,CAAE;AAGjD,UAAM,WAAW,MAAM,MAAM,aAAa,MAAM,EAAE;AAClD,UAAM,WAAW,MAAM,SAAS,KAAM;AAEtC,YAAQ,YAAY,QAAQ;AAAA,EAC7B;AAAA,EAED,YAAY,UAAU;AACpB,UAAM,WAAW;AAAA,EAClB;AAAA,EAED,iBAAiB;AAEf,oBAAgB,sBAAsB,MAAM;AAAA,EAChD;AACA;AAEA,MAAe,YAAA;AAAA,EACb,OAAO,SAAS,KAAK;AAAA,EACrB;AACF;"}
1
+ {"version":3,"file":"chat.store.js","sources":["../../../../../../src/modules/chats/store/chat.store.js"],"sourcesContent":["import { reactive, readonly } from 'vue';\nimport globalWebSocket from '@martyrs/src/modules/globals/views/classes/globals.websocket.js';\n\nconst state = reactive({\n messages: [],\n currentChatId: null,\n username: null\n});\n\nconst methods = {\n async connectWebSocket(user) {\n // Use the global WebSocket instance\n try {\n console.log('connect', user);\n await globalWebSocket.connect(user);\n\n // Remove any existing 'message' listeners for the 'chat' module to avoid duplicates\n globalWebSocket.removeModuleListeners('chat');\n\n // Register chat message event listener\n const listenerId = globalWebSocket.addEventListener('message', (data) => {\n if (data.chatId === state.currentChatId) {\n state.messages.push(data);\n }\n }, { module: 'chat' });\n\n return globalWebSocket;\n } catch (error) {\n console.error('Failed to connect to WebSocket:', error);\n throw error;\n }\n },\n\n setMessages(messages) {\n console.log(process.env.API_URL);\n state.messages = messages;\n },\n\n async addMessage(message) {\n await globalWebSocket.send(message);\n },\n\n async setCurrentChat(chatId) {\n state.currentChatId = chatId;\n state.messages = []; // Clear current messages when changing chat\n\n // Send join chat message through the WebSocket\n globalWebSocket.send({ type: 'joinChat', chatId });\n\n // Fetch chat history\n const response = await fetch(`/messages/${chatId}`);\n const messages = await response.json();\n\n methods.setMessages(messages);\n },\n\n setUsername(username) {\n state.username = username;\n },\n\n disconnectChat() {\n // Remove all chat-specific listeners when leaving chat page\n globalWebSocket.removeModuleListeners('chat');\n // Optionally disconnect the WebSocket if no longer needed\n // globalWebSocket.disconnect(); // Uncomment if you want to fully disconnect\n }\n};\n\nexport default {\n state: readonly(state),\n methods\n};"],"names":[],"mappings":";;AAGA,MAAM,QAAQ,SAAS;AAAA,EACrB,UAAU,CAAE;AAAA,EACZ,eAAe;AAAA,EACf,UAAU;AACZ,CAAC;AAED,MAAM,UAAU;AAAA,EACd,MAAM,iBAAiB,MAAM;AAE3B,QAAI;AACF,cAAQ,IAAI,WAAW,IAAI;AAC3B,YAAM,gBAAgB,QAAQ,IAAI;AAGlC,sBAAgB,sBAAsB,MAAM;AAG5C,YAAM,aAAa,gBAAgB,iBAAiB,WAAW,CAAC,SAAS;AACvE,YAAI,KAAK,WAAW,MAAM,eAAe;AACvC,gBAAM,SAAS,KAAK,IAAI;AAAA,QAClC;AAAA,MACA,GAAS,EAAE,QAAQ,QAAQ;AAErB,aAAO;AAAA,IACR,SAAQ,OAAO;AACd,cAAQ,MAAM,mCAAmC,KAAK;AACtD,YAAM;AAAA,IACZ;AAAA,EACG;AAAA,EAED,YAAY,UAAU;AACpB,YAAQ,IAAI,QAAQ,IAAI,OAAO;AAC/B,UAAM,WAAW;AAAA,EAClB;AAAA,EAED,MAAM,WAAW,SAAS;AACxB,UAAM,gBAAgB,KAAK,OAAO;AAAA,EACnC;AAAA,EAED,MAAM,eAAe,QAAQ;AAC3B,UAAM,gBAAgB;AACtB,UAAM,WAAW;AAGjB,oBAAgB,KAAK,EAAE,MAAM,YAAY,OAAM,CAAE;AAGjD,UAAM,WAAW,MAAM,MAAM,aAAa,MAAM,EAAE;AAClD,UAAM,WAAW,MAAM,SAAS,KAAM;AAEtC,YAAQ,YAAY,QAAQ;AAAA,EAC7B;AAAA,EAED,YAAY,UAAU;AACpB,UAAM,WAAW;AAAA,EAClB;AAAA,EAED,iBAAiB;AAEf,oBAAgB,sBAAsB,MAAM;AAAA,EAGhD;AACA;AAEA,MAAe,YAAA;AAAA,EACb,OAAO,SAAS,KAAK;AAAA,EACrB;AACF;"}
@@ -45,16 +45,14 @@ class GlobalWebSocket {
45
45
  if (typeof window === "undefined") {
46
46
  return Promise.resolve(false);
47
47
  }
48
- if (this.isConnected && this.userId === userId && this.socket) {
49
- return Promise.resolve(this.socket);
50
- }
51
48
  this.userId = userId;
52
- if (this.connectPromise) {
53
- return this.connectPromise;
49
+ if (this.isConnected && this.socket && this.socket.readyState === WebSocket.OPEN) {
50
+ return Promise.resolve(this.socket);
54
51
  }
52
+ this.connectPromise = null;
55
53
  this.connectPromise = new Promise((resolve, reject) => {
56
54
  this.disconnect();
57
- const wsUrl = userId ? `${this.baseUrl}?userId=${userId}` : this.baseUrl;
55
+ const wsUrl = userId ? `${this.baseUrl}?userId=${encodeURIComponent(userId)}` : this.baseUrl;
58
56
  this.socket = new WebSocket(wsUrl);
59
57
  this.socket.onopen = () => {
60
58
  this._handleOpen();
@@ -105,14 +103,14 @@ class GlobalWebSocket {
105
103
  * @param {Object|String} data - Data to send
106
104
  * @returns {Boolean} Success status
107
105
  */
108
- send(data) {
106
+ async send(data) {
109
107
  if (!this.socket || this.socket.readyState !== WebSocket.OPEN) {
110
108
  console.error("Cannot send message: WebSocket is not connected");
111
109
  return false;
112
110
  }
113
111
  try {
114
112
  const message = typeof data === "string" ? data : JSON.stringify(data);
115
- this.socket.send(message);
113
+ await this.socket.send(message);
116
114
  return true;
117
115
  } catch (error) {
118
116
  console.error("Error sending WebSocket message:", error);