added bulk upload to guest book

This commit is contained in:
briannelson95
2025-07-02 17:22:16 -04:00
parent 81102fbae9
commit 1f8b0473e6
9 changed files with 211 additions and 5 deletions

View File

@@ -0,0 +1,63 @@
'use client'
import React, { useState } from 'react'
export default function BulkUploadGuest() {
const [file, setFile] = useState<File | null>(null);
const [status, setStatus] = useState('');
const [loading, setLoading] = useState(false)
async function handleUpload(e: React.FormEvent) {
e.preventDefault()
if (!file) return
const formData = new FormData()
formData.append('file', file)
setStatus('Uploading...')
const res = await fetch('/api/guestbook/bulk-upload', {
method: 'POST',
body: formData,
})
const result = await res.json()
if (res.ok) {
setStatus(`Uploaded ${result.count} guests successfull`)
} else {
setStatus(`Upload failed: ${result.message}`)
}
}
return (
<div className="flex flex-col md:flex-row items-start md:items-center gap-2">
<label className="btn btn-outline btn-sm">
Select CSV
<input
type="file"
accept=".csv"
hidden
onChange={(e) => setFile(e.target.files?.[0] || null)}
/>
</label>
{file && (
<div className="text-sm truncate max-w-xs">
📄 {file.name}
</div>
)}
{file && (
<button
className="btn btn-primary btn-sm"
onClick={handleUpload}
disabled={loading}
>
{loading ? 'Uploading...' : 'Upload'}
</button>
)}
{status && (
<p className="text-sm text-gray-600">{status}</p>
)}
</div>
)
}

View File

@@ -5,6 +5,7 @@ import AddGuestBookEntryModal from '@/components/AddGuestBookEntryModal'
import GuestBookList from '@/components/GuestBookList'
import TableIcon from './icons/TableIcon'
import GuestCardIcon from './icons/GuestCardIcon'
import BulkUploadGuest from './BulkUploadGuest'
interface GuestBookEntry {
id: string
@@ -62,7 +63,10 @@ export default function GuestBookPageClient({ entries }: { entries: GuestBookEnt
</button>
</div>
</div>
<button onClick={() => setIsOpen(true)} className="btn btn-primary">Add Guest</button>
<div className='flex gap-2'>
<button onClick={() => setIsOpen(true)} className="btn btn-primary">Add Guest</button>
<BulkUploadGuest />
</div>
</div>
<GuestBookList view={view} entries={entries} />