import { jwtDecode, JwtPayload } from "jwt-decode"; import { useEffect, useState } from "react"; import { apiAuth, baseUrl } from "./api"; import { useNavigate } from "react-router"; import { Eye, EyeSlash } from "./Icons"; import { useSession } from "./Session"; interface SetPassToken extends JwtPayload { name: string; } export const SetPassword = () => { const [name, setName] = useState("after getting your token."); const [username, setUsername] = useState(""); const [currentPassword, setCurrentPassword] = useState(""); const [password, setPassword] = useState(""); const [passwordr, setPasswordr] = useState(""); const [token, setToken] = useState(""); const [error, setError] = useState(""); const [loading, setLoading] = useState(false); const [visible, setVisible] = useState(false); const navigate = useNavigate(); const { user } = useSession(); useEffect(() => { if (user) { setUsername(user.username); setName(user.display_name); } else { const params = new URLSearchParams(window.location.search); const token = params.get("token"); if (token) { setToken(token); try { const payload = jwtDecode(token); if (payload.name) setName(payload.name); else if (payload.sub) setName(payload.sub); else setName("Mr. I-have-no Token"); payload.sub && setUsername(payload.sub); } catch (InvalidTokenError) { setName("Mr. I-have-no-valid Token"); } } } }, []); async function handleSubmit(e: React.FormEvent) { e.preventDefault(); if (password === passwordr) { setLoading(true); if (user) { const resp = await apiAuth( "player/change_password", { current_password: currentPassword, new_password: password }, "POST" ); setLoading(false); if (resp.detail) setError(resp.detail); else { setError(resp); setTimeout(() => navigate("/"), 2000); } } else { const req = new Request(`${baseUrl}api/set_password`, { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ token: token, password: password }), }); let resp: Response; try { resp = await fetch(req); } catch (e) { throw new Error(`request failed: ${e}`); } setLoading(false); if (resp.ok) { console.log(resp); navigate("/", { replace: true, state: { username: username, password: password }, }); } if (!resp.ok) { if (resp.status === 401) { const { detail } = await resp.json(); if (detail) setError(detail); else setError("unauthorized"); throw new Error("Unauthorized"); } } } } else setError("passwords are not the same"); } return ( <> {user ? (

change your password

) : (

set your password,
{name}

)} {!user && username && ( your username is: {username} )}
{user && (
{ setError(""); setCurrentPassword(evt.target.value); }} />
)}
{ setError(""); setPassword(evt.target.value); }} />
{ setError(""); setPasswordr(evt.target.value); }} />
setVisible(!visible)} > {visible ? : }
{error && {error}}
{loading && } ); };