@coopenomics/desktop 2025.11.27-alpha-1 → 2025.11.28-alpha-2
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/extensions/chatcoop/pages/ChatCoopPage/ui/ChatCoopPage.vue +57 -0
- package/package.json +6 -6
- package/src/processes/init-installed-extensions/extensions-registry.ts +47 -0
- package/src/processes/init-installed-extensions/index.ts +81 -67
- package/src/shared/lib/composables/index.ts +1 -0
- package/src/shared/lib/composables/useMobileDrawer.ts +20 -0
- package/src/widgets/Desktop/CmdkMenu/CmdkMenu.vue +19 -4
- package/src-pwa/register-service-worker.ts +18 -18
|
@@ -20,6 +20,17 @@ div
|
|
|
20
20
|
text="Загрузка клиента..."
|
|
21
21
|
)
|
|
22
22
|
|
|
23
|
+
// Заглушка для мобильных устройств
|
|
24
|
+
div(v-else-if="isMobile", class="mobile-stub")
|
|
25
|
+
div.mobile-stub-content
|
|
26
|
+
div.mobile-icon
|
|
27
|
+
i.fas.fa-mobile-alt
|
|
28
|
+
h2 Мобильный клиент доступен
|
|
29
|
+
p На мобильных устройствах кооперативный мессенджер работает только через мобильное приложение Element X.
|
|
30
|
+
p Перейдите на страницу с инструкциями по подключению.
|
|
31
|
+
q-btn(@click="goToMobileClient", class="mobile-button", color="primary", icon="fa-mobile-alt")
|
|
32
|
+
| Перейти к мобильному клиенту
|
|
33
|
+
|
|
23
34
|
// Iframe с Matrix клиентом после полной загрузки
|
|
24
35
|
iframe(
|
|
25
36
|
v-else-if="chatcoopStore.accountStatus?.iframeUrl",
|
|
@@ -36,11 +47,15 @@ div
|
|
|
36
47
|
|
|
37
48
|
<script lang="ts" setup>
|
|
38
49
|
import { ref, onMounted, watch } from 'vue';
|
|
50
|
+
import { useRouter } from 'vue-router';
|
|
39
51
|
import { WindowLoader } from 'src/shared/ui/Loader';
|
|
40
52
|
import { useChatCoopChatStore } from '../../../entities/ChatCoopChat/model';
|
|
41
53
|
import { MatrixRegistration } from '../../../widgets/MatrixRegistration';
|
|
54
|
+
import { useWindowSize } from 'src/shared/hooks/useWindowSize';
|
|
42
55
|
|
|
43
56
|
const chatcoopStore = useChatCoopChatStore();
|
|
57
|
+
const router = useRouter();
|
|
58
|
+
const { isMobile } = useWindowSize();
|
|
44
59
|
const isIframeLoading = ref(true);
|
|
45
60
|
let iframeLoadTimeout: number | null = null;
|
|
46
61
|
|
|
@@ -84,6 +99,10 @@ async function handleAccountCreated() {
|
|
|
84
99
|
await chatcoopStore.loadAccountStatus();
|
|
85
100
|
}
|
|
86
101
|
|
|
102
|
+
function goToMobileClient() {
|
|
103
|
+
router.push({ name: 'chatcoop-mobile' });
|
|
104
|
+
}
|
|
105
|
+
|
|
87
106
|
onMounted(async () => {
|
|
88
107
|
await chatcoopStore.loadAccountStatus();
|
|
89
108
|
// Инициализируем загрузку iframe после получения статуса аккаунта
|
|
@@ -127,4 +146,42 @@ onMounted(async () => {
|
|
|
127
146
|
.retry-button:hover {
|
|
128
147
|
background-color: #0056b3;
|
|
129
148
|
}
|
|
149
|
+
|
|
150
|
+
.mobile-stub {
|
|
151
|
+
display: flex;
|
|
152
|
+
align-items: center;
|
|
153
|
+
justify-content: center;
|
|
154
|
+
height: calc(100vh - 51px);
|
|
155
|
+
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
|
156
|
+
color: white;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
.mobile-stub-content {
|
|
160
|
+
text-align: center;
|
|
161
|
+
padding: 2rem;
|
|
162
|
+
max-width: 400px;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
.mobile-icon {
|
|
166
|
+
font-size: 4rem;
|
|
167
|
+
margin-bottom: 1.5rem;
|
|
168
|
+
opacity: 0.9;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
.mobile-stub-content h2 {
|
|
172
|
+
margin: 0 0 1rem 0;
|
|
173
|
+
font-size: 2rem;
|
|
174
|
+
font-weight: 600;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
.mobile-stub-content p {
|
|
178
|
+
margin: 0 0 1.5rem 0;
|
|
179
|
+
opacity: 0.9;
|
|
180
|
+
line-height: 1.6;
|
|
181
|
+
font-size: 1.1rem;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
.mobile-button {
|
|
185
|
+
margin-top: 1rem;
|
|
186
|
+
}
|
|
130
187
|
</style>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@coopenomics/desktop",
|
|
3
|
-
"version": "2025.11.
|
|
3
|
+
"version": "2025.11.28-alpha-2",
|
|
4
4
|
"description": "A Desktop Project",
|
|
5
5
|
"productName": "Desktop App",
|
|
6
6
|
"author": "Alex Ant <dacom.dark.sun@gmail.com>",
|
|
@@ -25,9 +25,9 @@
|
|
|
25
25
|
"start": "node -r ./alias-resolver.js dist/ssr/index.js"
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@coopenomics/controller": "2025.11.
|
|
29
|
-
"@coopenomics/notifications": "2025.11.
|
|
30
|
-
"@coopenomics/sdk": "2025.11.
|
|
28
|
+
"@coopenomics/controller": "2025.11.28-alpha-2",
|
|
29
|
+
"@coopenomics/notifications": "2025.11.28-alpha-2",
|
|
30
|
+
"@coopenomics/sdk": "2025.11.28-alpha-2",
|
|
31
31
|
"@dicebear/collection": "^9.0.1",
|
|
32
32
|
"@dicebear/core": "^9.0.1",
|
|
33
33
|
"@editorjs/code": "^2.9.3",
|
|
@@ -59,7 +59,7 @@
|
|
|
59
59
|
"@wharfkit/wallet-plugin-privatekey": "^1.1.0",
|
|
60
60
|
"axios": "^1.2.1",
|
|
61
61
|
"compression": "^1.7.4",
|
|
62
|
-
"cooptypes": "2025.11.
|
|
62
|
+
"cooptypes": "2025.11.28-alpha-2",
|
|
63
63
|
"dompurify": "^3.1.7",
|
|
64
64
|
"dotenv": "^16.4.5",
|
|
65
65
|
"email-regex": "^5.0.0",
|
|
@@ -123,5 +123,5 @@
|
|
|
123
123
|
"npm": ">= 6.13.4",
|
|
124
124
|
"yarn": ">= 1.21.1"
|
|
125
125
|
},
|
|
126
|
-
"gitHead": "
|
|
126
|
+
"gitHead": "83d4bd88cf24e5131c2808239f8d364529f1ff02"
|
|
127
127
|
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { IWorkspaceConfig } from 'src/shared/lib/types/workspace';
|
|
2
|
+
|
|
3
|
+
// Импортируем все функции установки расширений
|
|
4
|
+
import capitalInstall from '../../../extensions/capital/install';
|
|
5
|
+
import chairmanInstall from '../../../extensions/chairman/install';
|
|
6
|
+
import chatcoopInstall from '../../../extensions/chatcoop/install';
|
|
7
|
+
import marketInstall from '../../../extensions/market/install';
|
|
8
|
+
import marketAdminInstall from '../../../extensions/market-admin/install';
|
|
9
|
+
import participantInstall from '../../../extensions/participant/install';
|
|
10
|
+
import powerupInstall from '../../../extensions/powerup/install';
|
|
11
|
+
import sovietInstall from '../../../extensions/soviet/install';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Единый регистр всех доступных расширений
|
|
15
|
+
* Ключ - имя расширения, значение - функция установки
|
|
16
|
+
*/
|
|
17
|
+
export const extensionsRegistry: Record<string, () => Promise<IWorkspaceConfig[]>> = {
|
|
18
|
+
capital: capitalInstall,
|
|
19
|
+
chairman: chairmanInstall,
|
|
20
|
+
chatcoop: chatcoopInstall,
|
|
21
|
+
market: marketInstall,
|
|
22
|
+
'market-admin': marketAdminInstall,
|
|
23
|
+
participant: participantInstall,
|
|
24
|
+
powerup: powerupInstall,
|
|
25
|
+
soviet: sovietInstall,
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Получить список всех доступных расширений
|
|
30
|
+
*/
|
|
31
|
+
export function getAvailableExtensions(): string[] {
|
|
32
|
+
return Object.keys(extensionsRegistry);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Проверить, существует ли расширение
|
|
37
|
+
*/
|
|
38
|
+
export function isExtensionAvailable(extensionName: string): boolean {
|
|
39
|
+
return extensionName in extensionsRegistry;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Получить функцию установки расширения
|
|
44
|
+
*/
|
|
45
|
+
export function getExtensionInstaller(extensionName: string): (() => Promise<IWorkspaceConfig[]>) | undefined {
|
|
46
|
+
return extensionsRegistry[extensionName];
|
|
47
|
+
}
|
|
@@ -1,35 +1,62 @@
|
|
|
1
1
|
import type { Router } from 'vue-router';
|
|
2
2
|
import { useDesktopStore } from 'src/entities/Desktop/model';
|
|
3
3
|
import type { IWorkspaceConfig } from 'src/shared/lib/types/workspace';
|
|
4
|
+
import { extensionsRegistry, getAvailableExtensions } from './extensions-registry';
|
|
4
5
|
|
|
5
6
|
export async function useInitExtensionsProcess(router: Router) {
|
|
6
7
|
const store = useDesktopStore();
|
|
7
|
-
// Загружаем все модули расширений
|
|
8
|
-
const modules = import.meta.glob('../../../extensions/**/install.{ts,js}');
|
|
9
8
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
9
|
+
console.log('📦 [InitExtensions] Starting initialization with extensions registry');
|
|
10
|
+
|
|
11
|
+
// Получаем список всех доступных расширений
|
|
12
|
+
const availableExtensions = getAvailableExtensions();
|
|
13
|
+
|
|
14
|
+
console.log('📦 [InitExtensions] Available extensions:', availableExtensions);
|
|
15
|
+
|
|
16
|
+
// Загружаем все расширения из регистра
|
|
17
|
+
for (const extensionName of availableExtensions) {
|
|
18
|
+
try {
|
|
19
|
+
console.log(`📦 [InitExtensions] Loading extension: ${extensionName}`);
|
|
20
|
+
|
|
21
|
+
const installFunction = extensionsRegistry[extensionName];
|
|
22
|
+
const result = await installFunction();
|
|
15
23
|
|
|
16
24
|
// Поддержка обоих форматов: массив или одиночный объект (для обратной совместимости)
|
|
17
25
|
const workspaceConfigs: IWorkspaceConfig[] = Array.isArray(result) ? result : [result];
|
|
18
26
|
|
|
27
|
+
console.log(`📦 [InitExtensions] Extension "${extensionName}" loaded, configs:`, workspaceConfigs.length);
|
|
28
|
+
|
|
19
29
|
// Обрабатываем каждый workspace из расширения
|
|
20
30
|
for (const config of workspaceConfigs) {
|
|
21
31
|
if (config?.workspace && config?.routes?.length) {
|
|
32
|
+
console.log(`📦 [InitExtensions] Setting routes for workspace: ${config.workspace}`);
|
|
33
|
+
|
|
22
34
|
// Записываем маршруты в соответствующий workspace
|
|
23
35
|
store.setRoutes(config.workspace, config.routes as any);
|
|
36
|
+
|
|
24
37
|
// Регистрируем маршруты в router, добавляя их в базовый родительский маршрут
|
|
25
38
|
const baseRoute = router.getRoutes().find((r) => r.name === 'base');
|
|
26
39
|
if (baseRoute) {
|
|
27
|
-
config.routes.forEach((r: any) =>
|
|
40
|
+
config.routes.forEach((r: any) => {
|
|
41
|
+
// Проверяем, не зарегистрирован ли уже маршрут
|
|
42
|
+
const existingRoute = router.getRoutes().find((route) => route.name === r.name);
|
|
43
|
+
if (!existingRoute) {
|
|
44
|
+
console.log(`📦 [InitExtensions] Adding route to router: ${r.name}`);
|
|
45
|
+
router.addRoute('base', r);
|
|
46
|
+
} else {
|
|
47
|
+
console.log(`📦 [InitExtensions] Route already exists, skipping: ${r.name}`);
|
|
48
|
+
}
|
|
49
|
+
});
|
|
28
50
|
}
|
|
29
51
|
}
|
|
30
52
|
}
|
|
53
|
+
} catch (error) {
|
|
54
|
+
console.error(`📦 [InitExtensions] Failed to load extension "${extensionName}":`, error);
|
|
55
|
+
// Продолжаем загрузку других расширений даже если одно не загрузилось
|
|
31
56
|
}
|
|
32
57
|
}
|
|
58
|
+
|
|
59
|
+
console.log('📦 [InitExtensions] All extensions initialization completed');
|
|
33
60
|
}
|
|
34
61
|
|
|
35
62
|
// Функция для динамической загрузки маршрутов конкретного расширения
|
|
@@ -42,72 +69,59 @@ export async function loadExtensionRoutes(
|
|
|
42
69
|
try {
|
|
43
70
|
console.log('📦 [LoadExtensionRoutes] Starting to load routes for extension:', extensionName);
|
|
44
71
|
|
|
45
|
-
// Получаем
|
|
46
|
-
const
|
|
47
|
-
'../../../extensions/**/install.{ts,js}',
|
|
48
|
-
);
|
|
49
|
-
|
|
50
|
-
// Находим путь к модулю нужного расширения
|
|
51
|
-
const modulePath = Object.keys(allModules).find((path) => {
|
|
52
|
-
// Извлекаем имя расширения из пути: ../../../extensions/{extensionName}/install.{ts,js}
|
|
53
|
-
const pathParts = path.split('/');
|
|
54
|
-
const extName = pathParts[pathParts.length - 2]; // предпоследний элемент - имя папки
|
|
55
|
-
return extName === extensionName;
|
|
56
|
-
});
|
|
72
|
+
// Получаем функцию установки из регистра
|
|
73
|
+
const installFunction = extensionsRegistry[extensionName];
|
|
57
74
|
|
|
58
|
-
if (!
|
|
59
|
-
console.warn(`📦 [LoadExtensionRoutes]
|
|
75
|
+
if (!installFunction) {
|
|
76
|
+
console.warn(`📦 [LoadExtensionRoutes] Extension "${extensionName}" not found in registry`);
|
|
60
77
|
return;
|
|
61
78
|
}
|
|
62
79
|
|
|
63
|
-
console.log('📦 [LoadExtensionRoutes] Found
|
|
64
|
-
|
|
65
|
-
const
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
}
|
|
102
|
-
});
|
|
103
|
-
}
|
|
80
|
+
console.log('📦 [LoadExtensionRoutes] Found extension in registry, loading...');
|
|
81
|
+
|
|
82
|
+
const result = await installFunction();
|
|
83
|
+
console.log('📦 [LoadExtensionRoutes] Extension loaded, result:', result);
|
|
84
|
+
|
|
85
|
+
// Поддержка обоих форматов: массив или одиночный объект (для обратной совместимости)
|
|
86
|
+
const workspaceConfigs: IWorkspaceConfig[] = Array.isArray(result) ? result : [result];
|
|
87
|
+
|
|
88
|
+
console.log('📦 [LoadExtensionRoutes] Processing workspace configs:', workspaceConfigs.length);
|
|
89
|
+
|
|
90
|
+
// Обрабатываем каждый workspace из расширения
|
|
91
|
+
for (const config of workspaceConfigs) {
|
|
92
|
+
console.log('📦 [LoadExtensionRoutes] Processing workspace config:', {
|
|
93
|
+
workspace: config.workspace,
|
|
94
|
+
routesCount: config.routes?.length,
|
|
95
|
+
routes: config.routes?.map(r => ({ name: r.name, meta: r.meta }))
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
if (config?.workspace && config?.routes?.length) {
|
|
99
|
+
// Записываем маршруты в соответствующий workspace
|
|
100
|
+
console.log('📦 [LoadExtensionRoutes] Setting routes for workspace:', config.workspace);
|
|
101
|
+
store.setRoutes(config.workspace, config.routes as any);
|
|
102
|
+
|
|
103
|
+
// Регистрируем маршруты в router
|
|
104
|
+
const baseRoute = router.getRoutes().find((r) => r.name === 'base');
|
|
105
|
+
if (baseRoute) {
|
|
106
|
+
config.routes.forEach((r: any) => {
|
|
107
|
+
// Проверяем, не зарегистрирован ли уже маршрут
|
|
108
|
+
const existingRoute = router
|
|
109
|
+
.getRoutes()
|
|
110
|
+
.find((route) => route.name === r.name);
|
|
111
|
+
if (!existingRoute) {
|
|
112
|
+
console.log('📦 [LoadExtensionRoutes] Adding route to router:', r.name);
|
|
113
|
+
router.addRoute('base', r);
|
|
114
|
+
} else {
|
|
115
|
+
console.log('📦 [LoadExtensionRoutes] Route already exists, skipping:', r.name);
|
|
116
|
+
}
|
|
117
|
+
});
|
|
104
118
|
}
|
|
105
119
|
}
|
|
106
|
-
|
|
107
|
-
console.log(
|
|
108
|
-
`📦 [LoadExtensionRoutes] Routes for extension "${extensionName}" loaded successfully (${workspaceConfigs.length} workspace(s))`,
|
|
109
|
-
);
|
|
110
120
|
}
|
|
121
|
+
|
|
122
|
+
console.log(
|
|
123
|
+
`📦 [LoadExtensionRoutes] Routes for extension "${extensionName}" loaded successfully (${workspaceConfigs.length} workspace(s))`,
|
|
124
|
+
);
|
|
111
125
|
} catch (error) {
|
|
112
126
|
console.error(
|
|
113
127
|
`📦 [LoadExtensionRoutes] Failed to load routes for extension "${extensionName}":`,
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { useDesktopStore } from 'src/entities/Desktop/model';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Composable для управления drawer на мобильных устройствах
|
|
5
|
+
* Используется для автоматического закрытия drawer при определенных действиях
|
|
6
|
+
*/
|
|
7
|
+
export function useMobileDrawer() {
|
|
8
|
+
const desktop = useDesktopStore();
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Закрывает левый drawer только на мобильных устройствах
|
|
12
|
+
*/
|
|
13
|
+
const closeDrawerOnMobile = () => {
|
|
14
|
+
desktop.closeLeftDrawerOnMobile();
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
return {
|
|
18
|
+
closeDrawerOnMobile,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
@@ -48,7 +48,7 @@ q-dialog.cmdk-dialog(
|
|
|
48
48
|
// Заголовок группы (воркспейс)
|
|
49
49
|
.cmdk-group-header(
|
|
50
50
|
:class="{ 'selected': cmdkStore.selectedIndex === groupIndex }"
|
|
51
|
-
@click="
|
|
51
|
+
@click="handleSelectGroup(groupIndex)"
|
|
52
52
|
)
|
|
53
53
|
q-icon.cmdk-group-icon(:name="group.icon")
|
|
54
54
|
.cmdk-group-title {{ group.title }}
|
|
@@ -60,14 +60,14 @@ q-dialog.cmdk-dialog(
|
|
|
60
60
|
v-for="(page, pageIndex) in group.pages",
|
|
61
61
|
:key="page.name",
|
|
62
62
|
:class="{ 'selected': cmdkStore.selectedIndex === groupIndex && cmdkStore.selectedPageIndex === pageIndex }"
|
|
63
|
-
@click="
|
|
63
|
+
@click="handleSelectPage(group.workspaceName, page)"
|
|
64
64
|
)
|
|
65
65
|
q-icon.cmdk-page-icon(:name="page.meta.icon || 'circle'")
|
|
66
66
|
.cmdk-page-title {{ page.meta.title }}
|
|
67
67
|
.cmdk-page-shortcut(v-if="page.shortcut") {{ page.shortcut }}
|
|
68
68
|
|
|
69
69
|
// Подсказки
|
|
70
|
-
.cmdk-footer
|
|
70
|
+
.cmdk-footer(v-if="!isMobile")
|
|
71
71
|
.cmdk-hint
|
|
72
72
|
kbd ↑↓
|
|
73
73
|
span для навигации
|
|
@@ -80,11 +80,26 @@ q-dialog.cmdk-dialog(
|
|
|
80
80
|
<script setup lang="ts">
|
|
81
81
|
import { ref, onMounted, onUnmounted, watchEffect } from 'vue';
|
|
82
82
|
import { useCmdkMenuStore } from 'src/entities/CmdkMenu/model';
|
|
83
|
+
import { useMobileDrawer } from 'src/shared/lib/composables/useMobileDrawer';
|
|
84
|
+
import { useWindowSize } from 'src/shared/hooks/useWindowSize';
|
|
83
85
|
|
|
84
86
|
const cmdkStore = useCmdkMenuStore();
|
|
87
|
+
const { isMobile } = useWindowSize();
|
|
88
|
+
const { closeDrawerOnMobile } = useMobileDrawer();
|
|
85
89
|
const searchInput = ref<HTMLInputElement | null>(null);
|
|
86
90
|
const contentRef = ref<HTMLElement | null>(null);
|
|
87
91
|
|
|
92
|
+
// Обработчики для выбора элементов с закрытием drawer на мобильных устройствах
|
|
93
|
+
const handleSelectGroup = (groupIndex: number) => {
|
|
94
|
+
closeDrawerOnMobile();
|
|
95
|
+
cmdkStore.selectGroup(groupIndex);
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
const handleSelectPage = (workspaceName: string, page: any) => {
|
|
99
|
+
closeDrawerOnMobile();
|
|
100
|
+
cmdkStore.selectPage(workspaceName, page);
|
|
101
|
+
};
|
|
102
|
+
|
|
88
103
|
// Следим за contentRef и устанавливаем его в store
|
|
89
104
|
watchEffect(() => {
|
|
90
105
|
if (contentRef.value) {
|
|
@@ -110,7 +125,7 @@ onUnmounted(() => {
|
|
|
110
125
|
<style lang="scss">
|
|
111
126
|
.cmdk-dialog {
|
|
112
127
|
max-width: 100%;
|
|
113
|
-
z-index:
|
|
128
|
+
z-index: 10000;
|
|
114
129
|
}
|
|
115
130
|
|
|
116
131
|
.cmdk-panel {
|
|
@@ -173,10 +173,10 @@ if (!shouldRegisterSW) {
|
|
|
173
173
|
|
|
174
174
|
// Показываем уведомление пользователю о доступном обновлении
|
|
175
175
|
if ('Notification' in window && Notification.permission === 'granted') {
|
|
176
|
-
new Notification('Обновление доступно', {
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
});
|
|
176
|
+
// new Notification('Обновление доступно', {
|
|
177
|
+
// body: 'Выпущена новая версия приложения. Нажмите на уведомление, чтобы обновить приложение.',
|
|
178
|
+
// icon: '/icons/icon-192x192.png',
|
|
179
|
+
// });
|
|
180
180
|
}
|
|
181
181
|
},
|
|
182
182
|
|
|
@@ -192,23 +192,23 @@ if (!shouldRegisterSW) {
|
|
|
192
192
|
// Показываем уведомление пользователю
|
|
193
193
|
if ('Notification' in window) {
|
|
194
194
|
if (Notification.permission === 'granted') {
|
|
195
|
-
new Notification('Обновление доступно', {
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
}).onclick = () => {
|
|
200
|
-
|
|
201
|
-
};
|
|
195
|
+
// new Notification('Обновление доступно', {
|
|
196
|
+
// body: 'Выпущена новая версия приложения. Нажмите на уведомление, чтобы обновить приложение.',
|
|
197
|
+
// icon: '/icons/icon-192x192.png',
|
|
198
|
+
// requireInteraction: true,
|
|
199
|
+
// }).onclick = () => {
|
|
200
|
+
// applyUpdate();
|
|
201
|
+
// };
|
|
202
202
|
} else if (Notification.permission !== 'denied') {
|
|
203
203
|
Notification.requestPermission().then((permission) => {
|
|
204
204
|
if (permission === 'granted') {
|
|
205
|
-
new Notification('Обновление доступно', {
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
}).onclick = () => {
|
|
210
|
-
|
|
211
|
-
};
|
|
205
|
+
// new Notification('Обновление доступно', {
|
|
206
|
+
// body: 'Выпущена новая версия приложения. Нажмите на уведомление, чтобы обновить приложение.',
|
|
207
|
+
// icon: '/icons/icon-192x192.png',
|
|
208
|
+
// requireInteraction: true,
|
|
209
|
+
// }).onclick = () => {
|
|
210
|
+
// applyUpdate();
|
|
211
|
+
// };
|
|
212
212
|
}
|
|
213
213
|
});
|
|
214
214
|
}
|