diff --git a/web/src/components/MemoEditor/ActionButton/LocationSelector.tsx b/web/src/components/MemoEditor/ActionButton/LocationSelector.tsx index 1d1ebf873..a2ca1a8b1 100644 --- a/web/src/components/MemoEditor/ActionButton/LocationSelector.tsx +++ b/web/src/components/MemoEditor/ActionButton/LocationSelector.tsx @@ -5,7 +5,9 @@ import toast from "react-hot-toast"; import LeafletMap from "@/components/LeafletMap"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; +import { Label } from "@/components/ui/label"; import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover"; +import { Textarea } from "@/components/ui/textarea"; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip"; import { Location } from "@/types/proto/api/v1/memo_service"; import { useTranslate } from "@/utils/i18n"; @@ -47,7 +49,7 @@ const LocationSelector = (props: Props) => { useEffect(() => { if (popoverOpen && !props.location) { const handleError = (error: any, errorMessage: string) => { - setState({ ...state, initialized: true }); + setState((prev) => ({ ...prev, initialized: true })); toast.error(errorMessage); console.error(error); }; @@ -57,7 +59,13 @@ const LocationSelector = (props: Props) => { (position) => { const lat = position.coords.latitude; const lng = position.coords.longitude; - setState({ ...state, position: new LatLng(lat, lng), initialized: true }); + setState((prev) => ({ + ...prev, + position: new LatLng(lat, lng), + latInput: String(lat), + lngInput: String(lng), + initialized: true, + })); }, (error) => { handleError(error, "Failed to get current position"); @@ -67,7 +75,7 @@ const LocationSelector = (props: Props) => { handleError("Geolocation is not supported by this browser.", "Geolocation is not supported by this browser."); } } - }, [popoverOpen]); + }, [popoverOpen, props.location]); useEffect(() => { if (!state.position) { @@ -100,7 +108,8 @@ const LocationSelector = (props: Props) => { useEffect(() => { const lat = parseFloat(state.latInput); const lng = parseFloat(state.lngInput); - if (Number.isFinite(lat) && Number.isFinite(lng)) { + // Validate coordinate ranges: lat must be -90 to 90, lng must be -180 to 180 + if (Number.isFinite(lat) && Number.isFinite(lng) && lat >= -90 && lat <= 90 && lng >= -180 && lng <= 180) { if (!state.position || state.position.lat !== lat || state.position.lng !== lng) { setState((prev) => ({ ...prev, position: new LatLng(lat, lng) })); } @@ -145,41 +154,66 @@ const LocationSelector = (props: Props) => { )} - -
- -
-
-
+ +
+
+ +
+
+
+
+ setState((prev) => ({ ...prev, latInput: e.target.value }))} - className="w-28" + className="h-9" /> +
+
+ setState((prev) => ({ ...prev, lngInput: e.target.value }))} - className="w-28" + className="h-9" /> -
- setState((prev) => ({ ...prev, placeholder: e.target.value }))} - /> -
+
+ +