diff --git a/.env b/.env index fa58f24..1aa5877 100644 --- a/.env +++ b/.env @@ -1,3 +1,9 @@ VITE_SUPABASE_PROJECT_ID="pwltkduuvidvnoiyijpo" VITE_SUPABASE_PUBLISHABLE_KEY="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6InB3bHRrZHV1dmlkdm5vaXlpanBvIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NjU5ODE3NzksImV4cCI6MjA4MTU1Nzc3OX0.OQGDu1ATF6zAjBanKyMJ5PthEFURxamVgUXFvuYg3lE" VITE_SUPABASE_URL="https://pwltkduuvidvnoiyijpo.supabase.co" +VITE_SUPABASE_ANON_KEY="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6InB3bHRrZHV1dmlkdm5vaXlpanBvIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NjU5ODE3NzksImV4cCI6MjA4MTU1Nzc3OX0.OQGDu1ATF6zAjBanKyMJ5PthEFURxamVgUXFvuYg3lE" + +# ==================== RESEND EMAIL SERVICE ==================== +# Ersetzen Sie 're_xxxxxxxxxxxx' mit Ihrem echten Resend API Key +# API Key von https://resend.com -> API Keys -> Create API Key +VITE_RESEND_API_KEY="re_xxxxxxxxxxxx" diff --git a/deploy-function.sh b/deploy-function.sh new file mode 100644 index 0000000..8048a37 --- /dev/null +++ b/deploy-function.sh @@ -0,0 +1,25 @@ +#!/bin/bash + +# Supabase Function Deployment Script +echo "Supabase Edge Function Deployment" +echo "==================================" + +# Check if supabase CLI is available +if ! command -v supabase &> /dev/null; then + echo "❌ Supabase CLI nicht gefunden. Bitte installieren Sie zuerst:" + echo " npm install -g supabase" + echo " Oder: https://github.com/supabase/cli/releases" + exit 1 +fi + +# Login to Supabase +echo "🔐 Login zu Supabase..." +supabase login + +# Deploy the function +echo "📤 Deploye send-contact-email Funktion..." +supabase functions deploy send-contact-email + +echo "✅ Funktion deployed!" +echo "" +echo "📧 Testen Sie das Kontaktformular auf der Website." diff --git a/public/locales/de/contact.json b/public/locales/de/contact.json index 8795960..12064aa 100644 --- a/public/locales/de/contact.json +++ b/public/locales/de/contact.json @@ -147,9 +147,23 @@ "name": "Name", "email": "E-Mail", "phone": "Telefon", + "subject": "Betreff", "message": "Nachricht", "send": "Nachricht senden", - "success": "Nachricht erfolgreich gesendet!" + "sending": "Wird gesendet...", + "clear": "Leeren", + "success": "Ihre Nachricht wurde erfolgreich gesendet! Wir melden uns bald bei Ihnen.", + "error": "Es ist ein Fehler aufgetreten. Bitte versuchen Sie es später erneut oder rufen Sie uns direkt an.", + "formTitle": "Kontaktformular", + "formDescription": "Senden Sie uns eine Nachricht und wir melden uns so schnell wie möglich bei Ihnen zurück.", + "namePlaceholder": "Ihr Name", + "emailPlaceholder": "ihre@email.de", + "phonePlaceholder": "0123 456789", + "subjectPlaceholder": "Ihr Anliegen", + "messagePlaceholder": "Ihre Nachricht an uns...", + "required": "*", + "qrClickHint": "Klicken Sie zum Vergrößern", + "whatsapp": "WhatsApp" }, "about": { "title": "Über mich", diff --git a/public/locales/pl/contact.json b/public/locales/pl/contact.json index b378d4e..2ebbc60 100644 --- a/public/locales/pl/contact.json +++ b/public/locales/pl/contact.json @@ -104,6 +104,29 @@ "contactForm": { "title": "Szybkie zapytanie" }, + "contact": { + "title": "Skontaktuj się z nami", + "name": "Imię", + "email": "E-mail", + "phone": "Telefon", + "subject": "Temat", + "message": "Wiadomość", + "send": "Wyślij wiadomość", + "sending": "Wysyłanie...", + "clear": "Wyczyść", + "success": "Wiadomość została wysłana pomyślnie! Skontaktujemy się z Tobą wkrótce.", + "error": "Wystąpił błąd. Spróbuj ponownie później lub zadzwoń do nas bezpośrednio.", + "formTitle": "Formularz kontaktowy", + "formDescription": "Wyślij nam wiadomość, a my skontaktujemy się z Tobą tak szybko jak to możliwe.", + "namePlaceholder": "Twoje imię", + "emailPlaceholder": "twoj@email.pl", + "phonePlaceholder": "0123 456789", + "subjectPlaceholder": "Twoja sprawa", + "messagePlaceholder": "Twoja wiadomość do nas...", + "required": "*", + "qrClickHint": "Kliknij aby powiększyć", + "whatsapp": "WhatsApp" + }, "contactInfo": { "title": "Kontakt", "mobile": "Komórka" diff --git a/src/components/Layout.tsx b/src/components/Layout.tsx index b2982c5..6a0a651 100644 --- a/src/components/Layout.tsx +++ b/src/components/Layout.tsx @@ -116,7 +116,7 @@ const Layout = ({ children }: LayoutProps) => { )} - + + + +
+
+ FoFo Presentation +
+
+
+ + SCHLOSS Hotel Fleesensee +
+

