Files
hereconnect/src/components/create/CreatePredefinedMessagesSection.vue
T

97 lines
3.5 KiB
Vue
Raw Normal View History

2024-11-18 18:26:28 +02:00
<template>
<section>
<h2 class="text-xl font-semibold mb-4">Сообщения для отправки</h2>
<p class="text-gray-600 mb-4">
После считывания QRкода можно будет выбрать одно из этих сообщений или написать своё.
2024-11-18 18:26:28 +02:00
</p>
<p class="text-sm text-gray-500 mb-6">Вы сможете изменить эти сообщения позже.</p>
<!-- Список сообщений -->
<div class="flex flex-col gap-2 mb-4">
<div v-for="(message, index) in messages" :key="index" class="flex gap-2" ref="messagesRef">
<InputText v-model="messages[index]" class="flex-1" placeholder="Введите сообщение" />
<Button
icon="pi pi-trash"
class="p-button-danger p-button-text"
@click="removeMessage(index)"
title="Удалить сообщение"
/>
</div>
</div>
<!-- Кнопка добавления сообщения -->
<Button
label="Добавить сообщение"
icon="pi pi-plus"
class="p-button-sm p-button-outlined mb-4"
@click="addMessage"
/>
</section>
</template>
<script setup lang="ts">
import { watch, nextTick, useTemplateRef } from 'vue'
import { type QRCodeDocument } from '@/types/DBDocumentTypes'
// Пропсы
const props = defineProps<{ placement: QRCodeDocument['placement'] }>()
const messagesRef = useTemplateRef<HTMLDivElement[]>('messagesRef')
// Предустановленные сообщения по типу размещения
const defaultMessages = {
car: [
'Ваш автомобиль мешает',
'Выключите свет',
'Спустило колесо',
'Подойдите к вашей машине',
'Эвакуатор',
],
pet: ['Нашёлся ваш питомец'],
door: ['Я рядом с дверью'],
store: ['Подойдите к кассе', 'Вопрос по товару', 'Помощь с покупкой'],
restaurant_table: [
'Позовите официанта',
'Принести меню',
'Принести счёт',
'Пожаловаться на обслуживание',
],
other: [],
}
// Локальное хранилище сообщений
2024-11-19 15:50:15 +02:00
const messages = defineModel<Exclude<QRCodeDocument['predefinedMessages'], undefined>>({
2024-11-18 18:26:28 +02:00
required: true,
})
// Следим за типом размещения и устанавливаем предустановленные сообщения при его смене
watch(
() => props.placement,
(newPlacement, previousPlacement) => {
2024-11-19 15:50:15 +02:00
let prevDefaultMessages: QRCodeDocument['predefinedMessages'] = []
2024-11-18 18:26:28 +02:00
if (previousPlacement && previousPlacement in defaultMessages) {
prevDefaultMessages = defaultMessages[previousPlacement]
}
2024-11-19 15:50:15 +02:00
const isMessagesDefault =
messages.value.length === 0 ||
JSON.stringify(messages.value) === JSON.stringify(prevDefaultMessages)
2024-11-18 18:26:28 +02:00
if (isMessagesDefault) {
messages.value = [...(defaultMessages[newPlacement] || [])]
}
},
{ immediate: true },
)
// Функции для управления сообщениями
function addMessage() {
messages.value.push('')
nextTick(() => {
const lastMessageRef = messagesRef.value![messagesRef.value!.length - 1]
lastMessageRef?.querySelector('input')?.focus() // Фокусируемся на последнем поле
})
}
function removeMessage(index: number) {
messages.value.splice(index, 1)
}
</script>