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,
diff --git a/src/components/PSKReporterPanel.jsx b/src/components/PSKReporterPanel.jsx
index c4193a6..b73d7e4 100644
--- a/src/components/PSKReporterPanel.jsx
+++ b/src/components/PSKReporterPanel.jsx
@@ -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 */}
-
@@ -244,10 +252,10 @@ const PSKReporterPanel = ({
{panelMode === 'psk' ? (
<>
- setActiveTab('tx')} style={subTabBtn(activeTab === 'tx', '#4ade80')}>
+ setActiveTabPersist('tx')} style={subTabBtn(activeTab === 'tx', '#4ade80')}>
▲ Heard ({pskFilterCount > 0 ? filteredTx.length : txCount})
- setActiveTab('rx')} style={subTabBtn(activeTab === 'rx', '#60a5fa')}>
+ setActiveTabPersist('rx')} style={subTabBtn(activeTab === 'rx', '#60a5fa')}>
▼ Hearing ({pskFilterCount > 0 ? filteredRx.length : rxCount})
>
diff --git a/src/components/SolarPanel.jsx b/src/components/SolarPanel.jsx
index 6667631..6930d06 100644
--- a/src/components/SolarPanel.jsx
+++ b/src/components/SolarPanel.jsx
@@ -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' && (