FoFo-Präsentation

+

13. Januar 2026 • 1 Tag

+

+ Professionelle FoFo-Präsentationen (Follow-up/Follow-on) mit neuesten Markteinblicken und Strategien +

+
+
+ + Max. 50 Teilnehmer +
+
+ + 14:00 - 18:00 Uhr +
+
+ +
+
+ +
+
+ Networking Event +
+
+
+ + SCHLOSS Hotel Fleesensee +
+

Networking-Event

+

15. Januar 2026 • 1 Abend

+

+ Exklusives Networking-Event mit Partnern und Kunden im eleganten Ambiente des SCHLOSS Hotels Fleesensee +

+
+
+ + Max. 80 Teilnehmer +
+
+ + 18:00 - 22:00 Uhr +
+
+ +
+
+ + +
+

Warum SCHLOSS Hotel Fleesensee?

+
+
+

+ Das elegante SCHLOSS Hotel Fleesensee bietet die perfekte Kulisse für unsere Apella Jahresauftaktkongresse: +

+
    +
  • + + Exklusive Location am Fleesensee +
  • +
  • + + Professionelle FoFo-Präsentationen +
  • +
  • + + High-Level Networking +
  • +
+
+
+
+
+ + Nächster Termin +
+

+ 12. - 17. Januar 2026
+ Apella Jahresauftaktkongress 2026
+ Noch 45 Plätze frei +

