From 8e3b8480152154a21e7d70bdab43d4769e2e123d Mon Sep 17 00:00:00 2001 From: Ben Mitchinson Date: Mon, 6 Oct 2025 23:28:06 -0700 Subject: [PATCH 1/7] v1: pin doesn't adjust though --- .../ActionButton/LocationSelector.tsx | 62 +++++++++++++++---- 1 file changed, 49 insertions(+), 13 deletions(-) diff --git a/web/src/components/MemoEditor/ActionButton/LocationSelector.tsx b/web/src/components/MemoEditor/ActionButton/LocationSelector.tsx index d101bb064..935e96f04 100644 --- a/web/src/components/MemoEditor/ActionButton/LocationSelector.tsx +++ b/web/src/components/MemoEditor/ActionButton/LocationSelector.tsx @@ -19,6 +19,8 @@ interface State { initilized: boolean; placeholder: string; position?: LatLng; + latInput: string; + lngInput: string; } const LocationSelector = (props: Props) => { @@ -27,6 +29,8 @@ const LocationSelector = (props: Props) => { initilized: false, placeholder: props.location?.placeholder || "", position: props.location ? new LatLng(props.location.latitude, props.location.longitude) : undefined, + latInput: props.location ? String(props.location.latitude) : "", + lngInput: props.location ? String(props.location.longitude) : "", }); const [popoverOpen, setPopoverOpen] = useState(false); @@ -35,6 +39,8 @@ const LocationSelector = (props: Props) => { ...state, placeholder: props.location?.placeholder || "", position: new LatLng(props.location?.latitude || 0, props.location?.longitude || 0), + latInput: String(props.location?.latitude ?? 0), + lngInput: String(props.location?.longitude ?? 0), })); }, [props.location]); @@ -65,16 +71,23 @@ const LocationSelector = (props: Props) => { useEffect(() => { if (!state.position) { - setState({ ...state, placeholder: "" }); + setState((prev) => ({ ...prev, placeholder: "" })); return; } + // Sync lat/lng input values from position + const newLat = String(state.position.lat); + const newLng = String(state.position.lng); + if (state.latInput !== newLat || state.lngInput !== newLng) { + setState((prev) => ({ ...prev, latInput: newLat, lngInput: newLng })); + } + // Fetch reverse geocoding data. fetch(`https://nominatim.openstreetmap.org/reverse?lat=${state.position.lat}&lon=${state.position.lng}&format=json`) .then((response) => response.json()) .then((data) => { if (data && data.display_name) { - setState({ ...state, placeholder: data.display_name }); + setState((prev) => ({ ...prev, placeholder: data.display_name })); } }) .catch((error) => { @@ -83,6 +96,17 @@ const LocationSelector = (props: Props) => { }); }, [state.position]); + // Update position when lat/lng inputs change (if valid numbers) + useEffect(() => { + const lat = parseFloat(state.latInput); + const lng = parseFloat(state.lngInput); + if (Number.isFinite(lat) && Number.isFinite(lng)) { + if (!state.position || state.position.lat !== lat || state.position.lng !== lng) { + setState((prev) => ({ ...prev, position: new LatLng(lat, lng) })); + } + } + }, [state.latInput, state.lngInput]); + const onPositionChanged = (position: LatLng) => { setState({ ...state, position }); }; @@ -126,19 +150,31 @@ const LocationSelector = (props: Props) => {
-
- {state.position && ( -
- [{state.position.lat.toFixed(2)}, {state.position.lng.toFixed(2)}] -
- )} +
+ setState((prev) => ({ ...prev, latInput: e.target.value }))} + className="w-28" + /> setState((state) => ({ ...state, placeholder: e.target.value }))} + placeholder="Lng" + type="number" + step="any" + value={state.lngInput} + onChange={(e) => setState((prev) => ({ ...prev, lngInput: e.target.value }))} + className="w-28" /> +
+ setState((prev) => ({ ...prev, placeholder: e.target.value }))} + /> +