'use client'; import Link from 'next/link'; import { useRouter } from 'next/navigation'; import { useRef, useState, useEffect } from 'react'; import ReceiptImportClient from '../kvitto/ReceiptImportClient'; import { parseErrorResponse } from '../../lib/error-handler'; type Tab = 'kvitto' | 'recept'; type Product = { id: number; name: string; canonicalName: string | null }; export default function ImportTabsClient({ activeTab, isAdmin }: { activeTab: Tab; isAdmin: boolean }) { return (

Importera

{/* Flikar */}
đź§ľ Kvitto đź“‹ Recept
{/* InnehĂĄll */} {activeTab === 'kvitto' && (

Fotografera eller ladda upp ett kvitto — varorna läggs till i ditt inventarie.

)} {activeTab === 'recept' && }
); } function ReceptImport() { const router = useRouter(); const [selectedMethod, setSelectedMethod] = useState<'file' | 'url'>('file'); const [selectedFile, setSelectedFile] = useState(null); const [url, setUrl] = useState(''); const [isLoading, setIsLoading] = useState(false); const [error, setError] = useState(null); const handleFileSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!selectedFile) { setError('Välj en PDF eller bildfil först.'); return; } setError(null); setIsLoading(true); try { const formData = new FormData(); formData.append('file', selectedFile); const res = await fetch('/api/quick-import-proxy', { method: 'POST', body: formData }); if (!res.ok) throw new Error(await parseErrorResponse(res)); const data = await res.json(); sessionStorage.setItem('prefilled_markdown', data.markdown ?? ''); router.push('/recipes/write'); } catch (err) { setError(err instanceof Error ? err.message : 'Importen misslyckades.'); } finally { setIsLoading(false); } }; const handleUrlSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!url.trim()) { setError('Vänligen ange en URL.'); return; } setError(null); setIsLoading(true); try { const res = await fetch('/api/quick-import-proxy', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ input: url.trim() }), }); if (!res.ok) throw new Error(await parseErrorResponse(res)); const data = await res.json(); sessionStorage.setItem('prefilled_markdown', data.markdown ?? ''); router.push('/recipes/write'); } catch (err) { setError(err instanceof Error ? err.message : 'Importen misslyckades.'); } finally { setIsLoading(false); } }; return (

Ladda upp en PDF eller bild för OCR, eller ange en receptlänk.

{error && (
{error}
)} {/* Välj metod */}
{(['file', 'url'] as const).map((m) => ( ))}
{selectedMethod === 'file' && (
setSelectedFile(e.target.files?.[0] ?? null)} style={{ padding: '0.75rem', background: 'white', border: '1px solid #cbd5e1', borderRadius: '6px' }} />
)} {selectedMethod === 'url' && (
setUrl(e.target.value)} placeholder="https://exempel.se/recept/..." style={{ padding: '0.75rem', border: '1px solid #d1d5db', borderRadius: '6px', fontSize: '0.9rem' }} />
)}
Efter import öppnas receptet automatiskt i redigeringsläget.
Skriv in recept istället
); }