import gradio as gr from meldrx import MeldRxAPI import json import os import gradio as gr from meldrx import MeldRxAPI import json import os class CallbackManager: def __init__(self, redirect_uri: str, client_secret: str = None): client_id = os.getenv("APPID") if not client_id: raise ValueError("APPID environment variable not set.") workspace_id = os.getenv("WORKSPACE_URL") if not workspace_id: raise ValueError("WORKSPACE_URL environment variable not set.") self.api = MeldRxAPI(client_id, client_secret, workspace_id, redirect_uri) self.auth_code = None self.access_token = None def get_auth_url(self) -> str: return self.api.get_authorization_url() def set_auth_code(self, code: str) -> str: self.auth_code = code if self.api.authenticate_with_code(code): self.access_token = self.api.access_token return f"Authentication successful! Access Token: {self.access_token[:10]}... (truncated)" return "Authentication failed. Please check the code." def get_patient_data(self) -> str: if not self.access_token: return "Not authenticated. Please provide a valid authorization code first." patients = self.api.get_patients() if patients is not None: return json.dumps(patients, indent=2) if patients else "No patient data returned." return "Failed to retrieve patient data." def display_form( first_name, last_name, middle_initial, dob, age, sex, address, city, state, zip_code, doctor_first_name, doctor_last_name, doctor_middle_initial, hospital_name, doctor_address, doctor_city, doctor_state, doctor_zip, admission_date, referral_source, admission_method, discharge_date, discharge_reason, date_of_death, diagnosis, procedures, medications, preparer_name, preparer_job_title ): form = f""" **Patient Discharge Form** - Name: {first_name} {middle_initial} {last_name} - Date of Birth: {dob}, Age: {age}, Sex: {sex} - Address: {address}, {city}, {state}, {zip_code} - Doctor: {doctor_first_name} {doctor_middle_initial} {doctor_last_name} - Hospital/Clinic: {hospital_name} - Doctor Address: {doctor_address}, {doctor_city}, {doctor_state}, {doctor_zip} - Admission Date: {admission_date}, Source: {referral_source}, Method: {admission_method} - Discharge Date: {discharge_date}, Reason: {discharge_reason} - Date of Death: {date_of_death} - Diagnosis: {diagnosis} - Procedures: {procedures} - Medications: {medications} - Prepared By: {preparer_name}, {preparer_job_title} """ return form CALLBACK_MANAGER = CallbackManager( redirect_uri="https://multitransformer-discharge-guard.hf.space/callback", client_secret=None ) with gr.Blocks() as demo: gr.Markdown("# Patient Discharge Form with MeldRx Integration") with gr.Tab("Authenticate with MeldRx"): gr.Markdown("## SMART on FHIR Authentication") auth_url_output = gr.Textbox(label="Authorization URL", value=CALLBACK_MANAGER.get_auth_url(), interactive=False) gr.Markdown("Copy the URL above, open it in a browser, log in, and paste the 'code' from the redirect URL below.") auth_code_input = gr.Textbox(label="Authorization Code") auth_submit = gr.Button("Submit Code") auth_result = gr.Textbox(label="Authentication Result") patient_data_button = gr.Button("Fetch Patient Data") patient_data_output = gr.Textbox(label="Patient Data") auth_submit.click(fn=CALLBACK_MANAGER.set_auth_code, inputs=auth_code_input, outputs=auth_result) patient_data_button.click(fn=CALLBACK_MANAGER.get_patient_data, inputs=None, outputs=patient_data_output) with gr.Tab("Discharge Form"): gr.Markdown("## Patient Details") with gr.Row(): first_name = gr.Textbox(label="First Name") last_name = gr.Textbox(label="Last Name") middle_initial = gr.Textbox(label="Middle Initial") with gr.Row(): dob = gr.Textbox(label="Date of Birth") age = gr.Textbox(label="Age") sex = gr.Textbox(label="Sex") address = gr.Textbox(label="Address") with gr.Row(): city = gr.Textbox(label="City") state = gr.Textbox(label="State") zip_code = gr.Textbox(label="Zip Code") gr.Markdown("## Primary Healthcare Professional Details") with gr.Row(): doctor_first_name = gr.Textbox(label="Doctor's First Name") doctor_last_name = gr.Textbox(label="Doctor's Last Name") doctor_middle_initial = gr.Textbox(label="Middle Initial") hospital_name = gr.Textbox(label="Hospital/Clinic Name") doctor_address = gr.Textbox(label="Address") with gr.Row(): doctor_city = gr.Textbox(label="City") doctor_state = gr.Textbox(label="State") doctor_zip = gr.Textbox(label="Zip Code") gr.Markdown("## Admission and Discharge Details") with gr.Row(): admission_date = gr.Textbox(label="Date of Admission") referral_source = gr.Textbox(label="Source of Referral") admission_method = gr.Textbox(label="Method of Admission") with gr.Row(): discharge_date = gr.Textbox(label="Date of Discharge") discharge_reason = gr.Radio(["Treated", "Transferred", "Discharge Against Advice", "Patient Died"], label="Discharge Reason") date_of_death = gr.Textbox(label="Date of Death (if applicable)") gr.Markdown("## Diagnosis & Procedures") diagnosis = gr.Textbox(label="Diagnosis") procedures = gr.Textbox(label="Operation & Procedures") gr.Markdown("## Medication Details") medications = gr.Textbox(label="Medication on Discharge") gr.Markdown("## Prepared By") with gr.Row(): preparer_name = gr.Textbox(label="Name") preparer_job_title = gr.Textbox(label="Job Title") submit = gr.Button("Generate Form") output = gr.Markdown() submit.click( display_form, inputs=[ first_name, last_name, middle_initial, dob, age, sex, address, city, state, zip_code, doctor_first_name, doctor_last_name, doctor_middle_initial, hospital_name, doctor_address, doctor_city, doctor_state, doctor_zip, admission_date, referral_source, admission_method, discharge_date, discharge_reason, date_of_death, diagnosis, procedures, medications, preparer_name, preparer_job_title ], outputs=output ) demo.launch()