|
|
|
|
| import base64
|
| from streamlit_option_menu import option_menu
|
| import uvicorn
|
| from api import api
|
| from multiprocessing import Process
|
| from pathlib import Path
|
| import streamlit as st
|
|
|
| from views.home import home_page
|
| from views.dashboard import dashboard_page
|
| from views.aide_telephonique import aide_telephonique_page
|
| from views.admin import adm_page
|
|
|
| APP_TITLE = "SmartRescue"
|
| API_PORT = 8901
|
|
|
| logopath = Path(__file__).parent.parent / "assets" / "logo.png"
|
| icopath = Path(__file__).parent.parent / "assets" / "icone.png"
|
|
|
| st.set_page_config(
|
| page_title=APP_TITLE,
|
| layout="wide",
|
| initial_sidebar_state="expanded",
|
| page_icon=icopath,
|
| )
|
|
|
|
|
| def add_logo():
|
| """
|
| Fonction d'insertion du logo en arrière-plan du menu latéral de Streamlit.
|
|
|
| Il s'agit de la méthode conseillée par les mainteneurs de Streamlit :
|
| https://discuss.streamlit.io/t/put-logo-and-title-above-on-top-of-page-navigation-in-sidebar-of-multipage-app/28213/6
|
| """
|
|
|
| with open(logopath, "rb") as f:
|
| logo_data = base64.b64encode(f.read()).decode()
|
|
|
| st.markdown(
|
| f"""
|
| <style>
|
| [data-testid="stSidebar"] > div {{
|
| background-image: url("data:image/png;base64,{logo_data}");
|
| background-repeat: no-repeat;
|
| margin-top: 25px;
|
| background-position: 20px 20px;
|
| background-size: 300px;
|
| }}
|
| </style>
|
| """,
|
| unsafe_allow_html=True,
|
| )
|
|
|
|
|
| def run_fastapi(port: int) -> None:
|
| """
|
| Démarre le serveur API FastAPI en arrière-plan.
|
|
|
| Le serveur est configuré pour écouter sur 127.0.0.1,
|
| et le port spécifié en argument.
|
|
|
| Param :
|
| - port: Port d'écoute du serveur API
|
| """
|
| try:
|
| uvicorn.run(api, host="127.0.0.1", port=port)
|
| except Exception as e:
|
| st.error(f"Échec du démarrage du serveur API : {str(e)}")
|
|
|
|
|
| def main():
|
| """
|
| Fonction main de l'application Streamlit.
|
|
|
| On lance d'abord le serveur FastAPI en arrière-plan,
|
| puis on affiche l'interface utilisateur Streamlit.
|
| """
|
|
|
| if "api_process" not in st.session_state:
|
| st.session_state["api_process"] = Process(
|
| target=run_fastapi, args=(API_PORT,), daemon=True
|
| )
|
| st.session_state["api_process"].start()
|
|
|
|
|
| with st.sidebar:
|
| add_logo()
|
| selected = option_menu(
|
| menu_title="Navigation",
|
| options=["Home", "Aide téléphonique", "Dashboard", "Admin"],
|
| icons=["house", "phone", "bar-chart", "key"],
|
| default_index=0,
|
| )
|
|
|
| if selected == "Home":
|
| home_page()
|
| elif selected == "Aide téléphonique":
|
| aide_telephonique_page()
|
| elif selected == "Dashboard":
|
| dashboard_page()
|
| elif selected == "Admin":
|
| adm_page()
|
|
|
|
|
| if __name__ == "__main__":
|
| main()
|
|
|