UNTESTED integration between Login component and the main application wrapper

This commit is contained in:
Zhongheng Liu 2024-01-18 09:33:10 +02:00
commit 5e455455cb
No known key found for this signature in database
2 changed files with 78 additions and 51 deletions

View file

@ -4,18 +4,27 @@ import "./App.css";
import { LangType, Message } from "./Chat/messageTypes"; import { LangType, Message } from "./Chat/messageTypes";
import { MessageContainer } from "./Chat/MessageContainer"; import { MessageContainer } from "./Chat/MessageContainer";
import strings from "./Intl/strings.json"; import strings from "./Intl/strings.json";
import { LangContext, LoginType } from "./context"; import { LangContext, LoginContext, LoginType } from "./context";
import { contentTypes, domain, endpoints, port } from "./consts"; import { contentTypes, domain, endpoints, port } from "./consts";
import { Login } from "./Login/Login";
// what we "in the business" call type gymnastics // what we "in the business" call type gymnastics
const Wrapper = (): React.ReactElement => { const Wrapper = (): React.ReactElement => {
const [lang, setLang] = useState<LangType>("en_US"); const [lang, setLang] = useState<LangType>("en_US");
const [login, setLogin] = useState<LoginType | undefined>(undefined);
return ( return (
<LangContext.Provider value={lang}> <LangContext.Provider value={lang}>
<LoginContext.Provider value={login}>
<Login
setLogin={(value) => {
setLogin(value);
}}
></Login>
<App <App
changeLang={(value: string) => { changeLang={(value: string) => {
setLang(value as LangType); setLang(value as LangType);
}} }}
/> />
</LoginContext.Provider>
</LangContext.Provider> </LangContext.Provider>
); );
}; };
@ -45,9 +54,9 @@ const App = ({
}: { }: {
changeLang: (value: string) => void; changeLang: (value: string) => void;
}): React.ReactElement => { }): React.ReactElement => {
const [login, setLogin] = useState<LoginType | undefined>(undefined);
const [username, setUsername] = useState<string>(); const [username, setUsername] = useState<string>();
const [messages, setMessages] = useState<Message[]>([]); const [messages, setMessages] = useState<Message[]>([]);
const login = useContext(LoginContext);
const lang = useContext(LangContext); const lang = useContext(LangContext);
const home = strings[lang].homepage; const home = strings[lang].homepage;
// TODO refine setName logic -- move to Login handler // TODO refine setName logic -- move to Login handler
@ -77,6 +86,9 @@ const App = ({
} }
setUsername(newName); setUsername(newName);
} }
if (!login) {
return <></>;
} else
return ( return (
<div className="App"> <div className="App">
<h1>{home.title}</h1> <h1>{home.title}</h1>
@ -105,7 +117,9 @@ const App = ({
if (responseBody.success) { if (responseBody.success) {
setUsername(newUsername as string); setUsername(newUsername as string);
} else { } else {
console.error("Server POST message failed."); console.error(
"Server POST message failed."
);
alert( alert(
"The server encountered an internal error." "The server encountered an internal error."
); );

View file

@ -6,7 +6,7 @@ const encrypt = (rawPasswordString: string) => {
// TODO Encryption method stub // TODO Encryption method stub
return rawPasswordString; return rawPasswordString;
}; };
const Login = ({ export const Login = ({
setLogin, setLogin,
}: { }: {
setLogin: (newLogin: LoginType) => void; setLogin: (newLogin: LoginType) => void;
@ -40,12 +40,14 @@ const Login = ({
} }
}); });
}; };
// login button press handler
const loginHandler = () => { const loginHandler = () => {
const uname = (document.getElementById("username") as HTMLInputElement) const uname = (document.getElementById("username") as HTMLInputElement)
.value; .value;
const passwd = encrypt( const passwd = encrypt(
(document.getElementById("passwd") as HTMLInputElement).value (document.getElementById("passwd") as HTMLInputElement).value
); );
// async invocation of Fetch API
fetch(`http://${domain}:${port}${endpoints.user}?user=${uname}`, { fetch(`http://${domain}:${port}${endpoints.user}?user=${uname}`, {
method: "GET", method: "GET",
}) })
@ -54,6 +56,17 @@ const Login = ({
const user = userObject as User; const user = userObject as User;
const validLogin = passwd === user.passwordHash; const validLogin = passwd === user.passwordHash;
if (!validLogin) { if (!validLogin) {
// login invalid
setValid(false); // triggers page re-render -- should refresh the page
} else {
// login valid
const validUntilDate: Date = new Date();
validUntilDate.setHours(validUntilDate.getHours() + 2);
setLogin({
username: user.userName,
lastSeen: user.lastSeen,
validUntil: validUntilDate.getUTCMilliseconds(),
});
} }
}); });
}; };