import React, { useState, useEffect } from "react"; import PropTypes from "prop-types"; import { Redirect, withRouter } from "react-router-dom"; import * as config from "../../config"; import * as util from "../util"; // Components import Home from "./Home"; import Channel from "./Channel"; import Settings from "./Settings"; import Messages from "../common/Messages"; import Header from "../common/Header"; import SignIn from "./modals/SignIn"; import SignUp from "./modals/SignUp"; // Mock data import { mockStreams } from "../../__test__/mocks/streams-mocks"; const Layout = (props) => { const [signedIn, setSignedIn] = useState(false); const [checkedAuth, setCheckedAuth] = useState(false); const [auth, setAuth] = useState({}); const [userInfo, setUserInfo] = useState({}); const [showSignedIn, setShowSignedIn] = useState(false); const [showSignedUp, setShowSignedUp] = useState(false); const [showMessage, setShowMessage] = useState(false); const [messageType, setMessageType] = useState(""); const [message, setMessage] = useState(""); useEffect(() => { // Global keybinds document.addEventListener("keydown", handleKeyDown); // Get User Auth Data const auth = util.getWithExpiry("ugc"); if (auth && Object.keys(auth).length) { setUserAuth(auth); getUserInfo(auth); getUserStreamInfo(auth); } else { setCheckedAuth(true); } return () => { document.removeEventListener("keydown", handleKeyDown); }; }, []); const getUserInfo = async (auth) => { try { const baseUrl = util.getApiUrlBase(); const url = `${baseUrl}user/username?access_token=${auth.AccessToken}`; const response = await fetch(url); if (response.status === 200) { const json = await response.json(); handleUserInfo(json); } else { throw new Error("Unable to get user information."); } } catch (error) { console.log(error.message); } }; const getUserStreamInfo = async (auth) => { try { const baseUrl = util.getApiUrlBase(); const url = `${baseUrl}stream?access_token=${auth.AccessToken}`; const response = await fetch(url); if (response.status === 200) { const json = await response.json(); setUserInfo((prev) => ({ ...prev, ...json })); } else { throw new Error("Unable to get user stream information."); } } catch (error) { console.log(error.message); } }; const changeAttribute = async (auth, name, key, value) => { try { const baseUrl = util.getApiUrlBase(); const url = `${baseUrl}user/attr?access_token=${encodeURIComponent( auth.AccessToken )}`; const options = { method: "PUT", body: JSON.stringify({ Name: key, Value: value, }), }; const response = await fetch(url, options); if (response.status === 200) { onSuccess(`${name} changed`); getUserInfo(auth); } else { throw new Error(`Unable to change ${name}`); } } catch (error) { console.log(error.message); onFailure(`Unable to change ${name}`); } }; const handleKeyDown = (e) => { if (e.keyCode === 27) { // keyCode 27 is Escape key if (showMessage) { setShowMessage(false); } } }; const handleSignOut = () => { util.removeSession("ugc"); location.reload(); }; const onSuccess = (message) => { setShowMessage(true); setMessageType("success"); setMessage(message); setTimeout(() => { setShowMessage(false); }, 5000); }; const onFailure = (message) => { setShowMessage(true); setMessageType("error"); setMessage(message); setTimeout(() => { setShowMessage(false); }, 5000); }; const showSignIn = () => { setShowSignedIn(true); }; const showSignUp = () => { setShowSignedUp(true); }; const closeSignIn = () => { setShowSignedIn(false); }; const closeSignUp = () => { setShowSignedUp(false); }; const handleUserInfo = (data) => { setSignedIn(true); setUserInfo((prev) => ({ ...prev, ...data })); setCheckedAuth(true); }; const setUserAuth = (auth) => { setAuth(auth); setCheckedAuth(false); }; const closeSettings = (isDeleteAccount) => { if (isDeleteAccount) { handleSignOut(); } }; // The logged-in user's info const { avatar, username } = userInfo; const userAvatarUrl = util.getAvatarUrl(avatar); // The current URL path from react-router const currentPath = props.location; // Render components based on route const { page } = props; const pageComponent = () => { switch (page) { case "CHANNEL": return ( ); case "SETTINGS": if (signedIn) { return ( ); } else { return ; } default: return ( ); } }; return (
{pageComponent()} {showSignedIn && ( )} {showSignedUp && ( )} ); }; export default withRouter(Layout); Layout.propTypes = { location: PropTypes.object, page: PropTypes.string, };