AIdeaText commited on
Commit
fb038c9
verified
1 Parent(s): a43985f

Update modules/ui/ui.py

Browse files
Files changed (1) hide show
  1. modules/ui/ui.py +344 -344
modules/ui/ui.py CHANGED
@@ -1,345 +1,345 @@
1
- # modules/ui/ui.py
2
- import streamlit as st
3
- from streamlit_player import st_player
4
- import logging
5
- from datetime import datetime
6
- from dateutil.parser import parse
7
-
8
- # Importaciones locales
9
- #
10
- from session_state import initialize_session_state, logout
11
- #
12
- from translations import get_translations, get_landing_translations
13
- #
14
- from ..auth.auth import authenticate_user, authenticate_student, authenticate_admin
15
- #
16
- from ..database.sql_db import store_application_request
17
-
18
- #from .user_page import user_page
19
- try:
20
- from .user_page import user_page
21
- except ImportError:
22
- logger.error("No se pudo importar user_page. Aseg煤rate de que el archivo existe.")
23
- # Definir una funci贸n de respaldo
24
- def user_page(lang_code, t):
25
- st.error("La p谩gina de usuario no est谩 disponible. Por favor, contacta al administrador.")
26
-
27
- from ..admin.admin_ui import admin_page
28
-
29
- # Configuraci贸n del logger
30
- logging.basicConfig(level=logging.INFO)
31
- logger = logging.getLogger(__name__)
32
-
33
- #############################################################
34
- def main():
35
- logger.info(f"Entrando en main() - P谩gina actual: {st.session_state.page}")
36
-
37
- if 'nlp_models' not in st.session_state:
38
- logger.error("Los modelos NLP no est谩n inicializados.")
39
- st.error("Los modelos NLP no est谩n inicializados. Por favor, reinicie la aplicaci贸n.")
40
- return
41
-
42
- lang_code = st.session_state.get('lang_code', 'es')
43
- t = get_translations(lang_code)
44
-
45
- logger.info(f"P谩gina actual antes de la l贸gica de enrutamiento: {st.session_state.page}")
46
-
47
- if st.session_state.get('logged_out', False):
48
- st.session_state.logged_out = False
49
- st.session_state.page = 'login'
50
- st.rerun()
51
-
52
- if not st.session_state.get('logged_in', False):
53
- logger.info("Usuario no ha iniciado sesi贸n. Mostrando p谩gina de login/registro")
54
- login_register_page(lang_code, t)
55
- elif st.session_state.page == 'user':
56
- if st.session_state.role == 'Administrador':
57
- logger.info("Redirigiendo a la p谩gina de administrador")
58
- st.session_state.page = 'Admin'
59
- st.rerun()
60
- else:
61
- logger.info("Renderizando p谩gina de usuario")
62
- user_page(lang_code, t)
63
- elif st.session_state.page == "Admin":
64
- logger.info("Renderizando p谩gina de administrador")
65
- admin_page()
66
- else:
67
- logger.error(f"P谩gina no reconocida: {st.session_state.page}")
68
- st.error(t.get('unrecognized_page', 'P谩gina no reconocida'))
69
- # Redirigir a la p谩gina de usuario en caso de error
70
- st.session_state.page = 'user'
71
- st.rerun()
72
-
73
- logger.info(f"Saliendo de main() - Estado final de la sesi贸n: {st.session_state}")
74
-
75
- #############################################################
76
- #############################################################
77
- def login_register_page(lang_code, t):
78
- # Obtener traducciones espec铆ficas para landing page
79
- landing_t = get_landing_translations(lang_code)
80
-
81
- # Language selection dropdown at the top
82
- languages = {'Espa帽ol': 'es', 'English': 'en', 'Fran莽ais': 'fr', 'Portugu锚s': 'pt'}
83
-
84
- # Estilo personalizado para mejorar el espaciado y alineaci贸n
85
- st.markdown("""
86
- <style>
87
- div.row-widget.stHorizontalBlock {
88
- align-items: center;
89
- }
90
- </style>
91
- """, unsafe_allow_html=True)
92
-
93
- # Crear contenedor para logos y selector de idioma usando columnas de Streamlit
94
- col1, col2, col3, col4, col5 = st.columns([0.25, 0.25, 1, 1, 1])
95
-
96
- with col1:
97
- # Logo de ALPHA
98
- st.image("https://huggingface.co/spaces/AIdeaText/v3/resolve/main/assets/img/ALPHA_Startup%20Badges.png", width=100)
99
-
100
- with col2:
101
- # Logo de AIdeaText
102
- st.image("https://huggingface.co/spaces/AIdeaText/v3/resolve/main/assets/img/AIdeaText_Logo_vectores.png", width=100)
103
-
104
- with col5:
105
- # Selector de idioma
106
- selected_lang = st.selectbox(
107
- landing_t['select_language'],
108
- list(languages.keys()),
109
- index=list(languages.values()).index(lang_code),
110
- key=f"landing_language_selector_{lang_code}"
111
- )
112
- new_lang_code = languages[selected_lang]
113
- if lang_code != new_lang_code:
114
- st.session_state.lang_code = new_lang_code
115
- st.rerun()
116
-
117
- # Main content with columns
118
- left_column, right_column = st.columns([1, 3])
119
-
120
- with left_column:
121
- tab1, tab2 = st.tabs([landing_t['login'], landing_t['register']])
122
-
123
- with tab1:
124
- login_form(lang_code, landing_t)
125
-
126
- with tab2:
127
- register_form(lang_code, landing_t)
128
-
129
- with right_column:
130
- display_videos_and_info(lang_code, landing_t)
131
-
132
- #############################################################
133
- #############################################################
134
- def login_form(lang_code, landing_t):
135
- with st.form("login_form"):
136
- username = st.text_input(landing_t['email'])
137
- password = st.text_input(landing_t['password'], type="password")
138
- submit_button = st.form_submit_button(landing_t['login_button'])
139
-
140
- if submit_button:
141
- success, role = authenticate_user(username, password)
142
- if success:
143
- st.session_state.logged_in = True
144
- st.session_state.username = username
145
- st.session_state.role = role
146
- if role == 'Administrador':
147
- st.session_state.page = 'Admin'
148
- else:
149
- st.session_state.page = 'user'
150
- logger.info(f"Usuario autenticado: {username}, Rol: {role}")
151
- st.rerun()
152
- else:
153
- st.error(landing_t['invalid_credentials'])
154
-
155
-
156
- #############################################################
157
- #############################################################
158
- def register_form(lang_code, landing_t):
159
- name = st.text_input(landing_t['name'])
160
- lastname = st.text_input(landing_t['lastname'])
161
- institution = st.text_input(landing_t['institution'])
162
- current_role = st.selectbox(landing_t['current_role'],
163
- [landing_t['professor'], landing_t['student'], landing_t['administrative']])
164
-
165
- # Definimos el rol por defecto como estudiante
166
- desired_role = landing_t['student']
167
-
168
- email = st.text_input(landing_t['institutional_email'])
169
- reason = st.text_area(landing_t['interest_reason'])
170
-
171
- if st.button(landing_t['submit_application']):
172
- logger.info(f"Intentando enviar solicitud para {email}")
173
- logger.debug(f"Datos del formulario: name={name}, lastname={lastname}, email={email}, institution={institution}, current_role={current_role}, desired_role={desired_role}, reason={reason}")
174
-
175
- if not name or not lastname or not email or not institution or not reason:
176
- logger.warning("Env铆o de formulario incompleto")
177
- st.error(landing_t['complete_all_fields'])
178
- elif not is_institutional_email(email):
179
- logger.warning(f"Email no institucional utilizado: {email}")
180
- st.error(landing_t['use_institutional_email'])
181
- else:
182
- logger.info(f"Intentando almacenar solicitud para {email}")
183
- success = store_application_request(name, lastname, email, institution, current_role, desired_role, reason)
184
- if success:
185
- st.success(landing_t['application_sent'])
186
- logger.info(f"Solicitud almacenada exitosamente para {email}")
187
- else:
188
- st.error(landing_t['application_error'])
189
- logger.error(f"Error al almacenar solicitud para {email}")
190
-
191
-
192
- #############################################################
193
- #############################################################
194
- def is_institutional_email(email):
195
- forbidden_domains = ['gmail.com', 'hotmail.com', 'yahoo.com', 'outlook.com']
196
- return not any(domain in email.lower() for domain in forbidden_domains)
197
-
198
-
199
- #############################################################
200
- #############################################################
201
- def display_videos_and_info(lang_code, landing_t):
202
- # Crear tabs para cada secci贸n
203
- tab_use_case, tab_videos, tab_events, tab_gallery, tab_news = st.tabs([
204
- landing_t['use_cases'],
205
- landing_t['presentation_videos'],
206
- landing_t['academic_presentations'],
207
- landing_t['event_photos'],
208
- landing_t['version_control']
209
- ])
210
-
211
- # Tab de Casos de uso
212
- with tab_use_case:
213
- use_case_videos = {
214
- "English - Radar use chart": "https://youtu.be/fFbbtlIewgs",
215
- "English - Use AI Bot and arcs charts fuctions": "https://youtu.be/XjM-1oOl-ao",
216
- "English - Arcs use charts, example 1": "https://youtu.be/PdK_bgigVaM",
217
- "English - Arcs use charts, excample 2": "https://youtu.be/7uaV1njPOng",
218
- "Espa帽ol - Uso del diagrama radar para verificar redacci贸n": "https://www.youtube.com/watch?v=nJP6xscPLBU",
219
- "Espa帽ol - Uso de los diagramas de arco, ejemplo 1": "https://www.youtube.com/watch?v=ApBIAr2S-bE",
220
- "Espa帽ol - Uso de los diagramas de arco, ejemplo 2": "https://www.youtube.com/watch?v=JnP2U1Fm0rc",
221
- "Espa帽ol - Uso de los diagramas de arco, ejemplo 3": "https://www.youtube.com/watch?v=waWWwPTaI-Y",
222
- "Espa帽ol - Uso del bot para buscar respuestas" : "https://www.youtube.com/watch?v=GFKDS0K2s7E"
223
- }
224
-
225
- selected_title = st.selectbox(landing_t['select_use_case'], list(use_case_videos.keys()))
226
- if selected_title in use_case_videos:
227
- try:
228
- st_player(use_case_videos[selected_title])
229
- except Exception as e:
230
- st.error(f"Error al cargar el video: {str(e)}")
231
-
232
- # Tab de Videos
233
- with tab_videos:
234
- videos = {
235
- "Reel AIdeaText": "https://youtu.be/hXnwUvN1Q9Q",
236
- "Presentaci贸n en SENDA, UNAM. Ciudad de M茅xico, M茅xico" : "https://www.youtube.com/watch?v=XFLvjST2cE0",
237
- "Presentaci贸n en PyCon 2024. Colombia, Medell铆n": "https://www.youtube.com/watch?v=Jn545-IKx5Q",
238
- "Presentaci贸n en la Fundaci贸n Ser Maaestro. Lima, Per煤": "https://www.youtube.com/watch?v=imc4TI1q164",
239
- "Presentaci贸n en el programa de incubaci贸n Explora del IFE, TEC de Monterrey, Nuevo Le贸n, M茅xico": "https://www.youtube.com/watch?v=Fqi4Di_Rj_s",
240
- "Entrevista con el Dr. Guillermo Ru铆z. Lima, Per煤": "https://www.youtube.com/watch?v=_ch8cRja3oc",
241
- "Demo de la versi贸n de escritorio.": "https://www.youtube.com/watch?v=nP6eXbog-ZY"
242
- }
243
-
244
- selected_title = st.selectbox(landing_t['select_presentation'], list(videos.keys()))
245
- if selected_title in videos:
246
- try:
247
- st_player(videos[selected_title])
248
- except Exception as e:
249
- st.error(f"Error al cargar el video: {str(e)}")
250
-
251
- # Tab de Eventos
252
- with tab_events:
253
- st.markdown("""
254
- ## 2025
255
-
256
- **El Agente Cognitivo Vinculante como Innovaci贸n en el Aprendizaje Adaptativo: el caso de AIdeaText**
257
- IFE CONFERENCE 2025. Organizado por el Instituto para el Futuro de la Educaci贸n del TEC de Monterrey.
258
- Nuevo Le贸n, M茅xico. Del 28 al 30 enero 2025
259
-
260
- ## 2024
261
- [1]
262
- AIdeaText, AIdeaText, recurso digital que emplea la t茅cnica de An谩lisis de Resonancia Central para perfeccionar textos acad茅micos**
263
- V Temporada SENDA - Organizado por el Seminario de Entornos y Narrativas Digitales en la Academia del
264
- Instituto de Investigaciones Antropol贸gicas (IIA) de la Universidad Auton贸ma de M茅xico (UNAM). 22 noviembre 2024
265
-
266
- [2]
267
- Aproximaci贸n al Agente Cognitivo Vinculante (ACV) desde la Teor铆a del Actor Red (TAR)**
268
- Congreso HeETI 2024: Horizontes Expandidos de la Educaci贸n, la Tecnolog铆a y la Innovaci贸n
269
- Universidad el Claustro de Sor Juana. Del 25 al 27 septiembre 2024
270
-
271
- [3]
272
- AIdeaText, visualizaci贸n de mapas sem谩nticos**
273
- PyCon 2024, Organizado por el grupo de desarrolladores independientes de Python.
274
- Universidad EAFIT, Medell铆n, Colombia. Del 7 al 9 de junio de 2024.
275
-
276
- ## 2023
277
- **Aproximaci贸n al Agente Cognitivo Vinculante (ACV) desde la Teor铆a del Actor Red (TAR)**
278
- [1]
279
- XVII Congreso Nacional de Investigaci贸n Educativa - VII Encuentro de Estudiantes de Posgrado Educaci贸n.
280
- Consejo Mexicano de Investigaci贸n Educativa (COMIE)
281
- Villahermosa, Tabasco, M茅xico.
282
- Del 4 al 8 de diciembre 2023
283
-
284
- [2]
285
- XXXI Encuentro Internacional de Educaci贸n a Distancia
286
- Universidad de Guadalajara. Jalisco, M茅xico.
287
- Del 27 al 30 noviembre 2023
288
-
289
- [3]
290
- IV Temporada SENDA - Seminario de Entornos y Narrativas Digitales en la Academia
291
- Instituto de Investigaciones Antropol贸gicas (IIA), UNAM.
292
- 22 noviembre 2023
293
-
294
- [4]
295
- 1er Congreso Internacional de Educaci贸n Digital
296
- Instituto Polit茅cnico Nacional, sede Zacatecas. M茅xico.
297
- Del 23 al 24 de noviembre de 2023
298
-
299
- [5]
300
- La cuesti贸n de la centralidad del maestro frente a las tecnolog铆as digitales generativas**
301
- Innova F贸rum: Ecosistemas de Aprendizaje
302
- Universidad de Guadalajara. Jalisco, M茅xico.
303
- Del 16 al 18 de mayo 2023
304
- """)
305
-
306
- # Tab de Galer铆a
307
- with tab_gallery:
308
- # Contenedor con ancho m谩ximo
309
- with st.container():
310
- # Dividimos en dos columnas principales
311
- col_left, col_right = st.columns(2)
312
-
313
- # Columna izquierda: Foto 1 grande
314
- with col_left:
315
- # Foto 2 arriba
316
- st.image("assets/img/socialmedia/_MG_2845.JPG",
317
- caption="MakerFaire CDMX 2024",
318
- width=480) # Ajusta este valor seg煤n necesites
319
- # use_column_width=True)
320
-
321
- # Foto 3 abajo
322
- st.image("assets/img/socialmedia/Facebook_CoverPhoto-1_820x312.jpg",
323
- caption="MakerFaire CDMX 2024",
324
- width=480) # Ajusta este valor seg煤n necesites
325
- # use_column_width=True)
326
-
327
- # Columna derecha: Fotos 2 y 3 una encima de otra
328
- with col_right:
329
- st.image("assets/img/socialmedia/_MG_2790.jpg",
330
- caption="MakerFaire CDMX 2024",
331
- width=540) # Ajusta este valor seg煤n necesites
332
-
333
-
334
- # Tab de Novedades - Usar contenido traducido
335
- with tab_news:
336
- st.markdown(f"### {landing_t['latest_version_title']}")
337
- for update in landing_t['version_updates']:
338
- st.markdown(f"- {update}")
339
-
340
- # Definici贸n de __all__ para especificar qu茅 se exporta
341
- __all__ = ['main', 'login_register_page', 'initialize_session_state']
342
-
343
- # Bloque de ejecuci贸n condicional
344
- if __name__ == "__main__":
345
  main()
 
