Skip to content

Commit 97bd553

Browse files
committed
NT-19: fix keep me signin, add new spinner when loading app
1 parent 32ad873 commit 97bd553

File tree

6 files changed

+79
-4
lines changed

6 files changed

+79
-4
lines changed

src/App.tsx

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import { LoadingOverlay } from '@mantine/core';
1111
import { routeTree } from './routeTree.gen';
1212
import { theme } from './Theme';
1313
import { useAuthContext } from './hooks';
14+
import { Spinner } from './components/atoms/spinner/spinner';
1415

1516
const queryClient = new QueryClient();
1617

@@ -34,6 +35,16 @@ const customTheme = createTheme(theme);
3435

3536
function AppWithRouter() {
3637
const auth = useAuthContext();
38+
39+
if (auth.loading) {
40+
return (
41+
<LoadingOverlay
42+
overlayProps={{ color: 'var(--dark-bg-color)' }}
43+
loaderProps={{ children: <Spinner /> }}
44+
visible
45+
/>
46+
);
47+
}
3748
return <RouterProvider router={router} context={{ auth }} />;
3849
}
3950

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import classes from './styles.module.css';
2+
3+
export function Spinner() {
4+
return (
5+
<div className={classes.loader}>
6+
<div className={classes.outer}></div>
7+
<div className={classes.middle}></div>
8+
<div className={classes.inner}></div>
9+
</div>
10+
);
11+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
.loader {
2+
position: relative;
3+
}
4+
5+
.outer,
6+
.middle,
7+
.inner {
8+
border: 3px solid transparent;
9+
border-top-color: var(--primary);
10+
border-right-color: var(--primary);
11+
border-radius: 50%;
12+
position: absolute;
13+
top: 50%;
14+
left: 50%;
15+
}
16+
17+
.outer {
18+
width: 3.5em;
19+
height: 3.5em;
20+
margin-left: -1.75em;
21+
margin-top: -1.75em;
22+
animation: spin 2s linear infinite;
23+
}
24+
25+
.middle {
26+
width: 2.1em;
27+
height: 2.1em;
28+
margin-left: -1.05em;
29+
margin-top: -1.05em;
30+
animation: spin 1.75s linear reverse infinite;
31+
}
32+
33+
.inner {
34+
width: 0.8em;
35+
height: 0.8em;
36+
margin-left: -0.4em;
37+
margin-top: -0.4em;
38+
animation: spin 1.5s linear infinite;
39+
}
40+
41+
@keyframes spin {
42+
to {
43+
transform: rotate(360deg);
44+
}
45+
}

src/context/auth-context.tsx

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import {
88
updateProfile,
99
signOut,
1010
getAuth,
11-
inMemoryPersistence,
11+
browserLocalPersistence,
1212
setPersistence,
1313
sendEmailVerification
1414
} from 'firebase/auth';
@@ -23,11 +23,12 @@ export const AuthContext = createContext<TContextAuth | undefined>(undefined);
2323
export function AuthProvider({ children }) {
2424
const [user, setUser] = useState<User | null>(getAuth().currentUser);
2525
const [rememberMe, setRememberMe] = useState(false);
26+
const [loading, setLoading] = useState(true);
2627

2728
async function signIn(email: string, password: string) {
2829
try {
29-
if (!rememberMe) {
30-
await setPersistence(auth, inMemoryPersistence);
30+
if (rememberMe) {
31+
await setPersistence(auth, browserLocalPersistence);
3132
}
3233

3334
const userCredential = await signInWithEmailAndPassword(auth, email, password);
@@ -79,11 +80,14 @@ export function AuthProvider({ children }) {
7980
}
8081
// add modal to display errors => maybe a global modal to be reused for every errors
8182
useEffect(() => {
83+
setLoading(true);
8284
const unsubscribe = auth.onAuthStateChanged(user => {
8385
if (user) {
8486
setUser(user);
87+
setLoading(false);
8588
} else {
8689
setUser(null);
90+
setLoading(false);
8791
}
8892
});
8993
return unsubscribe;
@@ -94,7 +98,8 @@ export function AuthProvider({ children }) {
9498
signIn,
9599
signUp,
96100
signUserOut,
97-
setRememberMe
101+
setRememberMe,
102+
loading
98103
};
99104

100105
return <AuthContext.Provider value={value}>{children}</AuthContext.Provider>;

src/routes/_auth.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ import { createFileRoute, redirect } from '@tanstack/react-router';
33

44
export const Route = createFileRoute('/_auth')({
55
beforeLoad: async ({ context }) => {
6+
console.log('🚀 ~ context:', context.auth?.user);
7+
68
if (!context.auth?.user?.emailVerified) {
79
throw redirect({
810
to: RoutesDef.LOGIN

src/types/contexts.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,5 @@ export type TContextAuth = {
66
signUp: (email: string, password: string, displayName: string) => Promise<UserCredential>;
77
signUserOut: () => Promise<void>;
88
setRememberMe: React.Dispatch<React.SetStateAction<boolean>>
9+
loading: boolean;
910
};

0 commit comments

Comments
 (0)