From 41d4e6b8f8c0c511f63f60a0c4ff908ef642b7bd Mon Sep 17 00:00:00 2001 From: gunshiz Date: Sun, 28 Jun 2026 22:39:52 +0700 Subject: [PATCH] feat: implement unique visitor tracking using Redis and display count on home page --- app/page.tsx | 27 +++++++++++++++++++++++++++ lib/config.ts | 12 ++++++------ lib/redis.ts | 15 +++++++++++++++ next.config.ts | 1 + 4 files changed, 49 insertions(+), 6 deletions(-) create mode 100644 lib/redis.ts diff --git a/app/page.tsx b/app/page.tsx index e818b06..1ef00f8 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -3,9 +3,27 @@ import { Card, CardHeader } from "@/components/ui/card"; import Image from "next/image"; import { getFollowerCounts } from "@/lib/followers"; import { LinkCard } from "@/components/LinkCard"; +import { getRedisClient } from "@/lib/redis"; +import { headers } from "next/headers"; +import { Users } from "lucide-react"; +import { Kbd } from "@/components/ui/kbd"; export default async function Home() { const counts = await getFollowerCounts(); + const headersList = await headers(); + const ip = headersList.get("x-forwarded-for") || headersList.get("x-real-ip") || "unknown"; + + let visitorCount = 0; + try { + const redis = await getRedisClient(); + if (ip !== "unknown") { + await redis.sadd("erika:unique_visitors", ip); + } + visitorCount = await redis.scard("erika:unique_visitors"); + } catch (e) { + console.error("Failed to track visitor:", e); + } + const jsonLd = { "@context": "https://schema.org", "@type": "ProfilePage", @@ -20,6 +38,7 @@ export default async function Home() { }, }; + return (