Skip to content
Merged

woem #44

Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
70 changes: 33 additions & 37 deletions sites/portal/src/app/admin/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@ export default function AdminPage() {
description: '',
location: '',
eventDate: '',
pointsValue: 10,
maxCheckIns: '',
});

Expand All @@ -47,7 +46,6 @@ export default function AdminPage() {
description: '',
location: '',
eventDate: '',
pointsValue: 10,
maxCheckIns: '',
});
setShowCreateEvent(false);
Expand All @@ -71,6 +69,14 @@ export default function AdminPage() {
},
});

const regenerateQRMutation = trpc.events.regenerateQR.useMutation({
onSuccess: (updatedEvent) => {
utils.events.listAll.invalidate();
generateQRCode(updatedEvent.qrCode);
setSelectedEvent(updatedEvent);
},
});

// Auth & Admin Guard
useEffect(() => {
if (status === 'unauthenticated') {
Expand Down Expand Up @@ -103,7 +109,6 @@ export default function AdminPage() {
description: eventForm.description || undefined,
location: eventForm.location || undefined,
eventDate: new Date(eventForm.eventDate),
pointsValue: eventForm.pointsValue,
maxCheckIns: eventForm.maxCheckIns ? parseInt(eventForm.maxCheckIns) : undefined,
});
};
Expand Down Expand Up @@ -208,33 +213,17 @@ export default function AdminPage() {
</div>
</div>

<div className="grid grid-cols-2 gap-4">
<div>
<label className="text-[9px] text-gray-500 uppercase tracking-widest font-mono block mb-2">
Points Value
</label>
<input
type="number"
value={eventForm.pointsValue}
onChange={(e) => setEventForm({ ...eventForm, pointsValue: parseInt(e.target.value) })}
className="w-full bg-black/40 border border-white/10 rounded-lg px-4 py-3 text-white text-sm focus:border-red-500 focus:outline-none transition-all"
min="1"
max="100"
/>
</div>

<div>
<label className="text-[9px] text-gray-500 uppercase tracking-widest font-mono block mb-2">
Max Check-ins (Optional)
</label>
<input
type="number"
value={eventForm.maxCheckIns}
onChange={(e) => setEventForm({ ...eventForm, maxCheckIns: e.target.value })}
className="w-full bg-black/40 border border-white/10 rounded-lg px-4 py-3 text-white text-sm focus:border-red-500 focus:outline-none transition-all"
placeholder="Unlimited"
/>
</div>
<div>
<label className="text-[9px] text-gray-500 uppercase tracking-widest font-mono block mb-2">
Max Check-ins (Optional)
</label>
<input
type="number"
value={eventForm.maxCheckIns}
onChange={(e) => setEventForm({ ...eventForm, maxCheckIns: e.target.value })}
className="w-full bg-black/40 border border-white/10 rounded-lg px-4 py-3 text-white text-sm focus:border-red-500 focus:outline-none transition-all"
placeholder="Unlimited"
/>
</div>

<button
Expand Down Expand Up @@ -290,10 +279,6 @@ export default function AdminPage() {
<span className="text-gray-600">EVENT:</span>
<span className="text-white">{selectedEvent.title}</span>
</div>
<div className="flex justify-between text-[9px] font-mono">
<span className="text-gray-600">POINTS:</span>
<span className="text-red-500">+{selectedEvent.pointsValue}</span>
</div>
<div className="flex justify-between text-[9px] font-mono">
<span className="text-gray-600">CHECK-INS:</span>
<span className="text-white">
Expand Down Expand Up @@ -325,6 +310,18 @@ export default function AdminPage() {
Copy Code
</button>
</div>

<button
onClick={() => {
if (confirm('Generate a new QR code? The old one will stop working.')) {
regenerateQRMutation.mutate({ eventId: selectedEvent.id });
}
}}
disabled={regenerateQRMutation.isPending}
className="w-full px-6 py-3 bg-red-500/10 border border-red-500/30 text-red-500 font-bold text-[10px] uppercase tracking-widest hover:bg-red-500/20 transition-all disabled:opacity-50"
>
{regenerateQRMutation.isPending ? 'Regenerating...' : '🔄 Regenerate QR Code'}
</button>
</div>
</div>
</div>
Expand Down Expand Up @@ -440,9 +437,8 @@ export default function AdminPage() {
)}

<div className="flex flex-wrap gap-4 text-[9px] font-mono text-gray-600">
{event.location && <span> {event.location}</span>}
<span>{new Date(event.eventDate).toLocaleString()}</span>
<span className="text-red-500">+{event.pointsValue} pts</span>
{event.location && <span>📍 {event.location}</span>}
<span>📅 {new Date(event.eventDate).toLocaleString()}</span>
<span>
👥 {event.currentCheckIns} check-ins
{event.maxCheckIns && ` / ${event.maxCheckIns}`}
Expand Down