eb711fbf1a
Build and Deploy / build (push) Has been cancelled
- Email capture popup with scroll (10%) and exit intent triggers - First name field and full tracking (UTM, device, time on page) - Mautic API integration for contact creation - GeoIP detection for country/region - 4 locale support (sr, en, de, fr) - Mautic tracking script in layout
68 lines
2.0 KiB
TypeScript
68 lines
2.0 KiB
TypeScript
import { NextRequest, NextResponse } from "next/server";
|
|
|
|
export async function GET(request: NextRequest) {
|
|
try {
|
|
// Check for Cloudflare's IP header first (production)
|
|
const cfConnectingIp = request.headers.get("cf-connecting-ip");
|
|
const forwardedFor = request.headers.get("x-forwarded-for");
|
|
const realIP = request.headers.get("x-real-ip");
|
|
|
|
// Use Cloudflare IP first, then fall back to other headers
|
|
let ip = cfConnectingIp || forwardedFor?.split(",")[0]?.trim() || realIP || "127.0.0.1";
|
|
|
|
// For local development, return XX as country code (Mautic accepts this)
|
|
if (ip === "127.0.0.1" || ip === "::1" || ip.startsWith("192.168.") || ip.startsWith("10.")) {
|
|
console.log("[GeoIP] Local/private IP detected:", ip);
|
|
return NextResponse.json({
|
|
country: "Unknown",
|
|
countryCode: "XX",
|
|
region: "",
|
|
city: "",
|
|
timezone: "",
|
|
});
|
|
}
|
|
|
|
const response = await fetch(`http://ip-api.com/json/${ip}?fields=status,message,country,countryCode,region,regionName,city,timezone`, {
|
|
headers: {
|
|
"Accept": "application/json",
|
|
},
|
|
});
|
|
|
|
if (!response.ok) {
|
|
throw new Error("GeoIP lookup failed");
|
|
}
|
|
|
|
const data = await response.json();
|
|
|
|
if (data.status !== "success") {
|
|
console.error("[GeoIP] API error:", data.message, "for IP:", ip);
|
|
return NextResponse.json({
|
|
country: "Unknown",
|
|
countryCode: "XX",
|
|
region: "",
|
|
city: "",
|
|
timezone: "",
|
|
});
|
|
}
|
|
|
|
console.log("[GeoIP] Success:", data.country, "(" + data.countryCode + ")");
|
|
|
|
return NextResponse.json({
|
|
country: data.country,
|
|
countryCode: data.countryCode,
|
|
region: data.regionName,
|
|
city: data.city,
|
|
timezone: data.timezone,
|
|
});
|
|
} catch (error) {
|
|
console.error("[GeoIP] Error:", error);
|
|
return NextResponse.json({
|
|
country: "Unknown",
|
|
countryCode: "XX",
|
|
region: "",
|
|
city: "",
|
|
timezone: "",
|
|
});
|
|
}
|
|
}
|