@ozdao/prometheus-framework 0.2.29 → 0.2.31

Sign up to get free protection for your applications and to get access to all the features.
Files changed (326) hide show
  1. package/dist/addMembersQuantity-3505b6f3.mjs +98 -0
  2. package/dist/addMembersQuantity-fb552ca0.js +97 -0
  3. package/dist/auth.server.js +6 -9
  4. package/dist/auth.server.mjs +6 -9
  5. package/dist/community.server.js +28 -21
  6. package/dist/community.server.mjs +28 -21
  7. package/dist/events.server.js +1 -1
  8. package/dist/events.server.mjs +1 -1
  9. package/dist/files.server.js +114 -111
  10. package/dist/files.server.mjs +114 -111
  11. package/dist/gallery.server.js +3 -3
  12. package/dist/gallery.server.mjs +3 -3
  13. package/dist/globals.server.js +1 -1
  14. package/dist/globals.server.mjs +1 -1
  15. package/dist/index-a8dffc0c.js +213 -0
  16. package/dist/index-d769324d.mjs +214 -0
  17. package/dist/mailing-37c2ba41.mjs +68 -0
  18. package/dist/mailing-fe16a26a.js +67 -0
  19. package/dist/main.css +1 -1
  20. package/dist/middlewares.server.js +1 -1
  21. package/dist/middlewares.server.mjs +1 -1
  22. package/dist/organizations.server.js +125 -25
  23. package/dist/organizations.server.mjs +125 -25
  24. package/dist/prometheus-framework/src/components/Dropdown/Dropdown.vue.cjs +1 -1
  25. package/dist/prometheus-framework/src/components/Dropdown/Dropdown.vue.js +49 -2
  26. package/dist/prometheus-framework/src/components/Dropdown/Dropdown.vue2.cjs +1 -1
  27. package/dist/prometheus-framework/src/components/Dropdown/Dropdown.vue2.js +2 -49
  28. package/dist/prometheus-framework/src/components/Select/Select.vue.cjs +1 -1
  29. package/dist/prometheus-framework/src/components/Select/Select.vue.js +78 -2
  30. package/dist/prometheus-framework/src/components/Select/Select.vue2.cjs +1 -1
  31. package/dist/prometheus-framework/src/components/Select/Select.vue2.js +2 -78
  32. package/dist/prometheus-framework/src/modules/backoffice/components/pages/Dashboard.vue.cjs +1 -1
  33. package/dist/prometheus-framework/src/modules/backoffice/components/pages/Dashboard.vue.js +1 -1
  34. package/dist/prometheus-framework/src/modules/community/components/layouts/Community.vue.cjs +1 -1
  35. package/dist/prometheus-framework/src/modules/community/components/layouts/Community.vue.js +1 -1
  36. package/dist/prometheus-framework/src/modules/community/components/pages/CreateBlogPost.vue.cjs +1 -1
  37. package/dist/prometheus-framework/src/modules/community/components/pages/CreateBlogPost.vue.js +1 -1
  38. package/dist/prometheus-framework/src/modules/constructor/components/elements/Textarea.vue.cjs +4 -1
  39. package/dist/prometheus-framework/src/modules/constructor/components/elements/Textarea.vue.js +62 -2
  40. package/dist/prometheus-framework/src/modules/constructor/components/elements/Textarea.vue2.cjs +1 -4
  41. package/dist/prometheus-framework/src/modules/constructor/components/elements/Textarea.vue2.js +2 -62
  42. package/dist/prometheus-framework/src/modules/constructor/components/sections/Constructor.vue.cjs +1 -1
  43. package/dist/prometheus-framework/src/modules/constructor/components/sections/Constructor.vue.js +1 -1
  44. package/dist/prometheus-framework/src/modules/events/components/layouts/layoutEvents.vue.cjs +1 -1
  45. package/dist/prometheus-framework/src/modules/events/components/layouts/layoutEvents.vue.js +1 -1
  46. package/dist/prometheus-framework/src/modules/events/components/pages/EditEvent.vue.cjs +1 -1
  47. package/dist/prometheus-framework/src/modules/events/components/pages/EditEvent.vue.js +1 -1
  48. package/dist/prometheus-framework/src/modules/events/components/pages/Events.vue.cjs +1 -1
  49. package/dist/prometheus-framework/src/modules/events/components/pages/Events.vue.js +2 -2
  50. package/dist/prometheus-framework/src/modules/gallery/components/sections/BackofficeGallery.vue.cjs +1 -1
  51. package/dist/prometheus-framework/src/modules/gallery/components/sections/BackofficeGallery.vue.js +1 -1
  52. package/dist/prometheus-framework/src/modules/gallery/components/sections/GalleryWithCategories.vue.cjs +1 -1
  53. package/dist/prometheus-framework/src/modules/gallery/components/sections/GalleryWithCategories.vue.js +1 -1
  54. package/dist/prometheus-framework/src/modules/globals/components/blocks/CardHeader.vue.cjs +1 -1
  55. package/dist/prometheus-framework/src/modules/globals/components/blocks/CardHeader.vue.js +1 -1
  56. package/dist/prometheus-framework/src/modules/legal/components/pages/Legal.vue.cjs +1 -1
  57. package/dist/prometheus-framework/src/modules/legal/components/pages/Legal.vue.js +1 -1
  58. package/dist/prometheus-framework/src/modules/mobile/components/Menu/Menu.vue.cjs +1 -1
  59. package/dist/prometheus-framework/src/modules/mobile/components/Menu/Menu.vue.js +11 -2
  60. package/dist/prometheus-framework/src/modules/mobile/components/Menu/Menu.vue2.cjs +1 -1
  61. package/dist/prometheus-framework/src/modules/mobile/components/Menu/Menu.vue2.js +2 -11
  62. package/dist/prometheus-framework/src/modules/organizations/components/blocks/DepartmentMemberModify.vue.cjs +1 -1
  63. package/dist/prometheus-framework/src/modules/organizations/components/blocks/DepartmentMemberModify.vue.js +1 -1
  64. package/dist/prometheus-framework/src/modules/organizations/components/pages/DepartmentEdit.vue.cjs +1 -1
  65. package/dist/prometheus-framework/src/modules/organizations/components/pages/DepartmentEdit.vue.js +1 -1
  66. package/dist/prometheus-framework/src/modules/organizations/components/pages/Organization.vue.cjs +1 -1
  67. package/dist/prometheus-framework/src/modules/organizations/components/pages/Organization.vue.js +2 -2
  68. package/dist/prometheus-framework/src/modules/organizations/components/pages/OrganizationEdit.vue.cjs +1 -1
  69. package/dist/prometheus-framework/src/modules/organizations/components/pages/OrganizationEdit.vue.js +1 -1
  70. package/dist/prometheus-framework/src/modules/organizations/components/sections/DetailsTab.vue.cjs +1 -1
  71. package/dist/prometheus-framework/src/modules/organizations/components/sections/DetailsTab.vue.js +1 -1
  72. package/dist/prometheus-framework/src/modules/organizations/components/sections/MembersAdd.vue.cjs +1 -1
  73. package/dist/prometheus-framework/src/modules/organizations/components/sections/MembersAdd.vue.js +1 -1
  74. package/dist/prometheus-framework/src/modules/organizations/components/sections/Organizations.vue.cjs +1 -1
  75. package/dist/prometheus-framework/src/modules/organizations/components/sections/Organizations.vue.js +2 -2
  76. package/dist/prometheus-framework/src/modules/reports/components/sections/FormReport.vue.cjs +1 -1
  77. package/dist/prometheus-framework/src/modules/reports/components/sections/FormReport.vue.js +1 -1
  78. package/dist/prometheus-framework/src/modules/users/components/pages/Profile.vue.cjs +1 -1
  79. package/dist/prometheus-framework/src/modules/users/components/pages/Profile.vue.js +2 -2
  80. package/dist/prometheus-framework.cjs.js +30 -29
  81. package/dist/prometheus-framework.es.js +2478 -2282
  82. package/dist/reports.server.js +1 -1
  83. package/dist/reports.server.mjs +1 -1
  84. package/dist/style.css +1 -1
  85. package/dist/users.server.js +1 -1
  86. package/dist/users.server.mjs +1 -1
  87. package/package.json +4 -2
  88. package/src/assets/images/logo.svg +7 -7
  89. package/src/components/Block/Block.vue +77 -0
  90. package/src/components/Breadcrumbs/Breadcrumbs.vue +2 -2
  91. package/src/components/Button/Button.vue +32 -227
  92. package/src/components/Checkbox/Checkbox.vue +1 -1
  93. package/src/components/Chips/Chips.vue +8 -8
  94. package/src/components/DatePicker/DatePicker.vue +3 -4
  95. package/src/components/EditImages/EditImages.vue +32 -14
  96. package/src/{modules/globals/components/sections → components/Feed}/Feed.vue +60 -45
  97. package/src/components/FieldBig/FieldBig.vue +16 -5
  98. package/src/components/FieldPhone/FieldPhone.vue +2 -1
  99. package/src/components/Footer/Footer.vue +36 -27
  100. package/src/components/Header/Header.vue +161 -166
  101. package/src/components/Loader/Loader.vue +9 -2
  102. package/src/components/LocationMarker/LocationMarker.vue +38 -12
  103. package/src/components/LocationSelection/LocationSelection.vue +67 -75
  104. package/src/components/Magnifier/Magnifier.vue +3 -3
  105. package/src/components/Navigation/Navigation.vue +16 -16
  106. package/src/components/Popup/Popup.vue +8 -6
  107. package/src/components/Select/Select.vue +35 -6
  108. package/src/components/SelectMulti/SelectMulti.vue +5 -13
  109. package/src/components/Shader/Shader.vue +128 -0
  110. package/src/components/Sidebar/Sidebar.vue +71 -35
  111. package/src/components/Spoiler/Spoiler.vue +1 -1
  112. package/src/components/Tab/Tab.vue +1 -1
  113. package/src/components/Tooltip/Tooltip.vue +1 -1
  114. package/src/components/UploadImage/UploadImage.vue +4 -4
  115. package/src/components/UploadImageMultiple/UploadImageMultiple.vue +54 -10
  116. package/src/modules/applications/controllers/applications.controller.js +0 -1
  117. package/src/modules/auth/components/pages/EnterCode.vue +1 -1
  118. package/src/modules/auth/components/pages/EnterPassword.vue +3 -3
  119. package/src/modules/auth/components/pages/ResetPassword.vue +1 -2
  120. package/src/modules/auth/components/pages/SignIn.vue +26 -10
  121. package/src/modules/auth/components/pages/SignUp.vue +1 -2
  122. package/src/modules/auth/controllers/twofa.controller.js +4 -4
  123. package/src/modules/auth/localization/EnterCode.json +2 -2
  124. package/src/modules/auth/localization/EnterPassword.json +2 -2
  125. package/src/modules/auth/localization/ResetPassword.json +2 -2
  126. package/src/modules/auth/localization/SignIn.json +3 -3
  127. package/src/modules/auth/localization/SignUp.json +3 -3
  128. package/src/modules/auth/utils/server/verifyAppleIdToken.js +0 -1
  129. package/src/modules/backoffice/components/layouts/Backoffice.vue +1 -1
  130. package/src/modules/backoffice/components/pages/Dashboard.vue +171 -120
  131. package/src/modules/backoffice/router/backoffice.js +119 -129
  132. package/src/modules/chats/components/blocks/ChatMessage.vue +25 -0
  133. package/src/modules/chats/components/pages/ChatPage.vue +50 -0
  134. package/src/modules/chats/components/sections/ChatWindow.vue +38 -0
  135. package/src/modules/chats/controllers/chats.controller.js +32 -0
  136. package/src/modules/chats/models/chat.model.js +26 -0
  137. package/src/modules/chats/routes/chats.routes.js +53 -0
  138. package/src/modules/chats/store/chat.store.js +61 -0
  139. package/src/modules/community/components/blocks/CardBlogpost.vue +19 -4
  140. package/src/modules/community/components/layouts/Community.vue +96 -39
  141. package/src/modules/community/components/pages/Blog.vue +4 -3
  142. package/src/modules/community/components/pages/BlogPost.vue +10 -1
  143. package/src/modules/community/components/pages/CreateBlogPost.vue +36 -17
  144. package/src/modules/community/components/sections/HotPosts.vue +3 -3
  145. package/src/modules/community/components/sections/JoinUs.vue +19 -13
  146. package/src/modules/community/controllers/blog.controller.js +3 -4
  147. package/src/modules/community/controllers/utils/queryProcessor.js +16 -17
  148. package/src/modules/community/models/blogpost.model.js +6 -3
  149. package/src/modules/community/store/blogposts.js +1 -0
  150. package/src/modules/constructor/components/elements/Embed.vue +12 -1
  151. package/src/modules/constructor/components/elements/ImageUpload.vue +2 -2
  152. package/src/modules/constructor/components/elements/Textarea.vue +6 -1
  153. package/src/modules/constructor/components/elements/Video.vue +79 -0
  154. package/src/modules/constructor/components/elements/VideoPlayer.vue +59 -0
  155. package/src/modules/constructor/components/elements/Youtube.vue +52 -0
  156. package/src/modules/constructor/components/sections/Constructor.vue +27 -3
  157. package/src/modules/events/components/layouts/layoutEvents.vue +7 -28
  158. package/src/modules/files/controllers/files.controller.js +9 -22
  159. package/src/modules/files/middlewares/server/index.js +2 -2
  160. package/src/modules/files/middlewares/server/middlewareBusboy.js +137 -0
  161. package/src/modules/files/routes/files.routes.js +9 -9
  162. package/src/modules/globals/localization/vue-i18n.js +8 -1
  163. package/src/modules/globals/mixins/mixins.js +23 -13
  164. package/src/modules/globals/router/routerGuards.js +2 -2
  165. package/src/modules/globals/store/globals.js +86 -9
  166. package/src/modules/globals/utils/mailing.js +24 -3
  167. package/src/modules/icons/entities/IconCommunity.vue +4 -4
  168. package/src/modules/icons/entities/IconEvents.vue +1 -1
  169. package/src/modules/icons/entities/IconGroups.vue +1 -1
  170. package/src/modules/icons/entities/IconPrice.vue +5 -0
  171. package/src/modules/icons/entities/IconProfile.vue +5 -0
  172. package/src/modules/icons/entities/IconShopcart.vue +5 -0
  173. package/src/modules/icons/entities/IconTime.vue +5 -0
  174. package/src/modules/icons/icons.client.js +4 -0
  175. package/src/modules/icons/labels/LabelAppStore.vue +24 -24
  176. package/src/modules/icons/labels/LabelGooglePlay.vue +9 -9
  177. package/src/modules/icons/logos/Logotype.vue +20 -0
  178. package/src/modules/icons/navigation/IconAdd.vue +17 -0
  179. package/src/modules/icons/navigation/IconChevronBottom.vue +18 -0
  180. package/src/modules/icons/navigation/IconChevronRight.vue +3 -3
  181. package/src/modules/icons/navigation/IconDelete.vue +19 -0
  182. package/src/modules/icons/navigation/IconMinus.vue +15 -0
  183. package/src/modules/icons/navigation/IconSearch.vue +17 -0
  184. package/src/modules/icons/navigation/IconUpload.vue +16 -0
  185. package/src/modules/icons/placeholders/PlaceholderImage.vue +5 -0
  186. package/src/modules/icons/placeholders/PlaceholderOrganizationPic.vue +20 -0
  187. package/src/modules/icons/placeholders/PlaceholderUserpic.vue +4 -18
  188. package/src/modules/icons/socials/instagram.vue +1 -1
  189. package/src/modules/icons/socials/line.vue +1 -1
  190. package/src/modules/icons/socials/reddit.vue +1 -1
  191. package/src/modules/icons/socials/telegram.vue +1 -1
  192. package/src/modules/icons/socials/twitter.vue +1 -1
  193. package/src/modules/icons/socials/youtube.vue +1 -1
  194. package/src/modules/landing/components/sections/Guide.vue +92 -0
  195. package/src/modules/landing/components/sections/MobileApp.vue +23 -12
  196. package/src/modules/marketplace/components/layouts/Marketplace.vue +76 -188
  197. package/src/modules/marketplace/components/pages/Catalog.vue +65 -119
  198. package/src/modules/marketplace/components/sections/Filters.vue +195 -0
  199. package/src/modules/marketplace/store/marketplace.js +2 -2
  200. package/src/modules/middlewares/client/auth.validation.js +0 -6
  201. package/src/modules/middlewares/client/states.validation.js +2 -8
  202. package/src/modules/middlewares/server/authJwt.js +1 -1
  203. package/src/modules/mobile/components/Menu/MenuItem.vue +3 -6
  204. package/src/modules/openai/controllers/openai.controller.js +0 -1
  205. package/src/modules/orders/components/blocks/CardOrder.vue +166 -0
  206. package/src/modules/orders/components/blocks/CardOrderItem.vue +59 -66
  207. package/src/modules/orders/components/blocks/Positions.vue +4 -4
  208. package/src/modules/orders/components/pages/EditOrder.vue +78 -142
  209. package/src/modules/orders/components/pages/FormOrder.vue +192 -0
  210. package/src/modules/orders/components/pages/Order.vue +326 -120
  211. package/src/modules/orders/components/pages/Orders.vue +13 -9
  212. package/src/modules/orders/components/pages/{ViewOrder.vue → Orders_refact.vue} +13 -10
  213. package/src/modules/orders/components/partials/ShopCart.vue +22 -13
  214. package/src/modules/orders/components/sections/EmptyState.vue +1 -1
  215. package/src/modules/orders/components/sections/{Form.vue → FormOrderDetails.vue} +38 -106
  216. package/src/modules/orders/controllers/orders.controller.js +37 -28
  217. package/src/modules/orders/models/order.model.js +39 -9
  218. package/src/modules/orders/router/orders.router.js +23 -2
  219. package/src/modules/orders/routes/orders.routes.js +14 -17
  220. package/src/modules/orders/store/orders.js +24 -9
  221. package/src/modules/orders/store/shopcart.js +20 -19
  222. package/src/modules/organizations/components/blocks/CardDepartment.vue +1 -1
  223. package/src/modules/organizations/components/blocks/CardOrganization.vue +98 -46
  224. package/src/modules/organizations/components/blocks/Rating.vue +1 -1
  225. package/src/modules/organizations/components/blocks/Socials.vue +11 -3
  226. package/src/modules/organizations/components/elements/ButtonToggleMembership.vue +1 -1
  227. package/src/modules/organizations/components/pages/Department.vue +1 -1
  228. package/src/modules/organizations/components/pages/DepartmentEdit.vue +4 -4
  229. package/src/modules/organizations/components/pages/Members.vue +6 -4
  230. package/src/modules/organizations/components/pages/Organization.vue +120 -49
  231. package/src/modules/organizations/components/pages/OrganizationEdit.vue +8 -1
  232. package/src/modules/organizations/components/pages/Organizations.vue +27 -6
  233. package/src/modules/organizations/components/sections/DetailsTab.vue +11 -9
  234. package/src/modules/organizations/components/sections/Feed.vue +0 -3
  235. package/src/modules/organizations/components/sections/FeedDepartments.vue +2 -2
  236. package/src/modules/organizations/controllers/organizations.controller.js +126 -15
  237. package/src/modules/organizations/controllers/utils/addMembersQuantity.js +19 -9
  238. package/src/modules/organizations/models/organization.model.js +5 -2
  239. package/src/modules/organizations/router/members.router.js +1 -3
  240. package/src/modules/organizations/router/organizations.js +8 -6
  241. package/src/modules/organizations/router/products.router.js +36 -2
  242. package/src/modules/organizations/store/organizations.js +38 -84
  243. package/src/modules/pages/controllers/pages.controller.js +0 -4
  244. package/src/modules/payments/controller/payments.controller.js +1 -1
  245. package/src/modules/products/components/blocks/CardLeftover.vue +17 -22
  246. package/src/modules/products/components/blocks/CardPosition.vue +96 -49
  247. package/src/modules/products/components/blocks/CardProduct.vue +24 -53
  248. package/src/modules/products/components/blocks/Images360.vue +4 -4
  249. package/src/modules/products/components/blocks/ImagesThumbnails.vue +2 -7
  250. package/src/modules/products/components/blocks/ListPositions.vue +74 -0
  251. package/src/modules/products/components/elements/Price.vue +11 -5
  252. package/src/modules/products/components/elements/THC.vue +6 -6
  253. package/src/modules/products/components/pages/{LeftoverAdd.vue → EditLeftover.vue} +93 -79
  254. package/src/modules/products/components/pages/Leftovers.vue +74 -70
  255. package/src/modules/products/components/pages/Product.vue +4 -7
  256. package/src/modules/products/components/pages/ProductEdit.vue +230 -88
  257. package/src/modules/products/components/pages/ProductRecommmendation.vue +1 -1
  258. package/src/modules/products/components/pages/Products.vue +6 -3
  259. package/src/modules/products/components/pages/ProductsBackoffice.vue +3 -5
  260. package/src/modules/products/components/sections/EditModifications.vue +3 -3
  261. package/src/modules/products/components/sections/EditProductInfo.vue +40 -50
  262. package/src/modules/products/components/sections/FilterProducts.vue +57 -18
  263. package/src/modules/products/components/sections/HeroRecommendation.vue +233 -99
  264. package/src/modules/products/components/sections/MenuSection.vue +127 -0
  265. package/src/modules/products/components/sections/PopularProducts.vue +81 -37
  266. package/src/modules/products/components/sections/SectionProduct.vue +21 -23
  267. package/src/modules/products/controllers/leftovers.controller.js +11 -1
  268. package/src/modules/products/controllers/products.controller.js +100 -97
  269. package/src/modules/products/models/leftover.model.js +6 -4
  270. package/src/modules/products/models/product.model.js +13 -1
  271. package/src/modules/products/routes/products.routes.js +4 -4
  272. package/src/modules/products/store/leftovers.js +4 -24
  273. package/src/modules/products/store/products.js +44 -30
  274. package/src/modules/spots/components/blocks/CardSpot.vue +43 -72
  275. package/src/modules/spots/components/layouts/Spots.vue +9 -91
  276. package/src/modules/spots/components/pages/Map.vue +171 -62
  277. package/src/modules/spots/components/pages/Spot.vue +1 -1
  278. package/src/modules/spots/components/pages/SpotEdit.vue +131 -174
  279. package/src/modules/spots/controllers/spots.controller.js +1 -0
  280. package/src/modules/spots/models/spot.model.js +6 -3
  281. package/src/modules/spots/store/spots.js +42 -48
  282. package/src/modules/users/components/pages/Profile.vue +6 -28
  283. package/src/modules/users/components/pages/ProfileBlogposts.vue +1 -1
  284. package/src/modules/users/components/pages/ProfileEdit.vue +1 -1
  285. package/src/modules/users/components/pages/ProfileEvents.vue +1 -1
  286. package/src/modules/users/components/pages/ProfileOrganizations.vue +1 -1
  287. package/src/modules/users/router/users.js +1 -1
  288. package/src/modules/wallet/components/pages/Wallet.vue +105 -109
  289. package/src/modules/wallet/controllers/crypto.controller.js +129 -0
  290. package/src/modules/wallet/models/reward.model.js +53 -0
  291. package/src/modules/wallet/routes/crypto.routes.js +36 -0
  292. package/src/modules/wallet/store/wallet.js +52 -49
  293. package/src/styles/base/all.scss +144 -12
  294. package/src/styles/base/backgrounds.scss +2 -34
  295. package/src/styles/base/borders.scss +18 -23
  296. package/src/styles/base/scrolling.scss +97 -29
  297. package/src/styles/base/{shadows.scss → shadow_transitions_hover_refactor.scss} +55 -2
  298. package/src/styles/config.scss +69 -17
  299. package/src/styles/layout.scss +12 -182
  300. package/src/styles/reset.scss +20 -21
  301. package/src/styles/responsive.scss +4 -67
  302. package/src/styles/theme.scss +3 -4
  303. package/src/styles/typography.scss +15 -17
  304. package/src/assets/fonts/AvenirNext-Bold.woff2 +0 -0
  305. package/src/assets/fonts/AvenirNext-DemiBold.woff2 +0 -0
  306. package/src/assets/fonts/AvenirNext-Heavy.woff2 +0 -0
  307. package/src/assets/fonts/AvenirNext-Medium.woff2 +0 -0
  308. package/src/assets/fonts/AvenirNext-Regular.woff2 +0 -0
  309. package/src/assets/fonts/AvenirNext-UltraLight.woff2 +0 -0
  310. package/src/modules/files/middlewares/server/md.js +0 -152
  311. package/src/modules/files/middlewares/server/middlewareMulter.js +0 -121
  312. package/src/modules/organizations/controllers/organizations.new.controller.js +0 -372
  313. package/src/modules/products/components/blocks/EditCategories.vue +0 -68
  314. package/src/modules/products/components/sections/EditParameters.vue +0 -58
  315. package/src/modules/products/components/sections/EditProductImages.vue +0 -67
  316. package/src/modules/spots/components/sections/Feed.vue +0 -64
  317. package/src/styles/base/border-radius.scss +0 -47
  318. package/src/styles/base/cursors.scss +0 -23
  319. package/src/styles/base/height.scss +0 -60
  320. package/src/styles/base/hovers.scss +0 -110
  321. package/src/styles/base/positions.scss +0 -192
  322. package/src/styles/base/transitions.scss +0 -137
  323. package/src/styles/base/width.scss +0 -2
  324. package/src/styles/components/block.scss +0 -18
  325. package/src/styles/components/breadcrumbs.scss +0 -0
  326. package/src/styles/components/input.scss +0 -319
