'use client'; import { useState } from 'react'; import { Settings as Gear } from 'lucide-react'; import { Cinzel_Decorative } from 'next/font/google'; import { useAppContext } from '@/app/AppContext'; import BuyMeACoffee from '@/components/BuyMeACoffee'; import CopyButton from '@/components/CopyButton'; import GitHubButton from '@/components/GitHubButton'; import Scrim from '@/components/Scrim'; import Switch from '@/components/Switch'; import { LOCAL_SETTINGS, SPECTATOR_SETTINGS } from '@/constants'; import type { CardStyle, LocalSettings } from '@/types'; const cinzel = Cinzel_Decorative({ variable: '--font-cinzel', subsets: ['latin'], weight: '400', }); const cardStyleOptions: CardStyle[] = ['standard', 'color', 'grayscale']; export default function Settings() { const [open, setOpen] = useState(false); const { gameData, isDM, settings, emitSettings, setLocalSettings } = useAppContext(); const togglePermission = (key: keyof LocalSettings) => { if (LOCAL_SETTINGS.includes(key)) { setLocalSettings((prev) => ({ ...prev, [key]: !prev[key] })); } else if (isDM) { emitSettings({ ...gameData, settings: { ...gameData.settings, [key]: !gameData.settings[key], }, }); } }; const tuneRadio = (cardStyle: CardStyle) => { emitSettings({ ...gameData, settings: { ...gameData.settings, cardStyle, }, }); }; const Icon = () => ( setOpen((prev) => !prev)} > ); const Links = () => ( <> {isDM && ( )} > ); const Permissions = () => ( <> {Object.entries(settings) .filter(([_key, value]) => typeof value === 'boolean') .filter(([key]) => isDM || SPECTATOR_SETTINGS.includes(key)) .map(([key, value]) => ( togglePermission(key)} /> ))} > ); const CardStyle = () => isDM ? ( Card style: {cardStyleOptions.map((option, index) => ( tuneRadio(option)} className="sr-only" /> {option} ))} ) : null; return ( setOpen((prev) => !prev)} className={`transition-all duration-250 ${open ? 'pointer-events-auto opacity-100' : 'pointer-events-none opacity-0'}`} > ); }