From 81880a6a0a4ac33d87ef1e987d56615a1ae04682 Mon Sep 17 00:00:00 2001 From: "Tanner Collin (aider)" Date: Thu, 14 Aug 2025 19:49:16 +0000 Subject: [PATCH] feat: Store view state in URL for shareable links --- mapper/src/App.js | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/mapper/src/App.js b/mapper/src/App.js index 1e5c818..90cc666 100644 --- a/mapper/src/App.js +++ b/mapper/src/App.js @@ -280,9 +280,26 @@ function Menu({duration, setDuration, end, setEnd, slider, setSlider}) { } function App() { - const [duration, setDuration] = useState(durations[0]); - const [end, setEnd] = useState(moment()); - const [slider, setSlider] = useState([0, duration.num]); + const params = new URLSearchParams(window.location.search); + const initialDurationId = params.get('duration'); + const initialEndTimestamp = params.get('end'); + const initialSliderValue = params.get('slider'); + + const initialDuration = (initialDurationId && durations[parseInt(initialDurationId, 10)]) ? durations[parseInt(initialDurationId, 10)] : durations[0]; + const initialEnd = initialEndTimestamp ? moment.unix(initialEndTimestamp) : moment(); + const initialSlider = initialSliderValue ? initialSliderValue.split(',').map(Number) : [0, initialDuration.num]; + + const [duration, setDuration] = useState(initialDuration); + const [end, setEnd] = useState(initialEnd); + const [slider, setSlider] = useState(initialSlider); + + useEffect(() => { + const params = new URLSearchParams(); + params.set('duration', duration.id); + params.set('end', end.unix()); + params.set('slider', slider.join(',')); + window.history.replaceState({}, '', `${window.location.pathname}?${params.toString()}`); + }, [duration, end, slider]); return (