Spaces:
Running
Running
| import urllib.parse | |
| import streamlit as st | |
| from components.flex import st_flex | |
| from core.constants import OAUTH_CLIENT_ID | |
| from core.constants import OAUTH_STATE | |
| from core.constants import REDIRECT_URI | |
| from core.query_params import clear_query_params | |
| from core.query_params import get_code | |
| from core.query_params import get_project_timestamp | |
| from core.query_params import get_state | |
| from core.state import CurrentProject | |
| from core.state import get_user | |
| from core.state import User | |
| from utils import init_state | |
| from views.splash import render_splash | |
| from views.wizard import render_editor | |
| st.set_page_config(page_title="Croissant Editor", page_icon="π₯", layout="wide") | |
| init_state() | |
| user = get_user() | |
| if OAUTH_CLIENT_ID and not user: | |
| state = get_state() | |
| if state and state == OAUTH_STATE: | |
| code = get_code() | |
| if not code: | |
| st.stop() | |
| try: | |
| st.session_state[User] = User.connect(code) | |
| # Clear the cache to force retrieving the new user. | |
| get_user() | |
| except: | |
| raise | |
| finally: | |
| clear_query_params() | |
| else: | |
| redirect_uri = urllib.parse.quote(REDIRECT_URI, safe="") | |
| client_id = urllib.parse.quote(OAUTH_CLIENT_ID, safe="") | |
| state = urllib.parse.quote(OAUTH_STATE, safe="") | |
| scope = urllib.parse.quote("openid profile", safe="") | |
| url = f"https://huggingface.co/oauth/authorize?response_type=code&redirect_uri={redirect_uri}&scope={scope}&client_id={client_id}&state={state}" | |
| st.header("Croissant Editor") | |
| st.link_button("π€ Login with Hugging Face", url) | |
| st.stop() | |
| def _back_to_menu(): | |
| """Sends the user back to the menu.""" | |
| clear_query_params() | |
| init_state(force=True) | |
| def _logout(): | |
| """Logs the user out.""" | |
| st.cache_data.clear() | |
| st.session_state[User] = None | |
| _back_to_menu() | |
| timestamp = get_project_timestamp() | |
| button_width = 73 # This is the best value for the current content of the buttons. | |
| buttons_widths = [] | |
| if OAUTH_CLIENT_ID: | |
| buttons_widths.append(button_width) | |
| if timestamp: | |
| buttons_widths.append(button_width) | |
| widths = [200, sum(buttons_widths) + 10] # 10 being the space between elements. | |
| with st_flex( | |
| flex_direction="row", | |
| justify_content="space-between", | |
| align_items="center", | |
| widths=widths, | |
| ): | |
| st.header("Croissant Editor") | |
| if OAUTH_CLIENT_ID or timestamp: | |
| with st_flex( | |
| flex_direction="row", | |
| justify_content="space-between", | |
| widths=buttons_widths, | |
| ): | |
| if OAUTH_CLIENT_ID: | |
| st.button("Log out", on_click=_logout) | |
| if timestamp: | |
| st.button("Home", on_click=_back_to_menu) | |
| should_display_editor = bool(st.session_state.get(CurrentProject)) | |
| if should_display_editor: | |
| render_editor() | |
| else: | |
| render_splash() | |