Changes
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
import { useState } from 'react';
|
import { useState } from 'react';
|
||||||
import { motion, AnimatePresence } from 'framer-motion';
|
import { motion, AnimatePresence } from 'framer-motion';
|
||||||
import { Settings, Monitor, Volume2, Cpu, X, Contrast } from 'lucide-react';
|
import { Settings, Monitor, Volume2, Cpu, X, Contrast, Binary } from 'lucide-react';
|
||||||
import { useSettings } from '@/contexts/SettingsContext';
|
import { useSettings } from '@/contexts/SettingsContext';
|
||||||
import { useAchievements } from '@/contexts/AchievementsContext';
|
import { useAchievements } from '@/contexts/AchievementsContext';
|
||||||
import CryptoConsentModal from './CryptoConsentModal';
|
import CryptoConsentModal from './CryptoConsentModal';
|
||||||
@@ -13,7 +13,7 @@ interface SettingsPanelProps {
|
|||||||
const SettingsPanel = ({ onToggleTheme, isRedTheme }: SettingsPanelProps) => {
|
const SettingsPanel = ({ onToggleTheme, isRedTheme }: SettingsPanelProps) => {
|
||||||
const [isOpen, setIsOpen] = useState(false);
|
const [isOpen, setIsOpen] = useState(false);
|
||||||
const [showCryptoModal, setShowCryptoModal] = useState(false);
|
const [showCryptoModal, setShowCryptoModal] = useState(false);
|
||||||
const { crtEnabled, setCrtEnabled, soundEnabled, setSoundEnabled, cryptoConsent, playSound } = useSettings();
|
const { crtEnabled, setCrtEnabled, matrixEnabled, setMatrixEnabled, soundEnabled, setSoundEnabled, cryptoConsent, playSound } = useSettings();
|
||||||
const { unlockAchievement } = useAchievements();
|
const { unlockAchievement } = useAchievements();
|
||||||
|
|
||||||
const handleToggle = (setter: (value: boolean) => void, currentValue: boolean, achievementId?: string) => {
|
const handleToggle = (setter: (value: boolean) => void, currentValue: boolean, achievementId?: string) => {
|
||||||
@@ -89,6 +89,26 @@ const SettingsPanel = ({ onToggleTheme, isRedTheme }: SettingsPanelProps) => {
|
|||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{/* Matrix Rain Toggle */}
|
||||||
|
<div className="flex items-center justify-between">
|
||||||
|
<div className="flex items-center gap-2">
|
||||||
|
<Binary size={16} className="text-primary" />
|
||||||
|
<span className="font-pixel text-sm text-foreground/90">Matrix Rain</span>
|
||||||
|
</div>
|
||||||
|
<button
|
||||||
|
onClick={() => handleToggle(setMatrixEnabled, matrixEnabled)}
|
||||||
|
className={`w-12 h-6 rounded-full border border-primary transition-all duration-300 ${
|
||||||
|
matrixEnabled ? 'bg-primary' : 'bg-transparent'
|
||||||
|
}`}
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
className={`w-4 h-4 rounded-full bg-background border border-primary transition-transform duration-300 ${
|
||||||
|
matrixEnabled ? 'translate-x-6' : 'translate-x-1'
|
||||||
|
}`}
|
||||||
|
/>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
{/* Sound Toggle */}
|
{/* Sound Toggle */}
|
||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<div className="flex items-center gap-2">
|
<div className="flex items-center gap-2">
|
||||||
|
|||||||
@@ -6,6 +6,8 @@ type SoundType = 'click' | 'beep' | 'hover' | 'boot' | 'success' | 'error';
|
|||||||
interface SettingsContextType {
|
interface SettingsContextType {
|
||||||
crtEnabled: boolean;
|
crtEnabled: boolean;
|
||||||
setCrtEnabled: (enabled: boolean) => void;
|
setCrtEnabled: (enabled: boolean) => void;
|
||||||
|
matrixEnabled: boolean;
|
||||||
|
setMatrixEnabled: (enabled: boolean) => void;
|
||||||
soundEnabled: boolean;
|
soundEnabled: boolean;
|
||||||
setSoundEnabled: (enabled: boolean) => void;
|
setSoundEnabled: (enabled: boolean) => void;
|
||||||
cryptoConsent: boolean | null;
|
cryptoConsent: boolean | null;
|
||||||
@@ -34,6 +36,11 @@ export const SettingsProvider = ({ children }: { children: ReactNode }) => {
|
|||||||
return saved !== null ? JSON.parse(saved) : true;
|
return saved !== null ? JSON.parse(saved) : true;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const [matrixEnabled, setMatrixEnabled] = useState(() => {
|
||||||
|
const saved = localStorage.getItem('matrixEnabled');
|
||||||
|
return saved !== null ? JSON.parse(saved) : true;
|
||||||
|
});
|
||||||
|
|
||||||
const [soundEnabled, setSoundEnabled] = useState(() => {
|
const [soundEnabled, setSoundEnabled] = useState(() => {
|
||||||
const saved = localStorage.getItem('soundEnabled');
|
const saved = localStorage.getItem('soundEnabled');
|
||||||
return saved !== null ? JSON.parse(saved) : true;
|
return saved !== null ? JSON.parse(saved) : true;
|
||||||
@@ -183,6 +190,10 @@ export const SettingsProvider = ({ children }: { children: ReactNode }) => {
|
|||||||
localStorage.setItem('crtEnabled', JSON.stringify(crtEnabled));
|
localStorage.setItem('crtEnabled', JSON.stringify(crtEnabled));
|
||||||
}, [crtEnabled]);
|
}, [crtEnabled]);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
localStorage.setItem('matrixEnabled', JSON.stringify(matrixEnabled));
|
||||||
|
}, [matrixEnabled]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
localStorage.setItem('soundEnabled', JSON.stringify(soundEnabled));
|
localStorage.setItem('soundEnabled', JSON.stringify(soundEnabled));
|
||||||
}, [soundEnabled]);
|
}, [soundEnabled]);
|
||||||
@@ -276,6 +287,8 @@ export const SettingsProvider = ({ children }: { children: ReactNode }) => {
|
|||||||
value={{
|
value={{
|
||||||
crtEnabled,
|
crtEnabled,
|
||||||
setCrtEnabled,
|
setCrtEnabled,
|
||||||
|
matrixEnabled,
|
||||||
|
setMatrixEnabled,
|
||||||
soundEnabled,
|
soundEnabled,
|
||||||
setSoundEnabled,
|
setSoundEnabled,
|
||||||
cryptoConsent,
|
cryptoConsent,
|
||||||
|
|||||||
+3
-2
@@ -39,6 +39,7 @@ const Index = () => {
|
|||||||
|
|
||||||
const {
|
const {
|
||||||
crtEnabled,
|
crtEnabled,
|
||||||
|
matrixEnabled,
|
||||||
playSound,
|
playSound,
|
||||||
cryptoConsent,
|
cryptoConsent,
|
||||||
showAudioOverlay,
|
showAudioOverlay,
|
||||||
@@ -131,7 +132,7 @@ const Index = () => {
|
|||||||
if (!isVerified) {
|
if (!isVerified) {
|
||||||
return (
|
return (
|
||||||
<div className={`min-h-screen overflow-x-hidden ${crtEnabled ? 'crt' : ''}`}>
|
<div className={`min-h-screen overflow-x-hidden ${crtEnabled ? 'crt' : ''}`}>
|
||||||
<MatrixRain color={isRedTheme ? '#FF0000' : '#00FF00'} />
|
{matrixEnabled && <MatrixRain color={isRedTheme ? '#FF0000' : '#00FF00'} />}
|
||||||
<Suspense fallback={null}>
|
<Suspense fallback={null}>
|
||||||
<HumanVerification onVerified={handleVerified} />
|
<HumanVerification onVerified={handleVerified} />
|
||||||
</Suspense>
|
</Suspense>
|
||||||
@@ -142,7 +143,7 @@ const Index = () => {
|
|||||||
return (
|
return (
|
||||||
<div className={`min-h-screen overflow-x-hidden ${crtEnabled ? 'crt' : ''} ${konamiActive ? 'konami-active' : ''}`}>
|
<div className={`min-h-screen overflow-x-hidden ${crtEnabled ? 'crt' : ''} ${konamiActive ? 'konami-active' : ''}`}>
|
||||||
<MatrixCursor />
|
<MatrixCursor />
|
||||||
<MatrixRain color={isRedTheme ? '#FF0000' : '#00FF00'} />
|
{matrixEnabled && <MatrixRain color={isRedTheme ? '#FF0000' : '#00FF00'} />}
|
||||||
<LoadingScreen isLoading={isLoading} />
|
<LoadingScreen isLoading={isLoading} />
|
||||||
|
|
||||||
{/* Audio blocked overlay */}
|
{/* Audio blocked overlay */}
|
||||||
|
|||||||
Reference in New Issue
Block a user