presist user session

This commit is contained in:
João Geonizeli
2022-07-09 19:18:07 -03:00
parent 2f4607143d
commit 525ed04a71
4 changed files with 75 additions and 25 deletions

View File

@@ -11,20 +11,23 @@ import "./index.css";
import { LoginDialog } from "./components/LoginDialog";
import { UnautorizedBlock } from "./components/UnautorizedBlock";
import { NewAccount } from "./pages/NewAccount/NewAccount";
import { CookiesProvider } from "react-cookie";
function App() {
return (
<AuthProvider>
<Topbar />
<LoginDialog />
<Container>
<UnautorizedBlock
protectedContent={<Home />}
unauthenticatedContent={<NewAccount />}
/>
<Home />
</Container>
</AuthProvider>
<CookiesProvider>
<AuthProvider>
<Topbar />
<LoginDialog />
<Container>
<UnautorizedBlock
protectedContent={<Home />}
unauthenticatedContent={<NewAccount />}
/>
<Home />
</Container>
</AuthProvider>
</CookiesProvider>
);
}

View File

@@ -1,4 +1,5 @@
import { createContext, useCallback, useMemo, useState } from "react";
import { useCookies } from "react-cookie";
import { createApiClient } from "../utils/apiFetch";
type LoginCallback = (email: string, password: string) => void;
@@ -21,28 +22,38 @@ type AuthProviderProps = {
};
export const AuthProvider = ({ children, ...rest }: AuthProviderProps) => {
const [cookies, setCookie, removeCookie] = useCookies(["token"]);
const [loading] = useState(true);
const [token, setToken] = useState<AuthProviderValue["token"]>(null);
const [isLoginDialogOpen, setIsLoginDialogOpen] = useState(false);
const token = cookies.token;
const setToken = (value: string) => {
setCookie("token", value);
};
const removeToken = () => {
removeCookie("token");
};
const apiClient = createApiClient(token ?? "");
const login = useCallback<LoginCallback>((email, password) => {
apiClient("users/sign_in", {
method: "POST",
body: JSON.stringify({
email,
password,
}),
}).then(async (res) => {
setToken(await res.json());
});
}, [apiClient, setToken]);
const login = useCallback<LoginCallback>(
(email, password) => {
apiClient("users/sign_in", {
method: "POST",
body: JSON.stringify({
email,
password,
}),
}).then(async (res) => {
setToken(await res.json());
});
},
[apiClient, setToken]
);
const logout = useCallback<LogoutCallback>(() => {
apiClient("users/sign_out", {
method: "DELETE",
}).then(() => {
setToken(null);
removeToken();
});
}, [apiClient, setToken]);