persistance

pull/57/head
accius 2 days ago
parent e7cde4c2fb
commit 5dfe088118

@ -99,7 +99,9 @@ const App = () => {
const [showSettings, setShowSettings] = useState(false);
const [showDXFilters, setShowDXFilters] = useState(false);
const [showPSKFilters, setShowPSKFilters] = useState(false);
const [weatherExpanded, setWeatherExpanded] = useState(false);
const [weatherExpanded, setWeatherExpanded] = useState(() => {
try { return localStorage.getItem('openhamclock_weatherExpanded') === 'true'; } catch { return false; }
});
const [tempUnit, setTempUnit] = useState(() => {
try { return localStorage.getItem('openhamclock_tempUnit') || 'F'; } catch { return 'F'; }
});
@ -628,7 +630,7 @@ const App = () => {
{/* Compact summary row — always visible */}
<div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>
<div
onClick={() => setWeatherExpanded(!weatherExpanded)}
onClick={() => { const next = !weatherExpanded; setWeatherExpanded(next); try { localStorage.setItem('openhamclock_weatherExpanded', next.toString()); } catch {} }}
style={{
display: 'flex', alignItems: 'center', gap: '8px', cursor: 'pointer',
userSelect: 'none', flex: 1, minWidth: 0,

@ -32,11 +32,19 @@ const PSKReporterPanel = ({
showWSJTXOnMap,
onToggleWSJTXMap
}) => {
const [panelMode, setPanelMode] = useState('psk');
const [activeTab, setActiveTab] = useState('tx');
const [panelMode, setPanelMode] = useState(() => {
try { const s = localStorage.getItem('openhamclock_pskPanelMode'); return s || 'psk'; } catch { return 'psk'; }
});
const [activeTab, setActiveTab] = useState(() => {
try { const s = localStorage.getItem('openhamclock_pskActiveTab'); return s || 'tx'; } catch { return 'tx'; }
});
const [wsjtxTab, setWsjtxTab] = useState('decodes');
const [wsjtxFilter, setWsjtxFilter] = useState('all'); // 'all' | 'cq' | band name
// Persist panel mode and active tab
const setPanelModePersist = (v) => { setPanelMode(v); try { localStorage.setItem('openhamclock_pskPanelMode', v); } catch {} };
const setActiveTabPersist = (v) => { setActiveTab(v); try { localStorage.setItem('openhamclock_pskActiveTab', v); } catch {} };
// PSKReporter hook
const {
txReports, txCount, rxReports, rxCount,
@ -174,10 +182,10 @@ const PSKReporterPanel = ({
}}>
{/* Mode toggle */}
<div style={{ display: 'flex' }}>
<button onClick={() => setPanelMode('psk')} style={segBtn(panelMode === 'psk', 'var(--accent-primary)')}>
<button onClick={() => setPanelModePersist('psk')} style={segBtn(panelMode === 'psk', 'var(--accent-primary)')}>
PSKReporter
</button>
<button onClick={() => setPanelMode('wsjtx')} style={segBtn(panelMode === 'wsjtx', '#a78bfa')}>
<button onClick={() => setPanelModePersist('wsjtx')} style={segBtn(panelMode === 'wsjtx', '#a78bfa')}>
WSJT-X
</button>
</div>
@ -244,10 +252,10 @@ const PSKReporterPanel = ({
<div style={{ display: 'flex', gap: '4px', marginBottom: '5px', flexShrink: 0 }}>
{panelMode === 'psk' ? (
<>
<button onClick={() => setActiveTab('tx')} style={subTabBtn(activeTab === 'tx', '#4ade80')}>
<button onClick={() => setActiveTabPersist('tx')} style={subTabBtn(activeTab === 'tx', '#4ade80')}>
Heard ({pskFilterCount > 0 ? filteredTx.length : txCount})
</button>
<button onClick={() => setActiveTab('rx')} style={subTabBtn(activeTab === 'rx', '#60a5fa')}>
<button onClick={() => setActiveTabPersist('rx')} style={subTabBtn(activeTab === 'rx', '#60a5fa')}>
Hearing ({pskFilterCount > 0 ? filteredRx.length : rxCount})
</button>
</>

@ -41,7 +41,9 @@ export const SolarPanel = ({ solarIndices }) => {
return 'image';
} catch (e) { return 'image'; }
});
const [imageType, setImageType] = useState('0193');
const [imageType, setImageType] = useState(() => {
try { return localStorage.getItem('openhamclock_solarImageType') || '0193'; } catch { return '0193'; }
});
const [xrayData, setXrayData] = useState(null);
const [xrayLoading, setXrayLoading] = useState(false);
@ -417,7 +419,7 @@ export const SolarPanel = ({ solarIndices }) => {
{mode === 'image' && (
<select
value={imageType}
onChange={(e) => setImageType(e.target.value)}
onChange={(e) => { setImageType(e.target.value); try { localStorage.setItem('openhamclock_solarImageType', e.target.value); } catch {} }}
onClick={(e) => e.stopPropagation()}
style={{
background: 'var(--bg-tertiary)',

@ -76,10 +76,12 @@ export const WorldMap = ({
zoom: storedSettings.zoom || 2.5
});
// Save map settings to localStorage when changed
// Save map settings to localStorage when changed (merge, don't overwrite)
useEffect(() => {
try {
const existing = getStoredMapSettings();
localStorage.setItem('openhamclock_mapSettings', JSON.stringify({
...existing,
mapStyle,
center: mapView.center,
zoom: mapView.zoom

Loading…
Cancel
Save

Powered by TurnKey Linux.