File size: 2,862 Bytes
bbea1cc
 
cb5b71d
 
db55b72
bbea1cc
 
 
dc92053
 
8c11dd4
bbea1cc
cb5b71d
 
 
 
bbea1cc
 
041af8a
 
8c11dd4
041af8a
 
bbea1cc
 
 
 
 
 
041af8a
 
 
8c11dd4
041af8a
 
 
 
bbea1cc
 
 
 
 
 
db55b72
bbea1cc
 
 
 
cb5b71d
 
dc92053
cb5b71d
 
 
041af8a
 
 
6a31b9a
dc92053
041af8a
 
dc92053
cb5b71d
db55b72
 
 
 
dc92053
db55b72
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
cb5b71d
6a31b9a
 
 
cb5b71d
 
dc92053
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
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 get_project_timestamp
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:
    query_params = st.experimental_get_query_params()
    state = query_params.get("state")
    if state and state[0] == OAUTH_STATE:
        code = query_params.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:
            st.experimental_set_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."""
    st.experimental_set_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()