Skip to content

Commit 7001a55

Browse files
feat: implement feature toggle for WeatherWidget based on environment variable
1 parent b7e7de3 commit 7001a55

File tree

3 files changed

+32
-26
lines changed

3 files changed

+32
-26
lines changed

src/app/api/submit/route.ts

Lines changed: 14 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,26 @@
1-
// import { NextResponse } from 'next/server';
1+
import { NextResponse } from "next/server";
22

3-
// export async function POST(req: Request) {
4-
// try {
5-
// const { name, email } = await req.json();
6-
7-
// if (!name || !email) {
8-
// return NextResponse.json({ message: 'Name and Email are required' }, { status: 400 });
9-
// }
10-
11-
// return NextResponse.json({ message: `Thank you, ${name}!` });
12-
// } catch {
13-
// return NextResponse.json({ message: 'Server error' }, { status: 500 });
14-
// }
15-
// }
16-
17-
import { NextResponse } from 'next/server';
3+
export const isFeatureXEnabled =
4+
process.env.NEXT_PUBLIC_FEATURE_X_ENABLED === "true";
185

196
export async function POST(req: Request) {
207
try {
218
const { name, email } = await req.json();
229

2310
if (!name || !email) {
24-
return NextResponse.json({ message: 'Name and Email are required' }, { status: 400 });
11+
return NextResponse.json(
12+
{ message: "Name and Email are required" },
13+
{ status: 400 }
14+
);
2515
}
2616

27-
return NextResponse.json({ message: `Hello ${name}, your form has been submitted successfully!` });
17+
return NextResponse.json({
18+
message: `Hello ${name}, your form has been submitted successfully!`,
19+
});
2820
} catch {
29-
return NextResponse.json({ message: 'Internal server error' }, { status: 500 });
21+
return NextResponse.json(
22+
{ message: "Internal server error" },
23+
{ status: 500 }
24+
);
3025
}
3126
}

src/app/page.tsx

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,20 @@
1-
import Link from "next/link";
2-
import WeatherWidget from "./weather-widget";
3-
import { getFeature } from "@vercel/flags";
1+
import { useEffect, useState } from "react";
42

5-
export default async function Home() {
6-
const isWeatherFeatureEnabled = getFeature("FEATURE_WEATHER_WIDGET");
3+
export default function Home() {
4+
const [isFeatureXEnabled, setIsFeatureXEnabled] = useState(false);
5+
6+
useEffect(() => {
7+
setIsFeatureXEnabled(process.env.NEXT_PUBLIC_FEATURE_X_ENABLED === "true");
8+
}, []);
79

810
return (
911
<div className="container">
1012
<h1>Welcome to Next.js + Playwright</h1>
11-
<Link href="/form">Go to Form</Link>
12-
{isWeatherFeatureEnabled && <WeatherWidget />}
13+
{isFeatureXEnabled ? (
14+
<p>🎉 Feature X is ON</p>
15+
) : (
16+
<p>🚫 Feature X is OFF</p>
17+
)}
1318
</div>
1419
);
1520
}

src/app/weather-widget.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import { useState, useEffect } from "react";
44

5+
const isFeatureEnabled = process.env.NEXT_PUBLIC_FEATURE_X_ENABLED === "true";
6+
57
export default function WeatherWidget() {
68
const [weather, setWeather] = useState<WeatherData | null>(null);
79
const [location, setLocation] = useState<{
@@ -14,6 +16,10 @@ export default function WeatherWidget() {
1416
const [error, setError] = useState("");
1517

1618
useEffect(() => {
19+
if (!isFeatureEnabled) {
20+
return; // Do not proceed if the feature flag is disabled
21+
}
22+
1723
if (navigator.geolocation) {
1824
navigator.geolocation.getCurrentPosition(
1925
(position) => {

0 commit comments

Comments
 (0)