@@ -0,0 +1,38 @@
1
+ <template>
2
+ <div class="chat-window">
3
+ <div class="h-max-20r o-scroll flex-nowrap flex-column flex gap-thin ">
4
+ <ChatMessage
5
+ v-for="message in messages"
6
+ :key="message._id"
7
+ :message="message"
8
+ />
9
+ </div>
10
+ <input class="bg-main w-100 radius-big pd-small" placeholder="Enter your message" type="text" v-model="newMessage" @keyup.enter="sendMessage" />
11
+ </div>
12
+ </template>
13
+
14
+ <script setup>
15
+ import { ref, computed } from 'vue';
16
+ import ChatMessage from '../blocks/ChatMessage.vue';
17
+ import chatStore from '../../store/chat.store.js';
18
+
19
+ const newMessage = ref('');
20
+ const messages = computed(() => chatStore.state.messages);
21
+
22
+ const sendMessage = () => {
23
+ if (newMessage.value) {
24
+
25
+ const message = {
26
+ text: newMessage.value,
27
+ username: chatStore.state.username,
28
+ chatId: chatStore.state.currentChatId
29
+ };
30
+ chatStore.methods.addMessage(message);
31
+ newMessage.value = '';
32
+ }
33
+ };
34
+ </script>
35
+
36
+ <style>
37
+ /* Стили остаются без изменений */
38
+ </style>
@@ -0,0 +1,32 @@
1
+ const { sendChatMessageTelegram } = require('@pf/src/modules/globals/utils/mailing');
2
+
3
+
4
+ const controllerFactory = (db) => {
5
+ const ChatMessage = db.ChatMessage;
6
+
7
+ const saveMessage = async (msg) => {
8
+ try {
9
+ const message = new ChatMessage(msg);
10
+ await message.save();
11
+ return message;
12
+ } catch (error) {
13
+ console.error("Error saving message to database:", error);
14
+ }
15
+ };
16
+
17
+ const getMessages = async (chatId) => {
18
+ try {
19
+ const messages = await ChatMessage.find({ chatId }).sort({ createdAt: 1 });
20
+ return messages;
21
+ } catch (error) {
22
+ console.error("Error retrieving messages from database:", error);
23
+ }
24
+ };
25
+
26
+ return {
27
+ saveMessage,
28
+ getMessages,
29
+ };
30
+ };
31
+
32
+ module.exports = controllerFactory;
@@ -0,0 +1,26 @@
1
+ module.exports = (db) => {
2
+
3
+ const ChatMessageSchema = new db.mongoose.Schema({
4
+ username: {
5
+ type: String,
6
+ required: true
7
+ },
8
+ chatId: {
9
+ type: String,
10
+ required: true
11
+ },
12
+ text: {
13
+ type: String,
14
+ required: true
15
+ },
16
+ createdAt: {
17
+ type: Date,
18
+ default: Date.now
19
+ }
20
+ });
21
+
22
+ const ChatMessage = db.mongoose.model('ChatMessage', ChatMessageSchema);
23
+
24
+ return ChatMessage;
25
+ };
26
+
@@ -0,0 +1,53 @@
1
+ // Factories
2
+ const controllerFactory = require('../controllers/chats.controller.js');
3
+ // Middlewares
4
+ const middlewareFactory = require('@pf/src/modules/middlewares/server');
5
+ // Routes
6
+ module.exports = function(app, db, wss) {
7
+ const controller = controllerFactory(db);
8
+
9
+ const { verifySignUp, verifyUser } = middlewareFactory(db);
10
+
11
+ wss.on('connection', (ws) => {
12
+ console.log('ws connecting...')
13
+ console.log(ws)
14
+
15
+ ws.on('message', async (message) => {
16
+ const msg = JSON.parse(message);
17
+
18
+ if (msg.type === 'joinChat') {
19
+ // Обработка joinChat
20
+ ws.chatId = msg.chatId;
21
+ console.log(`Client joined chat: ${msg.chatId}`);
22
+ } else {
23
+ // Обработка обычных сообщений чата
24
+ const savedMessage = await controller.saveMessage(msg);
25
+
26
+ // Отправка сообщения всем клиентам в том же чате
27
+ wss.clients.forEach((client) => {
28
+ if (client.chatId && client.chatId.toString() === msg.chatId) {
29
+ client.send(JSON.stringify(savedMessage));
30
+ }
31
+ });
32
+ }
33
+ });
34
+ });
35
+
36
+
37
+ app.use(function(req, res, next) {
38
+ res.header(
39
+ "Access-Control-Allow-Headers",
40
+ "Access-Control-Allow-Origin: *",
41
+ "x-access-token, Origin, Content-Type, Accept"
42
+ );
43
+ next();
44
+ });
45
+
46
+ // REST API для получения истории сообщений
47
+ app.get('/messages/:chatId', async (req, res) => {
48
+ const { chatId } = req.params;
49
+ const messages = await controller.getMessages(chatId);
50
+ res.json(messages);
51
+ });
52
+ };
53
+
@@ -0,0 +1,61 @@
1
+ import { reactive, readonly } from 'vue';
2
+
3
+ const state = reactive({
4
+ messages: [],
5
+ currentChatId: null,
6
+ username: null,
7
+ websocket: null
8
+ });
9
+
10
+ const methods = {
11
+ connectWebSocket() {
12
+ return new Promise(function(resolve, reject) {
13
+ state.websocket = new WebSocket('wss://localhost:8080');
14
+
15
+ state.websocket.onopen = function() {
16
+ resolve(state.websocket);
17
+ };
18
+ state.websocket.onmessage = (event) => {
19
+ const message = JSON.parse(event.data);
20
+
21
+ if (message.chatId === state.currentChatId) {
22
+ methods.addMessage(message);
23
+ }
24
+ };
25
+ state.websocket.onerror = function(err) {
26
+ reject(err);
27
+ };
28
+ });
29
+ },
30
+ setMessages(messages) {
31
+ state.messages = messages;
32
+ },
33
+ addMessage(message) {
34
+ state.messages.push(message);
35
+
36
+ if (state.websocket) {
37
+ state.websocket.send(JSON.stringify(message));
38
+ }
39
+ },
40
+ async setCurrentChat(chatId) {
41
+ state.currentChatId = chatId;
42
+ state.messages = []; // Очистка текущих сообщений при смене чата
43
+
44
+ if (state.websocket) {
45
+ state.websocket.send(JSON.stringify({ type: 'joinChat', chatId }));
46
+ }
47
+
48
+ const response = await fetch(`/messages/${chatId}`);
49
+ const messages = await response.json();
50
+
51
+ methods.setMessages(messages);
52
+ },
53
+ setUsername(username) {
54
+ state.username = username;
55
+ }
56
+ };
57
+
58
+ export default {
59
+ state: readonly(state),
60
+ methods
61
+ };
@@ -37,6 +37,17 @@
37
37
  />
