From b607323fa1eacfada21cc43af9e66b0f385d0b57 Mon Sep 17 00:00:00 2001 From: AI Bot Date: Sun, 20 Sep 2026 12:49:27 -0500 Subject: [PATCH] fix: circuit breaker para cuota Gemini (429) + cabeceras de descarga APK + null-safety en categorias --- dripzone-app/next.config.ts | 25 +++ .../src/components/store/CategoryPills.tsx | 4 +- dripzone-app/src/lib/gemini-parser.ts | 95 +++++++++-- scripts/check_coolify_deploy.py | 16 ++ scripts/copy_apk_and_send_wa.py | 114 +++++++++++++ scripts/deploy_circuit_breaker_fix.py | 154 ++++++++++++++++++ scripts/inspect_traefik_and_labels.py | 35 ++++ scripts/inspect_vps_docker.py | 13 ++ 8 files changed, 443 insertions(+), 13 deletions(-) create mode 100644 scripts/check_coolify_deploy.py create mode 100644 scripts/copy_apk_and_send_wa.py create mode 100644 scripts/deploy_circuit_breaker_fix.py create mode 100644 scripts/inspect_traefik_and_labels.py create mode 100644 scripts/inspect_vps_docker.py diff --git a/dripzone-app/next.config.ts b/dripzone-app/next.config.ts index d424050..f368b08 100644 --- a/dripzone-app/next.config.ts +++ b/dripzone-app/next.config.ts @@ -7,6 +7,27 @@ const nextConfig: NextConfig = { { protocol: "https", hostname: "**" }, ], }, + async headers() { + return [ + { + source: '/:path*.apk', + headers: [ + { + key: 'Content-Disposition', + value: 'attachment; filename="DripZone.apk"', + }, + { + key: 'Content-Type', + value: 'application/vnd.android.package-archive', + }, + { + key: 'Cache-Control', + value: 'public, max-age=3600, must-revalidate', + }, + ], + }, + ]; + }, async rewrites() { return [ { @@ -21,6 +42,10 @@ const nextConfig: NextConfig = { source: '/zapatillas', destination: '/catalogo', }, + { + source: '/dripzone.apk', + destination: '/DripZone.apk', + }, ]; }, }; diff --git a/dripzone-app/src/components/store/CategoryPills.tsx b/dripzone-app/src/components/store/CategoryPills.tsx index fc757aa..849b4e6 100644 --- a/dripzone-app/src/components/store/CategoryPills.tsx +++ b/dripzone-app/src/components/store/CategoryPills.tsx @@ -89,8 +89,8 @@ export const CategoryPills: React.FC = ({
{dynamicCategories.map((cat) => { const isActive = - activeCategory.toLowerCase() === cat.id.toLowerCase() || - (activeCategory === 'all' && cat.id === 'all'); + (activeCategory || 'all').toLowerCase() === (cat.id || '').toLowerCase() || + ((!activeCategory || activeCategory === 'all') && cat.id === 'all'); return (