From 6588d13dd919f65b16338fea37e28af9635b5a9f Mon Sep 17 00:00:00 2001 From: Mostafa Kamar Date: Tue, 10 Jun 2025 03:41:44 +0300 Subject: [PATCH] feat: added conversion api implementation --- .../components/Analytics/Conversion.tsx | 28 ++++++++++ apps/landing/components/Layout/Layout.tsx | 3 + apps/landing/lib/analytics.ts | 22 ++++++++ packages/atlas/src/api/analytics.ts | 13 +++++ packages/atlas/src/api/index.ts | 3 + packages/types/src/analytics.ts | 29 ++++++++++ packages/types/src/index.ts | 1 + packages/utils/package.json | 4 ++ packages/utils/src/analytics.ts | 17 ++++++ services/server/.env.example | 3 + services/server/.env.test | 3 + services/server/.env.test.ci | 5 +- services/server/src/constants.ts | 5 ++ services/server/src/handlers/analytics.ts | 55 +++++++++++++++++++ services/server/src/index.ts | 1 + services/server/src/routes/analytics.ts | 8 +++ services/server/src/routes/index.ts | 2 + 17 files changed, 201 insertions(+), 1 deletion(-) create mode 100644 apps/landing/components/Analytics/Conversion.tsx create mode 100644 apps/landing/lib/analytics.ts create mode 100644 packages/atlas/src/api/analytics.ts create mode 100644 packages/types/src/analytics.ts create mode 100644 packages/utils/src/analytics.ts create mode 100644 services/server/src/handlers/analytics.ts create mode 100644 services/server/src/routes/analytics.ts diff --git a/apps/landing/components/Analytics/Conversion.tsx b/apps/landing/components/Analytics/Conversion.tsx new file mode 100644 index 000000000..2bd9d0230 --- /dev/null +++ b/apps/landing/components/Analytics/Conversion.tsx @@ -0,0 +1,28 @@ +"use client"; + +import { sendFacebookEvent } from "@/lib/analytics"; +import { IAnalytics } from "@litespace/types"; +import { usePathname, useSearchParams } from "next/navigation"; +import { useEffect } from "react"; + +const Conversion: React.FC<{ eventName?: IAnalytics.EventName }> = ({ + eventName = IAnalytics.EventName.PageView, +}) => { + const searchParams = useSearchParams(); + const path = usePathname(); + + useEffect(() => { + const fbclid = searchParams.get("fbclid"); + if (!fbclid) return; + + sendFacebookEvent({ + page: path, + eventName, + fbclid, + }); + }, [path, eventName, searchParams]); + + return null; +}; + +export default Conversion; diff --git a/apps/landing/components/Layout/Layout.tsx b/apps/landing/components/Layout/Layout.tsx index 0109cbf1e..599c4a764 100644 --- a/apps/landing/components/Layout/Layout.tsx +++ b/apps/landing/components/Layout/Layout.tsx @@ -5,8 +5,10 @@ import cn from "classnames"; import Navbar from "@/components/Layout/Navbar"; import Sidebar from "@/components/Layout/Sidebar"; import Footer from "@/components/Layout/Footer"; +import Conversion from "@/components/Analytics/Conversion"; import clarity, { getCustomeId, sessionId } from "@/lib/clarity"; import { usePathname } from "next/navigation"; +import { IAnalytics } from "@litespace/types"; const Layout: React.FC<{ children: React.ReactNode }> = ({ children }) => { const [showSidebar, setShowSidebar] = useState(false); @@ -27,6 +29,7 @@ const Layout: React.FC<{ children: React.ReactNode }> = ({ children }) => { {showSidebar ? setShowSidebar(false)} /> : null} {children}