Files
hereconnect/src/views/CreateView.vue
T

109 lines
3.8 KiB
Vue
Raw Normal View History

2024-11-11 16:06:09 +02:00
<template>
2024-11-19 18:49:12 +02:00
<div class="max-w-prose mx-auto py-6 px-4 md:px-6">
<section class="content">
2024-11-19 18:49:12 +02:00
<div class="max-w-prose mx-auto py-8">
<!-- Секция выбора размещения -->
2024-11-19 15:33:56 +02:00
<CreateSection :isActive="activeSteps.includes('placement')">
<CreatePlacementSection v-model="placement" />
</CreateSection>
2024-11-18 18:26:28 +02:00
<!-- Секция выбора доступных действий -->
<CreateSection :isActive="activeSteps.includes('actions')">
2024-11-19 15:33:56 +02:00
<CreateActionsSection v-model="selectedActions" />
</CreateSection>
2024-11-18 18:26:28 +02:00
<!-- Секция выбора способа доставки -->
2024-11-19 15:33:56 +02:00
<CreateSection v-if="activeSteps.includes('delivery')" :isActive="true">
<CreateMessageDeliveryMethodSection v-model="messageDeliveryMethod" />
</CreateSection>
2024-11-18 18:26:28 +02:00
<!-- Секция сообщений для отправки -->
<CreateSection
2024-11-19 15:33:56 +02:00
v-if="activeSteps.includes('messages')"
:isActive="messageDeliveryMethod !== 'telegram'"
>
2024-11-19 15:50:15 +02:00
<CreatePredefinedMessagesSection :placement="placement" v-model="messages" />
</CreateSection>
2024-11-18 18:26:28 +02:00
<!-- Секция итогового резюме -->
<CreateSection :isActive="activeSteps.includes('summary')">
<CreateSummarySection
2024-11-19 15:50:15 +02:00
v-model:name="name"
buttonLabel="Создать QR‑код"
@nextStep="createQrCode"
/>
</CreateSection>
2024-11-18 18:26:28 +02:00
2024-11-19 15:50:15 +02:00
<p v-if="error" class="text-red-500 mt-4">Ошибка создания QRкода: {{ error }}</p>
<div class="h-[30dvh] md:h-[10dvh] overflow-hidden"></div>
</div>
</section>
2024-11-11 16:06:09 +02:00
</div>
</template>
2024-11-14 16:43:46 +02:00
2024-11-14 16:48:32 +02:00
<script setup lang="ts">
2024-11-19 15:33:56 +02:00
import { computed, ref } from 'vue'
2024-11-19 15:50:15 +02:00
import { useRouter } from 'vue-router'
import { createQrCodeDocument } from '@/api/qrCode'
import type { QRCodeDocument } from '@/types/DBDocumentTypes'
2024-11-14 16:43:46 +02:00
2024-11-19 15:33:56 +02:00
// Состояния шагов
2024-11-19 15:50:15 +02:00
const placement = ref<null | QRCodeDocument['placement']>(null)
const selectedActions = ref<QRCodeDocument['actions']>([])
const messageDeliveryMethod = ref<null | QRCodeDocument['messageDeliveryMethod']>(null)
const messages = ref<Exclude<QRCodeDocument['predefinedMessages'], undefined>>([])
const name = ref<QRCodeDocument['name']>('')
const error = ref<string | null>(null)
const router = useRouter()
// Логика создания QR-кода
async function createQrCode() {
try {
const qrCodeDocument = await createQrCodeDocument({
name: name.value,
placement: placement.value!,
actions: selectedActions.value,
messageDeliveryMethod: messageDeliveryMethod.value!,
predefinedMessages: messages.value.length > 0 ? messages.value : undefined,
})
error.value = null
await router.push({ name: 'ManageQRCodeReady', params: { qr_code_uri: qrCodeDocument.uri } })
} catch (err) {
error.value = (err as Error).message || 'Неизвестная ошибка'
}
}
2024-11-14 16:43:46 +02:00
2024-11-19 15:33:56 +02:00
// Функция для определения доступных шагов
const activeSteps = computed(() => {
const steps = ['placement', 'actions', 'delivery', 'messages', 'summary'] as const
const isStepValid = {
placement: !!placement.value,
actions: !!placement.value,
delivery:
!!placement.value &&
selectedActions.value.length > 0 &&
selectedActions.value.includes('sendMessage'),
messages:
!!messageDeliveryMethod.value && messageDeliveryMethod.value === 'webPushSubscription',
summary:
!!placement.value &&
selectedActions.value.length > 0 &&
(messageDeliveryMethod.value === 'webPushSubscription' ||
selectedActions.value.includes('viewContactInfo')),
}
const active = []
for (const step of steps) {
if (active.length === 0 || isStepValid[step]) {
active.push(step)
} else {
break
2024-11-18 18:26:28 +02:00
}
2024-11-19 15:33:56 +02:00
}
return active
})
2024-11-14 16:43:46 +02:00
</script>