File size: 5,395 Bytes
10dce96
 
580c204
43b2fb8
5c827eb
580c204
32ba94f
 
11f08dd
32ba94f
 
 
 
580c204
0f68bb2
 
 
580c204
 
 
10dce96
924e5d5
 
 
 
 
10dce96
11f08dd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
924e5d5
 
 
 
10dce96
11f08dd
924e5d5
11f08dd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
924e5d5
 
10dce96
924e5d5
 
 
 
 
 
 
c29d33d
 
 
10dce96
924e5d5
 
 
 
 
 
 
10dce96
580c204
 
 
 
 
 
 
 
 
 
 
 
 
10dce96
 
 
 
 
 
924e5d5
10dce96
924e5d5
 
 
 
 
 
 
10dce96
924e5d5
 
 
 
10dce96
924e5d5
 
 
 
 
 
580c204
 
924e5d5
 
 
 
 
 
 
 
 
 
 
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
import streamlit as st
import firebase_admin
from firebase_admin import credentials, auth, db
import os
import json

# Load Firebase credentials from Hugging Face Secrets
firebase_creds = os.getenv("FIREBASE_CREDENTIALS")
FIREBASE_API_KEY = os.getenv("FIREBASE_API_KEY")
if firebase_creds:
    firebase_creds = json.loads(firebase_creds)
else:
    st.error("Firebase credentials not found. Please check your secrets.")

# Initialize Firebase (only once)
if not firebase_admin._apps:
    cred = credentials.Certificate(firebase_creds)  # Replace with your Firebase service account key
    firebase_admin.initialize_app(cred, {
        'databaseURL': 'https://creative-623ef-default-rtdb.firebaseio.com/'  # Replace with your Firebase Realtime Database URL
    })

# Initialize session state
if "logged_in" not in st.session_state:
    st.session_state.logged_in = False
if "current_user" not in st.session_state:
    st.session_state.current_user = None

def send_verification_email(id_token):
    url = f'https://identitytoolkit.googleapis.com/v1/accounts:sendOobCode?key={FIREBASE_API_KEY}'
    headers = {'Content-Type': 'application/json'}
    data = {
        'requestType': 'VERIFY_EMAIL',
        'idToken': id_token
    }
    
    response = requests.post(url, headers=headers, json=data)
    result = response.json()
    
    if 'error' in result:
        return {'status': 'error', 'message': result['error']['message']}
    else:
        return {'status': 'success', 'email': result['email']}
        
# Callback for registration
def register_callback():
    email = st.session_state.reg_email
    password = st.session_state.reg_password
    try:
        # Step 1: Create a new user in Firebase
        user = auth.create_user(email=email, password=password)
        st.success("Registration successful! Sending verification email...")

        # Step 2: Sign in the user programmatically to get the id_token
        url = f'https://identitytoolkit.googleapis.com/v1/accounts:signInWithPassword?key={FIREBASE_API_KEY}'
        data = {
            'email': email,
            'password': password,
            'returnSecureToken': True
        }
        response = requests.post(url, json=data)
        result = response.json()

        if 'idToken' in result:
            id_token = result['idToken']  # Retrieve the id_token
            st.session_state.id_token = id_token  # Store the id_token in session state

            # Step 3: Send the verification email
            verification_result = send_verification_email(id_token)
            if verification_result['status'] == 'success':
                st.success(f"Verification email sent to {email}.")
            else:
                st.error(f"Failed to send verification email: {verification_result['message']}")
        else:
            st.error(f"Failed to retrieve id_token: {result['error']['message']}")
    except Exception as e:
        st.error(f"Registration failed: {e}")

# Callback for login
def login_callback():
    email = st.session_state.login_email
    password = st.session_state.login_password
    try:
        # Authenticate user with Firebase
        user = auth.get_user_by_email(email)
        st.session_state.logged_in = True
        st.session_state.current_user = user.uid  # Store the user UID in session state
        st.success("Logged in successfully!")
    except Exception as e:
        st.error(f"Login failed: {e}")

# Callback for logout
def logout_callback():
    st.session_state.logged_in = False
    st.session_state.current_user = None
    st.info("Logged out successfully!")

# Function to store text in Firebase Realtime Database
def store_text_in_db(user_id, text):
    try:
        ref = db.reference(f'users/{user_id}/texts')
        new_text_ref = ref.push()
        new_text_ref.set({
            'text': text,
            'timestamp': firebase_admin.db.ServerValue.TIMESTAMP
        })
        st.success("Text saved successfully!")
    except Exception as e:
        st.error(f"Failed to save text: {e}")

# Registration form
def registration_form():
    with st.form("Registration"):
        st.subheader("Register")
        email = st.text_input("Email", key="reg_email")
        password = st.text_input("Password (min 6 characters)", type="password", key="reg_password")
        submit_button = st.form_submit_button("Register", on_click=register_callback)

# Login form
def login_form():
    with st.form("Login"):
        st.subheader("Login")
        email = st.text_input("Email", key="login_email")
        password = st.text_input("Password", type="password", key="login_password")
        submit_button = st.form_submit_button("Login", on_click=login_callback)

# Main app screen (after login)
def main_app():
    st.subheader(f"Welcome, {st.session_state.current_user}!")
    st.write("Enter a name below to get a greeting.")

    # Input field for name
    name = st.text_input("Enter a name", key="name_input")

    # Display greeting in real-time
    if name:
        st.write(f"Hello {name}!")
        # Store the entered text in Firebase Realtime Database
        store_text_in_db(st.session_state.current_user, name)

    # Logout button
    if st.button("Logout", on_click=logout_callback):
        pass

# Render the appropriate screen based on login status
if st.session_state.logged_in:
    main_app()
else:
    registration_form()
    login_form()