+
+
+
+
+ + +
diff --git a/src/pages/Autoversicherung.tsx b/src/pages/Autoversicherung.tsx index c3cf614..f1d1f1b 100644 --- a/src/pages/Autoversicherung.tsx +++ b/src/pages/Autoversicherung.tsx @@ -121,7 +121,7 @@ const Autoversicherung = () => { id="tab-section" >
- + {
-
- - Übersicht - Beteiligungs-Arten - Chancen & Risiken - Details & Konditionen - Rendite-Rechner - Anfrageformular - Kundenbroschüre (PDF) - +
+ + + + Übersicht + + + + Arten + + + + Chancen + + + + Risiken + + + + Details + + + + Rechner + + + + Anfrage + + + + PDF + +
diff --git a/src/pages/BruttoNettoRechner.tsx b/src/pages/BruttoNettoRechner.tsx index 90e2c3f..be3a5a6 100644 --- a/src/pages/BruttoNettoRechner.tsx +++ b/src/pages/BruttoNettoRechner.tsx @@ -5,7 +5,7 @@ import Layout from '@/components/Layout'; import { Button } from '@/components/ui/button'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; -import { Shield, Heart, Star, CheckCircle, Phone, Mail, FileText, Calculator, Download, TrendingUp, DollarSign, Building, Target, PiggyBank, Percent, BarChart3, Receipt, Calculator as CalculatorIcon } from 'lucide-react'; +import { Shield, Heart, Star, CheckCircle, Phone, Mail, FileText, Calculator, Download, TrendingUp, DollarSign, Building, Target, PiggyBank, Percent, BarChart3, Receipt, Calculator as CalculatorIcon, Home, AlertCircle } from 'lucide-react'; import HeroSlider from '@/components/HeroSlider'; import GeneralNotice from '@/components/GeneralNotice'; import TwoColumnTab from '@/components/tab-pages/TwoColumnTab'; @@ -41,15 +41,58 @@ const BruttoNettoRechner = () => {
-
- - Übersicht - Gehaltsrechner - Steuern optimieren - Details & Abzüge - Beratungsanfrage - Kundenbroschüre (PDF) - +
+ + + + Übersicht + + + + Rechner + + + + Steuern + + + + Tipps + + + + Details + + + + Anfrage + + + + PDF + +
diff --git a/src/pages/Contact.tsx b/src/pages/Contact.tsx index 7e2a0a7..c26a0a6 100644 --- a/src/pages/Contact.tsx +++ b/src/pages/Contact.tsx @@ -4,9 +4,10 @@ import TenReasons from '@/components/TenReasons'; import GeneralNotice from '@/components/GeneralNotice'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; import { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from '@/components/ui/accordion'; -import { Mail, Phone, MapPin, Globe, TrendingUp, LineChart, CloudSun, Newspaper, ExternalLink } from 'lucide-react'; +import { Mail, Phone, MapPin, Globe, TrendingUp, LineChart, CloudSun, Newspaper, ExternalLink, Star, FileText, Shield, Lock, HelpCircle, Send, User, MessageSquare, MessageCircle } from 'lucide-react'; import { Button } from '@/components/ui/button'; import { useTranslation } from 'react-i18next'; +import { sendEmail } from '@/services/emailService'; export default function ContactPage() { const baseUrl = import.meta.env.BASE_URL; @@ -14,6 +15,51 @@ export default function ContactPage() { const { t } = useTranslation('contact'); const [yearsOfExperience, setYearsOfExperience] = useState(0); const [activeTab, setActiveTab] = useState('contact'); + const [formData, setFormData] = useState({ + name: '', + email: '', + phone: '', + subject: '', + message: '' + }); + const [isSubmitting, setIsSubmitting] = useState(false); + const [submitStatus, setSubmitStatus] = useState<'idle' | 'success' | 'error'>('idle'); + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + setIsSubmitting(true); + setSubmitStatus('idle'); + + try { + // Sende E-Mail direkt über Resend API + const result = await sendEmail({ + name: formData.name, + email: formData.email, + phone: formData.phone || 'Keine Angabe', + subject: formData.subject, + message: formData.message, + to: 'info@finanzen-mizera.de' + }); + + if (result.success) { + setSubmitStatus('success'); + + // Formular nach kurzer Zeit zurücksetzen + setTimeout(() => { + setFormData({ name: '', email: '', phone: '', subject: '', message: '' }); + setSubmitStatus('idle'); + }, 2000); + } else { + setSubmitStatus('error'); + } + + } catch (error) { + console.error('Fehler beim Senden:', error); + setSubmitStatus('error'); + } finally { + setIsSubmitting(false); + } + }; const [weather, setWeather] = useState<{ temp?: number; wind?: number; time?: string; isLoading: boolean }>({ isLoading: true, }); @@ -175,27 +221,94 @@ export default function ContactPage() { }} className="w-full" > -
- - {t('tabs.contact', 'Kontakt')} - {t('tabs.card', 'Karte')} - {t('tabs.reasons', 'Gründe')} - {t('tabs.service', 'Service')} - {t('tabs.impressum', 'Impressum')} - {t('tabs.leistungen', 'Leistungen')} - {t('tabs.datenschutz', 'Datenschutz')} - {t('tabs.links', 'Links')} - {t('tabs.news', 'News')} - {t('tabs.dailyInfo', 'Info')} - {t('tabs.faq', 'FAQ')} +
+ + + + {t('tabs.contact', 'Kontakt')} + + + + {t('tabs.card', 'Karte')} + + + + {t('tabs.reasons', 'Gründe')} + + + + {t('tabs.service', 'Service')} + + + + {t('tabs.impressum', 'Impressum')} + + + + {t('tabs.leistungen', 'Leistungen')} + + + + {t('tabs.datenschutz', 'Datenschutz')} + + + + {t('tabs.links', 'Links')} + + + + {t('tabs.news', 'News')} + + + + {t('tabs.dailyInfo', 'Info')} + + + + {t('tabs.faq', 'FAQ')} +
- -
-
+ +
+ {/* Linke Seite - Kontaktinformationen */} +
-
+
-
+
//
@@ -235,7 +348,7 @@ export default function ContactPage() {
-
+ -
+
{t('appointmentNote', 'Termine nach vorheriger telefonischer Vereinbarung.')}
-
-
-
{t('qr.title', 'QR-Code')}
+ {/* Rechte Seite - Kontaktformular und QR-Code */} +
+
+
+ +

{t('contact.formTitle', 'Kontaktformular')}

+

+ {t('contact.formDescription', 'Senden Sie uns eine Nachricht und wir melden uns so schnell wie möglich bei Ihnen zurück.')} +

+
+ +
+
+
+ + setFormData({...formData, name: e.target.value})} + className="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 text-sm" + placeholder={t('contact.namePlaceholder', 'Ihr Name')} + required + /> +
+
+ + setFormData({...formData, email: e.target.value})} + className="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 text-sm" + placeholder={t('contact.emailPlaceholder', 'ihre@email.de')} + required + /> +
+
+ +
+ + setFormData({...formData, phone: e.target.value})} + className="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 text-sm" + placeholder={t('contact.phonePlaceholder', '0123 456789')} + /> +
+ +
+ + setFormData({...formData, subject: e.target.value})} + className="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 text-sm" + placeholder={t('contact.subjectPlaceholder', 'Ihr Anliegen')} + required + /> +
+ +
+ +