feat: Sync PANEU inventory from Dropbox

- Add new API endpoint for PANEU stock from Dropbox
- Update handleVendorStockFetch to use new endpoint
- Configure Vite proxy for local development
This commit is contained in:
Christian Vidal Wolf
2026-02-02 09:13:20 +01:00
parent 74f6fa2278
commit 7e58e8aba4
3 changed files with 50 additions and 5 deletions
+5 -5
View File
@@ -185,16 +185,16 @@ const App: React.FC = () => {
const handleVendorStockFetch = useCallback(async () => {
try {
console.log('[App] Fetching vendor stock from /Vendor Stock.xlsx...');
const response = await fetch('/Vendor Stock.xlsx');
if (!response.ok) throw new Error(`Failed to fetch vendor stock: ${response.status}`);
console.log('[App] Fetching PANEU vendor stock from /api/fetch-paneu-stock...');
const response = await fetch('/api/fetch-paneu-stock');
if (!response.ok) throw new Error(`Failed to fetch PANEU vendor stock: ${response.status}`);
const buffer = await response.arrayBuffer();
const data = await processVendorStockExcel(buffer);
setVendorStockMap(data);
console.log('[App] Successfully loaded vendor stock for', data.size, 'ASINs');
console.log('[App] Successfully loaded PANEU vendor stock for', data.size, 'ASINs');
} catch (error) {
console.error("Failed to fetch/parse Vendor Stock", error);
console.error("Failed to fetch/parse PANEU Vendor Stock", error);
}
}, []);
+39
View File
@@ -0,0 +1,39 @@
import type { VercelRequest, VercelResponse } from '@vercel/node';
// PANEU Stock from Dropbox (using dl=1 for direct download)
const PANEU_STOCK_DROPBOX_URL = "https://www.dropbox.com/scl/fi/xvsqi89mc8wk2i3jpndll/PANEU-Stock.xlsx?rlkey=djtbez2yi1sohjn203xnbjzl1&st=aogcoiw6&dl=1";
export default async function handler(req: VercelRequest, res: VercelResponse) {
// CORS headers
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Methods', 'GET, OPTIONS');
res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
if (req.method === 'OPTIONS') {
return res.status(200).end();
}
try {
console.log('[fetch-paneu-stock] Fetching PANEU Stock from Dropbox...');
const response = await fetch(PANEU_STOCK_DROPBOX_URL, {
cache: 'no-store',
headers: {
'Pragma': 'no-cache',
'Cache-Control': 'no-cache'
}
});
if (!response.ok) {
throw new Error(`Dropbox responded with ${response.status}`);
}
const buffer = await response.arrayBuffer();
console.log('[fetch-paneu-stock] Successfully fetched PANEU Stock Excel, size:', buffer.byteLength);
res.setHeader('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
res.status(200).send(Buffer.from(buffer));
} catch (error: any) {
console.error('[fetch-paneu-stock] Error:', error);
res.status(500).json({ error: error.message });
}
}
+6
View File
@@ -14,6 +14,12 @@ export default defineConfig(({ mode }) => {
changeOrigin: true,
rewrite: () => '', // Replace entire path with empty string (target has full URL)
followRedirects: true
},
'/api/fetch-paneu-stock': {
target: 'https://www.dropbox.com/scl/fi/xvsqi89mc8wk2i3jpndll/PANEU-Stock.xlsx?rlkey=djtbez2yi1sohjn203xnbjzl1&st=aogcoiw6&dl=1',
changeOrigin: true,
rewrite: () => '',
followRedirects: true
}
}
},