Skip to content

Commit e283941

Browse files
committed
feat: nextjs-boostrap-demo
1 parent d0fb7da commit e283941

File tree

17 files changed

+394
-1
lines changed

17 files changed

+394
-1
lines changed
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"extends": "next/core-web-vitals"
3+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2+
3+
# dependencies
4+
/node_modules
5+
/.pnp
6+
.pnp.js
7+
.yarn/install-state.gz
8+
9+
# testing
10+
/coverage
11+
12+
# next.js
13+
/.next/
14+
/out/
15+
16+
# production
17+
/build
18+
19+
# misc
20+
.DS_Store
21+
*.pem
22+
23+
# debug
24+
npm-debug.log*
25+
yarn-debug.log*
26+
yarn-error.log*
27+
28+
# local env files
29+
.env*.local
30+
31+
# vercel
32+
.vercel
33+
34+
# typescript
35+
*.tsbuildinfo
36+
next-env.d.ts
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app).
2+
3+
The purpose of this project is to demonstrate usage integration with the Reflag React SDK.
4+
5+
## Getting Started
6+
7+
Run the development server:
8+
9+
```bash
10+
yarn dev
11+
```
25.3 KB
Binary file not shown.
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
@tailwind base;
2+
@tailwind components;
3+
@tailwind utilities;
4+
5+
:root {
6+
--foreground-rgb: 0, 0, 0;
7+
--background-start-rgb: 214, 219, 220;
8+
--background-end-rgb: 255, 255, 255;
9+
}
10+
11+
@media (prefers-color-scheme: dark) {
12+
:root {
13+
--foreground-rgb: 255, 255, 255;
14+
--background-start-rgb: 0, 0, 0;
15+
--background-end-rgb: 0, 0, 0;
16+
}
17+
}
18+
19+
body {
20+
color: rgb(var(--foreground-rgb));
21+
background: linear-gradient(
22+
to bottom,
23+
transparent,
24+
rgb(var(--background-end-rgb))
25+
)
26+
rgb(var(--background-start-rgb));
27+
}
28+
29+
@layer utilities {
30+
.text-balance {
31+
text-wrap: balance;
32+
}
33+
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import type { Metadata } from "next";
2+
import { Inter } from "next/font/google";
3+
import "./globals.css";
4+
import { Providers } from "@/components/Providers";
5+
import { ReflagClient as ReflagNodeClient } from "@reflag/node-sdk";
6+
7+
const inter = Inter({ subsets: ["latin"] });
8+
9+
export const metadata: Metadata = {
10+
title: "Create Next App",
11+
description: "Generated by create next app",
12+
};
13+
14+
const publishableKey = process.env.REFLAG_PUBLISHABLE_KEY || "";
15+
const secretKey = process.env.REFLAG_SECRET_KEY || "";
16+
17+
async function getBootstrappedFlags() {
18+
const serverClient = new ReflagNodeClient({
19+
secretKey,
20+
});
21+
await serverClient.initialize();
22+
23+
// In a real app, you'd get user/company from your auth system
24+
const flags = serverClient.getFlagsForBootstrap({
25+
user: {
26+
id: "demo-user",
27+
email: "demo-user@example.com",
28+
"optin-huddles": true,
29+
},
30+
company: { id: "demo-company", name: "Demo Company" },
31+
other: { source: "web" },
32+
});
33+
34+
return flags;
35+
}
36+
37+
export default async function RootLayout({
38+
children,
39+
}: Readonly<{
40+
children: React.ReactNode;
41+
}>) {
42+
const flags = await getBootstrappedFlags();
43+
44+
return (
45+
<html lang="en">
46+
<body className={inter.className}>
47+
<Providers publishableKey={publishableKey} flags={flags}>
48+
{children}
49+
</Providers>
50+
</body>
51+
</html>
52+
);
53+
}
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
import Image from "next/image";
2+
import { Flags } from "@/components/Flags";
3+
4+
export default function Home() {
5+
return (
6+
<main className="flex min-h-screen flex-col items-center justify-between p-24">
7+
<div className="z-10 w-full max-w-5xl items-center justify-between font-mono text-sm lg:flex">
8+
<div className="fixed bottom-0 left-0 flex h-48 w-full items-end justify-center bg-gradient-to-t from-white via-white dark:from-black dark:via-black lg:static lg:size-auto lg:bg-none">
9+
<a
10+
className="pointer-events-none flex place-items-center gap-2 p-8 lg:pointer-events-auto lg:p-0"
11+
href="https://vercel.com?utm_source=create-next-app&utm_medium=appdir-template&utm_campaign=create-next-app"
12+
target="_blank"
13+
rel="noopener noreferrer"
14+
>
15+
By{" "}
16+
<Image
17+
src="/vercel.svg"
18+
alt="Vercel Logo"
19+
className="dark:invert"
20+
width={100}
21+
height={24}
22+
priority
23+
/>
24+
</a>
25+
</div>
26+
</div>
27+
28+
<div className="relative z-[-1] flex place-items-center before:absolute before:h-[300px] before:w-full before:-translate-x-1/2 before:rounded-full before:bg-gradient-radial before:from-white before:to-transparent before:blur-2xl before:content-[''] after:absolute after:-z-20 after:h-[180px] after:w-full after:translate-x-1/3 after:bg-gradient-conic after:from-sky-200 after:via-blue-200 after:blur-2xl after:content-[''] before:dark:bg-gradient-to-br before:dark:from-transparent before:dark:to-blue-700 before:dark:opacity-10 after:dark:from-sky-900 after:dark:via-[#0141ff] after:dark:opacity-40 sm:before:w-[480px] sm:after:w-[240px] before:lg:h-[360px]">
29+
<Image
30+
className="relative dark:drop-shadow-[0_0_0.3rem_#ffffff70] dark:invert"
31+
src="/next.svg"
32+
alt="Next.js Logo"
33+
width={180}
34+
height={37}
35+
priority
36+
/>
37+
</div>
38+
39+
<Flags />
40+
41+
<div className="mb-32 grid text-center lg:mb-0 lg:w-full lg:max-w-5xl lg:grid-cols-4 lg:text-left">
42+
<a
43+
href="https://nextjs.org/docs?utm_source=create-next-app&utm_medium=appdir-template&utm_campaign=create-next-app"
44+
className="group rounded-lg border border-transparent px-5 py-4 transition-colors hover:border-gray-300 hover:bg-gray-100 hover:dark:border-neutral-700 hover:dark:bg-neutral-800/30"
45+
target="_blank"
46+
rel="noopener noreferrer"
47+
>
48+
<h2 className="mb-3 text-2xl font-semibold">
49+
Docs{" "}
50+
<span className="inline-block transition-transform group-hover:translate-x-1 motion-reduce:transform-none">
51+
-&gt;
52+
</span>
53+
</h2>
54+
<p className="m-0 max-w-[30ch] text-sm opacity-50">
55+
Find in-depth information about Next.js features and API.
56+
</p>
57+
</a>
58+
59+
<a
60+
href="https://nextjs.org/learn?utm_source=create-next-app&utm_medium=appdir-template-tw&utm_campaign=create-next-app"
61+
className="group rounded-lg border border-transparent px-5 py-4 transition-colors hover:border-gray-300 hover:bg-gray-100 hover:dark:border-neutral-700 hover:dark:bg-neutral-800/30"
62+
target="_blank"
63+
rel="noopener noreferrer"
64+
>
65+
<h2 className="mb-3 text-2xl font-semibold">
66+
Learn{" "}
67+
<span className="inline-block transition-transform group-hover:translate-x-1 motion-reduce:transform-none">
68+
-&gt;
69+
</span>
70+
</h2>
71+
<p className="m-0 max-w-[30ch] text-sm opacity-50">
72+
Learn about Next.js in an interactive course with&nbsp;quizzes!
73+
</p>
74+
</a>
75+
76+
<a
77+
href="https://vercel.com/templates?framework=next.js&utm_source=create-next-app&utm_medium=appdir-template&utm_campaign=create-next-app"
78+
className="group rounded-lg border border-transparent px-5 py-4 transition-colors hover:border-gray-300 hover:bg-gray-100 hover:dark:border-neutral-700 hover:dark:bg-neutral-800/30"
79+
target="_blank"
80+
rel="noopener noreferrer"
81+
>
82+
<h2 className="mb-3 text-2xl font-semibold">
83+
Templates{" "}
84+
<span className="inline-block transition-transform group-hover:translate-x-1 motion-reduce:transform-none">
85+
-&gt;
86+
</span>
87+
</h2>
88+
<p className="m-0 max-w-[30ch] text-sm opacity-50">
89+
Explore starter templates for Next.js.
90+
</p>
91+
</a>
92+
93+
<a
94+
href="https://vercel.com/new?utm_source=create-next-app&utm_medium=appdir-template&utm_campaign=create-next-app"
95+
className="group rounded-lg border border-transparent px-5 py-4 transition-colors hover:border-gray-300 hover:bg-gray-100 hover:dark:border-neutral-700 hover:dark:bg-neutral-800/30"
96+
target="_blank"
97+
rel="noopener noreferrer"
98+
>
99+
<h2 className="mb-3 text-2xl font-semibold">
100+
Deploy{" "}
101+
<span className="inline-block transition-transform group-hover:translate-x-1 motion-reduce:transform-none">
102+
-&gt;
103+
</span>
104+
</h2>
105+
<p className="m-0 max-w-[30ch] text-balance text-sm opacity-50">
106+
Instantly deploy your Next.js site to a shareable URL with Vercel.
107+
</p>
108+
</a>
109+
</div>
110+
</main>
111+
);
112+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
"use client";
2+
3+
import React from "react";
4+
import { useFlag } from "@reflag/react-sdk";
5+
6+
export const Flags = () => {
7+
const { isEnabled } = useFlag("huddles");
8+
return (
9+
<div className="border border-gray-300 p-6 rounded-xl dark:border-neutral-800 dark:bg-zinc-800/30">
10+
<h3 className="text-xl mb-4">Huddles feature enabled:</h3>
11+
<pre>
12+
<code className="font-mono font-bold">{JSON.stringify(isEnabled)}</code>
13+
</pre>
14+
</div>
15+
);
16+
};
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
"use client";
2+
3+
import React, { ReactNode } from "react";
4+
import {
5+
BootstrappedFlags,
6+
ReflagBootstrappedProvider,
7+
} from "@reflag/react-sdk";
8+
9+
type Props = {
10+
publishableKey: string;
11+
flags: BootstrappedFlags;
12+
children: ReactNode;
13+
};
14+
15+
export const Providers = ({ publishableKey, flags, children }: Props) => {
16+
return (
17+
<ReflagBootstrappedProvider publishableKey={publishableKey} flags={flags}>
18+
{children}
19+
</ReflagBootstrappedProvider>
20+
);
21+
};
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
/** @type {import('next').NextConfig} */
2+
const nextConfig = {};
3+
4+
export default nextConfig;

0 commit comments

Comments
 (0)