'use client'; import { useEffect, useState } from 'react'; import QRCode from 'qrcode'; import { pb } from '~/lib/pocketbase'; import { ImageOff } from 'lucide-react'; export default function Dashboard() { const [name, setName] = useState(''); const [glbUrl, setGlbUrl] = useState(''); const [usdzUrl, setUsdzUrl] = useState(''); const [assets, setAssets] = useState([]); const [loading, setLoading] = useState(false); const fetchAssets = async () => { try { const records = await pb.collection('ar_assets').getFullList({ sort: '-created', }); setAssets(records); } catch (err) { console.error('Failed to fetch assets:', err); setAssets([]); } }; useEffect(() => { fetchAssets(); }, []); const createAsset = async () => { if (!name || !glbUrl) { alert('Please provide a name and a GLB URL'); return; } setLoading(true); try { const record = await pb.collection('ar_assets').create({ name, glb_url: glbUrl, usdz_url: usdzUrl || '', }); const qrUrl = `${import.meta.env.VITE_FRONTEND_URL}/ar/${record.id}`; const qrImage = await QRCode.toDataURL(qrUrl, { width: 512, margin: 2, }); const qrBlob = await (await fetch(qrImage)).blob(); const qrFormData = new FormData(); qrFormData.append('qr_url', qrUrl); qrFormData.append('qr_image', new File([qrBlob], `${record.id}.png`, { type: 'image/png' })); await pb.collection('ar_assets').update(record.id, qrFormData); setName(''); setGlbUrl(''); setUsdzUrl(''); fetchAssets(); } catch (err: any) { alert(err?.message || 'Failed to create asset'); } finally { setLoading(false); } }; return (

AR Asset Dashboard

Manage 3D assets and generate AR QR codes

Create New Asset

setName(e.target.value)} />
setGlbUrl(e.target.value)} />
setUsdzUrl(e.target.value)} />

Generated Assets

{assets.length === 0 ? (

No assets created yet.

) : (
{assets.map((asset) => (

{asset?.name}

{asset?.qr_image ? ( {asset?.name} ) : (
No QR Image
)}
))}
)}
); }