38
38
  </template>
39
39
 
40
+ <template
41
+ v-if="!firstImage?.content && firstVideo && firstVideo.content && type !== 'blogpostPage'"
42
+ >
43
+ <div class="flex-center flex">
44
+ <video controls class="mn-b-medium object-fit-cover w-100 h-20r">
45
+ <source :src="firstVideo.content" type="video/mp4">
46
+ Your browser does not support the video tag.
47
+ </video>
48
+ </div>
49
+ </template>
50
+
40
51
  <section
41
52
  class="pd-t-zero pd-medium"
42
53
  >
@@ -71,9 +82,9 @@
71
82
  <slot></slot>
72
83
 
73
84
  <Chips
74
- v-if="type !== 'short' && blogpost.tags.length > 0"
75
- :chips="blogpost.tags"
76
- />
85
+ v-if="type !== 'short' && blogpost.tags?.length > 0"
86
+ :chips="blogpost.tags"
87
+ />
77
88
 
78
89
  </section>
79
90
 
@@ -103,10 +114,14 @@
103
114
 
104
115
  const props = defineProps(['blogpost','user', 'type'])
105
116
 
106
- const firstImage = computed(() => {
117
+ const firstImage = computed(() => {
107
118
  return props.blogpost.content.find(block => block.type === 'ImageUpload');
108
119
  });
109
120
 
121
+ const firstVideo = computed(() => {
122
+ return props.blogpost.content.find(block => block.type === 'Video');
123
+ });
124
+
110
125
  const firstText = computed(() => {
111
126
  return props.blogpost.content.find(block => block.type === 'Textarea');
112
127
  });
@@ -1,57 +1,105 @@
1
1
  <template>
2
- <div class="min-h-100vh pd-thin">
3
-
4
- <header class="mn-b-thin flex-v-center t-left flex-nowrap flex">
5
- <h2 class="flex-v-center flex-nowrap flex t-left">
6
- <span class="">Topics for </span>
7
-
8
- <Select
9
- :options="['today','week','month','year']"
10
- v-model:select="blog.state.filter.period"
11
- placeholder="Select type"
12
- class="
13
- w-max
14
- mn-l-small
15
- bg-grey
16
- pd-thin
17
- radius-medium
18
- h2
19
- t-center
20
- t-black
21
- "
22
- />
23
- </h2>
24
- </header>
25
-
26
- <ul class="w-100 bg-grey pd-small radius-big mn-b-semi gap-thin flex-nowrap flex">
2
+ <div style="grid-template-columns: 1fr 3fr 1fr;" class="cols-3 gap-thin pd-thin">
3
+
4
+ <ul class="w-100 bg-grey radius-big pd-medium p-medium gap-thin flex-column flex-nowrap flex">
27
5
  <li
28
6
  :class="{'t-white bg-black': route.params.category === 'featured' }"
29
- @click="router.push({name: 'Blog'})"
30
- class="t-medium pd-thin radius-small">👑 Featured</li>
7
+ @click="router.push({name: 'Blog', params: { category: 'featured' } })"
8
+ class="cursor-pointer t-medium pd-thin radius-small">👑 Featured</li>
31
9
  <li
32
10
  :class="{'t-white bg-black': route.params.category === 'popular' }"
33
11
  @click="router.push({name: 'Blog', params: { category: 'popular' } })"
34
- class="t-medium pd-thin radius-small">🔥 Popular</li>
12
+ class="cursor-pointer t-medium pd-thin radius-small">🔥 Popular</li>
35
13
  <li
36
14
  :class="{'t-white bg-black': route.params.category === 'new'}"
37
15
  @click="router.push({name: 'Blog', params: { category: 'new' } })"
38
- class="t-medium pd-thin radius-small">🆕 New</li>
16
+ class="cursor-pointer t-medium pd-thin radius-small">🆕 New</li>
39
17
  <li
40
18
  v-if="auth.state.user._id"
41
19
  :class="{'t-white bg-black': route.params.category === 'following'}"
42
20
  @click="router.push({name: 'Blog', params: { category: 'following' } })"
43
- class="t-medium pd-thin radius-small">👥 Following</li>
21
+ class="cursor-pointer t-medium pd-thin radius-small">👥 Following</li>
22
+
23
+ <router-link :to="{name: 'Create BlogPost'}" class="button mn-t-small bg-main w-100">Create Post</router-link>
44
24
  </ul>
45
25
 
46
- <section class="">
26
+ <section class="pos-relative">
47
27
 
48
- <router-view v-slot="{ Component, route }">
49
- <transition name="scaleIn" mode="out-in">
50
- <component ref="page" :key="route.query" :is="Component" />
51
- </transition>
52
- </router-view>
28
+ <header class="bg-black t-white radius-big pd-medium pos-relative mn-b-thin flex-v-center t-left flex-nowrap flex">
29
+ <h2 class="pos-relative flex-v-center flex-nowrap flex t-left">
30
+ <span class="">Topics for </span>
31
+
32
+ <Select
33
+ :options="['today','week','month','year']"
34
+ v-model:select="blog.state.filter.period"
35
+ placeholder="Select type"
36
+ class="
37
+ pos-relative
38
+ w-max
39
+ mn-l-small
40
+ bg-grey
41
+ pd-thin
42
+ radius-medium
43
+ h2
44
+ t-center
45
+ t-black
46
+ "
47
+ />
48
+ </h2>
49
+ </header>
50
+
51
+ <router-view v-slot="{ Component, route }">
52
+ <transition name="scaleIn" mode="out-in">
53
+ <component ref="page" :key="route.query" :is="Component" />
54
+ </transition>
55
+ </router-view>
56
+
57
+ </section>
53
58
 
54
- </section>
59
+ <div class="bg-grey radius-big pd-medium">
60
+ <div class="gap-thin flex-nowrap flex">
61
+ <p class="mn-b-small">POPULAR COMMUNITIES</p>
62
+ <button class="radius-extra flex-center flex i-medium bg-main ">+</button>
63
+ </div>
64
+
65
+
66
+ <transition name="slide-fade">
67
+ <Feed
68
+ :states="{
69
+ empty: {
70
+ title: 'No Organization Found',
71
+ description: 'Currently, there are no organization available.'
72
+ }
73
+ }"
74
+ :store="{
75
+ read: (options) => organizations.actions.read(options),
76
+ state: organizations.state
77
+ }"
78
+ :options="{
79
+ user: auth.state.user._id,
80
+ sort: 'numberOfMemberships',
81
+ contain: ['blogposts'],
82
+ limit: 10
83
+ }"
84
+ v-slot="{
85
+ items
86
+ }"
87
+ >
88
+ <CardOrganization
89
+ v-for="organization in items"
90
+ :key="organization._id"
91
+ :organization="organization"
92
+ :user="auth.state.user"
93
+ :showProducts="false"
94
+ :showRating="false"
95
+ :showFeatured="false"
96
+ :showFollowers="false"
97
+ @updateMembership="handleMembershipUpdate"
98
+ class="mn-b-thin w-100 pd-0 bg-white radius-big o-hidden"
99
+ />
100
+ </Feed>
101
+ </transition>
102
+ </div>
55
103
  </div>
