fix(fetch): use Vite proxy + Vercel rewrites for reliable Dropbox loading

Replace unreliable third-party CORS proxies (allorigins, cors-anywhere,
thingproxy) with a local /dropbox-file route proxied server-side:
- vite.config.ts: add dev server proxy for /dropbox-file -> dl.dropboxusercontent.com
- vercel.json: add rewrite rule for the same route in production
- App.tsx: simplify fetch logic to use single reliable proxy path

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
christian.vidal
2026-03-27 12:28:30 +01:00
co-authored by Claude Sonnet 4.6
parent f43d8f367e
commit d6a2efaf7d
3 changed files with 61 additions and 63 deletions
+11 -28
View File
@@ -25,34 +25,23 @@ export default function App() {
useEffect(() => { useEffect(() => {
const loadDefaultData = async () => { const loadDefaultData = async () => {
// Use different proxies as fallbacks // Use Vite's dev proxy to avoid CORS issues
const proxies = [ const fileUrl = '/dropbox-file/scl/fi/nkyabkq2jdwfudof2ovrl/Data-Matrix.xlsx?rlkey=1cz5fuabwipqqivihii7sybw0&st=io0g4wvb&dl=1';
(url: string) => `https://api.allorigins.win/raw?url=${encodeURIComponent(url)}`,
(url: string) => `https://cors-anywhere.herokuapp.com/${url}`, // Often needs manual activation but we'll try
(url: string) => `https://thingproxy.freeboard.io/fetch/${url}`
];
const dropboxUrl = 'https://dl.dropboxusercontent.com/scl/fi/nkyabkq2jdwfudof2ovrl/Data-Matrix.xlsx?rlkey=1cz5fuabwipqqivihii7sybw0&st=io0g4wvb&dl=1';
setIsLoadingDefault(true); setIsLoadingDefault(true);
setDefaultLoadError(null); setDefaultLoadError(null);
let lastError = null;
for (const getProxyUrl of proxies) {
try { try {
const proxyUrl = getProxyUrl(dropboxUrl); console.log('Fetching Data-Matrix.xlsx via Vite proxy...');
console.log(`Attempting to fetch via: ${proxyUrl}`); const response = await fetch(fileUrl);
const response = await fetch(proxyUrl);
if (!response.ok) { if (!response.ok) {
throw new Error(`Proxy returned status ${response.status}: ${response.statusText}`); throw new Error(`HTTP ${response.status}: ${response.statusText}`);
} }
const arrayBuffer = await response.arrayBuffer(); const arrayBuffer = await response.arrayBuffer();
if (arrayBuffer.byteLength < 100) { if (arrayBuffer.byteLength < 100) {
throw new Error("File too small, possibly empty or error page"); throw new Error('File too small possibly empty or error response');
} }
const wb = XLSX.read(arrayBuffer, { type: 'array' }); const wb = XLSX.read(arrayBuffer, { type: 'array' });
@@ -64,8 +53,7 @@ export default function App() {
const rawHeaders = data[0]; const rawHeaders = data[0];
const rawRows = data.slice(1); const rawRows = data.slice(1);
// Apply Supabase overrides console.log('Applying Supabase overrides...');
console.log("Applying Supabase overrides...");
const syncedData = await getAllSyncedRows(); const syncedData = await getAllSyncedRows();
const articleNoIdx = COLUMNS.ARTICLE_NO; const articleNoIdx = COLUMNS.ARTICLE_NO;
@@ -82,18 +70,13 @@ export default function App() {
hasUnsavedChanges: false hasUnsavedChanges: false
}); });
setActiveModule('descriptions'); setActiveModule('descriptions');
setIsLoadingDefault(false);
return; // Success!
} }
} catch (err) { } catch (err) {
console.error(`Failed with proxy:`, err); console.error('Failed to load from Dropbox:', err);
lastError = err; setDefaultLoadError(err instanceof Error ? err.message : 'Connection failed');
} } finally {
}
// If we reach here, all proxies failed
setDefaultLoadError(lastError instanceof Error ? lastError.message : 'All connection attempts failed');
setIsLoadingDefault(false); setIsLoadingDefault(false);
}
}; };
loadDefaultData(); loadDefaultData();
+8
View File
@@ -0,0 +1,8 @@
{
"rewrites": [
{
"source": "/dropbox-file/:path*",
"destination": "https://dl.dropboxusercontent.com/:path*"
}
]
}
+8 -1
View File
@@ -17,8 +17,15 @@ export default defineConfig(({mode}) => {
}, },
server: { server: {
// HMR is disabled in AI Studio via DISABLE_HMR env var. // HMR is disabled in AI Studio via DISABLE_HMR env var.
// Do not modify—file watching is disabled to prevent flickering during agent edits. // Do not modify - file watching is disabled to prevent flickering during agent edits.
hmr: process.env.DISABLE_HMR !== 'true', hmr: process.env.DISABLE_HMR !== 'true',
proxy: {
'/dropbox-file': {
target: 'https://dl.dropboxusercontent.com',
changeOrigin: true,
rewrite: (path) => path.replace(/^\/dropbox-file/, ''),
},
},
}, },
}; };
}); });