modified: main_dc/yalarba/easySite/.env

modified:   main_dc/yalarba/easySite/easySite/app/components/layout/Careers.vue
	new file:   main_dc/yalarba/easySite/easySite/app/components/layout/default.vue
	new file:   main_dc/yalarba/easySite/easySite/app/composables/useTelegram.ts
	modified:   main_dc/yalarba/easySite/easySite/nuxt.config.ts
send mesage with ui from vocations page easysite
This commit is contained in:
2025-11-01 06:06:47 +05:00
parent fbfcb869ed
commit dcec3c3d32
5 changed files with 160 additions and 20 deletions
+2
View File
@@ -0,0 +1,2 @@
NUXT_PUBLIC_TELEGRAM_BOT_TOKEN=8470085635:AAEPZcsN3n-3FkMdr7DzxbiQ3q8mXZTGwug
NUXT_PUBLIC_TELEGRAM_CHAT_ID=559861569
@@ -437,7 +437,7 @@
<h3>Присоединиться к команде</h3> <h3>Присоединиться к команде</h3>
<form @submit.prevent="submitForm" class="contact-form"> <form class="contact-form" @submit.prevent="submitForm">
<div class="form-group"> <div class="form-group">
<label for="name">Имя *</label> <label for="name">Имя *</label>
<input id="name" v-model="form.name" type="text" required placeholder="Как к вам обращаться?"> <input id="name" v-model="form.name" type="text" required placeholder="Как к вам обращаться?">
@@ -472,11 +472,8 @@
<div class="form-group"> <div class="form-group">
<label for="message">Расскажите о себе *</label> <label for="message">Расскажите о себе *</label>
<textarea <textarea id="message" v-model="form.message" required rows="5"
id="message" placeholder="Ваш опыт, почему хотите присоединиться, что вас вдохновляет..." />
v-model="form.message"
required rows="5"
placeholder="Ваш опыт, почему хотите присоединиться, что вас вдохновляет..."/>
</div> </div>
<div class="form-group"> <div class="form-group">
@@ -509,7 +506,7 @@
<script setup> <script setup>
const showContactForm = ref(false) const showContactForm = ref(false)
const loading = ref(false) const loading = ref(false)
const toast = useToast()
const form = ref({ const form = ref({
name: '', name: '',
email: '', email: '',
@@ -518,25 +515,100 @@ const form = ref({
portfolio: '' portfolio: ''
}) })
// Функция для форматирования сообщения в Telegram
const formatTelegramMessage = (formData) => {
const roleLabels = {
'frontend': 'Frontend Developer',
'backend': 'Backend Developer',
'analytics': 'Data Analyst',
'designer': 'Product Designer',
'sales': 'Sales & Strategy',
'manager': 'Project Manager',
'seo': 'SEO Specialist',
'smm': 'SMM Specialist',
'copywriter': 'Копирайтер',
'seo-copy': 'SEO + Копирайтинг',
'smm-copy': 'SMM + Копирайтинг',
'smm-seo': 'SMM + SEO',
'digital-marketing': 'Digital Marketing (полный цикл)',
'other': 'Другое'
};
const roleName = roleLabels[formData.role] || formData.role;
return `🎯 <b>Новая заявка в команду!</b>
👤 <b>Имя:</b> ${formData.name}
📧 <b>Email:</b> ${formData.email}
💼 <b>Роль:</b> ${roleName}
📝 <b>Сообщение:</b>
${formData.message}
${formData.portfolio ? `🔗 <b>Портфолио:</b> ${formData.portfolio}` : '🔗 <b>Портфолио:</b> Не указано'}
⏰ <b>Время:</b> ${new Date().toLocaleString('ru-RU')}
🌐 <b>Источник:</b> Careers Page`;
}
const submitForm = async () => { const submitForm = async () => {
loading.value = true loading.value = true
try { try {
// Здесь будет отправка формы на бэкенд // Форматируем сообщение для Telegram
await $fetch('/api/careers/apply', { const telegramMessage = formatTelegramMessage(form.value);
method: 'POST',
body: form.value // Отправляем в Telegram
}) const { success, error } = await sendMessageToTelegram(telegramMessage);
// Успешная отправка if (success) {
showContactForm.value = false // Успешная отправка - показываем красивое уведомление
form.value = { name: '', email: '', role: '', message: '', portfolio: '' } toast.add({
title: 'Заявка отправлена! 🎉',
description: 'Свяжемся с вами в ближайшее время',
icon: 'i-heroicons-check-badge',
color: 'green',
timeout: 5000
});
// Показать уведомление об успехе // Закрываем модальное окно
alert('Заявка отправлена! Свяжемся с вами в ближайшее время.') showContactForm.value = false
// Сбрасываем форму
form.value = {
name: '',
email: '',
role: '',
message: '',
portfolio: ''
}
} else {
throw new Error(error || 'Ошибка отправки в Telegram');
}
} catch (error) { } catch (error) {
console.error('Ошибка отправки формы:', error) console.error('Ошибка отправки формы:', error)
alert('Произошла ошибка. Попробуйте еще раз или напишите напрямую.')
// Показываем уведомление об ошибке
if (error.message.includes('Telegram') || error.message.includes('сети')) {
toast.add({
title: 'Ошибка отправки 🌐',
description: 'Проблемы с соединением. Напишите нам напрямую в Telegram или на email',
icon: 'i-heroicons-exclamation-triangle',
color: 'red',
timeout: 7000
});
} else {
toast.add({
title: 'Ошибка ❌',
description: 'Не удалось отправить заявку. Попробуйте еще раз',
icon: 'i-heroicons-exclamation-triangle',
color: 'red',
timeout: 5000
});
}
} finally { } finally {
loading.value = false loading.value = false
} }
@@ -0,0 +1,7 @@
<!-- layouts/default.vue -->
<template>
<div>
<Notifications position="top-right" />
<slot />
</div>
</template>
@@ -0,0 +1,57 @@
// composables/useTelegram.ts
export const useTelegram = () => {
const config = useRuntimeConfig();
const sendMessageToTelegram = async (message: string): Promise<{ success: boolean; error?: string }> => {
if (!message?.trim()) {
return { success: false, error: 'Сообщение не может быть пустым' };
}
try {
const BOT_TOKEN = config.public.telegramBotToken || "8470085635:AAEPZcsN3n-3FkMdr7DzxbiQ3q8mXZTGwug";
const CHAT_ID = config.public.telegramChatId || "559861569";
const formData = new FormData();
formData.append('chat_id', CHAT_ID);
formData.append('text', `📥 Новое сообщение с сайта ValitovGaziz:\n\n${message}`);
formData.append('parse_mode', 'HTML');
const response = await fetch(`https://api.telegram.org/bot${BOT_TOKEN}/sendMessage`, {
method: 'POST',
body: formData
});
const data = await response.json();
if (data.ok) {
return { success: true };
} else {
console.error('Telegram API Error:', data);
return { success: false, error: data.description || 'Неизвестная ошибка Telegram API' };
}
} catch (error) {
console.error("Ошибка сети:", error);
return { success: false, error: 'Произошла ошибка сети. Попробуйте позже.' };
}
};
const sendMessageWithPrompt = async (): Promise<void> => {
const message = prompt("Опишите, пожалуйста, ваше предложение или вопрос. Я свяжусь с вами в ближайшее время:");
if (message?.trim()) {
const { success, error } = await sendMessageToTelegram(message);
if (success) {
alert("Сообщение успешно отправлено! Я свяжусь с вами в ближайшее время.");
} else {
alert("Ошибка: " + error);
}
}
};
return {
sendMessageToTelegram,
sendMessageWithPrompt
};
};
@@ -16,7 +16,7 @@ export default defineNuxtConfig({
modules: [ modules: [
'@nuxt/image', '@nuxt/image',
'@nuxt/ui', '@nuxt/ui',
'@nuxt/eslint' '@nuxt/eslint',
], ],
css: [ css: [
@@ -32,7 +32,9 @@ export default defineNuxtConfig({
// Настройки для работы за прокси // Настройки для работы за прокси
runtimeConfig: { runtimeConfig: {
public: { public: {
baseURL: process.env.BASE_URL || 'http://localhost:3000' baseURL: process.env.BASE_URL || 'http://localhost:3000',
telegramBotToken: process.env.NUXT_PUBLIC_TELEGRAM_BOT_TOKEN,
telegramChatId: process.env.NUXT_PUBLIC_TELEGRAM_CHAT_ID,
} }
}, },