56
104
  </template>
57
105
 
@@ -60,13 +108,22 @@
60
108
  import { useRoute,useRouter } from 'vue-router'
61
109
 
62
110
  import Select from '@pf/src/components/Select/Select.vue'
111
+ import Feed from '@pf/src/components/Feed/Feed.vue'
112
+ import CardOrganization from '@pf/src/modules/organizations/components/blocks/CardOrganization.vue'
113
+
63
114
  // Import state
64
115
  import * as blog from '@pf/src/modules/community/store/blogposts.js';
65
- import * as auth from '@pf/src/modules/auth/store/auth.js';
116
+ import * as auth from '@pf/src/modules/auth/store/auth'
117
+ import * as organizations from '@pf/src/modules/organizations/store/organizations'
118
+ import * as memberships from '@pf/src/modules/organizations/store/memberships'
66
119
 
67
120
  // State
68
121
  const route = useRoute();
69
- const router = useRouter()
122
+ const router = useRouter();
123
+
124
+ const handleMembershipUpdate = ({ membership, status, target }, statusName, statusNumber) => {
125
+ memberships.mutations.handleMembershipUpdate(organizations.state.current, membership, status, target, statusName, statusNumber)
126
+ };
70
127
 
71
128
  </script>
72
129
 
@@ -25,14 +25,15 @@
25
25
  const route = useRoute();
