|
1 | 1 | import { useRef, useState, useEffect, useCallback } from 'react'; |
2 | | -import { X, RotateCcw, Share2, Download, SlidersHorizontal } from 'lucide-react'; |
| 2 | +import { X, RotateCcw, Share2, Download, SlidersHorizontal, RefreshCw } from 'lucide-react'; |
3 | 3 | import { useLiveCamera } from './hooks/useLiveCamera'; |
4 | 4 | import type { ProcessOptions } from './worker/imageProcessor'; |
5 | 5 |
|
@@ -70,9 +70,17 @@ export default function LiveCamera({ onBack }: { onBack: () => void }) { |
70 | 70 | const [previewUrl, setPreviewUrl] = useState<string | null>(null); |
71 | 71 | const [saving, setSaving] = useState(false); |
72 | 72 | const [showSliders, setShowSliders] = useState(false); |
73 | | - const [brightness, setBrightness] = useState(100); |
74 | | - const [contrast, setContrast] = useState(100); |
75 | | - const [saturation, setSaturation] = useState(100); |
| 73 | + const [brightness, setBrightness] = useState(() => Number(localStorage.getItem('valgis.brightness')) || 100); |
| 74 | + const [contrast, setContrast] = useState(() => Number(localStorage.getItem('valgis.contrast')) || 100); |
| 75 | + const [saturation, setSaturation] = useState(() => Number(localStorage.getItem('valgis.saturation')) || 100); |
| 76 | + |
| 77 | + useEffect(() => { localStorage.setItem('valgis.brightness', String(brightness)); }, [brightness]); |
| 78 | + useEffect(() => { localStorage.setItem('valgis.contrast', String(contrast)); }, [contrast]); |
| 79 | + useEffect(() => { localStorage.setItem('valgis.saturation', String(saturation)); }, [saturation]); |
| 80 | + |
| 81 | + const resetAdjustments = useCallback(() => { |
| 82 | + setBrightness(100); setContrast(100); setSaturation(100); |
| 83 | + }, []); |
76 | 84 |
|
77 | 85 | const { state, error, fps, start, stop, pause, resume, setOptions, captureHighRes } = |
78 | 86 | useLiveCamera(canvasRef); |
@@ -180,6 +188,17 @@ export default function LiveCamera({ onBack }: { onBack: () => void }) { |
180 | 188 | {/* Quick adjust sliders */} |
181 | 189 | {showSliders && ( |
182 | 190 | <div className="relative px-5 pb-2 pt-3 space-y-2"> |
| 191 | + <div className="flex items-center justify-between"> |
| 192 | + <span className="text-white/40 text-[10px] uppercase tracking-wider">Adjustments</span> |
| 193 | + <button |
| 194 | + onClick={resetAdjustments} |
| 195 | + disabled={!hasAdjustments} |
| 196 | + className="flex items-center gap-1 text-white/50 text-[10px] disabled:opacity-30 active:text-white" |
| 197 | + > |
| 198 | + <RefreshCw className="w-3 h-3" /> |
| 199 | + Reset |
| 200 | + </button> |
| 201 | + </div> |
183 | 202 | <QuickSlider label="B" value={brightness} min={50} max={150} onChange={setBrightness} /> |
184 | 203 | <QuickSlider label="C" value={contrast} min={50} max={150} onChange={setContrast} /> |
185 | 204 | <QuickSlider label="S" value={saturation} min={0} max={200} onChange={setSaturation} /> |
|
0 commit comments