Skip to content

Commit

Permalink
Add recoil to app. Update to track auth using global state.
Browse files Browse the repository at this point in the history
  • Loading branch information
jbouder committed Jul 12, 2024
1 parent aa487c8 commit 68f03e1
Show file tree
Hide file tree
Showing 10 changed files with 106 additions and 12 deletions.
27 changes: 26 additions & 1 deletion package-lock.json

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

3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@
"next": "latest",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-hook-form": "^7.52.1"
"react-hook-form": "^7.52.1",
"recoil": "0.7.7"
},
"devDependencies": {
"@svgr/webpack": "^8.1.0",
Expand Down
13 changes: 8 additions & 5 deletions src/app/layout.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { Footer } from "@components/footer/footer";
import { Header } from "@components/header/header";
import { Metadata } from "next";
import RecoilContextProvider from "src/providers/recoil-context-provider";

export const metadata: Metadata = {
title: "Starter App - Next",
Expand All @@ -18,11 +19,13 @@ export default function RootLayout({
return (
<html lang="en">
<body>
<Header />
<main id="mainSection" className="usa-section">
{children}
</main>
<Footer />
<RecoilContextProvider>
<Header />
<main id="mainSection" className="usa-section">
{children}
</main>
<Footer />
</RecoilContextProvider>
</body>
</html>
);
Expand Down
8 changes: 6 additions & 2 deletions src/app/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,19 @@
import { Alert } from "@components/comet";
import "./styles.scss";
import useAuth from "@hooks/use-auth";
import { getDisplayName } from "@utils/auth";

export default function Home() {
const { isSignedIn } = useAuth();
const { isSignedIn, currentUserData } = useAuth();

return (
<div className="grid-container">
<div className="grid-row">
<div className="grid-col">
<h1>Welcome Guest</h1>
<h1>
Welcome{" "}
{currentUserData ? getDisplayName(currentUserData) : "Guest"}
</h1>
</div>
</div>
{!isSignedIn && (
Expand Down
9 changes: 9 additions & 0 deletions src/data/user.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import { User } from "../types/user";

export const userData: User = {
firstName: "John",
lastName: "Doe",
displayName: "John Doe",
emailAddress: "johndoe@test.com",
phoneNumber: "123-456-7890",
};
15 changes: 12 additions & 3 deletions src/hooks/use-auth.ts
Original file line number Diff line number Diff line change
@@ -1,20 +1,29 @@
import { useState } from "react";
import { currentUser, signedIn } from "../store";
import { useRecoilState } from "recoil";
import { User } from "../types/user";
import { userData } from "../data/user";

const useAuth = () => {
const [isSignedIn, setIsSignedIn] = useState(false);
const [error] = useState("");
const [isSignedIn, setIsSignedIn] = useRecoilState<boolean>(signedIn);
const [error] = useState<string | null>();
const [currentUserData, setCurrentUserData] = useRecoilState<
User | undefined
>(currentUser);

const signIn = () => {
console.log("Sign in");
setIsSignedIn(true);
setCurrentUserData(userData);
};

const signOut = () => {
console.log("Sign out");
setIsSignedIn(false);
setCurrentUserData({} as User);
};

return { isSignedIn, error, signIn, signOut };
return { isSignedIn, currentUserData, error, signIn, signOut };
};

export default useAuth;
9 changes: 9 additions & 0 deletions src/providers/recoil-context-provider.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
"use client";
import React from "react";
import { RecoilRoot } from "recoil";

const RecoilContextProvider = ({ children }) => {
return <RecoilRoot>{children}</RecoilRoot>;
};

export default RecoilContextProvider;
14 changes: 14 additions & 0 deletions src/store.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { User } from "./types/user";
import { atom } from "recoil";

const signedIn = atom({
key: "signedIn",
default: false,
});

const currentUser = atom<User | undefined>({
key: "currentUser",
default: undefined,
});

export { currentUser, signedIn };
7 changes: 7 additions & 0 deletions src/types/user.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
export interface User {
firstName: string | undefined;
lastName: string | undefined;
displayName: string | undefined;
emailAddress: string | undefined;
phoneNumber: string | undefined;
}
13 changes: 13 additions & 0 deletions src/utils/auth.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { User } from "../types/user";

export const getDisplayName = (user: User): string => {
if (user.displayName) {
return user.displayName;
} else if (user.firstName && user.lastName) {
return `${user.firstName} ${user.lastName}`;
} else if (user.firstName && !user.lastName) {
return user.firstName;
} else {
return "";
}
};

0 comments on commit 68f03e1

Please sign in to comment.