set add QR code page
Deploy app frontend / app frontend (push) Failing after 52s
Deploy service couchdb / service couchdb (push) Successful in 28s
Deploy db-migrations / db-migrations (push) Successful in 57s
Deploy service message-delivery-method-web-push / service message-delivery-method-web-push (push) Successful in 1m3s

This commit is contained in:
2024-12-06 14:07:31 +02:00
parent 3ec74a5f9f
commit 9c69812258
14 changed files with 201 additions and 162 deletions
@@ -8,8 +8,6 @@ on:
- 'services/couchdb/**' - 'services/couchdb/**'
- '.gitea/workflows/deploy-service-couchdb.yaml' - '.gitea/workflows/deploy-service-couchdb.yaml'
- 'docker-compose.yml' - 'docker-compose.yml'
- 'package.json'
- 'pnpm-lock.yaml'
jobs: jobs:
service couchdb: service couchdb:
+2
View File
@@ -62,6 +62,8 @@ declare global {
const useId: typeof import('vue')['useId'] const useId: typeof import('vue')['useId']
const useLink: typeof import('vue-router')['useLink'] const useLink: typeof import('vue-router')['useLink']
const useModel: typeof import('vue')['useModel'] const useModel: typeof import('vue')['useModel']
const useMutation: typeof import('@tanstack/vue-query')['useMutation']
const useQuery: typeof import('@tanstack/vue-query')['useQuery']
const useRoute: typeof import('vue-router')['useRoute'] const useRoute: typeof import('vue-router')['useRoute']
const useRouter: typeof import('vue-router')['useRouter'] const useRouter: typeof import('vue-router')['useRouter']
const useSeoMeta: typeof import('unhead')['useSeoMeta'] const useSeoMeta: typeof import('unhead')['useSeoMeta']
+4
View File
@@ -12,6 +12,7 @@ declare module 'vue' {
ChatComponent: typeof import('./src/components/ChatComponent.vue')['default'] ChatComponent: typeof import('./src/components/ChatComponent.vue')['default']
ChatSubscribeWebPush: typeof import('./src/components/ChatSubscribeWebPush.vue')['default'] ChatSubscribeWebPush: typeof import('./src/components/ChatSubscribeWebPush.vue')['default']
Checkbox: typeof import('primevue/checkbox')['default'] Checkbox: typeof import('primevue/checkbox')['default']
CopyLinkButton: typeof import('@/components/link/LinkCopyButton.vue')['default']
CreateActionsSection: typeof import('./src/components/create/CreateActionsSection.vue')['default'] CreateActionsSection: typeof import('./src/components/create/CreateActionsSection.vue')['default']
CreateMessageDeliveryMethodSection: typeof import('./src/components/create/CreateMessageDeliveryMethodSection.vue')['default'] CreateMessageDeliveryMethodSection: typeof import('./src/components/create/CreateMessageDeliveryMethodSection.vue')['default']
CreateMessageDeliveryOption: typeof import('./src/components/create/CreateMessageDeliveryOption.vue')['default'] CreateMessageDeliveryOption: typeof import('./src/components/create/CreateMessageDeliveryOption.vue')['default']
@@ -26,6 +27,9 @@ declare module 'vue' {
DownloadImageButton: typeof import('./src/components/manage/DownloadImageButton.vue')['default'] DownloadImageButton: typeof import('./src/components/manage/DownloadImageButton.vue')['default']
ExamplesSection: typeof import('./src/components/TheWelcome/ExamplesSection.vue')['default'] ExamplesSection: typeof import('./src/components/TheWelcome/ExamplesSection.vue')['default']
InputText: typeof import('primevue/inputtext')['default'] InputText: typeof import('primevue/inputtext')['default']
LinkCopyButton: typeof import('./src/components/link/LinkCopyButton.vue')['default']
LinkShareButton: typeof import('./src/components/link/LinkShareButton.vue')['default']
LinkShareTelegramButton: typeof import('./src/components/link/LinkShareTelegramButton.vue')['default']
ManagePlacementInstructions: typeof import('./src/components/manage/ManagePlacementInstructions.vue')['default'] ManagePlacementInstructions: typeof import('./src/components/manage/ManagePlacementInstructions.vue')['default']
ProgressSpinner: typeof import('primevue/progressspinner')['default'] ProgressSpinner: typeof import('primevue/progressspinner')['default']
QRCodeCard: typeof import('./src/components/manage/QRCodeCard.vue')['default'] QRCodeCard: typeof import('./src/components/manage/QRCodeCard.vue')['default']
-1
View File
@@ -37,7 +37,6 @@
"tailwindcss-primeui": "^0.3.4", "tailwindcss-primeui": "^0.3.4",
"unhead": "^1.11.13", "unhead": "^1.11.13",
"vue": "^3.5.12", "vue": "^3.5.12",
"vue-query": "^1.26.0",
"vue-router": "^4.4.5" "vue-router": "^4.4.5"
}, },
"devDependencies": { "devDependencies": {
+1 -1
View File
@@ -52,7 +52,7 @@ export const createQrCodeDocument = async (
return qrCodeDoc return qrCodeDoc
} }
export const getQrCodeDocument = async (uri: string) => { export const getQrCodeDocument = async (uri: string): Promise<QRCodeDocument> => {
try { try {
return await qrCodeDbLocal.get<QRCodeDocument>(`qr_code:${uri}`) return await qrCodeDbLocal.get<QRCodeDocument>(`qr_code:${uri}`)
} catch (error) { } catch (error) {
@@ -0,0 +1,26 @@
<template>
<Button
:icon="isCopied ? 'pi pi-check' : 'pi pi-copy'"
:label="isCopied ? 'Ссылка скопирована!' : 'Копировать ссылку'"
class="text-nowrap"
severity="secondary"
size="small"
@click="copyLink()"
:outlined="!isCopied"
/>
</template>
<script setup lang="ts">
const props = defineProps<{ url: string }>()
const {
mutate: copyLink,
isSuccess: isCopied,
reset,
} = useMutation({
mutationFn: async () => {
await navigator.clipboard.writeText(props.url)
setTimeout(reset, 2500)
},
gcTime: 100,
})
</script>
@@ -0,0 +1,26 @@
<template>
<Button
:href="telegramShareUrl"
target="_blank"
size="small"
severity="secondary"
as="a"
class="text-nowrap"
outlined
rel="noopener noreferrer"
icon="pi pi-telegram"
title="Поделиться ссылкой в Telegram"
label="отправить ссылку в Telegram"
/>
</template>
<script setup lang="ts">
import { computed } from 'vue'
const props = defineProps<{ shareUrl: string; shareText: string }>()
const telegramShareUrl = computed(
() =>
`https://t.me/share/url?url=${encodeURIComponent(props.shareUrl)}&text=${encodeURIComponent(props.shareText)}`, // &photo=${shareImage}`
)
</script>
@@ -1,5 +1,5 @@
<template> <template>
<RouterLink :to="`/manage/qr/${qrCode.uri}/ready`" class="p-4 rounded-lg bg-white shadow-md"> <RouterLink :to="`/manage/qr/${qrCode.uri}`" class="p-4 rounded-lg bg-white shadow-md">
<div class="flex items-center justify-between mb-2"> <div class="flex items-center justify-between mb-2">
<div class="flex items-center"> <div class="flex items-center">
<QRCodePlacementIcon :placement="qrCode.placement" /> <QRCodePlacementIcon :placement="qrCode.placement" />
+1
View File
@@ -1,6 +1,7 @@
export const ROUTE_NAMES = { export const ROUTE_NAMES = {
HOME: 'home', HOME: 'home',
CREATE: 'create', CREATE: 'create',
MANAGE_QR_CODE: 'manage-qr-code',
MANAGE_QR_CODE_READY: 'manage-qr-code-ready', MANAGE_QR_CODE_READY: 'manage-qr-code-ready',
MANAGE_QR_CODE_CHAT: 'manage-qr-code-chat', MANAGE_QR_CODE_CHAT: 'manage-qr-code-chat',
MANAGE_DASHBOARD: 'manage-dashboard', MANAGE_DASHBOARD: 'manage-dashboard',
+6
View File
@@ -25,6 +25,12 @@ const routes = [
component: () => import('@/views/ManageDashboardView.vue'), component: () => import('@/views/ManageDashboardView.vue'),
props: true, props: true,
}, },
{
path: '/manage/qr/:qr_code_uri',
name: ROUTE_NAMES.MANAGE_QR_CODE,
component: () => import('@/views/ManageQRCodeView.vue'),
props: true,
},
{ {
path: '/manage/qr/:qr_code_uri/ready', path: '/manage/qr/:qr_code_uri/ready',
name: ROUTE_NAMES.MANAGE_QR_CODE_READY, name: ROUTE_NAMES.MANAGE_QR_CODE_READY,
@@ -73,19 +73,14 @@
</a> </a>
</span> </span>
</div> </div>
<Button <div class="flex gap-2 justify-center mt-2">
:href="telegramShareUrl" <LinkCopyButton :url="qrCodeDoc.url" />
target="_blank" <LinkShareTelegramButton
size="small" :shareUrl="qrCodeDoc.url"
severity="secondary" shareText="Используйте эту ссылку НаСвязи!"
as="a"
class="p-button-outlined"
rel="noopener noreferrer"
title="Поделиться ссылкой в Telegram"
icon="pi pi-telegram"
label="отправить ссылку в Telegram"
/> />
</div> </div>
</div>
<!-- Инструкции по размещению --> <!-- Инструкции по размещению -->
<ManagePlacementInstructions <ManagePlacementInstructions
@@ -149,13 +144,6 @@ const sanitizedFileName = computed(() => {
return sanitized ? `${sanitized} QR-Code - НаСвязи` : 'QR-Code - НаСвязи' return sanitized ? `${sanitized} QR-Code - НаСвязи` : 'QR-Code - НаСвязи'
}) })
const shareText = 'Используйте эту ссылку НаСвязи!'
const telegramShareUrl = computed(
() =>
qrCodeDoc.value?.url &&
`https://t.me/share/url?url=${encodeURIComponent(qrCodeDoc.value.url)}&text=${encodeURIComponent(shareText)}`, // &photo=${shareImage}`
)
// Генерация URL для WhatsApp // Генерация URL для WhatsApp
// const whatsappShareUrl = computed( // const whatsappShareUrl = computed(
// () => `https://api.whatsapp.com/send?text=${shareText}%0A${siteUrl}`, // () => `https://api.whatsapp.com/send?text=${shareText}%0A${siteUrl}`,
@@ -0,0 +1,103 @@
<template>
<div class="p-6">
<h1 class="text-2xl font-bold mb-4 text-center lg:text-left">Управление QR-кодом</h1>
<QueryRender :query="qrCodeQuery" #default="{ data: qrCodeDoc }">
<div class="bg-white p-6 rounded-lg shadow-md mb-6">
<div class="flex items-center justify-between mb-4">
<div class="flex items-center">
<QRCodePlacementIcon :placement="qrCodeDoc.placement" />
<h2 class="text-xl font-semibold">{{ qrCodeDoc.name }}</h2>
</div>
<div class="flex gap-2">
<Button
icon="pi pi-cog"
label="Настроить"
:to="`/manage/qr/${qrCodeDoc.uri}/settings`"
as="router-link"
severity="secondary"
size="small"
outlined
/>
<Button
icon="pi pi-qrcode"
label="QR-код и инструкции"
:to="`/manage/qr/${qrCodeDoc.uri}/ready`"
as="router-link"
severity="secondary"
size="small"
outlined
/>
</div>
</div>
<div class="mb-4 flex gap-2 items-baseline">
<strong>Ссылка: </strong>
<a :href="qrCodeDoc.url" class="text-blue-500" target="_blank">{{ qrCodeDoc.url }}</a>
<LinkCopyButton :url="qrCodeDoc.url" />
<LinkShareTelegramButton
:shareUrl="qrCodeDoc.url"
shareText="Используйте эту ссылку НаСвязи!"
/>
</div>
<div>
<p><strong>Создано:</strong> {{ formatDate(qrCodeDoc.created_at) }}</p>
<!-- <p><strong>Количество сканирований:</strong> {{ qrCodeDoc.scanCount }}</p>-->
<!-- <p><strong>Последнее сканирование:</strong> {{ formatDate(qrCodeDoc.lastScan) }}</p>-->
</div>
</div>
</QueryRender>
<!-- <div class="bg-white p-6 rounded-lg shadow-md mb-6">-->
<!-- <h2 class="text-xl font-bold mb-4">Чаты</h2>-->
<!-- <div v-if="chats.length > 0" class="grid grid-cols-1 gap-4">-->
<!-- <div v-for="chat in chats" :key="chat._id" class="p-4 rounded-lg bg-white shadow-md">-->
<!-- <div class="flex items-center justify-between">-->
<!-- <div>-->
<!-- <p class="text-lg font-semibold">Чат #{{ chat._id }}</p>-->
<!-- <p class="text-gray-500">-->
<!-- Последнее сообщение: {{ formatDate(chat.lastMessageDate) }}-->
<!-- </p>-->
<!-- </div>-->
<!-- <Button-->
<!-- label="Открыть"-->
<!-- :to="`/manage/qr/${qrCodeDoc.uri}/chat/${chat._id}`"-->
<!-- as="router-link"-->
<!-- class="p-button-outlined p-button-sm"-->
<!-- />-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- <div v-else class="text-center text-gray-500">-->
<!-- <p>Нет активных чатов для этого QR-кода.</p>-->
<!-- </div>-->
<!-- </div>-->
</div>
</template>
<script setup lang="ts">
import { computed } from 'vue'
import type { QRCodeDocument } from '@hereconnect/types'
import { getQrCodeDocument } from '@/api/qrCode'
import CopyLinkButton from '@/components/CopyLinkButton.vue'
const props = defineProps<{ qr_code_uri: QRCodeDocument['uri'] }>()
const qrCodeUri = computed(() => props.qr_code_uri)
const qrCodeQuery = useQuery({
queryKey: ['qrCode', qrCodeUri],
queryFn: () => getQrCodeDocument(qrCodeUri.value),
})
// const { data: chatsData } = useQuery({
// queryKey: ['chats', qrCodeUri],
// queryFn: () => messagesDbRemote.find({ selector: { qr_code_uri: qrCodeUri } }),
// })
// const chats = computed(() => chatsData.value?.docs || [])
const formatDate = (date: string) => {
if (!date) return '—'
const options: Intl.DateTimeFormatOptions = { year: 'numeric', month: 'long', day: 'numeric' }
return new Date(date).toLocaleDateString(['ru-RU'], options)
}
</script>
+13 -1
View File
@@ -113,7 +113,19 @@ export default defineConfig(({ mode }) => {
Info(), Info(),
AutoImport({ AutoImport({
imports: ['vue', 'vue-router', unheadComposablesImports[0]], imports: [
'vue',
'vue-router',
unheadComposablesImports[0],
{
from: '@tanstack/vue-query',
imports: ['useQuery', 'useMutation'],
},
// {
// from: '@hereconnect/types',
// type: true,
// },
],
}), }),
Components({ Components({
+11 -137
View File
@@ -70,9 +70,6 @@ importers:
vue: vue:
specifier: ^3.5.12 specifier: ^3.5.12
version: 3.5.13(typescript@5.6.3) version: 3.5.13(typescript@5.6.3)
vue-query:
specifier: ^1.26.0
version: 1.26.0(react@18.3.1)(vue@3.5.13)
vue-router: vue-router:
specifier: ^4.4.5 specifier: ^4.4.5
version: 4.5.0(vue@3.5.13) version: 4.5.0(vue@3.5.13)
@@ -685,13 +682,6 @@ packages:
- supports-color - supports-color
dev: true dev: true
/@babel/runtime@7.26.0:
resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==}
engines: {node: '>=6.9.0'}
dependencies:
regenerator-runtime: 0.14.1
dev: false
/@babel/template@7.25.9: /@babel/template@7.25.9:
resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==}
engines: {node: '>=6.9.0'} engines: {node: '>=6.9.0'}
@@ -2637,11 +2627,6 @@ packages:
/balanced-match@1.0.2: /balanced-match@1.0.2:
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
/big-integer@1.6.52:
resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==}
engines: {node: '>=0.6'}
dev: false
/binary-extensions@2.3.0: /binary-extensions@2.3.0:
resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
engines: {node: '>=8'} engines: {node: '>=8'}
@@ -2662,6 +2647,7 @@ packages:
dependencies: dependencies:
balanced-match: 1.0.2 balanced-match: 1.0.2
concat-map: 0.0.1 concat-map: 0.0.1
dev: true
/brace-expansion@2.0.1: /brace-expansion@2.0.1:
resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
@@ -2674,19 +2660,6 @@ packages:
dependencies: dependencies:
fill-range: 7.1.1 fill-range: 7.1.1
/broadcast-channel@3.7.0:
resolution: {integrity: sha512-cIAKJXAxGJceNZGTZSBzMxzyOn72cVgPnKx4dc6LRjQgbaJUQqhy5rzL3zbMxkMWsGKkv2hSFkPRMEXfoMZ2Mg==}
dependencies:
'@babel/runtime': 7.26.0
detect-node: 2.1.0
js-sha3: 0.8.0
microseconds: 0.2.0
nano-time: 1.0.0
oblivious-set: 1.0.0
rimraf: 3.0.2
unload: 2.2.0
dev: false
/browserslist@4.24.2: /browserslist@4.24.2:
resolution: {integrity: sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==} resolution: {integrity: sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==}
engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
@@ -2887,6 +2860,7 @@ packages:
/concat-map@0.0.1: /concat-map@0.0.1:
resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
dev: true
/confbox@0.1.8: /confbox@0.1.8:
resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==}
@@ -3087,10 +3061,6 @@ packages:
engines: {node: '>=8'} engines: {node: '>=8'}
dev: true dev: true
/detect-node@2.1.0:
resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==}
dev: false
/didyoumean@1.2.2: /didyoumean@1.2.2:
resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==}
@@ -3769,6 +3739,7 @@ packages:
/fs.realpath@1.0.0: /fs.realpath@1.0.0:
resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
dev: true
/fsevents@2.3.2: /fsevents@2.3.2:
resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
@@ -3866,6 +3837,7 @@ packages:
minimatch: 3.1.2 minimatch: 3.1.2
once: 1.4.0 once: 1.4.0
path-is-absolute: 1.0.1 path-is-absolute: 1.0.1
dev: true
/globals@11.12.0: /globals@11.12.0:
resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==}
@@ -4015,6 +3987,7 @@ packages:
dependencies: dependencies:
once: 1.4.0 once: 1.4.0
wrappy: 1.0.2 wrappy: 1.0.2
dev: true
/inherits@2.0.4: /inherits@2.0.4:
resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
@@ -4643,12 +4616,9 @@ packages:
engines: {node: '>=14'} engines: {node: '>=14'}
dev: true dev: true
/js-sha3@0.8.0:
resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==}
dev: false
/js-tokens@4.0.0: /js-tokens@4.0.0:
resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
dev: true
/js-tokens@9.0.1: /js-tokens@9.0.1:
resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==}
@@ -4851,13 +4821,6 @@ packages:
resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
dev: true dev: true
/loose-envify@1.4.0:
resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
hasBin: true
dependencies:
js-tokens: 4.0.0
dev: false
/loupe@2.3.7: /loupe@2.3.7:
resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==}
dependencies: dependencies:
@@ -4911,13 +4874,6 @@ packages:
uc.micro: 2.1.0 uc.micro: 2.1.0
dev: false dev: false
/match-sorter@6.3.4:
resolution: {integrity: sha512-jfZW7cWS5y/1xswZo8VBOdudUiSd9nifYRWphc9M5D/ee4w4AoXLgBEdRbgVaxbMuagBPeUC5y2Hi8DO6o9aDg==}
dependencies:
'@babel/runtime': 7.26.0
remove-accents: 0.5.0
dev: false
/md5@2.3.0: /md5@2.3.0:
resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==} resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==}
dependencies: dependencies:
@@ -4958,10 +4914,6 @@ packages:
braces: 3.0.3 braces: 3.0.3
picomatch: 2.3.1 picomatch: 2.3.1
/microseconds@0.2.0:
resolution: {integrity: sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA==}
dev: false
/migrate@2.1.0: /migrate@2.1.0:
resolution: {integrity: sha512-xSwTScy7ozxQtzDtO/LpmZzWTmItXBC3k3wOQGf8TjHpudQUS/m7uyboBHHsv2nFmioyyC7gtbcI7IPj89aJLA==} resolution: {integrity: sha512-xSwTScy7ozxQtzDtO/LpmZzWTmItXBC3k3wOQGf8TjHpudQUS/m7uyboBHHsv2nFmioyyC7gtbcI7IPj89aJLA==}
engines: {node: '>= 14.0.0'} engines: {node: '>= 14.0.0'}
@@ -5002,6 +4954,7 @@ packages:
resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
dependencies: dependencies:
brace-expansion: 1.1.11 brace-expansion: 1.1.11
dev: true
/minimatch@5.1.6: /minimatch@5.1.6:
resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==}
@@ -5069,12 +5022,6 @@ packages:
object-assign: 4.1.1 object-assign: 4.1.1
thenify-all: 1.6.0 thenify-all: 1.6.0
/nano-time@1.0.0:
resolution: {integrity: sha512-flnngywOoQ0lLQOTRNexn2gGSNuM9bKj9RZAWSzhQ+UJYaAFG9bac4DW9VHjUAzrOaIcajHybCTHe/bkvozQqA==}
dependencies:
big-integer: 1.6.52
dev: false
/nanoid@3.3.8: /nanoid@3.3.8:
resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==}
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
@@ -5179,14 +5126,11 @@ packages:
resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==}
engines: {node: '>= 6'} engines: {node: '>= 6'}
/oblivious-set@1.0.0:
resolution: {integrity: sha512-z+pI07qxo4c2CulUHCDf9lcqDlMSo72N/4rLUpRXf6fu+q8vjt8y0xS+Tlf8NTJDdTXHbdeO1n3MlbctwEoXZw==}
dev: false
/once@1.4.0: /once@1.4.0:
resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
dependencies: dependencies:
wrappy: 1.0.2 wrappy: 1.0.2
dev: true
/onetime@5.1.2: /onetime@5.1.2:
resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
@@ -5312,6 +5256,7 @@ packages:
/path-is-absolute@1.0.1: /path-is-absolute@1.0.1:
resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
dev: true
/path-key@3.1.1: /path-key@3.1.1:
resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
@@ -5734,31 +5679,6 @@ packages:
resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==}
dev: true dev: true
/react-query@3.39.3(react@18.3.1):
resolution: {integrity: sha512-nLfLz7GiohKTJDuT4us4X3h/8unOh+00MLb2yJoGTPjxKs2bc1iDhkNx2bd5MKklXnOD3NrVZ+J2UXujA5In4g==}
peerDependencies:
react: ^16.8.0 || ^17.0.0 || ^18.0.0
react-dom: '*'
react-native: '*'
peerDependenciesMeta:
react-dom:
optional: true
react-native:
optional: true
dependencies:
'@babel/runtime': 7.26.0
broadcast-channel: 3.7.0
match-sorter: 6.3.4
react: 18.3.1
dev: false
/react@18.3.1:
resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==}
engines: {node: '>=0.10.0'}
dependencies:
loose-envify: 1.4.0
dev: false
/read-cache@1.0.0: /read-cache@1.0.0:
resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==}
dependencies: dependencies:
@@ -5778,10 +5698,6 @@ packages:
dependencies: dependencies:
picomatch: 2.3.1 picomatch: 2.3.1
/regenerator-runtime@0.14.1:
resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==}
dev: false
/remove-accents@0.5.0: /remove-accents@0.5.0:
resolution: {integrity: sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==} resolution: {integrity: sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==}
dev: false dev: false
@@ -5844,6 +5760,7 @@ packages:
hasBin: true hasBin: true
dependencies: dependencies:
glob: 7.2.3 glob: 7.2.3
dev: true
/rollup-plugin-manifest-json@1.7.0: /rollup-plugin-manifest-json@1.7.0:
resolution: {integrity: sha512-CaghGuHVszAurNKkvtYhgzT/9yxo3oyBJdjF+0qTGsANetwLdIoI2UP1dEEkkh2Xfg9vr1xcfad1EjhB2aEwOQ==} resolution: {integrity: sha512-CaghGuHVszAurNKkvtYhgzT/9yxo3oyBJdjF+0qTGsANetwLdIoI2UP1dEEkkh2Xfg9vr1xcfad1EjhB2aEwOQ==}
@@ -6526,13 +6443,6 @@ packages:
engines: {node: '>= 10.0.0'} engines: {node: '>= 10.0.0'}
dev: true dev: true
/unload@2.2.0:
resolution: {integrity: sha512-B60uB5TNBLtN6/LsgAf3udH9saB5p7gqJwcFfbOEZ8BcBHnGwCf6G/TGiEqkRAxX7zAFIUtzdrXQSdL3Q/wqNA==}
dependencies:
'@babel/runtime': 7.26.0
detect-node: 2.1.0
dev: false
/unplugin-auto-import@0.18.6: /unplugin-auto-import@0.18.6:
resolution: {integrity: sha512-LMFzX5DtkTj/3wZuyG5bgKBoJ7WSgzqSGJ8ppDRdlvPh45mx6t6w3OcbExQi53n3xF5MYkNGPNR/HYOL95KL2A==} resolution: {integrity: sha512-LMFzX5DtkTj/3wZuyG5bgKBoJ7WSgzqSGJ8ppDRdlvPh45mx6t6w3OcbExQi53n3xF5MYkNGPNR/HYOL95KL2A==}
engines: {node: '>=14'} engines: {node: '>=14'}
@@ -6966,20 +6876,6 @@ packages:
resolution: {integrity: sha512-lfgdSLQKrUmADiSV6PbBvYgQ33KF3Ztv6gP85MfGaGaSGMTXORVaHT1EHfsqCgzRNBstPKYDmvAV9Do5CmJ07A==} resolution: {integrity: sha512-lfgdSLQKrUmADiSV6PbBvYgQ33KF3Ztv6gP85MfGaGaSGMTXORVaHT1EHfsqCgzRNBstPKYDmvAV9Do5CmJ07A==}
dev: true dev: true
/vue-demi@0.10.1(vue@3.5.13):
resolution: {integrity: sha512-L6Oi+BvmMv6YXvqv5rJNCFHEKSVu7llpWWJczqmAQYOdmPPw5PNYoz1KKS//Fxhi+4QP64dsPjtmvnYGo1jemA==}
hasBin: true
requiresBuild: true
peerDependencies:
'@vue/composition-api': ^1.0.0-rc.1
vue: ^2.6.0 || >=3.0.0
peerDependenciesMeta:
'@vue/composition-api':
optional: true
dependencies:
vue: 3.5.13(typescript@5.6.3)
dev: false
/vue-demi@0.14.10(vue@3.5.13): /vue-demi@0.14.10(vue@3.5.13):
resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==}
engines: {node: '>=12'} engines: {node: '>=12'}
@@ -7013,29 +6909,6 @@ packages:
- supports-color - supports-color
dev: true dev: true
/vue-query@1.26.0(react@18.3.1)(vue@3.5.13):
resolution: {integrity: sha512-78JbnLX/3tDll5kDr6PUasRWn05BeWm7yJNeUezA9INrn3AgTCLbsEctnlw6/wM6HiRqFj9F+mf+ruZusyiVOg==}
peerDependencies:
'@nuxtjs/composition-api': ^0.28.0
'@vue/composition-api': ^1.1.2
vue: ^2.0.0 || >=3.0.0
peerDependenciesMeta:
'@nuxtjs/composition-api':
optional: true
'@vue/composition-api':
optional: true
dependencies:
'@vue/devtools-api': 6.6.4
match-sorter: 6.3.4
react-query: 3.39.3(react@18.3.1)
vue: 3.5.13(typescript@5.6.3)
vue-demi: 0.10.1(vue@3.5.13)
transitivePeerDependencies:
- react
- react-dom
- react-native
dev: false
/vue-router@4.5.0(vue@3.5.13): /vue-router@4.5.0(vue@3.5.13):
resolution: {integrity: sha512-HDuk+PuH5monfNuY+ct49mNmkCRK4xJAV9Ts4z9UFc4rzdDnxQLyCMGGc8pKhZhHTVzfanpNwB/lwqevcBwI4w==} resolution: {integrity: sha512-HDuk+PuH5monfNuY+ct49mNmkCRK4xJAV9Ts4z9UFc4rzdDnxQLyCMGGc8pKhZhHTVzfanpNwB/lwqevcBwI4w==}
peerDependencies: peerDependencies:
@@ -7190,6 +7063,7 @@ packages:
/wrappy@1.0.2: /wrappy@1.0.2:
resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
dev: true
/write-file-atomic@4.0.2: /write-file-atomic@4.0.2:
resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==}