Add recoil state

This commit is contained in:
Benjamin Sherriff
2023-10-20 07:36:10 -04:00
parent a1090e2a0f
commit 11facd9bad
3 changed files with 31 additions and 15 deletions

View File

@@ -1,23 +1,26 @@
'use client'; 'use client';
import { me } from '@/api/auth'; import { me } from '@/api/auth';
import { User } from '@/api/auth.types'; import React, { useEffect } from 'react';
import React, { useEffect, useState } from 'react';
import { useRouter } from 'next/navigation'; import { useRouter } from 'next/navigation';
import { useRecoilState } from 'recoil';
import { userState } from '@/state/auth';
export default function Page() { export default function Page() {
const [user, setUser] = useState<User | undefined>(undefined); const [user, setUser] = useRecoilState(userState);
const router = useRouter(); const router = useRouter();
useEffect(() => { useEffect(() => {
me().then((response) => { if (!user) {
if (response) { me().then((response) => {
setUser(response.user); if (response) {
} else { setUser(response.user);
router.push('/'); } else {
} router.push('/');
}); }
}, []); });
}
}, [user]);
if (user) { if (user) {
return <div>Logged in as {user.email}</div>; return <div>Logged in as {user.email}</div>;

View File

@@ -7,20 +7,21 @@ import { Avatar, Button, Card, Grid, Group, Menu, Text, UnstyledButton } from '@
import Cookies from 'js-cookie'; import Cookies from 'js-cookie';
import { useEffect, useState } from 'react'; import { useEffect, useState } from 'react';
import { logout, me, refreshLoggedIn } from '@/api/auth'; import { logout, me, refreshLoggedIn } from '@/api/auth';
import { User } from '@/api/auth.types';
import { useToggle } from '@mantine/hooks'; import { useToggle } from '@mantine/hooks';
import { HeaderModal } from './HeaderModal'; import { HeaderModal } from './HeaderModal';
import { HeaderItem, headerItems } from './headerItems'; import { HeaderItem, headerItems } from './headerItems';
import { userState } from '@/state/auth';
import { useRecoilState } from 'recoil';
export default function Header() { export default function Header() {
const pathName = usePathname(); const pathName = usePathname();
const [modalType, toggle] = useToggle([undefined, 'login', 'register', 'reset']); const [modalType, toggle] = useToggle([undefined, 'login', 'register', 'reset']);
const [headers, setHeaders] = useState<HeaderItem[]>([]); const [headers, setHeaders] = useState<HeaderItem[]>([]);
const [user, setUser] = useState<User | undefined>(undefined); const [user, setUser] = useRecoilState(userState);
const [refreshId, setRefreshId] = useState<NodeJS.Timeout | undefined>(undefined); const [refreshId, setRefreshId] = useState<NodeJS.Timeout | undefined>(undefined);
useEffect(() => { useEffect(() => {
if (Cookies.get('logged_in')) { if (!user && Cookies.get('logged_in')) {
me().then((response) => { me().then((response) => {
if (response) { if (response) {
setRefreshId(refreshLoggedIn()); setRefreshId(refreshLoggedIn());
@@ -28,7 +29,7 @@ export default function Header() {
} }
}); });
} }
}, []); }, [user]);
useEffect(() => { useEffect(() => {
const h: HeaderItem[] = []; const h: HeaderItem[] = [];

12
ui/src/state/auth.ts Normal file
View File

@@ -0,0 +1,12 @@
import { User } from '@/api/auth.types';
import { atom } from 'recoil';
export const userState = atom({
key: 'userState',
default: undefined as User | undefined
});
export const isAuthenticatedState = atom({
key: 'isAuthenticatedState',
default: false
});