'use client'; import { useEffect, useState } from 'react'; import QRCode from 'qrcode'; import { supabase } from '~/lib/supabase'; 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 () => { const { data } = await supabase .from('ar_assets') .select('*') .order('created_at', { ascending: false }); setAssets(data || []); }; useEffect(() => { fetchAssets(); }, []); const createAsset = async () => { if (!name || !glbUrl || !usdzUrl) { alert('Fill all fields'); return; } setLoading(true); const { data, error } = await supabase .from('ar_assets') .insert({ name, glb_url: glbUrl, usdz_url: usdzUrl, }) .select() .single(); if (error || !data) { alert(error?.message); setLoading(false); return; } // const qrUrl = `http://10.20.2.107:5173/ar/${data.id}`; const qrUrl = `${window.location.origin}/ar/${data.id}`; const qrImage = await QRCode.toDataURL(qrUrl, { width: 512, margin: 2, }); const qrBlob = await (await fetch(qrImage)).blob(); const filePath = `${data.id}.png`; await supabase.storage.from('qr-codes').upload(filePath, qrBlob, { upsert: true, contentType: 'image/png', }); const { data: publicUrl } = supabase.storage .from('qr-codes') .getPublicUrl(filePath); await supabase .from('ar_assets') .update({ qr_url: qrUrl, qr_image_url: publicUrl.publicUrl, }) .eq('id', data.id); setName(''); setGlbUrl(''); setUsdzUrl(''); setLoading(false); fetchAssets(); }; 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_url ? ( {asset?.name} ) : (
No QR
)}
))}
)}
); }