From bb0b7f87f493b1116bc08b29762dd3729cc52d81 Mon Sep 17 00:00:00 2001 From: jingrow Date: Mon, 25 Aug 2025 00:02:20 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84Contact1=E7=BB=84=E4=BB=B6?= =?UTF-8?q?=EF=BC=8C=E5=A2=9E=E5=8A=A0Contact=E8=8F=9C=E5=8D=95=EF=BC=8C?= =?UTF-8?q?=E9=82=AE=E4=BB=B6=E5=8F=91=E9=80=81=E6=B5=8B=E8=AF=95=E6=88=90?= =?UTF-8?q?=E5=8A=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/send-email/route.js | 9 +- app/contact/page.jsx | 51 +++- components/contact/Contact1.jsx | 338 -------------------------- components/contact/Contact1/UI.jsx | 201 +++++++++++++++ components/contact/Contact1/index.jsx | 16 ++ components/headers/Header.jsx | 6 +- public/files/banner-contact.jpg | Bin 0 -> 54753 bytes public/files/fd0rn90q0g_d86aae5b.png | Bin 0 -> 1467528 bytes public/files/g6j7t53bkf_d0e03f08.png | Bin 0 -> 1631529 bytes utils/data.js | 2 +- 10 files changed, 267 insertions(+), 356 deletions(-) delete mode 100644 components/contact/Contact1.jsx create mode 100644 components/contact/Contact1/UI.jsx create mode 100644 components/contact/Contact1/index.jsx create mode 100644 public/files/banner-contact.jpg create mode 100644 public/files/fd0rn90q0g_d86aae5b.png create mode 100644 public/files/g6j7t53bkf_d0e03f08.png diff --git a/app/api/send-email/route.js b/app/api/send-email/route.js index 3f91bdd..81db196 100644 --- a/app/api/send-email/route.js +++ b/app/api/send-email/route.js @@ -16,15 +16,18 @@ export async function POST(request) { ); const message = response.data.message; if (message?.success) { - return Response.json({ success: true, message: message.message || 'Email sent successfully' }); + const successMessage = typeof message.message === 'string' ? message.message : 'Email sent successfully'; + return Response.json({ success: true, message: successMessage }); } else if (message?.error) { - return Response.json({ error: message.error }, { status: 400 }); + const errorMessage = typeof message.error === 'string' ? message.error : 'Failed to send email'; + return Response.json({ error: errorMessage }, { status: 400 }); } else { return Response.json({ error: 'Unknown error' }, { status: 500 }); } } catch (error) { + const errorMessage = typeof error.message === 'string' ? error.message : 'Internal server error'; return Response.json( - { error: error.message, detail: error?.response?.data || null }, + { error: errorMessage, detail: error?.response?.data || null }, { status: 500 } ); } diff --git a/app/contact/page.jsx b/app/contact/page.jsx index a55dad4..e76b9bb 100644 --- a/app/contact/page.jsx +++ b/app/contact/page.jsx @@ -1,32 +1,61 @@ import Contact1 from "@/components/contact/Contact1"; import React from "react"; import Banner from "@/components/banner/Banner"; +import { getPageData, getSiteSettings, fetchComponentData } from "@/utils/data"; +import { notFound } from 'next/navigation'; export const revalidate = 3600; export async function generateMetadata() { const slugArr = ["contact"]; - const res = await fetch(`${process.env.PUBLIC_SITE_URL}/api/get-page-data`, { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ slug_list: slugArr }) + const { data, error, page_info } = await getPageData({ + slug_list: slugArr, + downloadFiles: false // Do not download files for metadata }); - const { data, error } = await res.json(); + const siteSettings = await getSiteSettings(); + const siteName = siteSettings.site_name || ''; + const siteNameInPageTitles = siteSettings.site_name_in_page_titles || 'None'; + if (error) { return { - title: error.title || '', + title: error.title || 'Contact Error', description: error.message || '', }; } + + let title = ''; + if (Array.isArray(data) && page_info) { + title = page_info.meta_title || page_info.title || ''; + } else { + title = data?.meta_title || data?.title || ''; + } + + if (siteName && title) { + if (siteNameInPageTitles === 'After') { + title = `${title} - ${siteName}`; + } else if (siteNameInPageTitles === 'Before') { + title = `${siteName} - ${title}`; + } + } + return { - title: data?.meta_title || data?.title || '', + title, description: data?.meta_description || data?.description || '', }; } -export default async function ContactPage() { - const res = await fetch(`${process.env.PUBLIC_SITE_URL}/api/get-component-data?component_name=Contact`, { cache: 'no-store' }); - const { data } = await res.json(); +export default async function Page() { + const slugArr = ["contact"]; + + // 获取页面数据 + const { data, error } = await getPageData({ + slug_list: slugArr, + downloadFiles: true // Download files for page rendering + }); + + if (error) { + notFound(); + } return ( <> @@ -35,7 +64,7 @@ export default async function ContactPage() { componentName="Banner-contact" className="contact-banner" /> - + ); diff --git a/components/contact/Contact1.jsx b/components/contact/Contact1.jsx deleted file mode 100644 index cbd0f86..0000000 --- a/components/contact/Contact1.jsx +++ /dev/null @@ -1,338 +0,0 @@ -"use client"; -import React, { useEffect, useState } from "react"; -import axios from "axios"; - -export default function Contact1({ ssrData }) { - const [data, setData] = useState(ssrData || null); - const [loading, setLoading] = useState(!ssrData); - const [error, setError] = useState(null); - const [modal, setModal] = useState({ open: false, message: '', type: 'success' }); - - useEffect(() => { - if (!ssrData) { - setLoading(true); - axios.get("/api/get-component-data", { params: { component_name: "Contact" } }) - .then(res => setData(res.data.data)) - .catch(() => setError("Failed to get Contact data")) - .finally(() => setLoading(false)); - } else { - setLoading(false); - } - }, [ssrData]); - - if (loading) return
Loading...
; - if (error) return null; - if (!data) return null; - - - const contacts = Array.isArray(data.items) ? data.items : []; - - const [form, setForm] = useState({ - name: '', - phone: '', - email: '', - department: '', - message: '' - }); - const [submitting, setSubmitting] = useState(false); - const [submitResult, setSubmitResult] = useState(null); - - function handleInputChange(e) { - const { name, value } = e.target; - setForm(prev => ({ ...prev, [name]: value })); - } - - async function handleSubmit(e) { - e.preventDefault(); - setSubmitting(true); - setSubmitResult(null); - try { - const content = [ - `Name: ${form.name}`, - `Phone: ${form.phone}`, - `Email: ${form.email}`, - `Department: ${form.department}`, - `Message:
${form.message.replace(/\n/g, '
')}` - ].join("
"); - const res = await axios.post('/api/send-email', { - subject: `Website Contact Form: ${form.name}`, - content - }); - if (res.data.success) { - setModal({ open: true, message: res.data.message || 'Email sent successfully!', type: 'success' }); - setSubmitResult(null); - setForm({ name: '', phone: '', email: '', department: '', message: '' }); - } else { - setModal({ open: true, message: res.data.error || 'Failed to send', type: 'error' }); - setSubmitResult(null); - } - } catch (err) { - setModal({ open: true, message: err?.response?.data?.error || err.message || 'Failed to send', type: 'error' }); - setSubmitResult(null); - } finally { - setSubmitting(false); - } - } - - function closeModal() { - setModal({ open: false, message: '', type: 'success' }); - } - - return ( -
-
-
-
-
-
-
-
-