import React, { createContext, useEffect, useState } from "react"; import { createRoot } from "react-dom/client"; import { BrowserRouter as Router, Routes, Route, useNavigationType } from "react-router-dom"; import useWebSocket from "react-use-websocket"; import axios from "axios"; import { Footer, Header } from "./components"; import { HomePage, RestaurantPage, NotFoundPage } from "./views"; import "bootstrap/dist/css/bootstrap.min.css"; import "./styles/index.css"; const socketUrl = `${process.env.REACT_APP_SOCKET_URL}/ws`; export const User = createContext(null); export default function App() { const [restaurantsList, setRestaurantsList] = useState([]); const [selection, setSelection] = useState(null); const [loading, setLoading] = useState(true); const [reload, setReload] = useState(true); const [user, setUser] = useState(localStorage.getItem("user")); const { lastMessage } = useWebSocket(socketUrl, { shouldReconnect: () => true, }); useEffect(() => { if (reload) { axios .get(`${process.env.REACT_APP_BASE_URL_BACK}/restaurants`) .then((res) => { setRestaurantsList(res.data); setLoading(false); setReload(false); }) .catch((e) => { console.log(e); setLoading(false); setReload(false); }); } }, [reload]); useEffect(() => { window.addEventListener("popstate", () => setReload(true)); let path = window.location.pathname.split("/"); if (restaurantsList && path.length >= 2 && path[1]) { let name = decodeURIComponent(path[1]); let filter = restaurantsList.filter((restaurant) => restaurant.name == name); if (filter) { setSelection(filter[0]); } } else { setSelection(null); } return () => window.removeEventListener("popstate", () => setReload(true)); }, [restaurantsList]); useEffect(() => { if (lastMessage?.data) { let new_message = JSON.parse(lastMessage.data); if (new_message.type == "data") { setReload(true); } } }, [lastMessage]); return ( <div className="app"> <User.Provider value={[user, setUser]}> <Router> <Header {...{ selection, setSelection }} /> <div className="page"> <Routes> <Route exact path="/" element={<HomePage {...{ restaurantsList, setSelection, loading }} />} /> <Route path="/:restaurant" element={<RestaurantPage {...{ selection, setSelection, lastMessage }} />} /> <Route path="*" element={<NotFoundPage />} /> </Routes> </div> </Router> <Footer /> </User.Provider> </div> ); } const container = document.getElementById("root"); const root = createRoot(container); root.render(<App />);