From 846379eccc629f0c909d335f7f786dcf41130534 Mon Sep 17 00:00:00 2001 From: htom Date: Mon, 22 Dec 2025 17:59:43 +0100 Subject: [PATCH] fixed email messages --- index.html | 3 +- ...der-status.zip => motion-web-stúdió2.0.zip | Bin 380489 -> 390116 bytes package.json | 3 +- pages/Admin.tsx | 205 ++++++++++++++++-- pages/auth/Login.tsx | 75 ++++--- 5 files changed, 228 insertions(+), 58 deletions(-) rename motion-web-studio-0.1-login-order-status.zip => motion-web-stúdió2.0.zip (94%) diff --git a/index.html b/index.html index 9d38f93..9e43ed4 100644 --- a/index.html +++ b/index.html @@ -64,7 +64,8 @@ "lucide-react": "https://esm.sh/lucide-react@0.344.0?deps=react@18.2.0", "@supabase/supabase-js": "https://esm.sh/@supabase/supabase-js@2.39.7", "react-dom/": "https://esm.sh/react-dom@^19.2.3/", - "react/": "https://esm.sh/react@^19.2.3/" + "react/": "https://esm.sh/react@^19.2.3/", + "@google/genai": "https://esm.sh/@google/genai@^1.34.0" } } diff --git a/motion-web-studio-0.1-login-order-status.zip b/motion-web-stúdió2.0.zip similarity index 94% rename from motion-web-studio-0.1-login-order-status.zip rename to motion-web-stúdió2.0.zip index 4dea16da6063fc27c9ca43254553fc0374ddcc9f..dc00caee673ee55072d8ad676617770e23a674df 100644 GIT binary patch delta 12265 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 IfOpUT0bVBg1ONa4 delta 3838 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 { + const baseStyle = "font-family: 'Inter', Helvetica, Arial, sans-serif; line-height: 1.6; color: #1a1a1a; max-width: 600px; margin: 0 auto; padding: 40px 20px; border: 1px solid #f0f0f0; border-radius: 24px; background-color: #ffffff;"; + const headerStyle = "color: #7c3aed; font-size: 28px; font-weight: 800; margin-bottom: 24px; letter-spacing: -0.02em; border-bottom: 1px solid #f0f0f0; padding-bottom: 20px;"; + const footerStyle = "margin-top: 40px; padding-top: 24px; border-top: 1px solid #f0f0f0; font-size: 13px; color: #94a3b8;"; + const buttonStyle = "display: inline-block; background-color: #7c3aed; color: #ffffff !important; padding: 14px 28px; text-decoration: none; border-radius: 12px; font-weight: 700; margin: 20px 0; font-size: 15px;"; + + const templates: Record = { + 'Fejlesztés megkezdése': { + subject: `Projekt Indítása: Megkezdtük a fejlesztést - ${data.package}`, + body: `
+
MotionWeb
+

Kedves ${data.customer}!

+

Örömmel értesítjük, hogy a ${data.package} csomagjához tartozó fejlesztési folyamat a mai napon hivatalosan is elindult.

+

Szakembereink elkezdték a weboldal vázlatának és design elemeinek kidolgozását. Amint elkészülünk az első megtekinthető demó verzióval, azonnal jelentkezünk a hozzáférési linkkel.

+

Köszönjük a bizalmát!

+
+ Üdvözlettel,
+ Balogh Bence
+ MotionWeb Stúdió | motionweb.hu +
+
` + }, + 'Demó oldal elkészült': { + subject: `Elkészült a weboldal demó verziója - ${data.package}`, + body: `
+
MotionWeb
+

Kedves ${data.customer}!

+

Jó hírünk van: elkészültünk weboldala első, interaktív bemutató verziójával!

+

A demó oldalt az alábbi biztonságos linken tudja megtekinteni:

+ +

Kérjük, nézze át az oldalt, és a MotionWeb ügyfélkapujában a Rendeléseim menüpont alatt küldje el visszajelzését, hogy rögzíthessük az esetleges módosítási kéréseit.

+
+ Üdvözlettel,
+ Balogh Bence
+ MotionWeb Stúdió | motionweb.hu +
+
` + }, + 'Módosítások fejlesztése': { + subject: `Visszajelzés rögzítve: Módosítások folyamatban`, + body: `
+
MotionWeb
+

Kedves ${data.customer}!

+

Köszönjük részletes visszajelzését! A kért módosításokat rögzítettük és szakembereink már dolgoznak azok átvezetésén.

+

Amint a frissített verzió megtekinthető lesz, e-mailben ismét értesíteni fogjuk.

+
+ Üdvözlettel,
+ Balogh Bence
+ MotionWeb Stúdió | motionweb.hu +
+
` + }, + '1 hete nincs visszajelzés': { + subject: `Emlékeztető: Visszajelzés várható a demó oldallal kapcsolatban`, + body: `
+
MotionWeb
+

Kedves ${data.customer}!

+

Szeretnénk emlékeztetni, hogy egy héttel ezelőtt küldtük el Önnek a weboldal demó verzióját.

+

Annak érdekében, hogy tartsuk a fejlesztési ütemtervet, kérjük, amint ideje engedi, nézze át a tervet és küldje el véleményét az ügyfélkapun keresztül.

+
+ Üdvözlettel,
+ Balogh Bence
+ MotionWeb Stúdió | motionweb.hu +
+
` + }, + '2 hete nincs visszajelzés': { + subject: `Fontos: Továbblépéshez szükséges visszajelzés hiánya`, + body: `
+
MotionWeb
+

Kedves ${data.customer}!

+

Szeretnénk felhívni figyelmét, hogy weboldala demó verziója már két hete várakozik az Ön jóváhagyására.

+

Amennyiben elégedett a látottakkal, kérjük, jelezze azt a felületen a véglegesítés megkezdéséhez. Bármilyen kérdés vagy észrevétel esetén állunk rendelkezésére.

+
+ Üdvözlettel,
+ Balogh Bence
+ MotionWeb Stúdió | motionweb.hu +
+
` + }, + 'Projekt lezárva (Nincs válasz)': { + subject: `Értesítés: Projekt adminisztratív lezárása - ${data.package}`, + body: `
+
MotionWeb
+

Kedves ${data.customer}!

+

Sajnálattal értesítjük, hogy mivel az elmúlt időszakban többszöri megkeresésünkre sem érkezett válasz, a ${data.package} projektet a mai napon adminisztratív okokból lezártnak tekintjük.

+

Amennyiben a jövőben folytatni szeretné a fejlesztést, kérjük, vegye fel velünk a kapcsolatot egy új ütemterv egyeztetése érdekében.

+
+ Üdvözlettel,
+ Balogh Bence
+ MotionWeb Stúdió | motionweb.hu +
+
` + }, + 'Végleges oldal elérhető': { + subject: `Gratulálunk! Weboldala elkészült és élesítésre került`, + body: `
+
MotionWeb
+

Kedves ${data.customer}!

+

Örömmel jelentjük, hogy a ${data.package} projektünk sikeresen befejeződött!

+

A weboldalt élesítettük, így az mostantól minden látogató számára elérhető a végleges domain címen.

+

Köszönjük, hogy minket választott digitális partnerének. Kérjük, amennyiben elégedett volt a munkánkkal, ajánljon minket ismerőseinek is!

+
+ Üdvözlettel,
+ Balogh Bence
+ MotionWeb Stúdió | motionweb.hu +
+
` + } + }; + + return templates[type] || { subject: 'Értesítés a MotionWeb-től', body: 'Üzenete érkezett a MotionWeb Stúdiótól.' }; +}; + export const Admin: React.FC = () => { const { user, isAdmin, loading } = useAuth(); const navigate = useNavigate(); @@ -149,11 +266,17 @@ export const Admin: React.FC = () => { const fetchEmailLogs = async (orderId: string) => { if (!isSupabaseConfigured) return []; try { - const { data } = await supabase + // Megpróbáljuk lekérni, de ha hiányzik oszlop vagy tábla, hibatűrően kezeljük + const { data, error } = await supabase .from('email_log') .select('*') .eq('order_id', orderId) .order('sent_at', { ascending: false }); + + if (error) { + console.error("Email log fetch error:", error.message); + return []; + } return data || []; } catch (e) { console.warn("Could not fetch email_log table."); @@ -213,6 +336,10 @@ export const Admin: React.FC = () => { setOrders(prev => prev.map(o => o.id === orderId ? { ...o, status: targetStatus, details: updatedDetails } : o)); setViewOrder({ ...viewOrder, status: targetStatus, details: updatedDetails, history: newHist }); + if (demoUrlInput.startsWith('http')) { + handleSendEmail('Demó oldal elkészült'); + } + alert(`Sikeres mentés és visszajelzés kérése!`); } else { setViewOrder({ ...viewOrder, details: updatedDetails }); @@ -240,25 +367,62 @@ export const Admin: React.FC = () => { setEmailSending(emailType); try { - console.log(`Email notification trigger: ${emailType}`); - + const template = getEmailTemplate(emailType, { + customer: viewOrder.customer, + package: viewOrder.package, + demoUrl: demoUrlInput || viewOrder.details?.demoUrl + }); + if (isSupabaseConfigured) { - const { error } = await supabase.from('email_log').insert({ - order_id: viewOrder.id, - email_type: emailType + // MEGHÍVJUK A FÜGGVÉNYT + const response = await supabase.functions.invoke('resend', { + body: { + to: viewOrder.email, + subject: template.subject, + html: template.body + } }); - - if (error) throw error; + + // Supabase hiba kezelése (az invoke hiba objektumot ad vissza, ha a hívás sikertelen) + if (response.error) { + let errorDetail = response.error.message; + if (errorDetail.includes('API kulcs hiányzik')) { + throw new Error("HIÁNYZIK A BEÁLLÍTÁS: A Supabase Dashboardon az Edge Functions -> Secrets menüpontban fel kell venni a RESEND_API_KEY kulcsot!"); + } + throw new Error(errorDetail); + } + + // A függvény által visszaadott egyedi hiba (ha van) + if (response.data && response.data.error) { + throw new Error(response.data.error); + } + + // SIKERES KÜLDÉS NAPLÓZÁSA (Hibatűrő módon) + try { + const { error: logError } = await supabase.from('email_log').insert({ + order_id: viewOrder.id, + email_type: emailType, + body: template.body + }); + + if (logError) { + console.error("Adatbázis naplózási hiba (lehet, hogy hiányzik a 'body' oszlop):", logError.message); + // Itt nem dobunk hibát, mert az email már kiment! Csak logolunk a konzolra. + } + } catch (dbErr) { + console.error("Váratlan hiba az adatbázisba íráskor:", dbErr); + } const newLogs = await fetchEmailLogs(viewOrder.id); setViewOrder({ ...viewOrder, emailLogs: newLogs }); - alert(`E-mail ("${emailType}") naplózva és kiküldve (szimulált).`); + alert(`Sikeres küldés! Az értesítőt kiküldtük ${viewOrder.email} címre.`); } else { - alert(`E-mail értesítő előkészítve: "${emailType}"\n\nJelenleg ez a funkció csak placeholder.`); + alert(`DEMO MÓD: Tárgy: ${template.subject}`); } } catch (e: any) { - alert("Hiba az e-mail naplózásakor: " + e.message); + console.error("Hiba az e-mail folyamatban:", e); + alert("Hiba az e-mail küldésekor:\n\n" + e.message); } finally { setEmailSending(null); } @@ -468,10 +632,9 @@ export const Admin: React.FC = () => { - {/* EMAIL NOTIFICATIONS & LOGS COMBINED */}
-

E-mail értesítők

+

E-mail értesítők (Közvetlen sablonok)

{[ { label: 'Fejlesztés megkezdése', icon: Rocket }, @@ -493,7 +656,9 @@ export const Admin: React.FC = () => {

{email.label}

-

Értesítő küldése

+

+ {emailSending === email.label ? 'Küldés folyamatban...' : 'E-mail küldése'} +

@@ -501,7 +666,6 @@ export const Admin: React.FC = () => {
- {/* IN-PLACE EMAIL LOG */}

Korábban kiküldött e-mailek

@@ -510,8 +674,13 @@ export const Admin: React.FC = () => {
-

{log.email_type}

-

{new Date(log.sent_at).toLocaleString('hu-HU')}

+
+

{log.email_type}

+

{new Date(log.sent_at).toLocaleString('hu-HU')}

+
+ {log.body && ( +
+ )}
)) @@ -557,7 +726,7 @@ export const Admin: React.FC = () => { disabled={savingDemoUrl} className="bg-blue-600 hover:bg-blue-700 text-white font-black px-6 py-4 rounded-2xl text-xs uppercase tracking-widest transition-all disabled:opacity-50 shadow-lg shadow-blue-200" > - {savingDemoUrl ? 'MENTÉS...' : 'PUBLIKÁLÁS ÉS VISSZAJELZÉS KÉRÉSE'} + {savingDemoUrl ? 'MENTÉS...' : 'PUBLIKÁLÁS ÉS ÉRTESÍTÉS'}
diff --git a/pages/auth/Login.tsx b/pages/auth/Login.tsx index 6a37641..6b3ab27 100644 --- a/pages/auth/Login.tsx +++ b/pages/auth/Login.tsx @@ -3,7 +3,7 @@ import { Link, useNavigate } from 'react-router-dom'; import { supabase, isSupabaseConfigured } from '../../lib/supabaseClient'; import { Button } from '../../components/Button'; import { useAuth } from '../../context/AuthContext'; -import { LogIn, AlertCircle, ArrowLeft, RefreshCw, Mail, ShieldCheck } from 'lucide-react'; +import { LogIn, AlertCircle, ArrowLeft, RefreshCw, Mail } from 'lucide-react'; export const Login: React.FC = () => { const navigate = useNavigate(); @@ -46,20 +46,22 @@ export const Login: React.FC = () => { if (error) { console.error('Login error:', error); + + // Specifikus hibaüzenetek kezelése if (error.message.includes('Invalid login credentials')) { - setError('Helytelen e-mail cím vagy jelszó. Kérjük, győződjön meg róla, hogy megerősítette az e-mail címét!'); + setError('Helytelen e-mail cím vagy jelszó. Ha most regisztráltál, ellenőrizd a postafiókodat és kattints a megerősítő linkre!'); setNeedsConfirmation(true); } else if (error.message.includes('Email not confirmed')) { - setError('Az e-mail cím még nincs megerősítve.'); + setError('Az e-mail címed még nincs megerősítve. Kérjük, kattints a regisztrációkor kapott linkre!'); setNeedsConfirmation(true); } else { - setError('Hiba történt a bejelentkezés során: ' + error.message); + setError('Hiba történt: ' + error.message); } } else { navigate('/dashboard'); } } catch (err: any) { - setError('Váratlan hiba történt.'); + setError('Váratlan hiba történt a bejelentkezés során.'); } finally { setLoading(false); } @@ -86,9 +88,10 @@ export const Login: React.FC = () => { setError('Hiba az újraküldéskor: ' + error.message); } else { setResendSuccess(true); + setNeedsConfirmation(false); } } catch (err: any) { - setError('Hiba történt.'); + setError('Hiba történt az e-mail újraküldésekor.'); } finally { setResendLoading(false); } @@ -99,22 +102,22 @@ export const Login: React.FC = () => {

Bejelentkezés

-

Jelentkezzen be fiókjába a folytatáshoz.

+

Lépjen be fiókjába a kezeléshez.

-
+
{error && ( -
+
-

{error}

+

{error}

{needsConfirmation && ( -
-
)} @@ -122,47 +125,43 @@ export const Login: React.FC = () => { )} {resendSuccess && ( -
+
-

A megerősítő e-mailt újraküldtük!

+

A megerősítő linket újra elküldtük!

)} -
- -
- setEmail(e.target.value)} className="appearance-none block w-full px-4 py-3 border border-gray-300 rounded-lg shadow-sm focus:outline-none focus:ring-primary focus:border-primary sm:text-sm bg-white text-gray-900" /> +
+
+ + setEmail(e.target.value)} className="appearance-none block w-full px-4 py-3 border border-gray-200 rounded-xl shadow-sm focus:outline-none focus:ring-4 focus:ring-primary/10 focus:border-primary sm:text-sm bg-white text-gray-900 font-medium" placeholder="pelda@email.hu" /> +
+ +
+
+ + Elfelejtette? +
+ setPassword(e.target.value)} className="appearance-none block w-full px-4 py-3 border border-gray-200 rounded-xl shadow-sm focus:outline-none focus:ring-4 focus:ring-primary/10 focus:border-primary sm:text-sm bg-white text-gray-900 font-medium" placeholder="••••••••" />
-
- - Elfelejtette? -
-
- setPassword(e.target.value)} className="appearance-none block w-full px-4 py-3 border border-gray-300 rounded-lg shadow-sm focus:outline-none focus:ring-primary focus:border-primary sm:text-sm bg-white text-gray-900" /> -
-
- -
-
-
-
Nincs még fiókod?
-
- Regisztrálj ingyenesen -
+
+

Nincs még fiókod?

+ Regisztrálj ingyenesen
- - Vissza a főoldalra + + Vissza a főoldalra