26
26
  const router = useRouter();
27
27
 
28
- if (!route.params.category) {
29
- route.params.category = 'featured'
30
- }
28
+ // if (!route.params.category) {
29
+ // route.params.category = 'popular'
30
+ // }
31
31
 
32
32
  onMounted(() => {
33
33
 
34
34
  if (route.query) {
35
35
  const query = route.query;
36
+
36
37
  const newFilterValue = {
37
38
  tags: query.tags ? query.tags.split(',') : [],
38
39
  period: query.period ? query.period : 'week',
@@ -46,8 +46,14 @@
46
46
  class="mn-b-regular"
47
47
  />
48
48
  </section>
49
+
50
+ <a v-if="blogpost.source" :href="blogpost.source" target="_blank" class="mn-b-semi d-block w-max radius-big pd-thin bg-black t-white">
51
+ Check Source 🔗
52
+ </a>
53
+
49
54
  </CardBlogpost>
50
55
 
56
+
51
57
  <Publics
52
58
  class="mn-b-small"
53
59
  />
@@ -76,6 +82,7 @@
76
82
  import Comments from '@pf/src/modules/community/components/sections/Comments.vue';
77
83
 
78
84
  import Image from '@pf/src/modules/constructor/components/elements/Image.vue';
85
+ import VideoPlayer from '@pf/src/modules/constructor/components/elements/VideoPlayer.vue';
79
86
 
80
87
  import * as blog from '@pf/src/modules/community/store/blogposts.js';
81
88
  import * as auth from '@pf/src/modules/auth/store/auth';
@@ -102,7 +109,9 @@
102
109
  'H2': 'h2',
103
110
  'Bullets': 'p',
104
111
  'Caption': 'p',
105
- 'ImageUpload': Image
112
+ 'ImageUpload': Image,
113
+ 'Video': VideoPlayer,
114
+ 'Link': 'a'
106
115
  };
107
116
 
108
117
  function getBlockProps(block) {
@@ -2,15 +2,16 @@
2
2
  <article
3
3
  class="pd-thin"
4
4
  >
5
- <section
6
- v-if="post"
7
- class="h-100 w-100 bg-grey pd-big radius-big"
5
+ <section
6
+ style="min-height: 100%;"
7
+ class="w-100 bg-grey pd-big radius-big"
8
8
  >
9
9
  <!-- Title -->
10
10
  <div
11
11
  class="w-full h-full"
12
12
  >
13
13
  <Textarea
14
+ v-if="post"
14
15
  :prop="post"
15
16
  content="name"
16
17
  placeholder="Enter post title"
@@ -19,11 +20,14 @@
19
20
  </div>
20
21
 
21
22
  <Constructor
23
+ v-if="post"
22
24
  :content="post.content"
23
25
  @update="update => post.content = update"
24
26
  />
25
27
  </section>
26
28
 
29
+
30
+ <transition name="scaleIn" >
27
31
  <section v-if="post" class="pd-thin pos-sticky pos-l-0 pos-b-0 w-100 ">
28
32
  <div class="pd-thin radius-big bg-main w-100 flex-nowrap flex">
29
33
  <a v-if="route.params.url" @click="onDelete()" class="mn-r-auto bg-red t-white t-black button">Delete</a>
@@ -31,6 +35,7 @@
31
35
  <a @click="openPulicationPopup()" class="mn-l-thin bg-black t-white button">Publish</a>
32
36
  </div>
33
37
  </section>
38
+ </transition>
34
39
 
35
40
  <Popup
36
41
  title="Добавить участника"
@@ -45,6 +50,13 @@
45
50
  :tags="post.tags"
46
51
  />
47
52
 
53
+ <h5 class="mn-b-thin">Add source:</h5>
54
+ <Field
55
+ v-model:field="post.source"
56
+ placeholder="Add full link to the source"
57
+ class="mn-b-medium bg-grey radius-medium pd-small"
58
+ />
59
+
48
60
  <h5 class="mn-b-thin">Add to public:</h5>
49
61
  <SelectMulti
50
62
  v-model="selectedOrganization"
@@ -65,10 +77,11 @@
65
77
  name="prices"
66
78
  class="w-100"
67
79
  />
68
- </div>
69
- <Button :submit="onSubmit" :callback="redirectTo" class="w-100 bg-black t-white">Publish</Button>
70
- </Popup>
71
-
80
+ </div>
81
+
82
+ <Button :submit="onSubmit" :callback="redirectTo" class="w-100 bg-black t-white">Publish</Button>
83
+ </Popup>
84
+
72
85
  </article>
73
86
  </template>
74
87
 
@@ -80,6 +93,7 @@ import Popup from '@pf/src/components/Popup/Popup.vue'
80
93
  import FieldTags from '@pf/src/components/FieldTags/FieldTags.vue'
81
94
  import BlockTags from '@pf/src/components/FieldTags/BlockTags.vue'
82
95
  import Checkbox from '@pf/src/components/Checkbox/Checkbox.vue'
96
+ import Field from '@pf/src/components/Field/Field.vue'
83
97
  import SelectMulti from '@pf/src/components/SelectMulti/SelectMulti.vue'
84
98
  import Button from '@pf/src/components/Button/Button.vue';
85
99
 
@@ -101,6 +115,18 @@ const selectedTags = ref([]);
101
115
  const selectedOrganization = ref(null);
102
116
 
103
117
  onMounted(async () =>{
118
+ const dataPublics = await organizations.actions.read({
119
+ user: auth.state.user._id,
120
+ postable: auth.state.user._id,
121
+ limit: 100
122
+ })
123
+
124
+ publics.value = dataPublics.map(publicItem => ({
125
+ name: publicItem.profile.name,
126
+ _id: publicItem._id,
127
+ photo: publicItem.profile.photo
128
+ }));
129
+
104
130
 
105
131
  if (route.params.url) {
106
132
  const data = await blog.read({ user: auth.state.user._id, url: route.params.url });
@@ -128,19 +154,11 @@ onMounted(async () =>{
128
154
  photo: post.value.owner.target.profile.photo
129
155
  }
130
156
 
131
- const dataPublics = await organizations.actions.read({
132
- user: auth.state.user._id,
133
- postable: auth.state.user._id,
134
- limit: 100
135
- })
157
+
136
158
 
137
159
  console.log(dataPublics)
138
160
 
139
- publics.value = dataPublics.map(publicItem => ({
140
- name: publicItem.profile.name,
141
- _id: publicItem._id,
142
- photo: publicItem.profile.photo
143
- }));
161
+
144
162
 
145
163
  })
146
164
  // /////////////////////////////////////////
@@ -224,6 +242,7 @@ function onSubmit() {
224
242
  if (route.params.url) {
225
243
  blog.update(post.value)
226
244
  .then(response => {
245
+ console.log(post.value)
227
246
  router.push({ name: 'BlogPost', params: { url: response.url } });
228
247
  })
229
248
  .catch(error => {
@@ -5,9 +5,9 @@
5
5
  <Feed
6
6
  :skip="0"
7
7
  :limit="3"
8
- :user="auth.state.user._id"
9
- :period="'year'"
10
- class="cols-2 gap-thin"
8
+ :user="auth.state.user._id"
9
+ :period="'year'"
10
+ class="flex flex-wrap gap-thin"
11
11
  />
12
12
  </section>
13
13
  </template>
@@ -1,9 +1,15 @@
1
1
  <template>
2
- <div class="container container-joinus">
2
+ <div class="w-100 container container-joinus">
3
3
  <div class="content">
4
- <span class="h0 mn-b-big">{{ userCount.toLocaleString() }}</span> <!-- используйте toLocaleString для форматирования числа -->
5
- <p class="w-m-33r t-center mn-b-small p-big">Together, we're shaping the future of the globals cannabis community.</p>
6
- <button class="bg-black t-white button">Join Now</button>
4
+ <span class="h0 mn-b-big">
5
+ {{ userCount.toLocaleString() }}
6
+ </span>
7
+ <p class="w-m-33r t-center mn-b-small p-big">
8
+ Together, we're shaping the future of the globals cannabis community.
9
+ </p>
10
+ <router-link :to="{name: 'Sign In'}" class="bg-black t-white button">
11
+ Join Now
12
+ </router-link>
7
13
  </div>
8
14
  </div>
9
15
  </template>
@@ -59,22 +65,22 @@
59
65
  <script setup>
60
66
  import { ref, onMounted, nextTick } from 'vue';
61
67
 
62
- const userCount = ref(120950); // начальное значение
68
+ const userCount = ref(1230); // начальное значение
63
69
 
64
70
  const images = ref([
65
- '/assets/images/reviews/01.png',
66
- '/assets/images/reviews/02.png',
67
- '/assets/images/reviews/03.png',
68
- '/assets/images/reviews/04.png',
69
- '/assets/images/reviews/05.png',
70
- '/assets/images/reviews/06.png'
71
+ '/avatars/01.png',
72
+ '/avatars/02.png',
73
+ '/avatars/03.png',
74
+ '/avatars/04.png',
75
+ '/avatars/05.png',
76
+ '/avatars/06.png'
71
77
  ]);
72
78
 
73
79
 
74
80
  const increaseUserCount = () => {
75
81
  setInterval(() => {
76
- userCount.value += Math.floor(Math.random() * 5) + 1; // случайное увеличение от 1 до 5
77
- }, 330); // каждые 0.33 секунды,95
82
+ userCount.value += Math.floor(Math.random() * 2) + 1; // случайное увеличение от 1 до 5
83
+ }, 1330); // каждые 0.33 секунды,95
78
84
  };
79
85
 
80
86