- Add useStatsPrivacy hook with localStorage persistence for stats visibility - Single event page: desktop privacy button, hide capacity chip when stats hidden - Events list: row/card click navigates to event detail; stopPropagation on actions - Backend GET /tickets: include payment for each ticket (removes N+1) - Bookings page: use list payment data, show — when payment method unknown Made-with: Cursor
42 lines
1.0 KiB
TypeScript
42 lines
1.0 KiB
TypeScript
'use client';
|
|
|
|
import { useState, useEffect, useCallback } from 'react';
|
|
|
|
const STORAGE_KEY = 'spanglish-admin-stats-hidden';
|
|
|
|
export function useStatsPrivacy() {
|
|
const [showStats, setShowStatsState] = useState(true);
|
|
|
|
useEffect(() => {
|
|
if (typeof window === 'undefined') return;
|
|
try {
|
|
const stored = localStorage.getItem(STORAGE_KEY);
|
|
if (stored !== null) {
|
|
setShowStatsState(stored !== 'true');
|
|
}
|
|
} catch {
|
|
// ignore
|
|
}
|
|
}, []);
|
|
|
|
const setShowStats = useCallback((value: boolean | ((prev: boolean) => boolean)) => {
|
|
setShowStatsState((prev) => {
|
|
const next = typeof value === 'function' ? value(prev) : value;
|
|
try {
|
|
if (typeof window !== 'undefined') {
|
|
localStorage.setItem(STORAGE_KEY, String(!next));
|
|
}
|
|
} catch {
|
|
// ignore
|
|
}
|
|
return next;
|
|
});
|
|
}, []);
|
|
|
|
const toggleStats = useCallback(() => {
|
|
setShowStats((prev) => !prev);
|
|
}, [setShowStats]);
|
|
|
|
return [showStats, setShowStats, toggleStats] as const;
|
|
}
|