Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,14 @@
NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY=pk_test_placeholder
CLERK_SECRET_KEY=sk_test_placeholder

# Clerk Custom Auth Pages
NEXT_PUBLIC_CLERK_SIGN_IN_URL=/sign-in
NEXT_PUBLIC_CLERK_SIGN_UP_URL=/sign-up

# Clerk Redirect After Auth
NEXT_PUBLIC_CLERK_AFTER_SIGN_IN_URL=/dashboard
NEXT_PUBLIC_CLERK_AFTER_SIGN_UP_URL=/dashboard

# -----------------------------
# Stripe
# -----------------------------
Expand Down
10 changes: 1 addition & 9 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,4 @@ jobs:
run: npm run lint

- name: Type check
run: npx tsc --noEmit

- name: Build
run: npm run build
env:
# Dummy values for build (not used at runtime)
NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY: pk_test_placeholder
NEXT_PUBLIC_APP_URL: https://replimap.com
NEXT_PUBLIC_API_URL: https://api.replimap.com
run: npx tsc --noEmit
3 changes: 3 additions & 0 deletions eslint.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@ const compat = new FlatCompat({
});

const eslintConfig = [
{
ignores: [".next/**", ".source/**", "node_modules/**"],
},
...compat.extends("next/core-web-vitals", "next/typescript"),
];

Expand Down
173 changes: 173 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
"lint": "eslint ."
},
"dependencies": {
"@clerk/nextjs": "^6.36.7",
"@clerk/themes": "^2.4.47",
"@hookform/resolvers": "^3.10.0",
"@radix-ui/react-accordion": "1.2.2",
"@radix-ui/react-alert-dialog": "1.1.4",
Expand Down
7 changes: 7 additions & 0 deletions src/app/(auth)/layout.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
export default function AuthLayout({
children,
}: {
children: React.ReactNode;
}) {
return <div className="min-h-screen bg-background">{children}</div>;
}
19 changes: 19 additions & 0 deletions src/app/(auth)/sign-in/[[...sign-in]]/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import { SignIn } from "@clerk/nextjs";

// Force dynamic rendering - Clerk components require runtime
export const dynamic = "force-dynamic";

export default function SignInPage() {
return (
<div className="min-h-screen flex items-center justify-center bg-background">
<SignIn
appearance={{
elements: {
rootBox: "mx-auto",
card: "bg-[#030712] border border-slate-800 shadow-2xl",
},
}}
/>
</div>
);
}
19 changes: 19 additions & 0 deletions src/app/(auth)/sign-up/[[...sign-up]]/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import { SignUp } from "@clerk/nextjs";

// Force dynamic rendering - Clerk components require runtime
export const dynamic = "force-dynamic";

export default function SignUpPage() {
return (
<div className="min-h-screen flex items-center justify-center bg-background">
<SignUp
appearance={{
elements: {
rootBox: "mx-auto",
card: "bg-[#030712] border border-slate-800 shadow-2xl",
},
}}
/>
</div>
);
}
14 changes: 14 additions & 0 deletions src/app/dashboard/layout.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { Header } from "@/components/header";

export default function DashboardLayout({
children,
}: {
children: React.ReactNode;
}) {
return (
<>
<Header />
{children}
</>
);
}
52 changes: 52 additions & 0 deletions src/app/dashboard/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
import { currentUser } from "@clerk/nextjs/server";
import { redirect } from "next/navigation";

// Force dynamic rendering - this page requires auth
export const dynamic = "force-dynamic";

export default async function DashboardPage() {
const user = await currentUser();

if (!user) {
redirect("/sign-in");
}

const displayName =
user.firstName || user.emailAddresses[0]?.emailAddress || "User";

return (
<div className="min-h-screen bg-background pt-20">
<div className="max-w-7xl mx-auto px-4 py-8">
<h1 className="text-3xl font-bold text-foreground mb-2">
Welcome, {displayName}
</h1>
<p className="text-muted-foreground mb-8">Your RepliMap Dashboard</p>

<div className="grid grid-cols-1 md:grid-cols-3 gap-6">
<div className="p-6 rounded-lg border border-border bg-card">
<h3 className="font-semibold text-foreground mb-2">License</h3>
<p className="text-2xl font-bold text-emerald-400">Free Tier</p>
<p className="text-sm text-muted-foreground mt-1">
3 scans remaining this month
</p>
</div>

<div className="p-6 rounded-lg border border-border bg-card">
<h3 className="font-semibold text-foreground mb-2">Usage</h3>
<p className="text-2xl font-bold text-foreground">0 Scans</p>
<p className="text-sm text-muted-foreground mt-1">
0 resources analyzed
</p>
</div>

<div className="p-6 rounded-lg border border-border bg-card">
<h3 className="font-semibold text-foreground mb-2">Quick Start</h3>
<code className="text-sm text-emerald-400 bg-slate-900 px-3 py-2 rounded block">
pip install replimap
</code>
</div>
</div>
</div>
</div>
);
}
Loading