import gradio as gr from utils.auth import AuthState, ClientConnector from utils.components import Components, ComponentsFn from utils.parser import Parser def create_interface() -> gr.Blocks: auth_state = AuthState() auth_state.check_start_auth_status() # css = '.gradio-container {width: 60% !important}' css = ''' .gradio-container { width: 70% !important; margin: 0 auto !important; /* Центрирование по горизонтали */ } ''' with gr.Blocks(css=css) as interface: gr.Markdown(Components.welcome_message_markdown) auth_state = gr.State(auth_state) chats_list = gr.State([]) csv_names = gr.State([]) dynamic_visible_components = ComponentsFn.get_dynamic_visible_components(auth_state.value, render=False) code, code_btn, password_2fa, password_2fa_btn, delete_session_btn = dynamic_visible_components with gr.Group(): gr.Markdown('Авторизация') with gr.Row(): with gr.Column(): session_type = Components.session_type_radio() auth_status = Components.auth_status(value=auth_state.value.message) with gr.Row(): auth_btn = Components.auth_btn() delete_session_btn.render() code.render() code_btn.render() password_2fa.render() password_2fa_btn.render() with gr.Column(): api_id = Components.api_id() api_hash = Components.api_hash() phone_number = Components.phone_number() auth_btn.click( fn=ClientConnector.start_auth, inputs=[auth_state, api_id, api_hash], outputs=[auth_state], ).then( fn=ClientConnector.send_code, inputs=[auth_state, phone_number], outputs=[auth_state], ).then( fn=ComponentsFn.get_dynamic_visible_components, inputs=[auth_state], outputs=dynamic_visible_components, ).then( fn=ComponentsFn.update_status, inputs=[auth_state], outputs=[auth_status], ) code_btn.click( fn=ClientConnector.verify_code, inputs=[auth_state, phone_number, code], outputs=[auth_state], ).then( fn=ComponentsFn.get_dynamic_visible_components, inputs=[auth_state], outputs=dynamic_visible_components, ).then( fn=ComponentsFn.update_status, inputs=[auth_state], outputs=[auth_status], ) password_2fa_btn.click( fn=ClientConnector.verify_2fa, inputs=[auth_state, password_2fa], outputs=[auth_state], ).then( fn=ComponentsFn.get_dynamic_visible_components, inputs=[auth_state], outputs=dynamic_visible_components, ).then( fn=ComponentsFn.update_status, inputs=[auth_state], outputs=[auth_status], ) delete_session_btn.click( fn=ComponentsFn.delete_session, inputs=[auth_state], outputs=None, ).then( fn=ComponentsFn.get_dynamic_visible_components, inputs=[auth_state], outputs=dynamic_visible_components, ).then( fn=ComponentsFn.update_status, inputs=[auth_state], outputs=[auth_status], ) session_type.change( fn=ComponentsFn.update_auth_state_session_type, inputs=[auth_state, session_type], outputs=None, ) with gr.Group(): gr.Markdown('Парсинг') with gr.Row(): with gr.Column(): with gr.Group(): gr.Markdown('Чаты для парсинга') chats_usernames = Components.chats_usernames() add_chat_btn = Components.add_chat_btn() chats_list_status = Components.chats_list_status() with gr.Column(): with gr.Group(): gr.Markdown('Параметры парсинга') parse_args = Components.get_parse_args() with gr.Column(): with gr.Group(): gr.Markdown('Результаты парсинга') start_parse_btn = Components.start_parse_btn() parse_status = Components.parse_status() download_btn = Components.download_btn() add_chat_btn.click( fn=Parser.add_chat_to_chats_list, inputs=[auth_state, chats_usernames, chats_list, api_id, api_hash], outputs=[chats_list_status], ) start_parse_btn.click( fn=Parser.parse_chats, inputs=[auth_state, chats_list, api_id, api_hash, *parse_args], outputs=[parse_status, csv_names], ).then( fn=ComponentsFn.update_download_btn, inputs=[csv_names], outputs=[download_btn], ) return interface