@ozdao/martyrs 0.2.519 → 0.2.520
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.
- package/dist/chats.server.cjs +198 -1
- package/dist/chats.server.js +198 -1
- package/dist/{main-Wr1_4rwl.cjs → main-BM3GslOO.cjs} +6 -6
- package/dist/{main-DgGUrhjT.js → main-Qcn7YlTx.js} +1832 -1828
- package/dist/martyrs/src/components/Address/{Address.vue2.cjs → Address.vue.cjs} +2 -2
- package/dist/martyrs/src/components/Address/{Address.vue2.js.map → Address.vue.cjs.map} +1 -1
- package/dist/martyrs/src/components/Address/{Address.vue2.js → Address.vue.js} +2 -2
- package/dist/martyrs/src/components/Address/Address.vue.js.map +1 -0
- package/dist/martyrs/src/components/Feed/Feed.vue.cjs +0 -1
- package/dist/martyrs/src/components/Feed/Feed.vue.cjs.map +1 -1
- package/dist/martyrs/src/components/Feed/Feed.vue.js +0 -1
- package/dist/martyrs/src/components/Feed/Feed.vue.js.map +1 -1
- package/dist/martyrs/src/components/LocationMarker/{LocationMarker.vue2.cjs → LocationMarker.vue.cjs} +2 -2
- package/dist/martyrs/src/components/LocationMarker/{LocationMarker.vue2.js.map → LocationMarker.vue.cjs.map} +1 -1
- package/dist/martyrs/src/components/LocationMarker/{LocationMarker.vue2.js → LocationMarker.vue.js} +2 -2
- package/dist/martyrs/src/components/LocationMarker/LocationMarker.vue.js.map +1 -0
- package/dist/martyrs/src/components/Select/{Select.vue2.cjs → Select.vue.cjs} +2 -2
- package/dist/martyrs/src/components/Select/{Select.vue2.js.map → Select.vue.cjs.map} +1 -1
- package/dist/martyrs/src/components/Select/{Select.vue2.js → Select.vue.js} +2 -2
- package/dist/martyrs/src/components/Select/Select.vue.js.map +1 -0
- package/dist/martyrs/src/modules/auth/views/components/blocks/CardUser.vue.cjs +2 -2
- package/dist/martyrs/src/modules/auth/views/components/blocks/CardUser.vue.js +2 -2
- package/dist/martyrs/src/modules/auth/views/components/layouts/Auth.vue.cjs +1 -1
- package/dist/martyrs/src/modules/auth/views/components/layouts/Auth.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/auth/views/components/layouts/Auth.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/layouts/Auth.vue.js.map +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/Invite.vue.cjs +2 -2
- package/dist/martyrs/src/modules/auth/views/components/pages/Invite.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/Invite.vue.js +4 -4
- package/dist/martyrs/src/modules/auth/views/components/pages/Invite.vue.js.map +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.cjs +40 -50
- package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.js +59 -69
- package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.js.map +1 -1
- package/dist/martyrs/src/modules/auth/views/components/sections/SliderFeatures.vue.cjs +11 -13
- package/dist/martyrs/src/modules/auth/views/components/sections/SliderFeatures.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/auth/views/components/sections/SliderFeatures.vue.js +11 -13
- package/dist/martyrs/src/modules/auth/views/components/sections/SliderFeatures.vue.js.map +1 -1
- package/dist/martyrs/src/modules/auth/views/store/auth.cjs +9 -0
- package/dist/martyrs/src/modules/auth/views/store/auth.cjs.map +1 -1
- package/dist/martyrs/src/modules/auth/views/store/auth.js +9 -0
- package/dist/martyrs/src/modules/auth/views/store/auth.js.map +1 -1
- package/dist/martyrs/src/modules/chats/components/blocks/ChatMessage.vue.cjs +27 -11
- package/dist/martyrs/src/modules/chats/components/blocks/ChatMessage.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/chats/components/blocks/ChatMessage.vue.js +28 -12
- package/dist/martyrs/src/modules/chats/components/blocks/ChatMessage.vue.js.map +1 -1
- package/dist/martyrs/src/modules/chats/components/sections/ChatWindow.vue.cjs +62 -0
- package/dist/martyrs/src/modules/chats/components/sections/ChatWindow.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/chats/components/sections/ChatWindow.vue.js +63 -1
- package/dist/martyrs/src/modules/chats/components/sections/ChatWindow.vue.js.map +1 -1
- package/dist/martyrs/src/modules/chats/store/chat.store.cjs +60 -1
- package/dist/martyrs/src/modules/chats/store/chat.store.cjs.map +1 -1
- package/dist/martyrs/src/modules/chats/store/chat.store.js +60 -1
- package/dist/martyrs/src/modules/chats/store/chat.store.js.map +1 -1
- package/dist/martyrs/src/modules/community/components/layouts/Community.vue.cjs +3 -3
- package/dist/martyrs/src/modules/community/components/layouts/Community.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/community/components/layouts/Community.vue.js +3 -3
- package/dist/martyrs/src/modules/community/components/layouts/Community.vue.js.map +1 -1
- package/dist/martyrs/src/modules/community/components/pages/BlogPost.vue.cjs +1 -1
- package/dist/martyrs/src/modules/community/components/pages/BlogPost.vue.js +1 -1
- package/dist/martyrs/src/modules/community/components/pages/Posts.vue.cjs +50 -368
- package/dist/martyrs/src/modules/community/components/pages/Posts.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/community/components/pages/Posts.vue.js +53 -371
- package/dist/martyrs/src/modules/community/components/pages/Posts.vue.js.map +1 -1
- package/dist/martyrs/src/modules/events/components/pages/EditEventTickets.vue.cjs +1 -1
- package/dist/martyrs/src/modules/events/components/pages/EditEventTickets.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/events/components/pages/EditEventTickets.vue.js +1 -1
- package/dist/martyrs/src/modules/events/components/pages/EditEventTickets.vue.js.map +1 -1
- package/dist/martyrs/src/modules/events/components/pages/Event.vue.cjs +0 -1
- package/dist/martyrs/src/modules/events/components/pages/Event.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/events/components/pages/Event.vue.js +0 -1
- package/dist/martyrs/src/modules/events/components/pages/Event.vue.js.map +1 -1
- package/dist/martyrs/src/modules/events/components/pages/Events.vue.cjs +2 -2
- package/dist/martyrs/src/modules/events/components/pages/Events.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/events/components/pages/Events.vue.js +2 -2
- package/dist/martyrs/src/modules/events/components/pages/Events.vue.js.map +1 -1
- package/dist/martyrs/src/modules/gallery/components/sections/BackofficeGallery.vue.cjs +1 -1
- package/dist/martyrs/src/modules/gallery/components/sections/BackofficeGallery.vue.js +1 -1
- package/dist/martyrs/src/modules/globals/views/components/blocks/CardHeader.vue.cjs +1 -1
- package/dist/martyrs/src/modules/globals/views/components/blocks/CardHeader.vue.js +1 -1
- package/dist/martyrs/src/modules/globals/views/components/partials/Header.vue.cjs +1 -1
- package/dist/martyrs/src/modules/globals/views/components/partials/Header.vue.js +1 -1
- package/dist/martyrs/src/modules/globals/views/components/partials/LocationSelection.vue.cjs +2 -2
- package/dist/martyrs/src/modules/globals/views/components/partials/LocationSelection.vue.js +2 -2
- package/dist/martyrs/src/modules/globals/views/components/sections/Walkthrough.vue.cjs +1 -1
- package/dist/martyrs/src/modules/globals/views/mixins/mixins.cjs +7 -0
- package/dist/martyrs/src/modules/globals/views/mixins/mixins.cjs.map +1 -1
- package/dist/martyrs/src/modules/globals/views/mixins/mixins.js +7 -0
- package/dist/martyrs/src/modules/globals/views/mixins/mixins.js.map +1 -1
- package/dist/martyrs/src/modules/icons/pages/IconsPage.vue.cjs +1 -1
- package/dist/martyrs/src/modules/inventory/components/forms/AdjustmentForm.vue.cjs +1 -1
- package/dist/martyrs/src/modules/inventory/components/forms/AdjustmentForm.vue.js +1 -1
- package/dist/martyrs/src/modules/inventory/components/forms/StockAlertsForm.vue.cjs +1 -1
- package/dist/martyrs/src/modules/inventory/components/forms/StockAlertsForm.vue.js +1 -1
- package/dist/martyrs/src/modules/inventory/components/pages/InventoryEdit.vue.cjs +1 -1
- package/dist/martyrs/src/modules/inventory/components/pages/InventoryEdit.vue.js +1 -1
- package/dist/martyrs/src/modules/marketplace/views/components/layouts/Marketplace.vue.cjs +180 -19
- package/dist/martyrs/src/modules/marketplace/views/components/layouts/Marketplace.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/marketplace/views/components/layouts/Marketplace.vue.js +181 -20
- package/dist/martyrs/src/modules/marketplace/views/components/layouts/Marketplace.vue.js.map +1 -1
- package/dist/martyrs/src/modules/music/components/forms/AlbumForm.vue.cjs +1 -1
- package/dist/martyrs/src/modules/music/components/forms/AlbumForm.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/forms/ArtistForm.vue.cjs +1 -1
- package/dist/martyrs/src/modules/music/components/forms/ArtistForm.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/forms/TrackForm.vue.cjs +1 -1
- package/dist/martyrs/src/modules/music/components/forms/TrackForm.vue.js +1 -1
- package/dist/martyrs/src/modules/music/router/music.cjs +0 -1
- package/dist/martyrs/src/modules/music/router/music.cjs.map +1 -1
- package/dist/martyrs/src/modules/music/router/music.js +0 -1
- package/dist/martyrs/src/modules/music/router/music.js.map +1 -1
- package/dist/martyrs/src/modules/orders/components/blocks/CardOrderBackoffice.vue.cjs +2 -2
- package/dist/martyrs/src/modules/orders/components/blocks/CardOrderBackoffice.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/orders/components/blocks/CardOrderBackoffice.vue.js +2 -2
- package/dist/martyrs/src/modules/orders/components/blocks/CardOrderBackoffice.vue.js.map +1 -1
- package/dist/martyrs/src/modules/orders/components/forms/FormApplicationDetails.vue.cjs +1 -1
- package/dist/martyrs/src/modules/orders/components/forms/FormApplicationDetails.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/components/forms/FormCustomerDetails.vue.cjs +1 -1
- package/dist/martyrs/src/modules/orders/components/forms/FormCustomerDetails.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/components/pages/OrderBackoffice.vue.cjs +1 -1
- package/dist/martyrs/src/modules/orders/components/pages/OrderBackoffice.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/components/sections/FormDelivery.vue.cjs +2 -3
- package/dist/martyrs/src/modules/orders/components/sections/FormDelivery.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/orders/components/sections/FormDelivery.vue.js +2 -3
- package/dist/martyrs/src/modules/orders/components/sections/FormDelivery.vue.js.map +1 -1
- package/dist/martyrs/src/modules/orders/components/sections/FormPayment.vue.cjs +1 -1
- package/dist/martyrs/src/modules/orders/components/sections/FormPayment.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/blocks/CardDepartment.vue.cjs +2 -24
- package/dist/martyrs/src/modules/organizations/components/blocks/CardDepartment.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/blocks/CardDepartment.vue.js +5 -27
- package/dist/martyrs/src/modules/organizations/components/blocks/CardDepartment.vue.js.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/blocks/Socials.vue.cjs +4 -1
- package/dist/martyrs/src/modules/organizations/components/blocks/Socials.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/blocks/Socials.vue.js +4 -1
- package/dist/martyrs/src/modules/organizations/components/blocks/Socials.vue.js.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/elements/ButtonToggleMembership.vue.cjs +3 -3
- package/dist/martyrs/src/modules/organizations/components/elements/ButtonToggleMembership.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/elements/ButtonToggleMembership.vue.js +3 -3
- package/dist/martyrs/src/modules/organizations/components/elements/ButtonToggleMembership.vue.js.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/forms/AddExistingMembersForm.vue.cjs +195 -0
- package/dist/martyrs/src/modules/organizations/components/forms/AddExistingMembersForm.vue.cjs.map +1 -0
- package/dist/martyrs/src/modules/organizations/components/forms/AddExistingMembersForm.vue.js +195 -0
- package/dist/martyrs/src/modules/organizations/components/forms/AddExistingMembersForm.vue.js.map +1 -0
- package/dist/martyrs/src/modules/organizations/components/forms/DepartmentForm.vue.cjs +402 -0
- package/dist/martyrs/src/modules/organizations/components/forms/DepartmentForm.vue.cjs.map +1 -0
- package/dist/martyrs/src/modules/organizations/components/forms/DepartmentForm.vue.js +402 -0
- package/dist/martyrs/src/modules/organizations/components/forms/DepartmentForm.vue.js.map +1 -0
- package/dist/martyrs/src/modules/organizations/components/forms/InviteForm.vue.cjs +86 -0
- package/dist/martyrs/src/modules/organizations/components/forms/InviteForm.vue.cjs.map +1 -0
- package/dist/martyrs/src/modules/organizations/components/forms/InviteForm.vue.js +86 -0
- package/dist/martyrs/src/modules/organizations/components/forms/InviteForm.vue.js.map +1 -0
- package/dist/martyrs/src/modules/organizations/components/pages/Department.vue.cjs +10 -10
- package/dist/martyrs/src/modules/organizations/components/pages/Department.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/Department.vue.js +11 -11
- package/dist/martyrs/src/modules/organizations/components/pages/Department.vue.js.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/Members.vue.cjs +279 -191
- package/dist/martyrs/src/modules/organizations/components/pages/Members.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/Members.vue.js +285 -197
- package/dist/martyrs/src/modules/organizations/components/pages/Members.vue.js.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/Organization.vue.cjs +5 -5
- package/dist/martyrs/src/modules/organizations/components/pages/Organization.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/Organization.vue.js +5 -5
- package/dist/martyrs/src/modules/organizations/components/pages/Organization.vue.js.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.cjs +2 -2
- package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.js +2 -2
- package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.js.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/Organizations.vue.cjs +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/Organizations.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/Organizations.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/Organizations.vue.js.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/sections/MembersAdd.vue.cjs +1 -1
- package/dist/martyrs/src/modules/organizations/components/sections/MembersAdd.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/sections/Organizations.vue.cjs +3 -3
- package/dist/martyrs/src/modules/organizations/components/sections/Organizations.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/sections/Organizations.vue.js +3 -3
- package/dist/martyrs/src/modules/organizations/components/sections/Organizations.vue.js.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/sections/Publics.vue.cjs +4 -4
- package/dist/martyrs/src/modules/organizations/components/sections/Publics.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/organizations/components/sections/Publics.vue.js +4 -4
- package/dist/martyrs/src/modules/organizations/components/sections/Publics.vue.js.map +1 -1
- package/dist/martyrs/src/modules/organizations/configs/navigation.organization.config.cjs +42 -41
- package/dist/martyrs/src/modules/organizations/configs/navigation.organization.config.cjs.map +1 -1
- package/dist/martyrs/src/modules/organizations/configs/navigation.organization.config.js +53 -52
- package/dist/martyrs/src/modules/organizations/configs/navigation.organization.config.js.map +1 -1
- package/dist/martyrs/src/modules/organizations/organizations.client.cjs +23 -16
- package/dist/martyrs/src/modules/organizations/organizations.client.cjs.map +1 -1
- package/dist/martyrs/src/modules/organizations/organizations.client.js +35 -28
- package/dist/martyrs/src/modules/organizations/organizations.client.js.map +1 -1
- package/dist/martyrs/src/modules/organizations/router/departments.router.cjs +0 -18
- package/dist/martyrs/src/modules/organizations/router/departments.router.cjs.map +1 -1
- package/dist/martyrs/src/modules/organizations/router/departments.router.js +0 -18
- package/dist/martyrs/src/modules/organizations/router/departments.router.js.map +1 -1
- package/dist/martyrs/src/modules/organizations/store/departments.store.cjs +6 -0
- package/dist/martyrs/src/modules/organizations/store/departments.store.cjs.map +1 -0
- package/dist/martyrs/src/modules/organizations/store/departments.store.js +6 -0
- package/dist/martyrs/src/modules/organizations/store/departments.store.js.map +1 -0
- package/dist/martyrs/src/modules/organizations/store/invites.store.cjs +6 -0
- package/dist/martyrs/src/modules/organizations/store/invites.store.cjs.map +1 -0
- package/dist/martyrs/src/modules/organizations/store/invites.store.js +6 -0
- package/dist/martyrs/src/modules/organizations/store/invites.store.js.map +1 -0
- package/dist/martyrs/src/modules/organizations/store/memberships.store.cjs +20 -0
- package/dist/martyrs/src/modules/organizations/store/memberships.store.cjs.map +1 -0
- package/dist/martyrs/src/modules/organizations/store/memberships.store.js +20 -0
- package/dist/martyrs/src/modules/organizations/store/memberships.store.js.map +1 -0
- package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.cjs +2 -3
- package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.js +2 -3
- package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.js.map +1 -1
- package/dist/martyrs/src/modules/products/components/pages/ProductEdit.vue.cjs +1 -1
- package/dist/martyrs/src/modules/products/components/pages/ProductEdit.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/pages/Products.vue.cjs +1 -1
- package/dist/martyrs/src/modules/products/components/pages/Products.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/products/components/pages/Products.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/pages/Products.vue.js.map +1 -1
- package/dist/martyrs/src/modules/products/components/sections/EditDiscounts.vue.cjs +1 -1
- package/dist/martyrs/src/modules/products/components/sections/EditDiscounts.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/sections/EditVariants.vue.cjs +1 -1
- package/dist/martyrs/src/modules/products/components/sections/EditVariants.vue.js +1 -1
- package/dist/martyrs/src/modules/reports/components/sections/FormReport.vue.cjs +1 -1
- package/dist/martyrs/src/modules/reports/components/sections/FormReport.vue.js +1 -1
- package/dist/martyrs/src/modules/spots/components/blocks/CardSpot.vue.cjs +2 -2
- package/dist/martyrs/src/modules/spots/components/blocks/CardSpot.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/spots/components/blocks/CardSpot.vue.js +2 -2
- package/dist/martyrs/src/modules/spots/components/blocks/CardSpot.vue.js.map +1 -1
- package/dist/martyrs/src/modules/spots/components/blocks/SpotMemberModify.vue.cjs +1 -1
- package/dist/martyrs/src/modules/spots/components/blocks/SpotMemberModify.vue.js +1 -1
- package/dist/martyrs/src/modules/spots/components/pages/SpotEdit.vue.cjs +3 -3
- package/dist/martyrs/src/modules/spots/components/pages/SpotEdit.vue.js +3 -3
- package/dist/martyrs/src/modules/spots/components/pages/Spots.vue.cjs +60 -272
- package/dist/martyrs/src/modules/spots/components/pages/Spots.vue.cjs.map +1 -1
- package/dist/martyrs/src/modules/spots/components/pages/Spots.vue.js +62 -274
- package/dist/martyrs/src/modules/spots/components/pages/Spots.vue.js.map +1 -1
- package/dist/martyrs/src/modules/spots/components/sections/WorktimeEdit.vue.cjs +1 -1
- package/dist/martyrs/src/modules/spots/components/sections/WorktimeEdit.vue.js +1 -1
- package/dist/martyrs/src/modules/wallet/views/components/blocks/CryptoDeposit.vue.cjs +1 -1
- package/dist/martyrs/src/modules/wallet/views/components/blocks/CryptoDeposit.vue.js +1 -1
- package/dist/martyrs/src/modules/wallet/views/components/pages/Wallet.vue.cjs +2 -2
- package/dist/martyrs/src/modules/wallet/views/components/pages/Wallet.vue.js +2 -2
- package/dist/martyrs.cjs.js +1 -1
- package/dist/martyrs.css +1 -1
- package/dist/martyrs.es.js +1 -1
- package/dist/notifications.server.cjs +0 -24
- package/dist/notifications.server.js +0 -24
- package/dist/orders.server.cjs +1 -4
- package/dist/orders.server.js +1 -4
- package/dist/organizations.server.cjs +115 -39
- package/dist/organizations.server.js +115 -39
- package/dist/style.css +9 -9
- package/dist/{web-42I-Howt.cjs → web-B0cfxzgu.cjs} +1 -1
- package/dist/{web-ByhZ_fIu.js → web-DVR8m2fm.js} +1 -1
- package/package.json +1 -1
- package/src/components/Feed/Feed.old.vue +0 -1
- package/src/components/Feed/Feed.vue +0 -30
- package/src/modules/auth/FIXES.md +2 -26
- package/src/modules/auth/views/components/blocks/CardUser.vue +2 -2
- package/src/modules/auth/views/components/layouts/Auth.vue +1 -1
- package/src/modules/auth/views/components/pages/Invite.vue +2 -2
- package/src/modules/auth/views/components/pages/Profile.vue +33 -48
- package/src/modules/auth/views/components/sections/SliderFeatures.vue +5 -7
- package/src/modules/auth/views/store/auth.js +15 -0
- package/src/modules/chats/CLAUDE.md +137 -0
- package/src/modules/chats/components/blocks/ChatMessage.vue +12 -0
- package/src/modules/chats/components/sections/ChatWindow.vue +84 -2
- package/src/modules/chats/controllers/chats.controller.js +187 -0
- package/src/modules/chats/models/chat.model.js +21 -0
- package/src/modules/chats/routes/chats.routes.js +46 -0
- package/src/modules/chats/store/chat.store.js +67 -0
- package/src/modules/community/components/layouts/Community.vue +2 -2
- package/src/modules/community/components/pages/Posts.vue +3 -328
- package/src/modules/events/components/pages/EditEventTickets.vue +1 -1
- package/src/modules/events/components/pages/Events.vue +2 -2
- package/src/modules/globals/views/mixins/mixins.js +7 -0
- package/src/modules/marketplace/views/components/layouts/Marketplace.vue +160 -8
- package/src/modules/notifications/controllers/notifications.controller.js +0 -6
- package/src/modules/notifications/services/notification.service.js +1 -17
- package/src/modules/notifications/services/web-push.service.js +0 -2
- package/src/modules/orders/components/blocks/CardOrderBackoffice.vue +2 -2
- package/src/modules/orders/components/blocks/CardOrderVar1.vue +1 -1
- package/src/modules/orders/controllers/orders.controller.js +2 -4
- package/src/modules/organizations/CLAUDE.md +259 -0
- package/src/modules/organizations/components/blocks/CardDepartment.vue +1 -22
- package/src/modules/organizations/components/blocks/Socials.vue +1 -1
- package/src/modules/organizations/components/elements/ButtonToggleMembership.vue +3 -3
- package/src/modules/organizations/components/forms/AddExistingMembersForm.vue +191 -0
- package/src/modules/organizations/components/forms/DepartmentForm.vue +390 -0
- package/src/modules/organizations/components/forms/InviteForm.vue +81 -0
- package/src/modules/organizations/components/pages/Department.vue +10 -10
- package/src/modules/organizations/components/pages/DepartmentEdit.vue +8 -8
- package/src/modules/organizations/components/pages/Members.vue +265 -171
- package/src/modules/organizations/components/pages/Organization.new.vue +172 -183
- package/src/modules/organizations/components/pages/Organization.vue +6 -6
- package/src/modules/organizations/components/pages/OrganizationEdit.vue +1 -1
- package/src/modules/organizations/components/pages/Organizations.vue +1 -1
- package/src/modules/organizations/components/sections/Organizations.vue +2 -2
- package/src/modules/organizations/components/sections/Publics.vue +4 -4
- package/src/modules/organizations/configs/navigation.organization.config.js +40 -39
- package/src/modules/organizations/controllers/departments.controller.js +53 -34
- package/src/modules/organizations/controllers/invites.controller.js +44 -5
- package/src/modules/organizations/controllers/memberships.controller.js +43 -4
- package/src/modules/organizations/organizations.client.js +24 -15
- package/src/modules/organizations/router/departments.router.js +0 -18
- package/src/modules/organizations/routes/departments.routes.js +6 -8
- package/src/modules/organizations/routes/invites.routes.js +6 -4
- package/src/modules/organizations/routes/memberships.routes.js +6 -5
- package/src/modules/organizations/store/departments.store.js +5 -0
- package/src/modules/organizations/store/invites.store.js +5 -0
- package/src/modules/organizations/store/memberships.store.js +23 -0
- package/src/modules/products/components/pages/Products.vue +0 -1
- package/src/modules/spots/components/blocks/CardSpot.vue +1 -1
- package/src/modules/spots/components/pages/Spots.vue +3 -203
- package/src/styles/base/all.scss +0 -15
- package/src/styles/typography.scss +20 -5
- package/dist/martyrs/src/components/Address/Address.vue2.cjs.map +0 -1
- package/dist/martyrs/src/components/LocationMarker/LocationMarker.vue2.cjs.map +0 -1
- package/dist/martyrs/src/components/Select/Select.vue2.cjs.map +0 -1
- package/dist/martyrs/src/modules/globals/views/components/blocks/BlockFilter.vue.cjs +0 -76
- package/dist/martyrs/src/modules/globals/views/components/blocks/BlockFilter.vue.cjs.map +0 -1
- package/dist/martyrs/src/modules/globals/views/components/blocks/BlockFilter.vue.js +0 -76
- package/dist/martyrs/src/modules/globals/views/components/blocks/BlockFilter.vue.js.map +0 -1
- package/dist/martyrs/src/modules/organizations/components/pages/DepartmentEdit.vue.cjs +0 -280
- package/dist/martyrs/src/modules/organizations/components/pages/DepartmentEdit.vue.cjs.map +0 -1
- package/dist/martyrs/src/modules/organizations/components/pages/DepartmentEdit.vue.js +0 -280
- package/dist/martyrs/src/modules/organizations/components/pages/DepartmentEdit.vue.js.map +0 -1
- package/dist/martyrs/src/modules/organizations/store/departments.cjs +0 -121
- package/dist/martyrs/src/modules/organizations/store/departments.cjs.map +0 -1
- package/dist/martyrs/src/modules/organizations/store/departments.js +0 -121
- package/dist/martyrs/src/modules/organizations/store/departments.js.map +0 -1
- package/dist/martyrs/src/modules/organizations/store/invites.cjs +0 -64
- package/dist/martyrs/src/modules/organizations/store/invites.cjs.map +0 -1
- package/dist/martyrs/src/modules/organizations/store/invites.js +0 -64
- package/dist/martyrs/src/modules/organizations/store/invites.js.map +0 -1
- package/dist/martyrs/src/modules/organizations/store/memberships.cjs +0 -87
- package/dist/martyrs/src/modules/organizations/store/memberships.cjs.map +0 -1
- package/dist/martyrs/src/modules/organizations/store/memberships.js +0 -87
- package/dist/martyrs/src/modules/organizations/store/memberships.js.map +0 -1
- package/src/CLAUDE.MD +0 -15
- package/src/modules/globals/controllers/classes/globals.websocket.ws.js +0 -102
- package/src/modules/globals/views/components/blocks/BlockFilter.vue +0 -60
- package/src/modules/organizations/store/departments.js +0 -137
- package/src/modules/organizations/store/invites.js +0 -76
- package/src/modules/organizations/store/memberships.js +0 -110
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SliderFeatures.vue.cjs","sources":["../../../../../../../../src/modules/auth/views/components/sections/SliderFeatures.vue"],"sourcesContent":["<script setup>\nimport { computed } from 'vue'\nimport { useI18n } from 'vue-i18n'\n\nimport Slider from '@martyrs/src/components/Slider/Slider.vue'\n\nconst { tm } = useI18n({\n useScope: 'global'\n})\nconst features = computed(() => tm('auth.features'))\n</script>\n\n<template>\n <Slider :showDots=\"true\" :slideCount=\"features.length\" class=\"auth_slider h-100\">\n <div class=\"carousel__slide\" v-for=\"(feature, index) in features\" :key=\"index\">\n <div class=\"
|
|
1
|
+
{"version":3,"file":"SliderFeatures.vue.cjs","sources":["../../../../../../../../src/modules/auth/views/components/sections/SliderFeatures.vue"],"sourcesContent":["<script setup>\nimport { computed } from 'vue'\nimport { useI18n } from 'vue-i18n'\n\nimport Slider from '@martyrs/src/components/Slider/Slider.vue'\n\nconst { tm } = useI18n({\n useScope: 'global'\n})\nconst features = computed(() => tm('auth.features'))\n</script>\n\n<template>\n <Slider :showDots=\"true\" :slideCount=\"features.length\" class=\"auth_slider h-100\">\n <div class=\"grid o-hidden h-100 carousel__slide\" style=\" grid-template-rows: 1fr auto;\" v-for=\"(feature, index) in features\" :key=\"index\">\n <div class=\"h-100 background-div\" :style=\"`background-image: url(/features/${index}.png);`\"></div>\n <div class=\"h-100 pd-big\">\n <h5 class=\"t-center w-100 mn-b-regular\">{{ feature.title }}</h5>\n <p class='t-center t-transp w-100'>{{ feature.description }}</p>\n </div>\n </div>\n </Slider>\n</template>\n\n<style lang=\"scss\">\n.auth_slider .carousel {\n height: 100%;\n}\n\n.auth_slider .carousel__container {\n height: 100%;\n}\n\n.parent-div {\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 100%;\n object-fit: contain;\n}\n\n.background-div {\n background-size:cover; \n background-position: center center; \n background-repeat: no-repeat;\n}\n\n.background-div {\n flex-grow: 1; // Занимает все оставшееся пространство\n}\n</style>"],"names":["useI18n","computed"],"mappings":";;;;;;;;;;;;AAMA,UAAM,EAAE,GAAE,IAAKA,gBAAQ;AAAA,MACrB,UAAU;AAAA,IACZ,CAAC;AACD,UAAM,WAAWC,IAAAA,SAAS,MAAM,GAAG,eAAe,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -2,10 +2,9 @@ import { computed, createBlock, openBlock, withCtx, createElementBlock, Fragment
|
|
|
2
2
|
import { useI18n } from "vue-i18n";
|
|
3
3
|
import _sfc_main$1 from "../../../../../components/Slider/Slider.vue.js";
|
|
4
4
|
/* empty css */
|
|
5
|
-
const _hoisted_1 = { class: "
|
|
6
|
-
const _hoisted_2 = { class: "
|
|
7
|
-
const _hoisted_3 = { class: "t-center w-100
|
|
8
|
-
const _hoisted_4 = { class: "t-center t-transp w-100" };
|
|
5
|
+
const _hoisted_1 = { class: "h-100 pd-big" };
|
|
6
|
+
const _hoisted_2 = { class: "t-center w-100 mn-b-regular" };
|
|
7
|
+
const _hoisted_3 = { class: "t-center t-transp w-100" };
|
|
9
8
|
const _sfc_main = {
|
|
10
9
|
__name: "SliderFeatures",
|
|
11
10
|
setup(__props) {
|
|
@@ -22,18 +21,17 @@ const _sfc_main = {
|
|
|
22
21
|
default: withCtx(() => [
|
|
23
22
|
(openBlock(true), createElementBlock(Fragment, null, renderList(features.value, (feature, index) => {
|
|
24
23
|
return openBlock(), createElementBlock("div", {
|
|
25
|
-
class: "carousel__slide",
|
|
24
|
+
class: "grid o-hidden h-100 carousel__slide",
|
|
25
|
+
style: { "grid-template-rows": "1fr auto" },
|
|
26
26
|
key: index
|
|
27
27
|
}, [
|
|
28
|
+
createElementVNode("div", {
|
|
29
|
+
class: "h-100 background-div",
|
|
30
|
+
style: normalizeStyle(`background-image: url(/features/${index}.png);`)
|
|
31
|
+
}, null, 4),
|
|
28
32
|
createElementVNode("div", _hoisted_1, [
|
|
29
|
-
createElementVNode("
|
|
30
|
-
|
|
31
|
-
style: normalizeStyle(`background-image: url(/features/${index}.png);`)
|
|
32
|
-
}, null, 4),
|
|
33
|
-
createElementVNode("div", _hoisted_2, [
|
|
34
|
-
createElementVNode("h5", _hoisted_3, toDisplayString(feature.title), 1),
|
|
35
|
-
createElementVNode("p", _hoisted_4, toDisplayString(feature.description), 1)
|
|
36
|
-
])
|
|
33
|
+
createElementVNode("h5", _hoisted_2, toDisplayString(feature.title), 1),
|
|
34
|
+
createElementVNode("p", _hoisted_3, toDisplayString(feature.description), 1)
|
|
37
35
|
])
|
|
38
36
|
]);
|
|
39
37
|
}), 128))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SliderFeatures.vue.js","sources":["../../../../../../../../src/modules/auth/views/components/sections/SliderFeatures.vue"],"sourcesContent":["<script setup>\nimport { computed } from 'vue'\nimport { useI18n } from 'vue-i18n'\n\nimport Slider from '@martyrs/src/components/Slider/Slider.vue'\n\nconst { tm } = useI18n({\n useScope: 'global'\n})\nconst features = computed(() => tm('auth.features'))\n</script>\n\n<template>\n <Slider :showDots=\"true\" :slideCount=\"features.length\" class=\"auth_slider h-100\">\n <div class=\"carousel__slide\" v-for=\"(feature, index) in features\" :key=\"index\">\n <div class=\"
|
|
1
|
+
{"version":3,"file":"SliderFeatures.vue.js","sources":["../../../../../../../../src/modules/auth/views/components/sections/SliderFeatures.vue"],"sourcesContent":["<script setup>\nimport { computed } from 'vue'\nimport { useI18n } from 'vue-i18n'\n\nimport Slider from '@martyrs/src/components/Slider/Slider.vue'\n\nconst { tm } = useI18n({\n useScope: 'global'\n})\nconst features = computed(() => tm('auth.features'))\n</script>\n\n<template>\n <Slider :showDots=\"true\" :slideCount=\"features.length\" class=\"auth_slider h-100\">\n <div class=\"grid o-hidden h-100 carousel__slide\" style=\" grid-template-rows: 1fr auto;\" v-for=\"(feature, index) in features\" :key=\"index\">\n <div class=\"h-100 background-div\" :style=\"`background-image: url(/features/${index}.png);`\"></div>\n <div class=\"h-100 pd-big\">\n <h5 class=\"t-center w-100 mn-b-regular\">{{ feature.title }}</h5>\n <p class='t-center t-transp w-100'>{{ feature.description }}</p>\n </div>\n </div>\n </Slider>\n</template>\n\n<style lang=\"scss\">\n.auth_slider .carousel {\n height: 100%;\n}\n\n.auth_slider .carousel__container {\n height: 100%;\n}\n\n.parent-div {\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 100%;\n object-fit: contain;\n}\n\n.background-div {\n background-size:cover; \n background-position: center center; \n background-repeat: no-repeat;\n}\n\n.background-div {\n flex-grow: 1; // Занимает все оставшееся пространство\n}\n</style>"],"names":[],"mappings":";;;;;;;;;;AAMA,UAAM,EAAE,GAAE,IAAK,QAAQ;AAAA,MACrB,UAAU;AAAA,IACZ,CAAC;AACD,UAAM,WAAW,SAAS,MAAM,GAAG,eAAe,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -5,6 +5,7 @@ const js_cookie = require("../../../../../../node_modules/.pnpm/js-cookie@3.0.5/
|
|
|
5
5
|
const index = require("../../../../../node_modules/.pnpm/@capacitor_preferences@7.0.1_@capacitor_core@7.2.0/node_modules/@capacitor/preferences/dist/esm/index.cjs");
|
|
6
6
|
const vue = require("vue");
|
|
7
7
|
const globals = require("../../../globals/views/store/globals.cjs");
|
|
8
|
+
const globals_websocket = require("../../../globals/views/classes/globals.websocket.cjs");
|
|
8
9
|
const twofa = require("./twofa.cjs");
|
|
9
10
|
const state = vue.reactive({
|
|
10
11
|
user: {
|
|
@@ -82,6 +83,9 @@ const actions = {
|
|
|
82
83
|
roles: response.data.roles
|
|
83
84
|
});
|
|
84
85
|
await this.initialize();
|
|
86
|
+
console.log("[AUTH] Reconnecting WebSocket after login for user:", response.data._id);
|
|
87
|
+
globals_websocket.default.disconnect();
|
|
88
|
+
await globals_websocket.default.connect(response.data._id);
|
|
85
89
|
return response.data;
|
|
86
90
|
} catch (error) {
|
|
87
91
|
await removeCookie("user");
|
|
@@ -127,6 +131,9 @@ const actions = {
|
|
|
127
131
|
roles: response.data.roles
|
|
128
132
|
});
|
|
129
133
|
await this.initialize();
|
|
134
|
+
console.log("[AUTH] Reconnecting WebSocket after signup for user:", response.data._id);
|
|
135
|
+
globals_websocket.default.disconnect();
|
|
136
|
+
await globals_websocket.default.connect(response.data._id);
|
|
130
137
|
return response.data;
|
|
131
138
|
} catch (error) {
|
|
132
139
|
await removeCookie("user");
|
|
@@ -139,6 +146,8 @@ const actions = {
|
|
|
139
146
|
await removeCookie("user");
|
|
140
147
|
axiosInstance.setAuthToken(null);
|
|
141
148
|
this.resetState();
|
|
149
|
+
console.log("[AUTH] Disconnecting WebSocket on logout");
|
|
150
|
+
globals_websocket.default.disconnect();
|
|
142
151
|
},
|
|
143
152
|
async resetPassword(user, type) {
|
|
144
153
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.cjs","sources":["../../../../../../../src/modules/auth/views/store/auth.js"],"sourcesContent":["// Dependencies\nimport $axios, { setAuthToken } from '@martyrs/src/modules/globals/views/utils/axios-instance.js';\nimport Cookies from 'js-cookie';\n// Capacitor\nimport { Preferences } from '@capacitor/preferences';\n// Vue modules\nimport { reactive, watch } from 'vue';\n// Globals\nimport { setError } from '@martyrs/src/modules/globals/views/store/globals.js';\n// State\nimport * as twofa from './twofa.js';\n\n// State\nconst state = reactive({\n user: {\n _id: undefined,\n avatar: null,\n username: '',\n email: '',\n phone: '',\n password: '',\n passwordRepeat: '',\n },\n access: {\n roles: null,\n token: null,\n status: false,\n },\n accesses: [],\n});\n\nconst actions = {\n async initialize(cookie) {\n try {\n const userCookie = cookie ? cookie : await getCookie('user');\n\n if (userCookie) {\n const { _id, email, phone, avatar, roles, accessToken } = userCookie;\n\n setAuthToken(accessToken);\n\n // Проверка токена через серверный маршрут\n const response = await $axios.get('/api/organizations/check-accesses');\n const userAccesses = response.data;\n state.accesses = userAccesses;\n\n // Обновление состояния приложения с информацией о пользователе и его правах доступа\n Object.assign(state.user, { _id, email, phone, avatar });\n Object.assign(state.access, { token: accessToken, roles, status: !!accessToken });\n } else {\n console.log('no cookies');\n setAuthToken(null);\n this.resetState();\n }\n } catch (error) {\n console.error('Error initializing auth:', error);\n // Make sure we remove the cookie when there's an error\n await removeCookie('user');\n setAuthToken(null);\n this.resetState();\n setError(error);\n }\n },\n\n // Helper method to reset state\n resetState() {\n state.accesses = [];\n state.user = {\n _id: undefined,\n avatar: null,\n username: '',\n email: '',\n phone: '',\n password: '',\n passwordRepeat: '',\n };\n state.access = {\n roles: null,\n token: null,\n status: false,\n };\n },\n\n async login(user, type) {\n try {\n const response = await $axios.post('/api/auth/signin', {\n ...user,\n type,\n });\n\n setCookie('user', response.data);\n\n Object.assign(state.user, {\n ...response.data,\n });\n\n Object.assign(state.access, {\n token: response.data.accessToken,\n status: true,\n roles: response.data.roles,\n });\n\n await this.initialize();\n\n return response.data;\n } catch (error) {\n // Make sure cookie is removed on login error\n await removeCookie('user');\n\n Object.assign(state.access, {\n token: null,\n status: false,\n roles: null,\n });\n\n console.log(error);\n setError(error);\n return Promise.reject(error);\n }\n },\n\n async signup(user, type, invite) {\n const { password, passwordRepeat } = state.user;\n\n console.log(password);\n console.log(passwordRepeat);\n\n if (password !== passwordRepeat) {\n const error = {\n response: {\n data: { errorCode: 'PASSWORDS_DO_NOT_MATCH' },\n },\n };\n setError(error);\n throw new Error(error.response.status);\n }\n\n try {\n const response = await $axios.post('/api/auth/signup', {\n ...user,\n type,\n inviteCode: invite,\n });\n\n console.log(response);\n\n if (response.data.accessToken) {\n setCookie('user', response.data);\n }\n\n Object.assign(state.user, {\n ...response.data,\n });\n\n Object.assign(state.access, {\n token: response.data.accessToken,\n status: true,\n roles: response.data.roles,\n });\n\n await this.initialize();\n\n return response.data;\n } catch (error) {\n // Make sure cookie is removed on signup error\n await removeCookie('user');\n setError(error);\n console.log('Sign up failed');\n throw error;\n }\n },\n\n async logout() {\n await removeCookie('user');\n setAuthToken(null);\n this.resetState();\n },\n\n async resetPassword(user, type) {\n try {\n const response = await $axios.post('/api/auth/reset-password', {\n email: user.email,\n phone: user.phone,\n type,\n });\n\n Object.assign(twofa.state.code, {\n ...response.data,\n isSended: true,\n });\n\n return response.data;\n } catch (error) {\n setError(error);\n return Promise.reject(error);\n }\n },\n\n async updatePassword(user, type) {\n const { password, passwordRepeat } = state.user;\n\n if (password !== passwordRepeat) {\n const error = {\n response: {\n data: { errorCode: 'PASSWORDS_DO_NOT_MATCH' },\n },\n };\n setError(error);\n throw new Error(error.response.status);\n }\n\n try {\n const response = await $axios.post('/api/auth/update-password', {\n email: user.email,\n phone: user.phone,\n password: user.password,\n passwordRepeat: user.passwordRepeat,\n type,\n });\n\n if (response.data.accessToken) {\n setCookie('user', response.data);\n }\n\n Object.assign(state.user, {\n ...response.data,\n });\n\n Object.assign(state.access, {\n token: response.data.accessToken,\n status: true,\n });\n\n return response.data;\n } catch (error) {\n // Make sure cookie is removed on password update error\n await removeCookie('user');\n setError(error);\n return Promise.reject(error);\n }\n },\n};\n\n// Cookies\nconst optionsDefault = {\n development: { secure: false, expires: 7, sameSite: 'Lax' },\n production: {\n expires: 7,\n path: '/',\n domain: process.env.DOMAIN_URL,\n sameSite: 'strict',\n secure: true,\n },\n};\n\nasync function getCookie(name) {\n if (process.env.MOBILE_APP) {\n const { value } = await Preferences.get({ key: name });\n return value ? JSON.parse(value) : null;\n } else {\n const cookie = Cookies.get(name);\n return cookie ? JSON.parse(cookie) : null;\n }\n}\n\nasync function setCookie(name, data, env = process.env.DOMAIN_URL) {\n if (process.env.MOBILE_APP) {\n // Если приложение запущено в Capacitor\n await Preferences.set({\n key: name,\n value: JSON.stringify(data),\n });\n } else {\n // Для веб-версии\n Cookies.set(name, JSON.stringify(data), optionsDefault[env]);\n }\n}\n\nasync function removeCookie(name, env = process.env.NODE_ENV) {\n if (process.env.MOBILE_APP) {\n // Если приложение запущено в Capacitor\n await Preferences.remove({ key: name });\n } else {\n // Для веб-версии\n const options = env === 'production' ? { domain: process.env.DOMAIN_URL, path: '/' } : {};\n Cookies.remove(name, options);\n }\n}\n\n// History\nconst history = [];\nhistory.push(state);\n\n// Watch\nwatch(state, (newState, oldState) => {\n history.push(newState);\n});\n\n// Module Export\nexport { actions, removeCookie, state };\n"],"names":["reactive","setAuthToken","$axios","setError","twofa.state","Preferences","Cookies","watch"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"auth.cjs","sources":["../../../../../../../src/modules/auth/views/store/auth.js"],"sourcesContent":["// Dependencies\nimport $axios, { setAuthToken } from '@martyrs/src/modules/globals/views/utils/axios-instance.js';\nimport Cookies from 'js-cookie';\n// Capacitor\nimport { Preferences } from '@capacitor/preferences';\n// Vue modules\nimport { reactive, watch } from 'vue';\n// Globals\nimport { setError } from '@martyrs/src/modules/globals/views/store/globals.js';\nimport globalWebSocket from '@martyrs/src/modules/globals/views/classes/globals.websocket.js';\n// State\nimport * as twofa from './twofa.js';\n\n// State\nconst state = reactive({\n user: {\n _id: undefined,\n avatar: null,\n username: '',\n email: '',\n phone: '',\n password: '',\n passwordRepeat: '',\n },\n access: {\n roles: null,\n token: null,\n status: false,\n },\n accesses: [],\n});\n\nconst actions = {\n async initialize(cookie) {\n try {\n const userCookie = cookie ? cookie : await getCookie('user');\n\n if (userCookie) {\n const { _id, email, phone, avatar, roles, accessToken } = userCookie;\n\n setAuthToken(accessToken);\n\n // Проверка токена через серверный маршрут\n const response = await $axios.get('/api/organizations/check-accesses');\n const userAccesses = response.data;\n state.accesses = userAccesses;\n\n // Обновление состояния приложения с информацией о пользователе и его правах доступа\n Object.assign(state.user, { _id, email, phone, avatar });\n Object.assign(state.access, { token: accessToken, roles, status: !!accessToken });\n } else {\n console.log('no cookies');\n setAuthToken(null);\n this.resetState();\n }\n } catch (error) {\n console.error('Error initializing auth:', error);\n // Make sure we remove the cookie when there's an error\n await removeCookie('user');\n setAuthToken(null);\n this.resetState();\n setError(error);\n }\n },\n\n // Helper method to reset state\n resetState() {\n state.accesses = [];\n state.user = {\n _id: undefined,\n avatar: null,\n username: '',\n email: '',\n phone: '',\n password: '',\n passwordRepeat: '',\n };\n state.access = {\n roles: null,\n token: null,\n status: false,\n };\n },\n\n async login(user, type) {\n try {\n const response = await $axios.post('/api/auth/signin', {\n ...user,\n type,\n });\n\n setCookie('user', response.data);\n\n Object.assign(state.user, {\n ...response.data,\n });\n\n Object.assign(state.access, {\n token: response.data.accessToken,\n status: true,\n roles: response.data.roles,\n });\n\n await this.initialize();\n \n // Переподключаем WebSocket с новым userId после входа\n console.log('[AUTH] Reconnecting WebSocket after login for user:', response.data._id);\n globalWebSocket.disconnect();\n await globalWebSocket.connect(response.data._id);\n\n return response.data;\n } catch (error) {\n // Make sure cookie is removed on login error\n await removeCookie('user');\n\n Object.assign(state.access, {\n token: null,\n status: false,\n roles: null,\n });\n\n console.log(error);\n setError(error);\n return Promise.reject(error);\n }\n },\n\n async signup(user, type, invite) {\n const { password, passwordRepeat } = state.user;\n\n console.log(password);\n console.log(passwordRepeat);\n\n if (password !== passwordRepeat) {\n const error = {\n response: {\n data: { errorCode: 'PASSWORDS_DO_NOT_MATCH' },\n },\n };\n setError(error);\n throw new Error(error.response.status);\n }\n\n try {\n const response = await $axios.post('/api/auth/signup', {\n ...user,\n type,\n inviteCode: invite,\n });\n\n console.log(response);\n\n if (response.data.accessToken) {\n setCookie('user', response.data);\n }\n\n Object.assign(state.user, {\n ...response.data,\n });\n\n Object.assign(state.access, {\n token: response.data.accessToken,\n status: true,\n roles: response.data.roles,\n });\n\n await this.initialize();\n \n // Переподключаем WebSocket с новым userId после регистрации\n console.log('[AUTH] Reconnecting WebSocket after signup for user:', response.data._id);\n globalWebSocket.disconnect();\n await globalWebSocket.connect(response.data._id);\n\n return response.data;\n } catch (error) {\n // Make sure cookie is removed on signup error\n await removeCookie('user');\n setError(error);\n console.log('Sign up failed');\n throw error;\n }\n },\n\n async logout() {\n await removeCookie('user');\n setAuthToken(null);\n this.resetState();\n \n // Отключаем WebSocket при выходе\n console.log('[AUTH] Disconnecting WebSocket on logout');\n globalWebSocket.disconnect();\n },\n\n async resetPassword(user, type) {\n try {\n const response = await $axios.post('/api/auth/reset-password', {\n email: user.email,\n phone: user.phone,\n type,\n });\n\n Object.assign(twofa.state.code, {\n ...response.data,\n isSended: true,\n });\n\n return response.data;\n } catch (error) {\n setError(error);\n return Promise.reject(error);\n }\n },\n\n async updatePassword(user, type) {\n const { password, passwordRepeat } = state.user;\n\n if (password !== passwordRepeat) {\n const error = {\n response: {\n data: { errorCode: 'PASSWORDS_DO_NOT_MATCH' },\n },\n };\n setError(error);\n throw new Error(error.response.status);\n }\n\n try {\n const response = await $axios.post('/api/auth/update-password', {\n email: user.email,\n phone: user.phone,\n password: user.password,\n passwordRepeat: user.passwordRepeat,\n type,\n });\n\n if (response.data.accessToken) {\n setCookie('user', response.data);\n }\n\n Object.assign(state.user, {\n ...response.data,\n });\n\n Object.assign(state.access, {\n token: response.data.accessToken,\n status: true,\n });\n\n return response.data;\n } catch (error) {\n // Make sure cookie is removed on password update error\n await removeCookie('user');\n setError(error);\n return Promise.reject(error);\n }\n },\n};\n\n// Cookies\nconst optionsDefault = {\n development: { secure: false, expires: 7, sameSite: 'Lax' },\n production: {\n expires: 7,\n path: '/',\n domain: process.env.DOMAIN_URL,\n sameSite: 'strict',\n secure: true,\n },\n};\n\nasync function getCookie(name) {\n if (process.env.MOBILE_APP) {\n const { value } = await Preferences.get({ key: name });\n return value ? JSON.parse(value) : null;\n } else {\n const cookie = Cookies.get(name);\n return cookie ? JSON.parse(cookie) : null;\n }\n}\n\nasync function setCookie(name, data, env = process.env.DOMAIN_URL) {\n if (process.env.MOBILE_APP) {\n // Если приложение запущено в Capacitor\n await Preferences.set({\n key: name,\n value: JSON.stringify(data),\n });\n } else {\n // Для веб-версии\n Cookies.set(name, JSON.stringify(data), optionsDefault[env]);\n }\n}\n\nasync function removeCookie(name, env = process.env.NODE_ENV) {\n if (process.env.MOBILE_APP) {\n // Если приложение запущено в Capacitor\n await Preferences.remove({ key: name });\n } else {\n // Для веб-версии\n const options = env === 'production' ? { domain: process.env.DOMAIN_URL, path: '/' } : {};\n Cookies.remove(name, options);\n }\n}\n\n// History\nconst history = [];\nhistory.push(state);\n\n// Watch\nwatch(state, (newState, oldState) => {\n history.push(newState);\n});\n\n// Module Export\nexport { actions, removeCookie, state };\n"],"names":["reactive","setAuthToken","$axios","setError","globalWebSocket","twofa.state","Preferences","Cookies","watch"],"mappings":";;;;;;;;;AAcK,MAAC,QAAQA,IAAAA,SAAS;AAAA,EACrB,MAAM;AAAA,IACJ,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,OAAO;AAAA,IACP,OAAO;AAAA,IACP,UAAU;AAAA,IACV,gBAAgB;AAAA,EACpB;AAAA,EACE,QAAQ;AAAA,IACN,OAAO;AAAA,IACP,OAAO;AAAA,IACP,QAAQ;AAAA,EACZ;AAAA,EACE,UAAU,CAAA;AACZ,CAAC;AAEI,MAAC,UAAU;AAAA,EACd,MAAM,WAAW,QAAQ;AACvB,QAAI;AACF,YAAM,aAAa,SAAS,SAAS,MAAM,UAAU,MAAM;AAE3D,UAAI,YAAY;AACd,cAAM,EAAE,KAAK,OAAO,OAAO,QAAQ,OAAO,YAAW,IAAK;AAE1DC,sBAAAA,aAAa,WAAW;AAGxB,cAAM,WAAW,MAAMC,sBAAO,IAAI,mCAAmC;AACrE,cAAM,eAAe,SAAS;AAC9B,cAAM,WAAW;AAGjB,eAAO,OAAO,MAAM,MAAM,EAAE,KAAK,OAAO,OAAO,QAAQ;AACvD,eAAO,OAAO,MAAM,QAAQ,EAAE,OAAO,aAAa,OAAO,QAAQ,CAAC,CAAC,YAAW,CAAE;AAAA,MAClF,OAAO;AACL,gBAAQ,IAAI,YAAY;AACxBD,sBAAAA,aAAa,IAAI;AACjB,aAAK,WAAU;AAAA,MACjB;AAAA,IACF,SAAS,OAAO;AACd,cAAQ,MAAM,4BAA4B,KAAK;AAE/C,YAAM,aAAa,MAAM;AACzBA,oBAAAA,aAAa,IAAI;AACjB,WAAK,WAAU;AACfE,cAAAA,SAAS,KAAK;AAAA,IAChB;AAAA,EACF;AAAA;AAAA,EAGA,aAAa;AACX,UAAM,WAAW,CAAA;AACjB,UAAM,OAAO;AAAA,MACX,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,OAAO;AAAA,MACP,OAAO;AAAA,MACP,UAAU;AAAA,MACV,gBAAgB;AAAA,IACtB;AACI,UAAM,SAAS;AAAA,MACb,OAAO;AAAA,MACP,OAAO;AAAA,MACP,QAAQ;AAAA,IACd;AAAA,EACE;AAAA,EAEA,MAAM,MAAM,MAAM,MAAM;AACtB,QAAI;AACF,YAAM,WAAW,MAAMD,sBAAO,KAAK,oBAAoB;AAAA,QACrD,GAAG;AAAA,QACH;AAAA,MACR,CAAO;AAED,gBAAU,QAAQ,SAAS,IAAI;AAE/B,aAAO,OAAO,MAAM,MAAM;AAAA,QACxB,GAAG,SAAS;AAAA,MACpB,CAAO;AAED,aAAO,OAAO,MAAM,QAAQ;AAAA,QAC1B,OAAO,SAAS,KAAK;AAAA,QACrB,QAAQ;AAAA,QACR,OAAO,SAAS,KAAK;AAAA,MAC7B,CAAO;AAED,YAAM,KAAK,WAAU;AAGrB,cAAQ,IAAI,uDAAuD,SAAS,KAAK,GAAG;AACpFE,wBAAAA,QAAgB,WAAU;AAC1B,YAAMA,kBAAAA,QAAgB,QAAQ,SAAS,KAAK,GAAG;AAE/C,aAAO,SAAS;AAAA,IAClB,SAAS,OAAO;AAEd,YAAM,aAAa,MAAM;AAEzB,aAAO,OAAO,MAAM,QAAQ;AAAA,QAC1B,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,OAAO;AAAA,MACf,CAAO;AAED,cAAQ,IAAI,KAAK;AACjBD,cAAAA,SAAS,KAAK;AACd,aAAO,QAAQ,OAAO,KAAK;AAAA,IAC7B;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,MAAM,MAAM,QAAQ;AAC/B,UAAM,EAAE,UAAU,eAAc,IAAK,MAAM;AAE3C,YAAQ,IAAI,QAAQ;AACpB,YAAQ,IAAI,cAAc;AAE1B,QAAI,aAAa,gBAAgB;AAC/B,YAAM,QAAQ;AAAA,QACZ,UAAU;AAAA,UACR,MAAM,EAAE,WAAW,yBAAwB;AAAA,QACrD;AAAA,MACA;AACMA,cAAAA,SAAS,KAAK;AACd,YAAM,IAAI,MAAM,MAAM,SAAS,MAAM;AAAA,IACvC;AAEA,QAAI;AACF,YAAM,WAAW,MAAMD,sBAAO,KAAK,oBAAoB;AAAA,QACrD,GAAG;AAAA,QACH;AAAA,QACA,YAAY;AAAA,MACpB,CAAO;AAED,cAAQ,IAAI,QAAQ;AAEpB,UAAI,SAAS,KAAK,aAAa;AAC7B,kBAAU,QAAQ,SAAS,IAAI;AAAA,MACjC;AAEA,aAAO,OAAO,MAAM,MAAM;AAAA,QACxB,GAAG,SAAS;AAAA,MACpB,CAAO;AAED,aAAO,OAAO,MAAM,QAAQ;AAAA,QAC1B,OAAO,SAAS,KAAK;AAAA,QACrB,QAAQ;AAAA,QACR,OAAO,SAAS,KAAK;AAAA,MAC7B,CAAO;AAED,YAAM,KAAK,WAAU;AAGrB,cAAQ,IAAI,wDAAwD,SAAS,KAAK,GAAG;AACrFE,wBAAAA,QAAgB,WAAU;AAC1B,YAAMA,kBAAAA,QAAgB,QAAQ,SAAS,KAAK,GAAG;AAE/C,aAAO,SAAS;AAAA,IAClB,SAAS,OAAO;AAEd,YAAM,aAAa,MAAM;AACzBD,cAAAA,SAAS,KAAK;AACd,cAAQ,IAAI,gBAAgB;AAC5B,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,SAAS;AACb,UAAM,aAAa,MAAM;AACzBF,kBAAAA,aAAa,IAAI;AACjB,SAAK,WAAU;AAGf,YAAQ,IAAI,0CAA0C;AACtDG,sBAAAA,QAAgB,WAAU;AAAA,EAC5B;AAAA,EAEA,MAAM,cAAc,MAAM,MAAM;AAC9B,QAAI;AACF,YAAM,WAAW,MAAMF,sBAAO,KAAK,4BAA4B;AAAA,QAC7D,OAAO,KAAK;AAAA,QACZ,OAAO,KAAK;AAAA,QACZ;AAAA,MACR,CAAO;AAED,aAAO,OAAOG,MAAAA,MAAY,MAAM;AAAA,QAC9B,GAAG,SAAS;AAAA,QACZ,UAAU;AAAA,MAClB,CAAO;AAED,aAAO,SAAS;AAAA,IAClB,SAAS,OAAO;AACdF,cAAAA,SAAS,KAAK;AACd,aAAO,QAAQ,OAAO,KAAK;AAAA,IAC7B;AAAA,EACF;AAAA,EAEA,MAAM,eAAe,MAAM,MAAM;AAC/B,UAAM,EAAE,UAAU,eAAc,IAAK,MAAM;AAE3C,QAAI,aAAa,gBAAgB;AAC/B,YAAM,QAAQ;AAAA,QACZ,UAAU;AAAA,UACR,MAAM,EAAE,WAAW,yBAAwB;AAAA,QACrD;AAAA,MACA;AACMA,cAAAA,SAAS,KAAK;AACd,YAAM,IAAI,MAAM,MAAM,SAAS,MAAM;AAAA,IACvC;AAEA,QAAI;AACF,YAAM,WAAW,MAAMD,sBAAO,KAAK,6BAA6B;AAAA,QAC9D,OAAO,KAAK;AAAA,QACZ,OAAO,KAAK;AAAA,QACZ,UAAU,KAAK;AAAA,QACf,gBAAgB,KAAK;AAAA,QACrB;AAAA,MACR,CAAO;AAED,UAAI,SAAS,KAAK,aAAa;AAC7B,kBAAU,QAAQ,SAAS,IAAI;AAAA,MACjC;AAEA,aAAO,OAAO,MAAM,MAAM;AAAA,QACxB,GAAG,SAAS;AAAA,MACpB,CAAO;AAED,aAAO,OAAO,MAAM,QAAQ;AAAA,QAC1B,OAAO,SAAS,KAAK;AAAA,QACrB,QAAQ;AAAA,MAChB,CAAO;AAED,aAAO,SAAS;AAAA,IAClB,SAAS,OAAO;AAEd,YAAM,aAAa,MAAM;AACzBC,cAAAA,SAAS,KAAK;AACd,aAAO,QAAQ,OAAO,KAAK;AAAA,IAC7B;AAAA,EACF;AACF;AAGA,MAAM,iBAAiB;AAAA,EACrB,aAAa,EAAE,QAAQ,OAAO,SAAS,GAAG,UAAU,MAAK;AAAA,EACzD,YAAY;AAAA,IACV,SAAS;AAAA,IACT,MAAM;AAAA,IACN,QAAQ,QAAQ,IAAI;AAAA,IACpB,UAAU;AAAA,IACV,QAAQ;AAAA,EACZ;AACA;AAEA,eAAe,UAAU,MAAM;AAC7B,MAAI,QAAQ,IAAI,YAAY;AAC1B,UAAM,EAAE,MAAK,IAAK,MAAMG,MAAAA,YAAY,IAAI,EAAE,KAAK,MAAM;AACrD,WAAO,QAAQ,KAAK,MAAM,KAAK,IAAI;AAAA,EACrC,OAAO;AACL,UAAM,SAASC,UAAAA,QAAQ,IAAI,IAAI;AAC/B,WAAO,SAAS,KAAK,MAAM,MAAM,IAAI;AAAA,EACvC;AACF;AAEA,eAAe,UAAU,MAAM,MAAM,MAAM,QAAQ,IAAI,YAAY;AACjE,MAAI,QAAQ,IAAI,YAAY;AAE1B,UAAMD,MAAAA,YAAY,IAAI;AAAA,MACpB,KAAK;AAAA,MACL,OAAO,KAAK,UAAU,IAAI;AAAA,IAChC,CAAK;AAAA,EACH,OAAO;AAELC,sBAAQ,IAAI,MAAM,KAAK,UAAU,IAAI,GAAG,eAAe,GAAG,CAAC;AAAA,EAC7D;AACF;AAEA,eAAe,aAAa,MAAM,MAAM,QAAQ,IAAI,UAAU;AAC5D,MAAI,QAAQ,IAAI,YAAY;AAE1B,UAAMD,MAAAA,YAAY,OAAO,EAAE,KAAK,KAAI,CAAE;AAAA,EACxC,OAAO;AAEL,UAAM,UAAU,QAAQ,eAAe,EAAE,QAAQ,QAAQ,IAAI,YAAY,MAAM,IAAG,IAAK,CAAA;AACvFC,sBAAQ,OAAO,MAAM,OAAO;AAAA,EAC9B;AACF;AAOAC,IAAAA,MAAM,OAAO,CAAC,UAAU,aAAa;AAErC,CAAC;;;;"}
|
|
@@ -3,6 +3,7 @@ import api from "../../../../../../node_modules/.pnpm/js-cookie@3.0.5/node_modul
|
|
|
3
3
|
import { Preferences } from "../../../../../node_modules/.pnpm/@capacitor_preferences@7.0.1_@capacitor_core@7.2.0/node_modules/@capacitor/preferences/dist/esm/index.js";
|
|
4
4
|
import { reactive, watch } from "vue";
|
|
5
5
|
import { setError } from "../../../globals/views/store/globals.js";
|
|
6
|
+
import globalWebSocket from "../../../globals/views/classes/globals.websocket.js";
|
|
6
7
|
import { state as state$1 } from "./twofa.js";
|
|
7
8
|
const state = reactive({
|
|
8
9
|
user: {
|
|
@@ -80,6 +81,9 @@ const actions = {
|
|
|
80
81
|
roles: response.data.roles
|
|
81
82
|
});
|
|
82
83
|
await this.initialize();
|
|
84
|
+
console.log("[AUTH] Reconnecting WebSocket after login for user:", response.data._id);
|
|
85
|
+
globalWebSocket.disconnect();
|
|
86
|
+
await globalWebSocket.connect(response.data._id);
|
|
83
87
|
return response.data;
|
|
84
88
|
} catch (error) {
|
|
85
89
|
await removeCookie("user");
|
|
@@ -125,6 +129,9 @@ const actions = {
|
|
|
125
129
|
roles: response.data.roles
|
|
126
130
|
});
|
|
127
131
|
await this.initialize();
|
|
132
|
+
console.log("[AUTH] Reconnecting WebSocket after signup for user:", response.data._id);
|
|
133
|
+
globalWebSocket.disconnect();
|
|
134
|
+
await globalWebSocket.connect(response.data._id);
|
|
128
135
|
return response.data;
|
|
129
136
|
} catch (error) {
|
|
130
137
|
await removeCookie("user");
|
|
@@ -137,6 +144,8 @@ const actions = {
|
|
|
137
144
|
await removeCookie("user");
|
|
138
145
|
setAuthToken(null);
|
|
139
146
|
this.resetState();
|
|
147
|
+
console.log("[AUTH] Disconnecting WebSocket on logout");
|
|
148
|
+
globalWebSocket.disconnect();
|
|
140
149
|
},
|
|
141
150
|
async resetPassword(user, type) {
|
|
142
151
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sources":["../../../../../../../src/modules/auth/views/store/auth.js"],"sourcesContent":["// Dependencies\nimport $axios, { setAuthToken } from '@martyrs/src/modules/globals/views/utils/axios-instance.js';\nimport Cookies from 'js-cookie';\n// Capacitor\nimport { Preferences } from '@capacitor/preferences';\n// Vue modules\nimport { reactive, watch } from 'vue';\n// Globals\nimport { setError } from '@martyrs/src/modules/globals/views/store/globals.js';\n// State\nimport * as twofa from './twofa.js';\n\n// State\nconst state = reactive({\n user: {\n _id: undefined,\n avatar: null,\n username: '',\n email: '',\n phone: '',\n password: '',\n passwordRepeat: '',\n },\n access: {\n roles: null,\n token: null,\n status: false,\n },\n accesses: [],\n});\n\nconst actions = {\n async initialize(cookie) {\n try {\n const userCookie = cookie ? cookie : await getCookie('user');\n\n if (userCookie) {\n const { _id, email, phone, avatar, roles, accessToken } = userCookie;\n\n setAuthToken(accessToken);\n\n // Проверка токена через серверный маршрут\n const response = await $axios.get('/api/organizations/check-accesses');\n const userAccesses = response.data;\n state.accesses = userAccesses;\n\n // Обновление состояния приложения с информацией о пользователе и его правах доступа\n Object.assign(state.user, { _id, email, phone, avatar });\n Object.assign(state.access, { token: accessToken, roles, status: !!accessToken });\n } else {\n console.log('no cookies');\n setAuthToken(null);\n this.resetState();\n }\n } catch (error) {\n console.error('Error initializing auth:', error);\n // Make sure we remove the cookie when there's an error\n await removeCookie('user');\n setAuthToken(null);\n this.resetState();\n setError(error);\n }\n },\n\n // Helper method to reset state\n resetState() {\n state.accesses = [];\n state.user = {\n _id: undefined,\n avatar: null,\n username: '',\n email: '',\n phone: '',\n password: '',\n passwordRepeat: '',\n };\n state.access = {\n roles: null,\n token: null,\n status: false,\n };\n },\n\n async login(user, type) {\n try {\n const response = await $axios.post('/api/auth/signin', {\n ...user,\n type,\n });\n\n setCookie('user', response.data);\n\n Object.assign(state.user, {\n ...response.data,\n });\n\n Object.assign(state.access, {\n token: response.data.accessToken,\n status: true,\n roles: response.data.roles,\n });\n\n await this.initialize();\n\n return response.data;\n } catch (error) {\n // Make sure cookie is removed on login error\n await removeCookie('user');\n\n Object.assign(state.access, {\n token: null,\n status: false,\n roles: null,\n });\n\n console.log(error);\n setError(error);\n return Promise.reject(error);\n }\n },\n\n async signup(user, type, invite) {\n const { password, passwordRepeat } = state.user;\n\n console.log(password);\n console.log(passwordRepeat);\n\n if (password !== passwordRepeat) {\n const error = {\n response: {\n data: { errorCode: 'PASSWORDS_DO_NOT_MATCH' },\n },\n };\n setError(error);\n throw new Error(error.response.status);\n }\n\n try {\n const response = await $axios.post('/api/auth/signup', {\n ...user,\n type,\n inviteCode: invite,\n });\n\n console.log(response);\n\n if (response.data.accessToken) {\n setCookie('user', response.data);\n }\n\n Object.assign(state.user, {\n ...response.data,\n });\n\n Object.assign(state.access, {\n token: response.data.accessToken,\n status: true,\n roles: response.data.roles,\n });\n\n await this.initialize();\n\n return response.data;\n } catch (error) {\n // Make sure cookie is removed on signup error\n await removeCookie('user');\n setError(error);\n console.log('Sign up failed');\n throw error;\n }\n },\n\n async logout() {\n await removeCookie('user');\n setAuthToken(null);\n this.resetState();\n },\n\n async resetPassword(user, type) {\n try {\n const response = await $axios.post('/api/auth/reset-password', {\n email: user.email,\n phone: user.phone,\n type,\n });\n\n Object.assign(twofa.state.code, {\n ...response.data,\n isSended: true,\n });\n\n return response.data;\n } catch (error) {\n setError(error);\n return Promise.reject(error);\n }\n },\n\n async updatePassword(user, type) {\n const { password, passwordRepeat } = state.user;\n\n if (password !== passwordRepeat) {\n const error = {\n response: {\n data: { errorCode: 'PASSWORDS_DO_NOT_MATCH' },\n },\n };\n setError(error);\n throw new Error(error.response.status);\n }\n\n try {\n const response = await $axios.post('/api/auth/update-password', {\n email: user.email,\n phone: user.phone,\n password: user.password,\n passwordRepeat: user.passwordRepeat,\n type,\n });\n\n if (response.data.accessToken) {\n setCookie('user', response.data);\n }\n\n Object.assign(state.user, {\n ...response.data,\n });\n\n Object.assign(state.access, {\n token: response.data.accessToken,\n status: true,\n });\n\n return response.data;\n } catch (error) {\n // Make sure cookie is removed on password update error\n await removeCookie('user');\n setError(error);\n return Promise.reject(error);\n }\n },\n};\n\n// Cookies\nconst optionsDefault = {\n development: { secure: false, expires: 7, sameSite: 'Lax' },\n production: {\n expires: 7,\n path: '/',\n domain: process.env.DOMAIN_URL,\n sameSite: 'strict',\n secure: true,\n },\n};\n\nasync function getCookie(name) {\n if (process.env.MOBILE_APP) {\n const { value } = await Preferences.get({ key: name });\n return value ? JSON.parse(value) : null;\n } else {\n const cookie = Cookies.get(name);\n return cookie ? JSON.parse(cookie) : null;\n }\n}\n\nasync function setCookie(name, data, env = process.env.DOMAIN_URL) {\n if (process.env.MOBILE_APP) {\n // Если приложение запущено в Capacitor\n await Preferences.set({\n key: name,\n value: JSON.stringify(data),\n });\n } else {\n // Для веб-версии\n Cookies.set(name, JSON.stringify(data), optionsDefault[env]);\n }\n}\n\nasync function removeCookie(name, env = process.env.NODE_ENV) {\n if (process.env.MOBILE_APP) {\n // Если приложение запущено в Capacitor\n await Preferences.remove({ key: name });\n } else {\n // Для веб-версии\n const options = env === 'production' ? { domain: process.env.DOMAIN_URL, path: '/' } : {};\n Cookies.remove(name, options);\n }\n}\n\n// History\nconst history = [];\nhistory.push(state);\n\n// Watch\nwatch(state, (newState, oldState) => {\n history.push(newState);\n});\n\n// Module Export\nexport { actions, removeCookie, state };\n"],"names":["twofa.state","Cookies"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"auth.js","sources":["../../../../../../../src/modules/auth/views/store/auth.js"],"sourcesContent":["// Dependencies\nimport $axios, { setAuthToken } from '@martyrs/src/modules/globals/views/utils/axios-instance.js';\nimport Cookies from 'js-cookie';\n// Capacitor\nimport { Preferences } from '@capacitor/preferences';\n// Vue modules\nimport { reactive, watch } from 'vue';\n// Globals\nimport { setError } from '@martyrs/src/modules/globals/views/store/globals.js';\nimport globalWebSocket from '@martyrs/src/modules/globals/views/classes/globals.websocket.js';\n// State\nimport * as twofa from './twofa.js';\n\n// State\nconst state = reactive({\n user: {\n _id: undefined,\n avatar: null,\n username: '',\n email: '',\n phone: '',\n password: '',\n passwordRepeat: '',\n },\n access: {\n roles: null,\n token: null,\n status: false,\n },\n accesses: [],\n});\n\nconst actions = {\n async initialize(cookie) {\n try {\n const userCookie = cookie ? cookie : await getCookie('user');\n\n if (userCookie) {\n const { _id, email, phone, avatar, roles, accessToken } = userCookie;\n\n setAuthToken(accessToken);\n\n // Проверка токена через серверный маршрут\n const response = await $axios.get('/api/organizations/check-accesses');\n const userAccesses = response.data;\n state.accesses = userAccesses;\n\n // Обновление состояния приложения с информацией о пользователе и его правах доступа\n Object.assign(state.user, { _id, email, phone, avatar });\n Object.assign(state.access, { token: accessToken, roles, status: !!accessToken });\n } else {\n console.log('no cookies');\n setAuthToken(null);\n this.resetState();\n }\n } catch (error) {\n console.error('Error initializing auth:', error);\n // Make sure we remove the cookie when there's an error\n await removeCookie('user');\n setAuthToken(null);\n this.resetState();\n setError(error);\n }\n },\n\n // Helper method to reset state\n resetState() {\n state.accesses = [];\n state.user = {\n _id: undefined,\n avatar: null,\n username: '',\n email: '',\n phone: '',\n password: '',\n passwordRepeat: '',\n };\n state.access = {\n roles: null,\n token: null,\n status: false,\n };\n },\n\n async login(user, type) {\n try {\n const response = await $axios.post('/api/auth/signin', {\n ...user,\n type,\n });\n\n setCookie('user', response.data);\n\n Object.assign(state.user, {\n ...response.data,\n });\n\n Object.assign(state.access, {\n token: response.data.accessToken,\n status: true,\n roles: response.data.roles,\n });\n\n await this.initialize();\n \n // Переподключаем WebSocket с новым userId после входа\n console.log('[AUTH] Reconnecting WebSocket after login for user:', response.data._id);\n globalWebSocket.disconnect();\n await globalWebSocket.connect(response.data._id);\n\n return response.data;\n } catch (error) {\n // Make sure cookie is removed on login error\n await removeCookie('user');\n\n Object.assign(state.access, {\n token: null,\n status: false,\n roles: null,\n });\n\n console.log(error);\n setError(error);\n return Promise.reject(error);\n }\n },\n\n async signup(user, type, invite) {\n const { password, passwordRepeat } = state.user;\n\n console.log(password);\n console.log(passwordRepeat);\n\n if (password !== passwordRepeat) {\n const error = {\n response: {\n data: { errorCode: 'PASSWORDS_DO_NOT_MATCH' },\n },\n };\n setError(error);\n throw new Error(error.response.status);\n }\n\n try {\n const response = await $axios.post('/api/auth/signup', {\n ...user,\n type,\n inviteCode: invite,\n });\n\n console.log(response);\n\n if (response.data.accessToken) {\n setCookie('user', response.data);\n }\n\n Object.assign(state.user, {\n ...response.data,\n });\n\n Object.assign(state.access, {\n token: response.data.accessToken,\n status: true,\n roles: response.data.roles,\n });\n\n await this.initialize();\n \n // Переподключаем WebSocket с новым userId после регистрации\n console.log('[AUTH] Reconnecting WebSocket after signup for user:', response.data._id);\n globalWebSocket.disconnect();\n await globalWebSocket.connect(response.data._id);\n\n return response.data;\n } catch (error) {\n // Make sure cookie is removed on signup error\n await removeCookie('user');\n setError(error);\n console.log('Sign up failed');\n throw error;\n }\n },\n\n async logout() {\n await removeCookie('user');\n setAuthToken(null);\n this.resetState();\n \n // Отключаем WebSocket при выходе\n console.log('[AUTH] Disconnecting WebSocket on logout');\n globalWebSocket.disconnect();\n },\n\n async resetPassword(user, type) {\n try {\n const response = await $axios.post('/api/auth/reset-password', {\n email: user.email,\n phone: user.phone,\n type,\n });\n\n Object.assign(twofa.state.code, {\n ...response.data,\n isSended: true,\n });\n\n return response.data;\n } catch (error) {\n setError(error);\n return Promise.reject(error);\n }\n },\n\n async updatePassword(user, type) {\n const { password, passwordRepeat } = state.user;\n\n if (password !== passwordRepeat) {\n const error = {\n response: {\n data: { errorCode: 'PASSWORDS_DO_NOT_MATCH' },\n },\n };\n setError(error);\n throw new Error(error.response.status);\n }\n\n try {\n const response = await $axios.post('/api/auth/update-password', {\n email: user.email,\n phone: user.phone,\n password: user.password,\n passwordRepeat: user.passwordRepeat,\n type,\n });\n\n if (response.data.accessToken) {\n setCookie('user', response.data);\n }\n\n Object.assign(state.user, {\n ...response.data,\n });\n\n Object.assign(state.access, {\n token: response.data.accessToken,\n status: true,\n });\n\n return response.data;\n } catch (error) {\n // Make sure cookie is removed on password update error\n await removeCookie('user');\n setError(error);\n return Promise.reject(error);\n }\n },\n};\n\n// Cookies\nconst optionsDefault = {\n development: { secure: false, expires: 7, sameSite: 'Lax' },\n production: {\n expires: 7,\n path: '/',\n domain: process.env.DOMAIN_URL,\n sameSite: 'strict',\n secure: true,\n },\n};\n\nasync function getCookie(name) {\n if (process.env.MOBILE_APP) {\n const { value } = await Preferences.get({ key: name });\n return value ? JSON.parse(value) : null;\n } else {\n const cookie = Cookies.get(name);\n return cookie ? JSON.parse(cookie) : null;\n }\n}\n\nasync function setCookie(name, data, env = process.env.DOMAIN_URL) {\n if (process.env.MOBILE_APP) {\n // Если приложение запущено в Capacitor\n await Preferences.set({\n key: name,\n value: JSON.stringify(data),\n });\n } else {\n // Для веб-версии\n Cookies.set(name, JSON.stringify(data), optionsDefault[env]);\n }\n}\n\nasync function removeCookie(name, env = process.env.NODE_ENV) {\n if (process.env.MOBILE_APP) {\n // Если приложение запущено в Capacitor\n await Preferences.remove({ key: name });\n } else {\n // Для веб-версии\n const options = env === 'production' ? { domain: process.env.DOMAIN_URL, path: '/' } : {};\n Cookies.remove(name, options);\n }\n}\n\n// History\nconst history = [];\nhistory.push(state);\n\n// Watch\nwatch(state, (newState, oldState) => {\n history.push(newState);\n});\n\n// Module Export\nexport { actions, removeCookie, state };\n"],"names":["twofa.state","Cookies"],"mappings":"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"}
|
|
@@ -1,32 +1,48 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
|
|
3
|
+
const IconCheckmark = require("../../../icons/navigation/IconCheckmark.vue.cjs");
|
|
3
4
|
const vue = require("vue");
|
|
4
5
|
const _pluginVue_exportHelper = require("../../../../../../_virtual/_plugin-vue_export-helper.cjs");
|
|
5
6
|
const _sfc_main = {
|
|
7
|
+
components: {
|
|
8
|
+
IconCheckmark: IconCheckmark.default
|
|
9
|
+
},
|
|
6
10
|
props: {
|
|
7
11
|
message: {
|
|
8
12
|
type: Object,
|
|
9
13
|
required: true
|
|
10
14
|
}
|
|
15
|
+
},
|
|
16
|
+
computed: {
|
|
17
|
+
isMessageRead() {
|
|
18
|
+
return this.message.readBy && this.message.readBy.length > 0;
|
|
19
|
+
}
|
|
11
20
|
}
|
|
12
21
|
};
|
|
13
|
-
const _hoisted_1 =
|
|
14
|
-
const _hoisted_2 = { class: "
|
|
15
|
-
const _hoisted_3 = { class: "
|
|
16
|
-
const _hoisted_4 = { class: "t-
|
|
22
|
+
const _hoisted_1 = ["data-message-id"];
|
|
23
|
+
const _hoisted_2 = { class: "flex-v-center gap-thin flex-nowrap flex w-100 p-small" };
|
|
24
|
+
const _hoisted_3 = { class: "mn-r-auto" };
|
|
25
|
+
const _hoisted_4 = { class: "t-semi" };
|
|
26
|
+
const _hoisted_5 = { class: "t-transp" };
|
|
17
27
|
function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
28
|
+
const _component_IconCheckmark = vue.resolveComponent("IconCheckmark");
|
|
18
29
|
return vue.openBlock(), vue.createElementBlock("div", {
|
|
19
|
-
class: vue.normalizeClass(["pd-small", { "bg-main-nano": $props.message.username === "Support" }])
|
|
30
|
+
class: vue.normalizeClass(["pd-small", { "bg-main-nano": $props.message.username === "Support" }]),
|
|
31
|
+
"data-message-id": $props.message._id
|
|
20
32
|
}, [
|
|
21
|
-
vue.createElementVNode("p",
|
|
22
|
-
vue.createElementVNode("strong",
|
|
23
|
-
vue.createElementVNode("span",
|
|
33
|
+
vue.createElementVNode("p", _hoisted_2, [
|
|
34
|
+
vue.createElementVNode("strong", _hoisted_3, [
|
|
35
|
+
vue.createElementVNode("span", _hoisted_4, vue.toDisplayString($props.message.username), 1),
|
|
24
36
|
_cache[0] || (_cache[0] = vue.createTextVNode()),
|
|
25
|
-
vue.createElementVNode("span",
|
|
26
|
-
])
|
|
37
|
+
vue.createElementVNode("span", _hoisted_5, vue.toDisplayString(_ctx.formatDate($props.message.createdAt)), 1)
|
|
38
|
+
]),
|
|
39
|
+
$options.isMessageRead ? (vue.openBlock(), vue.createBlock(_component_IconCheckmark, {
|
|
40
|
+
key: 0,
|
|
41
|
+
class: "i-small t-main"
|
|
42
|
+
})) : vue.createCommentVNode("", true)
|
|
27
43
|
]),
|
|
28
44
|
vue.createElementVNode("p", null, vue.toDisplayString($props.message.text), 1)
|
|
29
|
-
],
|
|
45
|
+
], 10, _hoisted_1);
|
|
30
46
|
}
|
|
31
47
|
const ChatMessage = /* @__PURE__ */ _pluginVue_exportHelper.default(_sfc_main, [["render", _sfc_render]]);
|
|
32
48
|
exports.default = ChatMessage;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatMessage.vue.cjs","sources":["../../../../../../../src/modules/chats/components/blocks/ChatMessage.vue"],"sourcesContent":["<template>\n <div \n class=\"pd-small\"\n :class=\"{'bg-main-nano': message.username === 'Support'}\"\n >\n <p class=\"flex-v-center gap-thin flex-nowrap flex w-100 p-small\">\n <!-- <img loading=\"lazy\" v-if=\"message.username === 'Weeder Support'\" src=\"/logo/logo.png\" class=\"i-medium\"> -->\n <strong class=\"mn-r-auto\"><span class=\"t-semi\">{{ message.username }}</span> <span class=\"t-transp\">{{formatDate(message.createdAt)}}</span></strong>\n </p>\n <p>{{ message.text }}</p>\n </div>\n</template>\n\n<script>\nexport default {\n props: {\n message: {\n type: Object,\n required: true\n }\n }\n};\n</script>\n\n<style>\n</style>\n"],"names":["_createElementBlock","_normalizeClass","_createElementVNode","_toDisplayString","_createTextVNode"],"mappings":"
|
|
1
|
+
{"version":3,"file":"ChatMessage.vue.cjs","sources":["../../../../../../../src/modules/chats/components/blocks/ChatMessage.vue"],"sourcesContent":["<template>\n <div \n class=\"pd-small\"\n :class=\"{'bg-main-nano': message.username === 'Support'}\"\n :data-message-id=\"message._id\"\n >\n <p class=\"flex-v-center gap-thin flex-nowrap flex w-100 p-small\">\n <!-- <img loading=\"lazy\" v-if=\"message.username === 'Weeder Support'\" src=\"/logo/logo.png\" class=\"i-medium\"> -->\n <strong class=\"mn-r-auto\"><span class=\"t-semi\">{{ message.username }}</span> <span class=\"t-transp\">{{formatDate(message.createdAt)}}</span></strong>\n <IconCheckmark v-if=\"isMessageRead\" class=\"i-small t-main\" />\n </p>\n <p>{{ message.text }}</p>\n </div>\n</template>\n\n<script>\nimport IconCheckmark from '@martyrs/src/modules/icons/navigation/IconCheckmark.vue';\n\nexport default {\n components: {\n IconCheckmark\n },\n props: {\n message: {\n type: Object,\n required: true\n }\n },\n computed: {\n isMessageRead() {\n return this.message.readBy && this.message.readBy.length > 0;\n }\n }\n};\n</script>\n\n<style>\n</style>\n"],"names":["IconCheckmark","_createElementBlock","_normalizeClass","_createElementVNode","_toDisplayString","_createTextVNode","_createBlock","_createCommentVNode"],"mappings":";;;;;AAkBA,MAAK,YAAU;AAAA,EACb,YAAY;AAAA,mBACVA,cAAAA;AAAAA;EAEF,OAAO;AAAA,IACL,SAAS;AAAA,MACP,MAAM;AAAA,MACN,UAAU;AAAA,IACZ;AAAA;EAEF,UAAU;AAAA,IACR,gBAAgB;AACd,aAAO,KAAK,QAAQ,UAAU,KAAK,QAAQ,OAAO,SAAS;AAAA,IAC7D;AAAA,EACF;AACF;AAjCA,MAAA,aAAA,CAAA,iBAAA;AAMO,MAAA,aAAA,EAAA,OAAM,wDAAuD;AAEtD,MAAA,aAAA,EAAA,OAAM,YAAW;AAAO,MAAA,aAAA,EAAA,OAAM,SAAQ;AAAqC,MAAA,aAAA,EAAA,OAAM,WAAU;;;0BAPvGC,IAAAA,mBAWM,OAAA;AAAA,IAVJ,OAFJC,IAAAA,eAAA,CAEU,YAAU,EAAA,gBACS,OAAA,QAAQ,aAAQ,UAAA,CAAA,CAAA;AAAA,IACxC,mBAAiB,OAAA,QAAQ;AAAA;IAE1BC,IAAAA,mBAII,KAJJ,YAII;AAAA,MAFFA,IAAAA,mBAAqJ,UAArJ,YAAqJ;AAAA,QAA3HA,uBAAkD,QAAlD,YAAkDC,IAAAA,gBAA1B,OAAA,QAAQ,QAAQ,GAAA,CAAA;AAAA,QARxE,OAAA,CAAA,MAAA,OAAA,CAAA,IAAAC,IAAAA,gBAAA;AAAA,QAQmFF,IAAAA,mBAA+D,QAA/D,YAA+DC,IAAAA,gBAAtC,gBAAW,OAAA,QAAQ,SAAS,CAAA,GAAA,CAAA;AAAA;MAC7G,SAAA,kCAArBE,IAAAA,YAA6D,0BAAA;AAAA,QATnE,KAAA;AAAA,QAS0C,OAAM;AAAA,YAThDC,IAAAA,mBAAA,IAAA,IAAA;AAAA;IAWIJ,IAAAA,mBAAyB,KAAA,MAAAC,IAAAA,gBAAnB,OAAA,QAAQ,IAAI,GAAA,CAAA;AAAA,EAXtB,GAAA,IAAA,UAAA;;;;"}
|
|
@@ -1,30 +1,46 @@
|
|
|
1
|
-
import
|
|
1
|
+
import _sfc_main$1 from "../../../icons/navigation/IconCheckmark.vue.js";
|
|
2
|
+
import { resolveComponent, createElementBlock, openBlock, normalizeClass, createElementVNode, createBlock, createCommentVNode, createTextVNode, toDisplayString } from "vue";
|
|
2
3
|
import _export_sfc from "../../../../../../_virtual/_plugin-vue_export-helper.js";
|
|
3
4
|
const _sfc_main = {
|
|
5
|
+
components: {
|
|
6
|
+
IconCheckmark: _sfc_main$1
|
|
7
|
+
},
|
|
4
8
|
props: {
|
|
5
9
|
message: {
|
|
6
10
|
type: Object,
|
|
7
11
|
required: true
|
|
8
12
|
}
|
|
13
|
+
},
|
|
14
|
+
computed: {
|
|
15
|
+
isMessageRead() {
|
|
16
|
+
return this.message.readBy && this.message.readBy.length > 0;
|
|
17
|
+
}
|
|
9
18
|
}
|
|
10
19
|
};
|
|
11
|
-
const _hoisted_1 =
|
|
12
|
-
const _hoisted_2 = { class: "
|
|
13
|
-
const _hoisted_3 = { class: "
|
|
14
|
-
const _hoisted_4 = { class: "t-
|
|
20
|
+
const _hoisted_1 = ["data-message-id"];
|
|
21
|
+
const _hoisted_2 = { class: "flex-v-center gap-thin flex-nowrap flex w-100 p-small" };
|
|
22
|
+
const _hoisted_3 = { class: "mn-r-auto" };
|
|
23
|
+
const _hoisted_4 = { class: "t-semi" };
|
|
24
|
+
const _hoisted_5 = { class: "t-transp" };
|
|
15
25
|
function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
26
|
+
const _component_IconCheckmark = resolveComponent("IconCheckmark");
|
|
16
27
|
return openBlock(), createElementBlock("div", {
|
|
17
|
-
class: normalizeClass(["pd-small", { "bg-main-nano": $props.message.username === "Support" }])
|
|
28
|
+
class: normalizeClass(["pd-small", { "bg-main-nano": $props.message.username === "Support" }]),
|
|
29
|
+
"data-message-id": $props.message._id
|
|
18
30
|
}, [
|
|
19
|
-
createElementVNode("p",
|
|
20
|
-
createElementVNode("strong",
|
|
21
|
-
createElementVNode("span",
|
|
31
|
+
createElementVNode("p", _hoisted_2, [
|
|
32
|
+
createElementVNode("strong", _hoisted_3, [
|
|
33
|
+
createElementVNode("span", _hoisted_4, toDisplayString($props.message.username), 1),
|
|
22
34
|
_cache[0] || (_cache[0] = createTextVNode()),
|
|
23
|
-
createElementVNode("span",
|
|
24
|
-
])
|
|
35
|
+
createElementVNode("span", _hoisted_5, toDisplayString(_ctx.formatDate($props.message.createdAt)), 1)
|
|
36
|
+
]),
|
|
37
|
+
$options.isMessageRead ? (openBlock(), createBlock(_component_IconCheckmark, {
|
|
38
|
+
key: 0,
|
|
39
|
+
class: "i-small t-main"
|
|
40
|
+
})) : createCommentVNode("", true)
|
|
25
41
|
]),
|
|
26
42
|
createElementVNode("p", null, toDisplayString($props.message.text), 1)
|
|
27
|
-
],
|
|
43
|
+
], 10, _hoisted_1);
|
|
28
44
|
}
|
|
29
45
|
const ChatMessage = /* @__PURE__ */ _export_sfc(_sfc_main, [["render", _sfc_render]]);
|
|
30
46
|
export {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatMessage.vue.js","sources":["../../../../../../../src/modules/chats/components/blocks/ChatMessage.vue"],"sourcesContent":["<template>\n <div \n class=\"pd-small\"\n :class=\"{'bg-main-nano': message.username === 'Support'}\"\n >\n <p class=\"flex-v-center gap-thin flex-nowrap flex w-100 p-small\">\n <!-- <img loading=\"lazy\" v-if=\"message.username === 'Weeder Support'\" src=\"/logo/logo.png\" class=\"i-medium\"> -->\n <strong class=\"mn-r-auto\"><span class=\"t-semi\">{{ message.username }}</span> <span class=\"t-transp\">{{formatDate(message.createdAt)}}</span></strong>\n </p>\n <p>{{ message.text }}</p>\n </div>\n</template>\n\n<script>\nexport default {\n props: {\n message: {\n type: Object,\n required: true\n }\n }\n};\n</script>\n\n<style>\n</style>\n"],"names":["_createElementBlock","_normalizeClass","_createElementVNode","_toDisplayString","_createTextVNode"],"mappings":"
|
|
1
|
+
{"version":3,"file":"ChatMessage.vue.js","sources":["../../../../../../../src/modules/chats/components/blocks/ChatMessage.vue"],"sourcesContent":["<template>\n <div \n class=\"pd-small\"\n :class=\"{'bg-main-nano': message.username === 'Support'}\"\n :data-message-id=\"message._id\"\n >\n <p class=\"flex-v-center gap-thin flex-nowrap flex w-100 p-small\">\n <!-- <img loading=\"lazy\" v-if=\"message.username === 'Weeder Support'\" src=\"/logo/logo.png\" class=\"i-medium\"> -->\n <strong class=\"mn-r-auto\"><span class=\"t-semi\">{{ message.username }}</span> <span class=\"t-transp\">{{formatDate(message.createdAt)}}</span></strong>\n <IconCheckmark v-if=\"isMessageRead\" class=\"i-small t-main\" />\n </p>\n <p>{{ message.text }}</p>\n </div>\n</template>\n\n<script>\nimport IconCheckmark from '@martyrs/src/modules/icons/navigation/IconCheckmark.vue';\n\nexport default {\n components: {\n IconCheckmark\n },\n props: {\n message: {\n type: Object,\n required: true\n }\n },\n computed: {\n isMessageRead() {\n return this.message.readBy && this.message.readBy.length > 0;\n }\n }\n};\n</script>\n\n<style>\n</style>\n"],"names":["IconCheckmark","_createElementBlock","_normalizeClass","_createElementVNode","_toDisplayString","_createTextVNode","_createBlock","_createCommentVNode"],"mappings":";;;AAkBA,MAAK,YAAU;AAAA,EACb,YAAY;AAAA,mBACVA;AAAAA;EAEF,OAAO;AAAA,IACL,SAAS;AAAA,MACP,MAAM;AAAA,MACN,UAAU;AAAA,IACZ;AAAA;EAEF,UAAU;AAAA,IACR,gBAAgB;AACd,aAAO,KAAK,QAAQ,UAAU,KAAK,QAAQ,OAAO,SAAS;AAAA,IAC7D;AAAA,EACF;AACF;AAjCA,MAAA,aAAA,CAAA,iBAAA;AAMO,MAAA,aAAA,EAAA,OAAM,wDAAuD;AAEtD,MAAA,aAAA,EAAA,OAAM,YAAW;AAAO,MAAA,aAAA,EAAA,OAAM,SAAQ;AAAqC,MAAA,aAAA,EAAA,OAAM,WAAU;;;sBAPvGC,mBAWM,OAAA;AAAA,IAVJ,OAFJC,eAAA,CAEU,YAAU,EAAA,gBACS,OAAA,QAAQ,aAAQ,UAAA,CAAA,CAAA;AAAA,IACxC,mBAAiB,OAAA,QAAQ;AAAA;IAE1BC,mBAII,KAJJ,YAII;AAAA,MAFFA,mBAAqJ,UAArJ,YAAqJ;AAAA,QAA3HA,mBAAkD,QAAlD,YAAkDC,gBAA1B,OAAA,QAAQ,QAAQ,GAAA,CAAA;AAAA,QARxE,OAAA,CAAA,MAAA,OAAA,CAAA,IAAAC,gBAAA;AAAA,QAQmFF,mBAA+D,QAA/D,YAA+DC,gBAAtC,gBAAW,OAAA,QAAQ,SAAS,CAAA,GAAA,CAAA;AAAA;MAC7G,SAAA,8BAArBE,YAA6D,0BAAA;AAAA,QATnE,KAAA;AAAA,QAS0C,OAAM;AAAA,YAThDC,mBAAA,IAAA,IAAA;AAAA;IAWIJ,mBAAyB,KAAA,MAAAC,gBAAnB,OAAA,QAAQ,IAAI,GAAA,CAAA;AAAA,EAXtB,GAAA,IAAA,UAAA;;;"}
|
|
@@ -17,6 +17,8 @@ const _sfc_main = {
|
|
|
17
17
|
setup(__props) {
|
|
18
18
|
const newMessage = vue.ref("");
|
|
19
19
|
const allMessages = vue.ref(null);
|
|
20
|
+
const visibleMessageIds = vue.ref(/* @__PURE__ */ new Set());
|
|
21
|
+
let messageObserver = null;
|
|
20
22
|
const messages = vue.computed(() => chat_store.default.state.messages);
|
|
21
23
|
const scrollToBottom = () => {
|
|
22
24
|
if (allMessages.value) {
|
|
@@ -38,11 +40,65 @@ const _sfc_main = {
|
|
|
38
40
|
scrollToBottom();
|
|
39
41
|
}
|
|
40
42
|
};
|
|
43
|
+
const observeMessages = () => {
|
|
44
|
+
console.log("[CHAT] Setting up message observer");
|
|
45
|
+
if (messageObserver) {
|
|
46
|
+
messageObserver.disconnect();
|
|
47
|
+
}
|
|
48
|
+
messageObserver = new IntersectionObserver((entries) => {
|
|
49
|
+
console.log("[CHAT] Observer triggered for", entries.length, "entries");
|
|
50
|
+
entries.forEach((entry) => {
|
|
51
|
+
const messageId = entry.target.dataset.messageId;
|
|
52
|
+
if (entry.isIntersecting) {
|
|
53
|
+
visibleMessageIds.value.add(messageId);
|
|
54
|
+
} else {
|
|
55
|
+
visibleMessageIds.value.delete(messageId);
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
if (visibleMessageIds.value.size > 0) {
|
|
59
|
+
const unreadVisibleMessages = messages.value.filter((msg) => {
|
|
60
|
+
if (!visibleMessageIds.value.has(msg._id)) return false;
|
|
61
|
+
console.log("[CHAT] Checking if own message:", {
|
|
62
|
+
msgUserId: msg.userId,
|
|
63
|
+
currentUserId: chat_store.default.state.userId,
|
|
64
|
+
isEqual: msg.userId === chat_store.default.state.userId,
|
|
65
|
+
msgUserIdType: typeof msg.userId,
|
|
66
|
+
currentUserIdType: typeof chat_store.default.state.userId
|
|
67
|
+
});
|
|
68
|
+
if (msg.userId && msg.userId === chat_store.default.state.userId) return false;
|
|
69
|
+
if (msg.readBy?.some((r) => r.userId === chat_store.default.state.userId)) return false;
|
|
70
|
+
console.log("[CHAT] Message can be marked as read:", {
|
|
71
|
+
msgId: msg._id,
|
|
72
|
+
msgUserId: msg.userId,
|
|
73
|
+
currentUserId: chat_store.default.state.userId,
|
|
74
|
+
readBy: msg.readBy
|
|
75
|
+
});
|
|
76
|
+
return true;
|
|
77
|
+
}).map((msg) => msg._id);
|
|
78
|
+
console.log("[CHAT] Unread visible messages to mark:", unreadVisibleMessages);
|
|
79
|
+
if (unreadVisibleMessages.length > 0) {
|
|
80
|
+
console.log("[CHAT] Sending markAsRead for messages:", unreadVisibleMessages);
|
|
81
|
+
chat_store.default.methods.markMessagesAsRead(unreadVisibleMessages);
|
|
82
|
+
} else {
|
|
83
|
+
console.log("[CHAT] No unread messages to mark");
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}, {
|
|
87
|
+
root: allMessages.value,
|
|
88
|
+
threshold: 0.5
|
|
89
|
+
});
|
|
90
|
+
vue.nextTick(() => {
|
|
91
|
+
const messageElements = allMessages.value?.querySelectorAll("[data-message-id]");
|
|
92
|
+
console.log("[CHAT] Found message elements to observe:", messageElements?.length);
|
|
93
|
+
messageElements?.forEach((el) => messageObserver.observe(el));
|
|
94
|
+
});
|
|
95
|
+
};
|
|
41
96
|
vue.onMounted(() => {
|
|
42
97
|
vue.nextTick(() => {
|
|
43
98
|
if (allMessages.value) {
|
|
44
99
|
allMessages.value.scrollTop = allMessages.value.scrollHeight;
|
|
45
100
|
}
|
|
101
|
+
observeMessages();
|
|
46
102
|
});
|
|
47
103
|
});
|
|
48
104
|
vue.watch(messages, () => {
|
|
@@ -50,8 +106,14 @@ const _sfc_main = {
|
|
|
50
106
|
if (allMessages.value) {
|
|
51
107
|
allMessages.value.scrollTop = allMessages.value.scrollHeight;
|
|
52
108
|
}
|
|
109
|
+
observeMessages();
|
|
53
110
|
});
|
|
54
111
|
}, { deep: true });
|
|
112
|
+
vue.onUnmounted(() => {
|
|
113
|
+
if (messageObserver) {
|
|
114
|
+
messageObserver.disconnect();
|
|
115
|
+
}
|
|
116
|
+
});
|
|
55
117
|
return (_ctx, _cache) => {
|
|
56
118
|
return vue.openBlock(), vue.createElementBlock("div", _hoisted_1, [
|
|
57
119
|
vue.createElementVNode("div", {
|
|
@@ -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 <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 module: 'chat',\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//
|
|
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, onUnmounted, 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);\nconst visibleMessageIds = ref(new Set());\nlet messageObserver = 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 module: 'chat',\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// Отслеживание видимых сообщений\nconst observeMessages = () => {\n console.log('[CHAT] Setting up message observer');\n \n // Очищаем предыдущий observer если есть\n if (messageObserver) {\n messageObserver.disconnect();\n }\n \n messageObserver = new IntersectionObserver((entries) => {\n console.log('[CHAT] Observer triggered for', entries.length, 'entries');\n entries.forEach(entry => {\n const messageId = entry.target.dataset.messageId;\n if (entry.isIntersecting) {\n visibleMessageIds.value.add(messageId);\n } else {\n visibleMessageIds.value.delete(messageId);\n }\n });\n \n // Отправляем прочтение видимых сообщений\n if (visibleMessageIds.value.size > 0) {\n const unreadVisibleMessages = messages.value\n .filter(msg => {\n // Проверяем, что сообщение видимо\n if (!visibleMessageIds.value.has(msg._id)) return false;\n \n // Проверяем, что сообщение не от текущего пользователя\n console.log('[CHAT] Checking if own message:', {\n msgUserId: msg.userId,\n currentUserId: chatStore.state.userId,\n isEqual: msg.userId === chatStore.state.userId,\n msgUserIdType: typeof msg.userId,\n currentUserIdType: typeof chatStore.state.userId\n });\n if (msg.userId && msg.userId === chatStore.state.userId) return false;\n \n // Проверяем, что сообщение еще не прочитано текущим пользователем\n if (msg.readBy?.some(r => r.userId === chatStore.state.userId)) return false;\n \n console.log('[CHAT] Message can be marked as read:', {\n msgId: msg._id,\n msgUserId: msg.userId,\n currentUserId: chatStore.state.userId,\n readBy: msg.readBy\n });\n \n return true;\n })\n .map(msg => msg._id);\n \n console.log('[CHAT] Unread visible messages to mark:', unreadVisibleMessages);\n \n if (unreadVisibleMessages.length > 0) {\n console.log('[CHAT] Sending markAsRead for messages:', unreadVisibleMessages);\n chatStore.methods.markMessagesAsRead(unreadVisibleMessages);\n } else {\n console.log('[CHAT] No unread messages to mark');\n }\n }\n }, {\n root: allMessages.value,\n threshold: 0.5\n });\n \n // Наблюдаем за всеми сообщениями\n nextTick(() => {\n const messageElements = allMessages.value?.querySelectorAll('[data-message-id]');\n console.log('[CHAT] Found message elements to observe:', messageElements?.length);\n messageElements?.forEach(el => messageObserver.observe(el));\n });\n};\n\n// Прокрутка вниз при монтировании\nonMounted(() => {\n nextTick(() => {\n if (allMessages.value) {\n allMessages.value.scrollTop = allMessages.value.scrollHeight;\n }\n observeMessages();\n });\n});\n\n// Прокрутка вниз при изменении сообщений\nwatch(messages, () => {\n nextTick(() => {\n if (allMessages.value) {\n allMessages.value.scrollTop = allMessages.value.scrollHeight;\n }\n observeMessages();\n });\n}, { deep: true });\n\n// Очистка observer при размонтировании\nonUnmounted(() => {\n if (messageObserver) {\n messageObserver.disconnect();\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","onUnmounted"],"mappings":"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"}
|