@ozdao/martyrs 0.2.580 → 0.2.582
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/_virtual/dayjs.min.js +1 -1
- package/dist/_virtual/weekOfYear.js +1 -1
- package/dist/builder.js +1 -6
- package/dist/loader.js +1 -6
- package/dist/martyrs/src/components/Block/Block.vue.js +1 -1
- package/dist/martyrs/src/components/Button/{Button.vue2.js → Button.vue.js} +2 -2
- package/dist/martyrs/src/components/Button/Button.vue.js.map +1 -0
- package/dist/martyrs/src/components/EditImages/{EditImages.vue2.js → EditImages.vue.js} +2 -2
- package/dist/martyrs/src/components/EditImages/EditImages.vue.js.map +1 -0
- package/dist/martyrs/src/components/Feed/Feed.vue.js +1 -1
- package/dist/martyrs/src/components/FieldBig/FieldBig.vue.js +1 -1
- package/dist/martyrs/src/components/Select/{Select.vue.js → Select.vue2.js} +2 -2
- package/dist/martyrs/src/components/Select/Select.vue2.js.map +1 -0
- package/dist/martyrs/src/components/Spoiler/{Spoiler.vue2.js → Spoiler.vue.js} +2 -2
- package/dist/martyrs/src/components/Spoiler/Spoiler.vue.js.map +1 -0
- package/dist/martyrs/src/components/Tab/{Tab.vue2.js → Tab.vue.js} +2 -2
- package/dist/martyrs/src/components/Tab/Tab.vue.js.map +1 -0
- package/dist/martyrs/src/components/Tooltip/{Tooltip.vue.js → Tooltip.vue2.js} +2 -2
- package/dist/martyrs/src/components/Tooltip/Tooltip.vue2.js.map +1 -0
- package/dist/martyrs/src/modules/auth/views/components/pages/EnterPassword.vue.js +2 -2
- package/dist/martyrs/src/modules/auth/views/components/pages/Invite.vue.js +2 -2
- package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/ProfileBlogposts.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEdit.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEdit.vue.js.map +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEditAccount.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEditProfile.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/ResetPassword.vue.js +2 -2
- package/dist/martyrs/src/modules/auth/views/components/pages/SignIn.vue.js +5 -2
- package/dist/martyrs/src/modules/auth/views/components/pages/SignIn.vue.js.map +1 -1
- package/dist/martyrs/src/modules/auth/views/components/pages/SignUp.vue.js +2 -2
- package/dist/martyrs/src/modules/auth/views/components/sections/ProfileEditCredentials.vue.js +1 -1
- package/dist/martyrs/src/modules/auth/views/configs/navigation.user.config.js +2 -3
- package/dist/martyrs/src/modules/auth/views/configs/navigation.user.config.js.map +1 -1
- package/dist/martyrs/src/modules/auth/views/router/users.router.js +1 -2
- package/dist/martyrs/src/modules/auth/views/router/users.router.js.map +1 -1
- package/dist/martyrs/src/modules/auth/views/store/auth.js +1 -0
- package/dist/martyrs/src/modules/auth/views/store/auth.js.map +1 -1
- package/dist/martyrs/src/modules/community/components/layouts/Community.vue.js +1 -1
- package/dist/martyrs/src/modules/community/components/pages/BlogPost.vue.js +1 -1
- package/dist/martyrs/src/modules/community/components/pages/CreateBlogPost.vue.js +1 -1
- package/dist/martyrs/src/modules/constructor/components/sections/Constructor.vue.js +1 -1
- package/dist/martyrs/src/modules/core/views/classes/ws.manager.js +16 -1
- package/dist/martyrs/src/modules/core/views/classes/ws.manager.js.map +1 -1
- package/dist/martyrs/src/modules/core/views/components/blocks/CardHeader.vue.js +2 -2
- package/dist/martyrs/src/modules/core/views/components/blocks/PopupAuth.vue.js +1 -1
- package/dist/martyrs/src/modules/core/views/components/blocks/PopupDateSelector.vue.js +1 -1
- package/dist/martyrs/src/modules/core/views/components/layouts/Client.vue.js +1 -1
- package/dist/martyrs/src/modules/core/views/components/partials/Header.vue.js +2 -2
- package/dist/martyrs/src/modules/core/views/components/partials/Navigation.vue.js +1 -1
- package/dist/martyrs/src/modules/core/views/components/partials/NavigationBar.vue.js +1 -1
- package/dist/martyrs/src/modules/core/views/components/sections/{Filters.vue2.js → Filters.vue.js} +2 -2
- package/dist/martyrs/src/modules/core/views/components/sections/Filters.vue.js.map +1 -0
- package/dist/martyrs/src/modules/core/views/components/sections/SectionPageTitle.vue.js +1 -1
- package/dist/martyrs/src/modules/core/views/utils/vue-app-renderer.js +8 -1
- package/dist/martyrs/src/modules/core/views/utils/vue-app-renderer.js.map +1 -1
- package/dist/martyrs/src/modules/events/components/elements/ButtonCheck.vue.js +1 -1
- package/dist/martyrs/src/modules/events/components/elements/ButtonJoin.vue.js +1 -1
- package/dist/martyrs/src/modules/events/components/pages/EditEvent.vue.js +2 -2
- package/dist/martyrs/src/modules/events/components/pages/EditEventTickets.vue.js +1 -1
- package/dist/martyrs/src/modules/events/components/pages/Event.vue.js +1 -1
- package/dist/martyrs/src/modules/events/components/pages/EventsBackoffice.vue.js +1 -1
- package/dist/martyrs/src/modules/events/components/sections/EditTickets.vue.js +1 -1
- package/dist/martyrs/src/modules/gallery/components/sections/BackofficeGallery.vue.js +3 -3
- package/dist/martyrs/src/modules/inventory/components/forms/AdjustmentForm.vue.js +2 -2
- package/dist/martyrs/src/modules/inventory/components/forms/ColumnSettingsMenu.vue.js +1 -1
- package/dist/martyrs/src/modules/inventory/components/forms/HistoryView.vue.js +1 -1
- package/dist/martyrs/src/modules/inventory/components/forms/StockAlertsForm.vue.js +2 -2
- package/dist/martyrs/src/modules/inventory/components/pages/InventoryEdit.vue.js +2 -2
- package/dist/martyrs/src/modules/landing/components/sections/SectionGuide.vue.js +1 -1
- package/dist/martyrs/src/modules/marketplace/views/components/pages/Marketplace.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/blocks/ActionButtons.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/cards/AlbumCard.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/cards/ArtistCardSmall.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/cards/PlaylistCard.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/cards/TrackListCard.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/forms/AlbumForm.vue.js +2 -2
- package/dist/martyrs/src/modules/music/components/forms/ArtistForm.vue.js +2 -2
- package/dist/martyrs/src/modules/music/components/forms/PlaylistForm.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/forms/SearchForm.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/forms/TrackForm.vue.js +2 -2
- package/dist/martyrs/src/modules/music/components/pages/Album.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/pages/Artist.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/pages/MusicLibrary.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/pages/Playlist.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/pages/SearchResults.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/pages/Track.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/pages/TrackCreate.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/player/MusicPlayer.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/player/PlayerControls.vue.js +1 -1
- package/dist/martyrs/src/modules/music/components/player/VolumeControl.vue.js +1 -1
- package/dist/martyrs/src/modules/notifications/components/blocks/NotificationItem.vue.js +2 -2
- package/dist/martyrs/src/modules/notifications/components/blocks/NotificationItem.vue.js.map +1 -1
- package/dist/martyrs/src/modules/notifications/components/layouts/NotificationsLayout.vue.js +11 -40
- package/dist/martyrs/src/modules/notifications/components/layouts/NotificationsLayout.vue.js.map +1 -1
- package/dist/martyrs/src/modules/notifications/components/pages/Notifications.vue.js +26 -21
- package/dist/martyrs/src/modules/notifications/components/pages/Notifications.vue.js.map +1 -1
- package/dist/martyrs/src/modules/notifications/components/sections/NotificationPreferences.vue.js +54 -48
- package/dist/martyrs/src/modules/notifications/components/sections/NotificationPreferences.vue.js.map +1 -1
- package/dist/martyrs/src/modules/notifications/components/sections/NotificationsList.vue.js +37 -117
- package/dist/martyrs/src/modules/notifications/components/sections/NotificationsList.vue.js.map +1 -1
- package/dist/martyrs/src/modules/notifications/notifications.client.js +18 -15
- package/dist/martyrs/src/modules/notifications/notifications.client.js.map +1 -1
- package/dist/martyrs/src/modules/orders/components/blocks/CardOrderUser.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/components/forms/FormApplicationDetails.vue.js +2 -2
- package/dist/martyrs/src/modules/orders/components/forms/FormCustomerDetails.vue.js +2 -2
- package/dist/martyrs/src/modules/orders/components/forms/FormSelectCustomer.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/components/pages/OrderBackoffice.vue.js +3 -3
- package/dist/martyrs/src/modules/orders/components/pages/OrderCreate.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/components/pages/OrderCreateBackoffice.vue.js +2 -2
- package/dist/martyrs/src/modules/orders/components/pages/Orders.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/components/sections/ApplicationDetails.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/components/sections/CustomerDetails.vue.js +1 -1
- package/dist/martyrs/src/modules/orders/components/sections/FormDelivery.vue.js +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.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/elements/ButtonToggleMembership.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/forms/AddExistingMembersForm.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/forms/DepartmentForm.vue.js +2 -2
- package/dist/martyrs/src/modules/organizations/components/forms/InviteForm.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/Department.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/Organization.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.js +3 -3
- package/dist/martyrs/src/modules/organizations/components/pages/Organizations.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/sections/Documents.vue.js +1 -1
- package/dist/martyrs/src/modules/organizations/components/sections/MembersAdd.vue.js +2 -2
- package/dist/martyrs/src/modules/organizations/components/sections/Organizations.vue.js +2 -2
- package/dist/martyrs/src/modules/pages/views/components/blocks/CardPage.vue.js +1 -1
- package/dist/martyrs/src/modules/pages/views/components/pages/PageEdit.vue.js +2 -2
- package/dist/martyrs/src/modules/pages/views/components/partials/SidebarPages.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/blocks/ProductDiscounts.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/pages/Categories.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.js +3 -3
- package/dist/martyrs/src/modules/products/components/pages/Product.vue.js +2 -2
- package/dist/martyrs/src/modules/products/components/pages/ProductEdit.vue.js +4 -4
- package/dist/martyrs/src/modules/products/components/pages/Products.vue.js +3 -3
- package/dist/martyrs/src/modules/products/components/sections/EditAttributes.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/sections/EditDiscounts.vue.js +2 -2
- package/dist/martyrs/src/modules/products/components/sections/EditVariants.vue.js +3 -3
- package/dist/martyrs/src/modules/products/components/sections/FilterProducts.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/sections/ProductConfigurator.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/sections/ProductsRecommended.vue.js +1 -1
- package/dist/martyrs/src/modules/products/components/sections/SectionProduct.vue.js +2 -2
- package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttToolbar.vue.js +2 -2
- package/dist/martyrs/src/modules/rents/views/components/pages/Rents.vue.js +1 -1
- package/dist/martyrs/src/modules/rents/views/components/pages/RentsEdit.vue.js +1 -1
- package/dist/martyrs/src/modules/reports/components/sections/FormReport.vue.js +2 -2
- package/dist/martyrs/src/modules/spots/components/blocks/SpotMemberModify.vue.js +1 -1
- package/dist/martyrs/src/modules/spots/components/layouts/Spots.vue.js +1 -1
- package/dist/martyrs/src/modules/spots/components/pages/Map.vue.js +1 -1
- package/dist/martyrs/src/modules/spots/components/pages/Spot.vue.js +1 -1
- package/dist/martyrs/src/modules/spots/components/pages/SpotEdit.vue.js +3 -3
- package/dist/martyrs/src/modules/spots/components/sections/WorktimeEdit.vue.js +2 -2
- 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.js +3 -3
- package/dist/{martyrs → node_modules/.pnpm/@vue_server-renderer@3.5.13_vue@3.5.13_typescript@5.8.3_}/node_modules/@vue/server-renderer/dist/server-renderer.esm-bundler.js +1 -1
- package/dist/node_modules/.pnpm/@vue_server-renderer@3.5.13_vue@3.5.13_typescript@5.8.3_/node_modules/@vue/server-renderer/dist/server-renderer.esm-bundler.js.map +1 -0
- package/dist/node_modules/.pnpm/@vue_shared@3.5.13/node_modules/@vue/shared/dist/shared.esm-bundler.js.map +1 -0
- package/dist/{martyrs → node_modules/.pnpm/dayjs@1.11.13}/node_modules/dayjs/dayjs.min.js +1 -1
- package/dist/node_modules/.pnpm/dayjs@1.11.13/node_modules/dayjs/dayjs.min.js.map +1 -0
- package/dist/{martyrs → node_modules/.pnpm/dayjs@1.11.13}/node_modules/dayjs/plugin/weekOfYear.js +1 -1
- package/dist/node_modules/.pnpm/dayjs@1.11.13/node_modules/dayjs/plugin/weekOfYear.js.map +1 -0
- package/dist/node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/native.js +6 -0
- package/dist/node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/native.js.map +1 -0
- package/dist/node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/rng.js +15 -0
- package/dist/node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/rng.js.map +1 -0
- package/dist/node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/stringify.js +11 -0
- package/dist/node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/stringify.js.map +1 -0
- package/dist/node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/v4.js +20 -0
- package/dist/node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/v4.js.map +1 -0
- package/dist/style.css +2 -189
- package/package.json +1 -1
- package/src/jit/loader.js +1 -6
- package/src/jit/plugin.js +1 -5
- package/src/modules/auth/views/components/pages/ProfileEdit.vue +1 -1
- package/src/modules/auth/views/components/pages/SignIn.vue +14 -10
- package/src/modules/auth/views/configs/navigation.user.config.js +10 -10
- package/src/modules/auth/views/router/users.router.js +0 -1
- package/src/modules/auth/views/store/auth.js +1 -0
- package/src/modules/core/views/classes/ws.manager.js +20 -1
- package/src/modules/core/views/utils/vue-app-renderer.js +9 -3
- package/src/modules/notifications/components/blocks/NotificationItem.vue +1 -1
- package/src/modules/notifications/components/layouts/NotificationsLayout.vue +9 -53
- package/src/modules/notifications/components/pages/Notifications.vue +21 -22
- package/src/modules/notifications/components/sections/NotificationPreferences.vue +41 -180
- package/src/modules/notifications/components/sections/NotificationsList.vue +39 -219
- package/src/modules/notifications/notifications.client.js +17 -16
- package/dist/martyrs/node_modules/@vue/server-renderer/dist/server-renderer.esm-bundler.js.map +0 -1
- package/dist/martyrs/node_modules/@vue/shared/dist/shared.esm-bundler.js.map +0 -1
- package/dist/martyrs/node_modules/dayjs/dayjs.min.js.map +0 -1
- package/dist/martyrs/node_modules/dayjs/plugin/weekOfYear.js.map +0 -1
- package/dist/martyrs/node_modules/uuid/dist/esm-browser/regex.js +0 -5
- package/dist/martyrs/node_modules/uuid/dist/esm-browser/regex.js.map +0 -1
- package/dist/martyrs/node_modules/uuid/dist/esm-browser/rng.js +0 -15
- package/dist/martyrs/node_modules/uuid/dist/esm-browser/rng.js.map +0 -1
- package/dist/martyrs/node_modules/uuid/dist/esm-browser/stringify.js +0 -17
- package/dist/martyrs/node_modules/uuid/dist/esm-browser/stringify.js.map +0 -1
- package/dist/martyrs/node_modules/uuid/dist/esm-browser/v4.js +0 -13
- package/dist/martyrs/node_modules/uuid/dist/esm-browser/v4.js.map +0 -1
- package/dist/martyrs/node_modules/uuid/dist/esm-browser/validate.js +0 -8
- package/dist/martyrs/node_modules/uuid/dist/esm-browser/validate.js.map +0 -1
- package/dist/martyrs/src/components/Button/Button.vue2.js.map +0 -1
- package/dist/martyrs/src/components/EditImages/EditImages.vue2.js.map +0 -1
- package/dist/martyrs/src/components/Select/Select.vue.js.map +0 -1
- package/dist/martyrs/src/components/Spoiler/Spoiler.vue2.js.map +0 -1
- package/dist/martyrs/src/components/Tab/Tab.vue2.js.map +0 -1
- package/dist/martyrs/src/components/Tooltip/Tooltip.vue.js.map +0 -1
- package/dist/martyrs/src/modules/auth/views/components/blocks/ProfileCard.vue.js +0 -44
- package/dist/martyrs/src/modules/auth/views/components/blocks/ProfileCard.vue.js.map +0 -1
- package/dist/martyrs/src/modules/core/views/components/sections/Filters.vue2.js.map +0 -1
- /package/dist/{martyrs → node_modules/.pnpm/@vue_shared@3.5.13}/node_modules/@vue/shared/dist/shared.esm-bundler.js +0 -0
|
@@ -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/core/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 { useSession, setError } from '@martyrs/src/modules/core/views/store/core.store.js';\nimport wsManager from '@martyrs/src/modules/core/views/classes/ws.manager.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\n// Session manager\nconst session = useSession();\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\n // ТОЛЬКО ПОСЛЕ УСПЕШНОЙ ПРОВЕРКИ устанавливаем состояние\n state.accesses = userAccesses;\n Object.assign(state.user, { _id, email, phone, avatar });\n Object.assign(state.access, { token: accessToken, roles, status: !!accessToken });\n\n // Update Session with full user data\n session.set({ ...userCookie, accesses: userAccesses });\n\n // Переподключаем WebSocket если пользователь аутентифицирован\n if (_id && accessToken) {\n console.log('[AUTH] Reconnecting WebSocket for authenticated user:', _id);\n await wsManager.reconnectWithAuth(_id);\n }\n } else {\n console.log('no cookies');\n setAuthToken(null);\n session.clear();\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 session.clear();\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 session.clear();\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 session.set(response.data);\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 session.clear();\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 session.set(response.data);\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 session.clear();\n this.resetState();\n\n // Отключаем WebSocket при выходе\n console.log('[AUTH] Disconnecting WebSocket on logout');\n wsManager.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 session.set(response.data);\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: { path: '/', domain: process.env.DOMAIN_URL, 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, mode = process.env.NODE_ENV) {\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 const options = optionsDefault[mode];\n console.log('[AUTH COOKIE DEBUG] setCookie', { name, mode, options, domain: process.env.DOMAIN_URL });\n Cookies.set(name, JSON.stringify(data), options);\n }\n}\n\nasync function removeCookie(name, mode = process.env.NODE_ENV) {\n if (process.env.MOBILE_APP) {\n // Если приложение запущено в Capacitor\n await Preferences.remove({ key: name });\n } else {\n // Для веб-версии\n const options = optionsDefault[mode];\n const allCookiesBefore = typeof document !== 'undefined' ? document.cookie : 'SSR - no document';\n console.log('[AUTH COOKIE DEBUG] removeCookie BEFORE', { name, mode, options, domain: process.env.DOMAIN_URL, allCookies: allCookiesBefore });\n Cookies.remove(name, options);\n const allCookiesAfter = typeof document !== 'undefined' ? document.cookie : 'SSR - no document';\n console.log('[AUTH COOKIE DEBUG] removeCookie AFTER', { allCookies: allCookiesAfter });\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":";;;;;;;AAcK,MAAC,QAAQ,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;AAGD,MAAM,UAAU,WAAU;AAErB,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;AAE1D,qBAAa,WAAW;AAGxB,cAAM,WAAW,MAAM,OAAO,IAAI,mCAAmC;AACrE,cAAM,eAAe,SAAS;AAG9B,cAAM,WAAW;AACjB,eAAO,OAAO,MAAM,MAAM,EAAE,KAAK,OAAO,OAAO,QAAQ;AACvD,eAAO,OAAO,MAAM,QAAQ,EAAE,OAAO,aAAa,OAAO,QAAQ,CAAC,CAAC,YAAW,CAAE;AAGhF,gBAAQ,IAAI,EAAE,GAAG,YAAY,UAAU,aAAY,CAAE;AAGrD,YAAI,OAAO,aAAa;AACtB,kBAAQ,IAAI,yDAAyD,GAAG;AACxE,gBAAM,UAAU,kBAAkB,GAAG;AAAA,QACvC;AAAA,MACF,OAAO;AACL,gBAAQ,IAAI,YAAY;AACxB,qBAAa,IAAI;AACjB,gBAAQ,MAAK;AACb,aAAK,WAAU;AAAA,MACjB;AAAA,IACF,SAAS,OAAO;AACd,cAAQ,MAAM,4BAA4B,KAAK;AAE/C,YAAM,aAAa,MAAM;AACzB,mBAAa,IAAI;AACjB,cAAQ,MAAK;AACb,WAAK,WAAU;AACf,eAAS,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;AACI,YAAQ,MAAK;AAAA,EACf;AAAA,EAEA,MAAM,MAAM,MAAM,MAAM;AACtB,QAAI;AACF,YAAM,WAAW,MAAM,OAAO,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,cAAQ,IAAI,SAAS,IAAI;AAEzB,YAAM,KAAK,WAAU;AAErB,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,MAAK;AAEb,cAAQ,IAAI,KAAK;AACjB,eAAS,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;AACM,eAAS,KAAK;AACd,YAAM,IAAI,MAAM,MAAM,SAAS,MAAM;AAAA,IACvC;AAEA,QAAI;AACF,YAAM,WAAW,MAAM,OAAO,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,cAAQ,IAAI,SAAS,IAAI;AAEzB,YAAM,KAAK,WAAU;AAErB,aAAO,SAAS;AAAA,IAClB,SAAS,OAAO;AAEd,YAAM,aAAa,MAAM;AACzB,eAAS,KAAK;AACd,cAAQ,IAAI,gBAAgB;AAC5B,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,SAAS;AACb,UAAM,aAAa,MAAM;AACzB,iBAAa,IAAI;AACjB,YAAQ,MAAK;AACb,SAAK,WAAU;AAGf,YAAQ,IAAI,0CAA0C;AACtD,cAAU,WAAU;AAAA,EACtB;AAAA,EAEA,MAAM,cAAc,MAAM,MAAM;AAC9B,QAAI;AACF,YAAM,WAAW,MAAM,OAAO,KAAK,4BAA4B;AAAA,QAC7D,OAAO,KAAK;AAAA,QACZ,OAAO,KAAK;AAAA,QACZ;AAAA,MACR,CAAO;AAED,aAAO,OAAOA,QAAY,MAAM;AAAA,QAC9B,GAAG,SAAS;AAAA,QACZ,UAAU;AAAA,MAClB,CAAO;AAED,aAAO,SAAS;AAAA,IAClB,SAAS,OAAO;AACd,eAAS,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;AACM,eAAS,KAAK;AACd,YAAM,IAAI,MAAM,MAAM,SAAS,MAAM;AAAA,IACvC;AAEA,QAAI;AACF,YAAM,WAAW,MAAM,OAAO,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,cAAQ,IAAI,SAAS,IAAI;AAEzB,aAAO,SAAS;AAAA,IAClB,SAAS,OAAO;AAEd,YAAM,aAAa,MAAM;AACzB,eAAS,KAAK;AACd,aAAO,QAAQ,OAAO,KAAK;AAAA,IAC7B;AAAA,EACF;AACF;AAGA,MAAM,iBAAiB;AAAA,EACrB,aAAa,EAAE,MAAM,KAAK,QAAQ,QAAQ,IAAI,YAAY,QAAQ,OAAO,SAAS,GAAG,UAAU,MAAK;AAAA,EACpG,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,MAAM,YAAY,IAAI,EAAE,KAAK,MAAM;AACrD,WAAO,QAAQ,KAAK,MAAM,KAAK,IAAI;AAAA,EACrC,OAAO;AACL,UAAM,SAASC,IAAQ,IAAI,IAAI;AAC/B,WAAO,SAAS,KAAK,MAAM,MAAM,IAAI;AAAA,EACvC;AACF;AAEA,eAAe,UAAU,MAAM,MAAM,OAAO,QAAQ,IAAI,UAAU;AAChE,MAAI,QAAQ,IAAI,YAAY;AAE1B,UAAM,YAAY,IAAI;AAAA,MACpB,KAAK;AAAA,MACL,OAAO,KAAK,UAAU,IAAI;AAAA,IAChC,CAAK;AAAA,EACH,OAAO;AAEL,UAAM,UAAU,eAAe,IAAI;AACnC,YAAQ,IAAI,iCAAiC,EAAE,MAAM,MAAM,SAAS,QAAQ,QAAQ,IAAI,WAAU,CAAE;AACpGA,QAAQ,IAAI,MAAM,KAAK,UAAU,IAAI,GAAG,OAAO;AAAA,EACjD;AACF;AAEA,eAAe,aAAa,MAAM,OAAO,QAAQ,IAAI,UAAU;AAC7D,MAAI,QAAQ,IAAI,YAAY;AAE1B,UAAM,YAAY,OAAO,EAAE,KAAK,KAAI,CAAE;AAAA,EACxC,OAAO;AAEL,UAAM,UAAU,eAAe,IAAI;AACnC,UAAM,mBAAmB,OAAO,aAAa,cAAc,SAAS,SAAS;AAC7E,YAAQ,IAAI,2CAA2C,EAAE,MAAM,MAAM,SAAS,QAAQ,QAAQ,IAAI,YAAY,YAAY,iBAAgB,CAAE;AAC5IA,QAAQ,OAAO,MAAM,OAAO;AAC5B,UAAM,kBAAkB,OAAO,aAAa,cAAc,SAAS,SAAS;AAC5E,YAAQ,IAAI,0CAA0C,EAAE,YAAY,gBAAe,CAAE;AAAA,EACvF;AACF;AAOA,MAAM,OAAO,CAAC,UAAU,aAAa;AAErC,CAAC;"}
|
|
1
|
+
{"version":3,"file":"auth.js","sources":["../../../../../../../src/modules/auth/views/store/auth.js"],"sourcesContent":["// Dependencies\nimport $axios, { setAuthToken } from '@martyrs/src/modules/core/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 { useSession, setError } from '@martyrs/src/modules/core/views/store/core.store.js';\nimport wsManager from '@martyrs/src/modules/core/views/classes/ws.manager.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\n// Session manager\nconst session = useSession();\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\n // ТОЛЬКО ПОСЛЕ УСПЕШНОЙ ПРОВЕРКИ устанавливаем состояние\n state.accesses = userAccesses;\n Object.assign(state.user, { _id, email, phone, avatar });\n Object.assign(state.access, { token: accessToken, roles, status: !!accessToken });\n\n // Update Session with full user data\n session.set({ ...userCookie, accesses: userAccesses });\n\n // Переподключаем WebSocket если пользователь аутентифицирован\n if (_id && accessToken) {\n console.log('[AUTH] Reconnecting WebSocket for authenticated user:', _id);\n await wsManager.reconnectWithAuth(_id);\n }\n } else {\n console.log('no cookies');\n setAuthToken(null);\n session.clear();\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 session.clear();\n this.resetState();\n setError(error);\n throw 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 session.clear();\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 session.set(response.data);\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 session.clear();\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 session.set(response.data);\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 session.clear();\n this.resetState();\n\n // Отключаем WebSocket при выходе\n console.log('[AUTH] Disconnecting WebSocket on logout');\n wsManager.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 session.set(response.data);\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: { path: '/', domain: process.env.DOMAIN_URL, 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, mode = process.env.NODE_ENV) {\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 const options = optionsDefault[mode];\n console.log('[AUTH COOKIE DEBUG] setCookie', { name, mode, options, domain: process.env.DOMAIN_URL });\n Cookies.set(name, JSON.stringify(data), options);\n }\n}\n\nasync function removeCookie(name, mode = process.env.NODE_ENV) {\n if (process.env.MOBILE_APP) {\n // Если приложение запущено в Capacitor\n await Preferences.remove({ key: name });\n } else {\n // Для веб-версии\n const options = optionsDefault[mode];\n const allCookiesBefore = typeof document !== 'undefined' ? document.cookie : 'SSR - no document';\n console.log('[AUTH COOKIE DEBUG] removeCookie BEFORE', { name, mode, options, domain: process.env.DOMAIN_URL, allCookies: allCookiesBefore });\n Cookies.remove(name, options);\n const allCookiesAfter = typeof document !== 'undefined' ? document.cookie : 'SSR - no document';\n console.log('[AUTH COOKIE DEBUG] removeCookie AFTER', { allCookies: allCookiesAfter });\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,6 +1,6 @@
|
|
|
1
1
|
import { ref, resolveComponent, createElementBlock, openBlock, createElementVNode, createCommentVNode, createVNode, unref, createBlock, normalizeClass, createTextVNode, withCtx, Transition, resolveDynamicComponent, Fragment, renderList } from "vue";
|
|
2
2
|
import { useRoute, useRouter } from "vue-router";
|
|
3
|
-
import Select from "../../../../components/Select/Select.
|
|
3
|
+
import Select from "../../../../components/Select/Select.vue2.js";
|
|
4
4
|
import _sfc_main$5 from "../../../../components/Feed/Feed.vue.js";
|
|
5
5
|
import _sfc_main$6 from "../../../organizations/components/blocks/CardOrganization.vue.js";
|
|
6
6
|
import _sfc_main$1 from "../../../icons/entities/IconFeatured.vue.js";
|
|
@@ -7,7 +7,7 @@ import SkeletonBlogpost from "../../../icons/skeletons/SkeletonBlogpost.vue.js";
|
|
|
7
7
|
import { useRoute } from "vue-router";
|
|
8
8
|
import "vue-i18n";
|
|
9
9
|
/* empty css */
|
|
10
|
-
/* empty css
|
|
10
|
+
/* empty css */
|
|
11
11
|
import { state as state$1 } from "../../../auth/views/store/auth.js";
|
|
12
12
|
/* empty css */
|
|
13
13
|
/* empty css */
|
|
@@ -6,7 +6,7 @@ import _sfc_main$2 from "../../../../components/Popup/Popup.vue.js";
|
|
|
6
6
|
import _sfc_main$3 from "../../../../components/FieldTags/BlockTags.vue.js";
|
|
7
7
|
import _sfc_main$6 from "../../../../components/Checkbox/Checkbox.vue.js";
|
|
8
8
|
import Field from "../../../../components/Field/Field.vue.js";
|
|
9
|
-
import _sfc_main$7 from "../../../../components/Button/Button.
|
|
9
|
+
import _sfc_main$7 from "../../../../components/Button/Button.vue.js";
|
|
10
10
|
import _sfc_main$5 from "../../../../components/Feed/Feed.vue.js";
|
|
11
11
|
import _sfc_main$4 from "../../../core/views/components/blocks/Card.vue.js";
|
|
12
12
|
import { useRoute, useRouter } from "vue-router";
|
|
@@ -6,7 +6,7 @@ import _sfc_main$6 from "../elements/Card.vue.js";
|
|
|
6
6
|
import _sfc_main$3 from "../elements/Audio.vue.js";
|
|
7
7
|
import _sfc_main$2 from "../elements/Video.vue.js";
|
|
8
8
|
import _sfc_main$1 from "../../../../components/Draggable/Draggable.vue.js";
|
|
9
|
-
import v4 from "
|
|
9
|
+
import v4 from "../../../../../../node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/v4.js";
|
|
10
10
|
const _hoisted_1 = ["data-index"];
|
|
11
11
|
const _hoisted_2 = ["onMouseover"];
|
|
12
12
|
const _hoisted_3 = {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
+
import { reactive } from "vue";
|
|
1
2
|
class WebSocketManager {
|
|
2
3
|
constructor() {
|
|
3
4
|
this.socket = null;
|
|
4
|
-
this.isConnected = false;
|
|
5
5
|
this.reconnectAttempts = 0;
|
|
6
6
|
this.maxReconnectAttempts = 5;
|
|
7
7
|
this.reconnectDelay = 3e3;
|
|
@@ -15,6 +15,21 @@ class WebSocketManager {
|
|
|
15
15
|
this.rpcCallbacks = /* @__PURE__ */ new Map();
|
|
16
16
|
this.rpcTimeout = 3e4;
|
|
17
17
|
this.rpcIdCounter = 0;
|
|
18
|
+
this.state = reactive({
|
|
19
|
+
isConnected: false,
|
|
20
|
+
wasConnected: false
|
|
21
|
+
// был ли когда-либо подключен
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
// Геттер для обратной совместимости
|
|
25
|
+
get isConnected() {
|
|
26
|
+
return this.state.isConnected;
|
|
27
|
+
}
|
|
28
|
+
set isConnected(value) {
|
|
29
|
+
this.state.isConnected = value;
|
|
30
|
+
if (value) {
|
|
31
|
+
this.state.wasConnected = true;
|
|
32
|
+
}
|
|
18
33
|
}
|
|
19
34
|
initialize(options = {}) {
|
|
20
35
|
this.maxReconnectAttempts = options.maxReconnectAttempts || this.maxReconnectAttempts;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ws.manager.js","sources":["../../../../../../../src/modules/core/views/classes/ws.manager.js"],"sourcesContent":["class WebSocketManager {\n constructor() {\n this.socket = null;\n this.isConnected = false;\n this.reconnectAttempts = 0;\n this.maxReconnectAttempts = 5;\n this.reconnectDelay = 3000;\n this.baseUrl = null;\n this.pingInterval = null;\n this.pingIntervalTime = 30000;\n this.listeners = {};\n this.userId = null;\n this.connectPromise = null;\n this.subscribedModules = new Set();\n\n // RPC-специфичные свойства\n this.rpcCallbacks = new Map();\n this.rpcTimeout = 30000; // 30 секунд таймаут по умолчанию\n this.rpcIdCounter = 0;\n }\n\n initialize(options = {}) {\n this.maxReconnectAttempts = options.maxReconnectAttempts || this.maxReconnectAttempts;\n this.reconnectDelay = options.reconnectDelay || this.reconnectDelay;\n this.baseUrl = options.wsUrl || this._getDefaultWsUrl();\n this.pingIntervalTime = options.pingInterval || this.pingIntervalTime;\n this.rpcTimeout = options.rpcTimeout || this.rpcTimeout;\n }\n\n _getDefaultWsUrl() {\n if (typeof window === 'undefined') return '/api/ws';\n \n const isSecure = window.location.protocol === 'https:';\n const protocol = isSecure ? 'wss:' : 'ws:';\n const host = window.location.hostname;\n const port = isSecure ? '' : ':8020';\n\n return `${protocol}//${host}${port}/api/ws`;\n }\n\n connect(userId = null) {\n if (typeof window === 'undefined') return Promise.resolve(false);\n this.userId = userId;\n\n // Проверяем существующее соединение\n if (this.isConnected && this.socket?.readyState === WebSocket.OPEN) {\n // If already connected but userId changed, need to reconnect\n if (this.userId !== userId) {\n console.log('[WebSocket] UserId changed, reconnecting...');\n return this.reconnectWithAuth(userId);\n }\n return Promise.resolve(this.socket);\n }\n\n // Предотвращаем создание множества промисов при параллельных вызовах\n if (this.connectPromise) {\n return this.connectPromise;\n }\n\n this.connectPromise = new Promise((resolve, reject) => {\n this.disconnect();\n\n // Используем baseUrl без параметров, так как аутентификация через cookie\n console.log('[WebSocket] Connecting to:', this.baseUrl, 'userId:', userId);\n this.socket = new WebSocket(this.baseUrl);\n\n this.socket.onopen = () => {\n this._handleOpen();\n resolve(this.socket);\n };\n\n this.socket.onmessage = this._handleMessage.bind(this);\n this.socket.onerror = err => {\n this._handleError(err);\n reject(err);\n };\n this.socket.onclose = this._handleClose.bind(this);\n\n setTimeout(() => {\n if (!this.isConnected) {\n reject(new Error('WebSocket connection timeout'));\n }\n }, 10000);\n }).finally(() => {\n this.connectPromise = null;\n });\n\n return this.connectPromise;\n }\n\n disconnect() {\n if (typeof window === 'undefined') return;\n\n if (this.socket) {\n this.socket.onopen = null;\n this.socket.onmessage = null;\n this.socket.onerror = null;\n this.socket.onclose = null;\n if (this.socket.readyState === WebSocket.OPEN || this.socket.readyState === WebSocket.CONNECTING) {\n this.socket.close();\n }\n this.socket = null;\n }\n\n if (this.pingInterval) {\n clearInterval(this.pingInterval);\n this.pingInterval = null;\n }\n\n // Отменяем все ожидающие RPC вызовы\n for (const [id, { reject }] of this.rpcCallbacks.entries()) {\n reject(new Error('WebSocket disconnected'));\n this.rpcCallbacks.delete(id);\n }\n\n this.isConnected = false;\n this.userId = null;\n this.subscribedModules.clear(); // Очищаем подписки при отключении\n }\n\n async send(data) {\n if (!this.socket || this.socket.readyState !== WebSocket.OPEN) {\n console.error('Cannot send message: WebSocket is not connected');\n return false;\n }\n\n try {\n const msg = typeof data === 'string' ? data : JSON.stringify(data);\n this.socket.send(msg);\n return true;\n } catch (err) {\n console.error('Error sending message:', err);\n return false;\n }\n }\n\n /**\n * Выполняет RPC вызов на сервере\n * @param {string} module - Имя модуля\n * @param {string} method - Имя метода\n * @param {object} params - Параметры метода\n * @param {object} [options] - Опции вызова\n * @param {number} [options.timeout] - Таймаут в миллисекундах\n * @returns {Promise<any>} - Результат вызова\n */\n rpc(module, method, params = {}, options = {}) {\n if (!this.isConnected || this.socket?.readyState !== WebSocket.OPEN) {\n return Promise.reject(new Error('WebSocket is not connected'));\n }\n\n if (!module || !method) {\n return Promise.reject(new Error('Module and method are required'));\n }\n\n // Генерируем уникальный ID для вызова\n const id = `${++this.rpcIdCounter}`;\n const timeout = options.timeout || this.rpcTimeout;\n\n return new Promise((resolve, reject) => {\n // Записываем информацию о вызове для последующей обработки ответа\n this.rpcCallbacks.set(id, {\n resolve,\n reject,\n timeoutId: setTimeout(() => {\n if (this.rpcCallbacks.has(id)) {\n this.rpcCallbacks.delete(id);\n reject(new Error(`RPC call to ${module}.${method} timed out after ${timeout}ms`));\n }\n }, timeout),\n });\n\n // Отправляем RPC запрос\n this.send({\n type: 'rpc',\n module,\n method,\n params,\n id,\n }).catch(err => {\n if (this.rpcCallbacks.has(id)) {\n clearTimeout(this.rpcCallbacks.get(id).timeoutId);\n this.rpcCallbacks.delete(id);\n reject(err);\n }\n });\n });\n }\n\n addEventListener(eventType, callback, options = {}) {\n const listenerId = `${options.module || 'global'}_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n if (!this.listeners[eventType]) this.listeners[eventType] = {};\n this.listeners[eventType][listenerId] = callback;\n return listenerId;\n }\n\n removeEventListener(eventType, listenerId) {\n if (this.listeners[eventType]?.[listenerId]) {\n delete this.listeners[eventType][listenerId];\n }\n }\n\n removeModuleListeners(moduleName) {\n Object.keys(this.listeners).forEach(eventType => {\n Object.keys(this.listeners[eventType]).forEach(listenerId => {\n if (listenerId.startsWith(`${moduleName}_`)) {\n delete this.listeners[eventType][listenerId];\n }\n });\n });\n }\n\n async subscribeModule(moduleName) {\n if (!moduleName) return;\n \n if (this.subscribedModules.has(moduleName)) {\n console.log(`[WebSocket] Module ${moduleName} already subscribed`);\n return;\n }\n \n console.log(`[WebSocket] Subscribing to module: ${moduleName}`);\n const success = await this.send({ type: 'subscribe', module: moduleName });\n if (success) {\n this.subscribedModules.add(moduleName);\n console.log(`[WebSocket] Successfully subscribed to module: ${moduleName}`);\n } else {\n console.log(`[WebSocket] Failed to subscribe to module: ${moduleName}`);\n }\n }\n\n async unsubscribeModule(moduleName) {\n if (!moduleName || !this.subscribedModules.has(moduleName)) return;\n const success = await this.send({ type: 'unsubscribe', module: moduleName });\n if (success) {\n this.subscribedModules.delete(moduleName);\n }\n }\n\n _resubscribeAllModules() {\n for (const moduleName of this.subscribedModules) {\n this.send({ type: 'subscribe', module: moduleName });\n }\n }\n\n _handleOpen() {\n this.isConnected = true;\n this.reconnectAttempts = 0;\n\n this.pingInterval = setInterval(() => {\n if (this.socket?.readyState === WebSocket.OPEN) {\n this.socket.send(JSON.stringify({ type: 'ping' }));\n }\n }, this.pingIntervalTime);\n\n this._resubscribeAllModules();\n this._notifyListeners('open', { isConnected: true });\n }\n\n _handleMessage(event) {\n // Проверка на типы сообщений - пропускаем бинарные сообщения\n if (typeof event.data !== 'string') {\n console.warn('Received binary message, but only JSON is supported');\n return;\n }\n\n try {\n const data = JSON.parse(event.data);\n\n // Обрабатываем ответы на RPC вызовы\n if (data.type === 'rpc_response' && data.id && this.rpcCallbacks.has(data.id)) {\n const { resolve, reject, timeoutId } = this.rpcCallbacks.get(data.id);\n clearTimeout(timeoutId);\n this.rpcCallbacks.delete(data.id);\n\n if (data.error) {\n reject(Object.assign(new Error(data.error.message), data.error));\n } else {\n resolve(data.result);\n }\n\n return;\n }\n\n // Обрабатываем обычные сообщения\n this._notifyListeners('message', data);\n if (data.type) {\n this._notifyListeners(data.type, data);\n }\n } catch (err) {\n console.error('WebSocket message error:', err);\n }\n }\n\n _handleError(error) {\n console.error('WebSocket error:', error);\n this._notifyListeners('error', { error });\n\n // Отменяем все RPC вызовы с ошибкой соединения\n for (const [id, { reject, timeoutId }] of this.rpcCallbacks.entries()) {\n clearTimeout(timeoutId);\n reject(new Error('WebSocket connection error'));\n this.rpcCallbacks.delete(id);\n }\n }\n\n _handleClose(event) {\n this.isConnected = false;\n if (this.pingInterval) {\n clearInterval(this.pingInterval);\n this.pingInterval = null;\n }\n\n // Отменяем все RPC вызовы при закрытии соединения\n for (const [id, { reject, timeoutId }] of this.rpcCallbacks.entries()) {\n clearTimeout(timeoutId);\n reject(new Error('WebSocket connection closed'));\n this.rpcCallbacks.delete(id);\n }\n\n this._notifyListeners('close', { code: event.code, reason: event.reason });\n\n // Reconnect for both authenticated and anonymous users (not just authenticated)\n if (event.code !== 1000 && this.reconnectAttempts < this.maxReconnectAttempts) {\n this.reconnectAttempts++;\n const delay = this.reconnectDelay * this.reconnectAttempts;\n console.log(`[WebSocket] Reconnecting in ${delay}ms... (attempt ${this.reconnectAttempts}/${this.maxReconnectAttempts})`);\n setTimeout(() => {\n this.connect(this.userId).catch(err => {\n console.error('Reconnection failed:', err);\n });\n }, delay);\n }\n }\n\n _notifyListeners(eventType, data) {\n Object.values(this.listeners[eventType] || {}).forEach(fn => {\n try {\n fn(data);\n } catch (err) {\n console.error(`Listener for ${eventType} failed:`, err);\n }\n });\n }\n\n isSocketConnected() {\n return this.isConnected && this.socket?.readyState === WebSocket.OPEN;\n }\n\n /**\n * Reconnect WebSocket with new authentication\n * Useful when user logs in/out\n * @param {string} userId - New user ID (optional)\n * @returns {Promise<WebSocket|boolean>}\n */\n async reconnectWithAuth(userId) {\n console.log('[WebSocket] Reconnecting with auth, userId:', userId);\n \n // Disconnect existing connection\n this.disconnect();\n \n // Small delay to ensure clean disconnect\n await new Promise(resolve => setTimeout(resolve, 100));\n \n // Connect with new userId (or null for anonymous)\n return this.connect(userId);\n }\n}\n\nconst wsManager = new WebSocketManager();\nexport { wsManager };\nexport default wsManager;\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ws.manager.js","sources":["../../../../../../../src/modules/core/views/classes/ws.manager.js"],"sourcesContent":["import { reactive } from 'vue';\n\nclass WebSocketManager {\n constructor() {\n this.socket = null;\n this.reconnectAttempts = 0;\n this.maxReconnectAttempts = 5;\n this.reconnectDelay = 3000;\n this.baseUrl = null;\n this.pingInterval = null;\n this.pingIntervalTime = 30000;\n this.listeners = {};\n this.userId = null;\n this.connectPromise = null;\n this.subscribedModules = new Set();\n\n // RPC-специфичные свойства\n this.rpcCallbacks = new Map();\n this.rpcTimeout = 30000; // 30 секунд таймаут по умолчанию\n this.rpcIdCounter = 0;\n\n // Реактивное состояние\n this.state = reactive({\n isConnected: false,\n wasConnected: false, // был ли когда-либо подключен\n });\n }\n\n // Геттер для обратной совместимости\n get isConnected() {\n return this.state.isConnected;\n }\n\n set isConnected(value) {\n this.state.isConnected = value;\n if (value) {\n this.state.wasConnected = true;\n }\n }\n\n initialize(options = {}) {\n this.maxReconnectAttempts = options.maxReconnectAttempts || this.maxReconnectAttempts;\n this.reconnectDelay = options.reconnectDelay || this.reconnectDelay;\n this.baseUrl = options.wsUrl || this._getDefaultWsUrl();\n this.pingIntervalTime = options.pingInterval || this.pingIntervalTime;\n this.rpcTimeout = options.rpcTimeout || this.rpcTimeout;\n }\n\n _getDefaultWsUrl() {\n if (typeof window === 'undefined') return '/api/ws';\n \n const isSecure = window.location.protocol === 'https:';\n const protocol = isSecure ? 'wss:' : 'ws:';\n const host = window.location.hostname;\n const port = isSecure ? '' : ':8020';\n\n return `${protocol}//${host}${port}/api/ws`;\n }\n\n connect(userId = null) {\n if (typeof window === 'undefined') return Promise.resolve(false);\n this.userId = userId;\n\n // Проверяем существующее соединение\n if (this.isConnected && this.socket?.readyState === WebSocket.OPEN) {\n // If already connected but userId changed, need to reconnect\n if (this.userId !== userId) {\n console.log('[WebSocket] UserId changed, reconnecting...');\n return this.reconnectWithAuth(userId);\n }\n return Promise.resolve(this.socket);\n }\n\n // Предотвращаем создание множества промисов при параллельных вызовах\n if (this.connectPromise) {\n return this.connectPromise;\n }\n\n this.connectPromise = new Promise((resolve, reject) => {\n this.disconnect();\n\n // Используем baseUrl без параметров, так как аутентификация через cookie\n console.log('[WebSocket] Connecting to:', this.baseUrl, 'userId:', userId);\n this.socket = new WebSocket(this.baseUrl);\n\n this.socket.onopen = () => {\n this._handleOpen();\n resolve(this.socket);\n };\n\n this.socket.onmessage = this._handleMessage.bind(this);\n this.socket.onerror = err => {\n this._handleError(err);\n reject(err);\n };\n this.socket.onclose = this._handleClose.bind(this);\n\n setTimeout(() => {\n if (!this.isConnected) {\n reject(new Error('WebSocket connection timeout'));\n }\n }, 10000);\n }).finally(() => {\n this.connectPromise = null;\n });\n\n return this.connectPromise;\n }\n\n disconnect() {\n if (typeof window === 'undefined') return;\n\n if (this.socket) {\n this.socket.onopen = null;\n this.socket.onmessage = null;\n this.socket.onerror = null;\n this.socket.onclose = null;\n if (this.socket.readyState === WebSocket.OPEN || this.socket.readyState === WebSocket.CONNECTING) {\n this.socket.close();\n }\n this.socket = null;\n }\n\n if (this.pingInterval) {\n clearInterval(this.pingInterval);\n this.pingInterval = null;\n }\n\n // Отменяем все ожидающие RPC вызовы\n for (const [id, { reject }] of this.rpcCallbacks.entries()) {\n reject(new Error('WebSocket disconnected'));\n this.rpcCallbacks.delete(id);\n }\n\n this.isConnected = false;\n this.userId = null;\n this.subscribedModules.clear(); // Очищаем подписки при отключении\n }\n\n async send(data) {\n if (!this.socket || this.socket.readyState !== WebSocket.OPEN) {\n console.error('Cannot send message: WebSocket is not connected');\n return false;\n }\n\n try {\n const msg = typeof data === 'string' ? data : JSON.stringify(data);\n this.socket.send(msg);\n return true;\n } catch (err) {\n console.error('Error sending message:', err);\n return false;\n }\n }\n\n /**\n * Выполняет RPC вызов на сервере\n * @param {string} module - Имя модуля\n * @param {string} method - Имя метода\n * @param {object} params - Параметры метода\n * @param {object} [options] - Опции вызова\n * @param {number} [options.timeout] - Таймаут в миллисекундах\n * @returns {Promise<any>} - Результат вызова\n */\n rpc(module, method, params = {}, options = {}) {\n if (!this.isConnected || this.socket?.readyState !== WebSocket.OPEN) {\n return Promise.reject(new Error('WebSocket is not connected'));\n }\n\n if (!module || !method) {\n return Promise.reject(new Error('Module and method are required'));\n }\n\n // Генерируем уникальный ID для вызова\n const id = `${++this.rpcIdCounter}`;\n const timeout = options.timeout || this.rpcTimeout;\n\n return new Promise((resolve, reject) => {\n // Записываем информацию о вызове для последующей обработки ответа\n this.rpcCallbacks.set(id, {\n resolve,\n reject,\n timeoutId: setTimeout(() => {\n if (this.rpcCallbacks.has(id)) {\n this.rpcCallbacks.delete(id);\n reject(new Error(`RPC call to ${module}.${method} timed out after ${timeout}ms`));\n }\n }, timeout),\n });\n\n // Отправляем RPC запрос\n this.send({\n type: 'rpc',\n module,\n method,\n params,\n id,\n }).catch(err => {\n if (this.rpcCallbacks.has(id)) {\n clearTimeout(this.rpcCallbacks.get(id).timeoutId);\n this.rpcCallbacks.delete(id);\n reject(err);\n }\n });\n });\n }\n\n addEventListener(eventType, callback, options = {}) {\n const listenerId = `${options.module || 'global'}_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n if (!this.listeners[eventType]) this.listeners[eventType] = {};\n this.listeners[eventType][listenerId] = callback;\n return listenerId;\n }\n\n removeEventListener(eventType, listenerId) {\n if (this.listeners[eventType]?.[listenerId]) {\n delete this.listeners[eventType][listenerId];\n }\n }\n\n removeModuleListeners(moduleName) {\n Object.keys(this.listeners).forEach(eventType => {\n Object.keys(this.listeners[eventType]).forEach(listenerId => {\n if (listenerId.startsWith(`${moduleName}_`)) {\n delete this.listeners[eventType][listenerId];\n }\n });\n });\n }\n\n async subscribeModule(moduleName) {\n if (!moduleName) return;\n \n if (this.subscribedModules.has(moduleName)) {\n console.log(`[WebSocket] Module ${moduleName} already subscribed`);\n return;\n }\n \n console.log(`[WebSocket] Subscribing to module: ${moduleName}`);\n const success = await this.send({ type: 'subscribe', module: moduleName });\n if (success) {\n this.subscribedModules.add(moduleName);\n console.log(`[WebSocket] Successfully subscribed to module: ${moduleName}`);\n } else {\n console.log(`[WebSocket] Failed to subscribe to module: ${moduleName}`);\n }\n }\n\n async unsubscribeModule(moduleName) {\n if (!moduleName || !this.subscribedModules.has(moduleName)) return;\n const success = await this.send({ type: 'unsubscribe', module: moduleName });\n if (success) {\n this.subscribedModules.delete(moduleName);\n }\n }\n\n _resubscribeAllModules() {\n for (const moduleName of this.subscribedModules) {\n this.send({ type: 'subscribe', module: moduleName });\n }\n }\n\n _handleOpen() {\n this.isConnected = true;\n this.reconnectAttempts = 0;\n\n this.pingInterval = setInterval(() => {\n if (this.socket?.readyState === WebSocket.OPEN) {\n this.socket.send(JSON.stringify({ type: 'ping' }));\n }\n }, this.pingIntervalTime);\n\n this._resubscribeAllModules();\n this._notifyListeners('open', { isConnected: true });\n }\n\n _handleMessage(event) {\n // Проверка на типы сообщений - пропускаем бинарные сообщения\n if (typeof event.data !== 'string') {\n console.warn('Received binary message, but only JSON is supported');\n return;\n }\n\n try {\n const data = JSON.parse(event.data);\n\n // Обрабатываем ответы на RPC вызовы\n if (data.type === 'rpc_response' && data.id && this.rpcCallbacks.has(data.id)) {\n const { resolve, reject, timeoutId } = this.rpcCallbacks.get(data.id);\n clearTimeout(timeoutId);\n this.rpcCallbacks.delete(data.id);\n\n if (data.error) {\n reject(Object.assign(new Error(data.error.message), data.error));\n } else {\n resolve(data.result);\n }\n\n return;\n }\n\n // Обрабатываем обычные сообщения\n this._notifyListeners('message', data);\n if (data.type) {\n this._notifyListeners(data.type, data);\n }\n } catch (err) {\n console.error('WebSocket message error:', err);\n }\n }\n\n _handleError(error) {\n console.error('WebSocket error:', error);\n this._notifyListeners('error', { error });\n\n // Отменяем все RPC вызовы с ошибкой соединения\n for (const [id, { reject, timeoutId }] of this.rpcCallbacks.entries()) {\n clearTimeout(timeoutId);\n reject(new Error('WebSocket connection error'));\n this.rpcCallbacks.delete(id);\n }\n }\n\n _handleClose(event) {\n this.isConnected = false;\n if (this.pingInterval) {\n clearInterval(this.pingInterval);\n this.pingInterval = null;\n }\n\n // Отменяем все RPC вызовы при закрытии соединения\n for (const [id, { reject, timeoutId }] of this.rpcCallbacks.entries()) {\n clearTimeout(timeoutId);\n reject(new Error('WebSocket connection closed'));\n this.rpcCallbacks.delete(id);\n }\n\n this._notifyListeners('close', { code: event.code, reason: event.reason });\n\n // Reconnect for both authenticated and anonymous users (not just authenticated)\n if (event.code !== 1000 && this.reconnectAttempts < this.maxReconnectAttempts) {\n this.reconnectAttempts++;\n const delay = this.reconnectDelay * this.reconnectAttempts;\n console.log(`[WebSocket] Reconnecting in ${delay}ms... (attempt ${this.reconnectAttempts}/${this.maxReconnectAttempts})`);\n setTimeout(() => {\n this.connect(this.userId).catch(err => {\n console.error('Reconnection failed:', err);\n });\n }, delay);\n }\n }\n\n _notifyListeners(eventType, data) {\n Object.values(this.listeners[eventType] || {}).forEach(fn => {\n try {\n fn(data);\n } catch (err) {\n console.error(`Listener for ${eventType} failed:`, err);\n }\n });\n }\n\n isSocketConnected() {\n return this.isConnected && this.socket?.readyState === WebSocket.OPEN;\n }\n\n /**\n * Reconnect WebSocket with new authentication\n * Useful when user logs in/out\n * @param {string} userId - New user ID (optional)\n * @returns {Promise<WebSocket|boolean>}\n */\n async reconnectWithAuth(userId) {\n console.log('[WebSocket] Reconnecting with auth, userId:', userId);\n \n // Disconnect existing connection\n this.disconnect();\n \n // Small delay to ensure clean disconnect\n await new Promise(resolve => setTimeout(resolve, 100));\n \n // Connect with new userId (or null for anonymous)\n return this.connect(userId);\n }\n}\n\nconst wsManager = new WebSocketManager();\nexport { wsManager };\nexport default wsManager;\n"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { resolveComponent, createElementBlock, createCommentVNode, openBlock, createElementVNode, createBlock, withModifiers, resolveDynamicComponent, toDisplayString, withCtx, createTextVNode, Fragment, renderList, normalizeClass } from "vue";
|
|
2
2
|
import { useRouter } from "vue-router";
|
|
3
|
-
import _sfc_main$1 from "../../../../../components/Tooltip/Tooltip.
|
|
3
|
+
import _sfc_main$1 from "../../../../../components/Tooltip/Tooltip.vue2.js";
|
|
4
4
|
import _sfc_main$3 from "../../../../../components/Dropdown/Dropdown.vue.js";
|
|
5
5
|
import PlaceholderUserpic from "../../../../icons/placeholders/PlaceholderUserpic.vue.js";
|
|
6
6
|
import PlaceholderOrganizationPic from "../../../../icons/placeholders/PlaceholderOrganizationPic.vue.js";
|
|
7
7
|
import _sfc_main$4 from "../../../../icons/navigation/IconEllipsis.vue.js";
|
|
8
8
|
import _sfc_main$5 from "../../../../reports/components/sections/FormReport.vue.js";
|
|
9
9
|
/* empty css */
|
|
10
|
-
/* empty css
|
|
10
|
+
/* empty css */
|
|
11
11
|
import _sfc_main$2 from "../elements/PhotoStack.vue.js";
|
|
12
12
|
const _hoisted_1 = {
|
|
13
13
|
key: 0,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createBlock, openBlock, withCtx, createElementVNode, toDisplayString, createVNode, createTextVNode } from "vue";
|
|
2
2
|
import { useRouter, useRoute } from "vue-router";
|
|
3
3
|
import _sfc_main$1 from "../../../../../components/Popup/Popup.vue.js";
|
|
4
|
-
import _sfc_main$2 from "../../../../../components/Button/Button.
|
|
4
|
+
import _sfc_main$2 from "../../../../../components/Button/Button.vue.js";
|
|
5
5
|
const _hoisted_1 = { class: "t-center" };
|
|
6
6
|
const _hoisted_2 = { class: "mn-b-medium" };
|
|
7
7
|
const _hoisted_3 = { class: "mn-b-semi t-transp" };
|
|
@@ -3,7 +3,7 @@ import { useI18n } from "vue-i18n";
|
|
|
3
3
|
import _sfc_main$1 from "../../../../../components/Popup/Popup.vue.js";
|
|
4
4
|
import Loader from "../../../../../components/Loader/Loader.vue.js";
|
|
5
5
|
import Calendar from "../../../../../components/Calendar/Calendar.vue2.js";
|
|
6
|
-
import _sfc_main$3 from "../../../../../components/Button/Button.
|
|
6
|
+
import _sfc_main$3 from "../../../../../components/Button/Button.vue.js";
|
|
7
7
|
import _sfc_main$4 from "../../../../icons/actions/IconShopcartAdd.vue.js";
|
|
8
8
|
import _sfc_main$2 from "../../../../orders/components/elements/PriceTotal.vue.js";
|
|
9
9
|
import { loadAvailability } from "../../../../rents/views/store/rents.store.js";
|
|
@@ -8,7 +8,7 @@ import _sfc_main$1 from "../../../../../components/Popup/Popup.vue.js";
|
|
|
8
8
|
import "vue-i18n";
|
|
9
9
|
/* empty css */
|
|
10
10
|
import Loader from "../../../../../components/Loader/Loader.vue.js";
|
|
11
|
-
/* empty css
|
|
11
|
+
/* empty css */
|
|
12
12
|
/* empty css */
|
|
13
13
|
import _sfc_main$2 from "../partials/LocationSelection.vue.js";
|
|
14
14
|
import _sfc_main$3 from "../../../../orders/components/partials/ShopCart.vue.js";
|
|
@@ -5,8 +5,8 @@ import { useStore } from "../../store/core.store.js";
|
|
|
5
5
|
import { actions, getters } from "../../../../orders/store/shopcart.js";
|
|
6
6
|
import { state } from "../../../../auth/views/store/auth.js";
|
|
7
7
|
import NotificationBadge from "../../../../notifications/components/elements/NotificationBadge.vue.js";
|
|
8
|
-
import _sfc_main$1 from "../../../../../components/Button/Button.
|
|
9
|
-
import Select from "../../../../../components/Select/Select.
|
|
8
|
+
import _sfc_main$1 from "../../../../../components/Button/Button.vue.js";
|
|
9
|
+
import Select from "../../../../../components/Select/Select.vue2.js";
|
|
10
10
|
import _sfc_main$3 from "../../../../icons/entities/IconShopcart.vue.js";
|
|
11
11
|
import _sfc_main$4 from "../../../../icons/entities/IconProfile.vue.js";
|
|
12
12
|
import _sfc_main$2 from "../../../../icons/navigation/IconSearch.vue.js";
|
|
@@ -4,7 +4,7 @@ import IconChevronBottom from "../../../../icons/navigation/IconChevronBottom.vu
|
|
|
4
4
|
import { useStore } from "../../store/core.store.js";
|
|
5
5
|
import { state } from "../../../../auth/views/store/auth.js";
|
|
6
6
|
import _sfc_main$1 from "../../../../../components/Dropdown/Dropdown.vue.js";
|
|
7
|
-
/* empty css
|
|
7
|
+
/* empty css */
|
|
8
8
|
/* empty css */
|
|
9
9
|
import _export_sfc from "../../../../../../../_virtual/_plugin-vue_export-helper.js";
|
|
10
10
|
const _hoisted_1 = ["onClick"];
|
|
@@ -3,7 +3,7 @@ import { useRouter, useRoute } from "vue-router";
|
|
|
3
3
|
import { useI18n } from "vue-i18n";
|
|
4
4
|
import _sfc_main$2 from "../../../../icons/entities/IconShopcart.vue.js";
|
|
5
5
|
import _sfc_main$3 from "../../../../icons/entities/IconProfile.vue.js";
|
|
6
|
-
import _sfc_main$1 from "../../../../../components/Button/Button.
|
|
6
|
+
import _sfc_main$1 from "../../../../../components/Button/Button.vue.js";
|
|
7
7
|
import { useStore } from "../../store/core.store.js";
|
|
8
8
|
import { getters, actions } from "../../../../orders/store/shopcart.js";
|
|
9
9
|
import { state } from "../../../../auth/views/store/auth.js";
|
package/dist/martyrs/src/modules/core/views/components/sections/{Filters.vue2.js → Filters.vue.js}
RENAMED
|
@@ -10,7 +10,7 @@ import _sfc_main$2 from "../../../../icons/entities/IconCalendar.vue.js";
|
|
|
10
10
|
import _export_sfc from "../../../../../../../_virtual/_plugin-vue_export-helper.js";
|
|
11
11
|
import _sfc_main$6 from "./filters/FilterOptions.vue.js";
|
|
12
12
|
import _sfc_main$1 from "../../../../icons/navigation/IconFilter.vue.js";
|
|
13
|
-
/* empty css
|
|
13
|
+
/* empty css */
|
|
14
14
|
const _hoisted_1 = { class: "flex o-x-scroll scroll-hide t-nowrap gap-thin" };
|
|
15
15
|
const _hoisted_2 = { key: 0 };
|
|
16
16
|
const _hoisted_3 = ["onClick"];
|
|
@@ -270,4 +270,4 @@ const Filters = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-2c
|
|
|
270
270
|
export {
|
|
271
271
|
Filters as default
|
|
272
272
|
};
|
|
273
|
-
//# sourceMappingURL=Filters.
|
|
273
|
+
//# sourceMappingURL=Filters.vue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Filters.vue.js","sources":["../../../../../../../../src/modules/core/views/components/sections/Filters.vue"],"sourcesContent":["<template>\n <div class=\"flex o-x-scroll scroll-hide t-nowrap gap-thin\">\n <!-- All Filters Button -->\n <button\n @click=\"showAllFilters = true\"\n class=\"pd-small radius-medium bg-light flex-v-center flex gap-micro cursor-pointer\"\n :class=\"{ 'bg-main': activeFiltersCount > 0 }\"\n >\n <IconFilter class=\"i-regular\" />\n <span class=\"h-1r\"></span>\n <span v-if=\"activeFiltersCount\">{{ activeFiltersCount }}</span>\n </button>\n\n <!-- Individual Filter Buttons -->\n <button\n v-for=\"filter in filters\"\n :key=\"filter.value\"\n @click=\"openFilter(filter.value)\"\n class=\"pd-small radius-medium bg-light cursor-pointer flex-v-center flex gap-micro\"\n :class=\"{ 'selected bg-main': isFilterActive(filter) }\"\n >\n <IconCalendar v-if=\"filter.type === 'date'\" class=\"mn-r-micro i-regular\" />\n <span class=\"t-nowrap\">{{ filter.type === 'date' && getFilterValue(filter) ? formatFilterValue(filter) : filter.title }}</span>\n <span v-if=\"getFilterValue(filter) && filter.type !== 'date'\" class=\"mn-l-micro\">\n {{ formatFilterValue(filter) }}\n </span>\n </button>\n\n <!-- All Filters Popup -->\n <Popup\n :isPopupOpen=\"showAllFilters\"\n @close-popup=\"closeAllFilters\"\n :align=\"isPhone() ? 'bottom center' : 'center center'\"\n class=\"w-min-20r bg-white radius-medium mobile:radius-zero mobile:radius-tr-medium mobile:radius-tl-medium mobile:w-100 pd-medium\"\n >\n <FiltersGroup\n :filters=\"filters\"\n v-model:selected=\"tempSelected\"\n :immediate=\"false\"\n :showHeader=\"true\"\n :showApplyButton=\"true\"\n :showResetButton=\"true\"\n @update:selected=\"applyAllFilters\"\n />\n </Popup>\n\n <!-- Individual Filter Popups -->\n <Popup\n v-for=\"filter in filters\"\n :key=\"`popup-${filter.value}`\"\n :isPopupOpen=\"individualPopups[filter.value]\"\n @close-popup=\"cancelFilter(filter.value)\"\n :align=\"isPhone() ? 'bottom center' : 'center center'\"\n class=\"bg-white radius-medium mobile:radius-zero mobile:radius-tr-medium mobile:radius-tl-medium mobile:w-100 pd-medium\"\n >\n <h4 class=\"mn-b-medium\">{{ filter.title }}</h4>\n\n <!-- Checkbox Filter -->\n <FilterCheckbox\n v-if=\"filter.type === 'checkbox'\"\n v-model=\"tempSelected[filter.value]\"\n :options=\"filter.options\"\n />\n\n <!-- Range Filter -->\n <FilterRange\n v-else-if=\"filter.type === 'range'\"\n v-model=\"tempSelected[filter.value]\"\n :minPlaceholder=\"filter.minPlaceholder || 'Min'\"\n :maxPlaceholder=\"filter.maxPlaceholder || 'Max'\"\n :label=\"filter.label\"\n />\n\n <!-- Date Filter -->\n <div v-else-if=\"filter.type === 'date'\">\n <div class=\"mn-t-small\">\n <Calendar\n v-model:date=\"tempSelected[filter.value]\"\n :allowRange=\"true\"\n :disablePastDates=\"true\"\n class=\"bg-light radius-small\"\n />\n </div>\n </div>\n\n <!-- Radio/Options Filter -->\n <FilterOptions\n v-else-if=\"filter.type === 'radio'\"\n v-model=\"tempSelected[filter.value]\"\n :options=\"filter.options\"\n />\n\n <div class=\"flex gap-thin mn-t-medium\">\n <button\n @click=\"cancelFilter(filter.value)\"\n class=\"bg-light button flex-child-full\"\n >\n Cancel\n </button>\n <button\n @click=\"applyFilter(filter.value)\"\n class=\"bg-main w-100 button flex-child-full\"\n >\n Apply\n </button>\n </div>\n </Popup>\n </div>\n</template>\n\n<script setup>\nimport { ref, computed, reactive, watch } from 'vue'\nimport { useGlobalMixins } from '@martyrs/src/modules/core/views/mixins/mixins.js'\nimport Popup from '@martyrs/src/components/Popup/Popup.vue'\nimport Calendar from '@martyrs/src/components/Calendar/Calendar.vue'\nimport FiltersGroup from './filters/FiltersGroup.vue'\nimport FilterCheckbox from './filters/FilterCheckbox.vue'\nimport FilterRange from './filters/FilterRange.vue'\nimport FilterDateRange from './filters/FilterDateRange.vue'\nimport FilterOptions from './filters/FilterOptions.vue'\nimport IconFilter from '@martyrs/src/modules/icons/navigation/IconFilter.vue'\nimport IconCross from '@martyrs/src/modules/icons/navigation/IconCross.vue'\nimport IconCalendar from '@martyrs/src/modules/icons/entities/IconCalendar.vue'\n\nconst filters = defineModel('filters', {\n type: Array,\n required: true\n})\n\nconst selected = defineModel('selected', {\n type: Object,\n default: () => ({})\n})\n\nconst emit = defineEmits(['select'])\n\nconst { formatDate, returnCurrency } = useGlobalMixins()\n\n// State\nconst showAllFilters = ref(false)\nconst individualPopups = reactive({})\nconst tempSelected = reactive({})\nconst tempDateRange = ref(null)\n\n// Initialize popups and temp values\nwatch(filters, (newFilters) => {\n newFilters.forEach(filter => {\n individualPopups[filter.value] = false\n \n if (!tempSelected[filter.value]) {\n if (filter.type === 'checkbox') {\n tempSelected[filter.value] = [...(selected.value[filter.value] || [])]\n } else if (filter.type === 'range') {\n tempSelected[filter.value] = { ...(selected.value[filter.value] || { min: '', max: '' }) }\n } else if (filter.type === 'date') {\n tempSelected[filter.value] = selected.value[filter.value] || null\n } else {\n tempSelected[filter.value] = selected.value[filter.value] || null\n }\n }\n })\n}, { immediate: true, deep: true })\n\n// Sync selected to tempSelected\nwatch(selected, (newSelected) => {\n Object.keys(newSelected).forEach(key => {\n const filter = filters.value.find(f => f.value === key)\n if (filter) {\n if (filter.type === 'checkbox') {\n tempSelected[key] = [...(newSelected[key] || [])]\n } else if (filter.type === 'range') {\n tempSelected[key] = { ...(newSelected[key] || { min: '', max: '' }) }\n } else {\n tempSelected[key] = newSelected[key]\n }\n }\n })\n}, { deep: true })\n\n// Computed\nconst activeFiltersCount = computed(() => {\n return Object.entries(selected.value).filter(([key, value]) => {\n if (Array.isArray(value)) return value.length > 0\n if (typeof value === 'object' && value !== null) {\n return value.min || value.max\n }\n return value !== null && value !== undefined\n }).length\n})\n\n// Methods\nconst openFilter = (filterValue) => {\n individualPopups[filterValue] = true\n}\n\nconst isFilterActive = (filter) => {\n const value = selected.value[filter.value]\n if (!value) return false\n if (Array.isArray(value)) return value.length > 0\n if (filter.type === 'range') return value.min || value.max\n return true\n}\n\nconst getFilterValue = (filter) => {\n const value = selected.value[filter.value]\n if (!value) return false\n \n if (filter.type === 'range') {\n return value.min || value.max\n }\n \n if (filter.type === 'date') {\n return value && value.start && value.end\n }\n \n if (Array.isArray(value)) {\n return value.length > 0\n }\n \n return value\n}\n\nconst formatFilterValue = (filter) => {\n const value = selected.value[filter.value]\n if (!value) return ''\n \n if (Array.isArray(value)) {\n return `(${value.length})`\n }\n \n if (filter.type === 'range') {\n if (!value.min && !value.max) return ''\n return `${value.min || '0'}-${value.max || '∞'}`\n }\n \n if (filter.type === 'date') {\n if (!value || !value.start || !value.end) return ''\n return `${formatDate(value.start, { dayMonth: true, language: 'en' })} - ${formatDate(value.end, { dayMonth: true, language: 'en' })}`\n }\n \n if (filter.type === 'radio') {\n const option = filter.options.find(o => o.value === value)\n return option ? `(${option.label})` : ''\n }\n \n return ''\n}\n\nconst applyFilter = (filterValue) => {\n selected.value[filterValue] = tempSelected[filterValue]\n individualPopups[filterValue] = false\n emit('select', { filter: filterValue, value: tempSelected[filterValue] })\n}\n\nconst cancelFilter = (filterValue) => {\n const filter = filters.value.find(f => f.value === filterValue)\n if (filter) {\n if (filter.type === 'checkbox') {\n tempSelected[filterValue] = [...(selected.value[filterValue] || [])]\n } else if (filter.type === 'range') {\n tempSelected[filterValue] = { ...(selected.value[filterValue] || { min: '', max: '' }) }\n } else if (filter.type === 'date') {\n tempSelected[filterValue] = selected.value[filterValue] || null\n } else {\n tempSelected[filterValue] = selected.value[filterValue] || null\n }\n }\n individualPopups[filterValue] = false\n}\n\nconst applyAllFilters = (newValues) => {\n Object.entries(newValues).forEach(([key, value]) => {\n if (selected.value[key] !== value) {\n selected.value[key] = value\n emit('select', { filter: key, value })\n }\n })\n showAllFilters.value = false\n}\n\nconst closeAllFilters = () => {\n showAllFilters.value = false\n}\n</script>\n\n<style scoped>\n.filters-content {\n max-height: 60vh;\n overflow-y: auto;\n}\n</style>"],"names":["_useModel"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { resolveComponent, createElementBlock, openBlock, createElementVNode, createBlock, createCommentVNode, toDisplayString, Fragment, renderList, normalizeClass, withCtx, createTextVNode } from "vue";
|
|
2
|
-
import _sfc_main$1 from "../../../../../components/Tab/Tab.
|
|
2
|
+
import _sfc_main$1 from "../../../../../components/Tab/Tab.vue.js";
|
|
3
3
|
const _hoisted_1 = { class: "flex-v-center flex-nowrap flex" };
|
|
4
4
|
const _hoisted_2 = { class: "h2 mn-r-auto" };
|
|
5
5
|
const _hoisted_3 = ["onClick"];
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { setAuthToken } from "./axios-instance.js";
|
|
2
2
|
import { renderSSRHead } from "../../../../../../node_modules/.pnpm/@unhead_ssr@1.11.20/node_modules/@unhead/ssr/dist/index.js";
|
|
3
|
-
import { renderToString } from "
|
|
3
|
+
import { renderToString } from "../../../../../../node_modules/.pnpm/@vue_server-renderer@3.5.13_vue@3.5.13_typescript@5.8.3_/node_modules/@vue/server-renderer/dist/server-renderer.esm-bundler.js";
|
|
4
4
|
function renderAndMountApp({ createApp, hooks = {} }) {
|
|
5
5
|
const start = async () => {
|
|
6
6
|
performance.mark("loading-22-start");
|
|
@@ -60,6 +60,13 @@ function renderAndMountApp({ createApp, hooks = {} }) {
|
|
|
60
60
|
console.log("[AUTH COOKIE DEBUG] Has token?", !!initialState?.auth?.access?.token);
|
|
61
61
|
console.log("[AUTH COOKIE DEBUG] Has auth but no status?", !!initialState?.auth && !initialState.auth.access?.status);
|
|
62
62
|
store.setInitialState(initialState, true);
|
|
63
|
+
if (initialState?.auth?.user?._id && store.core?.state?.session) {
|
|
64
|
+
store.core.state.session.userId = initialState.auth.user._id;
|
|
65
|
+
store.core.state.session.token = initialState.auth.access?.token;
|
|
66
|
+
store.core.state.session.roles = initialState.auth.access?.roles;
|
|
67
|
+
store.core.state.session.accesses = initialState.auth.accesses || [];
|
|
68
|
+
console.log("[AUTH COOKIE DEBUG] Session hydrated with userId:", initialState.auth.user._id);
|
|
69
|
+
}
|
|
63
70
|
if (initialState?.auth?.access?.token) {
|
|
64
71
|
console.log("[AUTH COOKIE DEBUG] Setting auth token from initialState");
|
|
65
72
|
setAuthToken(initialState.auth.access.token);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vue-app-renderer.js","sources":["../../../../../../../src/modules/core/views/utils/vue-app-renderer.js"],"sourcesContent":["import { setAuthToken } from '@martyrs/src/modules/core/views/utils/axios-instance.js';\nimport { renderSSRHead } from '@unhead/ssr';\nimport { renderToString } from '@vue/server-renderer';\n\nexport function renderAndMountApp({ createApp, hooks = {} }) {\n const start = async () => {\n // [LOADING 22] Starting client-side hydration\n performance.mark('loading-22-start');\n console.log('[LOADING 22] Starting client-side hydration...');\n\n const { app, router, store, moduleManager, config } = await createApp();\n \n let serverModules = [];\n \n // Загружаем модули которые были загружены на сервере\n if (typeof window !== 'undefined') {\n try {\n const modulesElement = document.querySelector('[data-loaded-modules]');\n if (modulesElement) {\n serverModules = JSON.parse(modulesElement.innerHTML);\n }\n } catch (e) {\n console.error('Failed to parse loaded modules', e);\n }\n \n const context = { app, store, router, config };\n\n // [LOADING 23] Loading server modules for hydration\n performance.mark('loading-23-start');\n console.log(`[LOADING 23] Loading ${serverModules.length} server modules for hydration...`);\n\n for (const moduleName of serverModules) {\n try {\n await moduleManager.load(moduleName, context);\n await moduleManager.initialize(moduleName, context);\n } catch (error) {\n console.error(`Failed to load module ${moduleName}:`, error);\n }\n }\n\n performance.mark('loading-23-end');\n performance.measure('loading-23', 'loading-23-start', 'loading-23-end');\n const measure23 = performance.getEntriesByName('loading-23')[0];\n console.log(`[LOADING 23] Server modules loaded in ${measure23?.duration?.toFixed(2)}ms`);\n }\n \n // Call beforeHydration hook if provided\n if (hooks.beforeHydration) {\n hooks.beforeHydration({ app, router, store, moduleManager });\n }\n\n // [LOADING 24] Parsing and applying initialState\n performance.mark('loading-24-start');\n console.log('[LOADING 24] Parsing and applying initialState...');\n\n let initialState;\n\n try {\n const initialStateElement = document.querySelector('[data-state]');\n\n if (initialStateElement && initialStateElement.innerHTML.trim() !== '') {\n const stateContent = initialStateElement.innerHTML.trim();\n \n // Validate JSON format before parsing\n if (stateContent.startsWith('{') && stateContent.endsWith('}')) {\n initialState = JSON.parse(stateContent);\n \n // Basic validation of state structure\n if (typeof initialState !== 'object' || initialState === null) {\n throw new Error('Invalid state format');\n }\n } else {\n throw new Error('Invalid JSON format');\n }\n }\n } catch (error) {\n console.error('Failed to parse user state', error);\n initialState = null;\n }\n\n\n\n\n if (initialState) {\n console.log('[AUTH COOKIE DEBUG] Browser initialState.auth:', initialState.auth);\n console.log('[AUTH COOKIE DEBUG] Has token?', !!initialState?.auth?.access?.token);\n console.log('[AUTH COOKIE DEBUG] Has auth but no status?', !!initialState?.auth && !initialState.auth.access?.status);\n\n // Применяем начальное состояние ко всем модулям (true = гидратация)\n store.setInitialState(initialState, true);\n\n if (initialState?.auth?.access?.token) {\n console.log('[AUTH COOKIE DEBUG] Setting auth token from initialState');\n\n setAuthToken(initialState.auth.access.token);\n } else if (initialState?.auth && !initialState.auth.access?.status) {\n // Если SSR сбросил auth (из-за ошибки), удаляем куку в браузере\n console.log('[AUTH COOKIE DEBUG] SSR reset auth, removing cookie in browser');\n if (store.auth && store.auth.removeCookie) {\n await store.auth.removeCookie('user');\n }\n }\n } else {\n // Если нет initialState, сбрасываем авторизацию (если модуль auth загружен)\n if (store.auth && store.auth.actions) {\n store.auth.actions.resetState();\n // await store.auth.removeCookie('user');\n await store.auth.actions.logout();\n }\n }\n\n const savedPosition = localStorage.getItem('position');\n\n if (savedPosition) {\n store.core.state.position = JSON.parse(savedPosition);\n }\n\n // app.config.globalProperties.$i18n.locale = router.currentRoute.value.params.locale\n // app.config.globalProperties.$i18n.locale = router.currentRoute.value.params.locale\n // If user browser locae supported then change locale\n // if (i18n.global.availableLocales.includes(browserLocale)) {\n // app.config.globalProperties.$i18n.locale = browserLocale;\n // }\n\n performance.mark('loading-24-end');\n performance.measure('loading-24', 'loading-24-start', 'loading-24-end');\n const measure24 = performance.getEntriesByName('loading-24')[0];\n console.log(`[LOADING 24] InitialState parsed and applied in ${measure24?.duration?.toFixed(2)}ms`);\n\n await router.isReady();\n\n // [LOADING 25] Mounting the application\n performance.mark('loading-25-start');\n console.log('[LOADING 25] Mounting the application...');\n\n app.mount('#app');\n\n performance.mark('loading-25-end');\n performance.measure('loading-25', 'loading-25-start', 'loading-25-end');\n const measure25 = performance.getEntriesByName('loading-25')[0];\n console.log(`[LOADING 25] Application mounted in ${measure25?.duration?.toFixed(2)}ms`);\n\n // Return the objects for further use\n return { app, router, store, moduleManager };\n };\n return start();\n}\n\nexport async function render({ url, cookies, headers, ssrContext, createApp }) {\n // [LOADING 26] SSR render starting\n performance.mark('loading-26-start');\n console.log('[LOADING 26] SSR render starting...');\n\n const { app, router, store, meta } = createApp();\n\n await router.push(url);\n await router.isReady();\n\n // If user's language is supported, change the locale\n // if (language === 'en' || language === 'ru') {\n // app.config.globalProperties.$i18n.locale = language\n // }\n\n // app.config.globalProperties.$i18n.locale = router.currentRoute.value.params.locale\n\n const ctx = ssrContext || {};\n\n if (router.currentRoute.value.name?.toLowerCase() === 'notfound') {\n ctx.notFound = true;\n }\n\n let user = null;\n\n if (cookies.user) {\n try {\n user = JSON.parse(cookies.user);\n } catch (error) {\n console.error('Failed to parse user cookie', error);\n user = null;\n }\n }\n\n \n\n\n if (user) {\n // [LOADING 27] SSR auth initialization\n performance.mark('loading-27-start');\n console.log('[LOADING 27] SSR auth initialization...');\n\n if (store.auth && store.auth.actions) {\n try {\n await store.auth.actions.initialize(user);\n } catch (error) {\n console.error('[SSR] Auth initialization failed, continuing without auth:', error);\n // Сбрасываем состояние если инициализация упала\n if (store.auth.actions.resetState) {\n store.auth.actions.resetState();\n }\n }\n } else {\n console.warn('[SSR] Auth module not loaded, cannot initialize user');\n }\n\n performance.mark('loading-27-end');\n performance.measure('loading-27', 'loading-27-start', 'loading-27-end');\n const measure27 = performance.getEntriesByName('loading-27')[0];\n console.log(`[LOADING 27] SSR auth initialized in ${measure27?.duration?.toFixed(2)}ms`);\n } else {\n if (store.auth && store.auth.actions) {\n store.auth.actions.resetState();\n } else {\n console.warn('[SSR] Auth module not loaded, cannot reset state');\n }\n }\n\n // [LOADING 28] SSR renderToString\n performance.mark('loading-28-start');\n console.log('[LOADING 28] SSR renderToString starting...');\n\n // After render, ctx.modules will be populated with used module identifiers\n const html = await renderToString(app, ctx);\n\n // Добавляем атрибуты темы через meta API перед renderSSRHead\n let theme = cookies?.theme;\n if (!theme) {\n // Fallback на sec-ch-prefers-color-scheme если нет cookie\n const prefersColorScheme = headers?.['sec-ch-prefers-color-scheme'];\n theme = prefersColorScheme === 'dark' ? 'system-dark' : 'system';\n }\n\n const themeAttrs = {};\n if (theme === 'dark') {\n themeAttrs.class = 'dark-theme';\n themeAttrs['data-theme'] = 'dark';\n themeAttrs['color-scheme'] = 'dark';\n } else if (theme === 'light') {\n themeAttrs.class = 'light-theme';\n themeAttrs['data-theme'] = 'light';\n themeAttrs['color-scheme'] = 'light';\n } else {\n // system/system-dark - без класса, CSS media query сработает\n themeAttrs['color-scheme'] = 'light dark';\n }\n\n meta.push({ htmlAttrs: themeAttrs });\n\n // Синхронизируем store state с определённой темой для SSR\n store.core.state.theme.mode = (theme === 'dark') ? 'dark'\n : (theme === 'light') ? 'light'\n : 'system';\n\n const payload = await renderSSRHead(meta, {});\n const initialState = await store.getInitialState();\n\n performance.mark('loading-28-end');\n performance.measure('loading-28', 'loading-28-start', 'loading-28-end');\n const measure28 = performance.getEntriesByName('loading-28')[0];\n console.log(`[LOADING 28] SSR renderToString completed in ${measure28?.duration?.toFixed(2)}ms`);\n\n // Total SSR render time\n performance.measure('loading-26-total', 'loading-26-start', 'loading-28-end');\n const measure26Total = performance.getEntriesByName('loading-26-total')[0];\n console.log(`[LOADING 26] Total SSR render completed in ${measure26Total?.duration?.toFixed(2)}ms`);\n\n return {\n html,\n meta: payload,\n state: initialState,\n statusCode: router.currentRoute?.value?.name?.toLowerCase() === 'notfound' ? 404 : 200,\n usedModules: Array.from(ctx.modules || new Set()), // Return used modules\n };\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"vue-app-renderer.js","sources":["../../../../../../../src/modules/core/views/utils/vue-app-renderer.js"],"sourcesContent":["import { setAuthToken } from '@martyrs/src/modules/core/views/utils/axios-instance.js';\nimport { renderSSRHead } from '@unhead/ssr';\nimport { renderToString } from '@vue/server-renderer';\n\nexport function renderAndMountApp({ createApp, hooks = {} }) {\n const start = async () => {\n // [LOADING 22] Starting client-side hydration\n performance.mark('loading-22-start');\n console.log('[LOADING 22] Starting client-side hydration...');\n\n const { app, router, store, moduleManager, config } = await createApp();\n \n let serverModules = [];\n \n // Загружаем модули которые были загружены на сервере\n if (typeof window !== 'undefined') {\n try {\n const modulesElement = document.querySelector('[data-loaded-modules]');\n if (modulesElement) {\n serverModules = JSON.parse(modulesElement.innerHTML);\n }\n } catch (e) {\n console.error('Failed to parse loaded modules', e);\n }\n \n const context = { app, store, router, config };\n\n // [LOADING 23] Loading server modules for hydration\n performance.mark('loading-23-start');\n console.log(`[LOADING 23] Loading ${serverModules.length} server modules for hydration...`);\n\n for (const moduleName of serverModules) {\n try {\n await moduleManager.load(moduleName, context);\n await moduleManager.initialize(moduleName, context);\n } catch (error) {\n console.error(`Failed to load module ${moduleName}:`, error);\n }\n }\n\n performance.mark('loading-23-end');\n performance.measure('loading-23', 'loading-23-start', 'loading-23-end');\n const measure23 = performance.getEntriesByName('loading-23')[0];\n console.log(`[LOADING 23] Server modules loaded in ${measure23?.duration?.toFixed(2)}ms`);\n }\n \n // Call beforeHydration hook if provided\n if (hooks.beforeHydration) {\n hooks.beforeHydration({ app, router, store, moduleManager });\n }\n\n // [LOADING 24] Parsing and applying initialState\n performance.mark('loading-24-start');\n console.log('[LOADING 24] Parsing and applying initialState...');\n\n let initialState;\n\n try {\n const initialStateElement = document.querySelector('[data-state]');\n\n if (initialStateElement && initialStateElement.innerHTML.trim() !== '') {\n const stateContent = initialStateElement.innerHTML.trim();\n \n // Validate JSON format before parsing\n if (stateContent.startsWith('{') && stateContent.endsWith('}')) {\n initialState = JSON.parse(stateContent);\n \n // Basic validation of state structure\n if (typeof initialState !== 'object' || initialState === null) {\n throw new Error('Invalid state format');\n }\n } else {\n throw new Error('Invalid JSON format');\n }\n }\n } catch (error) {\n console.error('Failed to parse user state', error);\n initialState = null;\n }\n\n if (initialState) {\n console.log('[AUTH COOKIE DEBUG] Browser initialState.auth:', initialState.auth);\n console.log('[AUTH COOKIE DEBUG] Has token?', !!initialState?.auth?.access?.token);\n console.log('[AUTH COOKIE DEBUG] Has auth but no status?', !!initialState?.auth && !initialState.auth.access?.status);\n\n // Применяем начальное состояние ко всем модулям (true = гидратация)\n store.setInitialState(initialState, true);\n\n // Гидратация session из auth данных — напрямую в reactive state\n if (initialState?.auth?.user?._id && store.core?.state?.session) {\n store.core.state.session.userId = initialState.auth.user._id;\n store.core.state.session.token = initialState.auth.access?.token;\n store.core.state.session.roles = initialState.auth.access?.roles;\n store.core.state.session.accesses = initialState.auth.accesses || [];\n console.log('[AUTH COOKIE DEBUG] Session hydrated with userId:', initialState.auth.user._id);\n }\n\n if (initialState?.auth?.access?.token) {\n console.log('[AUTH COOKIE DEBUG] Setting auth token from initialState');\n\n setAuthToken(initialState.auth.access.token);\n } else if (initialState?.auth && !initialState.auth.access?.status) {\n // Если SSR сбросил auth (из-за ошибки), удаляем куку в браузере\n console.log('[AUTH COOKIE DEBUG] SSR reset auth, removing cookie in browser');\n if (store.auth && store.auth.removeCookie) {\n await store.auth.removeCookie('user');\n }\n }\n } else {\n // Если нет initialState, сбрасываем авторизацию (если модуль auth загружен)\n if (store.auth && store.auth.actions) {\n store.auth.actions.resetState();\n // await store.auth.removeCookie('user');\n await store.auth.actions.logout();\n }\n }\n\n const savedPosition = localStorage.getItem('position');\n\n if (savedPosition) {\n store.core.state.position = JSON.parse(savedPosition);\n }\n\n // app.config.globalProperties.$i18n.locale = router.currentRoute.value.params.locale\n // app.config.globalProperties.$i18n.locale = router.currentRoute.value.params.locale\n // If user browser locae supported then change locale\n // if (i18n.global.availableLocales.includes(browserLocale)) {\n // app.config.globalProperties.$i18n.locale = browserLocale;\n // }\n\n performance.mark('loading-24-end');\n performance.measure('loading-24', 'loading-24-start', 'loading-24-end');\n const measure24 = performance.getEntriesByName('loading-24')[0];\n console.log(`[LOADING 24] InitialState parsed and applied in ${measure24?.duration?.toFixed(2)}ms`);\n\n await router.isReady();\n\n // [LOADING 25] Mounting the application\n performance.mark('loading-25-start');\n console.log('[LOADING 25] Mounting the application...');\n\n app.mount('#app');\n\n performance.mark('loading-25-end');\n performance.measure('loading-25', 'loading-25-start', 'loading-25-end');\n const measure25 = performance.getEntriesByName('loading-25')[0];\n console.log(`[LOADING 25] Application mounted in ${measure25?.duration?.toFixed(2)}ms`);\n\n // Return the objects for further use\n return { app, router, store, moduleManager };\n };\n return start();\n}\n\nexport async function render({ url, cookies, headers, ssrContext, createApp }) {\n // [LOADING 26] SSR render starting\n performance.mark('loading-26-start');\n console.log('[LOADING 26] SSR render starting...');\n\n const { app, router, store, meta } = createApp();\n\n await router.push(url);\n await router.isReady();\n\n // If user's language is supported, change the locale\n // if (language === 'en' || language === 'ru') {\n // app.config.globalProperties.$i18n.locale = language\n // }\n\n // app.config.globalProperties.$i18n.locale = router.currentRoute.value.params.locale\n\n const ctx = ssrContext || {};\n\n if (router.currentRoute.value.name?.toLowerCase() === 'notfound') {\n ctx.notFound = true;\n }\n\n let user = null;\n\n if (cookies.user) {\n try {\n user = JSON.parse(cookies.user);\n } catch (error) {\n console.error('Failed to parse user cookie', error);\n user = null;\n }\n }\n\n \n\n\n if (user) {\n // [LOADING 27] SSR auth initialization\n performance.mark('loading-27-start');\n console.log('[LOADING 27] SSR auth initialization...');\n\n if (store.auth && store.auth.actions) {\n try {\n await store.auth.actions.initialize(user);\n } catch (error) {\n console.error('[SSR] Auth initialization failed, continuing without auth:', error);\n // Сбрасываем состояние если инициализация упала\n if (store.auth.actions.resetState) {\n store.auth.actions.resetState();\n }\n }\n } else {\n console.warn('[SSR] Auth module not loaded, cannot initialize user');\n }\n\n performance.mark('loading-27-end');\n performance.measure('loading-27', 'loading-27-start', 'loading-27-end');\n const measure27 = performance.getEntriesByName('loading-27')[0];\n console.log(`[LOADING 27] SSR auth initialized in ${measure27?.duration?.toFixed(2)}ms`);\n } else {\n if (store.auth && store.auth.actions) {\n store.auth.actions.resetState();\n } else {\n console.warn('[SSR] Auth module not loaded, cannot reset state');\n }\n }\n\n // [LOADING 28] SSR renderToString\n performance.mark('loading-28-start');\n console.log('[LOADING 28] SSR renderToString starting...');\n\n // After render, ctx.modules will be populated with used module identifiers\n const html = await renderToString(app, ctx);\n\n // Добавляем атрибуты темы через meta API перед renderSSRHead\n let theme = cookies?.theme;\n if (!theme) {\n // Fallback на sec-ch-prefers-color-scheme если нет cookie\n const prefersColorScheme = headers?.['sec-ch-prefers-color-scheme'];\n theme = prefersColorScheme === 'dark' ? 'system-dark' : 'system';\n }\n\n const themeAttrs = {};\n if (theme === 'dark') {\n themeAttrs.class = 'dark-theme';\n themeAttrs['data-theme'] = 'dark';\n themeAttrs['color-scheme'] = 'dark';\n } else if (theme === 'light') {\n themeAttrs.class = 'light-theme';\n themeAttrs['data-theme'] = 'light';\n themeAttrs['color-scheme'] = 'light';\n } else {\n // system/system-dark - без класса, CSS media query сработает\n themeAttrs['color-scheme'] = 'light dark';\n }\n\n meta.push({ htmlAttrs: themeAttrs });\n\n // Синхронизируем store state с определённой темой для SSR\n store.core.state.theme.mode = (theme === 'dark') ? 'dark'\n : (theme === 'light') ? 'light'\n : 'system';\n\n const payload = await renderSSRHead(meta, {});\n const initialState = await store.getInitialState();\n\n performance.mark('loading-28-end');\n performance.measure('loading-28', 'loading-28-start', 'loading-28-end');\n const measure28 = performance.getEntriesByName('loading-28')[0];\n console.log(`[LOADING 28] SSR renderToString completed in ${measure28?.duration?.toFixed(2)}ms`);\n\n // Total SSR render time\n performance.measure('loading-26-total', 'loading-26-start', 'loading-28-end');\n const measure26Total = performance.getEntriesByName('loading-26-total')[0];\n console.log(`[LOADING 26] Total SSR render completed in ${measure26Total?.duration?.toFixed(2)}ms`);\n\n return {\n html,\n meta: payload,\n state: initialState,\n statusCode: router.currentRoute?.value?.name?.toLowerCase() === 'notfound' ? 404 : 200,\n usedModules: Array.from(ctx.modules || new Set()), // Return used modules\n };\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ref, onMounted, onUnmounted, createBlock, openBlock, withCtx, createTextVNode, createCommentVNode, Teleport, createElementBlock, createElementVNode, createVNode } from "vue";
|
|
2
2
|
import { BarcodeScanner } from "../../../../../../node_modules/.pnpm/@capacitor-mlkit_barcode-scanning@7.3.0_@capacitor_core@7.4.4/node_modules/@capacitor-mlkit/barcode-scanning/dist/esm/index.js";
|
|
3
|
-
import _sfc_main$1 from "../../../../components/Button/Button.
|
|
3
|
+
import _sfc_main$1 from "../../../../components/Button/Button.vue.js";
|
|
4
4
|
import { actions } from "../../store/tickets.js";
|
|
5
5
|
/* empty css */
|
|
6
6
|
const _hoisted_1 = {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createBlock, openBlock, withCtx, createTextVNode, toDisplayString } from "vue";
|
|
2
|
-
import _sfc_main$1 from "../../../../components/Button/Button.
|
|
2
|
+
import _sfc_main$1 from "../../../../components/Button/Button.vue.js";
|
|
3
3
|
import { actions } from "../../store/tickets.js";
|
|
4
4
|
/* empty css */
|
|
5
5
|
import _export_sfc from "../../../../../../_virtual/_plugin-vue_export-helper.js";
|
|
@@ -13,9 +13,9 @@ import "axios";
|
|
|
13
13
|
/* empty css */
|
|
14
14
|
import UploadImage from "../../../../components/UploadImage/UploadImage.vue.js";
|
|
15
15
|
/* empty css */
|
|
16
|
-
/* empty css
|
|
16
|
+
/* empty css */
|
|
17
17
|
import _sfc_main$8 from "../../../../components/Feed/Feed.vue.js";
|
|
18
|
-
import _sfc_main$a from "../../../../components/Button/Button.
|
|
18
|
+
import _sfc_main$a from "../../../../components/Button/Button.vue.js";
|
|
19
19
|
import _sfc_main$7 from "../../../core/views/components/blocks/Card.vue.js";
|
|
20
20
|
import _sfc_main$3 from "../sections/EditTickets.vue.js";
|
|
21
21
|
import _sfc_main$2 from "../../../icons/navigation/IconDelete.vue.js";
|
|
@@ -3,7 +3,7 @@ import _sfc_main$7 from "../../../../components/Feed/Feed.vue.js";
|
|
|
3
3
|
import _sfc_main$2 from "../../../../components/Block/Block.vue.js";
|
|
4
4
|
import _sfc_main$3 from "../../../../components/Popup/Popup.vue.js";
|
|
5
5
|
import Field from "../../../../components/Field/Field.vue.js";
|
|
6
|
-
import _sfc_main$6 from "../../../../components/Button/Button.
|
|
6
|
+
import _sfc_main$6 from "../../../../components/Button/Button.vue.js";
|
|
7
7
|
import _sfc_main$8 from "../../../../components/Dropdown/Dropdown.vue.js";
|
|
8
8
|
import _sfc_main$1 from "../elements/ButtonCheck.vue.js";
|
|
9
9
|
import _sfc_main$5 from "../../../icons/navigation/IconDelete.vue.js";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { computed, ref, watch, createElementBlock, openBlock, createElementVNode, createCommentVNode, unref, createBlock, createVNode, isRef, withCtx, Fragment, renderList } from "vue";
|
|
2
2
|
import { useRoute, useRouter } from "vue-router";
|
|
3
|
-
import _sfc_main$1 from "../../../../components/Tab/Tab.
|
|
3
|
+
import _sfc_main$1 from "../../../../components/Tab/Tab.vue.js";
|
|
4
4
|
import _sfc_main$2 from "../../../../components/Feed/Feed.vue.js";
|
|
5
5
|
/* empty css */
|
|
6
6
|
import _sfc_main$3 from "../blocks/CardEvent.vue.js";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ref, reactive, createBlock, openBlock, withCtx, createElementBlock, createVNode, Fragment, renderList, createElementVNode, toDisplayString, unref, createCommentVNode, createTextVNode } from "vue";
|
|
2
2
|
import _sfc_main$1 from "../../../../components/Block/Block.vue.js";
|
|
3
3
|
import Field from "../../../../components/Field/Field.vue.js";
|
|
4
|
-
import _sfc_main$2 from "../../../../components/Button/Button.
|
|
4
|
+
import _sfc_main$2 from "../../../../components/Button/Button.vue.js";
|
|
5
5
|
import _sfc_main$5 from "../../../../components/Popup/Popup.vue.js";
|
|
6
6
|
import UploadImage from "../../../../components/UploadImage/UploadImage.vue.js";
|
|
7
7
|
import FieldDate from "../../../../components/FieldDate/FieldDate.vue.js";
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { ref, createElementBlock, openBlock, createVNode, unref, isRef, withCtx, Fragment, renderList, createElementVNode, toDisplayString, createBlock, createCommentVNode, createTextVNode } from "vue";
|
|
2
2
|
import { useRoute } from "vue-router";
|
|
3
3
|
/* empty css */
|
|
4
|
-
import _sfc_main$8 from "../../../../components/Button/Button.
|
|
5
|
-
/* empty css
|
|
4
|
+
import _sfc_main$8 from "../../../../components/Button/Button.vue.js";
|
|
5
|
+
/* empty css */
|
|
6
6
|
import _sfc_main$4 from "../../../../components/Chips/Chips.vue.js";
|
|
7
7
|
/* empty css */
|
|
8
8
|
import _sfc_main$5 from "../../../../components/Popup/Popup.vue.js";
|
|
@@ -12,7 +12,7 @@ import { state } from "../../../auth/views/store/auth.js";
|
|
|
12
12
|
import gallery from "../../store/gallery.js";
|
|
13
13
|
import _sfc_main$3 from "../../../core/views/components/blocks/CardHeader.vue.js";
|
|
14
14
|
import _sfc_main$1 from "../../../core/views/components/sections/SectionPageTitle.vue.js";
|
|
15
|
-
import _sfc_main$6 from "../../../../components/EditImages/EditImages.
|
|
15
|
+
import _sfc_main$6 from "../../../../components/EditImages/EditImages.vue.js";
|
|
16
16
|
import _sfc_main$7 from "../../../../components/FieldTags/BlockTags.vue.js";
|
|
17
17
|
const _hoisted_1 = { class: "cols-1 gap-thin pd-thin" };
|
|
18
18
|
const _hoisted_2 = { class: "pos-relative" };
|