From eb852fb11dbe2125c9d10d9adbc6b6daea5f7ace Mon Sep 17 00:00:00 2001 From: eric Date: Mon, 9 Mar 2026 05:07:59 -0500 Subject: [PATCH] 'x' --- app/[locale]/feedback/page.tsx | 153 ++++++++++++++++++++++ app/[locale]/layout.tsx | 2 + app/[locale]/map/page.tsx | 109 ++++++++++++++++ app/[locale]/meetups/host/page.tsx | 199 +++++++++++++++++++++++++++++ app/[locale]/meetups/page.tsx | 31 +++-- app/[locale]/page.tsx | 8 +- app/[locale]/report/data/page.tsx | 109 ++++++++++++++++ app/[locale]/report/page.tsx | 8 +- app/api/geo/china/route.ts | 20 +++ app/components/CityCard.tsx | 6 +- app/components/FilterBar.tsx | 69 +++++++--- app/components/HeroSection.tsx | 72 ++++++----- app/components/Navbar.tsx | 37 ++++-- app/components/SetLangAttr.tsx | 17 +++ app/components/SiteMenu.tsx | 86 ++----------- app/components/ThemeToggle.tsx | 8 +- app/data/map-cities.ts | 38 ++++++ app/globals.css | 32 +++++ app/lib/charts/MembersMap.tsx | 135 +++++++++++++++++++ app/lib/charts/README.md | 66 ++++++++++ app/lib/charts/ReportChart.tsx | 156 ++++++++++++++++++++++ app/lib/charts/index.ts | 16 +++ app/lib/charts/types.ts | 33 +++++ messages/en.json | 129 ++++++++++++++++++- messages/zh.json | 129 ++++++++++++++++++- package.json | 1 + pnpm-lock.yaml | 23 ++++ 27 files changed, 1523 insertions(+), 169 deletions(-) create mode 100644 app/[locale]/feedback/page.tsx create mode 100644 app/[locale]/map/page.tsx create mode 100644 app/[locale]/meetups/host/page.tsx create mode 100644 app/[locale]/report/data/page.tsx create mode 100644 app/api/geo/china/route.ts create mode 100644 app/components/SetLangAttr.tsx create mode 100644 app/data/map-cities.ts create mode 100644 app/lib/charts/MembersMap.tsx create mode 100644 app/lib/charts/README.md create mode 100644 app/lib/charts/ReportChart.tsx create mode 100644 app/lib/charts/index.ts create mode 100644 app/lib/charts/types.ts diff --git a/app/[locale]/feedback/page.tsx b/app/[locale]/feedback/page.tsx new file mode 100644 index 0000000..d11ac02 --- /dev/null +++ b/app/[locale]/feedback/page.tsx @@ -0,0 +1,153 @@ +"use client"; + +import { useState } from "react"; +import { useTranslation } from "@/i18n/navigation"; +import Footer from "@/app/components/Footer"; + +export default function FeedbackPage() { + const { t } = useTranslation("feedback"); + const [submitted, setSubmitted] = useState(false); + const [form, setForm] = useState({ + type: "suggestion" as "suggestion" | "bug", + email: "", + title: "", + content: "", + }); + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + setSubmitted(true); + }; + + return ( +
+
+
+

+ + {t("title")} +

+

+ {t("subtitle")} +

+
+ + {submitted ? ( +
+ 🙏 +

+ {t("successTitle")} +

+

+ {t("successDesc")} +

+ +
+ ) : ( +
+
+ +
+ + +
+
+ +
+ + setForm((f) => ({ ...f, email: e.target.value }))} + placeholder={t("emailPlaceholder")} + className="w-full px-4 py-3 rounded-xl border border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-[#ff4d4f]/20 focus:border-[#ff4d4f]" + /> +
+ +
+ + setForm((f) => ({ ...f, title: e.target.value }))} + placeholder={t("titlePlaceholder")} + className="w-full px-4 py-3 rounded-xl border border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-[#ff4d4f]/20 focus:border-[#ff4d4f]" + /> +
+ +
+ +