1
+ # modules/ui/ui.py
2
+ import streamlit as st
3
+ from streamlit_player import st_player
4
+ import logging
5
+ from datetime import datetime
6
+ from dateutil.parser import parse
7
+
8
+ # Importaciones locales
9
+ #
10
+ from session_state import initialize_session_state, logout
11
+ #
12
+ from translations import get_translations, get_landing_translations
13
+ #
14
+ from ..auth.auth import authenticate_user, authenticate_student, authenticate_admin
15
+ #
16
+ from ..database.sql_db import store_application_request
17
+
18
+ #from .user_page import user_page
19
+ try:
20
+ from .user_page import user_page
21
+ except ImportError:
22
+ logger.error("No se pudo importar user_page. Aseg煤rate de que el archivo existe.")
23
+ # Definir una funci贸n de respaldo
24
+ def user_page(lang_code, t):
25
+ st.error("La p谩gina de usuario no est谩 disponible. Por favor, contacta al administrador.")
26
+
27
+ from ..admin.admin_ui import admin_page
28
+
29
+ # Configuraci贸n del logger
30
+ logging.basicConfig(level=logging.INFO)
31
+ logger = logging.getLogger(__name__)
32
+
33
+ #############################################################
34
+ def main():
35
+ logger.info(f"Entrando en main() - P谩gina actual: {st.session_state.page}")
36
+
37
+ if 'nlp_models' not in st.session_state:
38
+ logger.error("Los modelos NLP no est谩n inicializados.")
39
+ st.error("Los modelos NLP no est谩n inicializados. Por favor, reinicie la aplicaci贸n.")
40
+ return
41
+
42
+ lang_code = st.session_state.get('lang_code', 'es')
43
+ t = get_translations(lang_code)
44
+
45
+ logger.info(f"P谩gina actual antes de la l贸gica de enrutamiento: {st.session_state.page}")
46
+
47
+ if st.session_state.get('logged_out', False):
48
+ st.session_state.logged_out = False
49
+ st.session_state.page = 'login'
50
+ st.rerun()
51
+
52
+ if not st.session_state.get('logged_in', False):
53
+ logger.info("Usuario no ha iniciado sesi贸n. Mostrando p谩gina de login/registro")
54
+ login_register_page(lang_code, t)
55
+ elif st.session_state.page == 'user':
56
+ if st.session_state.role == 'Administrador':
57
+ logger.info("Redirigiendo a la p谩gina de administrador")
58
+ st.session_state.page = 'Admin'
59
+ st.rerun()
60
+ else:
61
+ logger.info("Renderizando p谩gina de usuario")
62
+ user_page(lang_code, t)
63
+ elif st.session_state.page == "Admin":
64
+ logger.info("Renderizando p谩gina de administrador")
65
+ admin_page()
66
+ else:
67
+ logger.error(f"P谩gina no reconocida: {st.session_state.page}")
68
+ st.error(t.get('unrecognized_page', 'P谩gina no reconocida'))
69
+ # Redirigir a la p谩gina de usuario en caso de error
70
+ st.session_state.page = 'user'
71
+ st.rerun()
72
+
73
+ logger.info(f"Saliendo de main() - Estado final de la sesi贸n: {st.session_state}")
74
+
75
+ #############################################################
76
+ #############################################################
77
+ def login_register_page(lang_code, t):
78
+ # Obtener traducciones espec铆ficas para landing page
79
+ landing_t = get_landing_translations(lang_code)
80
+
81
+ # Language selection dropdown at the top
82
+ languages = {'Espa帽ol': 'es', 'English': 'en', '校泻褉邪褩薪褋褜泻邪': 'uk'}
83
+
84
+ # Estilo personalizado para mejorar el espaciado y alineaci贸n
85
+ st.markdown("""
86
+ <style>
87
+ div.row-widget.stHorizontalBlock {
88
+ align-items: center;
89
+ }
90
+ </style>
91
+ """, unsafe_allow_html=True)
92
+
93
+ # Crear contenedor para logos y selector de idioma usando columnas de Streamlit
94
+ col1, col2, col3, col4, col5 = st.columns([0.25, 0.25, 1, 1, 1])
95
+
96
+ with col1:
97
+ # Logo de ALPHA
98
+ st.image("https://huggingface.co/spaces/AIdeaText/v3/resolve/main/assets/img/ALPHA_Startup%20Badges.png", width=100)
99
+
100
+ with col2:
101
+ # Logo de AIdeaText
102
+ st.image("https://huggingface.co/spaces/AIdeaText/v3/resolve/main/assets/img/AIdeaText_Logo_vectores.png", width=100)
103
+
104
+ with col5:
105
+ # Selector de idioma
106
+ selected_lang = st.selectbox(
107
+ landing_t['select_language'],
108
+ list(languages.keys()),
109
+ index=list(languages.values()).index(lang_code),
110
+ key=f"landing_language_selector_{lang_code}"
111
+ )
112
+ new_lang_code = languages[selected_lang]
113
+ if lang_code != new_lang_code:
114
+ st.session_state.lang_code = new_lang_code
115
+ st.rerun()
116
+
117
+ # Main content with columns
118
+ left_column, right_column = st.columns([1, 3])
119
+
120
+ with left_column:
121
+ tab1, tab2 = st.tabs([landing_t['login'], landing_t['register']])
122
+
123
+ with tab1:
124
+ login_form(lang_code, landing_t)
125
+
126
+ with tab2:
127
+ register_form(lang_code, landing_t)
128
+
129
+ with right_column:
130
+ display_videos_and_info(lang_code, landing_t)
131
+
132
+ #############################################################
133
+ #############################################################
134
+ def login_form(lang_code, landing_t):
135
+ with st.form("login_form"):
136
+ username = st.text_input(landing_t['email'])
137
+ password = st.text_input(landing_t['password'], type="password")
138
+ submit_button = st.form_submit_button(landing_t['login_button'])
139
+
140
+ if submit_button:
141
+ success, role = authenticate_user(username, password)
142
+ if success:
143
+ st.session_state.logged_in = True
144
+ st.session_state.username = username
145
+ st.session_state.role = role
146
+ if role == 'Administrador':
147
+ st.session_state.page = 'Admin'
148
+ else:
149
+ st.session_state.page = 'user'
150
+ logger.info(f"Usuario autenticado: {username}, Rol: {role}")
151
+ st.rerun()
152
+ else:
153
+ st.error(landing_t['invalid_credentials'])
154
+
155
+
156
+ #############################################################
157
+ #############################################################
158
+ def register_form(lang_code, landing_t):
159
+ name = st.text_input(landing_t['name'])
160
+ lastname = st.text_input(landing_t['lastname'])
161
+ institution = st.text_input(landing_t['institution'])
162
+ current_role = st.selectbox(landing_t['current_role'],
163
+ [landing_t['professor'], landing_t['student'], landing_t['administrative']])
164
+
165
+ # Definimos el rol por defecto como estudiante
166
+ desired_role = landing_t['student']
167
+
168
+ email = st.text_input(landing_t['institutional_email'])
169
+ reason = st.text_area(landing_t['interest_reason'])
170
+
171
+ if st.button(landing_t['submit_application']):
172
+ logger.info(f"Intentando enviar solicitud para {email}")
173
+ logger.debug(f"Datos del formulario: name={name}, lastname={lastname}, email={email}, institution={institution}, current_role={current_role}, desired_role={desired_role}, reason={reason}")
174
+
175
+ if not name or not lastname or not email or not institution or not reason:
176
+ logger.warning("Env铆o de formulario incompleto")
177
+ st.error(landing_t['complete_all_fields'])
178
+ elif not is_institutional_email(email):
179
+ logger.warning(f"Email no institucional utilizado: {email}")
180
+ st.error(landing_t['use_institutional_email'])
181
+ else:
182
+ logger.info(f"Intentando almacenar solicitud para {email}")
183
+ success = store_application_request(name, lastname, email, institution, current_role, desired_role, reason)
184
+ if success:
185
+ st.success(landing_t['application_sent'])
186
+ logger.info(f"Solicitud almacenada exitosamente para {email}")
187
+ else:
188
+ st.error(landing_t['application_error'])
189
+ logger.error(f"Error al almacenar solicitud para {email}")
190
+
191
+
192
+ #############################################################
193
+ #############################################################
194
+ def is_institutional_email(email):
195
+ forbidden_domains = ['gmail.com', 'hotmail.com', 'yahoo.com', 'outlook.com']
196
+ return not any(domain in email.lower() for domain in forbidden_domains)
197
+
198
+
199
+ #############################################################
200
+ #############################################################
201
+ def display_videos_and_info(lang_code, landing_t):
202
+ # Crear tabs para cada secci贸n
203
+ tab_use_case, tab_videos, tab_events, tab_gallery, tab_news = st.tabs([
204
+ landing_t['use_cases'],
205
+ landing_t['presentation_videos'],
206
+ landing_t['academic_presentations'],
207
+ landing_t['event_photos'],
208
+ landing_t['version_control']
209
+ ])
210
+
211
+ # Tab de Casos de uso
212
+ with tab_use_case:
213
+ use_case_videos = {
214
+ "English - Radar use chart": "https://youtu.be/fFbbtlIewgs",
215
+ "English - Use AI Bot and arcs charts fuctions": "https://youtu.be/XjM-1oOl-ao",
216
+ "English - Arcs use charts, example 1": "https://youtu.be/PdK_bgigVaM",
217
+ "English - Arcs use charts, excample 2": "https://youtu.be/7uaV1njPOng",
218
+ "Espa帽ol - Uso del diagrama radar para verificar redacci贸n": "https://www.youtube.com/watch?v=nJP6xscPLBU",
219
+ "Espa帽ol - Uso de los diagramas de arco, ejemplo 1": "https://www.youtube.com/watch?v=ApBIAr2S-bE",
220
+ "Espa帽ol - Uso de los diagramas de arco, ejemplo 2": "https://www.youtube.com/watch?v=JnP2U1Fm0rc",
221
+ "Espa帽ol - Uso de los diagramas de arco, ejemplo 3": "https://www.youtube.com/watch?v=waWWwPTaI-Y",
222
+ "Espa帽ol - Uso del bot para buscar respuestas" : "https://www.youtube.com/watch?v=GFKDS0K2s7E"
223
+ }
224
+
225
+ selected_title = st.selectbox(landing_t['select_use_case'], list(use_case_videos.keys()))
226
+ if selected_title in use_case_videos:
227
+ try:
228
+ st_player(use_case_videos[selected_title])
229
+ except Exception as e:
230
+ st.error(f"Error al cargar el video: {str(e)}")
231
+
232
+ # Tab de Videos
233
+ with tab_videos:
234
+ videos = {
235
+ "Reel AIdeaText": "https://youtu.be/hXnwUvN1Q9Q",
236
+ "Presentaci贸n en SENDA, UNAM. Ciudad de M茅xico, M茅xico" : "https://www.youtube.com/watch?v=XFLvjST2cE0",
237
+ "Presentaci贸n en PyCon 2024. Colombia, Medell铆n": "https://www.youtube.com/watch?v=Jn545-IKx5Q",
238
+ "Presentaci贸n en la Fundaci贸n Ser Maaestro. Lima, Per煤": "https://www.youtube.com/watch?v=imc4TI1q164",
239
+ "Presentaci贸n en el programa de incubaci贸n Explora del IFE, TEC de Monterrey, Nuevo Le贸n, M茅xico": "https://www.youtube.com/watch?v=Fqi4Di_Rj_s",
240
+ "Entrevista con el Dr. Guillermo Ru铆z. Lima, Per煤": "https://www.youtube.com/watch?v=_ch8cRja3oc",
241
+ "Demo de la versi贸n de escritorio.": "https://www.youtube.com/watch?v=nP6eXbog-ZY"
242
+ }
243
+
244
+ selected_title = st.selectbox(landing_t['select_presentation'], list(videos.keys()))
245
+ if selected_title in videos:
246
+ try:
247
+ st_player(videos[selected_title])
248
+ except Exception as e:
249
+ st.error(f"Error al cargar el video: {str(e)}")
250
+
251
+ # Tab de Eventos
252
+ with tab_events:
253
+ st.markdown("""
254
+ ## 2025
255
+
256
+ **El Agente Cognitivo Vinculante como Innovaci贸n en el Aprendizaje Adaptativo: el caso de AIdeaText**
257
+ IFE CONFERENCE 2025. Organizado por el Instituto para el Futuro de la Educaci贸n del TEC de Monterrey.
258
+ Nuevo Le贸n, M茅xico. Del 28 al 30 enero 2025
259
+
260
+ ## 2024
261
+ [1]
262
+ AIdeaText, AIdeaText, recurso digital que emplea la t茅cnica de An谩lisis de Resonancia Central para perfeccionar textos acad茅micos**
263
+ V Temporada SENDA - Organizado por el Seminario de Entornos y Narrativas Digitales en la Academia del
264
+ Instituto de Investigaciones Antropol贸gicas (IIA) de la Universidad Auton贸ma de M茅xico (UNAM). 22 noviembre 2024
265
+
266
+ [2]
267
+ Aproximaci贸n al Agente Cognitivo Vinculante (ACV) desde la Teor铆a del Actor Red (TAR)**
268
+ Congreso HeETI 2024: Horizontes Expandidos de la Educaci贸n, la Tecnolog铆a y la Innovaci贸n
269
+ Universidad el Claustro de Sor Juana. Del 25 al 27 septiembre 2024
270
+
271
+ [3]
272
+ AIdeaText, visualizaci贸n de mapas sem谩nticos**
273
+ PyCon 2024, Organizado por el grupo de desarrolladores independientes de Python.
274
+ Universidad EAFIT, Medell铆n, Colombia. Del 7 al 9 de junio de 2024.
275
+
276
+ ## 2023
277
+ **Aproximaci贸n al Agente Cognitivo Vinculante (ACV) desde la Teor铆a del Actor Red (TAR)**
278
+ [1]
279
+ XVII Congreso Nacional de Investigaci贸n Educativa - VII Encuentro de Estudiantes de Posgrado Educaci贸n.
280
+ Consejo Mexicano de Investigaci贸n Educativa (COMIE)
281
+ Villahermosa, Tabasco, M茅xico.
282
+ Del 4 al 8 de diciembre 2023
283
+
284
+ [2]
285
+ XXXI Encuentro Internacional de Educaci贸n a Distancia
286
+ Universidad de Guadalajara. Jalisco, M茅xico.
287
+ Del 27 al 30 noviembre 2023
288
+
289
+ [3]
290
+ IV Temporada SENDA - Seminario de Entornos y Narrativas Digitales en la Academia
291
+ Instituto de Investigaciones Antropol贸gicas (IIA), UNAM.
292
+ 22 noviembre 2023
293
+
294
+ [4]
295
+ 1er Congreso Internacional de Educaci贸n Digital
296
+ Instituto Polit茅cnico Nacional, sede Zacatecas. M茅xico.
297
+ Del 23 al 24 de noviembre de 2023
298
+
299
+ [5]
300
+ La cuesti贸n de la centralidad del maestro frente a las tecnolog铆as digitales generativas**
301
+ Innova F贸rum: Ecosistemas de Aprendizaje
302
+ Universidad de Guadalajara. Jalisco, M茅xico.
303
+ Del 16 al 18 de mayo 2023
304
+ """)
305
+
306
+ # Tab de Galer铆a
307
+ with tab_gallery:
308
+ # Contenedor con ancho m谩ximo
309
+ with st.container():
310
+ # Dividimos en dos columnas principales
311
+ col_left, col_right = st.columns(2)
312
+
313
+ # Columna izquierda: Foto 1 grande
314
+ with col_left:
315
+ # Foto 2 arriba
316
+ st.image("assets/img/socialmedia/_MG_2845.JPG",
317
+ caption="MakerFaire CDMX 2024",
318
+ width=480) # Ajusta este valor seg煤n necesites
319
+ # use_column_width=True)
320
+
321
+ # Foto 3 abajo
322
+ st.image("assets/img/socialmedia/Facebook_CoverPhoto-1_820x312.jpg",
323
+ caption="MakerFaire CDMX 2024",
324
+ width=480) # Ajusta este valor seg煤n necesites
325
+ # use_column_width=True)
326
+
327
+ # Columna derecha: Fotos 2 y 3 una encima de otra
328
+ with col_right:
329
+ st.image("assets/img/socialmedia/_MG_2790.jpg",
330
+ caption="MakerFaire CDMX 2024",
331
+ width=540) # Ajusta este valor seg煤n necesites
332
+
333
+
334
+ # Tab de Novedades - Usar contenido traducido
335
+ with tab_news:
336
+ st.markdown(f"### {landing_t['latest_version_title']}")
337
+ for update in landing_t['version_updates']:
338
+ st.markdown(f"- {update}")
339
+
340
+ # Definici贸n de __all__ para especificar qu茅 se exporta
341
+ __all__ = ['main', 'login_register_page', 'initialize_session_state']
342
+
343
+ # Bloque de ejecuci贸n condicional
344
+ if __name__ == "__main__":
345
  main()