Skip to content

Commit afe4784

Browse files
feat: add weather widget feature with conditional rendering
1 parent a0b4b31 commit afe4784

File tree

6 files changed

+104
-24
lines changed

6 files changed

+104
-24
lines changed

package-lock.json

Lines changed: 53 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
"dependencies": {
1212
"@clerk/clerk-sdk-node": "^5.1.6",
1313
"@types/node-fetch": "^2.6.12",
14+
"flags": "^4.0.0",
1415
"next": "15.1.6",
1516
"node-fetch": "^3.3.2",
1617
"react": "^19.0.0",

src/app/api/submit/route.ts

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,33 @@
1-
// import { NextResponse } from 'next/server';
2-
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';
1+
import { NextResponse } from "next/server";
182

193
export async function POST(req: Request) {
4+
const isFeatureXEnabled =
5+
process.env.NEXT_PUBLIC_FEATURE_X_ENABLED === "true";
6+
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+
);
15+
}
16+
17+
if (!isFeatureXEnabled) {
18+
return NextResponse.json(
19+
{ message: "Feature X is disabled" },
20+
{ status: 403 }
21+
);
2522
}
2623

27-
return NextResponse.json({ message: `Hello ${name}, your form has been submitted successfully!` });
24+
return NextResponse.json({
25+
message: `Hello ${name}, your form has been submitted successfully!`,
26+
});
2827
} catch {
29-
return NextResponse.json({ message: 'Internal server error' }, { status: 500 });
28+
return NextResponse.json(
29+
{ message: "Internal server error" },
30+
{ status: 500 }
31+
);
3032
}
3133
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
interface WeatherClientProps {
2+
isEnabled: boolean;
3+
}
4+
5+
export default function WeatherClient({ isEnabled }: WeatherClientProps) {
6+
return (
7+
<div>
8+
{isEnabled ? "Weather Widget Enabled" : "Weather Widget Disabled"}
9+
</div>
10+
);
11+
}

src/app/flags.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
"use server";
2+
3+
import { flag } from "flags/next";
4+
5+
export const weatherWidgetFlag = flag({
6+
key: "weather-widget",
7+
decide() {
8+
return Math.random() > 0.5; // Example logic for deciding the flag
9+
},
10+
});

src/app/page.tsx

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
1-
import Link from 'next/link';
1+
import { weatherWidgetFlag } from "./flags";
2+
import WeatherClient from "./components/WeatherClient";
3+
4+
export default async function Page() {
5+
const isWeatherWidgetEnabled = await weatherWidgetFlag();
26

3-
export default function Home() {
47
return (
5-
<div className="container">
8+
<div>
69
<h1>Welcome to Next.js + Playwright</h1>
7-
<Link href="/form">Go to Form</Link>
10+
<WeatherClient isEnabled={isWeatherWidgetEnabled} />
811
</div>
912
);
1013
}

0 commit comments

Comments
 (0)