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:
@@ -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,
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user