- Introduce requiredDailyKeys to track daily puzzle completion across genres. - Implement logic to show an ExtraPuzzlesPopover when all daily puzzles are completed. - Add localized messages for extra puzzles in both English and German. - Update GenrePage and Home components to pass requiredDailyKeys to the Game component.
99 lines
3.0 KiB
TypeScript
99 lines
3.0 KiB
TypeScript
'use client';
|
||
|
||
import { useTranslations, useLocale } from 'next-intl';
|
||
import type { ExternalPuzzle } from '@/lib/externalPuzzles';
|
||
|
||
interface ExtraPuzzlesPopoverProps {
|
||
puzzle: ExternalPuzzle;
|
||
onClose: () => void;
|
||
}
|
||
|
||
export default function ExtraPuzzlesPopover({ puzzle, onClose }: ExtraPuzzlesPopoverProps) {
|
||
const t = useTranslations('ExtraPuzzles');
|
||
const locale = useLocale();
|
||
|
||
const name = locale === 'de' ? puzzle.nameDe : puzzle.nameEn;
|
||
|
||
const handleClick = () => {
|
||
if (typeof window !== 'undefined' && window.plausible) {
|
||
window.plausible('extra_puzzles_click', {
|
||
props: {
|
||
partner: puzzle.id,
|
||
url: puzzle.url,
|
||
},
|
||
});
|
||
}
|
||
onClose();
|
||
};
|
||
|
||
return (
|
||
<div
|
||
style={{
|
||
position: 'fixed',
|
||
bottom: '1.5rem',
|
||
right: '1.5rem',
|
||
zIndex: 1100,
|
||
maxWidth: '320px',
|
||
boxShadow: '0 10px 30px rgba(0,0,0,0.25)',
|
||
borderRadius: '0.75rem',
|
||
background: 'white',
|
||
padding: '1rem 1.25rem',
|
||
display: 'flex',
|
||
flexDirection: 'column',
|
||
gap: '0.75rem',
|
||
}}
|
||
>
|
||
<div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', gap: '0.5rem' }}>
|
||
<h3 style={{ margin: 0, fontSize: '1rem', fontWeight: 700 }}>
|
||
{t('title')}
|
||
</h3>
|
||
<button
|
||
onClick={onClose}
|
||
aria-label={t('close')}
|
||
style={{
|
||
border: 'none',
|
||
background: 'transparent',
|
||
cursor: 'pointer',
|
||
fontSize: '1.1rem',
|
||
lineHeight: 1,
|
||
color: '#6b7280',
|
||
}}
|
||
>
|
||
×
|
||
</button>
|
||
</div>
|
||
|
||
<p style={{ margin: 0, fontSize: '0.9rem', color: '#4b5563' }}>
|
||
{t('message', { name })}
|
||
</p>
|
||
|
||
<a
|
||
href={puzzle.url}
|
||
target="_blank"
|
||
rel="noopener noreferrer"
|
||
onClick={handleClick}
|
||
style={{
|
||
display: 'inline-flex',
|
||
alignItems: 'center',
|
||
justifyContent: 'center',
|
||
gap: '0.4rem',
|
||
marginTop: '0.25rem',
|
||
padding: '0.5rem 0.75rem',
|
||
borderRadius: '999px',
|
||
border: 'none',
|
||
background: 'linear-gradient(135deg, #4f46e5, #ec4899)',
|
||
color: 'white',
|
||
fontSize: '0.9rem',
|
||
fontWeight: 600,
|
||
textDecoration: 'none',
|
||
cursor: 'pointer',
|
||
}}
|
||
>
|
||
{t('cta', { name })}
|
||
</a>
|
||
</div>
|
||
);
|
||
}
|
||
|
||
|