From 5c0103834ee6f69939f9f33dc10ed8c167a694b8 Mon Sep 17 00:00:00 2001 From: maq Date: Thu, 30 Oct 2025 04:05:52 -0700 Subject: [PATCH] Upload files to "frontend" --- frontend/Dockerfile | 7 +++++++ frontend/app.py | 37 +++++++++++++++++++++++++++++++++++++ frontend/requirements.txt | 3 +++ 3 files changed, 47 insertions(+) create mode 100644 frontend/Dockerfile create mode 100644 frontend/app.py create mode 100644 frontend/requirements.txt diff --git a/frontend/Dockerfile b/frontend/Dockerfile new file mode 100644 index 0000000..2cd22dd --- /dev/null +++ b/frontend/Dockerfile @@ -0,0 +1,7 @@ +FROM python:3.12-slim +WORKDIR /app +COPY requirements.txt . +RUN pip install -r requirements.txt +COPY app.py . +EXPOSE 8501 +CMD ["streamlit", "run", "app.py", "--server.port=8501", "--server.address=0.0.0.0"] diff --git a/frontend/app.py b/frontend/app.py new file mode 100644 index 0000000..e20db45 --- /dev/null +++ b/frontend/app.py @@ -0,0 +1,37 @@ +import streamlit as st +import requests +import pandas as pd +import io +import os + +st.title("🚀 Deal Hunter App") +st.sidebar.header("Search & Filters") +item = st.sidebar.text_input("Item", value="iPhone 14 Pro Max") +radius = st.sidebar.number_input("Radius (miles)", value=50) +min_price = st.sidebar.number_input("Min Price", value=0.0) +max_price = st.sidebar.number_input("Max Price", value=1000.0) +condition = st.sidebar.selectbox("Condition", ["Any", "New", "Used"]) +min_score = st.sidebar.slider("Min Score", 1, 10, 7) + +backend_url = os.getenv("BACKEND_URL", "http://localhost:8000") + +if st.button("Hunt Deals"): + with st.spinner("Hunting..."): + response = requests.post(f"{backend_url}/hunt", json={ + "item": item, "location_radius": radius, "min_price": min_price, "max_price": max_price, + "condition": condition, "min_score": min_score + }) + if response.status_code == 200: + data = response.json() + deals = data['deals'] + hot_count = data['hot_count'] + df = pd.DataFrame(deals) + st.success(f"Found {len(deals)} deals ({hot_count} hot)!") + st.dataframe(df[['title', 'price', 'resale_avg', 'offer', 'score', 'status', 'condition', 'link']], use_container_width=True) + + csv_buffer = io.StringIO(data['csv']) + st.download_button("Download CSV", csv_buffer.getvalue(), "deals.csv", "text/csv") + else: + st.error(f"Error: {response.text}") + +st.info("Backend API at http://localhost:8000 for testing.") diff --git a/frontend/requirements.txt b/frontend/requirements.txt new file mode 100644 index 0000000..894683d --- /dev/null +++ b/frontend/requirements.txt @@ -0,0 +1,3 @@ +streamlit +requests +pandas