fix: proxy subscribe through Next.js API route to avoid network permission prompt
Browser was requesting local network access for the Tailscale URL. Now both forms POST to /api/subscribe which proxies server-side to the leads-api container. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
18
site/app/api/subscribe/route.ts
Normal file
18
site/app/api/subscribe/route.ts
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
import { NextRequest, NextResponse } from "next/server";
|
||||||
|
|
||||||
|
const API_URL = process.env.LEADS_API_URL || "http://leads-api:3400";
|
||||||
|
|
||||||
|
export async function POST(req: NextRequest) {
|
||||||
|
try {
|
||||||
|
const body = await req.json();
|
||||||
|
const res = await fetch(`${API_URL}/subscribe`, {
|
||||||
|
method: "POST",
|
||||||
|
headers: { "Content-Type": "application/json" },
|
||||||
|
body: JSON.stringify(body),
|
||||||
|
});
|
||||||
|
const data = await res.json();
|
||||||
|
return NextResponse.json(data, { status: res.status });
|
||||||
|
} catch {
|
||||||
|
return NextResponse.json({ error: "upstream error" }, { status: 502 });
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,8 +2,6 @@
|
|||||||
|
|
||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
|
|
||||||
const API_URL = "https://alezmad-nuc.tail58f5ad.ts.net";
|
|
||||||
|
|
||||||
export function NewsletterForm({ project = "cladm" }: { project?: string }) {
|
export function NewsletterForm({ project = "cladm" }: { project?: string }) {
|
||||||
const [email, setEmail] = useState("");
|
const [email, setEmail] = useState("");
|
||||||
const [status, setStatus] = useState<"idle" | "loading" | "ok" | "error">("idle");
|
const [status, setStatus] = useState<"idle" | "loading" | "ok" | "error">("idle");
|
||||||
@@ -14,7 +12,7 @@ export function NewsletterForm({ project = "cladm" }: { project?: string }) {
|
|||||||
if (!email.trim()) return;
|
if (!email.trim()) return;
|
||||||
setStatus("loading");
|
setStatus("loading");
|
||||||
try {
|
try {
|
||||||
const res = await fetch(`${API_URL}/subscribe`, {
|
const res = await fetch("/api/subscribe", {
|
||||||
method: "POST",
|
method: "POST",
|
||||||
headers: { "Content-Type": "application/json" },
|
headers: { "Content-Type": "application/json" },
|
||||||
body: JSON.stringify({ email: email.trim(), project }),
|
body: JSON.stringify({ email: email.trim(), project }),
|
||||||
|
|||||||
@@ -2,8 +2,6 @@
|
|||||||
|
|
||||||
import { useState, useEffect, useRef, useCallback } from "react";
|
import { useState, useEffect, useRef, useCallback } from "react";
|
||||||
|
|
||||||
const API_URL = "https://alezmad-nuc.tail58f5ad.ts.net";
|
|
||||||
|
|
||||||
type Phase = "boot" | "prompt" | "sending" | "done";
|
type Phase = "boot" | "prompt" | "sending" | "done";
|
||||||
|
|
||||||
const BOOT_LINES = [
|
const BOOT_LINES = [
|
||||||
@@ -86,7 +84,7 @@ export function SubscribeModal() {
|
|||||||
setPhase("sending");
|
setPhase("sending");
|
||||||
setError("");
|
setError("");
|
||||||
try {
|
try {
|
||||||
const res = await fetch(`${API_URL}/subscribe`, {
|
const res = await fetch("/api/subscribe", {
|
||||||
method: "POST",
|
method: "POST",
|
||||||
headers: { "Content-Type": "application/json" },
|
headers: { "Content-Type": "application/json" },
|
||||||
body: JSON.stringify({ email: email.trim(), project: "cladm" }),
|
body: JSON.stringify({ email: email.trim(), project: "cladm" }),
|
||||||
|
|||||||
Reference in New Issue
Block a user