File size: 3,471 Bytes
cec4217
510a4d9
5945503
 
cec4217
 
510a4d9
8be68c0
5945503
 
 
 
8be68c0
cec4217
 
8be68c0
510a4d9
 
 
 
8be68c0
5945503
510a4d9
5945503
 
510a4d9
5945503
510a4d9
5945503
 
510a4d9
5945503
510a4d9
5945503
cec4217
510a4d9
 
 
5945503
510a4d9
cec4217
8be68c0
 
cec4217
334f95e
 
 
 
8be68c0
 
 
 
334f95e
8be68c0
 
 
cec4217
 
 
8be68c0
cec4217
8be68c0
334f95e
8be68c0
334f95e
8be68c0
334f95e
8be68c0
334f95e
8be68c0
cf694d2
8be68c0
cec4217
8be68c0
334f95e
 
 
 
 
 
8be68c0
334f95e
 
 
 
 
cec4217
8be68c0
334f95e
 
 
8be68c0
 
a9a72d4
 
8be68c0
cf694d2
a9a72d4
 
 
cec4217
8be68c0
cec4217
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
from fastapi import FastAPI
from pydantic import BaseModel
from supabase import create_client, Client
import os
import gradio as gr
import requests

# --- Supabase Config ---
SUPABASE_URL = os.getenv("SUPABASE_URL")
SUPABASE_KEY = os.getenv("SUPABASE_KEY")
supabase: Client = create_client(SUPABASE_URL, SUPABASE_KEY)

# --- FastAPI Setup ---
app = FastAPI()

# --- Pydantic Task Model ---
class Task(BaseModel):
    title: str
    completed: bool = False

# --- API Endpoints ---
@app.post("/tasks/")
def add_task(task: Task):
    response = supabase.table("tasks").insert(task.dict()).execute()
    return response.data

@app.get("/tasks/")
def get_tasks():
    response = supabase.table("tasks").select("*").order("id", desc=False).execute()
    return response.data

@app.patch("/tasks/{task_id}")
def update_task(task_id: str, completed: bool):
    response = supabase.table("tasks").update({"completed": completed}).eq("id", task_id).execute()
    return response.data

@app.delete("/tasks/{task_id}")
def delete_task(task_id: str):
    supabase.table("tasks").delete().eq("id", task_id).execute()
    return {"detail": "Task deleted"}

# --- Gradio Frontend Logic ---
API_URL = "http://localhost:7860"  # adjust if needed for Hugging Face Spaces

def get_tasks_data():
    response = requests.get(f"{API_URL}/tasks/")
    return response.json()

def get_task_choices():
    """Returns [(label, uuid)] for the dropdown."""
    tasks = get_tasks_data()
    return [(f"{t['title']} - {'✔️' if t['completed'] else '❌'}", t['id']) for t in tasks]

def get_task_display():
    """Returns formatted list of tasks for display."""
    return [f"{t['title']} - {'✔️' if t['completed'] else '❌'}" for t in get_tasks_data()]

def add_task_ui(title):
    if not title.strip():
        return "Title cannot be empty", get_task_display(), gr.update(choices=get_task_choices())
    requests.post(f"{API_URL}/tasks/", json={"title": title, "completed": False})
    return "", get_task_display(), gr.update(choices=get_task_choices())

def complete_task_ui(task_id):
    requests.patch(f"{API_URL}/tasks/{task_id}", params={"completed": True})
    return get_task_display(), gr.update(choices=get_task_choices())

def delete_task_ui(task_id):
    requests.delete(f"{API_URL}/tasks/{task_id}")
    return get_task_display(), gr.update(choices=get_task_choices())

# --- Gradio UI ---
with gr.Blocks() as demo:
    gr.Markdown("## ✅ Task List Manager")

    with gr.Row():
        task_input = gr.Textbox(label="New Task", placeholder="e.g., Write blog post")
        add_button = gr.Button("Add Task")

    task_selector = gr.Dropdown(label="Select a Task", choices=[])

    with gr.Row():
        complete_button = gr.Button("Mark as Completed")
        delete_button = gr.Button("Delete Task")

    task_display = gr.Textbox(label="All Tasks", lines=10)

    # Button Logic
    add_button.click(add_task_ui, inputs=task_input, outputs=[task_input, task_display, task_selector])
    complete_button.click(complete_task_ui, inputs=task_selector, outputs=[task_display, task_selector])
    delete_button.click(delete_task_ui, inputs=task_selector, outputs=[task_display, task_selector])

    # Load initial data
    demo.load(
        lambda: (
            get_task_display(),
            gr.update(choices=get_task_choices())
        ),
        outputs=[task_display, task_selector]
    )

# Mount Gradio app into FastAPI
app = gr.mount_gradio_app(app, demo, path="/")