Skip to content

Commit f82b357

Browse files
initial setup with auth check
1 parent 6c9092c commit f82b357

File tree

15 files changed

+4559
-153
lines changed

15 files changed

+4559
-153
lines changed

Diff for: app/root.tsx

+24-1
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,14 @@ import {
33
Links,
44
Meta,
55
Outlet,
6+
redirect,
67
Scripts,
78
ScrollRestoration,
89
} from "react-router";
910

10-
import type { Route } from "./+types/root";
1111
import "./app.css";
12+
import type { Route } from "./+types/root";
13+
import { getCookiesFromRequest } from "./utils/cookie-utils";
1214

1315
export const links: Route.LinksFunction = () => [
1416
{ rel: "preconnect", href: "https://fonts.googleapis.com" },
@@ -73,3 +75,24 @@ export function ErrorBoundary({ error }: Route.ErrorBoundaryProps) {
7375
</main>
7476
);
7577
}
78+
79+
// Check authentication in server side loader
80+
export async function loader({ request }: Route.LoaderArgs) {
81+
const cookies = getCookiesFromRequest(request);
82+
83+
const protectedRoutes = ["/dashboard", "/profile", "/"];
84+
const authRoutes = ["/login", "/signup"];
85+
const url = new URL(request.url);
86+
87+
let isAuthenticated = cookies?.access_token ? true : false;
88+
89+
if (protectedRoutes.includes(url.pathname) && !isAuthenticated) {
90+
return redirect("/login");
91+
}
92+
93+
if (authRoutes.includes(url.pathname) && isAuthenticated) {
94+
return redirect("/");
95+
}
96+
97+
return { message: "Hello, world!" };
98+
}

Diff for: app/routes.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1-
import { type RouteConfig, index } from "@react-router/dev/routes";
1+
import { type RouteConfig } from "@react-router/dev/routes";
2+
import { flatRoutes } from "@react-router/fs-routes";
23

3-
export default [index("routes/home.tsx")] satisfies RouteConfig;
4+
export default flatRoutes() satisfies RouteConfig;

Diff for: app/routes/_auth.login/route.tsx

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import React from "react";
2+
3+
const LoginRoute = () => {
4+
return <div>LoginRoute</div>;
5+
};
6+
7+
export default LoginRoute;

Diff for: app/routes/_auth.signup/route.tsx

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import React from "react";
2+
3+
const SignupRoute = () => {
4+
return <div>SignupRoute</div>;
5+
};
6+
7+
export default SignupRoute;

Diff for: app/routes/_auth/route.tsx

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import React from "react";
2+
import { Outlet } from "react-router";
3+
4+
const AuthLayout = () => {
5+
return (
6+
<div>
7+
<h1>AuthLayout</h1>
8+
<Outlet />
9+
</div>
10+
);
11+
};
12+
13+
export default AuthLayout;

Diff for: app/routes/_index.tsx

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import type { Route } from "../+types/root";
2+
3+
export function meta({}: Route.MetaArgs) {
4+
return [
5+
{ title: "Expense Tracker" },
6+
{ name: "description", content: "Expense Tracker" },
7+
];
8+
}
9+
10+
export default function Home() {
11+
return (
12+
<div className="text-center space-y-4 p-4">
13+
<h1 className="text-2xl">Welcome to Home</h1>
14+
<button className="px-4 py-2 bg-red-500">logout</button>
15+
</div>
16+
);
17+
}

Diff for: app/routes/_main.dashboard/route.tsx

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import React from "react";
2+
3+
const DashboardRoute = () => {
4+
return (
5+
<div>
6+
<h1>Welcome to Dashboard</h1>
7+
</div>
8+
);
9+
};
10+
11+
export default DashboardRoute;

Diff for: app/routes/_main/route.tsx

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import React from "react";
2+
import { Outlet } from "react-router";
3+
4+
const MainLayout = () => {
5+
return (
6+
<div>
7+
<h1>MainLayout</h1>
8+
<Outlet />
9+
</div>
10+
);
11+
};
12+
13+
export default MainLayout;

Diff for: app/routes/home.tsx

-13
This file was deleted.

Diff for: app/utils/cookie-utils.ts

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import type { Route } from "../+types/root";
2+
3+
export const getCookiesFromRequest = (
4+
request: Route.LoaderArgs["request"]
5+
): Record<string, string> | undefined => {
6+
const cookieHeaders = request.headers.get("Cookie");
7+
8+
const cookies = cookieHeaders
9+
?.split("; ")
10+
.map((cookie) => cookie.split("="))
11+
.reduce((acc, [key, value]) => ({ ...acc, [key]: value }), {});
12+
13+
return cookies;
14+
};
15+
16+
export const removeCookie = (name: string) => {
17+
document.cookie = `${name}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;`;
18+
};
19+
20+
export const getCookie = (name: string) => {
21+
const value = `; ${document.cookie}`;
22+
const parts = value.split(`; ${name}=`);
23+
if (parts.length === 2) return parts.pop()?.split(";").shift();
24+
};

Diff for: app/welcome/logo-dark.svg

-23
This file was deleted.

Diff for: app/welcome/logo-light.svg

-23
This file was deleted.

0 commit comments

Comments
 (0)